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