📄 ipv6.c
字号:
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;}#ifdef TCP6u_char *var_tcp6( 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, tcb6; struct tcp6cb tcp6cb; int found, hitnext; static int tcp6statemap[TCP6_NSTATES]; static int initialized = 0;#if defined(__FreeBSD__) && __FreeBSD__ >= 3 char *sysctl_buf; struct xinpgen *xig, *oxig;#endif /* defined(__FreeBSD__) && __FreeBSD__ >= 3 */ if (!initialized) { tcp6statemap[TCP6S_CLOSED] = 1; tcp6statemap[TCP6S_LISTEN] = 2; tcp6statemap[TCP6S_SYN_SENT] = 3; tcp6statemap[TCP6S_SYN_RECEIVED] = 4; tcp6statemap[TCP6S_ESTABLISHED] = 5; tcp6statemap[TCP6S_CLOSE_WAIT] = 8; tcp6statemap[TCP6S_FIN_WAIT_1] = 6; tcp6statemap[TCP6S_CLOSING] = 10; tcp6statemap[TCP6S_LAST_ACK] = 9; tcp6statemap[TCP6S_FIN_WAIT_2] = 7; tcp6statemap[TCP6S_TIME_WAIT] = 11; initialized++; } DEBUGMSGTL(("mibII/ipv6", "var_tcp6: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6"," %d\n", exact));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) if (!auto_nlist("tcb6", (char *)&tcb6, sizeof(tcb6))) return NULL; p = (caddr_t)tcb6.in6p_next;#else { const char *tcblist = "net.inet.tcp.pcblist"; int len; if (sysctlbyname(tcblist, 0, &len, 0, 0) < 0) return NULL; if ((sysctl_buf = malloc(len)) == NULL) return NULL; if (sysctlbyname(tcblist, 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)); while(#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) p && (u_long)p != auto_nlist_value("tcb6")#else xig->xig_len > sizeof(struct xinpgen)#endif ) { DEBUGP("looping: p=%x\n", p);#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) if (klookup((u_long)p, (char *)&in6pcb, sizeof(in6pcb)) < 0) { DEBUGP("klookup fail for in6pcb at %x\n", p); break; }#else in6pcb = ((struct xinpcb *)xig)->xi_inp;#endif if (klookup((u_long)in6pcb.in6p_ppcb, (char *)&tcp6cb, sizeof(tcp6cb)) < 0) { DEBUGP("klookup fail for tcp6cb at %x\n", in6pcb.in6p_ppcb); break; } 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); for (i = 0; i < sizeof(struct in6_addr); i++) newname[j++] = in6pcb.in6p_faddr.s6_addr[i]; newname[j++] = ntohs(in6pcb.in6p_fport); 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*/ newname[j++] = tcp6statemap[tcp6cb.t_state]; DEBUGMSGTL(("mibII/ipv6", "var_tcp6 newname: ")); DEBUGMSGOID(("mibII/ipv6", newname, *length)); DEBUGMSG(("mibII/ipv6", "\nvar_tcp6 oldname: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6"," %d\n", exact));#if 1 /* this is very odd but sometimes happen, and cause infinite loop */ if (ntohs(in6pcb.in6p_lport) == 0) goto skip;#endif 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 TCP6 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 TCP6 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; } } }skip:#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 DEBUGP("found=%d\n", found); 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 */ DEBUGP("magic=%d\n", vp->magic); switch (vp->magic) { case IPV6TCPLOCALADDR: *var_len = sizeof(struct in6_addr); return (u_char *)&in6pcb.in6p_laddr.s6_addr[0]; case IPV6TCPLOCALPORT: long_return = ntohs(in6pcb.in6p_lport); return (u_char *)&long_return; case IPV6TCPREMOTEADDR: *var_len = sizeof(struct in6_addr); return (u_char *)&in6pcb.in6p_faddr.s6_addr[0]; case IPV6TCPREMOTEPORT: long_return = ntohs(in6pcb.in6p_fport); return (u_char *)&long_return; case IPV6TCPIFINDEX: 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; case IPV6TCPCONNSTATE: long_return = tcp6statemap[tcp6cb.t_state]; return (u_char *)&long_return; default: break; } ERROR_MSG(""); return NULL;}#elseu_char *var_tcp6( 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, tcb6; struct tcpcb tcpcb; int found, hitnext; static int tcpstatemap[TCP_NSTATES]; static int initialized = 0;#if defined(__FreeBSD__) && __FreeBSD__ >= 3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -