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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trunk: parse E1 trunk number<br><br>The E1 trunk number is currently not parsed, whenever a trunk prefix is<br>detected that indicates an E1 trunk, then the entire request is<br>rejected.<br><br>Parse the trunk number and select the trunk accordingly<br><br>Related: OS#2547<br>Change-Id: Ifdaab953544151e73b58cc3e95d21afdb40765f4<br>---<br>M include/osmocom/mgcp/mgcp_trunk.h<br>M src/libosmo-mgcp/mgcp_trunk.c<br>M tests/mgcp/mgcp_test.c<br>3 files changed, 70 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/mgcp/mgcp_trunk.h b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>index c6a0997..82728fe 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>@@ -50,6 +50,7 @@</span><br><span> int mgcp_trunk_alloc_endpts(struct mgcp_trunk *tcfg);</span><br><span> struct mgcp_trunk *mgcp_trunk_by_num(const struct mgcp_config *cfg, int index);</span><br><span> struct mgcp_trunk *mgcp_trunk_by_name(const struct mgcp_config *cfg, const char *epname);</span><br><span style="color: hsl(120, 100%, 40%);">+int e1_trunk_nr_from_epname(const char *epname);</span><br><span> </span><br><span> /* The virtual trunk is always created on trunk id 0 for historical reasons,</span><br><span>  * use this define constant as ID when allocating a virtual trunk. Other</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_trunk.c b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>index bd7bb2a..cc6637b 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>@@ -118,6 +118,27 @@</span><br><span>    return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Made public for unit-testing, do not use from outside this file */</span><br><span style="color: hsl(120, 100%, 40%);">+int e1_trunk_nr_from_epname(const char *epname)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned long int trunk_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t prefix_len;</span><br><span style="color: hsl(120, 100%, 40%);">+    char *str_trunk_nr_end;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_E1_TRUNK) - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (strncmp(epname, MGCP_ENDPOINT_PREFIX_E1_TRUNK, prefix_len) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     errno = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk_nr = strtoul(epname + prefix_len, &str_trunk_nr_end, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (errno == ERANGE || trunk_nr > 64 || trunk_nr == 0</span><br><span style="color: hsl(120, 100%, 40%);">+          || epname + prefix_len == str_trunk_nr_end</span><br><span style="color: hsl(120, 100%, 40%);">+            || str_trunk_nr_end[0] != '/')</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       else</span><br><span style="color: hsl(120, 100%, 40%);">+          return trunk_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Find a trunk by the trunk prefix in the endpoint name.</span><br><span>  *  \param[in] epname endpoint name with trunk prefix to look up.</span><br><span>  *  \param[in] cfg that contains the trunks where the endpoint is located.</span><br><span>@@ -126,6 +147,7 @@</span><br><span> {</span><br><span>    size_t prefix_len;</span><br><span>   char epname_lc[MGCP_ENDPOINT_MAXLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned long int trunk_nr;</span><br><span> </span><br><span>      osmo_str_tolower_buf(epname_lc, sizeof(epname_lc), epname);</span><br><span>  epname = epname_lc;</span><br><span>@@ -135,13 +157,12 @@</span><br><span>          return mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* E1 trunks are not implemented yet, so we deny any request for an</span><br><span style="color: hsl(0, 100%, 40%);">-      * e1 trunk for now. */</span><br><span>      prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_E1_TRUNK) - 1;</span><br><span>      if (strncmp(epname, MGCP_ENDPOINT_PREFIX_E1_TRUNK, prefix_len) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                     "endpoint name \"%s\" suggests an E1 trunk, but E1 trunks are not implemented in this version of osmo-mgw!\n", epname);</span><br><span style="color: hsl(0, 100%, 40%);">-                return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          trunk_nr = e1_trunk_nr_from_epname(epname);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (trunk_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          return mgcp_trunk_by_num(cfg, trunk_nr);</span><br><span>     }</span><br><span> </span><br><span>        /* Earlier versions of osmo-mgw were accepting endpoint names</span><br><span>diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c</span><br><span>index 56a17b1..b0647f4 100644</span><br><span>--- a/tests/mgcp/mgcp_test.c</span><br><span>+++ b/tests/mgcp/mgcp_test.c</span><br><span>@@ -2130,6 +2130,48 @@</span><br><span>  talloc_free(conn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void test_e1_trunk_nr_from_epname()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int trunk_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Note: e1_trunk_nr_from_epname does not check the text</span><br><span style="color: hsl(120, 100%, 40%);">+       * after the E1 trunk number, after the delimiter</span><br><span style="color: hsl(120, 100%, 40%);">+      * character "/" arbitrary text may follow. */</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk_nr = e1_trunk_nr_from_epname("ds/e1-1/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(trunk_nr == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk_nr = e1_trunk_nr_from_epname("ds/e1-2/s-2/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(trunk_nr == 2);</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk_nr = e1_trunk_nr_from_epname("ds/e1-3/s-23/su32-0");</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(trunk_nr == 3);</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk_nr = e1_trunk_nr_from_epname("ds/e1-3/xxxxxxx");</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk_nr == 3);</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk_nr = e1_trunk_nr_from_epname("ds/e1-24/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(trunk_nr == 24);</span><br><span style="color: hsl(120, 100%, 40%);">+  trunk_nr = e1_trunk_nr_from_epname("ds/e1-64/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(trunk_nr == 64);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* The following endpoint strings should fail, either the</span><br><span style="color: hsl(120, 100%, 40%);">+      * trunk number exceeds the valid range or the trunk prefix</span><br><span style="color: hsl(120, 100%, 40%);">+    * is wrong. Also when the delimiter character "/" at the</span><br><span style="color: hsl(120, 100%, 40%);">+    * end of the trunk is wrong the parsing should fail. */</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk_nr = e1_trunk_nr_from_epname("ds/e1-0/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(trunk_nr == -EINVAL);</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk_nr = e1_trunk_nr_from_epname("ds/e1-65/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(trunk_nr == -EINVAL);</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk_nr = e1_trunk_nr_from_epname("ds/e1--1/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(trunk_nr == -EINVAL);</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk_nr = e1_trunk_nr_from_epname("xxxxxx4zyz");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(trunk_nr == -EINVAL);</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk_nr = e1_trunk_nr_from_epname("ds/e1+2/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(trunk_nr == -EINVAL);</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk_nr = e1_trunk_nr_from_epname("ds/e2-24/s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(trunk_nr == -EINVAL);</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk_nr = e1_trunk_nr_from_epname("ds/e1-24s-1/su16-0");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(trunk_nr == -EINVAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>         void *ctx = talloc_named_const(NULL, 0, "mgcp_test");</span><br><span>@@ -2155,6 +2197,7 @@</span><br><span>      test_check_local_cx_options(ctx);</span><br><span>    test_mgcp_codec_pt_translate();</span><br><span>      test_conn_id_matching();</span><br><span style="color: hsl(120, 100%, 40%);">+      test_e1_trunk_nr_from_epname();</span><br><span> </span><br><span>  OSMO_ASSERT(talloc_total_size(msgb_ctx) == 0);</span><br><span>       OSMO_ASSERT(talloc_total_blocks(msgb_ctx) == 1);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/18752">change 18752</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/+/18752"/><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: Ifdaab953544151e73b58cc3e95d21afdb40765f4 </div>
<div style="display:none"> Gerrit-Change-Number: 18752 </div>
<div style="display:none"> Gerrit-PatchSet: 14 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@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: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>