📄 ipv6.c
字号:
if (if_getifnet(interface, &ifnet) < 0) break;#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) 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__) && __FreeBSD__ >= 3) || defined(darwin) 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 TRUST_IFLASTCHANGE /*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 DEBUGMSGTL(("mibII/ipv6", "lastchange = { %d.%06d }\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 /* TRUST_IFLASTCHANGE */#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) { 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; 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) {#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: case IPV6IFICMPOUTTIMEXCDS: case IPV6IFICMPOUTPARMPROBS: case IPV6IFICMPOUTPKTTOOBIGS: case IPV6IFICMPOUTECHOS: case IPV6IFICMPOUTECHOREPS: case IPV6IFICMPOUTRTRSLICITS: case IPV6IFICMPOUTRTRADVS: case IPV6IFICMPOUTNBRSLICITS: case IPV6IFICMPOUTNBRADVS: case IPV6IFICMPOUTREDIRECTS: case IPV6IFICMPOUTGRPMEQERYS: case IPV6IFICMPOUTGRPMERSPS: case IPV6IFICMPOUTGRPMEREDCS: { struct icmp6_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_ICMP6, (caddr_t) & ifr) < 0) { close(s); break; } close(s); ifs6 = &ifr.ifr_ifru.ifru_icmp6stat; switch (vp->magic) { case IPV6IFICMPINMSG: long_return = ifs6->ifs6_in_msg; break; case IPV6IFICMPINERRORS: long_return = ifs6->ifs6_in_error; break; case IPV6IFICMPINDSTUNRCHS: long_return = ifs6->ifs6_in_dstunreach; break; case IPV6IFICMPINADMPROHS: long_return = ifs6->ifs6_in_adminprohib; break; case IPV6IFICMPINTIMEXCDS: long_return = ifs6->ifs6_in_timeexceed; break; case IPV6IFICMPINPARMPROBS: long_return = ifs6->ifs6_in_paramprob; break; case IPV6IFICMPINPKTTOOBIGS: long_return = ifs6->ifs6_in_pkttoobig; break; case IPV6IFICMPINECHOS: long_return = ifs6->ifs6_in_echo; break; case IPV6IFICMPINECHOREPS: long_return = ifs6->ifs6_in_echoreply; break; case IPV6IFICMPINRTRSLICITS: long_return = ifs6->ifs6_in_routersolicit; break; case IPV6IFICMPINRTRADVS: long_return = ifs6->ifs6_in_routeradvert; break; case IPV6IFICMPINNBRSLICITS: long_return = ifs6->ifs6_in_neighborsolicit; break; case IPV6IFICMPINNBRADVS: long_return = ifs6->ifs6_in_neighboradvert; break; case IPV6IFICMPINREDIRECTS: long_return = ifs6->ifs6_in_redirect; break; case IPV6IFICMPINGRPMEQERYS: long_return = ifs6->ifs6_in_mldquery; break; case IPV6IFICMPINGRPMERSPS: long_return = ifs6->ifs6_in_mldreport; break; case IPV6IFICMPINGRPMEREDCS: long_return = ifs6->ifs6_in_mlddone; break; case IPV6IFICMPOUTMSG: long_return = ifs6->ifs6_out_msg; break; case IPV6IFICMPOUTERRORS: long_return = ifs6->ifs6_out_error; break; case IPV6IFICMPOUTDSTUNRCHS: long_return = ifs6->ifs6_out_dstunreach; break; case IPV6IFICMPOUTADMPROHS: long_return = ifs6->ifs6_out_adminprohib; break; case IPV6IFICMPOUTTIMEXCDS: long_return = ifs6->ifs6_out_timeexceed; break; case IPV6IFICMPOUTPARMPROBS: long_return = ifs6->ifs6_out_paramprob; break; case IPV6IFICMPOUTPKTTOOBIGS: long_return = ifs6->ifs6_out_pkttoobig; break; case IPV6IFICMPOUTECHOS: long_return = ifs6->ifs6_out_echo; break; case IPV6IFICMPOUTECHOREPS: long_return = ifs6->ifs6_out_echoreply; break; case IPV6IFICMPOUTRTRSLICITS: long_return = ifs6->ifs6_out_routersolicit; break; case IPV6IFICMPOUTRTRADVS: long_return = ifs6->ifs6_out_routeradvert; break; case IPV6IFICMPOUTNBRSLICITS: long_return = ifs6->ifs6_out_neighborsolicit; break; case IPV6IFICMPOUTNBRADVS: long_return = ifs6->ifs6_out_neighboradvert; break; case IPV6IFICMPOUTREDIRECTS: long_return = ifs6->ifs6_out_redirect; break; case IPV6IFICMPOUTGRPMEQERYS: long_return = ifs6->ifs6_out_mldquery; break; case IPV6IFICMPOUTGRPMERSPS: long_return = ifs6->ifs6_out_mldreport; break; case IPV6IFICMPOUTGRPMEREDCS: long_return = ifs6->ifs6_out_mlddone; break; default: return NULL; } return (u_char *) & long_return; }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -