<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/20052">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mncc: Support IPv6 addresses (new version mncc 7)<br><br>Change-Id: I3b1bebbcc9e36be43d8d055c8d28cbb38ff21b37<br>---<br>M src/call.h<br>M src/mncc.c<br>M src/mncc_protocol.h<br>M src/sdp.c<br>M src/sip.c<br>5 files changed, 75 insertions(+), 49 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sip-connector refs/changes/52/20052/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/call.h b/src/call.h</span><br><span>index 7f67066..d1732f9 100644</span><br><span>--- a/src/call.h</span><br><span>+++ b/src/call.h</span><br><span>@@ -7,6 +7,7 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> </span><br><span> #include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span> </span><br><span> struct sip_agent;</span><br><span> struct mncc_connection;</span><br><span>@@ -49,8 +50,7 @@</span><br><span>       /**</span><br><span>   * RTP data</span><br><span>   */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t        ip;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t        port;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct sockaddr_storage addr;</span><br><span>        uint32_t        payload_type;</span><br><span>        uint32_t        payload_msg_type;</span><br><span> </span><br><span>diff --git a/src/mncc.c b/src/mncc.c</span><br><span>index 16eed96..0725d4c 100644</span><br><span>--- a/src/mncc.c</span><br><span>+++ b/src/mncc.c</span><br><span>@@ -174,7 +174,7 @@</span><br><span> {</span><br><span>        struct gsm_mncc_rtp mncc = { 0, };</span><br><span>   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- char ip_addr[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+        char ip_addr[INET6_ADDRSTRLEN];</span><br><span> </span><br><span>  /*</span><br><span>    * Send RTP CONNECT and we handle the general failure of it by</span><br><span>@@ -182,16 +182,15 @@</span><br><span>        */</span><br><span>  mncc.msg_type = MNCC_RTP_CONNECT;</span><br><span>    mncc.callref = leg->callref;</span><br><span style="color: hsl(0, 100%, 40%);">- mncc.ip = ntohl(other->ip);</span><br><span style="color: hsl(0, 100%, 40%);">-  mncc.port = other->port;</span><br><span style="color: hsl(120, 100%, 40%);">+   mncc.addr = other->addr;</span><br><span>  mncc.payload_type = other->payload_type;</span><br><span>  /*</span><br><span>    * FIXME: mncc.payload_msg_type should already be compatible.. but</span><br><span>    * payload_type should be different..</span><br><span>         */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct in_addr net = { .s_addr = other->ip };</span><br><span style="color: hsl(0, 100%, 40%);">-        inet_ntop(AF_INET, &net, ip_addr, sizeof(ip_addr));</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMNCC, LOGL_DEBUG, "SEND rtp_connect: IP=(%s) PORT=(%u)\n", ip_addr, mncc.port);</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGP(DMNCC, LOGL_DEBUG, "SEND rtp_connect: IP=(%s) PORT=(%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_sockaddr_ntop((const struct sockaddr*)&other->addr, ip_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_sockaddr_port((const struct sockaddr*)&other->addr));</span><br><span>       rc = write(leg->conn->fd.fd, &mncc, sizeof(mncc));</span><br><span>         if (rc != sizeof(mncc)) {</span><br><span>            LOGP(DMNCC, LOGL_ERROR, "Failed to send message for call(%u)\n",</span><br><span>@@ -272,7 +271,8 @@</span><br><span>      * FIXME: We would like to keep this as recvonly...</span><br><span>   */</span><br><span>  other_leg = call_leg_other(&leg->base);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (other_leg && other_leg->port != 0 && other_leg->ip != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (other_leg && other_leg->addr.ss_family != AF_UNSPEC &&</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_sockaddr_port((const struct sockaddr *)&other_leg->addr) != 0)</span><br><span>               send_rtp_connect(leg, other_leg);</span><br><span> }</span><br><span> </span><br><span>@@ -397,7 +397,9 @@</span><br><span>     }</span><br><span> </span><br><span>        /* extract information about where the RTP is */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (rtp->ip != 0 || rtp->port != 0 || rtp->payload_type != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rtp->addr.ss_family != AF_UNSPEC ||</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_sockaddr_port((const struct sockaddr *)&rtp->addr) != 0 ||</span><br><span style="color: hsl(120, 100%, 40%);">+        rtp->payload_type != 0)</span><br><span>               return;</span><br><span> </span><br><span>  LOGP(DMNCC, LOGL_ERROR, "leg(%u) rtp connect failed\n", rtp->callref);</span><br><span>@@ -412,7 +414,7 @@</span><br><span> {</span><br><span>       const struct gsm_mncc_rtp *rtp;</span><br><span>      struct mncc_call_leg *leg;</span><br><span style="color: hsl(0, 100%, 40%);">-      char ip_addr[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+        char ip_addr[INET6_ADDRSTRLEN];</span><br><span> </span><br><span>  if (rc < sizeof(*rtp)) {</span><br><span>          LOGP(DMNCC, LOGL_ERROR, "gsm_mncc_rtp of wrong size %d < %zu\n",</span><br><span>@@ -428,17 +430,16 @@</span><br><span>        }</span><br><span> </span><br><span>        /* extract information about where the RTP is */</span><br><span style="color: hsl(0, 100%, 40%);">-        leg->base.ip = htonl(rtp->ip);</span><br><span style="color: hsl(0, 100%, 40%);">-    leg->base.port = rtp->port;</span><br><span style="color: hsl(120, 100%, 40%);">+     leg->base.addr = rtp->addr;</span><br><span>    leg->base.payload_type = rtp->payload_type;</span><br><span>    leg->base.payload_msg_type = rtp->payload_msg_type;</span><br><span> </span><br><span>        /* TODO.. now we can continue with the call */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct in_addr net = { .s_addr = leg->base.ip };</span><br><span style="color: hsl(0, 100%, 40%);">-     inet_ntop(AF_INET, &net, ip_addr, sizeof(ip_addr));</span><br><span>      LOGP(DMNCC, LOGL_INFO,</span><br><span>               "RTP continue leg(%u) ip(%s), port(%u) pt(%u) ptm(%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             leg->callref, ip_addr, leg->base.port,</span><br><span style="color: hsl(120, 100%, 40%);">+          leg->callref,</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_sockaddr_ntop((const struct sockaddr*)&leg->base.addr, ip_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_sockaddr_port((const struct sockaddr*)&leg->base.addr),</span><br><span>          leg->base.payload_type, leg->base.payload_msg_type);</span><br><span>   stop_cmd_timer(leg, MNCC_RTP_CREATE);</span><br><span>        continue_call(leg);</span><br><span>diff --git a/src/mncc_protocol.h b/src/mncc_protocol.h</span><br><span>index b6f6635..5d35191 100644</span><br><span>--- a/src/mncc_protocol.h</span><br><span>+++ b/src/mncc_protocol.h</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* GSM Mobile Radio Interface Layer 3 messages on the A-bis interface </span><br><span style="color: hsl(120, 100%, 40%);">+/* GSM Mobile Radio Interface Layer 3 messages on the A-bis interface</span><br><span>  * 3GPP TS 04.08 version 7.21.0 Release 1998 / ETSI TS 100 940 V7.21.0 */</span><br><span> </span><br><span> /* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org></span><br><span>@@ -28,6 +28,7 @@</span><br><span> #include <osmocom/gsm/mncc.h></span><br><span> </span><br><span> #include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span> </span><br><span> struct gsm_network;</span><br><span> struct msgb;</span><br><span>@@ -169,7 +170,7 @@</span><br><span>    unsigned char   data[0];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MNCC_SOCK_VERSION     6</span><br><span style="color: hsl(120, 100%, 40%);">+#define MNCC_SOCK_VERSION    7</span><br><span> struct gsm_mncc_hello {</span><br><span>         uint32_t        msg_type;</span><br><span>    uint32_t        version;</span><br><span>@@ -188,8 +189,7 @@</span><br><span> struct gsm_mncc_rtp {</span><br><span>      uint32_t        msg_type;</span><br><span>    uint32_t        callref;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t        ip;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t        port;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct sockaddr_storage addr;</span><br><span>        uint32_t        payload_type;</span><br><span>        uint32_t        payload_msg_type;</span><br><span>    char            sdp[1024];</span><br><span>diff --git a/src/sdp.c b/src/sdp.c</span><br><span>index 46330cd..0fd7a09 100644</span><br><span>--- a/src/sdp.c</span><br><span>+++ b/src/sdp.c</span><br><span>@@ -32,6 +32,8 @@</span><br><span> </span><br><span> #include <string.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * Check if the media mode attribute exists in SDP, in this</span><br><span>  * case update the passed pointer with the media mode</span><br><span>@@ -136,6 +138,7 @@</span><br><span>   sdp_parser_t *parser;</span><br><span>        sdp_media_t *media;</span><br><span>  const char *sdp_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t port;</span><br><span>       bool found_conn = false, found_map = false;</span><br><span> </span><br><span>      if (!sip->sip_payload || !sip->sip_payload->pl_data) {</span><br><span>@@ -159,13 +162,22 @@</span><br><span>      }</span><br><span> </span><br><span>        for (conn = sdp->sdp_connection; conn; conn = conn->c_next) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct in_addr addr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (conn->c_addrtype != sdp_addr_ip4)</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (conn->c_addrtype) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case sdp_addr_ip4:</span><br><span style="color: hsl(120, 100%, 40%);">+                    leg->base.addr.ss_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+                        inet_pton(AF_INET, conn->c_address,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  &((struct sockaddr_in*)&leg->base.addr)->sin_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+                   found_conn = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case sdp_addr_ip6:</span><br><span style="color: hsl(120, 100%, 40%);">+                    leg->base.addr.ss_family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+                       inet_pton(AF_INET6, conn->c_address,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 &((struct sockaddr_in6*)&leg->base.addr)->sin6_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+                 found_conn = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span>                     continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               inet_aton(conn->c_address, &addr);</span><br><span style="color: hsl(0, 100%, 40%);">-               leg->base.ip = addr.s_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-          found_conn = true;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span>            break;</span><br><span>       }</span><br><span> </span><br><span>@@ -181,7 +193,7 @@</span><br><span>                  if (!any_codec && strcasecmp(map->rm_encoding, leg->wanted_codec) != 0)</span><br><span>                                continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   leg->base.port = media->m_port;</span><br><span style="color: hsl(120, 100%, 40%);">+                 port = media->m_port;</span><br><span>                     leg->base.payload_type = map->rm_pt;</span><br><span>                   found_map = true;</span><br><span>                    break;</span><br><span>@@ -198,18 +210,30 @@</span><br><span>               return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ switch (leg->base.addr.ss_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+         ((struct sockaddr_in*)&leg->base.addr)->sin_port = 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%);">+                ((struct sockaddr_in6*)&leg->base.addr)->sin6_port = 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 style="color: hsl(120, 100%, 40%);">+</span><br><span>  sdp_parser_free(parser);</span><br><span>     return true;</span><br><span> }</span><br><span> </span><br><span> char *sdp_create_file(struct sip_call_leg *leg, struct call_leg *other, sdp_mode_t mode)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct in_addr net = { .s_addr = other->ip };</span><br><span>     char *fmtp_str = NULL, *sdp;</span><br><span>         char *mode_attribute;</span><br><span style="color: hsl(0, 100%, 40%);">-   char ip_addr[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+        char ip_addr[INET6_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+       char ipv;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   inet_ntop(AF_INET, &net, ip_addr, sizeof(ip_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_sockaddr_ntop((const struct sockaddr*)&other->addr, ip_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+     ipv = other->addr.ss_family == AF_INET6 ? '6' : '4';</span><br><span>      leg->wanted_codec = app_media_name(other->payload_msg_type);</span><br><span> </span><br><span>       if (strcmp(leg->wanted_codec, "AMR") == 0)</span><br><span>@@ -235,16 +259,17 @@</span><br><span> </span><br><span>  sdp = talloc_asprintf(leg,</span><br><span>                           "v=0\r\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                             "o=Osmocom 0 0 IN IP4 %s\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                               "o=Osmocom 0 0 IN IP%c %s\r\n"</span><br><span>                             "s=GSM Call\r\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                              "c=IN IP4 %s\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                           "c=IN IP%c %s\r\n"</span><br><span>                                 "t=0 0\r\n"</span><br><span>                                "m=audio %d RTP/AVP %d\r\n"</span><br><span>                                "%s"</span><br><span>                               "a=rtpmap:%d %s/8000\r\n"</span><br><span>                          "%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                         ip_addr, ip_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                               other->port, other->payload_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                               ipv, ip_addr, ipv, ip_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                           osmo_sockaddr_port((const struct sockaddr *)&other->addr),</span><br><span style="color: hsl(120, 100%, 40%);">+                             other->payload_type,</span><br><span>                              fmtp_str ? fmtp_str : "",</span><br><span>                          other->payload_type,</span><br><span>                              leg->wanted_codec,</span><br><span>diff --git a/src/sip.c b/src/sip.c</span><br><span>index c635542..1854f39 100644</span><br><span>--- a/src/sip.c</span><br><span>+++ b/src/sip.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include "sdp.h"</span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span> </span><br><span> #include <sofia-sip/sip_status.h></span><br><span> #include <sofia-sip/su_log.h></span><br><span>@@ -33,6 +34,7 @@</span><br><span> #include <talloc.h></span><br><span> </span><br><span> #include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span> </span><br><span> extern void *tall_mncc_ctx;</span><br><span> </span><br><span>@@ -110,7 +112,7 @@</span><br><span>    struct call *call;</span><br><span>   struct sip_call_leg *leg;</span><br><span>    const char *from = NULL, *to = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    char ip_addr[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+        char ip_addr[INET6_ADDRSTRLEN];</span><br><span> </span><br><span>  LOGP(DSIP, LOGL_INFO, "Incoming call(%s) handle(%p)\n", sip->sip_call_id->i_id, nh);</span><br><span> </span><br><span>@@ -159,11 +161,9 @@</span><br><span>              call_leg_release(&leg->base);</span><br><span>                 return;</span><br><span>      }</span><br><span style="color: hsl(0, 100%, 40%);">-       struct in_addr net = { .s_addr = leg->base.ip };</span><br><span style="color: hsl(0, 100%, 40%);">-     inet_ntop(AF_INET, &net, ip_addr, sizeof(ip_addr));</span><br><span>      LOGP(DSIP, LOGL_INFO, "SDP Extracted: IP=(%s) PORT=(%u) PAYLOAD=(%u).\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                            ip_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                        leg->base.port,</span><br><span style="color: hsl(120, 100%, 40%);">+                            osmo_sockaddr_ntop((const struct sockaddr *)&leg->base.addr, ip_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+                         osmo_sockaddr_port((const struct sockaddr *)&leg->base.addr),</span><br><span>                         leg->base.payload_type);</span><br><span> </span><br><span>       leg->base.release_call = sip_release_call;</span><br><span>@@ -186,9 +186,8 @@</span><br><span> </span><br><span>      char *sdp;</span><br><span>   sdp_mode_t mode = sdp_sendrecv;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t ip = leg->base.ip;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint16_t port = leg->base.port;</span><br><span style="color: hsl(0, 100%, 40%);">-      char ip_addr[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+        char ip_addr[INE6T_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct sockaddr_storage prev_addr = leg->base.addr;</span><br><span> </span><br><span>   LOGP(DSIP, LOGL_INFO, "re-INVITE for call %s\n", sip->sip_call_id->i_id);</span><br><span> </span><br><span>@@ -214,9 +213,9 @@</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   struct in_addr net = { .s_addr = leg->base.ip };</span><br><span style="color: hsl(0, 100%, 40%);">-     inet_ntop(AF_INET, &net, ip_addr, sizeof(ip_addr));</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DSIP, LOGL_DEBUG, "pre re-INVITE have IP:port (%s:%u)\n", ip_addr, leg->base.port);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DSIP, LOGL_DEBUG, "pre re-INVITE have IP:port (%s:%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_sockaddr_ntop((struct sockaddr*)&leg->base.addr, ip_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_sockaddr_port((struct sockaddr*)&leg->base.addr));</span><br><span> </span><br><span>      if (mode == sdp_sendonly) {</span><br><span>          /* SIP side places call on HOLD */</span><br><span>@@ -231,10 +230,11 @@</span><br><span>                   call_leg_release(&leg->base);</span><br><span>                         return;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-               struct in_addr net = { .s_addr = leg->base.ip };</span><br><span style="color: hsl(0, 100%, 40%);">-             inet_ntop(AF_INET, &net, ip_addr, sizeof(ip_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DSIP, LOGL_DEBUG, "Media IP:port in re-INVITE: (%s:%u)\n", ip_addr, leg->base.port);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ip != leg->base.ip || port != leg->base.port) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DSIP, LOGL_DEBUG, "Media IP:port in re-INVITE: (%s:%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_sockaddr_ntop((struct sockaddr*)&leg->base.addr, ip_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_sockaddr_port((struct sockaddr*)&leg->base.addr));</span><br><span style="color: hsl(120, 100%, 40%);">+           if (osmo_sockaddr_cmp((struct osmo_sockaddr *)&prev_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                               (struct osmo_sockaddr *)&leg->base)) {</span><br><span>                  LOGP(DSIP, LOGL_INFO, "re-INVITE changes media connection.\n");</span><br><span>                    if (other->update_rtp)</span><br><span>                            other->update_rtp(leg->base.call->remote);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/20052">change 20052</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/osmo-sip-connector/+/20052"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sip-connector </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I3b1bebbcc9e36be43d8d055c8d28cbb38ff21b37 </div>
<div style="display:none"> Gerrit-Change-Number: 20052 </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>