<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24823">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgcp_protocol: add support for wildcarded DLCX<br><br>At the moment osmo-mgw does not support wildcarded DLCX requests that<br>refer to the whole trunk, even though RFC3435 specifies it. However,<br>wildcarded DLCX requests would enable the BSC or the MSC to reset its<br>companioun osmo-mgw instance to a defined state after restart.<br><br>Change-Id: I0770cf46d93ab09efe9cafdd56d2e3f1132db189<br>---<br>M src/libosmo-mgcp/mgcp_protocol.c<br>M src/libosmo-mgcp/mgcp_ratectr.c<br>2 files changed, 20 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/23/24823/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>index 3014048..55c5370 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -1263,9 +1263,10 @@</span><br><span>         char stats[1048];</span><br><span>    const char *conn_id = NULL;</span><br><span>  struct mgcp_conn_rtp *conn = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int i;</span><br><span> </span><br><span>  LOGPENDP(endp, DLMGCP, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-              "DLCX: deleting connection ...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 "DLCX: deleting connection(s) ...\n");</span><br><span> </span><br><span>        if (!mgcp_endp_avail(endp)) {</span><br><span>                rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_FAIL_AVAIL));</span><br><span>@@ -1274,15 +1275,7 @@</span><br><span>              return create_err_response(NULL, 501, "DLCX", p->trans);</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Prohibit wildcarded requests */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (endp->wildcarded_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                       "DLCX: wildcarded endpoint names not supported.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_FAIL_WILDCARD));</span><br><span style="color: hsl(0, 100%, 40%);">-               return create_err_response(endp, 507, "DLCX", p->trans);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (llist_count(&endp->conns) <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!endp->wildcarded_req && llist_count(&endp->conns) <= 0) {</span><br><span>          LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "DLCX: endpoint is not holding a connection.\n");</span><br><span>                 rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_FAIL_NO_CONN));</span><br><span>@@ -1344,9 +1337,23 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle wildcarded DLCX that refers to the whole trunk. This means</span><br><span style="color: hsl(120, 100%, 40%);">+   * that we walk over all endpoints on the trank in order to drop all</span><br><span style="color: hsl(120, 100%, 40%);">+   * connections on the trunk. (see also RFC3435 Annex F.7) */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (endp->wildcarded_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+                int num_conns = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            for (i = 0; i < endp->trunk->number_endpoints; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        num_conns += llist_count(&endp->conns);</span><br><span style="color: hsl(120, 100%, 40%);">+                        mgcp_endp_release(endp->trunk->endpoints[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             rate_ctr_add(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_SUCCESS), num_conns);</span><br><span style="color: hsl(120, 100%, 40%);">+                return create_ok_response(endp, 200, "DLCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* When no connection id is supplied, we will interpret this as a</span><br><span style="color: hsl(0, 100%, 40%);">-        * wildcarded DLCX and drop all connections at once. (See also</span><br><span style="color: hsl(0, 100%, 40%);">-   * RFC3435 Section F.7) */</span><br><span style="color: hsl(120, 100%, 40%);">+     * wildcarded DLCX that refers to the selected endpoint. This means</span><br><span style="color: hsl(120, 100%, 40%);">+    * that we drop all connections on that specific endpoint at once.</span><br><span style="color: hsl(120, 100%, 40%);">+     * (See also RFC3435 Section F.7) */</span><br><span>         if (!conn_id) {</span><br><span>              int num_conns = llist_count(&endp->conns);</span><br><span>            LOGPENDP(endp, DLMGCP, LOGL_NOTICE,</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_ratectr.c b/src/libosmo-mgcp/mgcp_ratectr.c</span><br><span>index 2868062..833cb19 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_ratectr.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_ratectr.c</span><br><span>@@ -105,7 +105,7 @@</span><br><span> </span><br><span> static const struct rate_ctr_desc mgcp_dlcx_ctr_desc[] = {</span><br><span>         [MGCP_DLCX_SUCCESS] = { "dlcx:success", "DLCX command processed successfully." },</span><br><span style="color: hsl(0, 100%, 40%);">-   [MGCP_DLCX_FAIL_WILDCARD] = { "dlcx:wildcard", "wildcard names in DLCX commands are unsupported." },</span><br><span style="color: hsl(120, 100%, 40%);">+      [MGCP_DLCX_FAIL_WILDCARD] = { "dlcx:wildcard", "(deprecated)" },</span><br><span>         [MGCP_DLCX_FAIL_NO_CONN] = { "dlcx:no_conn", "endpoint specified in DLCX command has no active connections." },</span><br><span>  [MGCP_DLCX_FAIL_INVALID_CALLID] =</span><br><span>        { "dlcx:callid", "CallId specified in DLCX command mismatches endpoint's CallId ." },</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24823">change 24823</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/+/24823"/><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: I0770cf46d93ab09efe9cafdd56d2e3f1132db189 </div>
<div style="display:none"> Gerrit-Change-Number: 24823 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>