<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12357">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgcp_client: make domain part of endpoint configurable<br><br>So far, both osmo-msc and osmo-bsc always pass endpoint names of the form<br>'...@mgw' to osmo-mgw. Allow configuring the 'mgw' part.<br><br>Note that the actual way to pass a differing name is to pass a composed<br>'rtpbridge/*@foo' to mgcp_msg_gen() in the struct mgcp_msg. So this merely adds<br>a common VTY config for the domain name part, changes to clients are necessary.<br><br>- add mgcp_client_rtpbridge_wildcard() (useful for AoIP endpoints)<br>- add mgcp_client_endpoint_domain() (useful for SCCPlite endpoints)<br>- add mgcp client vty cfg 'mgw endpoint-domain NAME'<br><br>Rationale: reading pcaps becomes so much easier when each of osmo-bsc and<br>osmo-msc address their MGW with differing domain names. Otherwise, both will<br>have a '0@mgw' endpoint and it gets really confusing.<br><br>Also: our MGCP clients osmo-bsc and osmo-msc use code dup to compose the<br>initial 'rtpbridge/*@mgw' rtpbridge wildcard. It should be defined by this API<br>instead.<br><br>This will be used by:<br>* osmo-msc I87ac11847d1a6d165ee9a2b5d8a4978e7ac73433<br>* osmo-bsc I492023e9dca0233ec0a077032455d9f2e3880f78<br><br>After these, with according configuration, there can be a '0@bsc' and a '0@msc'<br>endpoint on two separate osmo-mgw instances:<br><br>osmo-mgw-for-bsc.cfg:<br> mgcp<br>  domain bsc<br><br>osmo-bsc.cfg:<br> msc 0<br>  mgw endpoint-domain bsc<br><br>osmo-mgw-for-msc.cfg:<br> mgcp<br>  domain msc<br><br>osmo-msc.cfg:<br> msc<br>  mgw endpoint-domain msc<br><br>There can also be '0@bsc' and '1@msc' endpoints on one single osmo-mgw instance with:<br><br>osmo-mgw.cfg:<br> mgcp<br>  domain *<br><br>and same osmo-{bsc,msc}.cfg as above.<br><br>(By default, everything will still use '@mgw')<br><br>Change-Id: Ia662016f29dd8727d9c4626d726729641e21e1f8<br>---<br>M include/osmocom/mgcp_client/mgcp_client.h<br>M src/libosmo-mgcp-client/mgcp_client.c<br>M src/libosmo-mgcp-client/mgcp_client_vty.c<br>M tests/mgcp_client/mgcp_client_test.err<br>4 files changed, 66 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/mgcp_client/mgcp_client.h b/include/osmocom/mgcp_client/mgcp_client.h</span><br><span>index c1fd1b0..98e58d7 100644</span><br><span>--- a/include/osmocom/mgcp_client/mgcp_client.h</span><br><span>+++ b/include/osmocom/mgcp_client/mgcp_client.h</span><br><span>@@ -22,6 +22,10 @@</span><br><span>      int local_port;</span><br><span>      const char *remote_addr;</span><br><span>     int remote_port;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* By default, we are always addressing the MGW with e.g. 'rtpbridge/123@mgw'.</span><br><span style="color: hsl(120, 100%, 40%);">+         * If this is nonempty, the contained name will be used instead of 'mgw'. */</span><br><span style="color: hsl(120, 100%, 40%);">+  char endpoint_domain_name[MGCP_ENDPOINT_MAXLEN];</span><br><span> };</span><br><span> </span><br><span> typedef unsigned int mgcp_trans_id_t;</span><br><span>@@ -120,6 +124,9 @@</span><br><span> uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);</span><br><span> uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const char *mgcp_client_endpoint_domain(const struct mgcp_client *mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *mgcp_client_rtpbridge_wildcard(const struct mgcp_client *mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Invoked when an MGCP response is received or sending failed.  When the</span><br><span>  * response is passed as NULL, this indicates failure during transmission. */</span><br><span> typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);</span><br><span>diff --git a/src/libosmo-mgcp-client/mgcp_client.c b/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>index 8fa82cd..03e1da7 100644</span><br><span>--- a/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>+++ b/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>@@ -705,6 +705,16 @@</span><br><span>    mgcp->actual.remote_port = conf->remote_port >= 0 ? (uint16_t)conf->remote_port :</span><br><span>                MGCP_CLIENT_REMOTE_PORT_DEFAULT;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (osmo_strlcpy(mgcp->actual.endpoint_domain_name, conf->endpoint_domain_name,</span><br><span style="color: hsl(120, 100%, 40%);">+                  sizeof(mgcp->actual.endpoint_domain_name))</span><br><span style="color: hsl(120, 100%, 40%);">+            >= sizeof(mgcp->actual.endpoint_domain_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DLMGCP, LOGL_ERROR, "MGCP client: endpoint domain name is too long, max length is %zu: '%s'\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     sizeof(mgcp->actual.endpoint_domain_name) - 1, conf->endpoint_domain_name);</span><br><span style="color: hsl(120, 100%, 40%);">+                talloc_free(mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DLMGCP, LOGL_NOTICE, "MGCP client: using endpoint domain '@%s'\n", mgcp_client_endpoint_domain(mgcp));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      return mgcp;</span><br><span> }</span><br><span> </span><br><span>@@ -811,6 +821,32 @@</span><br><span>         return mgcp->remote_addr;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* To compose endpoint names, usually for CRCX, use this as domain name.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For example, snprintf("rtpbridge\*@%s", mgcp_client_endpoint_domain(mgcp)). */</span><br><span style="color: hsl(120, 100%, 40%);">+const char *mgcp_client_endpoint_domain(const struct mgcp_client *mgcp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      return mgcp->actual.endpoint_domain_name[0] ? mgcp->actual.endpoint_domain_name : "mgw";</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%);">+const char *mgcp_client_rtpbridge_wildcard(const struct mgcp_client *mgcp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  static char endpoint[MGCP_ENDPOINT_MAXLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define RTPBRIDGE_WILDCARD_FMT "rtpbridge/*@%s"</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = snprintf(endpoint, sizeof(endpoint), RTPBRIDGE_WILDCARD_FMT, mgcp_client_endpoint_domain(mgcp));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc > sizeof(endpoint) - 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DLMGCP, LOGL_ERROR, "MGCP endpoint exceeds maximum length of %zu: '" RTPBRIDGE_WILDCARD_FMT "'\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                sizeof(endpoint) - 1, mgcp_client_endpoint_domain(mgcp));</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DLMGCP, LOGL_ERROR, "Cannot compose MGCP endpoint name\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     return endpoint;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct mgcp_response_pending * mgcp_client_pending_add(</span><br><span>                                     struct mgcp_client *mgcp,</span><br><span>                                    mgcp_trans_id_t trans_id,</span><br><span>diff --git a/src/libosmo-mgcp-client/mgcp_client_vty.c b/src/libosmo-mgcp-client/mgcp_client_vty.c</span><br><span>index 8fa0272..d4e78f1 100644</span><br><span>--- a/src/libosmo-mgcp-client/mgcp_client_vty.c</span><br><span>+++ b/src/libosmo-mgcp-client/mgcp_client_vty.c</span><br><span>@@ -137,6 +137,22 @@</span><br><span>       BTS_START_STR</span><br><span>       UDP_PORT_STR)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_mgw_endpoint_domain_name,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_mgw_endpoint_domain_name_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "mgw endpoint-domain NAME",</span><br><span style="color: hsl(120, 100%, 40%);">+      MGW_STR "Set the domain name to send in MGCP messages, e.g. the part 'foo' in 'rtpbridge/*@foo'.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Domain name, should be alphanumeric.\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (osmo_strlcpy(global_mgcp_client_conf->endpoint_domain_name, argv[0],</span><br><span style="color: hsl(120, 100%, 40%);">+                    sizeof(global_mgcp_client_conf->endpoint_domain_name))</span><br><span style="color: hsl(120, 100%, 40%);">+        >= sizeof(global_mgcp_client_conf->endpoint_domain_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "%% Error: 'mgw endpoint-domain' name too long, max length is %zu: '%s'%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                    sizeof(global_mgcp_client_conf->endpoint_domain_name) - 1, argv[0], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+          return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</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> int mgcp_client_config_write(struct vty *vty, const char *indent)</span><br><span> {</span><br><span>   const char *addr;</span><br><span>@@ -160,6 +176,10 @@</span><br><span>             vty_out(vty, "%smgw remote-port %u%s", indent,</span><br><span>                     (uint16_t)port, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     if (global_mgcp_client_conf->endpoint_domain_name[0])</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%smgw endpoint-domain %s%s", indent,</span><br><span style="color: hsl(120, 100%, 40%);">+                  global_mgcp_client_conf->endpoint_domain_name, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -174,6 +194,7 @@</span><br><span>   install_element(node, &cfg_mgw_remote_port_cmd);</span><br><span>         install_element(node, &cfg_mgw_endpoint_range_cmd);</span><br><span>      install_element(node, &cfg_mgw_rtp_bts_base_port_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(node, &cfg_mgw_endpoint_domain_name_cmd);</span><br><span> </span><br><span>    /* deprecated 'mgcpgw' commands */</span><br><span>   install_element(node, &cfg_mgcpgw_local_ip_cmd);</span><br><span>diff --git a/tests/mgcp_client/mgcp_client_test.err b/tests/mgcp_client/mgcp_client_test.err</span><br><span>index 1d5a1a0..627b2d9 100644</span><br><span>--- a/tests/mgcp_client/mgcp_client_test.err</span><br><span>+++ b/tests/mgcp_client/mgcp_client_test.err</span><br><span>@@ -1,6 +1,8 @@</span><br><span style="color: hsl(120, 100%, 40%);">+DLMGCP MGCP client: using endpoint domain '@mgw'</span><br><span> DLMGCP message buffer to small, can not generate MGCP message</span><br><span> </span><br><span> test_mgcp_client_cancel():</span><br><span style="color: hsl(120, 100%, 40%);">+DLMGCP MGCP client: using endpoint domain '@mgw'</span><br><span> - composed msg with trans_id=1</span><br><span> - not in queue yet, cannot cancel yet</span><br><span> DLMGCP Cannot cancel, no such transaction: 1</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12357">change 12357</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/12357"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ia662016f29dd8727d9c4626d726729641e21e1f8 </div>
<div style="display:none"> Gerrit-Change-Number: 12357 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: Stefan Sperling <stsp@stsp.name> </div>
<div style="display:none"> Gerrit-CC: Vadim Yanitskiy <axilirator@gmail.com> </div>