Date: Tue, 29 Jul 2014 17:14:13 GMT From: shonali@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271539 - soc2014/shonali/head/contrib/bsnmp/snmpd Message-ID: <201407291714.s6THEDsP074942@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: shonali Date: Tue Jul 29 17:14:13 2014 New Revision: 271539 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271539 Log: Added ipv6 code for trap.c and made changes in other files. Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/config.c soc2014/shonali/head/contrib/bsnmp/snmpd/main.c soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.config soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.h soc2014/shonali/head/contrib/bsnmp/snmpd/snmpmod.h soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udp.c soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c soc2014/shonali/head/contrib/bsnmp/snmpd/trap.c soc2014/shonali/head/contrib/bsnmp/snmpd/tree.def Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/config.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/config.c Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/config.c Tue Jul 29 17:14:13 2014 (r271539) @@ -811,7 +811,7 @@ 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]; Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/main.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/main.c Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/main.c Tue Jul 29 17:14:13 2014 (r271539) @@ -1104,79 +1104,6 @@ } /* - * Input from a datagram socket. - * Each receive should return one datagram. - */ -static int -recv_dgram(struct port_input *pi, struct in6_addr *laddr) -{ - u_char embuf[1000]; - char cbuf[CMSG_SPACE(SOCKCREDSIZE(CMGROUP_MAX)) + - CMSG_SPACE(sizeof(struct in6_addr))]; - struct msghdr msg; - struct iovec iov[1]; - ssize_t len; - struct cmsghdr *cmsg; - struct sockcred *cred = NULL; - - if (pi->buf == NULL) { - /* no buffer yet - allocate one */ - if ((pi->buf = buf_alloc(0)) == NULL) { - /* ups - could not get buffer. Read away input - * and drop it */ - (void)recvfrom(pi->fd, embuf, sizeof(embuf), - 0, NULL, NULL); - /* return error */ - return (-1); - } - pi->buflen = buf_size(0); - } - - /* try to get a message */ - msg.msg_name = pi->peer; - msg.msg_namelen = pi->peerlen; - msg.msg_iov = iov; - msg.msg_iovlen = 1; - memset(cbuf, 0, sizeof(cbuf)); - msg.msg_control = cbuf; - msg.msg_controllen = sizeof(cbuf); - msg.msg_flags = 0; - - iov[0].iov_base = pi->buf; - iov[0].iov_len = pi->buflen; - - len = recvmsg(pi->fd, &msg, 0); - - if (len == -1 || len == 0) - /* receive error */ - return (-1); - - if (msg.msg_flags & MSG_TRUNC) { - /* truncated - drop */ - snmpd_stats.silentDrops++; - snmpd_stats.inTooLong++; - return (-1); - } - - pi->length = (size_t)len; - - for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; - cmsg = CMSG_NXTHDR(&msg, cmsg)) { - if (cmsg->cmsg_level == IPPROTO_IPV6 && - cmsg->cmsg_type == IP_RECVDSTADDR) /* Check for ipv6 alternative */ - memcpy(laddr, CMSG_DATA(cmsg), sizeof(struct in6_addr)); - if (cmsg->cmsg_level == SOL_SOCKET && - cmsg->cmsg_type == SCM_CREDS) - cred = (struct sockcred *)CMSG_DATA(cmsg); - } - - if (pi->cred) - check_priv_dgram(pi, cred); - - return (0); -} - -/* * Input from a socket */ int @@ -1193,10 +1120,7 @@ #ifdef USE_TCPWRAPPERS char client[16]; #endif - struct msghdr msg; struct iovec iov[1]; - char cbuf[CMSG_SPACE(sizeof(struct in6_addr))]; - struct cmsghdr *cmsgp; /* get input depending on the transport */ if (pi->stream) { @@ -1205,23 +1129,7 @@ ret = recv_stream(pi); } else { - struct in6_addr *laddr; - - memset(cbuf, 0, CMSG_SPACE(sizeof(struct in6_addr))); - msg.msg_control = cbuf; - msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_addr)); - cmsgp = CMSG_FIRSTHDR(&msg); - cmsgp->cmsg_len = CMSG_LEN(sizeof(struct in6_addr)); - cmsgp->cmsg_level = IPPROTO_IPV6; - cmsgp->cmsg_type = IP_SENDSRCADDR; /* Check for ipv6 alternative */ - laddr = (struct in6_addr *)CMSG_DATA(cmsgp); - - ret = recv_dgram(pi, laddr); - - if (laddr->s6_addr == 0) { - msg.msg_control = NULL; - msg.msg_controllen = 0; - } + ret = tport->transport->vtab->recv(tp, pi); } if (ret == -1) @@ -1233,7 +1141,7 @@ */ if (pi->peer->sa_family != AF_LOCAL && inet_ntop(pi->peer->sa_family, - &((const struct sockaddr_in6 *)(const void *)pi->peer)->sin6_addr, + &((const struct sockaddr_in *)(const void *)pi->peer)->sin_addr, client, sizeof(client)) != NULL) { request_set(&req, RQ_CLIENT_ADDR, client, 0); if (hosts_access(&req) == 0) { Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.config ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.config Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.config Tue Jul 29 17:14:13 2014 (r271539) @@ -71,8 +71,8 @@ begemotSnmpdCommunityDisable = 1 # open standard SNMP ports -begemotSnmpdPortStatus.::.161.2 = 1 -begemotSnmpdPortStatus.::1.161.2 = 1 +begemotSnmpdPortStatus.0:0:0:0:0:0:0:0.161.2 = 1 +begemotSnmpdPortStatus.0:0:0:0:0:0:0:1.161.2 = 1 # open a unix domain socket begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1 Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.h ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.h Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/snmpd.h Tue Jul 29 17:14:13 2014 (r271539) @@ -193,6 +193,7 @@ ssize_t (*send)(struct tport *, const u_char *, size_t, const struct sockaddr *, size_t); + ssize_t (*recv)(struct tport *, struct port_input *); }; struct transport { struct asn_oid index; /* transport table index */ Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/snmpmod.h ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/snmpmod.h Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/snmpmod.h Tue Jul 29 17:14:13 2014 (r271539) @@ -471,6 +471,7 @@ }; #define SNMP_UDP_ADDR_SIZ 6 +#define SNMP_UDP_ADDRv6_SIZ 18 #define SNMP_TAG_SIZ (255 + 1) struct target_address { Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/trans_lsock.c Tue Jul 29 17:14:13 2014 (r271539) @@ -58,6 +58,7 @@ static int lsock_init_port(struct tport *); static ssize_t lsock_send(struct tport *, const u_char *, size_t, const struct sockaddr *, size_t); +static ssize_t lsock_recv(struct tport *, struct port_input *); /* exported */ const struct transport_def lsock_trans = { @@ -68,6 +69,7 @@ lsock_close_port, lsock_init_port, lsock_send + lsock_recv }; static struct transport *my_trans; @@ -422,6 +424,110 @@ } /* + * Receive something + */ +static ssize_t +lsock_recv(struct tport *tp, struct port_input *pi) +{ + struct in_addr *laddr; + int ret; + struct msghdr msg; + char cbuf[CMSG_SPACE(sizeof(struct in_addr))]; + struct cmsghdr *cmsgp; + + memset(cbuf, 0, CMSG_SPACE(sizeof(struct in_addr))); + msg.msg_control = cbuf; + msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr)); + cmsgp = CMSG_FIRSTHDR(&msg); + cmsgp->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); + cmsgp->cmsg_level = IPPROTO_IP; + cmsgp->cmsg_type = IP_SENDSRCADDR; + laddr = (struct in_addr *)CMSG_DATA(cmsgp); + + ret = recv_dgram(pi, laddr); + + if (laddr->s_addr == 0) { + msg.msg_control = NULL; + msg.msg_controllen = 0; + } + + return (ret); +} + +/* + * Input from a datagram socket. + * Each receive should return one datagram. + */ +static int +recv_dgram(struct port_input *pi, struct in_addr *laddr) +{ + u_char embuf[1000]; + char cbuf[CMSG_SPACE(SOCKCREDSIZE(CMGROUP_MAX)) + + CMSG_SPACE(sizeof(struct in_addr))]; + struct msghdr msg; + struct iovec iov[1]; + ssize_t len; + struct cmsghdr *cmsg; + struct sockcred *cred = NULL; + + if (pi->buf == NULL) { + /* no buffer yet - allocate one */ + if ((pi->buf = buf_alloc(0)) == NULL) { + /* ups - could not get buffer. Read away input + * and drop it */ + (void)recvfrom(pi->fd, embuf, sizeof(embuf), + 0, NULL, NULL); + /* return error */ + return (-1); + } + pi->buflen = buf_size(0); + } + + /* try to get a message */ + msg.msg_name = pi->peer; + msg.msg_namelen = pi->peerlen; + msg.msg_iov = iov; + msg.msg_iovlen = 1; + memset(cbuf, 0, sizeof(cbuf)); + msg.msg_control = cbuf; + msg.msg_controllen = sizeof(cbuf); + msg.msg_flags = 0; + + iov[0].iov_base = pi->buf; + iov[0].iov_len = pi->buflen; + + len = recvmsg(pi->fd, &msg, 0); + + if (len == -1 || len == 0) + /* receive error */ + return (-1); + + if (msg.msg_flags & MSG_TRUNC) { + /* truncated - drop */ + snmpd_stats.silentDrops++; + snmpd_stats.inTooLong++; + return (-1); + } + + pi->length = (size_t)len; + + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_IP && + cmsg->cmsg_type == IP_RECVDSTADDR) + memcpy(laddr, CMSG_DATA(cmsg), sizeof(struct in_addr)); + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_CREDS) + cred = (struct sockcred *)CMSG_DATA(cmsg); + } + + if (pi->cred) + check_priv_dgram(pi, cred); + + return (0); +} + +/* * Dependency to create a lsock port */ struct lsock_dep { Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udp.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udp.c Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udp.c Tue Jul 29 17:14:13 2014 (r271539) @@ -54,6 +54,7 @@ static int udp_init_port(struct tport *); static ssize_t udp_send(struct tport *, const u_char *, size_t, const struct sockaddr *, size_t); +static ssize_t udp_recv(struct tport *, struct port_input *); /* exported */ const struct transport_def udp_trans = { @@ -64,6 +65,7 @@ udp_close_port, udp_init_port, udp_send + udp_recv }; static struct transport *my_trans; @@ -219,6 +221,111 @@ } /* + * Receive something + */ +static ssize_t +udp_recv(struct tport *tp, struct port_input *pi) +{ + struct in_addr *laddr; + int ret; + struct msghdr msg; + char cbuf[CMSG_SPACE(sizeof(struct in_addr))]; + struct cmsghdr *cmsgp; + + memset(cbuf, 0, CMSG_SPACE(sizeof(struct in_addr))); + msg.msg_control = cbuf; + msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr)); + cmsgp = CMSG_FIRSTHDR(&msg); + cmsgp->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); + cmsgp->cmsg_level = IPPROTO_IP; + cmsgp->cmsg_type = IP_SENDSRCADDR; + laddr = (struct in_addr *)CMSG_DATA(cmsgp); + + ret = recv_dgram(pi, laddr); + + if (laddr->s_addr == 0) { + msg.msg_control = NULL; + msg.msg_controllen = 0; + } + + return (ret); +} + +/* + * Input from a datagram socket. + * Each receive should return one datagram. + */ +static int +recv_dgram(struct port_input *pi, struct in_addr *laddr) +{ + u_char embuf[1000]; + char cbuf[CMSG_SPACE(SOCKCREDSIZE(CMGROUP_MAX)) + + CMSG_SPACE(sizeof(struct in_addr))]; + struct msghdr msg; + struct iovec iov[1]; + ssize_t len; + struct cmsghdr *cmsg; + struct sockcred *cred = NULL; + + if (pi->buf == NULL) { + /* no buffer yet - allocate one */ + if ((pi->buf = buf_alloc(0)) == NULL) { + /* ups - could not get buffer. Read away input + * and drop it */ + (void)recvfrom(pi->fd, embuf, sizeof(embuf), + 0, NULL, NULL); + /* return error */ + return (-1); + } + pi->buflen = buf_size(0); + } + + /* try to get a message */ + msg.msg_name = pi->peer; + msg.msg_namelen = pi->peerlen; + msg.msg_iov = iov; + msg.msg_iovlen = 1; + memset(cbuf, 0, sizeof(cbuf)); + msg.msg_control = cbuf; + msg.msg_controllen = sizeof(cbuf); + msg.msg_flags = 0; + + iov[0].iov_base = pi->buf; + iov[0].iov_len = pi->buflen; + + len = recvmsg(pi->fd, &msg, 0); + + if (len == -1 || len == 0) + /* receive error */ + return (-1); + + + if (msg.msg_flags & MSG_TRUNC) { + /* truncated - drop */ + snmpd_stats.silentDrops++; + snmpd_stats.inTooLong++; + return (-1); + } + + pi->length = (size_t)len; + + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_IP && + cmsg->cmsg_type == IP_RECVDSTADDR) + memcpy(laddr, CMSG_DATA(cmsg), sizeof(struct in_addr)); + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_CREDS) + cred = (struct sockcred *)CMSG_DATA(cmsg); + } + + if (pi->cred) + check_priv_dgram(pi, cred); + + return (0); +} + +/* * Port table */ int Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c Tue Jul 29 17:14:13 2014 (r271539) @@ -54,6 +54,7 @@ static int udpv6_init_port(struct tport *); static ssize_t udpv6_send(struct tport *, const u_char *, size_t, const struct sockaddr *, size_t); +static ssize_t udpv6_recv(struct tport *, struct port_input *); /* exported */ const struct transport_def udpv6_trans = { @@ -64,6 +65,7 @@ udpv6_close_port, udpv6_init_port, udpv6_send + udpv6_recv }; static struct transport *my_trans; @@ -225,6 +227,110 @@ } /* + * Receive something + */ +static ssize_t +udpv6_recv(struct tport *tp, struct port_input *pi) +{ + struct in6_addr *laddr; + int ret; + struct msghdr msg; + char cbuf[CMSG_SPACE(sizeof(struct in6_addr))]; + struct cmsghdr *cmsgp; + + memset(cbuf, 0, CMSG_SPACE(sizeof(struct in6_addr))); + msg.msg_control = cbuf; + msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_addr)); + cmsgp = CMSG_FIRSTHDR(&msg); + cmsgp->cmsg_len = CMSG_LEN(sizeof(struct in6_addr)); + cmsgp->cmsg_level = IPPROTO_IPV6; + cmsgp->cmsg_type = IP_SENDSRCADDR; /* Check for ipv6 alternative */ + laddr = (struct in6_addr *)CMSG_DATA(cmsgp); + + ret = recv_v6dgram(pi, laddr); + + if (laddr->s6_addr == 0) { + msg.msg_control = NULL; + msg.msg_controllen = 0; + } + + return (ret); +} + +/* + * Input from a datagram socket. + * Each receive should return one datagram. + */ +static int +recv_v6dgram(struct port_input *pi, struct in6_addr *laddr) +{ + u_char embuf[1000]; + char cbuf[CMSG_SPACE(SOCKCREDSIZE(CMGROUP_MAX)) + + CMSG_SPACE(sizeof(struct in6_addr))]; + struct msghdr msg; + struct iovec iov[1]; + ssize_t len; + struct cmsghdr *cmsg; + struct sockcred *cred = NULL; + + if (pi->buf == NULL) { + /* no buffer yet - allocate one */ + if ((pi->buf = buf_alloc(0)) == NULL) { + /* ups - could not get buffer. Read away input + * and drop it */ + (void)recvfrom(pi->fd, embuf, sizeof(embuf), + 0, NULL, NULL); + /* return error */ + return (-1); + } + pi->buflen = buf_size(0); + } + + /* try to get a message */ + msg.msg_name = pi->peer; + msg.msg_namelen = pi->peerlen; + msg.msg_iov = iov; + msg.msg_iovlen = 1; + memset(cbuf, 0, sizeof(cbuf)); + msg.msg_control = cbuf; + msg.msg_controllen = sizeof(cbuf); + msg.msg_flags = 0; + + iov[0].iov_base = pi->buf; + iov[0].iov_len = pi->buflen; + + len = recvmsg(pi->fd, &msg, 0); + + if (len == -1 || len == 0) + /* receive error */ + return (-1); + + if (msg.msg_flags & MSG_TRUNC) { + /* truncated - drop */ + snmpd_stats.silentDrops++; + snmpd_stats.inTooLong++; + return (-1); + } + + pi->length = (size_t)len; + + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_IPV6 && + cmsg->cmsg_type == IP_RECVDSTADDR) /* Check for ipv6 alternative */ + memcpy(laddr, CMSG_DATA(cmsg), sizeof(struct in6_addr)); + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_CREDS) + cred = (struct sockcred *)CMSG_DATA(cmsg); + } + + if (pi->cred) + check_priv_dgram(pi, cred); + + return (0); +} + +/* * Port table */ int Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trap.c ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/trap.c Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/trap.c Tue Jul 29 17:14:13 2014 (r271539) @@ -104,7 +104,6 @@ trapsink_create(struct trapsink_dep *tdep) { struct trapsink *t; - struct sockaddr_in sa; if ((t = malloc(sizeof(*t))) == NULL) return (SNMP_ERR_RES_UNAVAIL); @@ -114,28 +113,19 @@ t->comm[0] = '\0'; t->version = TRAPSINK_V2; - if ((t->socket = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { - syslog(LOG_ERR, "socket(UDP): %m"); - free(t); - return (SNMP_ERR_RES_UNAVAIL); - } - (void)shutdown(t->socket, SHUT_RD); - memset(&sa, 0, sizeof(sa)); - sa.sin_len = sizeof(sa); - sa.sin_family = AF_INET; - sa.sin_addr.s_addr = htonl((t->index.subs[0] << 24) | - (t->index.subs[1] << 16) | (t->index.subs[2] << 8) | - (t->index.subs[3] << 0)); - sa.sin_port = htons(t->index.subs[4]); - - if (connect(t->socket, (struct sockaddr *)&sa, sa.sin_len) == -1) { - syslog(LOG_ERR, "connect(%s,%u): %m", - inet_ntoa(sa.sin_addr), ntohs(sa.sin_port)); - (void)close(t->socket); - free(t); - return (SNMP_ERR_GENERR); - } - + switch (sizeof(t->index.subs)) { + /* IPv4 - Check if there is a better way of determining address type */ + case 6: + trapsink_create_sock(t); + + /* IPv6 - Check if there is a better way of determining address type */ + case 18: + trapsink_create_sockv6(t); + + default: + return (NULL); + } + if (tdep->set & TDEP_VERSION) t->version = tdep->version; if (tdep->set & TDEP_COMM) @@ -162,6 +152,67 @@ return (SNMP_ERR_NOERROR); } +static void +trapsink_create_sock(struct trapsink *t) +{ + struct sockaddr_in sa; + if ((t->socket = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { + syslog(LOG_ERR, "socket(UDP): %m"); + free(t); + return (SNMP_ERR_RES_UNAVAIL); + } + (void)shutdown(t->socket, SHUT_RD); + memset(&sa, 0, sizeof(sa)); + sa.sin_len = sizeof(sa); + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = htonl((t->index.subs[0] << 24) | + (t->index.subs[1] << 16) | (t->index.subs[2] << 8) | + (t->index.subs[3] << 0)); + sa.sin_port = htons(t->index.subs[4]); + + if (connect(t->socket, (struct sockaddr *)&sa, sa.sin_len) == -1) { + syslog(LOG_ERR, "connect(%s,%u): %m", + inet_ntoa(sa.sin_addr), ntohs(sa.sin_port)); + (void)close(t->socket); + free(t); + return (SNMP_ERR_GENERR); + } + + +} + +static void +trapsink_create_sockv6(struct trapsink *t) +{ + struct sockaddr_in6 sa; + if ((t->socket = socket(PF_INET6, SOCK_DGRAM, 0)) == -1) { + syslog(LOG_ERR, "socket(UDP): %m"); + free(t); + return (SNMP_ERR_RES_UNAVAIL); + } + (void)shutdown(t->socket, SHUT_RD); + memset(&sa, 0, sizeof(sa)); + sa.sin6_len = sizeof(sa); + sa.sin6_family = AF_INET6; + /* Host to network byte order not reqd - check */ + sa.sin6_addr.s6_addr = (t->index.subs[0] << 120) | (t->index.subs[1] << 112) | (t->index.subs[2] << 104) | (t->index.subs[3] << 96) | (t->index.subs[4] << 88) | + (t->index.subs[5] << 80) | (t->index.subs[6] << 72) | (t->index.subs[7] << 64) | (t->index.subs[8] << 56) | + (t->index.subs[9] << 48) | (t->index.subs[10] << 40) | (t->index.subs[11] << 32) | (t->index.subs[12] << 24) | + (t->index.subs[13] << 16) | (t->index.subs[14] << 8) | t->index.subs[15]; + sa.sin6_port = htons(t->index.subs[16]); + + if (connect(t->socket, (struct sockaddr *)&sa, sa.sin6_len) == -1) { + syslog(LOG_ERR, "connect(%s,%u): %m", + inet_ntoa(sa.sin6_addr), ntohs(sa.sin6_port)); + (void)close(t->socket); + free(t); + return (SNMP_ERR_GENERR); + } + + + +} + static void trapsink_free(struct trapsink *t) { @@ -720,31 +771,69 @@ int target_activate_address(struct target_address *addrs) { - struct sockaddr_in sa; - - if ((addrs->socket = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { - syslog(LOG_ERR, "socket(UDP): %m"); - return (SNMP_ERR_RES_UNAVAIL); - } - - (void)shutdown(addrs->socket, SHUT_RD); - memset(&sa, 0, sizeof(sa)); - sa.sin_len = sizeof(sa); - sa.sin_family = AF_INET; - - sa.sin_addr.s_addr = htonl((addrs->address[0] << 24) | - (addrs->address[1] << 16) | (addrs->address[2] << 8) | - (addrs->address[3] << 0)); - sa.sin_port = htons(addrs->address[4]) << 8 | - htons(addrs->address[5]) << 0; - - if (connect(addrs->socket, (struct sockaddr *)&sa, sa.sin_len) == -1) { - syslog(LOG_ERR, "connect(%s,%u): %m", - inet_ntoa(sa.sin_addr), ntohs(sa.sin_port)); - (void)close(addrs->socket); - return (SNMP_ERR_GENERR); - } - + /* IPv4/IPv6 - Check if there is a better way of determining address type */ + switch (sizeof(*addrs)) { + + case 6: + struct sockaddr_in sa; + + if ((addrs->socket = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { + syslog(LOG_ERR, "socket(UDP): %m"); + return (SNMP_ERR_RES_UNAVAIL); + } + + (void)shutdown(addrs->socket, SHUT_RD); + memset(&sa, 0, sizeof(sa)); + sa.sin_len = sizeof(sa); + sa.sin_family = AF_INET; + + sa.sin_addr.s_addr = htonl((addrs->address[0] << 24) | + (addrs->address[1] << 16) | (addrs->address[2] << 8) | + (addrs->address[3] << 0)); + sa.sin_port = htons(addrs->address[4]) << 8 | + htons(addrs->address[5]) << 0; + + if (connect(addrs->socket, (struct sockaddr *)&sa, sa.sin_len) == -1) { + syslog(LOG_ERR, "connect(%s,%u): %m", + inet_ntoa(sa.sin_addr), ntohs(sa.sin_port)); + (void)close(addrs->socket); + return (SNMP_ERR_GENERR); + } + + + case 18: + struct sockaddr_in6 sa; + + if ((addrs->socket = socket(PF_INET6, SOCK_DGRAM, 0)) == -1) { + syslog(LOG_ERR, "socket(UDP): %m"); + return (SNMP_ERR_RES_UNAVAIL); + } + + (void)shutdown(addrs->socket, SHUT_RD); + memset(&sa, 0, sizeof(sa)); + sa.sin6_len = sizeof(sa); + sa.sin6_family = AF_INET6; + /* Host to network byte order not reqd - check */ + sa.sin6_addr.s6_addr = (addrs->address[0] << 120) | (addrs->address[1] << 112) | (addrs->address[2] << 104) | (addrs->address[3] << 96) | (addrs->address[4] << 88) | + (addrs->address[5] << 80) | (addrs->address[6] << 72) | (addrs->address[7] << 64) | (addrs->address[8] << 56) | + (addrs->address[9] << 48) | (addrs->address[10] << 40) | (addrs->address[11] << 32) | (addrs->address[12] << 24) | + (addrs->address[13] << 16) | (addrs->address[14] << 8) | addrs->address[15]; + sa.sin6_port = htons(addrs->address[16]) << 8 | + htons(addrs->address[17]) << 0; + + if (connect(addrs->socket, (struct sockaddr *)&sa, sa.sin6_len) == -1) { + syslog(LOG_ERR, "connect(%s,%u): %m", + inet_ntoa(sa.sin6_addr), ntohs(sa.sin6_port)); + (void)close(addrs->socket); + return (SNMP_ERR_GENERR); + } + + + default: + return (NULL); + } + + addrs->status = RowStatus_active; return (SNMP_ERR_NOERROR); Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/tree.def ============================================================================== --- soc2014/shonali/head/contrib/bsnmp/snmpd/tree.def Tue Jul 29 16:42:34 2014 (r271538) +++ soc2014/shonali/head/contrib/bsnmp/snmpd/tree.def Tue Jul 29 17:14:13 2014 (r271539) @@ -32,7 +32,12 @@ # #include "tc.def" - +typedef InetAddressType ENUM ( + 0 unknown + 1 ipv4 + 2 ipv6 + 16 dnsi + ) typedef RowStatus ENUM ( 1 active 2 notInService @@ -121,11 +126,11 @@ # Port table # (4 begemotSnmpdPortTable - (1 begemotSnmpdPortEntry : InetAddress InetAddressType INTEGER op_snmp_port + (1 begemotSnmpdPortEntry : InetAddress INTEGER op_snmp_port InetAddressType (1 begemotSnmpdPortAddress InetAddress) - (4 begemotSnmpdPortAddressType InetAddressType) (2 begemotSnmpdPortPort UNSIGNED32) (3 begemotSnmpdPortStatus INTEGER GET SET) + (4 begemotSnmpdPortAddressType InetAddressType) )) # # Community table
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407291714.s6THEDsP074942>