<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/19769">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Fix finding ASP on IPv6 connections<br><br>Change-Id: I09226a5cecc37dd4676acd61c2051befe5234cb3<br>---<br>M src/osmo_ss7.c<br>1 file changed, 36 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/69/19769/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c</span><br><span>index cdac27a..bae9904 100644</span><br><span>--- a/src/osmo_ss7.c</span><br><span>+++ b/src/osmo_ss7.c</span><br><span>@@ -1198,6 +1198,26 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Converts string representation of v4-mappend-on-v6 IP addr to a pure IPv4 address.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Example: ::ffff:172.18.19.200 => 172.18.19.200</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void chop_v4_mapped_on_v6_prefix(char* buf)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   char *last_colon;</span><br><span style="color: hsl(120, 100%, 40%);">+     size_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+   char *first_dot = strchr(buf, '.');</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!first_dot)</span><br><span style="color: hsl(120, 100%, 40%);">+               return; /* Not an IPv4-mappend-on-v6 string representation, nothing to do */</span><br><span style="color: hsl(120, 100%, 40%);">+  last_colon = strrchr(buf, ':');</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!last_colon)</span><br><span style="color: hsl(120, 100%, 40%);">+              return; /* pure IPv4 address, nothing to do */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      len = strlen(last_colon + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ memmove(buf, last_colon + 1, len);</span><br><span style="color: hsl(120, 100%, 40%);">+    buf[len] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! \brief Find an ASP definition matching the local+remote IP/PORT of given fd</span><br><span>  *  \param[in] fd socket descriptor of given socket</span><br><span>  *  \returns SS7 ASP in case a matching one is found; NULL otherwise */</span><br><span>@@ -1205,7 +1225,7 @@</span><br><span> osmo_ss7_asp_find_by_socket_addr(int fd)</span><br><span> {</span><br><span>  struct osmo_ss7_instance *inst;</span><br><span style="color: hsl(0, 100%, 40%);">- struct sockaddr sa_l, sa_r;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct sockaddr_storage sa_l, sa_r;</span><br><span>  socklen_t sa_len_l = sizeof(sa_l);</span><br><span>   socklen_t sa_len_r = sizeof(sa_r);</span><br><span>   char hostbuf_l[64], hostbuf_r[64];</span><br><span>@@ -1215,23 +1235,32 @@</span><br><span> </span><br><span>     OSMO_ASSERT(ss7_initialized);</span><br><span>        /* convert local and remote IP to string */</span><br><span style="color: hsl(0, 100%, 40%);">-     rc = getsockname(fd, &sa_l, &sa_len_l);</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = getsockname(fd, (struct sockaddr*)&sa_l, &sa_len_l);</span><br><span>    if (rc < 0)</span><br><span>               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = getnameinfo(&sa_l, sa_len_l, hostbuf_l, sizeof(hostbuf_l),</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = getnameinfo((struct sockaddr*)&sa_l, sa_len_l,</span><br><span style="color: hsl(120, 100%, 40%);">+                        hostbuf_l, sizeof(hostbuf_l),</span><br><span>                        NULL, 0, NI_NUMERICHOST);</span><br><span>   if (rc < 0)</span><br><span>               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    local_port = ntohs(get_in_port(&sa_l));</span><br><span style="color: hsl(120, 100%, 40%);">+   local_port = ntohs(get_in_port((struct sockaddr*)&sa_l));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       rc = getpeername(fd, &sa_r, &sa_len_r);</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = getpeername(fd, (struct sockaddr*)&sa_r, &sa_len_r);</span><br><span>    if (rc < 0)</span><br><span>               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = getnameinfo(&sa_r, sa_len_r, hostbuf_r, sizeof(hostbuf_r),</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = getnameinfo((struct sockaddr*)&sa_r, sa_len_r,</span><br><span style="color: hsl(120, 100%, 40%);">+                        hostbuf_r, sizeof(hostbuf_r),</span><br><span>                        NULL, 0, NI_NUMERICHOST);</span><br><span>   if (rc < 0)</span><br><span>               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    remote_port = ntohs(get_in_port(&sa_r));</span><br><span style="color: hsl(120, 100%, 40%);">+  remote_port = ntohs(get_in_port((struct sockaddr*)&sa_r));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* If multi-home is used with both IPv4 and IPv6, then the socket is</span><br><span style="color: hsl(120, 100%, 40%);">+   * AF_INET6, and then returned IPv4 addresses are actually v6mapped ones.</span><br><span style="color: hsl(120, 100%, 40%);">+      * We need to convert them to IPv4 before matching.</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+   chop_v4_mapped_on_v6_prefix(hostbuf_l);</span><br><span style="color: hsl(120, 100%, 40%);">+       chop_v4_mapped_on_v6_prefix(hostbuf_r);</span><br><span> </span><br><span>  /* check all instances for any ASP definition matching the</span><br><span>    * address combination of local/remote ip/port */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/19769">change 19769</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/libosmo-sccp/+/19769"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I09226a5cecc37dd4676acd61c2051befe5234cb3 </div>
<div style="display:none"> Gerrit-Change-Number: 19769 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>