Make this change for all internal transport functions that will need
the network interface information. This patch does not change any
functionality.
---
 include/net-snmp/library/snmpDTLSUDPDomain.h  |  4 +-
 include/net-snmp/library/snmpTCPDomain.h      |  4 +-
 include/net-snmp/library/snmpTCPIPv6Domain.h  |  4 +-
 include/net-snmp/library/snmpUDPDomain.h      |  8 +-
 .../net-snmp/library/snmpUDPIPv4BaseDomain.h  | 12 +--
 include/net-snmp/library/snmpUDPIPv6Domain.h  | 11 +--
 .../net-snmp/library/snmpUDPsharedDomain.h    |  6 +-
 snmplib/transports/snmpDTLSUDPDomain.c        | 36 ++++----
 snmplib/transports/snmpIPv6BaseDomain.c       |  6 +-
 snmplib/transports/snmpTCPDomain.c            | 17 ++--
 snmplib/transports/snmpTCPIPv6Domain.c        | 17 ++--
 snmplib/transports/snmpUDPDomain.c            | 22 ++---
 snmplib/transports/snmpUDPIPv4BaseDomain.c    | 45 ++++++----
 snmplib/transports/snmpUDPIPv6Domain.c        | 57 ++++++------
 snmplib/transports/snmpUDPsharedDomain.c      | 90 +++++++++----------
 15 files changed, 177 insertions(+), 162 deletions(-)

