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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgw: Introduce VTY cmd 'rtp bind-ip-v6' command<br><br>This commit allows for fully IPv6 systems to work fine. However, if a<br>remote endpoint still wants to use IPv4, it will fail since at this<br>point osmo-mgw still doesn't re-bind the local end of the connection to<br>an IPv4 after having initially bound it to an IPv6 one. This kind of<br>scenarios get fixed in next commits.<br><br>TODO: really bind the socket if a different IP address is requested.<br><br>Change-Id: I8ed94bd3f674f498e6ba315f44a351fff9c1be15<br>---<br>M include/osmocom/mgcp/mgcp.h<br>M src/libosmo-mgcp/mgcp_network.c<br>M src/libosmo-mgcp/mgcp_vty.c<br>3 files changed, 53 insertions(+), 15 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/mgcp/mgcp.h b/include/osmocom/mgcp/mgcp.h</span><br><span>index 75e531b..f3f225e 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp.h</span><br><span>@@ -95,7 +95,8 @@</span><br><span>  */</span><br><span> struct mgcp_port_range {</span><br><span>    /* addr or NULL to fall-back to default */</span><br><span style="color: hsl(0, 100%, 40%);">-      char *bind_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *bind_addr_v4;</span><br><span style="color: hsl(120, 100%, 40%);">+   char *bind_addr_v6;</span><br><span> </span><br><span>      /* dynamically allocated */</span><br><span>  int range_start;</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_network.c b/src/libosmo-mgcp/mgcp_network.c</span><br><span>index 6ecb945..84f3604 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_network.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_network.c</span><br><span>@@ -102,9 +102,11 @@</span><br><span>     char ipbuf[INET6_ADDRSTRLEN];</span><br><span>        int rc;</span><br><span>      endp = conn->conn->endp;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool rem_addr_set = !addr_is_any(&conn->end.addr);</span><br><span style="color: hsl(120, 100%, 40%);">+     char *bind_addr;</span><br><span> </span><br><span>         /* Try probing the local IP-Address */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (endp->cfg->net_ports.bind_addr_probe && !addr_is_any(&conn->end.addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (endp->cfg->net_ports.bind_addr_probe && rem_addr_set) {</span><br><span>            rc = osmo_sock_local_ip(addr, osmo_sockaddr_ntop(&conn->end.addr.u.sa, ipbuf));</span><br><span>               if (rc < 0)</span><br><span>                       LOGPCONN(conn->conn, DRTP, LOGL_ERROR,</span><br><span>@@ -118,21 +120,31 @@</span><br><span>    }</span><br><span> </span><br><span>        /* Select from preconfigured IP-Addresses. We don't have bind_addr for Osmux (yet?). */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (endp->cfg->net_ports.bind_addr) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rem_addr_set) {</span><br><span>          /* Check there is a bind IP for the RTP traffic configured,</span><br><span>           * if so, use that IP-Address */</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_strlcpy(addr, endp->cfg->net_ports.bind_addr, INET6_ADDRSTRLEN);</span><br><span style="color: hsl(120, 100%, 40%);">+           bind_addr = conn->end.addr.u.sa.sa_family == AF_INET6 ?</span><br><span style="color: hsl(120, 100%, 40%);">+                            endp->cfg->net_ports.bind_addr_v6 :</span><br><span style="color: hsl(120, 100%, 40%);">+                             endp->cfg->net_ports.bind_addr_v4;</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Choose any of the bind addresses, preferring v6 over v4 */</span><br><span style="color: hsl(120, 100%, 40%);">+         bind_addr = endp->cfg->net_ports.bind_addr_v6;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!bind_addr)</span><br><span style="color: hsl(120, 100%, 40%);">+                       bind_addr = endp->cfg->net_ports.bind_addr_v4;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (bind_addr) {</span><br><span>             LOGPCONN(conn->conn, DRTP, LOGL_DEBUG,</span><br><span>                     "using configured rtp bind ip as local bind ip %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                         addr);</span><br><span style="color: hsl(120, 100%, 40%);">+                        bind_addr);</span><br><span>         } else {</span><br><span>             /* No specific bind IP is configured for the RTP traffic, so</span><br><span>                  * assume the IP where we listen for incoming MGCP messages</span><br><span>           * as bind IP */</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_strlcpy(addr, endp->cfg->source_addr, INET6_ADDRSTRLEN);</span><br><span style="color: hsl(120, 100%, 40%);">+           bind_addr = endp->cfg->source_addr;</span><br><span>            LOGPCONN(conn->conn, DRTP, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                       "using mgcp bind ip as local rtp bind ip: %s\n", addr);</span><br><span style="color: hsl(120, 100%, 40%);">+                     "using mgcp bind ip as local rtp bind ip: %s\n", bind_addr);</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_strlcpy(addr, bind_addr, INET6_ADDRSTRLEN);</span><br><span> }</span><br><span> </span><br><span> /* This does not need to be a precision timestamp and</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_vty.c b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>index 8ea1cdd..aa27d41 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_vty.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>@@ -71,9 +71,12 @@</span><br><span>     vty_out(vty, " rtp port-range %u %u%s",</span><br><span>            g_cfg->net_ports.range_start, g_cfg->net_ports.range_end,</span><br><span>              VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (g_cfg->net_ports.bind_addr)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (g_cfg->net_ports.bind_addr_v4)</span><br><span>                vty_out(vty, " rtp bind-ip %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                     g_cfg->net_ports.bind_addr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                  g_cfg->net_ports.bind_addr_v4, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (g_cfg->net_ports.bind_addr_v6)</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, " rtp bind-ip-v6 %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                        g_cfg->net_ports.bind_addr_v6, VTY_NEWLINE);</span><br><span>      if (g_cfg->net_ports.bind_addr_probe)</span><br><span>             vty_out(vty, " rtp ip-probing%s", VTY_NEWLINE);</span><br><span>    else</span><br><span>@@ -500,12 +503,11 @@</span><br><span> </span><br><span> DEFUN(cfg_mgcp_rtp_bind_ip,</span><br><span>       cfg_mgcp_rtp_bind_ip_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "rtp bind-ip " VTY_IPV46_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+      "rtp bind-ip A.B.C.D",</span><br><span>       RTP_STR "Bind endpoints facing the Network\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "IPv4 Address to bind to\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "IPv6 Address to bind to\n")</span><br><span style="color: hsl(120, 100%, 40%);">+      "IPv4 Address to bind to\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v4, argv[0]);</span><br><span>   return CMD_SUCCESS;</span><br><span> }</span><br><span> ALIAS_DEPRECATED(cfg_mgcp_rtp_bind_ip,</span><br><span>@@ -519,8 +521,8 @@</span><br><span>       NO_STR RTP_STR "Bind endpoints facing the Network\n"</span><br><span>       "Address to bind to\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        talloc_free(g_cfg->net_ports.bind_addr);</span><br><span style="color: hsl(0, 100%, 40%);">-     g_cfg->net_ports.bind_addr = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(g_cfg->net_ports.bind_addr_v4);</span><br><span style="color: hsl(120, 100%, 40%);">+        g_cfg->net_ports.bind_addr_v4 = NULL;</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> ALIAS_DEPRECATED(cfg_mgcp_rtp_no_bind_ip,</span><br><span>@@ -529,6 +531,27 @@</span><br><span>                  NO_STR RTP_STR "Bind endpoints facing the Network\n"</span><br><span>               "Address to bind to\n")</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_mgcp_rtp_bind_ip_v6,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_mgcp_rtp_bind_ip_v6_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "rtp bind-ip-v6 " VTY_IPV6_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+      RTP_STR "Bind endpoints facing the Network\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "IPv6 Address to bind to\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v6, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    return CMD_SUCCESS;</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%);">+DEFUN(cfg_mgcp_rtp_no_bind_ip_v6,</span><br><span style="color: hsl(120, 100%, 40%);">+cfg_mgcp_rtp_no_bind_ip_v6_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+"no rtp bind-ip-v6",</span><br><span style="color: hsl(120, 100%, 40%);">+NO_STR RTP_STR "Bind endpoints facing the Network\n"</span><br><span style="color: hsl(120, 100%, 40%);">+"Address to bind to\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_free(g_cfg->net_ports.bind_addr_v6);</span><br><span style="color: hsl(120, 100%, 40%);">+        g_cfg->net_ports.bind_addr_v6 = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_mgcp_rtp_net_bind_ip_probing,</span><br><span>       cfg_mgcp_rtp_net_bind_ip_probing_cmd,</span><br><span>       "rtp ip-probing",</span><br><span>@@ -1527,8 +1550,10 @@</span><br><span>     install_element(MGCP_NODE, &cfg_mgcp_rtp_port_range_cmd);</span><br><span>        install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);</span><br><span>       install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_v6_cmd);</span><br><span>        install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);</span><br><span>    install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_v6_cmd);</span><br><span>     install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_probing_cmd);</span><br><span>       install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_probing_cmd);</span><br><span>    install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/19970">change 19970</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-mgw/+/19970"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-mgw </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I8ed94bd3f674f498e6ba315f44a351fff9c1be15 </div>
<div style="display:none"> Gerrit-Change-Number: 19970 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>