Date: Sun, 22 Jun 2014 17:16:13 GMT From: shonali@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r269873 - soc2014/shonali/head/contrib/bsnmp/snmpd Message-ID: <201406221716.s5MHGDvh065730@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: shonali Date: Sun Jun 22 17:16:12 2014 New Revision: 269873 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269873 Log: Added ipv6 support to config.c and export.c. Made corrections in 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 Sun Jun 22 16:58:29 2014 (r269872) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/config.c Sun Jun 22 17:16:12 2014 (r269873) @@ -152,6 +152,7 @@ static char strval[_POSIX2_LINE_MAX]; static size_t strvallen; static int token; +static int addr_type; /* error return */ static jmp_buf errjmp[4]; @@ -779,10 +780,10 @@ { struct addrinfo hints, *res; int error; - struct sockaddr_in *sain; + struct sockaddr_storage *sain; memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET; + hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; hints.ai_flags = AI_PASSIVE; @@ -792,13 +793,48 @@ if (res == NULL) report("%s: unknown hostname", host); - 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; - + if(res->ai_family == AF_INET) { + addr_type = AF_INET; + 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; + sain = (struct sockaddr_in6 *)(void *)res->ai_addr; + u_int32_t tmp[4]; + tmp[0] = htonl((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] = htonl((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] = htonl((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] = htonl((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]); + + sain->sin6_addr.s6_addr = *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; + */ + } + freeaddrinfo(res); } @@ -850,11 +886,20 @@ } else if (token == TOK_HOST) { gethost(strval, ip); - if (oid->len + 4 > ASN_MAXOIDLEN) + if (oid->len + 16 > ASN_MAXOIDLEN) report("index too long"); - for (i = 0; i < 4; i++) - oid->subs[oid->len++] = ip[i]; - gettoken(); + if (addr_type == AF_INET){ + for (i = 0; i < 4; i++) + oid->subs[oid->len++] = ip[i]; + gettoken(); + } + + if (addr_type == AF_INET6){ + for (i = 0; i < 16; i++) + oid->subs[oid->len++] = ip[i]; + gettoken(); + } + } else report("bad token in index"); } @@ -970,27 +1015,55 @@ { int i; u_char ip[4]; - + 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) + 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"); + } + else if (i == 16) { + struct in6_addr dst; + if (!inet_pton(AF_INET,value->v.ipaddress[i++],(void *)&dst)) + report("ipv6 address not valid"); + + } } else if (token == TOK_HOST) { /* host name */ gethost(strval, ip); - for (i = 0; i < 4; i++) - value->v.ipaddress[i] = ip[i]; - gettoken(); + if (addr_type == AF_INET){ + for (i = 0; i < 4; i++) + value->v.ipaddress[i] = ip[i]; + gettoken(); + } + if (addr_type == AF_INET6){ + for (i = 0; i < 16; i++) + value->v.ipaddress[i] = ip[i]; + gettoken(); + } } else report("bad ip address syntax"); Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/export.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/export.c Sun Jun 22 16:58:29 2014 (r269872) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/export.c Sun Jun 22 17:16:12 2014 (r269873) @@ -152,7 +152,8 @@ */ int ip_save(struct snmp_value *value, struct snmp_context *ctx, u_char *valp) -{ +{ + if (sizeof(*valp)== 4) { ctx->scratch->int1 = (valp[0] << 24) | (valp[1] << 16) | (valp[2] << 8) | valp[3]; @@ -160,6 +161,30 @@ 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]; + + } return (0); } @@ -169,11 +194,30 @@ */ void ip_rollback(struct snmp_context *ctx, u_char *valp) -{ - valp[0] = ctx->scratch->int1 >> 24; - valp[1] = ctx->scratch->int1 >> 16; - valp[2] = ctx->scratch->int1 >> 8; - valp[3] = ctx->scratch->int1; +{ if (sizeof(*valp)== 4) { + valp[0] = ctx->scratch->int1 >> 24; + valp[1] = ctx->scratch->int1 >> 16; + valp[2] = ctx->scratch->int1 >> 8; + valp[3] = ctx->scratch->int1; + } + if (sizeof(*valp)== 16) { + valp[0] = ctx->scratch->int1 >> 120; + valp[1] = ctx->scratch->int1 >> 112; + valp[2] = ctx->scratch->int1 >> 104; + valp[3] = ctx->scratch->int1 >> 96; + valp[4] = ctx->scratch->int1 >> 88; + valp[5] = ctx->scratch->int1 >> 80; + valp[6] = ctx->scratch->int1 >> 72; + valp[7] = ctx->scratch->int1 >> 64; + valp[8] = ctx->scratch->int1 >> 56; + valp[9] = ctx->scratch->int1 >> 48; + valp[10] = ctx->scratch->int1 >> 40; + valp[11] = ctx->scratch->int1 >> 32; + valp[12] = ctx->scratch->int1 >> 24; + valp[13] = ctx->scratch->int1 >> 16; + valp[14] = ctx->scratch->int1 >> 8; + valp[15] = ctx->scratch->int1 >> 0; + } } /* @@ -190,10 +234,31 @@ int ip_get(struct snmp_value *value, u_char *valp) { + 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]; + } + 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]; + + } return (SNMP_ERR_NOERROR); } @@ -316,14 +381,21 @@ u_int8_t *pval; u_int i; - if (sub + 4 > oid->len) + if (sub + 16 > oid->len) goto err; pval = va_arg(ap, u_int8_t *); + if (sizeof(*pval)== 4) { for (i = 0; i < 4; i++) { if (oid->subs[sub] > 0xff) goto err; pval[i] = oid->subs[sub++]; } + } + if (sizeof(*pval)== 16) { + for (i = 0; i < 16; i++) { + pval[i] = oid->subs[sub++]; + } + } break; } Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c Sun Jun 22 16:58:29 2014 (r269872) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c Sun Jun 22 17:16:12 2014 (r269873) @@ -102,7 +102,6 @@ { struct udpv6_port *p = (struct udpv6_port *)tp; struct sockaddr_in6 addr; - void *ptr; u_int32_t ip[4]; const int on = 1; char str[INET6_ADDRSTRLEN]; @@ -112,24 +111,18 @@ 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] = 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]); - ptr = ip; - % Need to check - can use getaddrinfo instead to fill up addr structure % memset(&addr, 0, sizeof(addr)); - addr.sin6_addr.s_addr = *ptr; + addr.sin6_addr.s6_addr = *ip; addr.sin6_port = htons(p->port); addr.sin6_family = AF_INET6; addr.sin_len = sizeof(addr); - if (addr.sin6_addr.s_addr == IN6ADDR_ANY && + if (addr.sin6_addr.s6_addr == IN6ADDR_ANY && setsockopt(p->input.fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) == -1) { syslog(LOG_ERR, "setsockopt(IP_RECVDSTADDR): %m"); @@ -143,7 +136,7 @@ p->input.fd = -1; return (SNMP_ERR_INCONS_NAME); } - inet_ntop(AF_INET6, &(addr.sin_addr), str, INET6_ADDRSTRLEN) + inet_ntop(AF_INET6, &(addr.sin6_addr), str, INET6_ADDRSTRLEN) syslog(LOG_ERR, "bind: %s:%u %m", str, p->port); close(p->input.fd);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406221716.s5MHGDvh065730>