diff --git a/include/net-snmp/library/snmpDTLSUDPDomain.h 
b/include/net-snmp/library/snmpDTLSUDPDomain.h
index 97c5d58f31a2..5a60eeea0c22 100644
--- a/include/net-snmp/library/snmpDTLSUDPDomain.h
+++ b/include/net-snmp/library/snmpDTLSUDPDomain.h
@@ -19,8 +19,8 @@ extern          "C" {
 NETSNMP_IMPORT oid netsnmpDTLSUDPDomain[7];
 NETSNMP_IMPORT size_t netsnmpDTLSUDPDomain_len;
 
-netsnmp_transport *netsnmp_dtlsudp_transport(const struct sockaddr_in *addr,
-                                             int local);
+netsnmp_transport *
+netsnmp_dtlsudp_transport(const struct netsnmp_ep *ep, int local);
 
 
 /*
diff --git a/include/net-snmp/library/snmpTCPDomain.h 
b/include/net-snmp/library/snmpTCPDomain.h
index 44c62e6994d4..a7bf42e56463 100644
--- a/include/net-snmp/library/snmpTCPDomain.h
+++ b/include/net-snmp/library/snmpTCPDomain.h
@@ -25,8 +25,8 @@ extern          "C" {
 #define TRANSPORT_DOMAIN_TCP_IP                1,3,6,1,2,1,100,1,5
 NETSNMP_IMPORT oid netsnmp_snmpTCPDomain[];
 
-netsnmp_transport *netsnmp_tcp_transport(const struct sockaddr_in *addr,
-                                         int local);
+netsnmp_transport *
+netsnmp_tcp_transport(const struct netsnmp_ep *ep, int local);
 
 /*
  * "Constructor" for transport domain object.  
diff --git a/include/net-snmp/library/snmpTCPIPv6Domain.h 
b/include/net-snmp/library/snmpTCPIPv6Domain.h
index 5499900314df..afab8e084029 100644
--- a/include/net-snmp/library/snmpTCPIPv6Domain.h
+++ b/include/net-snmp/library/snmpTCPIPv6Domain.h
@@ -23,8 +23,8 @@ extern          "C" {
 #define TRANSPORT_DOMAIN_TCP_IPV6      1,3,6,1,2,1,100,1,6
 NETSNMP_IMPORT oid      netsnmp_TCPIPv6Domain[];
 
-netsnmp_transport *netsnmp_tcp6_transport(const struct sockaddr_in6 *addr,
-                                         int local);
+netsnmp_transport *
+netsnmp_tcp6_transport(const struct netsnmp_ep *ep, int local);
 
 /*
  * "Constructor" for transport domain object.  
diff --git a/include/net-snmp/library/snmpUDPDomain.h 
b/include/net-snmp/library/snmpUDPDomain.h
index 9cd203aa8f7c..5cc8b68b6f88 100644
--- a/include/net-snmp/library/snmpUDPDomain.h
+++ b/include/net-snmp/library/snmpUDPDomain.h
@@ -24,14 +24,14 @@ extern          "C" {
 config_require(UDPIPv4Base)
 #include <net-snmp/library/snmpUDPIPv4BaseDomain.h>
 
-netsnmp_transport *netsnmp_udp_transport(const struct sockaddr_in *addr,
-                                         int local);
+netsnmp_transport *
+netsnmp_udp_transport(const struct netsnmp_ep *ep, int local);
 
 netsnmp_transport *netsnmp_udp_create_tspec(netsnmp_tdomain_spec *tspec);
 
 netsnmp_transport *
-netsnmp_udp_transport_with_source(const struct sockaddr_in *addr, int local,
-                                  const struct sockaddr_in *src_addr);
+netsnmp_udp_transport_with_source(const struct netsnmp_ep *ep, int local,
+                                  const struct netsnmp_ep *src_addr);
 
 #define C2SE_ERR_SUCCESS             0
 #define C2SE_ERR_MISSING_ARG        -1
diff --git a/include/net-snmp/library/snmpUDPIPv4BaseDomain.h 
b/include/net-snmp/library/snmpUDPIPv4BaseDomain.h
index 60bd3218303c..ff6e16362562 100644
--- a/include/net-snmp/library/snmpUDPIPv4BaseDomain.h
+++ b/include/net-snmp/library/snmpUDPIPv4BaseDomain.h
@@ -29,20 +29,20 @@ extern          "C" {
  * Prototypes
  */
 
-    netsnmp_transport *netsnmp_udpipv4base_transport(const struct sockaddr_in 
*addr,
-                                                     int local);
+    netsnmp_transport *
+    netsnmp_udpipv4base_transport(const struct netsnmp_ep *ep, int local);
 
     netsnmp_transport *
-    netsnmp_udpipv4base_transport_with_source(const struct sockaddr_in *addr,
+    netsnmp_udpipv4base_transport_with_source(const struct netsnmp_ep *ep,
                                               int local,
-                                              const struct sockaddr_in 
*src_addr);
+                                              const struct netsnmp_ep 
*src_addr);
 
     netsnmp_transport *
     netsnmp_udpipv4base_tspec_transport(netsnmp_tdomain_spec *tspec);
 
     /** internal functions for derivatives of udpipv4base */
     netsnmp_transport *
-    netsnmp_udpipv4base_transport_init(const struct sockaddr_in *addr,
+    netsnmp_udpipv4base_transport_init(const struct netsnmp_ep *ep,
                                        int local);
 
     int
@@ -50,7 +50,7 @@ extern          "C" {
 
     int
     netsnmp_udpipv4base_transport_bind(netsnmp_transport *t,
-                                       const struct sockaddr_in *addr,
+                                       const struct netsnmp_ep *ep,
                                        int flags);
 
     void
diff --git a/include/net-snmp/library/snmpUDPIPv6Domain.h 
b/include/net-snmp/library/snmpUDPIPv6Domain.h
index 39ed0df796f7..883bfdbd8f47 100644
--- a/include/net-snmp/library/snmpUDPIPv6Domain.h
+++ b/include/net-snmp/library/snmpUDPIPv6Domain.h
@@ -29,24 +29,25 @@ config_require(UDPBase)
 #define TRANSPORT_DOMAIN_UDP_IPV6      1,3,6,1,2,1,100,1,2
 NETSNMP_IMPORT oid      netsnmp_UDPIPv6Domain[];
 
-netsnmp_transport *netsnmp_udp6_transport(const struct sockaddr_in6 *addr,
+netsnmp_transport *netsnmp_udp6_transport(const struct netsnmp_ep *ep,
                                           int local);
 
 netsnmp_transport *
-netsnmp_udp6_transport_with_source(const struct sockaddr_in6 *addr, int local,
-                                   const struct sockaddr_in6 *src_addr);
+netsnmp_udp6_transport_with_source(const struct netsnmp_ep *ep, int local,
+                                   const struct netsnmp_ep *src_addr);
 
     /** internal functions for derivatives of udpipv6 */
 
     netsnmp_transport *
-    netsnmp_udp6_transport_init(const struct sockaddr_in6 *addr, int local);
+    netsnmp_udp6_transport_init(const struct netsnmp_ep *ep, int local);
 
     int
     netsnmp_udp6_transport_socket(int flags);
 
     int
     netsnmp_udp6_transport_bind(netsnmp_transport *t,
-                                const struct sockaddr_in6 *addr, int flags);
+                                const struct netsnmp_ep *ep,
+                                int flags);
 
     void
     netsnmp_udp6_transport_get_bound_addr(netsnmp_transport *t);
diff --git a/include/net-snmp/library/snmpUDPsharedDomain.h 
b/include/net-snmp/library/snmpUDPsharedDomain.h
index 3a57ca5e0be7..3df9c9a24925 100644
--- a/include/net-snmp/library/snmpUDPsharedDomain.h
+++ b/include/net-snmp/library/snmpUDPsharedDomain.h
@@ -33,13 +33,13 @@ extern          "C" {
      */
     void            netsnmp_udpshared_ctor(void);
 
-    netsnmp_transport *netsnmp_udpshared_transport(const struct sockaddr_in 
*addr,
+    netsnmp_transport *netsnmp_udpshared_transport(const struct netsnmp_ep *ep,
                                                    int local);
 
     netsnmp_transport *
-    netsnmp_udpshared_transport_with_source(const struct sockaddr_in *addr,
+    netsnmp_udpshared_transport_with_source(const struct netsnmp_ep *ep,
                                             int local,
-                                            const struct sockaddr_in 
*src_addr);
+                                            const struct netsnmp_ep *src_addr);
 
 #ifdef __cplusplus
 }
diff --git a/snmplib/transports/snmpDTLSUDPDomain.c 
b/snmplib/transports/snmpDTLSUDPDomain.c
index 7a8663def58d..ca311276ac6d 100644
--- a/snmplib/transports/snmpDTLSUDPDomain.c
+++ b/snmplib/transports/snmpDTLSUDPDomain.c
@@ -23,6 +23,7 @@
 netsnmp_feature_require(cert_util)
 netsnmp_feature_require(sockaddr_size)
 
+#include <net-snmp/library/snmpIPBaseDomain.h>
 #include <net-snmp/library/snmpDTLSUDPDomain.h>
 #include <net-snmp/library/snmpUDPIPv6Domain.h>
 #include <net-snmp/library/snmp_assert.h>
@@ -1494,13 +1495,14 @@ _transport_common(netsnmp_transport *t, int local)
 }
 
 netsnmp_transport *
-netsnmp_dtlsudp_transport(const struct sockaddr_in *addr, int local)
+netsnmp_dtlsudp_transport(const struct netsnmp_ep *ep, int local)
 {
+    const struct sockaddr_in *addr = &ep->a.sin;
     netsnmp_transport *t = NULL;
 
     DEBUGTRACETOK("dtlsudp");
 
-    t = netsnmp_udp_transport(addr, local);
+    t = netsnmp_udp_transport(ep, local);
     if (NULL == t)
         return NULL;
 
@@ -1532,13 +1534,14 @@ netsnmp_dtlsudp6_fmtaddr(netsnmp_transport *t, const 
void *data, int len)
  */
 
 netsnmp_transport *
-netsnmp_dtlsudp6_transport(const struct sockaddr_in6 *addr, int local)
+netsnmp_dtlsudp6_transport(const struct netsnmp_ep *ep, int local)
 {
+    const struct sockaddr_in6 *addr = &ep->a.sin6;
     netsnmp_transport *t = NULL;
 
     DEBUGTRACETOK("dtlsudp");
 
-    t = netsnmp_udp6_transport(addr, local);
+    t = netsnmp_udp6_transport(ep, local);
     if (NULL == t)
         return NULL;
 
@@ -1565,19 +1568,16 @@ netsnmp_transport *
 netsnmp_dtlsudp_create_tstring(const char *str, int isserver,
                                const char *default_target)
 {
-#ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    struct sockaddr_in6 addr6;
-#endif
-    struct sockaddr_in addr;
+    struct netsnmp_ep ep;
     netsnmp_transport *t;
     _netsnmpTLSBaseData *tlsdata;
     char buf[SPRINT_MAX_LEN], *cp;
 
-    if (netsnmp_sockaddr_in2(&addr, str, default_target))
-        t = netsnmp_dtlsudp_transport(&addr, isserver);
+    if (netsnmp_sockaddr_in3(&ep, str, default_target))
+        t = netsnmp_dtlsudp_transport(&ep, isserver);
 #ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    else if (netsnmp_sockaddr_in6_2(&addr6, str, default_target))
-        t = netsnmp_dtlsudp6_transport(&addr6, isserver);
+    else if (netsnmp_sockaddr_in6_3(&ep, str, default_target))
+        t = netsnmp_dtlsudp6_transport(&ep, isserver);
 #endif
     else
         return NULL;
@@ -1603,14 +1603,14 @@ netsnmp_dtlsudp_create_tstring(const char *str, int 
isserver,
 netsnmp_transport *
 netsnmp_dtlsudp_create_ostring(const void *o, size_t o_len, int local)
 {
-    struct sockaddr_in sin;
-    struct sockaddr_in6 sin6;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_ipv4_ostring_to_sockaddr(&sin, o, o_len))
-        return netsnmp_dtlsudp_transport(&sin, local);
+    memset(&ep, 0, sizeof(ep));
+    if (netsnmp_ipv4_ostring_to_sockaddr(&ep.a.sin, o, o_len))
+        return netsnmp_dtlsudp_transport(&ep, local);
 #ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    else if (netsnmp_ipv6_ostring_to_sockaddr(&sin6, o, o_len))
-        return netsnmp_dtlsudp6_transport(&sin6, local);
+    else if (netsnmp_ipv6_ostring_to_sockaddr(&ep.a.sin6, o, o_len))
+        return netsnmp_dtlsudp6_transport(&ep, local);
 #endif
     else
         return NULL;
diff --git a/snmplib/transports/snmpIPv6BaseDomain.c 
b/snmplib/transports/snmpIPv6BaseDomain.c
index 8e2fb8c86dd3..c2baacc5d42c 100644
--- a/snmplib/transports/snmpIPv6BaseDomain.c
+++ b/snmplib/transports/snmpIPv6BaseDomain.c
@@ -248,13 +248,13 @@ int
 netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr,
                        const char *inpeername, const char *default_target)
 {
-    struct netsnmp_ep ai;
+    struct netsnmp_ep ep;
     int ret;
 
-    ret = netsnmp_sockaddr_in6_3(&ai, inpeername, default_target);
+    ret = netsnmp_sockaddr_in6_3(&ep, inpeername, default_target);
     if (ret == 0)
         return 0;
-    *addr = ai.a.sin6;
+    *addr = ep.a.sin6;
     return ret;
 }
 
diff --git a/snmplib/transports/snmpTCPDomain.c 
b/snmplib/transports/snmpTCPDomain.c
index a753b93b6803..ac9b66a16fd5 100644
--- a/snmplib/transports/snmpTCPDomain.c
+++ b/snmplib/transports/snmpTCPDomain.c
@@ -1,6 +1,7 @@
 #include <net-snmp/net-snmp-config.h>
 
 #include <net-snmp/types.h>
+#include <net-snmp/library/snmpIPBaseDomain.h>
 #include <net-snmp/library/snmpTCPDomain.h>
 
 #include <stdio.h>
@@ -149,8 +150,9 @@ netsnmp_tcp_accept(netsnmp_transport *t)
  */
 
 netsnmp_transport *
-netsnmp_tcp_transport(const struct sockaddr_in *addr, int local)
+netsnmp_tcp_transport(const struct netsnmp_ep *ep, int local)
 {
+    const struct sockaddr_in *addr = &ep->a.sin;
     netsnmp_transport *t = NULL;
     netsnmp_udp_addr_pair *addr_pair = NULL;
     int rc = 0;
@@ -308,10 +310,10 @@ netsnmp_transport *
 netsnmp_tcp_create_tstring(const char *str, int local,
                           const char *default_target)
 {
-    struct sockaddr_in addr;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_sockaddr_in2(&addr, str, default_target)) {
-        return netsnmp_tcp_transport(&addr, local);
+    if (netsnmp_sockaddr_in3(&ep, str, default_target)) {
+        return netsnmp_tcp_transport(&ep, local);
     } else {
         return NULL;
     }
@@ -322,10 +324,11 @@ netsnmp_tcp_create_tstring(const char *str, int local,
 netsnmp_transport *
 netsnmp_tcp_create_ostring(const void *o, size_t o_len, int local)
 {
-    struct sockaddr_in sin;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_ipv4_ostring_to_sockaddr(&sin, o, o_len))
-        return netsnmp_tcp_transport(&sin, local);
+    memset(&ep, 0, sizeof(ep));
+    if (netsnmp_ipv4_ostring_to_sockaddr(&ep.a.sin, o, o_len))
+        return netsnmp_tcp_transport(&ep, local);
     return NULL;
 }
 
diff --git a/snmplib/transports/snmpTCPIPv6Domain.c 
b/snmplib/transports/snmpTCPIPv6Domain.c
index 8ff782f5270e..cdff5fab6843 100644
--- a/snmplib/transports/snmpTCPIPv6Domain.c
+++ b/snmplib/transports/snmpTCPIPv6Domain.c
@@ -3,6 +3,7 @@
 #ifdef NETSNMP_TRANSPORT_TCPIPV6_DOMAIN
 
 #include <net-snmp/types.h>
+#include <net-snmp/library/snmpIPBaseDomain.h>
 #include <net-snmp/library/snmpTCPIPv6Domain.h>
 
 #include <stdio.h>
@@ -140,8 +141,9 @@ netsnmp_tcp6_accept(netsnmp_transport *t)
  */
 
 netsnmp_transport *
-netsnmp_tcp6_transport(const struct sockaddr_in6 *addr, int local)
+netsnmp_tcp6_transport(const struct netsnmp_ep *ep, int local)
 {
+    const struct sockaddr_in6 *addr = &ep->a.sin6;
     netsnmp_transport *t = NULL;
     int             rc = 0;
     int             socket_initialized = 0;
@@ -312,10 +314,10 @@ netsnmp_transport *
 netsnmp_tcp6_create_tstring(const char *str, int local,
                            const char *default_target)
 {
-    struct sockaddr_in6 addr;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_sockaddr_in6_2(&addr, str, default_target)) {
-        return netsnmp_tcp6_transport(&addr, local);
+    if (netsnmp_sockaddr_in6_3(&ep, str, default_target)) {
+        return netsnmp_tcp6_transport(&ep, local);
     } else {
         return NULL;
     }
@@ -334,10 +336,11 @@ netsnmp_tcp6_create_tstring(const char *str, int local,
 netsnmp_transport *
 netsnmp_tcp6_create_ostring(const void *o, size_t o_len, int local)
 {
-    struct sockaddr_in6 sin6;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_ipv6_ostring_to_sockaddr(&sin6, o, o_len))
-        return netsnmp_tcp6_transport(&sin6, local);
+    memset(&ep, 0, sizeof(ep));
+    if (netsnmp_ipv6_ostring_to_sockaddr(&ep.a.sin6, o, o_len))
+        return netsnmp_tcp6_transport(&ep, local);
     return NULL;
 }
 
diff --git a/snmplib/transports/snmpUDPDomain.c 
b/snmplib/transports/snmpUDPDomain.c
index 779105b0f6ec..4ea942097aff 100644
--- a/snmplib/transports/snmpUDPDomain.c
+++ b/snmplib/transports/snmpUDPDomain.c
@@ -17,6 +17,7 @@
 #include <net-snmp/net-snmp-config.h>
 
 #include <net-snmp/types.h>
+#include <net-snmp/library/snmpIPBaseDomain.h>
 #include <net-snmp/library/snmpUDPDomain.h>
 #include <net-snmp/library/snmpUDPIPv4BaseDomain.h>
 
@@ -157,11 +158,11 @@ netsnmp_udp_transport_base(netsnmp_transport *t)
  * the remote address to send things to.
  */
 netsnmp_transport *
-netsnmp_udp_transport(const struct sockaddr_in *addr, int local)
+netsnmp_udp_transport(const struct netsnmp_ep *ep, int local)
 {
     netsnmp_transport *t = NULL;
 
-    t = netsnmp_udpipv4base_transport(addr, local);
+    t = netsnmp_udpipv4base_transport(ep, local);
     if (NULL != t) {
         netsnmp_udp_transport_base(t);
     }
@@ -175,13 +176,13 @@ netsnmp_udp_transport(const struct sockaddr_in *addr, int 
local)
  * to send from.
  */
 netsnmp_transport *
-netsnmp_udp_transport_with_source(const struct sockaddr_in *addr, int local,
-                                  const struct sockaddr_in *src_addr)
+netsnmp_udp_transport_with_source(const struct netsnmp_ep *ep, int local,
+                                  const struct netsnmp_ep *src_addr)
 
 {
     netsnmp_transport *t = NULL;
 
-    t = netsnmp_udpipv4base_transport_with_source(addr, local, src_addr);
+    t = netsnmp_udpipv4base_transport_with_source(ep, local, src_addr);
     if (NULL != t) {
         netsnmp_udp_transport_base(t);
     }
@@ -606,9 +607,9 @@ netsnmp_transport *
 netsnmp_udp_create_tstring(const char *str, int local,
                           const char *default_target)
 {
-    struct sockaddr_in addr;
+    struct netsnmp_ep addr;
 
-    if (netsnmp_sockaddr_in2(&addr, str, default_target)) {
+    if (netsnmp_sockaddr_in3(&addr, str, default_target)) {
         return netsnmp_udp_transport(&addr, local);
     } else {
         return NULL;
@@ -629,10 +630,11 @@ netsnmp_udp_create_tspec(netsnmp_tdomain_spec *tspec)
 netsnmp_transport *
 netsnmp_udp_create_ostring(const void *o, size_t o_len, int local)
 {
-    struct sockaddr_in sin;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_ipv4_ostring_to_sockaddr(&sin, o, o_len))
-        return netsnmp_udp_transport(&sin, local);
+    memset(&ep, 0, sizeof(ep));
+    if (netsnmp_ipv4_ostring_to_sockaddr(&ep.a.sin, o, o_len))
+        return netsnmp_udp_transport(&ep, local);
     return NULL;
 }
 
diff --git a/snmplib/transports/snmpUDPIPv4BaseDomain.c 
b/snmplib/transports/snmpUDPIPv4BaseDomain.c
index 433eb809bb91..7f8b68108d6d 100644
--- a/snmplib/transports/snmpUDPIPv4BaseDomain.c
+++ b/snmplib/transports/snmpUDPIPv4BaseDomain.c
@@ -13,6 +13,7 @@
 #include <net-snmp/net-snmp-config.h>
 
 #include <net-snmp/types.h>
+#include <net-snmp/library/snmpIPBaseDomain.h>
 #include <net-snmp/library/snmpUDPIPv4BaseDomain.h>
 
 #include <stddef.h>
@@ -72,9 +73,10 @@ int netsnmp_udpipv4_sendto(int fd, const struct in_addr 
*srcip, int if_index,
 #endif /* HAVE_IP_PKTINFO || HAVE_IP_RECVDSTADDR */
 
 netsnmp_transport *
-netsnmp_udpipv4base_transport_init(const struct sockaddr_in *addr, int local)
+netsnmp_udpipv4base_transport_init(const struct netsnmp_ep *ep, int local)
 {
     netsnmp_transport *t;
+    const struct sockaddr_in *addr = &ep->a.sin;
     u_char *addr_ptr;
 
     if (addr == NULL || addr->sin_family != AF_INET) {
@@ -152,8 +154,10 @@ netsnmp_udpipv4base_transport_socket(int flags)
 
 int
 netsnmp_udpipv4base_transport_bind(netsnmp_transport *t,
-                                   const struct sockaddr_in *addr, int flags)
+                                   const struct netsnmp_ep *ep,
+                                   int flags)
 {
+    const struct sockaddr_in *addr = &ep->a.sin;
 #if defined(HAVE_IP_PKTINFO) || defined(HAVE_IP_RECVDSTADDR)
     int                sockopt = 1;
 #endif
@@ -247,20 +251,20 @@ 
netsnmp_udpipv4base_transport_get_bound_addr(netsnmp_transport *t)
 }
 
 netsnmp_transport *
-netsnmp_udpipv4base_transport_with_source(const struct sockaddr_in *addr,
+netsnmp_udpipv4base_transport_with_source(const struct netsnmp_ep *ep,
                                           int local,
-                                          const struct sockaddr_in *src_addr)
+                                          const struct netsnmp_ep *src_addr)
 {
     netsnmp_transport         *t = NULL;
-    const struct sockaddr_in  *bind_addr;
+    const struct netsnmp_ep   *bind_addr;
     int                        rc, flags = 0;
 
-    t = netsnmp_udpipv4base_transport_init(addr, local);
+    t = netsnmp_udpipv4base_transport_init(ep, local);
     if (NULL == t)
          return NULL;
 
     if (local) {
-        bind_addr = addr;
+        bind_addr = ep;
         flags |= NETSNMP_TSPEC_LOCAL;
 
 #ifndef NETSNMP_NO_SYSTEMD
@@ -288,7 +292,7 @@ netsnmp_udpipv4base_transport_with_source(const struct 
sockaddr_in *addr,
     if (NULL == bind_addr)
         return t;
 
-    rc = netsnmp_udpipv4base_transport_bind(t, bind_addr, flags);
+    rc = netsnmp_udpipv4base_transport_bind(t, ep, flags);
     if (rc) {
         netsnmp_transport_free(t);
         t = NULL;
@@ -302,7 +306,7 @@ netsnmp_udpipv4base_transport_with_source(const struct 
sockaddr_in *addr,
 netsnmp_transport *
 netsnmp_udpipv4base_tspec_transport(netsnmp_tdomain_spec *tspec)
 {
-    struct sockaddr_in addr;
+    struct netsnmp_ep addr;
     int local;
 
     if (NULL == tspec)
@@ -311,15 +315,17 @@ netsnmp_udpipv4base_tspec_transport(netsnmp_tdomain_spec 
*tspec)
     local = tspec->flags & NETSNMP_TSPEC_LOCAL;
 
     /** get address from target */
-    if (!netsnmp_sockaddr_in2(&addr, tspec->target, tspec->default_target))
+    if (!netsnmp_sockaddr_in3(&addr, tspec->target, tspec->default_target))
         return NULL;
 
     if (NULL != tspec->source) {
-        struct sockaddr_in src_addr, *srcp = &src_addr;
+        struct netsnmp_ep src_addr;
+
         /** get sockaddr from source */
-        if (!netsnmp_sockaddr_in2(&src_addr, tspec->source, NULL))
+        if (!netsnmp_sockaddr_in3(&src_addr, tspec->source, NULL))
             return NULL;
-        return netsnmp_udpipv4base_transport_with_source(&addr, local, srcp);
+        return netsnmp_udpipv4base_transport_with_source(&addr, local,
+                                                         &src_addr);
      } else {
         /** if no source and we do not want any default client address */
         if (tspec->flags & NETSNMP_TSPEC_NO_DFTL_CLIENT_ADDR)
@@ -332,7 +338,8 @@ netsnmp_udpipv4base_tspec_transport(netsnmp_tdomain_spec 
*tspec)
 }
 
 netsnmp_transport *
-netsnmp_udpipv4base_transport(const struct sockaddr_in *addr, int local)
+netsnmp_udpipv4base_transport(const struct netsnmp_ep *ep,
+                              int local)
 {
     if (!local) {
         /*
@@ -344,7 +351,7 @@ netsnmp_udpipv4base_transport(const struct sockaddr_in 
*addr, int local)
         client_socket = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
                                               NETSNMP_DS_LIB_CLIENT_ADDR);
         if (client_socket) {
-            struct sockaddr_in client_addr;
+            struct netsnmp_ep client_addr;
             char *client_address = NETSNMP_REMOVE_CONST(char *,client_socket);
             int have_port, rc;
             int uses_port =
@@ -364,16 +371,16 @@ netsnmp_udpipv4base_transport(const struct sockaddr_in 
*addr, int local)
                 strcat(client_address, ":0");
                 have_port = 1;
             }
-            rc = netsnmp_sockaddr_in2(&client_addr, client_socket, NULL);
+            rc = netsnmp_sockaddr_in3(&client_addr, client_socket, NULL);
             if (client_address != client_socket)
                 free(client_address);
             if(rc) {
                 if (!uses_port || !have_port) /* if port isn't from string, */
-                    client_addr.sin_port = 0; /* ... clear it */
-                return netsnmp_udpipv4base_transport_with_source(addr, local,
+                    client_addr.a.sin.sin_port = 0; /* ... clear it */
+                return netsnmp_udpipv4base_transport_with_source(ep, local,
                                                                  &client_addr);
             }
         }
     }
-    return netsnmp_udpipv4base_transport_with_source(addr, local, NULL);
+    return netsnmp_udpipv4base_transport_with_source(ep, local, NULL);
 }
diff --git a/snmplib/transports/snmpUDPIPv6Domain.c 
b/snmplib/transports/snmpUDPIPv6Domain.c
index 7a3b1db15c67..1f8c3765f21d 100644
--- a/snmplib/transports/snmpUDPIPv6Domain.c
+++ b/snmplib/transports/snmpUDPIPv6Domain.c
@@ -6,6 +6,7 @@
  */
 #include <net-snmp/net-snmp-config.h>
 
+#include <net-snmp/library/snmpIPBaseDomain.h>
 #include <net-snmp/library/snmpUDPIPv6Domain.h>
 #include <net-snmp/library/system.h>
 
@@ -191,8 +192,9 @@ netsnmp_udp6_send(netsnmp_transport *t, const void *buf, 
int size,
  */
 
 netsnmp_transport *
-netsnmp_udp6_transport_init(const struct sockaddr_in6 *addr, int flags)
+netsnmp_udp6_transport_init(const struct netsnmp_ep *ep, int flags)
 {
+    const struct sockaddr_in6 *addr = &ep->a.sin6;
     netsnmp_transport *t = NULL;
     int             local = flags & NETSNMP_TSPEC_LOCAL;
     u_char         *addr_ptr;
@@ -274,9 +276,10 @@ netsnmp_udp6_transport_init(const struct sockaddr_in6 
*addr, int flags)
 
 int
 netsnmp_udp6_transport_bind(netsnmp_transport *t,
-                            const struct sockaddr_in6 *addr,
+                            const struct netsnmp_ep *ep,
                             int flags)
 {
+    const struct sockaddr_in6 *addr = &ep->a.sin6;
     int             local = flags & NETSNMP_TSPEC_LOCAL;
     int             rc = 0;
 
@@ -368,7 +371,7 @@ netsnmp_udp6_transport_get_bound_addr(netsnmp_transport *t)
 netsnmp_transport *
 netsnmp_udpipv6base_tspec_transport(netsnmp_tdomain_spec *tspec)
 {
-    struct sockaddr_in6 addr;
+    struct netsnmp_ep ep;
     int local;
 
     if (NULL == tspec)
@@ -377,40 +380,40 @@ netsnmp_udpipv6base_tspec_transport(netsnmp_tdomain_spec 
*tspec)
     local = tspec->flags & NETSNMP_TSPEC_LOCAL;
 
     /** get address from target */
-    if (!netsnmp_sockaddr_in6_2(&addr, tspec->target, tspec->default_target))
+    if (!netsnmp_sockaddr_in6_3(&ep, tspec->target, tspec->default_target))
         return NULL;
 
     if (NULL != tspec->source) {
-        struct sockaddr_in6 src_addr, *srcp = &src_addr;
+        struct netsnmp_ep src_addr;
+
         /** get sockaddr from source */
-        if (!netsnmp_sockaddr_in6_2(&src_addr, tspec->source, NULL))
+        if (!netsnmp_sockaddr_in6_3(&src_addr, tspec->source, NULL))
             return NULL;
-        return netsnmp_udp6_transport_with_source(&addr, local, srcp);
+        return netsnmp_udp6_transport_with_source(&ep, local, &src_addr);
      } else {
         /** if no source and we do not want any default client address */
         if (tspec->flags & NETSNMP_TSPEC_NO_DFTL_CLIENT_ADDR)
-            return netsnmp_udp6_transport_with_source(&addr, local,
-                                                             NULL);
+            return netsnmp_udp6_transport_with_source(&ep, local, NULL);
     }
 
     /** no source and default client address ok */
-    return netsnmp_udp6_transport(&addr, local);
+    return netsnmp_udp6_transport(&ep, local);
 }
 
 netsnmp_transport *
-netsnmp_udp6_transport_with_source(const struct sockaddr_in6 *addr, int local,
-                                   const struct sockaddr_in6 *src_addr)
+netsnmp_udp6_transport_with_source(const struct netsnmp_ep *ep,
+              int local, const struct netsnmp_ep *src_addr)
 {
     netsnmp_transport         *t = NULL;
-    const struct sockaddr_in6 *bind_addr;
+    const struct netsnmp_ep   *bind_addr;
     int                        rc, flags = 0;
 
-    t = netsnmp_udp6_transport_init(addr, local);
+    t = netsnmp_udp6_transport_init(ep, local);
     if (NULL == t)
         return NULL;
 
     if (local) {
-        bind_addr = addr;
+        bind_addr = ep;
         flags |= NETSNMP_TSPEC_LOCAL;
 
 #ifndef NETSNMP_NO_SYSTEMD
@@ -456,7 +459,7 @@ netsnmp_udp6_transport_with_source(const struct 
sockaddr_in6 *addr, int local,
  */
 
 netsnmp_transport *
-netsnmp_udp6_transport(const struct sockaddr_in6 *addr, int local)
+netsnmp_udp6_transport(const struct netsnmp_ep *ep, int local)
 {
     if (!local) {
         const char *client_socket;
@@ -464,15 +467,14 @@ netsnmp_udp6_transport(const struct sockaddr_in6 *addr, 
int local)
         client_socket = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
                                               NETSNMP_DS_LIB_CLIENT_ADDR);
         if (client_socket) {
-            struct sockaddr_in6 client_addr;
+            struct netsnmp_ep client_addr;
 
-            if (!netsnmp_sockaddr_in6_2(&client_addr, client_socket, NULL))
+            if (!netsnmp_sockaddr_in6_3(&client_addr, client_socket, NULL))
                 return NULL;
-            return netsnmp_udp6_transport_with_source(addr, local,
-                                                      &client_addr);
+            return netsnmp_udp6_transport_with_source(ep, local, &client_addr);
         }
     }
-    return netsnmp_udp6_transport_with_source(addr, local, NULL);
+    return netsnmp_udp6_transport_with_source(ep, local, NULL);
 }
 
 
@@ -924,10 +926,10 @@ netsnmp_transport *
 netsnmp_udp6_create_tstring(const char *str, int local,
                            const char *default_target)
 {
-    struct sockaddr_in6 addr;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_sockaddr_in6_2(&addr, str, default_target)) {
-        return netsnmp_udp6_transport(&addr, local);
+    if (netsnmp_sockaddr_in6_3(&ep, str, default_target)) {
+        return netsnmp_udp6_transport(&ep, local);
     } else {
         return NULL;
     }
@@ -954,10 +956,11 @@ netsnmp_udp6_create_tspec(netsnmp_tdomain_spec *tspec)
 netsnmp_transport *
 netsnmp_udp6_create_ostring(const void *o, size_t o_len, int local)
 {
-    struct sockaddr_in6 sin6;
+    struct netsnmp_ep ep;
 
-    if (netsnmp_ipv6_ostring_to_sockaddr(&sin6, o, o_len))
-        return netsnmp_udp6_transport(&sin6, local);
+    memset(&ep, 0, sizeof(ep));
+    if (netsnmp_ipv6_ostring_to_sockaddr(&ep.a.sin6, o, o_len))
+        return netsnmp_udp6_transport(&ep, local);
     return NULL;
 }
 
diff --git a/snmplib/transports/snmpUDPsharedDomain.c 
b/snmplib/transports/snmpUDPsharedDomain.c
index dfc1c07018de..8169954211c0 100644
--- a/snmplib/transports/snmpUDPsharedDomain.c
+++ b/snmplib/transports/snmpUDPsharedDomain.c
@@ -9,6 +9,7 @@
 #include <net-snmp/net-snmp-config.h>
 
 #include <net-snmp/types.h>
+#include <net-snmp/library/snmpIPBaseDomain.h>
 #include <net-snmp/library/snmpUDPsharedDomain.h>
 
 #include <stddef.h>
@@ -189,11 +190,11 @@ _transport_common(netsnmp_transport *t)
 }
 
 netsnmp_transport *
-netsnmp_udpshared_transport(const struct sockaddr_in *addr, int local)
+netsnmp_udpshared_transport(const struct netsnmp_ep *ep, int local)
 {
     netsnmp_transport *t = NULL;
 
-    t = netsnmp_udp_transport(addr, local);
+    t = netsnmp_udp_transport(ep, local);
     if (NULL == t)
         return NULL;
 
@@ -203,9 +204,9 @@ netsnmp_udpshared_transport(const struct sockaddr_in *addr, 
int local)
 }
 
 netsnmp_transport *
-netsnmp_udpshared_transport_with_source(const struct sockaddr_in *addr,
+netsnmp_udpshared_transport_with_source(const struct netsnmp_ep *ep,
                                         int flags,
-                                        const struct sockaddr_in *src_addr)
+                                        const struct netsnmp_ep *src_addr)
 {
     netsnmp_transport *t = NULL, *b = NULL;
     int                local = flags & NETSNMP_TSPEC_LOCAL;
@@ -213,7 +214,7 @@ netsnmp_udpshared_transport_with_source(const struct 
sockaddr_in *addr,
     DEBUGMSGTL(("udpshared:create", "from addr with source\n"));
 
     /** init common parts of parent transport */
-    t = netsnmp_udpipv4base_transport_init(addr, local);
+    t = netsnmp_udpipv4base_transport_init(ep, local);
     if (NULL == t)
         return NULL;
 
@@ -237,7 +238,7 @@ netsnmp_udpshared_transport_with_source(const struct 
sockaddr_in *addr,
 
     /** if no base transport found, create one */
     if (NULL == b) {
-        b = netsnmp_udp_transport_with_source(addr, local, src_addr);
+        b = netsnmp_udp_transport_with_source(ep, local, src_addr);
         if (NULL == b) {
             netsnmp_transport_free(t);
             return NULL;
@@ -271,11 +272,11 @@ netsnmp_udpshared_transport_with_source(const struct 
sockaddr_in *addr,
  * the remote address to send things to.
  */
 netsnmp_transport *
-netsnmp_udpshared6_transport(const struct sockaddr_in6 *addr, int local)
+netsnmp_udpshared6_transport(const struct netsnmp_ep *ep, int local)
 {
     netsnmp_transport *t = NULL;
 
-    t = netsnmp_udp6_transport(addr, local);
+    t = netsnmp_udp6_transport(ep, local);
     if (NULL != t)
         t = _transport_common(t);
 
@@ -283,9 +284,9 @@ netsnmp_udpshared6_transport(const struct sockaddr_in6 
*addr, int local)
 }
 
 netsnmp_transport *
-netsnmp_udpshared6_transport_with_source(const struct sockaddr_in6 *addr6,
+netsnmp_udpshared6_transport_with_source(const struct netsnmp_ep *ep,
                                          int flags,
-                                         const struct sockaddr_in6 *src_addr6)
+                                         const struct netsnmp_ep *src_addr6)
 {
     netsnmp_transport *t = NULL, *b = NULL;
     int                local = flags & NETSNMP_TSPEC_LOCAL;
@@ -293,7 +294,7 @@ netsnmp_udpshared6_transport_with_source(const struct 
sockaddr_in6 *addr6,
     DEBUGMSGTL(("udpshared:create", "from addr6 with source\n"));
 
     /** init common parts of parent transport */
-    t = netsnmp_udp6_transport_init(addr6, local);
+    t = netsnmp_udp6_transport_init(ep, local);
     if (NULL == t)
         return NULL;
 
@@ -317,7 +318,7 @@ netsnmp_udpshared6_transport_with_source(const struct 
sockaddr_in6 *addr6,
 
     /** if no base transport found, create one */
     if (NULL == b) {
-        b = netsnmp_udp6_transport_with_source(addr6, local, src_addr6);
+        b = netsnmp_udp6_transport_with_source(ep, local, src_addr6);
         if (NULL == b) {
             netsnmp_transport_free(t);
             return NULL;
@@ -346,16 +347,16 @@ netsnmp_udpshared6_transport_with_source(const struct 
sockaddr_in6 *addr6,
 netsnmp_transport *
 netsnmp_udpshared_create_ostring(const void *o, size_t o_len, int local)
 {
-    struct sockaddr_in sin;
-    struct sockaddr_in6 sin6;
+    struct netsnmp_ep ep;
 
     DEBUGMSGTL(("udpshared:create", "from ostring\n"));
 
-    if (netsnmp_ipv4_ostring_to_sockaddr(&sin, o, o_len))
-        return netsnmp_udpshared_transport(&sin, local);
+    memset(&ep, 0, sizeof(ep));
+    if (netsnmp_ipv4_ostring_to_sockaddr(&ep.a.sin, o, o_len))
+        return netsnmp_udpshared_transport(&ep, local);
 #ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    else if (netsnmp_ipv6_ostring_to_sockaddr(&sin6, o, o_len))
-        return netsnmp_udpshared6_transport(&sin6, local);
+    else if (netsnmp_ipv6_ostring_to_sockaddr(&ep.a.sin6, o, o_len))
+        return netsnmp_udpshared6_transport(&ep, local);
 #endif
     return NULL;
 }
@@ -364,19 +365,16 @@ netsnmp_transport *
 netsnmp_udpshared_create_tstring(const char *str, int isserver,
                                  const char *default_target)
 {
-#ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    struct sockaddr_in6 addr6;
-#endif
-    struct sockaddr_in addr;
+    struct netsnmp_ep ep;
     netsnmp_transport *t;
 
     DEBUGMSGTL(("udpshared:create", "from tstring %s\n", str));
 
-    if (netsnmp_sockaddr_in2(&addr, str, default_target))
-        t = netsnmp_udpshared_transport(&addr, isserver);
+    if (netsnmp_sockaddr_in3(&ep, str, default_target))
+        t = netsnmp_udpshared_transport(&ep, isserver);
 #ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    else if (netsnmp_sockaddr_in6_2(&addr6, str, default_target))
-        t = netsnmp_udpshared6_transport(&addr6, isserver);
+    else if (netsnmp_sockaddr_in6_3(&ep, str, default_target))
+        t = netsnmp_udpshared6_transport(&ep, isserver);
 #endif
     else
         return NULL;
@@ -385,68 +383,66 @@ netsnmp_udpshared_create_tstring(const char *str, int 
isserver,
 }
 
 static netsnmp_transport *
-_tspec_v4(struct sockaddr_in *addr, netsnmp_tdomain_spec *tspec)
+_tspec_v4(const struct netsnmp_ep *ep, netsnmp_tdomain_spec *tspec)
 {
     int local = tspec->flags & NETSNMP_TSPEC_LOCAL;
 
     if (NULL != tspec->source) {
-        struct sockaddr_in src_addr, *srcp = &src_addr;
+        struct netsnmp_ep src_addr;
+
         /** get sockaddr from source */
-        if (!netsnmp_sockaddr_in2(&src_addr, tspec->source, NULL))
+        if (!netsnmp_sockaddr_in3(&src_addr, tspec->source, NULL))
             return NULL;
-        return netsnmp_udpshared_transport_with_source(addr, local, srcp);
+        return netsnmp_udpshared_transport_with_source(ep, local, &src_addr);
     } else {
         /** if no source and we do not want any default client address */
         if (tspec->flags & NETSNMP_TSPEC_NO_DFTL_CLIENT_ADDR)
-            return netsnmp_udpshared_transport_with_source(addr, local, NULL);
+            return netsnmp_udpshared_transport_with_source(ep, local, NULL);
     }
 
     /** no source and default client address ok */
-    return netsnmp_udpshared_transport(addr, local);
+    return netsnmp_udpshared_transport(ep, local);
 }
 
 #ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
 static netsnmp_transport *
-_tspec_v6(struct sockaddr_in6 *addr, netsnmp_tdomain_spec *tspec)
+_tspec_v6(const struct netsnmp_ep *ep, netsnmp_tdomain_spec *tspec)
 {
     int local = tspec->flags & NETSNMP_TSPEC_LOCAL;
 
     if (NULL != tspec->source) {
-        struct sockaddr_in6 src_addr, *srcp = &src_addr;
+        struct netsnmp_ep src_addr;
+
         /** get sockaddr from source */
-        if (!netsnmp_sockaddr_in6_2(&src_addr, tspec->source, NULL))
+        if (!netsnmp_sockaddr_in6_3(&src_addr, tspec->source, NULL))
             return NULL;
-        return netsnmp_udpshared6_transport_with_source(addr, local, srcp);
+        return netsnmp_udpshared6_transport_with_source(ep, local, &src_addr);
     } else {
         /** if no source and we do not want any default client address */
         if (tspec->flags & NETSNMP_TSPEC_NO_DFTL_CLIENT_ADDR)
-            return netsnmp_udpshared6_transport_with_source(addr, local, NULL);
+            return netsnmp_udpshared6_transport_with_source(ep, local, NULL);
     }
 
     /** no source and default client address ok */
-    return netsnmp_udpshared6_transport(addr, local);
+    return netsnmp_udpshared6_transport(ep, local);
 }
 #endif /* NETSNMP_TRANSPORT_UDPIPV6_DOMAIN */
 
 netsnmp_transport *
 netsnmp_udpshared_create_tspec(netsnmp_tdomain_spec *tspec)
 {
-#ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    struct sockaddr_in6 addr6;
-#endif
-    struct sockaddr_in addr;
+    struct netsnmp_ep ep;
 
     DEBUGMSGTL(("udpshared:create", "from tspec\n"));
 
     if (NULL == tspec)
         return NULL;
 
-    if (netsnmp_sockaddr_in2(&addr, tspec->target, tspec->default_target))
-        return _tspec_v4(&addr, tspec);
+    if (netsnmp_sockaddr_in3(&ep, tspec->target, tspec->default_target))
+        return _tspec_v4(&ep, tspec);
 #ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
-    else if (netsnmp_sockaddr_in6_2(&addr6, tspec->target,
-                                    tspec->default_target))
-        return _tspec_v6(&addr6, tspec);
+    else if (netsnmp_sockaddr_in6_3(&ep, tspec->target, tspec->default_target))
+        return _tspec_v6(&ep, tspec);
 #endif
 
     return NULL;
-- 
2.19.1



_______________________________________________
Net-snmp-coders mailing list
Net-snmp-coders@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to