📄 ipv6.c
字号:
#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 char *sysctl_buf; struct xinpgen *xig, *oxig;#endif /* defined(__FreeBSD__) && __FreeBSD__ >= 3 */ if (!initialized) { tcpstatemap[TCPS_CLOSED] = 1; tcpstatemap[TCPS_LISTEN] = 2; tcpstatemap[TCPS_SYN_SENT] = 3; tcpstatemap[TCPS_SYN_RECEIVED] = 4; tcpstatemap[TCPS_ESTABLISHED] = 5; tcpstatemap[TCPS_CLOSE_WAIT] = 8; tcpstatemap[TCPS_FIN_WAIT_1] = 6; tcpstatemap[TCPS_CLOSING] = 10; tcpstatemap[TCPS_LAST_ACK] = 9; tcpstatemap[TCPS_FIN_WAIT_2] = 7; tcpstatemap[TCPS_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)#else in6pcb = ((struct xinpcb *)xig)->xi_inp;#endif { DEBUGP("klookup fail for in6pcb at %x\n", p); break; } if (klookup((u_long)in6pcb.in6p_ppcb, (char *)&tcpcb, sizeof(tcpcb)) < 0) { DEBUGP("klookup fail for tcpcb 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++] = tcpstatemap[tcpcb.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 } 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 = tcpstatemap[tcpcb.t_state]; return (u_char *)&long_return; default: break; } ERROR_MSG(""); return NULL;}#endif /*TCP6*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -