PERFORCE change 83275 for review
Victor Cruceru
soc-victor at FreeBSD.org
Thu Sep 8 11:38:34 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=83275
Change 83275 by soc-victor at soc-victor_82.76.158.176 on 2005/09/08 18:38:30
Fixed an ugly bug in OID index encoding (for INET-ADDRESS-MIB TCs)
for both TCP and UDP MIBs.
Affected files ...
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/tcp46_snmp.c#8 edit
.. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#8 edit
Differences ...
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/tcp46_snmp.c#8 (text+ko) ====
@@ -197,21 +197,23 @@
assert(tp != NULL);
/*next is the encoding for the SNMP table index*/
- all_oid->index.len = 12;
+ all_oid->index.len = 14;
all_oid->index.subs[0] = (uint32_t)IAT_ipv4;
+ all_oid->index.subs[1] = 4;
inaddr = ntohl(tp->xt_inp.inp_laddr.s_addr);
- all_oid->index.subs[1] = (inaddr >> 24) & 0xff;
- all_oid->index.subs[2] = (inaddr >> 16) & 0xff;
- all_oid->index.subs[3] = (inaddr >> 8) & 0xff;
- all_oid->index.subs[4] = (inaddr >> 0) & 0xff;
- all_oid->index.subs[5] = ntohs(tp->xt_inp.inp_lport);
- all_oid->index.subs[6] = (uint32_t)IAT_ipv4;
+ all_oid->index.subs[2] = (inaddr >> 24) & 0xff;
+ all_oid->index.subs[3] = (inaddr >> 16) & 0xff;
+ all_oid->index.subs[4] = (inaddr >> 8) & 0xff;
+ all_oid->index.subs[5] = (inaddr >> 0) & 0xff;
+ all_oid->index.subs[6] = ntohs(tp->xt_inp.inp_lport);
+ all_oid->index.subs[7] = (uint32_t)IAT_ipv4;
+ all_oid->index.subs[8] = 4;
inaddr = ntohl(tp->xt_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(tp->xt_inp.inp_fport);
+ all_oid->index.subs[9] = (inaddr >> 24) & 0xff;
+ all_oid->index.subs[10] = (inaddr >> 16) & 0xff;
+ all_oid->index.subs[11] = (inaddr >> 8) & 0xff;
+ all_oid->index.subs[12] = (inaddr >> 0) & 0xff;
+ all_oid->index.subs[13] = ntohs(tp->xt_inp.inp_fport);
all_oid->so_pgid = get_socket_pid(tp);
@@ -228,15 +230,17 @@
assert(all_oid != NULL);
assert(tp != NULL);
/*next is the encoding for the SNMP table index*/
- all_oid->index.len = 36;
+ all_oid->index.len = 38;
all_oid->index.subs[0] = (uint32_t)IAT_ipv6;
+ all_oid->index.subs[1] = 16;
for (i=0; i<16; i++) {
- all_oid->index.subs[1+i] = tp->xt_inp.in6p_laddr.s6_addr[i];
- all_oid->index.subs[19+i] = tp->xt_inp.in6p_faddr.s6_addr[i];
+ all_oid->index.subs[2+i] = tp->xt_inp.in6p_laddr.s6_addr[i];
+ all_oid->index.subs[21+i] = tp->xt_inp.in6p_faddr.s6_addr[i];
}
- all_oid->index.subs[17] = ntohs(tp->xt_inp.in6p_lport);
- all_oid->index.subs[18] = (uint32_t)IAT_ipv6;
- all_oid->index.subs[35] = ntohs(tp->xt_inp.in6p_fport);
+ all_oid->index.subs[18] = ntohs(tp->xt_inp.in6p_lport);
+ all_oid->index.subs[19] = (uint32_t)IAT_ipv6;
+ all_oid->index.subs[20] = 16;
+ all_oid->index.subs[37] = ntohs(tp->xt_inp.in6p_fport);
all_oid->so_pgid = get_socket_pid(tp);
@@ -275,14 +279,14 @@
i++, _oid++ )
{
if ( _oid->index.subs[0] == (uint32_t)IAT_ipv6 ) {
- if ( _oid->index.subs[17] == ntohs(tp->xt_inp.inp_lport) &&
+ if ( _oid->index.subs[18] == ntohs(tp->xt_inp.inp_lport) &&
listener_oid->so_pgid == _oid->so_pgid) {
L4_DPRINTF((stderr, "V4: [%s] Got listener with port %d.\n ",
__func__,
- _oid->index.subs[5]));
+ _oid->index.subs[18]));
if (memcmp(&zero_ip6[0],
- &_oid->index.subs[1],
+ &_oid->index.subs[2],
sizeof(zero_ip6)) == 0) {
/*got it*/
_oid->index.len = 3;
@@ -326,25 +330,25 @@
_oid != listener_oid && i < tcp_udp46_state_g.listen_tcpoids_len;
i++, _oid++ )
{
- if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4 ) {
- if ( _oid->index.subs[5] == ntohs(tp->xt_inp.in6p_lport) &&
- listener_oid->so_pgid == _oid->so_pgid ) {
- L4_DPRINTF((stderr, "[%s] Got listener with port %d.\n ",
- __func__,
- _oid->index.subs[5]));
-
- if (memcmp(&zero_ip4[0],
- &_oid->index.subs[1],
- sizeof(zero_ip4)) == 0) {
- /*got it*/
- _oid->index.len = 3;
- _oid->index.subs[0] = (uint32_t)IAT_unknown;
- _oid->index.subs[1] = 0; /*zero/ empty octet sting*/
- _oid->index.subs[2] = ntohs(tp->xt_inp.in6p_lport);
- return 1;
- }
- }
- }
+ if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4 ) {
+ if ( _oid->index.subs[6] == ntohs(tp->xt_inp.in6p_lport) &&
+ listener_oid->so_pgid == _oid->so_pgid ) {
+ L4_DPRINTF((stderr, "[%s] Got listener with port %d.\n ",
+ __func__,
+ _oid->index.subs[6]));
+
+ if (memcmp(&zero_ip4[0],
+ &_oid->index.subs[2],
+ sizeof(zero_ip4)) == 0) {
+ /*got it*/
+ _oid->index.len = 3;
+ _oid->index.subs[0] = (uint32_t)IAT_unknown;
+ _oid->index.subs[1] = 0; /*zero/ empty octet sting*/
+ _oid->index.subs[2] = ntohs(tp->xt_inp.in6p_lport);
+ return 1;
+ }
+ }
+ }
}
return 0;
}
@@ -373,14 +377,16 @@
return 1;
}
/*next is the encoding for the SNMP table index*/
- listener_oid->index.len = 6;
+ listener_oid->index.len = 7;
listener_oid->index.subs[0] = (uint32_t)IAT_ipv4;
+ listener_oid->index.subs[1] = 4;
+
inaddr = ntohl(tp->xt_inp.inp_laddr.s_addr);
- listener_oid->index.subs[1] = (inaddr >> 24) & 0xff;
- listener_oid->index.subs[2] = (inaddr >> 16) & 0xff;
- 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);
+ listener_oid->index.subs[2] = (inaddr >> 24) & 0xff;
+ listener_oid->index.subs[3] = (inaddr >> 16) & 0xff;
+ listener_oid->index.subs[4] = (inaddr >> 8) & 0xff;
+ listener_oid->index.subs[5] = (inaddr >> 0) & 0xff;
+ listener_oid->index.subs[6] = ntohs(tp->xt_inp.inp_lport);
return 0;
@@ -412,12 +418,14 @@
}
/*next is the encoding for the SNMP table index*/
- listener_oid->index.len = 18;
+ listener_oid->index.len = 19;
listener_oid->index.subs[0] = (uint32_t)IAT_ipv6;
+ listener_oid->index.subs[1] = 16;
+
for (i=0; i<16; i++) {
- listener_oid->index.subs[1+i] = tp->xt_inp.in6p_laddr.s6_addr[i];
+ listener_oid->index.subs[2+i] = tp->xt_inp.in6p_laddr.s6_addr[i];
}
- listener_oid->index.subs[17] = ntohs(tp->xt_inp.in6p_lport);
+ listener_oid->index.subs[18] = ntohs(tp->xt_inp.in6p_lport);
@@ -720,15 +728,15 @@
if (conn->subs[0] == (uint32_t)IAT_ipv4) {
struct sockaddr_in *sinl, *sinr;
- assert(conn->len == 12);
- if (conn->len != 12) {
+ assert(conn->len == 14);
+ if (conn->len != 14) {
syslog(LOG_ERR,
"%s: malformed SNMP index (wrong length) when deleting a connection",
__func__);
return -1;
}
- if (conn->subs[6] != (uint32_t)IAT_ipv4 ) {
+ if (conn->subs[7] != (uint32_t)IAT_ipv4 ) {
syslog(LOG_ERR,
"%s: malformed SNMP index (remote not a v4) when deleting a connection",
__func__);
@@ -741,12 +749,12 @@
sinl = (struct sockaddr_in *)&addrs[1];
sinl->sin_len = sizeof(struct sockaddr_in);
sinl->sin_addr.s_addr = htonl(
- (conn->subs[1] << 24) |
- (conn->subs[2] << 16) |
- (conn->subs[3] << 8) |
- (conn->subs[4] << 0)
+ (conn->subs[2] << 24) |
+ (conn->subs[3] << 16) |
+ (conn->subs[4] << 8) |
+ (conn->subs[5] << 0)
);
- sinl->sin_port = htons(conn->subs[5]);
+ sinl->sin_port = htons(conn->subs[6]);
addrs[1].ss_family = AF_INET;
(void)inet_ntop(AF_INET, &sinl->sin_addr, local, 64);
@@ -758,36 +766,36 @@
sinr->sin_len = sizeof(struct sockaddr_in);
sinr->sin_addr.s_addr = htonl(
- (conn->subs[7] << 24) |
- (conn->subs[8] << 16) |
- (conn->subs[9] << 8) |
- (conn->subs[10] << 0)
+ (conn->subs[9] << 24) |
+ (conn->subs[10] << 16) |
+ (conn->subs[11] << 8) |
+ (conn->subs[12] << 0)
);
- sinr->sin_port = htons(conn->subs[11]);
+ sinr->sin_port = htons(conn->subs[13]);
addrs[0].ss_family = AF_INET;
(void)inet_ntop(AF_INET, &sinr->sin_addr, remote, 64);
syslog(LOG_INFO,
- "[%s] attempt to delete a tcp4 connection : local: %s:%d - remote: %s:%d \n ",
- __func__,
- local,
- conn->subs[5],
- remote,
- conn->subs[11]);
+ "[%s] attempt to delete a tcp4 connection : local: %s:%d - remote: %s:%d \n ",
+ __func__,
+ local,
+ conn->subs[6],
+ remote,
+ conn->subs[13]);
} else if (conn->subs[0] == (uint32_t)IAT_ipv6) {
struct sockaddr_in6 *sin6l, *sin6r;
int i = 0;
- assert(conn->len == 36);
- if (conn->len != 36) {
+ assert(conn->len == 38);
+ if (conn->len != 38) {
syslog(LOG_ERR,
"%s: malformed SNMP index (wrong length) when deleting a connection",
__func__);
return -1;
}
- if (conn->subs[18] != (uint32_t)IAT_ipv6 ) {
+ if (conn->subs[19] != (uint32_t)IAT_ipv6 ) {
syslog(LOG_ERR,
"%s: malformed SNMP index (remote not a v6) when deleting a connection",
__func__);
@@ -799,10 +807,10 @@
sin6l = (struct sockaddr_in6 *)&addrs[1];
for (i=0; i<16; i++) {
- sin6l->sin6_addr.s6_addr[i] = conn->subs[1+i];
+ sin6l->sin6_addr.s6_addr[i] = conn->subs[2+i];
}
- sin6l->sin6_port = htons(conn->subs[17]);
+ sin6l->sin6_port = htons(conn->subs[18]);
#ifdef SIN6_LEN
sin6l->sin6_len = sizeof(struct sockaddr_in6);
#endif /* SIN6_LEN */
@@ -813,10 +821,10 @@
sin6r = (struct sockaddr_in6 *)&addrs[0];
for (i=0; i<16; i++) {
- sin6r->sin6_addr.s6_addr[i] = conn->subs[19+i];
+ sin6r->sin6_addr.s6_addr[i] = conn->subs[21+i];
}
- sin6r->sin6_port = htons(conn->subs[35]);
+ sin6r->sin6_port = htons(conn->subs[37]);
#ifdef SIN6_LEN
sin6r->sin6_len = sizeof(struct sockaddr_in6);
#endif /* SIN6_LEN */
@@ -828,9 +836,9 @@
"[%s] attempt to delete a tcp6 connection: local: %s:%d - remote: %s:%d \n ",
__func__,
local,
- conn->subs[17],
+ conn->subs[18],
remote,
- conn->subs[35]);
+ conn->subs[37]);
} else {
==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#8 (text+ko) ====
@@ -150,28 +150,34 @@
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 };
+ uint32_t
+ zero_ip6[] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
assert(inp != NULL);
pid_owner = get_endpoint_pid(inp);
for (i = 0, _oid = tcp_udp46_state_g.all_udpoids;
- i < tcp_udp46_state_g.all_udp_total;
- i++, _oid++) {
- if ( _oid->inp == NULL) {
- continue;
- }
- if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4
- && 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
- && inp->xi_inp.inp_faddr.s_addr == _oid->inp->xi_inp.inp_faddr.s_addr
- && inp->xi_inp.inp_fport == _oid->inp->xi_inp.inp_fport) {
+ i < tcp_udp46_state_g.all_udp_total;
+ i++, _oid++) {
+ if ( _oid->inp == NULL) {
+ continue;
+ }
+ if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4
+ &&
+ 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
+ &&
+ inp->xi_inp.inp_faddr.s_addr == _oid->inp->xi_inp.inp_faddr.s_addr
+ &&
+ inp->xi_inp.inp_fport == _oid->inp->xi_inp.inp_fport) {
if ( pid_owner != _oid->so_pgid ) {
instance++;
} else {
- return (1); /*duplicate endpoint found*/
+ /*duplicate endpoint found*/
+ return (1);
}
}
/*check for an existent IPv6 endpoint bound to 0::0/128 */
@@ -181,15 +187,15 @@
_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],
+ &_oid->inp->xi_inp.in6p_laddr,
sizeof(zero_ip6)) == 0
&& memcmp(&zero_ip6[0],
- &_oid->index.subs[19],
+ &_oid->inp->xi_inp.in6p_faddr,
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.subs[22] : _oid->index.subs[38] );
_oid->index.len = 7;
_oid->index.subs[0] = (uint32_t)IAT_unknown;
@@ -204,36 +210,40 @@
}
}
- }/*end check for the same application bound to zero v4 & v6 address*/
+ }
+ /*end check for the same application bound to zero
+ v4 & v6 address*/
}
all_oid->index.subs[0] = (uint32_t)IAT_ipv4;
+ all_oid->index.subs[1] = 4;
inaddr = ntohl(inp->xi_inp.inp_laddr.s_addr);
- all_oid->index.subs[1] = (inaddr >> 24) & 0xff;
- all_oid->index.subs[2] = (inaddr >> 16) & 0xff;
- 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[2] = (inaddr >> 24) & 0xff;
+ all_oid->index.subs[3] = (inaddr >> 16) & 0xff;
+ all_oid->index.subs[4] = (inaddr >> 8) & 0xff;
+ all_oid->index.subs[5] = (inaddr >> 0) & 0xff;
+ all_oid->index.subs[6] = ntohs(inp->xi_inp.inp_lport);
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] = (uint32_t)IAT_unknown;
- all_oid->index.subs[7] = 0; /*zero/ empty octet sting*/
- all_oid->index.subs[8] = 0;
- all_oid->index.subs[9] = instance;
+ all_oid->index.len = 11;
+ all_oid->index.subs[7] = (uint32_t)IAT_unknown;
+ all_oid->index.subs[8] = 0; /*zero/ empty octet sting*/
+ all_oid->index.subs[9] = 0; /*remote port*/
+ all_oid->index.subs[10] = instance;
} else {
- all_oid->index.len = 13;
- all_oid->index.subs[6] = (uint32_t)IAT_ipv4;
+ all_oid->index.len = 15;
+ all_oid->index.subs[7] = (uint32_t)IAT_ipv4;
+ all_oid->index.subs[8] = 4;
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->index.subs[9] = (inaddr >> 24) & 0xff;
+ all_oid->index.subs[10] = (inaddr >> 16) & 0xff;
+ all_oid->index.subs[11] = (inaddr >> 8) & 0xff;
+ all_oid->index.subs[12] = (inaddr >> 0) & 0xff;
+ all_oid->index.subs[13] = ntohs(inp->xi_inp.inp_fport);
+ all_oid->index.subs[14] = instance;
}
all_oid->so_pgid = pid_owner;
@@ -286,7 +296,7 @@
/*got it*/
instance =
(_oid->inp->xi_inp.inp_faddr.s_addr == INADDR_ANY ?
- _oid->index.subs[9] : _oid->index.subs[12] );
+ _oid->index.subs[10] : _oid->index.subs[14] );
_oid->index.len = 7;
_oid->index.subs[0] = (uint32_t)IAT_unknown;
@@ -308,30 +318,33 @@
if ( IN6_IS_ADDR_UNSPECIFIED(&inp->xi_inp.in6p_faddr) &&
inp->xi_inp.in6p_fport == 0 ) {
- all_oid->index.len = 22;
+ all_oid->index.len = 23;
all_oid->index.subs[0] = (uint32_t)IAT_ipv6;
+ all_oid->index.subs[1] = 16;
for (i=0; i<16; i++) {
- all_oid->index.subs[1+i] = inp->xi_inp.in6p_laddr.s6_addr[i];
+ all_oid->index.subs[2+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] = (uint32_t)IAT_unknown;
- all_oid->index.subs[19] = 0;
- all_oid->index.subs[20] = 0;
- all_oid->index.subs[21] = instance;
+ all_oid->index.subs[18] = ntohs(inp->xi_inp.in6p_lport);
+ all_oid->index.subs[19] = (uint32_t)IAT_unknown;
+ all_oid->index.subs[20] = 0; /*remote addess, zero octet string*/
+ all_oid->index.subs[21] = 0; /*remote port*/
+ all_oid->index.subs[22] = instance;
} else {
- all_oid->index.len = 37;
+ all_oid->index.len = 39;
all_oid->index.subs[0] = (uint32_t)IAT_ipv6;
+ all_oid->index.subs[0] = 16;
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[2+i] = inp->xi_inp.in6p_laddr.s6_addr[i];
+ all_oid->index.subs[21+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] = (uint32_t)IAT_ipv6;
- all_oid->index.subs[35] = ntohs(inp->xi_inp.in6p_fport);
- all_oid->index.subs[36] = instance;
+ all_oid->index.subs[18] = ntohs(inp->xi_inp.in6p_lport);
+ all_oid->index.subs[19] = (uint32_t)IAT_ipv6;
+ all_oid->index.subs[20] = 16;
+ all_oid->index.subs[37] = ntohs(inp->xi_inp.in6p_fport);
+ all_oid->index.subs[38] = instance;
}
all_oid->so_pgid = pid_owner;
More information about the p4-projects
mailing list