PERFORCE change 82803 for review
Victor Cruceru
soc-victor at FreeBSD.org
Mon Aug 29 20:48:13 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=82803
Change 82803 by soc-victor at soc-victor_82.76.158.176 on 2005/08/29 20:47:37
Finished the UDP-MIB (RFC 4113).
Affected files ...
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/Makefile#7 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#5 edit
Differences ...
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/Makefile#7 (text+ko) ====
@@ -43,6 +43,7 @@
DEFS= ${MOD}_tree.def
+#INET-ADDRESS-MIB.txt does not belong here
BMIBS= TCP-MIB.txt \
UDP-MIB.txt \
INET-ADDRESS-MIB.txt
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#5 (text+ko) ====
@@ -99,7 +99,8 @@
u_int n = 0;
assert(inp != NULL);
- for (xf = tcp_udp46_state_g.xfiles, n = 0; n < tcp_udp46_state_g.xfiles_total; ++n, ++xf) {
+ for (xf = tcp_udp46_state_g.xfiles, n = 0;
+ n < tcp_udp46_state_g.xfiles_total; ++n, ++xf) {
if (xf->xf_data == NULL) {
continue;
}
@@ -150,6 +151,8 @@
pid_t pid_owner = 0;
in_addr_t inaddr;
u_int instance = 1;
+ static
+ uint32_t zero_ip6[] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
assert(inp != NULL);
@@ -173,8 +176,40 @@
return (1); /*duplicate endpoint found*/
}
}
+ /*check for an existent IPv6 endpoint bound to 0::0/128 */
+ if ( inp->xi_inp.inp_laddr.s_addr == INADDR_ANY
+ && inp->xi_inp.inp_faddr.s_addr == INADDR_ANY ) {
+ if( _oid->index.subs[0] == IAT_ipv6 &&
+ _oid->inp->xi_inp.in6p_lport == inp->xi_inp.inp_lport &&
+ pid_owner == _oid->so_pgid) {
+ if (memcmp(&zero_ip6[0],
+ &_oid->index.subs[1],
+ sizeof(zero_ip6)) == 0
+ && memcmp(&zero_ip6[0],
+ &_oid->index.subs[19],
+ sizeof(zero_ip6) ) == 0 ) {
+ /*got it*/
+ instance =
+ (IN6_IS_ADDR_UNSPECIFIED(&_oid->inp->xi_inp.in6p_faddr) ?
+ _oid->index.subs[21] : _oid->index.subs[36] );
+
+ _oid->index.len = 7;
+ _oid->index.subs[0] = IAT_unknown;
+ _oid->index.subs[1] = 0; /*zero/ empty octet sting*/
+ _oid->index.subs[2] = ntohs(inp->xi_inp.inp_lport);
+ _oid->index.subs[3] = IAT_unknown;
+ _oid->index.subs[4] = 0; /*zero/ empty octet sting*/
+ _oid->index.subs[5] = ntohs(_oid->inp->xi_inp.in6p_fport);
+ /*copy instance number*/
+ _oid->index.subs[6] = instance;
+ return 1;
+ }
+ }
+
+ }/*end check for the same application bound to zero v4 & v6 address*/
+
}
- all_oid->index.len = 13;
+
all_oid->index.subs[0] = IAT_ipv4;
inaddr = ntohl(inp->xi_inp.inp_laddr.s_addr);
all_oid->index.subs[1] = (inaddr >> 24) & 0xff;
@@ -182,14 +217,26 @@
all_oid->index.subs[3] = (inaddr >> 8) & 0xff;
all_oid->index.subs[4] = (inaddr >> 0) & 0xff;
all_oid->index.subs[5] = ntohs(inp->xi_inp.inp_lport);
- all_oid->index.subs[6] = IAT_ipv4;
- inaddr = ntohl(inp->xi_inp.inp_faddr.s_addr);
- all_oid->index.subs[7] = (inaddr >> 24) & 0xff;
- all_oid->index.subs[8] = (inaddr >> 16) & 0xff;
- all_oid->index.subs[9] = (inaddr >> 8) & 0xff;
- all_oid->index.subs[10] = (inaddr >> 0) & 0xff;
- all_oid->index.subs[11] = ntohs(inp->xi_inp.inp_fport);
- all_oid->index.subs[12] = instance;
+
+ if(inp->xi_inp.inp_faddr.s_addr == INADDR_ANY &&
+ inp->xi_inp.inp_fport == 0 ){
+ all_oid->index.len = 10;
+ all_oid->index.subs[6] = IAT_unknown;
+ all_oid->index.subs[7] = 0; /*zero/ empty octet sting*/
+ all_oid->index.subs[8] = 0;
+ all_oid->index.subs[9] = instance;
+
+ } else {
+ all_oid->index.len = 13;
+ all_oid->index.subs[6] = IAT_ipv4;
+ inaddr = ntohl(inp->xi_inp.inp_faddr.s_addr);
+ all_oid->index.subs[7] = (inaddr >> 24) & 0xff;
+ all_oid->index.subs[8] = (inaddr >> 16) & 0xff;
+ all_oid->index.subs[9] = (inaddr >> 8) & 0xff;
+ all_oid->index.subs[10] = (inaddr >> 0) & 0xff;
+ all_oid->index.subs[11] = ntohs(inp->xi_inp.inp_fport);
+ all_oid->index.subs[12] = instance;
+ }
all_oid->so_pgid = pid_owner;
@@ -230,19 +277,64 @@
return (1); /*duplicate endpoint found*/
}
}
+ /*check for an existent IPv4 endpoint bound to 0.0.0.0 */
+ if ( IN6_IS_ADDR_UNSPECIFIED(&inp->xi_inp.in6p_laddr)
+ && IN6_IS_ADDR_UNSPECIFIED(&inp->xi_inp.in6p_faddr)) {
+ if( _oid->index.subs[0] == IAT_ipv4 &&
+ _oid->inp->xi_inp.inp_lport == inp->xi_inp.in6p_lport &&
+ pid_owner == _oid->so_pgid) {
+ if ( inp->xi_inp.inp_faddr.s_addr == INADDR_ANY &&
+ inp->xi_inp.inp_laddr.s_addr == INADDR_ANY) {
+ /*got it*/
+ instance =
+ (_oid->inp->xi_inp.inp_faddr.s_addr == INADDR_ANY ?
+ _oid->index.subs[9] : _oid->index.subs[12] );
+
+ _oid->index.len = 7;
+ _oid->index.subs[0] = IAT_unknown;
+ _oid->index.subs[1] = 0; /*zero/ empty octet sting*/
+ _oid->index.subs[2] = ntohs(inp->xi_inp.inp_lport);
+ _oid->index.subs[3] = IAT_unknown;
+ _oid->index.subs[4] = 0; /*zero/ empty octet sting*/
+ _oid->index.subs[5] = ntohs(_oid->inp->xi_inp.in6p_fport);
+ /*copy instance number*/
+ _oid->index.subs[6] = instance;
+ return 1;
+ }
+ }
+
+ }/*end check for the same application bound to zero v4 & v6 address*/
+
+
}
- all_oid->index.len = 37;
+
+ if ( IN6_IS_ADDR_UNSPECIFIED(&inp->xi_inp.in6p_faddr) &&
+ inp->xi_inp.in6p_fport == 0 ) {
+ all_oid->index.len = 22;
+
+ all_oid->index.subs[0] = IAT_ipv6;
+ for (i=0; i<16; i++) {
+ all_oid->index.subs[1+i] = inp->xi_inp.in6p_laddr.s6_addr[i];
+ }
+ all_oid->index.subs[17] = ntohs(inp->xi_inp.in6p_lport);
+ all_oid->index.subs[18] = IAT_unknown;
+ all_oid->index.subs[19] = 0;
+ all_oid->index.subs[20] = 0;
+ all_oid->index.subs[21] = instance;
+
+ } else {
+ all_oid->index.len = 37;
- all_oid->index.subs[0] = IAT_ipv6;
- for (i=0; i<16; i++) {
- all_oid->index.subs[1+i] = inp->xi_inp.in6p_laddr.s6_addr[i];
- all_oid->index.subs[19+i] = inp->xi_inp.in6p_faddr.s6_addr[i];
- }
- all_oid->index.subs[17] = ntohs(inp->xi_inp.in6p_lport);
- all_oid->index.subs[18] = IAT_ipv6;
- all_oid->index.subs[35] = ntohs(inp->xi_inp.in6p_fport);
- all_oid->index.subs[36] = instance;
-
+ all_oid->index.subs[0] = IAT_ipv6;
+ for (i=0; i<16; i++) {
+ all_oid->index.subs[1+i] = inp->xi_inp.in6p_laddr.s6_addr[i];
+ all_oid->index.subs[19+i] = inp->xi_inp.in6p_faddr.s6_addr[i];
+ }
+ all_oid->index.subs[17] = ntohs(inp->xi_inp.in6p_lport);
+ all_oid->index.subs[18] = IAT_ipv6;
+ all_oid->index.subs[35] = ntohs(inp->xi_inp.in6p_fport);
+ all_oid->index.subs[36] = instance;
+ }
all_oid->so_pgid = pid_owner;
More information about the p4-projects
mailing list