PERFORCE change 82755 for review

Victor Cruceru soc-victor at FreeBSD.org
Mon Aug 29 10:15:42 GMT 2005


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

Change 82755 by soc-victor at soc-victor_82.76.158.176 on 2005/08/29 10:14:42

	Handling for the corner situation of "duplicate UDP endpoints":
	distinct UDP endpoints with the same (local_address, local_port).
	This is for the deprecated udpTable which can't handle this case.

Affected files ...

.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/Makefile#5 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#3 edit

Differences ...

==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/Makefile#5 (text+ko) ====

@@ -37,7 +37,7 @@
 WARNS?=	6
 
 #Not having NDEBUG defined will enable assertions and a lot of output on stderr
-#CFLAGS+=	-DNDEBUG
+CFLAGS+=	-DNDEBUG
 
 XSYM=	tcpMIB udpMIB
 	

==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#3 (text+ko) ====

@@ -92,6 +92,33 @@
 	return result;
 }
 
+/*
+ * Used to check if the enpoint is already in the oid list
+ * (for the deprecated table - it doesn't have the capability
+ * to handle duplicate endpoints)
+ * Returns 1 if the new endpoint is alreadsy in the table,
+ * 0 if it is not 
+ */
+static
+int check_duplicate_endpoint4(const struct xinpcb *inp) {
+	struct udp_index *_oid = NULL;
+	u_int i = 0;
+	assert(inp != NULL);
+	for (i = 0, _oid = tcp_udp46_state_g.udp4oids; 
+		i < tcp_udp46_state_g.udp4_total; 
+		i++, _oid++) {
+		if ( _oid->inp == NULL) {
+			continue;
+		}
+		if ( inp->xi_inp.inp_laddr.s_addr == _oid->inp->xi_inp.inp_laddr.s_addr 
+			&& inp->xi_inp.inp_lport == _oid->inp->xi_inp.inp_lport) {
+				return (1); /*duplicate endpoint found*/
+		} 
+	}
+	return (0);
+		
+}
+
 int
 fetch_udp(void)
 {
@@ -197,15 +224,20 @@
 			continue;
 		} 
 		if ((inp->xi_inp.inp_vflag & INP_IPV4) == INP_IPV4 && inp->xi_inp.inp_lport != 0) {
-			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);
-			oid++;
+			if (check_duplicate_endpoint4(inp) == 1) {
+				assert(tcp_udp46_state_g.udp4_total > 1);
+				tcp_udp46_state_g.udp4_total--;
+			} else {
+				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);
+				oid++;
+			}
 		}
 	}
 


More information about the p4-projects mailing list