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