[Pkg-net-snmp-commits] r147 - branches/net-snmp53/debian/patches
Jochen Friedrich
jochen at alioth.debian.org
Wed Apr 11 11:07:35 UTC 2007
Author: jochen
Date: 2007-04-11 11:07:35 +0000 (Wed, 11 Apr 2007)
New Revision: 147
Modified:
branches/net-snmp53/debian/patches/24_pktinfo.README
branches/net-snmp53/debian/patches/24_pktinfo.patch
Log:
Update patch from Jan Andres <jandres at gmx.net>
Modified: branches/net-snmp53/debian/patches/24_pktinfo.README
===================================================================
--- branches/net-snmp53/debian/patches/24_pktinfo.README 2007-04-10 16:30:19 UTC (rev 146)
+++ branches/net-snmp53/debian/patches/24_pktinfo.README 2007-04-11 11:07:35 UTC (rev 147)
@@ -7,3 +7,5 @@
the corresponding request has been received on.
-- Lars Ellenberg
+
+ Update from Jan Andres <jandres at gmx.net>
Modified: branches/net-snmp53/debian/patches/24_pktinfo.patch
===================================================================
--- branches/net-snmp53/debian/patches/24_pktinfo.patch 2007-04-10 16:30:19 UTC (rev 146)
+++ branches/net-snmp53/debian/patches/24_pktinfo.patch 2007-04-11 11:07:35 UTC (rev 147)
@@ -1,212 +1,408 @@
---- net-snmp-5.2.2.orig/snmplib/snmpUDPDomain.c 2005-09-16 12:30:41.000000000 +0200
-+++ net-snmp-5.2.2/snmplib/snmpUDPDomain.c 2006-06-06 23:28:31.822443722 +0200
-@@ -97,7 +97,7 @@
- }
+diff -ur net-snmp-5.3.1/snmplib/snmpTCPDomain.c net-snmp-5.3.1-fixed/snmplib/snmpTCPDomain.c
+--- net-snmp-5.3.1/snmplib/snmpTCPDomain.c 2005-09-16 12:30:48.000000000 +0200
++++ net-snmp-5.3.1-fixed/snmplib/snmpTCPDomain.c 2007-02-09 20:52:29.112680146 +0100
+@@ -44,6 +44,12 @@
+ #include <net-snmp/library/snmpUDPDomain.h>
+ #include <net-snmp/library/snmpTCPDomain.h>
++/* Copied from snmpUDPDomain.c */
++typedef struct netsnmp_udp_addr_pair_s {
++ struct sockaddr_in remote_addr;
++ struct in_addr local_addr;
++} netsnmp_udp_addr_pair;
++
+ oid netsnmp_snmpTCPDomain[] = { TRANSPORT_DOMAIN_TCP_IP };
+ static netsnmp_tdomain tcpDomain;
--
-+#ifndef IP_PKTINFO
+@@ -55,18 +61,23 @@
+ static char *
+ netsnmp_tcp_fmtaddr(netsnmp_transport *t, void *data, int len)
+ {
+- struct sockaddr_in *to = NULL;
++ netsnmp_udp_addr_pair *addr_pair = NULL;
+
+- if (data != NULL && len == sizeof(struct sockaddr_in)) {
+- to = (struct sockaddr_in *) data;
+- } else if (t != NULL && t->data != NULL &&
+- t->data_length == sizeof(struct sockaddr_in)) {
+- to = (struct sockaddr_in *) t->data;
++ if (data != NULL && len == sizeof(netsnmp_udp_addr_pair)) {
++ addr_pair = (netsnmp_udp_addr_pair *) data;
++ } else if (t != NULL && t->data != NULL) {
++ addr_pair = (netsnmp_udp_addr_pair *) t->data;
+ }
+- if (to == NULL) {
++
++ if (addr_pair == NULL) {
+ return strdup("TCP: unknown");
+ } else {
+- char tmp[64];
++ struct sockaddr_in *to = NULL;
++ char tmp[64];
++ to = (struct sockaddr_in *) &(addr_pair->remote_addr);
++ if (to == NULL) {
++ return strdup("TCP: unknown");
++ }
+
+ sprintf(tmp, "TCP: [%s]:%hd",
+ inet_ntoa(to->sin_addr), ntohs(to->sin_port));
+@@ -163,19 +174,21 @@
+ netsnmp_tcp_accept(netsnmp_transport *t)
+ {
+ struct sockaddr *farend = NULL;
++ netsnmp_udp_addr_pair *addr_pair = NULL;
+ int newsock = -1, sockflags = 0;
+ socklen_t farendlen = sizeof(struct sockaddr_in);
+ char *str = NULL;
+
+- farend = (struct sockaddr *) malloc(sizeof(struct sockaddr_in));
++ addr_pair = (netsnmp_udp_addr_pair *)malloc(sizeof(netsnmp_udp_addr_pair));
+
+- if (farend == NULL) {
++ if (addr_pair == NULL) {
+ /*
+ * Indicate that the acceptance of this socket failed.
+ */
+ DEBUGMSGTL(("netsnmp_tcp", "accept: malloc failed\n"));
+ return -1;
+ }
++ farend = (struct sockaddr_in *) &(addr_pair->remote_addr);
+
+ if (t != NULL && t->sock >= 0) {
+ newsock = accept(t->sock, farend, &farendlen);
+@@ -191,8 +204,8 @@
+ free(t->data);
+ }
+
+- t->data = farend;
+- t->data_length = farendlen;
++ t->data = addr_pair;
++ t->data_length = sizeof(netsnmp_udp_addr_pair);
+ str = netsnmp_tcp_fmtaddr(NULL, farend, farendlen);
+ DEBUGMSGTL(("netsnmp_tcp", "accept succeeded (from %s)\n", str));
+ free(str);
+@@ -238,6 +251,7 @@
+ netsnmp_tcp_transport(struct sockaddr_in *addr, int local)
+ {
+ netsnmp_transport *t = NULL;
++ netsnmp_udp_addr_pair *addr_pair = NULL;
+ int rc = 0;
+
+
+@@ -251,13 +265,14 @@
+ }
+ memset(t, 0, sizeof(netsnmp_transport));
+
+- t->data = malloc(sizeof(struct sockaddr_in));
+- if (t->data == NULL) {
++ addr_pair = (netsnmp_udp_addr_pair *)malloc(sizeof(netsnmp_udp_addr_pair));
++ if (addr_pair == NULL) {
+ netsnmp_transport_free(t);
+ return NULL;
+ }
+- t->data_length = sizeof(struct sockaddr_in);
+- memcpy(t->data, addr, sizeof(struct sockaddr_in));
++ t->data = addr_pair;
++ t->data_length = sizeof(netsnmp_udp_addr_pair);
++ memcpy(&(addr_pair->remote_addr), addr, sizeof(struct sockaddr_in));
+
+ t->domain = netsnmp_snmpTCPDomain;
+ t->domain_length =
+diff -ur net-snmp-5.3.1/snmplib/snmpUDPDomain.c net-snmp-5.3.1-fixed/snmplib/snmpUDPDomain.c
+--- net-snmp-5.3.1/snmplib/snmpUDPDomain.c 2005-11-05 23:01:42.000000000 +0100
++++ net-snmp-5.3.1-fixed/snmplib/snmpUDPDomain.c 2007-02-09 20:53:10.626567462 +0100
+@@ -64,6 +64,11 @@
+
+ static netsnmp_tdomain udpDomain;
+
++typedef struct netsnmp_udp_addr_pair_s {
++ struct sockaddr_in remote_addr;
++ struct in_addr local_addr;
++} netsnmp_udp_addr_pair;
++
/*
- * You can write something into opaque that will subsequently get passed back
- * to your send function if you like. For instance, you might want to
-@@ -178,6 +178,151 @@
- return rc;
- }
+ * not static, since snmpUDPIPv6Domain needs it, but not public, either.
+ * (ie don't put it in a public header.)
+@@ -78,17 +83,23 @@
+ static char *
+ netsnmp_udp_fmtaddr(netsnmp_transport *t, void *data, int len)
+ {
+- struct sockaddr_in *to = NULL;
++ netsnmp_udp_addr_pair *addr_pair = NULL;
-+#else
-+/* we have IP_PKTINFO */
-+/*
-+ * we try to remember the ip we received a request on,
-+ * so we can use it again to send back the answer.
-+ */
+- if (data != NULL && len == sizeof(struct sockaddr_in)) {
+- to = (struct sockaddr_in *) data;
++ if (data != NULL && len == sizeof(netsnmp_udp_addr_pair)) {
++ addr_pair = (netsnmp_udp_addr_pair *) data;
+ } else if (t != NULL && t->data != NULL) {
+- to = (struct sockaddr_in *) t->data;
++ addr_pair = (netsnmp_udp_addr_pair *) t->data;
+ }
+- if (to == NULL) {
+
-+struct _netsnmp_udp_info {
-+ struct sockaddr_in remote;
-+ struct cmsghdr cmsg;
-+ struct in_pktinfo pktinfo;
-+} __attribute((packed));
++ if (addr_pair == NULL) {
+ return strdup("UDP: unknown");
+ } else {
++ struct sockaddr_in *to = NULL;
+ char tmp[64];
++ to = (struct sockaddr_in *) &(addr_pair->remote_addr);
++ if (to == NULL) {
++ return strdup("UDP: unknown");
++ }
+
+ sprintf(tmp, "UDP: [%s]:%hu",
+ inet_ntoa(to->sin_addr), ntohs(to->sin_port));
+@@ -98,6 +109,77 @@
+
+
+
++#ifdef IP_PKTINFO
+
-+static int
-+netsnmp_udp_recv(netsnmp_transport *t, void *buf, int size,
-+ void **opaque, int *olength)
++# define netsnmp_dstaddr(x) (&(((struct in_pktinfo *)(CMSG_DATA(x)))->ipi_addr))
++
++static int netsnmp_udp_recvfrom(int s, char *buf, int len, struct sockaddr *from, int *fromlen, struct in_addr *dstip)
+{
-+ int rc = -1;
-+ struct _netsnmp_udp_info *info;
++ int r;
++ struct iovec iov[1];
++ char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))];
++ struct cmsghdr *cmsgptr;
++ struct msghdr msg;
+
-+ if (t != NULL && t->sock >= 0) {
-+ struct msghdr msg;
-+ u_char hdrbuf[128]; /* FIXME how much do we need? */
-+ struct iovec iov;
-+ struct cmsghdr *cmsg;
++ iov[0].iov_base = buf;
++ iov[0].iov_len = len;
+
-+ info = malloc(sizeof(*info));
-+ if (info == NULL) {
-+ /* XXX BUG ALERT
-+ * why do you (re)initialize something that may need to be freed?
-+ *
-+ *opaque = NULL;
-+ *olength = 0;
-+ */
-+ return -1;
-+ } else {
-+ memset(info, 0, sizeof(*info));
-+ *opaque = info;
-+ *olength = sizeof(*info);
-+ }
++ memset(&msg, 0, sizeof msg);
++ msg.msg_name = from;
++ msg.msg_namelen = *fromlen;
++ msg.msg_iov = iov;
++ msg.msg_iovlen = 1;
++ msg.msg_control = &cmsg;
++ msg.msg_controllen = sizeof(cmsg);
+
-+ iov.iov_base=buf;
-+ iov.iov_len=size;
++ r = recvmsg(s, &msg, 0);
+
-+ msg.msg_name=(caddr_t)&info->remote;
-+ msg.msg_namelen=(uint)sizeof(info->remote);
-+ msg.msg_iov=&iov;
-+ msg.msg_iovlen=1;
-+ msg.msg_control=hdrbuf;
-+ msg.msg_controllen=sizeof(hdrbuf);
-+ msg.msg_flags=0;
-+ while (rc < 0) {
-+ rc = recvmsg(t->sock, &msg, 0);
-+ if (rc < 0 && errno != EINTR) {
-+ break;
-+ }
-+ }
-+
-+ if (rc >= 0) {
-+ char *str, *str_local = "???";
-+ int pktinfo_found = 0;
-+ str = netsnmp_udp_fmtaddr(NULL, &info->remote, sizeof(info->remote));
-+ if (msg.msg_controllen>0) {
-+ for (cmsg=CMSG_FIRSTHDR(&msg);cmsg;cmsg=CMSG_NXTHDR(&msg,cmsg)) {
-+ if (cmsg->cmsg_type==IP_PKTINFO) {
-+ /* maybe it was easier to just copy msg_control opaque,
-+ * and later supply it unaltered to sendmsg...
-+ * but I'd rather be explicit.
-+ */
-+ info->pktinfo = *(struct in_pktinfo*)CMSG_DATA(cmsg);
-+ /* XXX static buffer; if you add more inet_ntoa, or move this line up,
-+ * you'd need an other pair of strdup/free */
-+ str_local = inet_ntoa(info->pktinfo.ipi_addr);
-+ pktinfo_found = 1;
-+ }
-+ }
-+ }
-+ DEBUGMSGTL(("netsnmp_udp",
-+ "recvfrom fd %d got %d bytes (on %s from %s)\n",
-+ t->sock, rc, str_local, str));
-+ free(str);
-+ } else {
-+ DEBUGMSGTL(("netsnmp_udp", "recvfrom fd %d err %d (\"%s\")\n",
-+ t->sock, errno, strerror(errno)));
++ if (r == -1) {
++ return -1;
++ }
++
++ DEBUGMSGTL(("netsnmp_udp", "got source addr: %s\n", inet_ntoa(((struct sockaddr_in *)from)->sin_addr)));
++ for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) {
++ if (cmsgptr->cmsg_level == SOL_IP && cmsgptr->cmsg_type == IP_PKTINFO) {
++ memcpy((void *) dstip, netsnmp_dstaddr(cmsgptr), sizeof(struct in_addr));
++ DEBUGMSGTL(("netsnmp_udp", "got destination (local) addr %s\n",
++ inet_ntoa(*dstip)));
+ }
+ }
-+ return rc;
++ return r;
+}
+
++static int netsnmp_udp_sendto(int fd, struct in_addr *srcip, struct sockaddr *remote,
++ char *data, int len)
++{
++ struct iovec iov = { data, len };
++ struct {
++ struct cmsghdr cm;
++ struct in_pktinfo ipi;
++ } cmsg = {
++ .cm = {
++ .cmsg_len = sizeof(struct cmsghdr) + sizeof(struct in_pktinfo),
++ .cmsg_level = SOL_IP,
++ .cmsg_type = IP_PKTINFO,
++ },
++ .ipi = {
++ .ipi_ifindex = 0,
++ .ipi_spec_dst = srcip ? srcip->s_addr : 0,
++ },
++ };
++ struct msghdr m = {
++ .msg_name = remote,
++ .msg_namelen = sizeof(struct sockaddr_in),
++ .msg_iov = &iov,
++ .msg_iovlen = 1,
++ .msg_control = &cmsg,
++ .msg_controllen = sizeof(cmsg),
++ .msg_flags = 0,
++ };
++ return sendmsg(fd, &m, MSG_NOSIGNAL|MSG_DONTWAIT);
++}
++#endif /* IP_PKTINFO */
+
+ /*
+ * You can write something into opaque that will subsequently get passed back
+ * to your send function if you like. For instance, you might want to
+@@ -110,27 +192,33 @@
+ {
+ int rc = -1;
+ socklen_t fromlen = sizeof(struct sockaddr);
++ netsnmp_udp_addr_pair *addr_pair = NULL;
+ struct sockaddr *from;
+
+ if (t != NULL && t->sock >= 0) {
+- from = (struct sockaddr *) malloc(sizeof(struct sockaddr_in));
+- if (from == NULL) {
++ addr_pair = (netsnmp_udp_addr_pair *) malloc(sizeof(netsnmp_udp_addr_pair));
++ if (addr_pair == NULL) {
+ *opaque = NULL;
+ *olength = 0;
+ return -1;
+ } else {
+- memset(from, 0, fromlen);
++ memset(addr_pair, 0, sizeof(netsnmp_udp_addr_pair));
++ from = (struct sockaddr *) &(addr_pair->remote_addr);
+ }
+
+ while (rc < 0) {
+- rc = recvfrom(t->sock, buf, size, 0, from, &fromlen);
++#if defined IP_PKTINFO
++ rc = netsnmp_udp_recvfrom(t->sock, buf, size, from, &fromlen, &(addr_pair->local_addr));
++#else
++ rc = recvfrom(t->sock, buf, size, 0, from, &fromlen);
++#endif /* IP_PKTINFO */
+ if (rc < 0 && errno != EINTR) {
+ break;
+ }
+ }
+
+ if (rc >= 0) {
+- char *str = netsnmp_udp_fmtaddr(NULL, from, fromlen);
++ char *str = netsnmp_udp_fmtaddr(NULL, addr_pair, sizeof(netsnmp_udp_addr_pair));
+ DEBUGMSGTL(("netsnmp_udp",
+ "recvfrom fd %d got %d bytes (from %s)\n",
+ t->sock, rc, str));
+@@ -139,8 +227,8 @@
+ DEBUGMSGTL(("netsnmp_udp", "recvfrom fd %d err %d (\"%s\")\n",
+ t->sock, errno, strerror(errno)));
+ }
+- *opaque = (void *)from;
+- *olength = sizeof(struct sockaddr_in);
++ *opaque = (void *)addr_pair;
++ *olength = sizeof(netsnmp_udp_addr_pair);
+ }
+ return rc;
+ }
+@@ -152,24 +240,31 @@
+ void **opaque, int *olength)
+ {
+ int rc = -1;
++ netsnmp_udp_addr_pair *addr_pair = NULL;
+ struct sockaddr *to = NULL;
+
+ if (opaque != NULL && *opaque != NULL &&
+- *olength == sizeof(struct sockaddr_in)) {
+- to = (struct sockaddr *) (*opaque);
++ *olength == sizeof(netsnmp_udp_addr_pair)) {
++ addr_pair = (netsnmp_udp_addr_pair *) (*opaque);
+ } else if (t != NULL && t->data != NULL &&
+- t->data_length == sizeof(struct sockaddr_in)) {
+- to = (struct sockaddr *) (t->data);
++ t->data_length == sizeof(netsnmp_udp_addr_pair)) {
++ addr_pair = (netsnmp_udp_addr_pair *) (t->data);
+ }
+
++ to = (struct sockaddr *) &(addr_pair->remote_addr);
+
-+static int
-+netsnmp_udp_send(netsnmp_transport *t, void *buf, int size,
-+ void **opaque, int *olength)
-+{
-+ int rc = -1;
-+ struct sockaddr_in *to = NULL;
-+ struct _netsnmp_udp_info *info = NULL;
-+
-+ if (opaque != NULL && *opaque != NULL &&
-+ *olength == sizeof(struct _netsnmp_udp_info)) {
-+ info = (struct _netsnmp_udp_info *) (*opaque);
-+ to = &info->remote;
-+ } else if (t != NULL && t->data != NULL &&
-+ t->data_length == sizeof(struct sockaddr_in)) {
-+ to = (struct sockaddr_in *) (t->data);
+ if (to != NULL && t != NULL && t->sock >= 0) {
+- char *str = netsnmp_udp_fmtaddr(NULL, (void *) to,
+- sizeof(struct sockaddr_in));
++ char *str = netsnmp_udp_fmtaddr(NULL, (void *) addr_pair,
++ sizeof(netsnmp_udp_addr_pair));
+ DEBUGMSGTL(("netsnmp_udp", "send %d bytes from %p to %s on fd %d\n",
+ size, buf, str, t->sock));
+ free(str);
+ while (rc < 0) {
+- rc = sendto(t->sock, buf, size, 0, to, sizeof(struct sockaddr));
++#if defined IP_PKTINFO
++ rc = netsnmp_udp_sendto(t->sock, addr_pair ? &(addr_pair->local_addr) : NULL, to, buf, size);
++#else
++ rc = sendto(t->sock, buf, size, 0, to, sizeof(struct sockaddr));
++#endif /* IP_PKTINFO */
+ if (rc < 0 && errno != EINTR) {
+ DEBUGMSGTL(("netsnmp_udp", "sendto error, rc %d (errno %d)\n",
+ rc, errno));
+@@ -486,18 +581,26 @@
+ int rc = 0;
+ char *str = NULL;
+ char *client_socket = NULL;
++ netsnmp_udp_addr_pair *addr_pair = NULL;
+
+ if (addr == NULL || addr->sin_family != AF_INET) {
+ return NULL;
+ }
+
++ addr_pair = (struct udp_addr_pair *) malloc(sizeof(netsnmp_udp_addr_pair));
++ if (addr_pair == NULL) {
++ return NULL;
+ }
-+ if (to != NULL && t != NULL && t->sock >= 0) {
-+ char *str = netsnmp_udp_fmtaddr(NULL, (void *) to,
-+ sizeof(struct sockaddr_in));
-+ char *str_local = "DEFAULT";
-+ struct msghdr msg;
-+ struct iovec iov;
++ memset(addr_pair, 0, sizeof(netsnmp_udp_addr_pair));
++ memcpy(&(addr_pair->remote_addr), addr, sizeof(struct sockaddr_in));
+
-+ iov.iov_base=buf;
-+ iov.iov_len=size;
-+
-+ msg.msg_name=(caddr_t)to;
-+ msg.msg_namelen=(uint)sizeof(*to);
-+ msg.msg_iov=&iov;
-+ msg.msg_iovlen=1;
-+ msg.msg_control = NULL;
-+ msg.msg_controllen = 0;
-+ msg.msg_flags=0;
-+ if (info) {
-+ info->cmsg.cmsg_len = sizeof(info->cmsg) + sizeof(info->pktinfo);
-+ info->cmsg.cmsg_level = SOL_IP;
-+ info->cmsg.cmsg_type = IP_PKTINFO;
-+ msg.msg_control = &info->cmsg;
-+ msg.msg_controllen = info->cmsg.cmsg_len;
-+ str_local = inet_ntoa(info->pktinfo.ipi_addr);
-+ }
-+ DEBUGMSGTL(("netsnmp_udp", "send %d bytes from %p with src ip %s to %s on fd %d\n",
-+ size, buf, str_local, str, t->sock));
-+ free(str);
-+ while (rc < 0) {
-+ rc = sendmsg(t->sock, &msg, 0);
-+ if (rc < 0 && errno != EINTR) {
-+ break;
-+ }
-+ }
-+ }
-+ return rc;
-+}
-+#endif
+ t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport));
+ if (t == NULL) {
+ return NULL;
+ }
+- str = netsnmp_udp_fmtaddr(NULL, (void *)addr,
+- sizeof(struct sockaddr_in));
++ str = netsnmp_udp_fmtaddr(NULL, (void *)addr_pair,
++ sizeof(netsnmp_udp_addr_pair));
+ DEBUGMSGTL(("netsnmp_udp", "open %s %s:%d\n", local ? "local" : "remote",
+ str,addr->sin_port));
+ free(str);
+@@ -532,6 +635,18 @@
+ t->local[5] = (htons(addr->sin_port) & 0x00ff) >> 0;
+ t->local_length = 6;
- static int
-@@ -625,6 +770,17 @@
- }
- #endif /*SO_REUSEADDR */
- #endif
+#ifdef IP_PKTINFO
-+ /*
-+ * if we have multiple ip aliases, send back on the ip we received with.
-+ */
-+ {
-+ int one = 1;
-+ DEBUGMSGTL(("socket:option", "setting socket option IP_PKTINFO\n"));
-+ setsockopt(fd, SOL_IP, IP_PKTINFO, (void *) &one,
-+ sizeof(one));
-+ }
-+#endif /*IP_PKTINFO */
++ {
++ int sockopt = 1;
++ int sockoptlen = sizeof(int);
++ if (setsockopt(t->sock, SOL_IP, IP_PKTINFO, &sockopt, sizeof sockopt) == -1) {
++ DEBUGMSGTL(("netsnmp_udp", "couldn't set IP_PKTINFO: %s\n",
++ strerror(errno)));
++ return NULL;
++ }
++ DEBUGMSGTL(("netsnmp_udp", "set IP_PKTINFO\n"));
++ }
++#endif
+ rc = bind(t->sock, (struct sockaddr *) addr,
+ sizeof(struct sockaddr));
+ if (rc != 0) {
+@@ -561,7 +676,7 @@
+ * transport-specific data pointer for later use by netsnmp_udp_send.
+ */
+- t->data = malloc(sizeof(struct sockaddr_in));
++ t->data = malloc(sizeof(netsnmp_udp_addr_pair));
+ t->remote = malloc(6);
+ if (t->data == NULL || t->remote == NULL) {
+ netsnmp_transport_free(t);
+@@ -571,8 +686,8 @@
+ t->remote[4] = (htons(addr->sin_port) & 0xff00) >> 8;
+ t->remote[5] = (htons(addr->sin_port) & 0x00ff) >> 0;
+ t->remote_length = 6;
+- memcpy(t->data, addr, sizeof(struct sockaddr_in));
+- t->data_length = sizeof(struct sockaddr_in);
++ memcpy(t->data, addr_pair, sizeof(netsnmp_udp_addr_pair));
++ t->data_length = sizeof(netsnmp_udp_addr_pair);
+ }
+
/*
- * Try to set the send and receive buffers to a reasonably large value, so
-@@ -991,7 +1147,7 @@
+@@ -993,7 +1108,8 @@
char **contextName)
{
com2SecEntry *c;
- struct sockaddr_in *from = (struct sockaddr_in *) opaque;
-+ struct sockaddr_in *from = NULL;
++ netsnmp_udp_addr_pair *addr_pair = (netsnmp_udp_addr_pair *) opaque;
++ struct sockaddr_in *from = (struct sockaddr_in *) &(addr_pair->remote_addr);
char *ztcommunity = NULL;
if (secName != NULL) {
-@@ -1008,13 +1164,19 @@
- return 0;
- }
-
-+#ifdef IP_PKTINFO
-+ if (opaque && olength == sizeof(struct _netsnmp_udp_info))
-+ from = &((struct _netsnmp_udp_info *)opaque)->remote;
-+#else
-+ if (opaque && olength == sizeof(struct sockaddr_in))
-+ from = (struct sockaddr_in *) opaque;
-+#endif
- /*
- * If there is no IPv4 source address, then there can be no valid security
+@@ -1015,7 +1131,7 @@
* name.
*/
- if (opaque == NULL || olength != sizeof(struct sockaddr_in) ||
-- from->sin_family != AF_INET) {
-+ if (from == NULL || from->sin_family != AF_INET) {
++ if (opaque == NULL || olength != sizeof(netsnmp_udp_addr_pair) ||
+ from->sin_family != AF_INET) {
DEBUGMSGTL(("netsnmp_udp_getSecName",
"no IPv4 source address in PDU?\n"));
- return 1;
More information about the Pkg-net-snmp-commits
mailing list