📄 ipv6.c
字号:
#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 char *if_getname(int idx){#ifndef HAVE_IF_NAMEINDEX return NULL;#else struct if_nameindex *p; int max = -1; 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}static 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}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__) && 3 <= __FreeBSD__ 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;}#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 }; int 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*//*------------------------------------------------------------*//* IPv6 stack dependent part */#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; int 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) { DEBUGP("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) { DEBUGP("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_maxifindex(); 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]; DEBUGP("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; if (if_getifnet(interface, &ifnet) < 0) break;#if defined(__FreeBSD__) && 3 <= __FreeBSD__ ifa = (caddr_t)TAILQ_FIRST(&ifnet.if_addrhead);#else# if defined(__NetBSD__) || defined(__OpenBSD__) ifa = (caddr_t)TAILQ_FIRST(&ifnet.if_addrlist);# else ifa = (caddr_t)ifnet.if_addrlist;# endif#endif while (ifa) { klookup((u_long)ifa, (char *)&ifaddr, sizeof(ifaddr)); klookup((u_long)ifaddr.ifa_addr, (char *)&sdl, sizeof(sdl)); if (sdl.sdl_family == AF_LINK) { if (sizeof(sdl.sdl_data) < sdl.sdl_nlen + sdl.sdl_alen) { ERROR_MSG("sdl_alen too long for interface\n"); break; } *var_len = sdl.sdl_alen; return (u_char *)(sdl.sdl_data + sdl.sdl_nlen); }#if defined(__FreeBSD__) && 3 <= __FreeBSD__ ifa = (caddr_t)TAILQ_NEXT(&ifaddr, ifa_link);#else# if defined(__NetBSD__) || defined(__OpenBSD__) ifa = (caddr_t)TAILQ_NEXT(&ifaddr, ifa_list);# else ifa = (caddr_t)ifaddr.ifa_next;# endif#endif } /* no physical address found */ *var_len = 0; return NULL; } case IPV6IFADMSTATUS: { struct ifnet ifnet; if (if_getifnet(interface, &ifnet) < 0) break; long_return = (ifnet.if_flags & IFF_RUNNING) ? 1 : 2; return (u_char *)&long_return; } case IPV6IFOPERSTATUS: { struct ifnet ifnet; if (if_getifnet(interface, &ifnet) < 0) break; long_return = (ifnet.if_flags & IFF_UP) ? 1 : 2; return (u_char *)&long_return; }#if 0 /*untrustable value returned...*/ case IPV6IFLASTCHANGE: { struct timeval lastchange; struct timeval now; int gotanswer; gotanswer = 0; lastchange.tv_sec = lastchange.tv_usec = 0;#ifdef HAVE_NET_IF_MIB_H if (!gotanswer) { struct ifmibdata ifmd; if (if_getifmibdata(interface, &ifmd) < 0) ; else { lastchange = ifmd.ifmd_data.ifi_lastchange; gotanswer++; } }#endif#ifdef STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC if (!gotanswer) { struct ifnet ifnet; if (if_getifnet(interface, &ifnet) < 0) ; else { lastchange = ifnet.if_lastchange; gotanswer++; } }#endif DEBUGP("lastchange=%d %d\n", lastchange.tv_sec, lastchange.tv_usec); if (lastchange.tv_sec == 0 && lastchange.tv_usec == 0) long_return = 0; else { gettimeofday(&now, (struct timezone *)NULL); long_return = (u_long)((now.tv_sec - lastchange.tv_sec) * 100); long_return += (u_long)((now.tv_usec - lastchange.tv_usec) / 10000); } return (u_char *)&long_return; }#endif /*0*/#ifdef SIOCGIFSTAT_IN6 case IPV6IFSTATSINRCVS: case IPV6IFSTATSINHDRERRS: case IPV6IFSTATSTOOBIGERRS: case IPV6IFSTATSINNOROUTES: case IPV6IFSTATSINADDRERRS:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -