<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/19881">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">socket: Add support for AF_INET6 in osmo_sockaddr_to_str_and_uint()<br><br>Related: SYS#4915<br>Change-Id: I439c7fa52a3a30eebc3d35e78be7f1724fb69294<br>---<br>M src/socket.c<br>M tests/utils/utils_test.c<br>M tests/utils/utils_test.ok<br>3 files changed, 125 insertions(+), 18 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/socket.c b/src/socket.c</span><br><span>index a5bbddf..e88af16 100644</span><br><span>--- a/src/socket.c</span><br><span>+++ b/src/socket.c</span><br><span>@@ -983,9 +983,22 @@</span><br><span> unsigned int osmo_sockaddr_to_str_and_uint(char *addr, unsigned int addr_len, uint16_t *port,</span><br><span>                                         const struct sockaddr *sa)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     return osmo_sockaddr_in_to_str_and_uint(addr, addr_len, port, sin);</span><br><span style="color: hsl(120, 100%, 40%);">+   const struct sockaddr_in6 *sin6;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (sa->sa_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+         return osmo_sockaddr_in_to_str_and_uint(addr, addr_len, port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 (const struct sockaddr_in *)sa);</span><br><span style="color: hsl(120, 100%, 40%);">+      case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                sin6 = (const struct sockaddr_in6 *)sa;</span><br><span style="color: hsl(120, 100%, 40%);">+               if (port)</span><br><span style="color: hsl(120, 100%, 40%);">+                     *port = ntohs(sin6->sin6_port);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (addr && inet_ntop(sa->sa_family, &sin6->sin6_addr, addr, addr_len))</span><br><span style="color: hsl(120, 100%, 40%);">+                     return strlen(addr);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span> }</span><br><span> </span><br><span> /*! Initialize a unix domain socket (including bind/connect)</span><br><span>diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c</span><br><span>index e15cf5f..9ff023b 100644</span><br><span>--- a/tests/utils/utils_test.c</span><br><span>+++ b/tests/utils/utils_test.c</span><br><span>@@ -775,6 +775,7 @@</span><br><span>        bool omit_port;</span><br><span>      const char *addr;</span><br><span>    unsigned int addr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        int address_family; /* AF_INET / AF_INET6 */</span><br><span>         bool omit_addr;</span><br><span>      unsigned int expect_rc;</span><br><span>      const char *expect_returned_addr;</span><br><span>@@ -785,24 +786,28 @@</span><br><span>            .port = 0,</span><br><span>           .addr = "0.0.0.0",</span><br><span>                 .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET,</span><br><span>           .expect_rc = 7,</span><br><span>      },</span><br><span>   {</span><br><span>            .port = 65535,</span><br><span>               .addr = "255.255.255.255",</span><br><span>                 .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET,</span><br><span>           .expect_rc = 15,</span><br><span>     },</span><br><span>   {</span><br><span>            .port = 1234,</span><br><span>                .addr = "234.23.42.123",</span><br><span>           .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET,</span><br><span>           .expect_rc = 13,</span><br><span>     },</span><br><span>   {</span><br><span>            .port = 1234,</span><br><span>                .addr = "234.23.42.123",</span><br><span>           .addr_len = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET,</span><br><span>           .expect_rc = 13,</span><br><span>             .expect_returned_addr = "234.23.42",</span><br><span>       },</span><br><span>@@ -811,11 +816,13 @@</span><br><span>           .omit_port = true,</span><br><span>           .addr = "234.23.42.123",</span><br><span>           .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET,</span><br><span>           .expect_rc = 13,</span><br><span>     },</span><br><span>   {</span><br><span>            .port = 1234,</span><br><span>                .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .address_family = AF_INET,</span><br><span>           .omit_addr = true,</span><br><span>           .expect_rc = 0,</span><br><span>              .expect_returned_addr = "",</span><br><span>@@ -824,17 +831,83 @@</span><br><span>                .port = 1234,</span><br><span>                .addr = "234.23.42.123",</span><br><span>           .addr_len = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                .address_family = AF_INET,</span><br><span>           .expect_rc = 13,</span><br><span>             .expect_returned_addr = "",</span><br><span>        },</span><br><span>   {</span><br><span>            .port = 1234,</span><br><span>                .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .address_family = AF_INET,</span><br><span>           .omit_port = true,</span><br><span>           .omit_addr = true,</span><br><span>           .expect_rc = 0,</span><br><span>              .expect_returned_addr = "",</span><br><span>        },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "::",</span><br><span style="color: hsl(120, 100%, 40%);">+               .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_rc = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "::1",</span><br><span style="color: hsl(120, 100%, 40%);">+              .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_rc = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "::1",</span><br><span style="color: hsl(120, 100%, 40%);">+              .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .omit_port = true,</span><br><span style="color: hsl(120, 100%, 40%);">+            .omit_addr = false,</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_rc = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "::1",</span><br><span style="color: hsl(120, 100%, 40%);">+              .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .omit_port = false,</span><br><span style="color: hsl(120, 100%, 40%);">+           .omit_addr = true,</span><br><span style="color: hsl(120, 100%, 40%);">+            .expect_rc = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_returned_addr = "",</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "fd02:db8:1::1",</span><br><span style="color: hsl(120, 100%, 40%);">+            .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_rc = 13,</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "2001:db8:1::ab9:C0A8:102",</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr_len = 40,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_rc = 24,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_returned_addr = "2001:db8:1::ab9:c0a8:102",</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "2001:0db8:0001:0000:0000:0ab9:C0A8:0102",</span><br><span style="color: hsl(120, 100%, 40%);">+          .addr_len = 32,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_rc = 24,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_returned_addr = "2001:db8:1::ab9:c0a8:102",</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "::ffff:192.168.20.34",</span><br><span style="color: hsl(120, 100%, 40%);">+             .addr_len = 32,</span><br><span style="color: hsl(120, 100%, 40%);">+               .address_family = AF_INET6,</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_rc = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_returned_addr = "::ffff:192.168.20.34",</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> };</span><br><span> </span><br><span> static void osmo_sockaddr_to_str_and_uint_test(void)</span><br><span>@@ -846,22 +919,35 @@</span><br><span>          struct osmo_sockaddr_to_str_and_uint_test_case *t =</span><br><span>                  &osmo_sockaddr_to_str_and_uint_test_data[i];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            struct sockaddr_in sin = {</span><br><span style="color: hsl(0, 100%, 40%);">-                      .sin_family = AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                  .sin_port = htons(t->port),</span><br><span style="color: hsl(0, 100%, 40%);">-          };</span><br><span style="color: hsl(0, 100%, 40%);">-              inet_aton(t->addr, &sin.sin_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+             struct sockaddr_storage sa;</span><br><span style="color: hsl(120, 100%, 40%);">+           struct sockaddr_in *sin;</span><br><span style="color: hsl(120, 100%, 40%);">+              struct sockaddr_in6 *sin6;</span><br><span style="color: hsl(120, 100%, 40%);">+            sa.ss_family = t->address_family;</span><br><span style="color: hsl(120, 100%, 40%);">+          switch (t->address_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+               case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                 sin = (struct sockaddr_in *)&sa;</span><br><span style="color: hsl(120, 100%, 40%);">+                  OSMO_ASSERT(inet_pton(t->address_family, t->addr, &sin->sin_addr) == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                 sin->sin_port = htons(t->port);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                        sin6 = (struct sockaddr_in6 *)&sa;</span><br><span style="color: hsl(120, 100%, 40%);">+                        OSMO_ASSERT(inet_pton(t->address_family, t->addr, &sin6->sin6_addr) == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                       sin6->sin6_port = htons(t->port);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           char addr[20] = {};</span><br><span style="color: hsl(120, 100%, 40%);">+           char addr[INET6_ADDRSTRLEN] = {};</span><br><span>            uint16_t port = 0;</span><br><span>           unsigned int rc;</span><br><span> </span><br><span>                 rc = osmo_sockaddr_to_str_and_uint(</span><br><span>                  t->omit_addr? NULL : addr, t->addr_len,</span><br><span>                        t->omit_port? NULL : &port,</span><br><span style="color: hsl(0, 100%, 40%);">-                      (const struct sockaddr*)&sin);</span><br><span style="color: hsl(120, 100%, 40%);">+                    (const struct sockaddr *)&sa);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          printf("[%d] %s:%u%s%s addr_len=%u --> %s:%u rc=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("[%d] [%s]:%u%s%s addr_len=%u --> [%s]:%u rc=%u\n",</span><br><span>                     i,</span><br><span>                   t->addr ? : "-",</span><br><span>                        t->port,</span><br><span>diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok</span><br><span>index cbab72a..f1b07fa 100644</span><br><span>--- a/tests/utils/utils_test.ok</span><br><span>+++ b/tests/utils/utils_test.ok</span><br><span>@@ -355,14 +355,22 @@</span><br><span> Testing integer square-root</span><br><span> </span><br><span> osmo_sockaddr_to_str_and_uint_test</span><br><span style="color: hsl(0, 100%, 40%);">-[0] 0.0.0.0:0 addr_len=20 --> 0.0.0.0:0 rc=7</span><br><span style="color: hsl(0, 100%, 40%);">-[1] 255.255.255.255:65535 addr_len=20 --> 255.255.255.255:65535 rc=15</span><br><span style="color: hsl(0, 100%, 40%);">-[2] 234.23.42.123:1234 addr_len=20 --> 234.23.42.123:1234 rc=13</span><br><span style="color: hsl(0, 100%, 40%);">-[3] 234.23.42.123:1234 addr_len=10 --> 234.23.42:1234 rc=13</span><br><span style="color: hsl(0, 100%, 40%);">-[4] 234.23.42.123:1234 (omit port) addr_len=20 --> 234.23.42.123:0 rc=13</span><br><span style="color: hsl(0, 100%, 40%);">-[5] 234.23.42.123:1234 (omit addr) addr_len=0 --> :1234 rc=0</span><br><span style="color: hsl(0, 100%, 40%);">-[6] 234.23.42.123:1234 addr_len=0 --> :1234 rc=13</span><br><span style="color: hsl(0, 100%, 40%);">-[7] 234.23.42.123:1234 (omit addr) (omit port) addr_len=0 --> :0 rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+[0] [0.0.0.0]:0 addr_len=20 --> [0.0.0.0]:0 rc=7</span><br><span style="color: hsl(120, 100%, 40%);">+[1] [255.255.255.255]:65535 addr_len=20 --> [255.255.255.255]:65535 rc=15</span><br><span style="color: hsl(120, 100%, 40%);">+[2] [234.23.42.123]:1234 addr_len=20 --> [234.23.42.123]:1234 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[3] [234.23.42.123]:1234 addr_len=10 --> [234.23.42]:1234 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[4] [234.23.42.123]:1234 (omit port) addr_len=20 --> [234.23.42.123]:0 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[5] [234.23.42.123]:1234 (omit addr) addr_len=0 --> []:1234 rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+[6] [234.23.42.123]:1234 addr_len=0 --> []:1234 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[7] [234.23.42.123]:1234 (omit addr) (omit port) addr_len=0 --> []:0 rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+[8] [::]:1234 addr_len=20 --> [::]:1234 rc=2</span><br><span style="color: hsl(120, 100%, 40%);">+[9] [::1]:1234 addr_len=20 --> [::1]:1234 rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+[10] [::1]:1234 (omit port) addr_len=20 --> [::1]:0 rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+[11] [::1]:1234 (omit addr) addr_len=20 --> []:1234 rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+[12] [fd02:db8:1::1]:1234 addr_len=20 --> [fd02:db8:1::1]:1234 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[13] [2001:db8:1::ab9:C0A8:102]:1234 addr_len=40 --> [2001:db8:1::ab9:c0a8:102]:1234 rc=24</span><br><span style="color: hsl(120, 100%, 40%);">+[14] [2001:0db8:0001:0000:0000:0ab9:C0A8:0102]:1234 addr_len=32 --> [2001:db8:1::ab9:c0a8:102]:1234 rc=24</span><br><span style="color: hsl(120, 100%, 40%);">+[15] [::ffff:192.168.20.34]:1234 addr_len=32 --> [::ffff:192.168.20.34]:1234 rc=20</span><br><span> </span><br><span> osmo_str_tolowupper_test</span><br><span> osmo_str_tolower("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()")</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/19881">change 19881</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/19881"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I439c7fa52a3a30eebc3d35e78be7f1724fb69294 </div>
<div style="display:none"> Gerrit-Change-Number: 19881 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>