diff --git a/src/core/ddsi/include/ddsi/ddsi_ipaddr.h b/src/core/ddsi/include/ddsi/ddsi_ipaddr.h index 0fa1b44..35bdc44 100644 --- a/src/core/ddsi/include/ddsi/ddsi_ipaddr.h +++ b/src/core/ddsi/include/ddsi/ddsi_ipaddr.h @@ -16,6 +16,7 @@ enum ddsi_nearby_address_result ddsi_ipaddr_is_nearby_address (ddsi_tran_factory_t tran, const nn_locator_t *loc, size_t ninterf, const struct nn_interface interf[]); enum ddsi_locator_from_string_result ddsi_ipaddr_from_string (ddsi_tran_factory_t tran, nn_locator_t *loc, const char *str, int32_t kind); +int ddsi_ipaddr_compare (const os_sockaddr *const sa1, const os_sockaddr *const sa2); char *ddsi_ipaddr_to_string (ddsi_tran_factory_t tran, char *dst, size_t sizeof_dst, const nn_locator_t *loc, int with_port); void ddsi_ipaddr_to_loc (nn_locator_t *dst, const os_sockaddr *src, int32_t kind); void ddsi_ipaddr_from_loc (os_sockaddr_storage *dst, const nn_locator_t *src); diff --git a/src/core/ddsi/src/ddsi_ipaddr.c b/src/core/ddsi/src/ddsi_ipaddr.c index 96766da..fb8a69e 100644 --- a/src/core/ddsi/src/ddsi_ipaddr.c +++ b/src/core/ddsi/src/ddsi_ipaddr.c @@ -16,6 +16,40 @@ #include "ddsi/q_nwif.h" #include "ddsi/q_config.h" +int ddsi_ipaddr_compare (const os_sockaddr *const sa1, const os_sockaddr *const sa2) +{ + int eq; + size_t sz; + + if ((eq = sa1->sa_family - sa2->sa_family) == 0) { + switch(sa1->sa_family) { +#if (OS_SOCKET_HAS_IPV6 == 1) + case AF_INET6: { + os_sockaddr_in6 *sin61, *sin62; + sin61 = (os_sockaddr_in6 *)sa1; + sin62 = (os_sockaddr_in6 *)sa2; + sz = sizeof(sin61->sin6_addr); + eq = memcmp(&sin61->sin6_addr, &sin62->sin6_addr, sz); + break; + } +#endif /* OS_SOCKET_HAS_IPV6 */ + case AF_INET: { + os_sockaddr_in *sin1, *sin2; + sin1 = (os_sockaddr_in *)sa1; + sin2 = (os_sockaddr_in *)sa2; + sz = sizeof(sin1->sin_addr); + eq = memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(sz)); + break; + } + default: { + assert(0); + } + } + } + + return eq; +} + enum ddsi_nearby_address_result ddsi_ipaddr_is_nearby_address (ddsi_tran_factory_t tran, const nn_locator_t *loc, size_t ninterf, const struct nn_interface interf[]) { os_sockaddr_storage tmp, iftmp, nmtmp, ownip; @@ -29,7 +63,7 @@ enum ddsi_nearby_address_result ddsi_ipaddr_is_nearby_address (ddsi_tran_factory ddsi_ipaddr_from_loc(&ownip, &gv.ownloc); if (os_sockaddrSameSubnet ((os_sockaddr *) &tmp, (os_sockaddr *) &iftmp, (os_sockaddr *) &nmtmp)) { - if (os_sockaddr_compare((os_sockaddr *)&iftmp, (os_sockaddr *)&ownip) == 0) + if (ddsi_ipaddr_compare((os_sockaddr *)&iftmp, (os_sockaddr *)&ownip) == 0) return DNAR_SAME; else return DNAR_LOCAL; diff --git a/src/core/ddsi/src/ddsi_tcp.c b/src/core/ddsi/src/ddsi_tcp.c index b2b1f9e..b4ac620 100644 --- a/src/core/ddsi/src/ddsi_tcp.c +++ b/src/core/ddsi/src/ddsi_tcp.c @@ -91,8 +91,7 @@ static int ddsi_tcp_cmp_conn (const ddsi_tcp_conn_t c1, const ddsi_tcp_conn_t c2 return (a1s->sa_family < a2s->sa_family) ? -1 : 1; else if (c1->m_peer_port != c2->m_peer_port) return (c1->m_peer_port < c2->m_peer_port) ? -1 : 1; - - return os_sockaddr_compare(a1s, a2s); + return ddsi_ipaddr_compare (a1s, a2s); } typedef struct ddsi_tcp_node diff --git a/src/os/include/os/os_socket.h b/src/os/include/os/os_socket.h index 511c1b4..24a67b3 100644 --- a/src/os/include/os/os_socket.h +++ b/src/os/include/os/os_socket.h @@ -271,24 +271,6 @@ extern "C" { OSAPI_EXPORT uint16_t os_sockaddr_get_port(const os_sockaddr *const sa) __nonnull_all__; - /** - * Compare two IP addresses for equality - does not consider port number. - * This is a 'straight' compare i.e. family must match and address bytes - * must correspond. It does not consider the possibility of IPv6 mapped - * IPv4 addresses or anything arcane like that. - * @param sa1 First socket address - * @param sa2 Second socket address. - * @return true if equal, false otherwise. - * @return Integer less than, equal to, or greater than zero if sa1 is - * found, respectively, to be less than, to match, or be greater - * than sa2. - * @pre both sa1 and sa2 are valid os_sockaddr pointers. - */ - OSAPI_EXPORT int - os_sockaddr_compare( - const os_sockaddr *const sa1, - const os_sockaddr *const sa2) __nonnull_all__ __attribute_pure__; - /** * Check if IP address of given socket address is unspecified. * @param sa Socket address diff --git a/src/os/src/os_socket.c b/src/os/src/os_socket.c index 5cb7b71..b6525f0 100644 --- a/src/os/src/os_socket.c +++ b/src/os/src/os_socket.c @@ -104,7 +104,7 @@ uint16_t os_sockaddr_get_port(const os_sockaddr *const sa) return port; } -int os_sockaddr_compare( +static int os_sockaddr_compare( const os_sockaddr *const sa1, const os_sockaddr *const sa2) { @@ -142,7 +142,7 @@ int os_sockaddr_compare( sin1 = (os_sockaddr_in *)sa1; sin2 = (os_sockaddr_in *)sa2; sz = sizeof(sin1->sin_addr); - eq = memcmp(sin1, sin2, sizeof(*sin1)); + eq = memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(sz)); } break; }