📄 ipv6.c
字号:
#endif}/*------------------------------------------------------------*/#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__) && 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*/#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_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]; 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: case IPV6IFSTATSINUNKNOWPROTS: case IPV6IFSTATSINTRUNCATPKTS: case IPV6IFSTATSINDISCARDS: case IPV6IFSTATSINDELIVERS: case IPV6IFSTATSOUTFORWDATAS: case IPV6IFSTATSOUTREQS: case IPV6IFSTATSOUTDISCARDS: case IPV6IFSTATSOUTFRAGOKS: case IPV6IFSTATSOUTFRAGFAILS: case IPV6IFSTATSOUTFRAGCREATS: case IPV6IFSTATSOUTREASMREQS: case IPV6IFSTATSOUTREASMOKS: case IPV6IFSTATSOUTREASMFAILS: case IPV6IFSTATSINMCASTPKTS: case IPV6IFSTATSOUTMCASTPKTS: { struct in6_ifstat *ifs6; struct in6_ifreq ifr; int s; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name)); if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) break; if (ioctl(s, SIOCGIFSTAT_IN6, (caddr_t)&ifr) < 0) { extern int errno; close(s); break; } close(s); ifs6 = &ifr.ifr_ifru.ifru_stat; switch (vp->magic) { case IPV6IFSTATSINRCVS: long_return = ifs6->ifs6_in_receive; break; case IPV6IFSTATSINHDRERRS: long_return = ifs6->ifs6_in_hdrerr; break; case IPV6IFSTATSTOOBIGERRS: long_return = ifs6->ifs6_in_toobig; break; case IPV6IFSTATSINNOROUTES: long_return = ifs6->ifs6_in_noroute; break; case IPV6IFSTATSINADDRERRS: long_return = ifs6->ifs6_in_addrerr; break; case IPV6IFSTATSINUNKNOWPROTS: long_return = ifs6->ifs6_in_protounknown; break; case IPV6IFSTATSINTRUNCATPKTS: long_return = ifs6->ifs6_in_truncated; break; case IPV6IFSTATSINDISCARDS: long_return = ifs6->ifs6_in_discard; break; case IPV6IFSTATSINDELIVERS: long_return = ifs6->ifs6_in_deliver; break; case IPV6IFSTATSOUTFORWDATAS: long_return = ifs6->ifs6_out_forward; break; case IPV6IFSTATSOUTREQS: long_return = ifs6->ifs6_out_request; break; case IPV6IFSTATSOUTDISCARDS: long_return = ifs6->ifs6_out_discard; break; case IPV6IFSTATSOUTFRAGOKS: long_return = ifs6->ifs6_out_fragok; break; case IPV6IFSTATSOUTFRAGFAILS: long_return = ifs6->ifs6_out_fragfail; break; case IPV6IFSTATSOUTFRAGCREATS: long_return = ifs6->ifs6_out_fragcreat; break; case IPV6IFSTATSOUTREASMREQS: long_return = ifs6->ifs6_reass_reqd; break; case IPV6IFSTATSOUTREASMOKS: long_return = ifs6->ifs6_reass_ok; break; case IPV6IFSTATSOUTREASMFAILS: long_return = ifs6->ifs6_reass_fail; break; case IPV6IFSTATSINMCASTPKTS: long_return = ifs6->ifs6_in_mcast; break; case IPV6IFSTATSOUTMCASTPKTS: long_return = ifs6->ifs6_out_mcast; break; default: return NULL; } return (u_char *)&long_return; }#endif default: break; } return NULL;#endif}u_char *var_icmpv6Entry( 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) {#ifdef SIOCGIFSTAT_ICMP6 case IPV6IFICMPINMSG: case IPV6IFICMPINERRORS: case IPV6IFICMPINDSTUNRCHS: case IPV6IFICMPINADMPROHS: case IPV6IFICMPINTIMEXCDS: case IPV6IFICMPINPARMPROBS: case IPV6IFICMPINPKTTOOBIGS: case IPV6IFICMPINECHOS: case IPV6IFICMPINECHOREPS: case IPV6IFICMPINRTRSLICITS: case IPV6IFICMPINRTRADVS: case IPV6IFICMPINNBRSLICITS: case IPV6IFICMPINNBRADVS: case IPV6IFICMPINREDIRECTS: case IPV6IFICMPINGRPMEQERYS: case IPV6IFICMPINGRPMERSPS: case IPV6IFICMPINGRPMEREDCS: case IPV6IFICMPOUTMSG: case IPV6IFICMPOUTERRORS: case IPV6IFICMPOUTDSTUNRCHS: case IPV6IFICMPOUTADMPROHS:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -