[PATCH 3/6] libsnmp/transports: Change multiple sockaddr_in* arguments into netsnmp_ep

Bart Van Assche <[email protected]>
Newsgroups gmane.network.net-snmp.devel
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.