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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgcp_client: add function to generate e1-endpoint names<br><br>mgcp_client.h offers functions to generate endpoint names for wildcarded<br>request. This is used in osmo-bsc, lets now also add a function that can<br>generate e1-endpoint names.<br><br>Change-Id: Iec35b5bae8a7b07ddb3559f7114a24dcd10e8f14<br>Related: OS#2547<br>---<br>M include/osmocom/mgcp_client/mgcp_client.h<br>M src/libosmo-mgcp-client/mgcp_client.c<br>M tests/mgcp_client/mgcp_client_test.c<br>M tests/mgcp_client/mgcp_client_test.err<br>M tests/mgcp_client/mgcp_client_test.ok<br>5 files changed, 126 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 32bd87b..d4dd2d9 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>@@ -137,6 +137,8 @@</span><br><span> </span><br><span> const char *mgcp_client_endpoint_domain(const struct mgcp_client *mgcp);</span><br><span> const char *mgcp_client_rtpbridge_wildcard(const struct mgcp_client *mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *mgcp_client_e1_epname(void *ctx, const struct mgcp_client *mgcp, uint8_t trunk_id, uint8_t ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                               uint8_t rate, uint8_t offset);</span><br><span> </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>diff --git a/src/libosmo-mgcp-client/mgcp_client.c b/src/libosmo-mgcp-client/mgcp_client.c</span><br><span>index bbf805b..1ca7483 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>@@ -902,6 +902,58 @@</span><br><span>   return _mgcp_client_name_append_domain(mgcp, "rtpbridge/*");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Compose endpoint name for an E1 endpoint.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ctx talloc context.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] mgcp MGCP client descriptor.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] trunk_id id number of the E1 trunk (1-64).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ts timeslot on the E1 trunk (1-31).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] rate bitrate used on the E1 trunk (e.g 16 for 16kbit).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] offset bit offset of the E1 subslot (e.g. 4 for the third 16k subslot).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns string containing the endpoint name (e.g. ds/e1-1/s-1/su16-4). */</span><br><span style="color: hsl(120, 100%, 40%);">+const char *mgcp_client_e1_epname(void *ctx, const struct mgcp_client *mgcp, uint8_t trunk_id, uint8_t ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                               uint8_t rate, uint8_t offset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    /* See also comment in libosmo-mgcp, mgcp_client.c, gen_e1_epname() */</span><br><span style="color: hsl(120, 100%, 40%);">+        const uint8_t valid_rates[] = { 64, 32, 32, 16, 16, 16, 16, 8, 8, 8, 8, 8, 8, 8, 8 };</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t valid_offsets[] = { 0, 0, 4, 0, 2, 4, 6, 0, 1, 2, 3, 4, 5, 6, 7 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+    bool rate_offs_valid = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *epname;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       epname =</span><br><span style="color: hsl(120, 100%, 40%);">+          talloc_asprintf(ctx, "ds/e1-%u/s-%u/su%u-%u@%s", trunk_id, ts, rate, offset,</span><br><span style="color: hsl(120, 100%, 40%);">+                        mgcp_client_endpoint_domain(mgcp));</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!epname) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DLMGCP, LOGL_ERROR, "Cannot compose MGCP e1-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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Check if the supplied rate/offset pair resembles a valid combination */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < sizeof(valid_rates); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (valid_rates[i] == rate && valid_offsets[i] == offset)</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_offs_valid = true;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!rate_offs_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                   "Cannot compose MGCP e1-endpoint name (%s), rate(%u)/offset(%u) combination is invalid!\n", epname,</span><br><span style="color: hsl(120, 100%, 40%);">+                 rate, offset);</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(epname);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An E1 line has a maximum of 32 timeslots, while the first (ts=0) is</span><br><span style="color: hsl(120, 100%, 40%);">+         * reserverd for framing and alignment, so we can not use it here. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ts == 0 || ts > 31) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                   "Cannot compose MGCP e1-endpoint name (%s), E1-timeslot number (%u) is invalid!\n", epname, ts);</span><br><span style="color: hsl(120, 100%, 40%);">+               talloc_free(epname);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return epname;</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/tests/mgcp_client/mgcp_client_test.c b/tests/mgcp_client/mgcp_client_test.c</span><br><span>index d2e34a6..db9f4f8 100644</span><br><span>--- a/tests/mgcp_client/mgcp_client_test.c</span><br><span>+++ b/tests/mgcp_client/mgcp_client_test.c</span><br><span>@@ -547,6 +547,57 @@</span><br><span>        printf("\n");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void test_mgcp_client_e1_epname(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    char *epname;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (mgcp)</span><br><span style="color: hsl(120, 100%, 40%);">+             talloc_free(mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+    mgcp = mgcp_client_init(ctx, &conf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Valid endpoint names */</span><br><span style="color: hsl(120, 100%, 40%);">+    epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 1, 15, 64, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 2, 14, 32, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 3, 13, 32, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 4, 12, 16, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 5, 11, 16, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 6, 10, 16, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 7, 9, 16, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 8, 8, 8, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 9, 7, 8, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 10, 6, 8, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 11, 5, 8, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 12, 4, 8, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 13, 3, 8, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 14, 2, 8, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 8, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("%s\n", epname);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* A few invalid enpoint names */</span><br><span style="color: hsl(120, 100%, 40%);">+     epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 128, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(epname == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 8, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(epname == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 0, 8, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(epname == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 64, 8, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(epname == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static const struct log_info_cat log_categories[] = {</span><br><span> };</span><br><span> </span><br><span>@@ -575,6 +626,7 @@</span><br><span>   test_sdp_section_start();</span><br><span>    test_map_codec_to_pt_and_map_pt_to_codec();</span><br><span>  test_map_pt_to_codec();</span><br><span style="color: hsl(120, 100%, 40%);">+       test_mgcp_client_e1_epname();</span><br><span> </span><br><span>    printf("Done\n");</span><br><span>  fprintf(stderr, "Done\n");</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 fbcf8f6..e114f79 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>@@ -72,4 +72,9 @@</span><br><span> DLMGCP ptmap contains illegal mapping: codec=0 maps to pt=100</span><br><span> DLMGCP ptmap contains illegal mapping: codec=113 maps to pt=2</span><br><span> DLMGCP ptmap contains illegal mapping: codec=0 maps to pt=100</span><br><span style="color: hsl(120, 100%, 40%);">+DLMGCP MGCP client: using endpoint domain '@mgw'</span><br><span style="color: hsl(120, 100%, 40%);">+DLMGCP Cannot compose MGCP e1-endpoint name (ds/e1-15/s-1/su128-0@mgw), rate(128)/offset(0) combination is invalid!</span><br><span style="color: hsl(120, 100%, 40%);">+DLMGCP Cannot compose MGCP e1-endpoint name (ds/e1-15/s-1/su8-16@mgw), rate(8)/offset(16) combination is invalid!</span><br><span style="color: hsl(120, 100%, 40%);">+DLMGCP Cannot compose MGCP e1-endpoint name (ds/e1-15/s-0/su8-2@mgw), E1-timeslot number (0) is invalid!</span><br><span style="color: hsl(120, 100%, 40%);">+DLMGCP Cannot compose MGCP e1-endpoint name (ds/e1-15/s-64/su8-2@mgw), E1-timeslot number (64) is invalid!</span><br><span> Done</span><br><span>diff --git a/tests/mgcp_client/mgcp_client_test.ok b/tests/mgcp_client/mgcp_client_test.ok</span><br><span>index 8b3e15b..2b03ba1 100644</span><br><span>--- a/tests/mgcp_client/mgcp_client_test.ok</span><br><span>+++ b/tests/mgcp_client/mgcp_client_test.ok</span><br><span>@@ -178,4 +178,19 @@</span><br><span>  2 <= 2</span><br><span>  100 <= 100</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-1/s-15/su64-0@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-2/s-14/su32-0@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-3/s-13/su32-4@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-4/s-12/su16-0@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-5/s-11/su16-2@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-6/s-10/su16-4@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-7/s-9/su16-6@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-8/s-8/su8-0@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-9/s-7/su8-1@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-10/s-6/su8-2@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-11/s-5/su8-3@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-12/s-4/su8-4@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-13/s-3/su8-5@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-14/s-2/su8-6@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+ds/e1-15/s-1/su8-7@mgw</span><br><span> Done</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/19075">change 19075</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/+/19075"/><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: Iec35b5bae8a7b07ddb3559f7114a24dcd10e8f14 </div>
<div style="display:none"> Gerrit-Change-Number: 19075 </div>
<div style="display:none"> Gerrit-PatchSet: 9 </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: daniel <dwillmann@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>