PERFORCE change 82680 for review

Victor Cruceru soc-victor at FreeBSD.org
Sat Aug 27 19:55:32 GMT 2005


http://perforce.freebsd.org/chv.cgi?CH=82680

Change 82680 by soc-victor at soc-victor_82.76.158.176 on 2005/08/27 19:54:28

	
	Added support for TCP-MIB::tcpConnectionProcess and  TCP-MIB::tcpListenerProcess
	(based on "kern.file" sysctl ). Now we are fully compliant with the RFC 4022.

Affected files ...

.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp46/tcp46_snmp.c#8 edit

Differences ...

==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp46/tcp46_snmp.c#8 (text+ko) ====

@@ -107,6 +107,7 @@
 #include <assert.h>
 #include <sys/types.h>
 #include <sys/sysctl.h>
+#include <sys/file.h>
 
 /*forward declaration*/
 static int
@@ -206,6 +207,10 @@
 
 	struct tcp_index *listen_tcpoids;	/*snmp vector for the unified v4 and v6 listners tcp table; malloc'd*/
 	size_t		listen_tcpoids_len;	/*the allocated len of the above vector */
+	
+	struct xfile 	*xfiles;
+	size_t 		xfiles_len;
+	u_int		xfiles_total;
 
 				
 };
@@ -272,6 +277,11 @@
 		tcp46_state_g.xinpgen_len = 0;
 	}
 
+	if (tcp46_state_g.xfiles != NULL && tcp46_state_g.xfiles_len > 0 ) {
+		free(tcp46_state_g.xfiles);
+		tcp46_state_g.xfiles = NULL;
+		tcp46_state_g.xfiles_len = 0;
+	}
 		
 	if (tcp46_registration_id > 0) {
 		or_unregister(tcp46_registration_id);
@@ -355,6 +365,26 @@
 	tcp46_loading_v
 };
 
+
+static
+pid_t 
+get_socket_pid(struct xtcpcb *tp) {
+	struct xfile *xf = NULL;
+	u_int n = 0;
+	assert(tp != NULL);
+	
+	for (xf =  tcp46_state_g.xfiles, n = 0; n < tcp46_state_g.xfiles_total; ++n, ++xf) {
+		if (xf->xf_data == NULL) {
+			continue;
+		}	
+		if (xf->xf_data == (void *)tp->xt_socket.xso_so) {
+			return (xf->xf_pid);
+		}	
+	}
+	return ((pid_t)0);		
+}
+
+
 /*
  * Add an entry into the list associated with the old/ deprecated
  * tcpConnTable
@@ -409,8 +439,8 @@
 	all_oid->index.subs[10] = (inaddr >>  0) & 0xff;
 	all_oid->index.subs[11] = ntohs(tp->xt_inp.inp_fport);
 	
-	/*FIX ME: this doesn't work*/
-	all_oid->so_pgid = tp->xt_socket.so_pgid;
+
+	all_oid->so_pgid = get_socket_pid(tp);
 
 }
 
@@ -434,8 +464,8 @@
 	all_oid->index.subs[18] = IAT_ipv6;
 	all_oid->index.subs[35] = ntohs(tp->xt_inp.in6p_fport);
 	
-	/*FIX ME: this doesn't work*/
-	all_oid->so_pgid = tp->xt_socket.so_pgid;
+
+	all_oid->so_pgid = get_socket_pid(tp);
 
 }
 
