socsvn commit: r271539 - soc2014/shonali/head/contrib/bsnmp/snmpd

shonali at FreeBSD.org shonali at FreeBSD.org
Tue Jul 29 17:14:16 UTC 2014


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


More information about the svn-soc-all mailing list