Cleanup socket functions a bit
Signed-off-by: Jeroen Koekkoek <jeroen@koekkoek.nl>
This commit is contained in:
parent
0bc263e537
commit
934ff535d6
3 changed files with 50 additions and 138 deletions
|
@ -237,7 +237,23 @@ extern "C" {
|
||||||
os_sockaddr_is_unspecified(
|
os_sockaddr_is_unspecified(
|
||||||
const os_sockaddr *const sa) __nonnull_all__;
|
const os_sockaddr *const sa) __nonnull_all__;
|
||||||
|
|
||||||
/* docced in implementation file */
|
/**
|
||||||
|
* Check this address to see if it represents loopback.
|
||||||
|
* @return true if it does. false otherwise, or if unknown address type.
|
||||||
|
* @param thisSock A pointer to an os_sockaddr to be checked.
|
||||||
|
*/
|
||||||
|
OSAPI_EXPORT int
|
||||||
|
os_sockaddr_is_loopback(
|
||||||
|
_In_ const os_sockaddr *__restrict sa) __nonnull_all__;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks two socket IP host addresses for be on the same subnet, considering the given subnetmask.
|
||||||
|
* It will not consider the possibility of IPv6 mapped IPv4 addresses or anything arcane like that.
|
||||||
|
* @param thisSock First address
|
||||||
|
* @param thatSock Second address.
|
||||||
|
* @param mask Subnetmask.
|
||||||
|
* @return true if equal, false otherwise.
|
||||||
|
*/
|
||||||
OSAPI_EXPORT bool
|
OSAPI_EXPORT bool
|
||||||
os_sockaddrSameSubnet(const os_sockaddr* thisSock,
|
os_sockaddrSameSubnet(const os_sockaddr* thisSock,
|
||||||
const os_sockaddr* thatSock,
|
const os_sockaddr* thatSock,
|
||||||
|
@ -321,19 +337,6 @@ extern "C" {
|
||||||
_Out_writes_z_(size) char *buf,
|
_Out_writes_z_(size) char *buf,
|
||||||
_In_ size_t size);
|
_In_ size_t size);
|
||||||
|
|
||||||
/* docced in implementation file */
|
|
||||||
OSAPI_EXPORT bool
|
|
||||||
os_sockaddrIsLoopback(const os_sockaddr* thisSock);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the address of the sockaddr to the special IN_ADDR_ANY value.
|
|
||||||
* @param sa the sockaddr to set the address for
|
|
||||||
* @pre sa is a valid sockaddr pointer
|
|
||||||
* @post Address of sa is set to the special IN_ADDR_ANY value
|
|
||||||
*/
|
|
||||||
OSAPI_EXPORT void
|
|
||||||
os_sockaddrSetInAddrAny(os_sockaddr* sa);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -96,81 +96,44 @@ uint16_t os_sockaddr_get_port(const os_sockaddr *const sa)
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int os_sockaddr_compare(
|
int
|
||||||
const os_sockaddr *const sa1,
|
os_sockaddr_is_unspecified(
|
||||||
const os_sockaddr *const sa2)
|
_In_ const os_sockaddr *__restrict sa)
|
||||||
{
|
{
|
||||||
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 */
|
|
||||||
#ifdef __linux
|
|
||||||
case AF_PACKET:
|
|
||||||
{
|
|
||||||
struct sockaddr_ll *sll1, *sll2;
|
|
||||||
sll1 = (struct sockaddr_ll *)sa1;
|
|
||||||
sll2 = (struct sockaddr_ll *)sa2;
|
|
||||||
sz = sizeof(sll1->sll_addr);
|
|
||||||
eq = memcmp(sll1->sll_addr, sll2->sll_addr, sz);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif /* __linux */
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
assert(sa1->sa_family == 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, sz);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return eq;
|
|
||||||
}
|
|
||||||
|
|
||||||
int os_sockaddr_is_unspecified(const os_sockaddr *const sa)
|
|
||||||
{
|
|
||||||
int unspec = 0;
|
|
||||||
|
|
||||||
assert(sa != NULL);
|
assert(sa != NULL);
|
||||||
|
|
||||||
switch(sa->sa_family) {
|
switch(sa->sa_family) {
|
||||||
#if (OS_SOCKET_HAS_IPV6 == 1)
|
#if OS_SOCKET_HAS_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
unspec = IN6_IS_ADDR_UNSPECIFIED(&((os_sockaddr_in6*)sa)->sin6_addr);
|
return IN6_IS_ADDR_UNSPECIFIED(&((os_sockaddr_in6*)sa)->sin6_addr);
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
unspec = (((os_sockaddr_in *)sa)->sin_addr.s_addr == 0);
|
return (((os_sockaddr_in *)sa)->sin_addr.s_addr == 0);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return unspec;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
os_sockaddr_is_loopback(
|
||||||
|
_In_ const os_sockaddr *__restrict sa)
|
||||||
|
{
|
||||||
|
assert(sa != NULL);
|
||||||
|
|
||||||
|
switch (sa->sa_family) {
|
||||||
|
#if OS_SOCKET_HAS_IPV6
|
||||||
|
case AF_INET6:
|
||||||
|
return IN6_IS_ADDR_LOOPBACK(
|
||||||
|
((const os_sockaddr_in6 *)sa)->sin6_addr);
|
||||||
|
#endif /* OS_SOCKET_HAS_IPV6 */
|
||||||
|
case AF_INET:
|
||||||
|
return (((const os_sockaddr_in *)sa)->sin_addr.s_addr
|
||||||
|
== htonl(INADDR_LOOPBACK));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks two socket IP host addresses for be on the same subnet, considering the given subnetmask.
|
|
||||||
* It will not consider the possibility of IPv6 mapped IPv4 addresses or anything arcane like that.
|
|
||||||
* @param thisSock First address
|
|
||||||
* @param thatSock Second address.
|
|
||||||
* @param mask Subnetmask.
|
|
||||||
* @return true if equal, false otherwise.
|
|
||||||
*/
|
|
||||||
bool
|
bool
|
||||||
os_sockaddrSameSubnet(const os_sockaddr* thisSock,
|
os_sockaddrSameSubnet(const os_sockaddr* thisSock,
|
||||||
const os_sockaddr* thatSock,
|
const os_sockaddr* thatSock,
|
||||||
|
@ -306,59 +269,3 @@ os_sockaddrtostr(
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check this address to see if it represents loopback.
|
|
||||||
* @return true if it does. false otherwise, or if unknown address type.
|
|
||||||
* @param thisSock A pointer to an os_sockaddr to be checked.
|
|
||||||
*/
|
|
||||||
bool
|
|
||||||
os_sockaddrIsLoopback(const os_sockaddr* thisSock)
|
|
||||||
{
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
#if (OS_SOCKET_HAS_IPV6 == 1)
|
|
||||||
static os_sockaddr_storage linkLocalLoopback;
|
|
||||||
static os_sockaddr* linkLocalLoopbackPtr = NULL;
|
|
||||||
|
|
||||||
if (linkLocalLoopbackPtr == NULL)
|
|
||||||
{
|
|
||||||
/* Initialise once (where 'once' implies some small integer) */
|
|
||||||
os_sockaddrfromstr(AF_INET6, "fe80::1", (os_sockaddr*) &linkLocalLoopback);
|
|
||||||
linkLocalLoopbackPtr = (os_sockaddr*) &linkLocalLoopback;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (thisSock->sa_family == AF_INET6)
|
|
||||||
{
|
|
||||||
result = IN6_IS_ADDR_LOOPBACK(&((os_sockaddr_in6*)thisSock)->sin6_addr) ||
|
|
||||||
os_sockaddr_compare(thisSock, linkLocalLoopbackPtr) == 0 ? true : false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (thisSock->sa_family == AF_INET)
|
|
||||||
{
|
|
||||||
result = (INADDR_LOOPBACK == ntohl(((os_sockaddr_in*)thisSock)->sin_addr.s_addr)) ? true : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
os_sockaddrSetInAddrAny(
|
|
||||||
os_sockaddr* sa)
|
|
||||||
{
|
|
||||||
assert(sa);
|
|
||||||
#if (OS_SOCKET_HAS_IPV6 == 1)
|
|
||||||
assert(sa->sa_family == AF_INET6 || sa->sa_family == AF_INET);
|
|
||||||
if (sa->sa_family == AF_INET6){
|
|
||||||
((os_sockaddr_in6*)sa)->sin6_addr = os_in6addr_any;
|
|
||||||
((os_sockaddr_in6*)sa)->sin6_scope_id = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#else
|
|
||||||
assert(sa->sa_family == AF_INET);
|
|
||||||
#endif
|
|
||||||
if (sa->sa_family == AF_INET){
|
|
||||||
((os_sockaddr_in*)sa)->sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -134,10 +134,12 @@ CU_Test(os_getifaddrs, ipv6)
|
||||||
CU_ASSERT_EQUAL(ifa->addr->sa_family, AF_INET6);
|
CU_ASSERT_EQUAL(ifa->addr->sa_family, AF_INET6);
|
||||||
if (ifa->addr->sa_family == AF_INET6) {
|
if (ifa->addr->sa_family == AF_INET6) {
|
||||||
have_ipv6 = 1;
|
have_ipv6 = 1;
|
||||||
if (ifa->flags & IFF_LOOPBACK) {
|
/* macOS assigns a link-local address to the loopback
|
||||||
CU_ASSERT(os_sockaddrIsLoopback(ifa->addr));
|
interface, so the loopback address must be assigned to the
|
||||||
} else {
|
loopback interface, but the loopback interface can have
|
||||||
CU_ASSERT(!os_sockaddrIsLoopback(ifa->addr));
|
addresses other than the loopback address assigned. */
|
||||||
|
if (os_sockaddr_is_loopback(ifa->addr)) {
|
||||||
|
CU_ASSERT(ifa->flags & IFF_LOOPBACK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue