mirror of https://gerrit.osmocom.org/libosmocore
socket: Add support for AF_INET6 in osmo_sockaddr_to_str_and_uint()
Related: SYS#4915 Change-Id: I439c7fa52a3a30eebc3d35e78be7f1724fb69294
This commit is contained in:
parent
4f463c5ccc
commit
1a3d24e8a5
17
src/socket.c
17
src/socket.c
|
@ -983,9 +983,22 @@ size_t osmo_sockaddr_in_to_str_and_uint(char *addr, unsigned int addr_len, uint1
|
|||
unsigned int osmo_sockaddr_to_str_and_uint(char *addr, unsigned int addr_len, uint16_t *port,
|
||||
const struct sockaddr *sa)
|
||||
{
|
||||
const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;
|
||||
|
||||
return osmo_sockaddr_in_to_str_and_uint(addr, addr_len, port, sin);
|
||||
const struct sockaddr_in6 *sin6;
|
||||
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
return osmo_sockaddr_in_to_str_and_uint(addr, addr_len, port,
|
||||
(const struct sockaddr_in *)sa);
|
||||
case AF_INET6:
|
||||
sin6 = (const struct sockaddr_in6 *)sa;
|
||||
if (port)
|
||||
*port = ntohs(sin6->sin6_port);
|
||||
if (addr && inet_ntop(sa->sa_family, &sin6->sin6_addr, addr, addr_len))
|
||||
return strlen(addr);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*! Initialize a unix domain socket (including bind/connect)
|
||||
|
|
|
@ -775,6 +775,7 @@ struct osmo_sockaddr_to_str_and_uint_test_case {
|
|||
bool omit_port;
|
||||
const char *addr;
|
||||
unsigned int addr_len;
|
||||
int address_family; /* AF_INET / AF_INET6 */
|
||||
bool omit_addr;
|
||||
unsigned int expect_rc;
|
||||
const char *expect_returned_addr;
|
||||
|
@ -785,24 +786,28 @@ struct osmo_sockaddr_to_str_and_uint_test_case osmo_sockaddr_to_str_and_uint_tes
|
|||
.port = 0,
|
||||
.addr = "0.0.0.0",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET,
|
||||
.expect_rc = 7,
|
||||
},
|
||||
{
|
||||
.port = 65535,
|
||||
.addr = "255.255.255.255",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET,
|
||||
.expect_rc = 15,
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "234.23.42.123",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET,
|
||||
.expect_rc = 13,
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "234.23.42.123",
|
||||
.addr_len = 10,
|
||||
.address_family = AF_INET,
|
||||
.expect_rc = 13,
|
||||
.expect_returned_addr = "234.23.42",
|
||||
},
|
||||
|
@ -811,11 +816,13 @@ struct osmo_sockaddr_to_str_and_uint_test_case osmo_sockaddr_to_str_and_uint_tes
|
|||
.omit_port = true,
|
||||
.addr = "234.23.42.123",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET,
|
||||
.expect_rc = 13,
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "234.23.42.123",
|
||||
.address_family = AF_INET,
|
||||
.omit_addr = true,
|
||||
.expect_rc = 0,
|
||||
.expect_returned_addr = "",
|
||||
|
@ -824,17 +831,83 @@ struct osmo_sockaddr_to_str_and_uint_test_case osmo_sockaddr_to_str_and_uint_tes
|
|||
.port = 1234,
|
||||
.addr = "234.23.42.123",
|
||||
.addr_len = 0,
|
||||
.address_family = AF_INET,
|
||||
.expect_rc = 13,
|
||||
.expect_returned_addr = "",
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "234.23.42.123",
|
||||
.address_family = AF_INET,
|
||||
.omit_port = true,
|
||||
.omit_addr = true,
|
||||
.expect_rc = 0,
|
||||
.expect_returned_addr = "",
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "::",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET6,
|
||||
.expect_rc = 2,
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "::1",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET6,
|
||||
.expect_rc = 3,
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "::1",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET6,
|
||||
.omit_port = true,
|
||||
.omit_addr = false,
|
||||
.expect_rc = 3,
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "::1",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET6,
|
||||
.omit_port = false,
|
||||
.omit_addr = true,
|
||||
.expect_rc = 0,
|
||||
.expect_returned_addr = "",
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "fd02:db8:1::1",
|
||||
.addr_len = 20,
|
||||
.address_family = AF_INET6,
|
||||
.expect_rc = 13,
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "2001:db8:1::ab9:C0A8:102",
|
||||
.addr_len = 40,
|
||||
.address_family = AF_INET6,
|
||||
.expect_rc = 24,
|
||||
.expect_returned_addr = "2001:db8:1::ab9:c0a8:102",
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "2001:0db8:0001:0000:0000:0ab9:C0A8:0102",
|
||||
.addr_len = 32,
|
||||
.address_family = AF_INET6,
|
||||
.expect_rc = 24,
|
||||
.expect_returned_addr = "2001:db8:1::ab9:c0a8:102",
|
||||
},
|
||||
{
|
||||
.port = 1234,
|
||||
.addr = "::ffff:192.168.20.34",
|
||||
.addr_len = 32,
|
||||
.address_family = AF_INET6,
|
||||
.expect_rc = 20,
|
||||
.expect_returned_addr = "::ffff:192.168.20.34",
|
||||
}
|
||||
};
|
||||
|
||||
static void osmo_sockaddr_to_str_and_uint_test(void)
|
||||
|
@ -846,22 +919,35 @@ static void osmo_sockaddr_to_str_and_uint_test(void)
|
|||
struct osmo_sockaddr_to_str_and_uint_test_case *t =
|
||||
&osmo_sockaddr_to_str_and_uint_test_data[i];
|
||||
|
||||
struct sockaddr_in sin = {
|
||||
.sin_family = AF_INET,
|
||||
.sin_port = htons(t->port),
|
||||
};
|
||||
inet_aton(t->addr, &sin.sin_addr);
|
||||
struct sockaddr_storage sa;
|
||||
struct sockaddr_in *sin;
|
||||
struct sockaddr_in6 *sin6;
|
||||
sa.ss_family = t->address_family;
|
||||
switch (t->address_family) {
|
||||
case AF_INET:
|
||||
sin = (struct sockaddr_in *)&sa;
|
||||
OSMO_ASSERT(inet_pton(t->address_family, t->addr, &sin->sin_addr) == 1);
|
||||
sin->sin_port = htons(t->port);
|
||||
break;
|
||||
case AF_INET6:
|
||||
sin6 = (struct sockaddr_in6 *)&sa;
|
||||
OSMO_ASSERT(inet_pton(t->address_family, t->addr, &sin6->sin6_addr) == 1);
|
||||
sin6->sin6_port = htons(t->port);
|
||||
break;
|
||||
default:
|
||||
OSMO_ASSERT(0);
|
||||
}
|
||||
|
||||
char addr[20] = {};
|
||||
char addr[INET6_ADDRSTRLEN] = {};
|
||||
uint16_t port = 0;
|
||||
unsigned int rc;
|
||||
|
||||
rc = osmo_sockaddr_to_str_and_uint(
|
||||
t->omit_addr? NULL : addr, t->addr_len,
|
||||
t->omit_port? NULL : &port,
|
||||
(const struct sockaddr*)&sin);
|
||||
(const struct sockaddr *)&sa);
|
||||
|
||||
printf("[%d] %s:%u%s%s addr_len=%u --> %s:%u rc=%u\n",
|
||||
printf("[%d] [%s]:%u%s%s addr_len=%u --> [%s]:%u rc=%u\n",
|
||||
i,
|
||||
t->addr ? : "-",
|
||||
t->port,
|
||||
|
|
|
@ -355,14 +355,22 @@ strcmp("NULL", osmo_quote_cstr_c(ctx, NULL, -1)) == 0
|
|||
Testing integer square-root
|
||||
|
||||
osmo_sockaddr_to_str_and_uint_test
|
||||
[0] 0.0.0.0:0 addr_len=20 --> 0.0.0.0:0 rc=7
|
||||
[1] 255.255.255.255:65535 addr_len=20 --> 255.255.255.255:65535 rc=15
|
||||
[2] 234.23.42.123:1234 addr_len=20 --> 234.23.42.123:1234 rc=13
|
||||
[3] 234.23.42.123:1234 addr_len=10 --> 234.23.42:1234 rc=13
|
||||
[4] 234.23.42.123:1234 (omit port) addr_len=20 --> 234.23.42.123:0 rc=13
|
||||
[5] 234.23.42.123:1234 (omit addr) addr_len=0 --> :1234 rc=0
|
||||
[6] 234.23.42.123:1234 addr_len=0 --> :1234 rc=13
|
||||
[7] 234.23.42.123:1234 (omit addr) (omit port) addr_len=0 --> :0 rc=0
|
||||
[0] [0.0.0.0]:0 addr_len=20 --> [0.0.0.0]:0 rc=7
|
||||
[1] [255.255.255.255]:65535 addr_len=20 --> [255.255.255.255]:65535 rc=15
|
||||
[2] [234.23.42.123]:1234 addr_len=20 --> [234.23.42.123]:1234 rc=13
|
||||
[3] [234.23.42.123]:1234 addr_len=10 --> [234.23.42]:1234 rc=13
|
||||
[4] [234.23.42.123]:1234 (omit port) addr_len=20 --> [234.23.42.123]:0 rc=13
|
||||
[5] [234.23.42.123]:1234 (omit addr) addr_len=0 --> []:1234 rc=0
|
||||
[6] [234.23.42.123]:1234 addr_len=0 --> []:1234 rc=13
|
||||
[7] [234.23.42.123]:1234 (omit addr) (omit port) addr_len=0 --> []:0 rc=0
|
||||
[8] [::]:1234 addr_len=20 --> [::]:1234 rc=2
|
||||
[9] [::1]:1234 addr_len=20 --> [::1]:1234 rc=3
|
||||
[10] [::1]:1234 (omit port) addr_len=20 --> [::1]:0 rc=3
|
||||
[11] [::1]:1234 (omit addr) addr_len=20 --> []:1234 rc=0
|
||||
[12] [fd02:db8:1::1]:1234 addr_len=20 --> [fd02:db8:1::1]:1234 rc=13
|
||||
[13] [2001:db8:1::ab9:C0A8:102]:1234 addr_len=40 --> [2001:db8:1::ab9:c0a8:102]:1234 rc=24
|
||||
[14] [2001:0db8:0001:0000:0000:0ab9:C0A8:0102]:1234 addr_len=32 --> [2001:db8:1::ab9:c0a8:102]:1234 rc=24
|
||||
[15] [::ffff:192.168.20.34]:1234 addr_len=32 --> [::ffff:192.168.20.34]:1234 rc=20
|
||||
|
||||
osmo_str_tolowupper_test
|
||||
osmo_str_tolower("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()")
|
||||
|
|
Loading…
Reference in New Issue