sockaddr_compare should really be ipaddr_compare
Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
f2f436bde3
commit
b34cbdcf0c
5 changed files with 39 additions and 23 deletions
|
@ -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_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);
|
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);
|
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_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);
|
void ddsi_ipaddr_from_loc (os_sockaddr_storage *dst, const nn_locator_t *src);
|
||||||
|
|
|
@ -16,6 +16,40 @@
|
||||||
#include "ddsi/q_nwif.h"
|
#include "ddsi/q_nwif.h"
|
||||||
#include "ddsi/q_config.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[])
|
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;
|
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);
|
ddsi_ipaddr_from_loc(&ownip, &gv.ownloc);
|
||||||
if (os_sockaddrSameSubnet ((os_sockaddr *) &tmp, (os_sockaddr *) &iftmp, (os_sockaddr *) &nmtmp))
|
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;
|
return DNAR_SAME;
|
||||||
else
|
else
|
||||||
return DNAR_LOCAL;
|
return DNAR_LOCAL;
|
||||||
|
|
|
@ -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;
|
return (a1s->sa_family < a2s->sa_family) ? -1 : 1;
|
||||||
else if (c1->m_peer_port != c2->m_peer_port)
|
else if (c1->m_peer_port != c2->m_peer_port)
|
||||||
return (c1->m_peer_port < c2->m_peer_port) ? -1 : 1;
|
return (c1->m_peer_port < c2->m_peer_port) ? -1 : 1;
|
||||||
|
return ddsi_ipaddr_compare (a1s, a2s);
|
||||||
return os_sockaddr_compare(a1s, a2s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct ddsi_tcp_node
|
typedef struct ddsi_tcp_node
|
||||||
|
|
|
@ -271,24 +271,6 @@ extern "C" {
|
||||||
OSAPI_EXPORT uint16_t
|
OSAPI_EXPORT uint16_t
|
||||||
os_sockaddr_get_port(const os_sockaddr *const sa) __nonnull_all__;
|
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.
|
* Check if IP address of given socket address is unspecified.
|
||||||
* @param sa Socket address
|
* @param sa Socket address
|
||||||
|
|
|
@ -104,7 +104,7 @@ uint16_t os_sockaddr_get_port(const os_sockaddr *const sa)
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
int os_sockaddr_compare(
|
static int os_sockaddr_compare(
|
||||||
const os_sockaddr *const sa1,
|
const os_sockaddr *const sa1,
|
||||||
const os_sockaddr *const sa2)
|
const os_sockaddr *const sa2)
|
||||||
{
|
{
|
||||||
|
@ -142,7 +142,7 @@ int os_sockaddr_compare(
|
||||||
sin1 = (os_sockaddr_in *)sa1;
|
sin1 = (os_sockaddr_in *)sa1;
|
||||||
sin2 = (os_sockaddr_in *)sa2;
|
sin2 = (os_sockaddr_in *)sa2;
|
||||||
sz = sizeof(sin1->sin_addr);
|
sz = sizeof(sin1->sin_addr);
|
||||||
eq = memcmp(sin1, sin2, sizeof(*sin1));
|
eq = memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(sz));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue