📄 ipv6.c
字号:
}static intheader_ipv6_scan(register struct variable *vp, /* * IN - pointer to variable entry that points here */ oid * name, /* IN/OUT - input name requested, output name found */ size_t * length, /* IN/OUT - length of input and output oid's */ int exact, /* IN - TRUE if an exact match was requested */ size_t * var_len, /* OUT - length of variable or 0 if function returned */ WriteMethod ** write_method, int from, int to){ oid newname[MAX_OID_LEN]; int result; int i; DEBUGMSGTL(("mibII/ipv6", "header_ipv6_scan: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6", " %d\n", exact)); memcpy((char *) newname, (char *) vp->name, (int) vp->namelen * sizeof(oid)); for (i = from; i <= to; i++) { newname[(int) vp->namelen] = i; result = snmp_oid_compare(name, *length, newname, (int) vp->namelen + 1); if (((exact && result == 0) || (!exact && result < 0)) && if_getname(i)) break; } if (to < i) return (MATCH_FAILED); memcpy((char *) name, (char *) newname, ((int) vp->namelen + 1) * sizeof(oid)); *length = vp->namelen + 1; *write_method = 0; *var_len = sizeof(long); /* default to 'long' results */ return (MATCH_SUCCEEDED);}static struct if_nameindex *ifnames = NULL;#ifdef linuxstatic void linux_if_freenameindex(struct if_nameindex *);static struct if_nameindex *linux_if_nameindex(void);#endifstatic intif_initialize(void){#ifndef HAVE_IF_NAMEINDEX return -1;#else#ifndef linux if (ifnames) if_freenameindex(ifnames); ifnames = if_nameindex();#else if (ifnames) linux_if_freenameindex(ifnames); ifnames = linux_if_nameindex();#endif if (!ifnames) { ERROR_MSG("if_nameindex() failed"); return -1; } return 0;#endif}static intif_maxifindex(void){#ifndef HAVE_IF_NAMEINDEX return -1;#else struct if_nameindex *p; int max = 0; if (!ifnames) { if (if_initialize() < 0) return -1; } for (p = ifnames; p && p->if_index; p++) { if (max < p->if_index) max = p->if_index; } return max;#endif}static intif_countifindex(void){#ifndef HAVE_IF_NAMEINDEX return -1;#else struct if_nameindex *p; int count = 0; if (!ifnames) { if (if_initialize() < 0) return -1; } for (p = ifnames; p && p->if_index; p++) { count++; } return count;#endif}static char *if_getname(int idx){#ifndef HAVE_IF_NAMEINDEX return NULL;#else struct if_nameindex *p; if (!ifnames) { if (if_initialize() < 0) return NULL; } for (p = ifnames; p && p->if_index; p++) { if (p->if_index == idx) return p->if_name; } return NULL;#endif}#ifdef notusedstatic intif_getindex(const char *name){#ifndef HAVE_IF_NAMEINDEX return -1;#else struct if_nameindex *p; if (!ifnames) { if (if_initialize() < 0) return -1; } for (p = ifnames; p && p->if_index; p++) { if (strcmp(name, p->if_name) == 0) return p->if_index; } return -1;#endif}#endif /* notused *//*------------------------------------------------------------*/#ifndef linux/* * KAME dependent part */static intif_getifnet(int idx, struct ifnet *result){ caddr_t q; struct ifnet tmp; if (!auto_nlist("ifnet", (char *) &q, sizeof(q))) return -1; while (q) { klookup((u_long) q, (char *) &tmp, sizeof(tmp)); if (idx == tmp.if_index) { memcpy(result, &tmp, sizeof(tmp)); return 0; }#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) q = (caddr_t) TAILQ_NEXT(&tmp, if_link);#else# if defined(__NetBSD__) || defined(__OpenBSD__) q = (caddr_t) TAILQ_NEXT(&tmp, if_list);# else q = (caddr_t) tmp.if_next;# endif#endif } return -1;}#if TRUST_IFLASTCHANGE /*untrustable value returned... */#ifdef HAVE_NET_IF_MIB_H#if defined(HAVE_SYS_SYSCTL_H) && defined(CTL_NET)static intif_getifmibdata(int idx, struct ifmibdata *result){ int mib[6] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL }; size_t len; struct ifmibdata tmp; mib[4] = idx; len = sizeof(struct ifmibdata); if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), &tmp, &len, 0, 0) < 0) return -1; memcpy(result, &tmp, sizeof(tmp)); return 0;}#endif#endif /*HAVE_NET_IF_MIB_H */#endif /* TRUST_IFLASTCHANGE */#ifdef __KAME__#define IPV6_FORWARDING_SYMBOL "ip6_forwarding"#define IPV6_DEFHLIM_SYMBOL "ip6_defhlim"#endifu_char *var_ipv6(register struct variable * vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method){ int i; if (header_ipv6(vp, name, length, exact, var_len, write_method) == MATCH_FAILED) { return NULL; }#if defined(HAVE_SYS_SYSCTL_H) && defined(CTL_NET) /* * try with sysctl routines */ { int name[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, 0 }; const char *namestr = NULL; int result; size_t resultsiz; resultsiz = sizeof(result); switch (vp->magic) { case IPV6FORWARDING: name[3] = IPV6CTL_FORWARDING; namestr = "IPV6CTL_FORWARDING"; if (sysctl (name, sizeof(name) / sizeof(name[0]), &result, &resultsiz, 0, 0) < 0) { DEBUGMSGTL(("mibII/ipv6", "sysctl(CTL_NET, PF_INET6, IPPROTO_IPV6, %s)\n", namestr)); break; } else { if (result) long_return = 1; /* GATEWAY */ else long_return = 2; /* HOST */ return (u_char *) & long_return; } break; case IPV6DEFAULTHOPLIMIT: name[3] = IPV6CTL_DEFHLIM; namestr = "IPV6CTL_DEFHLIM"; if (sysctl (name, sizeof(name) / sizeof(name[0]), &result, &resultsiz, 0, 0) < 0) { DEBUGMSGTL(("mibII/ipv6", "sysctl(CTL_NET, PF_INET6, IPPROTO_IPV6, %s)\n", namestr)); break; } else { long_return = result; return (u_char *) & long_return; } } }#endif /* not (HAVE_SYS_SYSCTL_H && CTL_NET) */ /* * try looking into the kernel variable */ switch (vp->magic) {#ifdef IPV6_FORWARDING_SYMBOL case IPV6FORWARDING: if (auto_nlist(IPV6_FORWARDING_SYMBOL, (char *) &i, sizeof(i))) { if (i) long_return = 1; /*GATEWAY*/ else long_return = 2; /*HOST*/ return (u_char *) & long_return; } break;#endif#ifdef IPV6_DEFHLIM_SYMBOL case IPV6DEFAULTHOPLIMIT: if (auto_nlist(IPV6_DEFHLIM_SYMBOL, (char *) &i, sizeof(i))) { long_return = i; return (u_char *) & long_return; } break;#endif case IPV6INTERFACES:#ifdef HAVE_IF_NAMEINDEX /* * not really the right answer... we must count IPv6 capable * interfaces only. */ long_return = if_countifindex(); if (long_return < 0) break; return (u_char *) & long_return;#endif break;#if 0 case IPV6IFTBLLASTCHG: long_return = 0; /*XXX*/ return (u_char *) & long_return;#endif default: break; } ERROR_MSG(""); return NULL;}u_char *var_ifv6Entry(register struct variable * vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method){#ifndef HAVE_IF_NAMEINDEX return NULL;#else int interface; int max; char *p; max = if_maxifindex(); if (max < 0) return NULL; if (header_ipv6_scan (vp, name, length, exact, var_len, write_method, 1, max) == MATCH_FAILED) { return NULL; } interface = name[*length - 1]; DEBUGMSGTL(("mibII/ipv6", "interface: %d(%s)\n", interface, if_getname(interface))); if (interface > max) return NULL; switch (vp->magic) { case IPV6IFDESCR: p = if_getname(interface); if (p) { *var_len = strlen(p); return p; } break; case IPV6IFLOWLAYER: /* * should check if type, this is a hard one... */ *var_len = nullOidLen; return (u_char *) nullOid; case IPV6IFEFFECTMTU: {#if defined(SIOCGIFMTU) && !defined(__OpenBSD__) struct ifreq ifr; int s; memset(&ifr, 0, sizeof(ifr)); ifr.ifr_addr.sa_family = AF_INET6; strncpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name)); if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) break; if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) { close(s); break; } long_return = ifr.ifr_mtu; close(s); return (u_char *) & long_return;#else break;#endif }#if 0 /*not yet */ case IPV6IFREASMMAXSIZE: /* * I dunno what the spec means for this MIB */ case IPV6IFTOKEN: case IPV6IFTOKENLEN:#endif case IPV6IFPHYSADDRESS: { struct ifnet ifnet; struct ifaddr ifaddr; static struct sockaddr_dl sdl; caddr_t ifa;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -