📄 ipv6.c
字号:
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: 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) { extern int errno; 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 default: break; } return NULL;#endif}u_char *var_udp6( register struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ oid newname[MAX_OID_LEN]; oid tmp1[MAX_OID_LEN], tmp2[MAX_OID_LEN]; int result; int i, j; caddr_t p; static struct in6pcb in6pcb, udb6; int found, hitnext;#if defined(__FreeBSD__) && __FreeBSD__ >= 3 char *sysctl_buf; struct xinpgen *xig, *oxig;#endif /* defined(__FreeBSD__) && __FreeBSD__ >= 3 */ DEBUGMSGTL(("mibII/ipv6", "var_udp6: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6"," %d\n", exact));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) if (!auto_nlist("udb6", (char *)&udb6, sizeof(udb6))) return NULL; p = (caddr_t)udb6.in6p_next;#else { const char *udblist = "net.inet.udp.pcblist"; int len; if (sysctlbyname(udblist, 0, &len, 0, 0) < 0) return NULL; if ((sysctl_buf = malloc(len)) == NULL) return NULL; if (sysctlbyname(udblist, sysctl_buf, &len, 0, 0) < 0) { free(sysctl_buf); return NULL; } oxig = (struct xinpgen *)sysctl_buf; xig = (struct xinpgen *)((char *)oxig + oxig->xig_len); }#endif found = hitnext = 0; memcpy((char *)newname, (char *)vp->name, (int)vp->namelen * sizeof(oid)); DEBUGP("start: p=%x\n", p); while (#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) p && (u_long)p != auto_nlist_value("udb6")#else xig->xig_len > sizeof(struct xinpgen)#endif ) { DEBUGP("looping: p=%x\n", p);#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) klookup((u_long)p, (char *)&in6pcb, sizeof(in6pcb));#else in6pcb = ((struct xinpcb *)xig)->xi_inp;#endif j = (int)vp->namelen; for (i = 0; i < sizeof(struct in6_addr); i++) newname[j++] = in6pcb.in6p_laddr.s6_addr[i]; newname[j++] = ntohs(in6pcb.in6p_lport); if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr)) newname[j++] = ntohs(*(u_int16_t *)&in6pcb.in6p_laddr.s6_addr[2]); else newname[j++] = 0; /*XXX*/ DEBUGMSGTL(("mibII/ipv6", "var_udp6 new: %d %d ", (int)vp->namelen, j)); DEBUGMSGOID(("mibII/ipv6", newname, j)); DEBUGMSG(("mibII/ipv6"," %d\n", exact)); if (exact) { result = snmp_oid_compare(name, *length, newname, j); if (result == 0) { found++; break; } } else { /* * tcb entries may not be ordered as SNMP scanning code expect. * Therefore, we'll do a guess... * 1. "name" has the previously matched entry. * If "name" is UDP6 MIBs, take the item that is right next * to the item exactly matches to "name". * 2. Otherwise, it is the very first time we entered to UDP6 MIBs. */ memcpy(tmp1, name, vp->namelen * sizeof(oid)); memcpy(tmp2, newname, vp->namelen * sizeof(oid)); tmp1[vp->namelen] = 0; tmp2[vp->namelen] = 0; if (*length == j && snmp_oid_compare(tmp1, vp->namelen, tmp2, vp->namelen) == 0) { if (!hitnext) { result = snmp_oid_compare(name, *length, newname, j); if (result == 0) hitnext++; } else { found++; break; } } else { if (snmp_oid_compare(name, *length, newname, j) < 0) { found++; break; } } }#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) p = (caddr_t)in6pcb.in6p_next;#else xig = (struct xinpgen *)((char *)xig + xig->xig_len);#endif }#if defined(__FreeBSD__) && __FreeBSD__ >= 3 free(sysctl_buf);#endif /* defined(__FreeBSD__) && __FreeBSD__ >= 3 */ if (!found) return NULL; *length = j; memcpy((char *)name, (char *)newname, *length * sizeof(oid)); *write_method = 0; *var_len = sizeof(long); /* default to 'long' results */ /* try looking into the kernel variable */ switch (vp->magic) { case IPV6UDPLOCALADDRESS: *var_len = sizeof(struct in6_addr); return in6pcb.in6p_laddr.s6_addr; case IPV6UDPLOCALPORT: long_return = ntohs(in6pcb.in6p_lport); return (u_char *)&long_return; case IPV6UDPIFINDEX: if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr)) long_return = ntohs(*(u_int16_t *)&in6pcb.in6p_laddr.s6_addr[2]); else long_return = 0; /*XXX*/ return (u_char *)&long_return; default: break; } ERROR_MSG(""); return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -