Date: Thu, 16 Jul 2009 23:27:25 GMT From: Gabor Pali <pgj@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 166184 for review Message-ID: <200907162327.n6GNRP3L052412@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=166184 Change 166184 by pgj@petymeg-current on 2009/07/16 23:26:51 - Teach the bsnmpd(1) module snmp_mibII to use libnetstat for listing TCP and UDP connections. - Add libnetstat as dependency. Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/contrib/bsnmp/snmp_mibII/mibII_tcp.c#2 edit .. //depot/projects/soc2009/pgj_libstat/src/contrib/bsnmp/snmp_mibII/mibII_udp.c#2 edit .. //depot/projects/soc2009/pgj_libstat/src/usr.sbin/bsnmpd/modules/snmp_mibII/Makefile#2 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/contrib/bsnmp/snmp_mibII/mibII_tcp.c#2 (text+ko) ==== @@ -38,16 +38,15 @@ #include <netinet/tcp_var.h> #include <netinet/tcp_timer.h> #include <netinet/tcp_fsm.h> +#include <netstat.h> struct tcp_index { struct asn_oid index; - struct xtcpcb *tp; + enum tcp_state tcp_state; }; static uint64_t tcp_tick; static struct tcpstat tcpstat; -static struct xinpgen *xinpgen; -static size_t xinpgen_len; static u_int tcp_count; static u_int tcp_total; @@ -67,9 +66,15 @@ fetch_tcp(void) { size_t len; - struct xinpgen *ptr; - struct xtcpcb *tp; struct tcp_index *oid; + + struct socket_type_list *stlp; + struct socket_type_iterator *stip; + struct socket_type *stp; + struct addr_type *atp; + int error; + + struct in_addr in; in_addr_t inaddr; len = sizeof(tcpstat); @@ -82,39 +87,32 @@ return (-1); } - len = 0; - if (sysctlbyname("net.inet.tcp.pcblist", NULL, &len, NULL, 0) == -1) { - syslog(LOG_ERR, "net.inet.tcp.pcblist: %m"); + stlp = netstat_stl_alloc(); + if (stlp == NULL) { + syslog(LOG_ERR, "netstat_stl_alloc() in fetch_tcp()"); return (-1); } - if (len > xinpgen_len) { - if ((ptr = realloc(xinpgen, len)) == NULL) { - syslog(LOG_ERR, "%zu: %m", len); - return (-1); - } - xinpgen = ptr; - xinpgen_len = len; + if (netstat_socket(PF_INET, 0, IPPROTO_TCP, stlp, NETSTAT_SOCKET_ALL, + NULL) < 0) { + error = netstat_stl_geterror(stlp); + syslog(LOG_ERR, "netstat_socket: %s", netstat_strerror(error)); + return (-1); } - if (sysctlbyname("net.inet.tcp.pcblist", xinpgen, &len, NULL, 0) == -1) { - syslog(LOG_ERR, "net.inet.tcp.pcblist: %m"); + if (netstat_sti_alloc(stlp, &stip) < 0) { + netstat_stl_free(stlp); + syslog(LOG_ERR, "netstat_sti_alloc() in fetch_tcp()"); return (-1); } tcp_tick = get_ticks(); - tcp_count = 0; tcp_total = 0; - for (ptr = (struct xinpgen *)(void *)((char *)xinpgen + xinpgen->xig_len); - ptr->xig_len > sizeof(struct xinpgen); - ptr = (struct xinpgen *)(void *)((char *)ptr + ptr->xig_len)) { - tp = (struct xtcpcb *)ptr; - if (tp->xt_inp.inp_gencnt > xinpgen->xig_gen || - (tp->xt_inp.inp_vflag & INP_IPV4) == 0) - continue; + for (stp = netstat_sti_first(stip); stp != NULL; + stp = netstat_sti_next(stip)) { tcp_total++; - if (tp->xt_tp.t_state == TCPS_ESTABLISHED || - tp->xt_tp.t_state == TCPS_CLOSE_WAIT) + if (netstat_st_get_tcps(stp) == tcps_Established || + netstat_st_get_tcps(stp) == tcps_CloseWait) tcp_count++; } @@ -130,32 +128,33 @@ } oid = tcpoids; - for (ptr = (struct xinpgen *)(void *)((char *)xinpgen + xinpgen->xig_len); - ptr->xig_len > sizeof(struct xinpgen); - ptr = (struct xinpgen *)(void *)((char *)ptr + ptr->xig_len)) { - tp = (struct xtcpcb *)ptr; - if (tp->xt_inp.inp_gencnt > xinpgen->xig_gen || - (tp->xt_inp.inp_vflag & INP_IPV4) == 0) - continue; - oid->tp = tp; + + for (stp = netstat_sti_first(stip); stp != NULL; + stp = netstat_sti_next(stip)) { + oid->tcp_state = netstat_st_get_tcps(stp); oid->index.len = 10; - inaddr = ntohl(tp->xt_inp.inp_laddr.s_addr); + atp = netstat_st_get_address(stp, 0); + netstat_at_get_address(atp, (char *) &in, sizeof(in)); + inaddr = ntohl(in.s_addr); oid->index.subs[0] = (inaddr >> 24) & 0xff; oid->index.subs[1] = (inaddr >> 16) & 0xff; oid->index.subs[2] = (inaddr >> 8) & 0xff; - oid->index.subs[3] = (inaddr >> 0) & 0xff; - oid->index.subs[4] = ntohs(tp->xt_inp.inp_lport); - inaddr = ntohl(tp->xt_inp.inp_faddr.s_addr); + oid->index.subs[3] = (inaddr ) & 0xff; + oid->index.subs[4] = netstat_at_get_port(atp); + atp = netstat_st_get_address(stp, 1); + netstat_at_get_address(atp, (char *) &in, sizeof(in)); + inaddr = ntohl(in.s_addr); oid->index.subs[5] = (inaddr >> 24) & 0xff; oid->index.subs[6] = (inaddr >> 16) & 0xff; oid->index.subs[7] = (inaddr >> 8) & 0xff; - oid->index.subs[8] = (inaddr >> 0) & 0xff; - oid->index.subs[9] = ntohs(tp->xt_inp.inp_fport); + oid->index.subs[8] = (inaddr ) & 0xff; + oid->index.subs[9] = netstat_at_get_port(atp); oid++; } qsort(tcpoids, tcp_total, sizeof(tcpoids[0]), tcp_compare); - + netstat_sti_free(stip); + netstat_stl_free(stlp); return (0); } @@ -290,39 +289,39 @@ switch (value->var.subs[sub - 1]) { case LEAF_tcpConnState: - switch (tcpoids[i].tp->xt_tp.t_state) { + switch (tcpoids[i].tcp_state) { - case TCPS_CLOSED: + case tcps_Closed: value->v.integer = 1; break; - case TCPS_LISTEN: + case tcps_Listen: value->v.integer = 2; break; - case TCPS_SYN_SENT: + case tcps_SynSent: value->v.integer = 3; break; - case TCPS_SYN_RECEIVED: + case tcps_SynReceived: value->v.integer = 4; break; - case TCPS_ESTABLISHED: + case tcps_Established: value->v.integer = 5; break; - case TCPS_CLOSE_WAIT: + case tcps_CloseWait: value->v.integer = 8; break; - case TCPS_FIN_WAIT_1: + case tcps_FinWait1: value->v.integer = 6; break; - case TCPS_CLOSING: + case tcps_Closing: value->v.integer = 10; break; - case TCPS_LAST_ACK: + case tcps_LastAck: value->v.integer = 9; break; - case TCPS_FIN_WAIT_2: + case tcps_FinWait2: value->v.integer = 7; break; - case TCPS_TIME_WAIT: + case tcps_TimeWait: value->v.integer = 11; break; default: ==== //depot/projects/soc2009/pgj_libstat/src/contrib/bsnmp/snmp_mibII/mibII_udp.c#2 (text+ko) ==== @@ -37,37 +37,36 @@ #include <netinet/udp.h> #include <netinet/ip_var.h> #include <netinet/udp_var.h> +#include <netstat.h> -struct udp_index { - struct asn_oid index; - struct xinpcb *inp; -}; - static uint64_t udp_tick; static struct udpstat udpstat; -static struct xinpgen *xinpgen; -static size_t xinpgen_len; static u_int udp_total; static u_int oidnum; -static struct udp_index *udpoids; +static struct asn_oid *udpoids; static int udp_compare(const void *p1, const void *p2) { - const struct udp_index *t1 = p1; - const struct udp_index *t2 = p2; + const struct asn_oid *t1 = p1; + const struct asn_oid *t2 = p2; - return (asn_compare_oid(&t1->index, &t2->index)); + return (asn_compare_oid(t1, t2)); } static int fetch_udp(void) { size_t len; - struct xinpgen *ptr; - struct xinpcb *inp; - struct udp_index *oid; + struct socket_type_list *stlp; + struct socket_type_iterator *stip; + struct socket_type *stp; + struct addr_type *atp; + int error; + + struct asn_oid *oid; + struct in_addr in; in_addr_t inaddr; len = sizeof(udpstat); @@ -80,37 +79,25 @@ return (-1); } - udp_tick = get_ticks(); - - len = 0; - if (sysctlbyname("net.inet.udp.pcblist", NULL, &len, NULL, 0) == -1) { - syslog(LOG_ERR, "net.inet.udp.pcblist: %m"); + stlp = netstat_stl_alloc(); + if (stlp == NULL) { + syslog(LOG_ERR, "netstat_stl_alloc() in fetch_udp()"); return (-1); } - if (len > xinpgen_len) { - if ((ptr = realloc(xinpgen, len)) == NULL) { - syslog(LOG_ERR, "%zu: %m", len); - return (-1); - } - xinpgen = ptr; - xinpgen_len = len; + if (netstat_socket(PF_INET, 0, IPPROTO_UDP, stlp, NETSTAT_SOCKET_ALL, + NULL) < 0) { + error = netstat_stl_geterror(stlp); + syslog(LOG_ERR, "netstat_socket: %s", netstat_strerror(error)); + return (-1); } - if (sysctlbyname("net.inet.udp.pcblist", xinpgen, &len, NULL, 0) == -1) { - syslog(LOG_ERR, "net.inet.udp.pcblist: %m"); + if (netstat_sti_alloc(stlp, &stip) < 0) { + netstat_stl_free(stlp); + syslog(LOG_ERR, "netstat_sti_alloc() in fetch_udp()"); return (-1); } - udp_total = 0; - for (ptr = (struct xinpgen *)(void *)((char *)xinpgen + xinpgen->xig_len); - ptr->xig_len > sizeof(struct xinpgen); - ptr = (struct xinpgen *)(void *)((char *)ptr + ptr->xig_len)) { - inp = (struct xinpcb *)ptr; - if (inp->xi_inp.inp_gencnt > xinpgen->xig_gen || - (inp->xi_inp.inp_vflag & INP_IPV4) == 0) - continue; - - udp_total++; - } + udp_tick = get_ticks(); + udp_total = netstat_stl_length(stlp); if (oidnum < udp_total) { oid = realloc(udpoids, udp_total * sizeof(udpoids[0])); @@ -124,26 +111,24 @@ } oid = udpoids; - for (ptr = (struct xinpgen *)(void *)((char *)xinpgen + xinpgen->xig_len); - ptr->xig_len > sizeof(struct xinpgen); - ptr = (struct xinpgen *)(void *)((char *)ptr + ptr->xig_len)) { - inp = (struct xinpcb *)ptr; - if (inp->xi_inp.inp_gencnt > xinpgen->xig_gen || - (inp->xi_inp.inp_vflag & INP_IPV4) == 0) - continue; - oid->inp = inp; - oid->index.len = 5; - inaddr = ntohl(inp->xi_inp.inp_laddr.s_addr); - oid->index.subs[0] = (inaddr >> 24) & 0xff; - oid->index.subs[1] = (inaddr >> 16) & 0xff; - oid->index.subs[2] = (inaddr >> 8) & 0xff; - oid->index.subs[3] = (inaddr >> 0) & 0xff; - oid->index.subs[4] = ntohs(inp->xi_inp.inp_lport); + + for (stp = netstat_sti_first(stip); stp != NULL; + stp = netstat_sti_next(stip)) { + oid->len = 5; + atp = netstat_st_get_address(stp, 0); + netstat_at_get_address(atp, (char *) &in, sizeof(in)); + inaddr = ntohl(in.s_addr); + oid->subs[0] = (inaddr << 24) & 0xff; + oid->subs[1] = (inaddr << 16) & 0xff; + oid->subs[2] = (inaddr << 8) & 0xff; + oid->subs[3] = (inaddr ) & 0xff; + oid->subs[4] = netstat_at_get_port(atp); oid++; } qsort(udpoids, udp_total, sizeof(udpoids[0]), udp_compare); - + netstat_sti_free(stip); + netstat_stl_free(stlp); return (0); } @@ -211,16 +196,16 @@ case SNMP_OP_GETNEXT: for (i = 0; i < udp_total; i++) - if (index_compare(&value->var, sub, &udpoids[i].index) < 0) + if (index_compare(&value->var, sub, &udpoids[i]) < 0) break; if (i == udp_total) return (SNMP_ERR_NOSUCHNAME); - index_append(&value->var, sub, &udpoids[i].index); + index_append(&value->var, sub, &udpoids[i]); break; case SNMP_OP_GET: for (i = 0; i < udp_total; i++) - if (index_compare(&value->var, sub, &udpoids[i].index) == 0) + if (index_compare(&value->var, sub, &udpoids[i]) == 0) break; if (i == udp_total) return (SNMP_ERR_NOSUCHNAME); @@ -238,14 +223,14 @@ switch (value->var.subs[sub - 1]) { case LEAF_udpLocalAddress: - value->v.ipaddress[0] = udpoids[i].index.subs[0]; - value->v.ipaddress[1] = udpoids[i].index.subs[1]; - value->v.ipaddress[2] = udpoids[i].index.subs[2]; - value->v.ipaddress[3] = udpoids[i].index.subs[3]; + value->v.ipaddress[0] = udpoids[i].subs[0]; + value->v.ipaddress[1] = udpoids[i].subs[1]; + value->v.ipaddress[2] = udpoids[i].subs[2]; + value->v.ipaddress[3] = udpoids[i].subs[3]; break; case LEAF_udpLocalPort: - value->v.integer = udpoids[i].index.subs[4]; + value->v.integer = udpoids[i].subs[4]; break; } ==== //depot/projects/soc2009/pgj_libstat/src/usr.sbin/bsnmpd/modules/snmp_mibII/Makefile#2 (text+ko) ==== @@ -13,9 +13,13 @@ ipForward ifIndex linkDown linkUp MAN= snmp_mibII.3 -CFLAGS+= -I${CONTRIB}/lib -I${CONTRIB}/snmpd +CFLAGS+= -I${CONTRIB}/lib -I${CONTRIB}/snmpd -I../../../../lib/libnetstat CFLAGS+= -DHAVE_ERR_H -DHAVE_GETADDRINFO -DHAVE_STRLCPY -DHAVE_SYS_TREE_H +DPADD= ${LIBNETSTAT} +LDADD= -lnetstat +LDFLAGS+= -L../../../../lib/libnetstat + DEFS= ${MOD}_tree.def INCS= snmp_${MOD}.h BMIBS= BEGEMOT-IP-MIB.txt BEGEMOT-MIB2-MIB.txt
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907162327.n6GNRP3L052412>