Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Jul 2014 18:31:01 GMT
From:      shonali@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r271653 - soc2014/shonali/head/contrib/bsnmp/snmpd
Message-ID:  <201407311831.s6VIV1OB066373@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: shonali
Date: Thu Jul 31 18:31:01 2014
New Revision: 271653
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271653

Log:
  Added fixes to config.c, export.c and trans_udpv6.c.
  

Modified:
  soc2014/shonali/head/contrib/bsnmp/snmpd/config.c
  soc2014/shonali/head/contrib/bsnmp/snmpd/export.c
  soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c

Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/config.c
==============================================================================
--- soc2014/shonali/head/contrib/bsnmp/snmpd/config.c	Thu Jul 31 17:18:40 2014	(r271652)
+++ soc2014/shonali/head/contrib/bsnmp/snmpd/config.c	Thu Jul 31 18:31:01 2014	(r271653)
@@ -791,63 +791,67 @@
 		report("%s: %s", host, gai_strerror(error));
 	if (res == NULL)
 		report("%s: unknown hostname", host);
+        
+        switch (res->ai_family) {
 
-        if(res->ai_family == AF_INET) {
-                addr_type = AF_INET;
-		struct sockaddr_in *sain ; 
-                sain = (struct sockaddr_in *)(void *)res->ai_addr;
-                sain->sin_addr.s_addr = ntohl(sain->sin_addr.s_addr); 
+        	case AF_INET :   
+                	addr_type = AF_INET;
+			struct sockaddr_in *sain ; 
+                	sain = (struct sockaddr_in *)(void *)res->ai_addr;
+                	sain->sin_addr.s_addr = ntohl(sain->sin_addr.s_addr); 
  
-	        ip[0] = sain->sin_addr.s_addr >> 24;
-                ip[1] = sain->sin_addr.s_addr >> 16;
-         	ip[2] = sain->sin_addr.s_addr >>  8;
-         	ip[3] = sain->sin_addr.s_addr >>  0;
-        }
-        else if(res->ai_family == AF_INET6) {
-
-                addr_type = AF_INET6;
-		struct sockaddr_in6 *sain ; 
-                sain = (struct sockaddr_in6 *)(void *)res->ai_addr;
-                unsigned char tmp[16];
+	        	ip[0] = sain->sin_addr.s_addr >> 24;
+                	ip[1] = sain->sin_addr.s_addr >> 16;
+         		ip[2] = sain->sin_addr.s_addr >>  8;
+         		ip[3] = sain->sin_addr.s_addr >>  0;
+        
+        	case AF_INET6 : 
+                	addr_type = AF_INET6;
+			struct sockaddr_in6 *sain ; 
+                	sain = (struct sockaddr_in6 *)(void *)res->ai_addr;
+                	unsigned char tmp[16];
                 
-                /* ipv6 implementation of network to host byte order function */
-                /* May be unnecessary - check */
-                if (BYTE_ORDER == LITTLE_ENDIAN) {
-                tmp[3] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
-                tmp[2] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
-                tmp[1] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
-                tmp[0] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
-                }
-
-                else {
-                tmp[0] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
-                tmp[1] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
-                tmp[2] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
-                tmp[3] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
-                }
+                	/* ipv6 implementation of network to host byte order function */
+                	/* May be unnecessary - check */
+                	if (BYTE_ORDER == LITTLE_ENDIAN) {
+                		tmp[3] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
+                		tmp[2] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
+                		tmp[1] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
+                		tmp[0] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
+                	}
+
+                	else {
+                		tmp[0] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
+                		tmp[1] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
+                		tmp[2] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
+                		tmp[3] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
+                	}
  
-                strcpy(sain->sin6_addr.s6_addr, (unsigned char *)tmp) ; 
-                inet_ntop(AF_INET6, &(sain->sin6_addr), *ip, INET6_ADDRSTRLEN);
+                	strcpy(sain->sin6_addr.s6_addr, (unsigned char *)tmp) ; 
+                	inet_ntop(AF_INET6, &(sain->sin6_addr), *ip, INET6_ADDRSTRLEN);
+
+                	/*  incase inet_ntop doesn't work as expected 
+                	ip[0] = sain->sin6_addr.s6_addr >> 120;
+                	ip[1] = sain->sin6_addr.s6_addr >> 112;
+                	ip[2] = sain->sin6_addr.s6_addr >> 104;
+                	ip[3] = sain->sin6_addr.s6_addr >> 96;
+                	ip[4] = sain->sin6_addr.s6_addr >> 88;
+                	ip[5] = sain->sin6_addr.s6_addr >> 80;
+                	ip[6] = sain->sin6_addr.s6_addr >> 72;
+                	ip[7] = sain->sin6_addr.s6_addr >> 64;
+                	ip[8] = sain->sin6_addr.s6_addr >> 56;
+                	ip[9] = sain->sin6_addr.s6_addr >> 48;
+                	ip[10] = sain->sin6_addr.s6_addr >> 40;
+                	ip[11] = sain->sin6_addr.s6_addr >> 32;
+                	ip[12] = sain->sin6_addr.s6_addr >> 24;
+                	ip[13] = sain->sin6_addr.s6_addr >> 16;
+                	ip[14] = sain->sin6_addr.s6_addr >> 8;
+                	ip[15] = sain->sin6_addr.s6_addr >> 0;
+                	*/
 
-                /*  incase inet_ntop doesn't work as expected 
-                ip[0] = sain->sin6_addr.s6_addr >> 120;
-                ip[1] = sain->sin6_addr.s6_addr >> 112;
-                ip[2] = sain->sin6_addr.s6_addr >> 104;
-                ip[3] = sain->sin6_addr.s6_addr >> 96;
-                ip[4] = sain->sin6_addr.s6_addr >> 88;
-                ip[5] = sain->sin6_addr.s6_addr >> 80;
-                ip[6] = sain->sin6_addr.s6_addr >> 72;
-                ip[7] = sain->sin6_addr.s6_addr >> 64;
-                ip[8] = sain->sin6_addr.s6_addr >> 56;
-                ip[9] = sain->sin6_addr.s6_addr >> 48;
-                ip[10] = sain->sin6_addr.s6_addr >> 40;
-                ip[11] = sain->sin6_addr.s6_addr >> 32;
-                ip[12] = sain->sin6_addr.s6_addr >> 24;
-                ip[13] = sain->sin6_addr.s6_addr >> 16;
-                ip[14] = sain->sin6_addr.s6_addr >> 8;
-                ip[15] = sain->sin6_addr.s6_addr >> 0;
-                */
-        } 
+         	default:
+  	        	return (NULL);
+        }
  
 	freeaddrinfo(res);
 }
