Change in libosmocore[master]: socket: Add support for AF_INET6 in osmo_sockaddr_to_str_and_uint()

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Mon Aug 31 08:50:43 UTC 2020


pespin has submitted this change. ( https://gerrit.osmocom.org/c/libosmocore/+/19881 )

Change subject: socket: Add support for AF_INET6 in osmo_sockaddr_to_str_and_uint()
......................................................................

socket: Add support for AF_INET6 in osmo_sockaddr_to_str_and_uint()

Related: SYS#4915
Change-Id: I439c7fa52a3a30eebc3d35e78be7f1724fb69294
---
M src/socket.c
M tests/utils/utils_test.c
M tests/utils/utils_test.ok
3 files changed, 125 insertions(+), 18 deletions(-)

Approvals:
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/src/socket.c b/src/socket.c
index a5bbddf..e88af16 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -983,9 +983,22 @@
 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)
diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c
index e15cf5f..9ff023b 100644
--- a/tests/utils/utils_test.c
+++ b/tests/utils/utils_test.c
@@ -775,6 +775,7 @@
 	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 @@
 		.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 @@
 		.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 @@
 		.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 @@
 		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,
diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok
index cbab72a..f1b07fa 100644
--- a/tests/utils/utils_test.ok
+++ b/tests/utils/utils_test.ok
@@ -355,14 +355,22 @@
 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!@#$%^&*()")

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/19881
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I439c7fa52a3a30eebc3d35e78be7f1724fb69294
Gerrit-Change-Number: 19881
Gerrit-PatchSet: 3
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Hoernchen <ewild at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <dwillmann at sysmocom.de>
Gerrit-Reviewer: dexter <pmaier at sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: lynxis lazus <lynxis at fe80.eu>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200831/be1b7ccb/attachment.htm>


More information about the gerrit-log mailing list