📄 ipv6.c
字号:
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 savname[MAX_OID_LEN]; int result; int i, j; caddr_t p; static struct in6pcb in6pcb, savpcb; int found, savnameLen;#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ struct inpcbtable udbtable; caddr_t first;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) char *sysctl_buf; struct xinpgen *xig, *oxig;#else static struct in6pcb udb6;#endif DEBUGMSGTL(("mibII/ipv6", "var_udp6: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6", " %d\n", exact));#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ if (!auto_nlist("udbtable", (char *) &udbtable, sizeof(udbtable))) return NULL; first = p = (caddr_t)udbtable.inpt_queue.cqh_first;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) if (!auto_nlist("udb6", (char *) &udb6, sizeof(udb6))) return NULL; p = (caddr_t) udb6.in6p_next;#else { const char *udblist = "net.inet.udp.pcblist"; const char *pp = udblist; size_t len; if (sysctlbyname(udblist, 0, &len, 0, 0) < 0) return NULL; if ((sysctl_buf = malloc(len)) == NULL) return NULL; udblist = pp; 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); p = (caddr_t) ((char *) xig); /* silence compiler warning */ }#endif found = savnameLen = 0; memcpy((char *) newname, (char *) vp->name, (int) vp->namelen * sizeof(oid)); DEBUGMSGTL(("mibII/ipv6", "start: p=%x\n", p)); while (#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ p && p != first#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) p && (u_long) p != auto_nlist_value("udb6")#else xig->xig_len > sizeof(struct xinpgen)#endif ) { DEBUGMSGTL(("mibII/ipv6", "looping: p=%x\n", p));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) if (klookup((u_long) p, (char *) &in6pcb, sizeof(in6pcb)) < 0) { DEBUGMSGTL(("mibII/ipv6", "klookup fail for udb6 at %x\n", p)); found = 0; break; }#else in6pcb = ((struct xinpcb *) xig)->xi_inp;#endif#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ if (in6pcb.in6p_af != AF_INET6) goto skip;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) if (0 == (in6pcb.inp_vflag & INP_IPV6)) goto skip;#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(*(uint16_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)); result = snmp_oid_compare(name, *length, newname, j); if (exact && (result == 0)) { memcpy(&savpcb, &in6pcb, sizeof(savpcb)); savnameLen = j; memcpy(savname, newname, j * sizeof(oid)); found++; break; } else if (!exact && (result < 0)) { /* * take the least greater one */ if ((savnameLen == 0) || (snmp_oid_compare(savname, savnameLen, newname, j) > 0)) { memcpy(&savpcb, &in6pcb, sizeof(savpcb)); savnameLen = j; memcpy(savname, newname, j * sizeof(oid)); found++; } } skip:#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ p = (caddr_t)in6pcb.in6p_queue.cqe_next;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) p = (caddr_t) in6pcb.in6p_next;#else xig = (struct xinpgen *) ((char *) xig + xig->xig_len);#endif }#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) free(sysctl_buf);#endif DEBUGMSGTL(("mibII/ipv6", "found=%d\n", found)); if (!found) return NULL; *length = savnameLen; memcpy((char *) name, (char *) savname, *length * sizeof(oid)); memcpy(&in6pcb, &savpcb, sizeof(savpcb)); *write_method = 0; *var_len = sizeof(long); /* default to 'long' results *//* DEBUGMSGTL(("mibII/ipv6", "var_udp6 found: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6", " %d\n", exact));*/ DEBUGMSGTL(("mibII/ipv6", "magic=%d\n", vp->magic)); 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(*(uint16_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 savname[MAX_OID_LEN]; int result; int i, j; caddr_t p; static struct in6pcb in6pcb, savpcb; struct tcp6cb tcp6cb; int found, savnameLen; static int tcp6statemap[TCP6_NSTATES]; static int initialized = 0;#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ struct inpcbtable tcbtable; caddr_t first;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) char *sysctl_buf; struct xinpgen *xig, *oxig;#else static struct in6pcb tcb6;#endif 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(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ if (!auto_nlist("tcbtable", (char *) &tcbtable, sizeof(tcbtable))) return NULL; first = p = (caddr_t)tcbtable.inpt_queue.cqh_first;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) if (!auto_nlist("tcb6", (char *) &tcb6, sizeof(tcb6))) return NULL; p = (caddr_t) tcb6.in6p_next;#else { const char *tcblist = "net.inet.tcp.pcblist"; const char *pp = tcblist; size_t len; if (sysctlbyname(tcblist, 0, &len, 0, 0) < 0) return NULL; if ((sysctl_buf = malloc(len)) == NULL) return NULL; tcblist = pp; 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); p = (caddr_t) ((char *) xig); /* silence compiler warning */ }#endif found = savnameLen = 0; memcpy((char *) newname, (char *) vp->name, (int) vp->namelen * sizeof(oid)); DEBUGMSGTL(("mibII/ipv6", "start: p=%x\n", p)); while (#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ p && p != first#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) p && (u_long) p != auto_nlist_value("tcb6")#else xig->xig_len > sizeof(struct xinpgen)#endif ) { DEBUGMSGTL(("mibII/ipv6", "looping: p=%x\n", p));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) if (klookup((u_long) p, (char *) &in6pcb, sizeof(in6pcb)) < 0) { DEBUGMSGTL(("mibII/ipv6", "klookup fail for tcb6 at %x\n", p)); found = 0; break; }#else in6pcb = ((struct xinpcb *) xig)->xi_inp;#endif#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ if (in6pcb.in6p_af != AF_INET6) goto skip;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) if (0 == (in6pcb.inp_vflag & INP_IPV6)) goto skip;#endif if (klookup ((u_long) in6pcb.in6p_ppcb, (char *) &tcp6cb, sizeof(tcp6cb)) < 0) { DEBUGMSGTL(("mibII/ipv6", "klookup fail for tcb6.tcp6cb at %x\n", in6pcb.in6p_ppcb)); found = 0; 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(*(uint16_t *) & in6pcb.in6p_laddr.s6_addr[2]); else newname[j++] = 0; /*XXX*/ newname[j++] = tcp6statemap[tcp6cb.t_state]; DEBUGMSGTL(("mibII/ipv6", "var_tcp6 new: %d %d ", (int) vp->namelen, j)); DEBUGMSGOID(("mibII/ipv6", newname, j)); 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 result = snmp_oid_compare(name, *length, newname, j); if (exact && (result == 0)) { memcpy(&savpcb, &in6pcb, sizeof(savpcb)); savnameLen = j; memcpy(savname, newname, j * sizeof(oid)); found++; break; } else if (!exact && (result < 0)) { /* * take the least greater one */ if ((savnameLen == 0) || (snmp_oid_compare(savname, savnameLen, newname, j) > 0)) { memcpy(&savpcb, &in6pcb, sizeof(savpcb)); savnameLen = j; memcpy(savname, newname, j * sizeof(oid)); found++; } } skip:#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000 /*1.6Y*/ p = (caddr_t)in6pcb.in6p_queue.cqe_next;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin) p = (caddr_t) in6pcb.in6p_next;#else xig = (struct xinpgen *) ((char *) xig + xig->xig_len);#endif }#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin) free(sysctl_buf);#endif DEBUGMSGTL(("mibII/ipv6", "found=%d\n", found)); if (!found) return NULL; *length = savnameLen; memcpy((char *) name, (char *) savname, *length * sizeof(oid)); memcpy(&in6pcb, &savpcb, sizeof(savpcb)); *write_method = 0; *var_len = sizeof(long); /* default to 'long' results *//* DEBUGMSGTL(("mibII/ipv6", "var_tcp6 found: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6", " %d\n", exact));*/ DEBUGMSGTL(("mibII/ipv6", "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(*(uint16_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;}#else /* ! TCP6 */static int mapTcpState( int val){ static int tcpstatemap[16 /*TCP_NSTATES*/]; static int initialized = 0; if (!initialized) { memset(tcpstatemap, 0, sizeof(tcpstatemap));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -