Date: Wed, 24 Aug 2005 10:38:37 GMT From: Victor Cruceru <soc-victor@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 82494 for review Message-ID: <200508241038.j7OAcbe8029066@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=82494 Change 82494 by soc-victor@soc-victor_82.76.158.176 on 2005/08/24 10:38:21 - Added the SNMP instrumentation for the deprecated tcpConnTable (IPv4 only, backward compatible). - Added the missing Makefile for this tcp46 module. Affected files ... .. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp46/Makefile#1 add .. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp46/tcp46_snmp.c#3 edit Differences ... ==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp46/tcp46_snmp.c#3 (text+ko) ==== @@ -85,7 +85,11 @@ #include <sys/types.h> #include <sys/sysctl.h> +/*forward declaration*/ +static int +fetch_tcp(void); + /*a debug macro*/ #ifndef NDEBUG #define TCP46_DPRINTF(ARGS) do { \ @@ -109,6 +113,20 @@ static const struct asn_oid oid_tcp46 = OIDX_tcpMIB; /*see the generated file tcp46_oid.h*/ +enum TCP_ConnState { + TCPS_closed = 1, + TCPS_listen = 2, + TCPS_synSent = 3, + TCPS_synReceived = 4, + TCPS_established = 5, + TCPS_finWait1 = 6, + TCPS_finWait2 = 7, + TCPS_closeWait = 8, + TCPS_lastAck = 9, + TCPS_closing = 10, + TCPS_timeWait = 11, + TCPS_deleteTCB = 12 +}; struct tcp_index { @@ -251,7 +269,12 @@ tcp46_module); if (tcp46_registration_id == 0) { syslog(LOG_ERR, "Failed to register the tcp46 module." ); + return; } + if (fetch_tcp() == -1) { + syslog(LOG_ERR, "Failed to fetch the TCP data in tcp46 module." ); + } + TCP46_DPRINTF((stderr, "[%s] done.\n ", __func__)); } @@ -314,6 +337,7 @@ tcp46_state_g.tcp_tick = get_ticks(); tcp46_state_g.tcp_estab_count = 0; + tcp46_state_g.tcp4_total = 0; /*First count the endpoints*/ for (ptr = (struct xinpgen *)(void *)((char *)tcp46_state_g.xinpgen + tcp46_state_g.xinpgen->xig_len); @@ -323,12 +347,21 @@ assert(ptr != NULL); /* Ignore sockets for protocols other than the desired one. */ - if (((struct xinpcb *)ptr)->xi_socket.xso_protocol != IPPROTO_TCP) { + if ((( struct xtcpcb *)ptr)->xt_socket.xso_protocol != IPPROTO_TCP) { + TCP46_DPRINTF((stderr, "[%s] One tcp4 conn. ignored (protocol missmatch: %d)\n ", + __func__, + ((struct xinpcb *)ptr)->xi_socket.xso_protocol + )); + continue; } /* Ignore PCBs which were freed during copyout. */ if (tp->xt_inp.inp_gencnt > tcp46_state_g.xinpgen->xig_gen ) { + TCP46_DPRINTF((stderr, "[%s] One tcp4 conn. ignored (freed during copyout)\n ", + __func__ + )); + continue; } @@ -343,6 +376,10 @@ } } + TCP46_DPRINTF((stderr, "[%s] Got %d tcp4 connections.\n ", + __func__, + tcp46_state_g.tcp4_total)); + /*Then reallocate the SNMP holder if needed*/ if (tcp46_state_g.tcp4oids_len < tcp46_state_g.tcp4_total) { oid = realloc(tcp46_state_g.tcp4oids, @@ -356,7 +393,7 @@ tcp46_state_g.tcp4oids_len = tcp46_state_g.tcp4_total; } - /*Fimally fill in the SNMP index*/ + /*Finally fill in the SNMP index*/ memset(tcp46_state_g.tcp4oids, 0, tcp46_state_g.tcp4_total * sizeof(tcp46_state_g.tcp4oids[0]) ); @@ -367,7 +404,7 @@ tp = (struct xtcpcb *)ptr; assert(ptr != NULL); /* Ignore sockets for protocols other than the desired one. */ - if (((struct xinpcb *)ptr)->xi_socket.xso_protocol != IPPROTO_TCP) { + if (((struct xtcpcb *)ptr)->xt_socket.xso_protocol != IPPROTO_TCP) { continue; } @@ -397,7 +434,7 @@ /*Keep the list sorted ins SNMP index ordering*/ qsort( tcp46_state_g.tcp4oids, tcp46_state_g.tcp4_total, - sizeof(tcp46_state_g.tcp4oids), + sizeof(tcp46_state_g.tcp4oids[0]), tcp_compare); return (0); @@ -515,13 +552,118 @@ return (SNMP_ERR_NOERROR); } + +/* + * This is the deprecated TCP Connection table + * tcpConnTable +*/ int -op_tcpConnTable( struct snmp_context *ctx __unused, - struct snmp_value *value __unused, - u_int sub __unused, - u_int iidx __unused, - enum snmp_op curr_op __unused ) { - return (SNMP_ERR_NOSUCHNAME); +op_tcpConnTable( struct snmp_context *ctx __unused, struct snmp_value *value, + u_int sub, u_int iidx __unused, enum snmp_op op) +{ + u_int i; + + if (tcp46_state_g.tcp_tick < this_tick) + if (fetch_tcp() == -1) + return (SNMP_ERR_GENERR); + + switch (op) { + + case SNMP_OP_GETNEXT: + for (i = 0; i < tcp46_state_g.tcp4_total; i++) + if (index_compare(&value->var, sub, &tcp46_state_g.tcp4oids[i].index) < 0) + break; + if (i == tcp46_state_g.tcp4_total) + return (SNMP_ERR_NOSUCHNAME); + index_append(&value->var, sub, &tcp46_state_g.tcp4oids[i].index); + break; + + case SNMP_OP_GET: + for (i = 0; i < tcp46_state_g.tcp4_total; i++) + if (index_compare(&value->var, sub, &tcp46_state_g.tcp4oids[i].index) == 0) + break; + if (i == tcp46_state_g.tcp4_total) + return (SNMP_ERR_NOSUCHNAME); + break; + + case SNMP_OP_SET: + return (SNMP_ERR_NOT_WRITEABLE); + + case SNMP_OP_ROLLBACK: + case SNMP_OP_COMMIT: + default: + abort(); + } + + switch (value->var.subs[sub - 1]) { + + case LEAF_tcpConnState: + switch (tcp46_state_g.tcp4oids[i].tp->xt_tp.t_state) { + + case TCPS_CLOSED: + value->v.integer = TCPS_closed; + break; + case TCPS_LISTEN: + value->v.integer = TCPS_listen; + break; + case TCPS_SYN_SENT: + value->v.integer = TCPS_synSent; + break; + case TCPS_SYN_RECEIVED: + value->v.integer = TCPS_synReceived; + break; + case TCPS_ESTABLISHED: + value->v.integer = TCPS_established; + break; + case TCPS_CLOSE_WAIT: + value->v.integer = TCPS_closeWait; + break; + case TCPS_FIN_WAIT_1: + value->v.integer = TCPS_finWait1; + break; + case TCPS_CLOSING: + value->v.integer = TCPS_closing; + break; + case TCPS_LAST_ACK: + value->v.integer = TCPS_lastAck; + break; + case TCPS_FIN_WAIT_2: + value->v.integer = TCPS_finWait2; + break; + case TCPS_TIME_WAIT: + value->v.integer = TCPS_timeWait; + break; + default: + value->v.integer = 0; + break; + } + break; + + assert(tcp46_state_g.tcp4oids[i].index.len == 10); + + case LEAF_tcpConnLocalAddress: + value->v.ipaddress[0] = tcp46_state_g.tcp4oids[i].index.subs[0]; + value->v.ipaddress[1] = tcp46_state_g.tcp4oids[i].index.subs[1]; + value->v.ipaddress[2] = tcp46_state_g.tcp4oids[i].index.subs[2]; + value->v.ipaddress[3] = tcp46_state_g.tcp4oids[i].index.subs[3]; + break; + + case LEAF_tcpConnLocalPort: + value->v.integer = tcp46_state_g.tcp4oids[i].index.subs[4]; + break; + + case LEAF_tcpConnRemAddress: + value->v.ipaddress[0] = tcp46_state_g.tcp4oids[i].index.subs[5]; + value->v.ipaddress[1] = tcp46_state_g.tcp4oids[i].index.subs[6]; + value->v.ipaddress[2] = tcp46_state_g.tcp4oids[i].index.subs[7]; + value->v.ipaddress[3] = tcp46_state_g.tcp4oids[i].index.subs[8]; + break; + + case LEAF_tcpConnRemPort: + value->v.integer = tcp46_state_g.tcp4oids[i].index.subs[9]; + break; + } + return (SNMP_ERR_NOERROR); } int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508241038.j7OAcbe8029066>