@@ -471,7 +501,8 @@
 		i++, _oid++ )
 	{
 		if ( _oid->index.subs[0] == IAT_ipv6 ) {
-			if ( _oid->index.subs[17] == ntohs(tp->xt_inp.inp_lport) ){
+			if ( _oid->index.subs[17] == ntohs(tp->xt_inp.inp_lport) && 
+				listener_oid->so_pgid == _oid->so_pgid) {
 				TCP46_DPRINTF((stderr, "V4: [%s] Got listener with port %d.\n ", 
 					__func__,
 					_oid->index.subs[5])); 		
@@ -522,7 +553,8 @@
 		i++, _oid++ )
 	{
 		if ( _oid->index.subs[0] == IAT_ipv4 ) {
-			if ( _oid->index.subs[5] == ntohs(tp->xt_inp.in6p_lport) ) {
+			if ( _oid->index.subs[5] == ntohs(tp->xt_inp.in6p_lport) && 
+			     listener_oid->so_pgid == _oid->so_pgid ) {
 				TCP46_DPRINTF((stderr, "[%s] Got listener with port %d.\n ", 
 					__func__,
 					_oid->index.subs[5])); 		
@@ -560,6 +592,9 @@
 	in_addr_t inaddr;
 	assert(listener_oid != NULL);
 	assert(tp != NULL);
+	
+	listener_oid->so_pgid = get_socket_pid(tp);
+	
 	if ( check_duplicate6_listner( listener_oid, tp ) == 1 ) {
 		return 1;
 	}
@@ -572,8 +607,8 @@
 	listener_oid->index.subs[3] = (inaddr >>  8) & 0xff;
 	listener_oid->index.subs[4] = (inaddr >>  0) & 0xff;
 	listener_oid->index.subs[5] = ntohs(tp->xt_inp.inp_lport);
-	/*FIX ME: this doesn't work*/
-	listener_oid->so_pgid = tp->xt_socket.so_pgid;
+	
+	
 	return 0;
 
 }
@@ -595,6 +630,9 @@
 	int i = 0;
 	assert(listener_oid != NULL);
 	assert(tp != NULL);
+	
+	listener_oid->so_pgid = get_socket_pid(tp);
+	
 	if ( check_duplicate4_listner( listener_oid, tp ) == 1 ) {
 		return 1;
 	}
@@ -607,13 +645,45 @@
 	}
 	listener_oid->index.subs[17] = ntohs(tp->xt_inp.in6p_lport);
 	
-	/*FIX ME: this doesn't work*/
-	listener_oid->so_pgid = tp->xt_socket.so_pgid;
+	
+	
 	return 0;
 
 }
 
 static int
+fetch_xfiles(void) {
+	size_t xfilesize = 0;
+	struct xfile *ptr = NULL;
+	
+	tcp46_state_g.xfiles_total = 0;
+	
+	/* Get the xfiles */
+	if (sysctlbyname("kern.file", NULL, &xfilesize, NULL, 0)) {
+		syslog(LOG_ERR, "sysctlbyname(kern.file) failed: %m");
+		return (-1);
+	}	
+	if (xfilesize > tcp46_state_g.xfiles_len) {
+		if ((ptr = realloc(tcp46_state_g.xfiles, xfilesize)) == NULL) {
+			syslog(LOG_ERR, "%zu: %m", xfilesize);
+			return (-1);
+		}
+		tcp46_state_g.xfiles = ptr;
+		tcp46_state_g.xfiles_len = xfilesize;
+	}
+
+
+	if (sysctlbyname("kern.file", tcp46_state_g.xfiles, &xfilesize, NULL, 0) < 0) {
+		syslog(LOG_ERR, "sysctlbyname(kern.file) failed: %m");
+		return (-1);
+	}
+	tcp46_state_g.xfiles_total = xfilesize / sizeof(struct xfile);
+	return 0;
+}
+
+
+
+static int
 fetch_tcp(void)
 {
 	size_t len;
@@ -657,6 +727,10 @@
 	tcp46_state_g.all_tcp_total = 0;
 	tcp46_state_g.listen_tcp_total = 0;
 	
+	if (fetch_xfiles() != 0) {
+		TCP46_DPRINTF((stderr, "[%s] Failed to fetch the xfiles\n ", __func__ ));
+	}
+	
 	/*First count the endpoints*/
 	for (ptr = (struct xinpgen *)(void *)((char *)tcp46_state_g.xinpgen + tcp46_state_g.xinpgen->xig_len);
 	     ptr->xig_len > sizeof(struct xinpgen);


More information about the p4-projects mailing list