@@ -860,7 +864,7 @@
 {
 	struct snmp_node *node;
 	u_int i;
-	u_char ip[4];
+	u_char ip[16];
 	struct asn_oid str_oid;
 
 	for (node = tree; node < &tree[tree_size]; node++)
@@ -901,15 +905,18 @@
 
 		} else if (token == TOK_HOST) {
 			gethost(strval, ip);
-			if (oid->len + 16 > ASN_MAXOIDLEN)
-				report("index too long");
+
                         if (addr_type == AF_INET){
+                                if (oid->len + 4 > ASN_MAXOIDLEN)
+                                	report("index too long");
 				for (i = 0; i < 4; i++)
 					oid->subs[oid->len++] = ip[i];
 				gettoken();
                         }
 
                         if (addr_type == AF_INET6){
+                                if (oid->len + 16 > ASN_MAXOIDLEN)
+                                	report("index too long");
                                 for (i = 0; i < 16; i++)
                                         oid->subs[oid->len++] = ip[i];
                                 gettoken();
@@ -1030,41 +1037,41 @@
 parse_syntax_ipaddress(struct snmp_value *value)
 {
 	int i;
-	u_char ip[4];
+	u_char ip[16];
  
 	if (token == TOK_NUM) {
 		/* numerical address */
 		i = 0;
 		for (;;) {
                         if (!isxdigit(numval)) {
-			if (numval >= 256)
-				report("ip address part too large");
-			value->v.ipaddress[i++] = numval;
-	        	if (i == 4)
-				break;
-			if (gettoken() != '.')
-				report("expecting '.' in ip address");
-                        }
-                        else {
-                        value->v.ipaddress[i++] = numval;
-                        if (i == 16)
-                                break;
-                        if (gettoken() != ':')
-                                report("expecting ':' in ip address");
-                        }
+				if (numval >= 256)
+					report("ip address part too large");
+				value->v.ipaddress[i++] = numval;
+	        		if (i == 4)
+					break;
+				if (gettoken() != '.')
+					report("expecting '.' in ip address");
+                       	}
+
+                       	else {
+                        	value->v.ipaddress[i++] = numval;
+                        	if (i == 16)
+                                	break;
+                        	if (gettoken() != ':')
+                                	report("expecting ':' in ip address");
+ 	                }
                         
 		}
 		gettoken();
                 if (i == 4) {
-                struct in_addr dst;
-                if (!inet_pton(AF_INET,value->v.ipaddress[i++],(void *)&dst))
-                  report("ip address not valid");
+                	struct in_addr dst;
+                	if (!inet_pton(AF_INET,value->v.ipaddress[i++],(void *)&dst))
+                  		report("ip address not valid");
                 }
                 else if (i == 16) {
-                struct in6_addr dst;
-                if (!inet_pton(AF_INET6,value->v.ipaddress[i++],(void *)&dst))
-                  report("ipv6 address not valid"); 
-                 
+                	struct in6_addr dst;
+                	if (!inet_pton(AF_INET6,value->v.ipaddress[i++],(void *)&dst))
+                  		report("ipv6 address not valid"); 
                 }
 
 	} else if (token == TOK_HOST) {

Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/export.c
==============================================================================
--- soc2014/shonali/head/contrib/bsnmp/snmpd/export.c	Thu Jul 31 17:18:40 2014	(r271652)
+++ soc2014/shonali/head/contrib/bsnmp/snmpd/export.c	Thu Jul 31 18:31:01 2014	(r271653)
@@ -152,37 +152,41 @@
  */
 int
 ip_save(struct snmp_value *value, struct snmp_context *ctx, u_char *valp)
-{        
+{       
+        /* XX - sizeof of a pointer to an array doesn't give you size of array 
+           Need to find a fix to this or a new way of finding address type */
+
         if (sizeof(*valp)== 4) {
-	ctx->scratch->int1 = (valp[0] << 24) | (valp[1] << 16) | (valp[2] << 8)
-	    | valp[3];
+		ctx->scratch->int1 = (valp[0] << 24) | (valp[1] << 16) | (valp[2] << 8)
+	    	| valp[3];
 
-	valp[0] = value->v.ipaddress[0];
-	valp[1] = value->v.ipaddress[1];
-	valp[2] = value->v.ipaddress[2];
-	valp[3] = value->v.ipaddress[3];
+		valp[0] = value->v.ipaddress[0];
+		valp[1] = value->v.ipaddress[1];
+		valp[2] = value->v.ipaddress[2];
+		valp[3] = value->v.ipaddress[3];
         }
 
         if (sizeof(*valp)== 16) {
-        ctx->scratch->int1 = (valp[0] << 120) | (valp[1] << 112) | (valp[2] << 104) | (valp[3] << 96) | (valp[4] << 88) | (valp[5] << 80) | (valp[6] << 72) | (valp[7] << 64) | (valp[8] << 56) |
-         (valp[9] << 48) | (valp[10] << 40) | (valp[11] << 32) | (valp[12] << 24) | (valp[13] << 16) | (valp[14] << 8) | valp[15]; 
-
-        valp[0] = value->v.ipaddress[0];
-        valp[1] = value->v.ipaddress[1];
-        valp[2] = value->v.ipaddress[2];
-        valp[3] = value->v.ipaddress[3];
-        valp[4] = value->v.ipaddress[4];
-        valp[5] = value->v.ipaddress[5];
-        valp[6] = value->v.ipaddress[6];
-        valp[7] = value->v.ipaddress[7];
-        valp[8] = value->v.ipaddress[8];
-        valp[9] = value->v.ipaddress[9];
-        valp[10] = value->v.ipaddress[10];
-        valp[11] = value->v.ipaddress[11];
-        valp[12] = value->v.ipaddress[12];
-        valp[13] = value->v.ipaddress[13];
-        valp[14] = value->v.ipaddress[14];
-        valp[15] = value->v.ipaddress[15];
+        	ctx->scratch->int1 = (valp[0] << 120) | (valp[1] << 112) | (valp[2] << 104) | (valp[3] << 96) | (valp[4] << 88) |  
+         	(valp[5] << 80) | (valp[6] << 72) | (valp[7] << 64) | (valp[8] << 56) | (valp[9] << 48) | (valp[10] << 40) | 
+         	(valp[11] << 32) | (valp[12] << 24) | (valp[13] << 16) | (valp[14] << 8) | valp[15]; 
+
+        	valp[0] = value->v.ipaddress6[0];
+        	valp[1] = value->v.ipaddress6[1];
+        	valp[2] = value->v.ipaddress6[2];
+        	valp[3] = value->v.ipaddress6[3];
+        	valp[4] = value->v.ipaddress6[4];
+        	valp[5] = value->v.ipaddress6[5];
+        	valp[6] = value->v.ipaddress6[6];
+        	valp[7] = value->v.ipaddress6[7];
+        	valp[8] = value->v.ipaddress6[8];
+        	valp[9] = value->v.ipaddress6[9];
+        	valp[10] = value->v.ipaddress6[10];
+        	valp[11] = value->v.ipaddress6[11];
+        	valp[12] = value->v.ipaddress6[12];
+        	valp[13] = value->v.ipaddress6[13];
+        	valp[14] = value->v.ipaddress6[14];
+        	valp[15] = value->v.ipaddress6[15];
 
         }
 
@@ -194,7 +198,11 @@
  */
 void
 ip_rollback(struct snmp_context *ctx, u_char *valp)
-{       if (sizeof(*valp)== 4) {
+{       
+       /* XX - sizeof of a pointer to an array doesn't give you size of array
+          Need to find a fix to this or a new way of finding address type */
+ 
+        if (sizeof(*valp)== 4) {
 		valp[0] = ctx->scratch->int1 >> 24;
 		valp[1] = ctx->scratch->int1 >> 16;
 		valp[2] = ctx->scratch->int1 >> 8;
@@ -234,29 +242,33 @@
 int
 ip_get(struct snmp_value *value, u_char *valp)
 {
+	/* XX - sizeof of a pointer to an array doesn't give you size of array
+           Need to find a fix to this or a new way of finding address type */
+
 	if (sizeof(*valp)== 4) {
-	value->v.ipaddress[0] = valp[0];
-	value->v.ipaddress[1] = valp[1];
-	value->v.ipaddress[2] = valp[2];
-	value->v.ipaddress[3] = valp[3];
+		value->v.ipaddress[0] = valp[0];
+		value->v.ipaddress[1] = valp[1];
+		value->v.ipaddress[2] = valp[2];
+		value->v.ipaddress[3] = valp[3];
         }
+
         if (sizeof(*valp)== 16) {
-        value->v.ipaddress[0] = valp[0];
-        value->v.ipaddress[1] = valp[1];
-        value->v.ipaddress[2] = valp[2];
-        value->v.ipaddress[3] = valp[3];
-	value->v.ipaddress[4] = valp[4];
-        value->v.ipaddress[5] = valp[5];
-        value->v.ipaddress[6] = valp[6];
-        value->v.ipaddress[7] = valp[7];
-        value->v.ipaddress[8] = valp[8];
-        value->v.ipaddress[9] = valp[9];
-        value->v.ipaddress[10] = valp[10];
-        value->v.ipaddress[11] = valp[11];
-        value->v.ipaddress[12] = valp[12];
-        value->v.ipaddress[13] = valp[13];
-        value->v.ipaddress[14] = valp[14];
-        value->v.ipaddress[15] = valp[15];
+        	value->v.ipaddress6[0] = valp[0];
+        	value->v.ipaddress6[1] = valp[1];
+        	value->v.ipaddress6[2] = valp[2];
+        	value->v.ipaddress6[3] = valp[3];
+		value->v.ipaddress6[4] = valp[4];
+        	value->v.ipaddress6[5] = valp[5];
+        	value->v.ipaddress6[6] = valp[6];
+        	value->v.ipaddress6[7] = valp[7];
+        	value->v.ipaddress6[8] = valp[8];
+        	value->v.ipaddress6[9] = valp[9];
+        	value->v.ipaddress6[10] = valp[10];
+        	value->v.ipaddress6[11] = valp[11];
+        	value->v.ipaddress6[12] = valp[12];
+        	value->v.ipaddress6[13] = valp[13];
+        	value->v.ipaddress6[14] = valp[14];
+        	value->v.ipaddress6[15] = valp[15];
 
         }	
 	return (SNMP_ERR_NOERROR);

Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c
==============================================================================
--- soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c	Thu Jul 31 17:18:40 2014	(r271652)
+++ soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c	Thu Jul 31 18:31:01 2014	(r271653)
@@ -104,7 +104,7 @@
 {
 	struct udpv6_port *p = (struct udpv6_port *)tp;
 	struct sockaddr_in6 addr;
-        u_int32_t ip[4];
+        u_int8_t ip[16];
         const int on = 1;
         char str[INET6_ADDRSTRLEN];
 
@@ -113,10 +113,22 @@
 		return (SNMP_ERR_RES_UNAVAIL);
 	}
 
-	ip[0] = htonl((p->addr[0] << 24) | (p->addr[1] << 16) | (p->addr[2] << 8) | p->addr[3]);
-	ip[1] = htonl((p->addr[4] << 24) | (p->addr[5] << 16) | (p->addr[6] << 8) | p->addr[7]);
-        ip[2] = htonl((p->addr[8] << 24) | (p->addr[9] << 16) | (p->addr[10] << 8) | p->addr[11]);
-        ip[3] = htonl((p->addr[12] << 24) | (p->addr[13] << 16) | (p->addr[14] << 8) | p->addr[15]);
+	ip[0] = p->addr[0] >> 120;
+        ip[1] = p->addr[1] >> 112;
+        ip[2] = p->addr[2] >> 104;
+        ip[3] = p->addr[3] >> 96;
+        ip[4] = p->addr[4] >> 88;
+        ip[5] = p->addr[5] >> 80;
+        ip[6] = p->addr[6] >> 72;
+        ip[7] = p->addr[7] >> 64;
+        ip[8] = p->addr[8] >> 56;
+        ip[9] = p->addr[9] >> 48;
+        ip[10] = p->addr[10] >> 40;
+        ip[11] = p->addr[11] >> 32;
+        ip[12] = p->addr[12] >> 24;
+        ip[13] = p->addr[13] >> 16;
+        ip[14] = p->addr[14] >> 8;
+        ip[15] = p->addr[15] >> 0;
 		
         /* Need to check - can use getaddrinfo instead to fill up addr structure */ 
         memset(&addr, 0, sizeof(addr));
@@ -125,7 +137,7 @@
 	addr.sin6_family = AF_INET6;
 	addr.sin6_len = sizeof(addr);
 	if ((addr.sin6_addr.s6_addr == in6addr_any.s6_addr) && 
-	  (  setsockopt(p->input.fd, IPPROTO_IPV6, IPV6_V6ONLY, &on,
+	  ( setsockopt(p->input.fd, IPPROTO_IPV6, IPV6_V6ONLY, &on,
 	    sizeof(on)) == -1)) {
 		syslog(LOG_ERR, "setsockopt(IP_RECVDSTADDR): %m");
 		close(p->input.fd);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407311831.s6VIV1OB066373>