<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/26189">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">rework message handling<br><br>This was previously broken and a free endpoint was requirted to dlcx *,<br>additionaly globally handling this is difficult due to different<br>response<br>codes, so just do it in the functions, they know best.<br><br>Change-Id: I8cbbe5936067ea1caa7935e8d14908ac5c4010bd<br>---<br>M src/libosmo-mgcp/mgcp_protocol.c<br>1 file changed, 57 insertions(+), 58 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/89/26189/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 f0c184b..7775415 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -97,10 +97,6 @@</span><br><span>    /* function pointer to the request handler */</span><br><span>        struct msgb *(*handle_request)(struct mgcp_request_data *data);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* true if the request requires an endpoint, false if only a trunk</span><br><span style="color: hsl(0, 100%, 40%);">-       * is sufficient. (corner cases, e.g. wildcarded DLCX) */</span><br><span style="color: hsl(0, 100%, 40%);">-       bool require_endp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   /* a human readable name that describes the request */</span><br><span>       char *debug_name;</span><br><span> };</span><br><span>@@ -112,32 +108,34 @@</span><br><span> static struct msgb *handle_rsip(struct mgcp_request_data *data);</span><br><span> static struct msgb *handle_noti_req(struct mgcp_request_data *data);</span><br><span> static const struct mgcp_request mgcp_requests[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-     { .name = "AUEP",</span><br><span style="color: hsl(0, 100%, 40%);">-       .handle_request = handle_audit_endpoint,</span><br><span style="color: hsl(0, 100%, 40%);">-        .debug_name = "AuditEndpoint",</span><br><span style="color: hsl(0, 100%, 40%);">-        .require_endp = true },</span><br><span style="color: hsl(0, 100%, 40%);">-       { .name = "CRCX",</span><br><span style="color: hsl(0, 100%, 40%);">-       .handle_request = handle_create_con,</span><br><span style="color: hsl(0, 100%, 40%);">-    .debug_name = "CreateConnection",</span><br><span style="color: hsl(0, 100%, 40%);">-     .require_endp = true },</span><br><span style="color: hsl(0, 100%, 40%);">-       { .name = "DLCX",</span><br><span style="color: hsl(0, 100%, 40%);">-       .handle_request = handle_delete_con,</span><br><span style="color: hsl(0, 100%, 40%);">-    .debug_name = "DeleteConnection",</span><br><span style="color: hsl(0, 100%, 40%);">-     .require_endp = false },</span><br><span style="color: hsl(0, 100%, 40%);">-      { .name = "MDCX",</span><br><span style="color: hsl(0, 100%, 40%);">-       .handle_request = handle_modify_con,</span><br><span style="color: hsl(0, 100%, 40%);">-    .debug_name = "ModifiyConnection",</span><br><span style="color: hsl(0, 100%, 40%);">-    .require_endp = true },</span><br><span style="color: hsl(0, 100%, 40%);">-       { .name = "RQNT",</span><br><span style="color: hsl(0, 100%, 40%);">-       .handle_request = handle_noti_req,</span><br><span style="color: hsl(0, 100%, 40%);">-      .debug_name = "NotificationRequest",</span><br><span style="color: hsl(0, 100%, 40%);">-          .require_endp = true },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .name = "AUEP", .handle_request = handle_audit_endpoint, .debug_name = "AuditEndpoint" },</span><br><span style="color: hsl(120, 100%, 40%);">+       {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "CRCX",</span><br><span style="color: hsl(120, 100%, 40%);">+             .handle_request = handle_create_con,</span><br><span style="color: hsl(120, 100%, 40%);">+          .debug_name = "CreateConnection",</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%);">+             .name = "DLCX",</span><br><span style="color: hsl(120, 100%, 40%);">+             .handle_request = handle_delete_con,</span><br><span style="color: hsl(120, 100%, 40%);">+          .debug_name = "DeleteConnection",</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%);">+             .name = "MDCX",</span><br><span style="color: hsl(120, 100%, 40%);">+             .handle_request = handle_modify_con,</span><br><span style="color: hsl(120, 100%, 40%);">+          .debug_name = "ModifiyConnection",</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%);">+             .name = "RQNT",</span><br><span style="color: hsl(120, 100%, 40%);">+             .handle_request = handle_noti_req,</span><br><span style="color: hsl(120, 100%, 40%);">+            .debug_name = "NotificationRequest",</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span> </span><br><span>       /* SPEC extension */</span><br><span style="color: hsl(0, 100%, 40%);">-    { .name = "RSIP",</span><br><span style="color: hsl(0, 100%, 40%);">-       .handle_request = handle_rsip,</span><br><span style="color: hsl(0, 100%, 40%);">-          .debug_name = "ReSetInProgress",</span><br><span style="color: hsl(0, 100%, 40%);">-      .require_endp = true },</span><br><span style="color: hsl(120, 100%, 40%);">+     {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "RSIP",</span><br><span style="color: hsl(120, 100%, 40%);">+             .handle_request = handle_rsip,</span><br><span style="color: hsl(120, 100%, 40%);">+                .debug_name = "ReSetInProgress",</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span> };</span><br><span> </span><br><span> /* Initalize transcoder */</span><br><span>@@ -424,17 +422,8 @@</span><br><span>    }</span><br><span> </span><br><span>        /* Find an appropriate handler for the current request and execute it */</span><br><span style="color: hsl(0, 100%, 40%);">-        for (i = 0; i < ARRAY_SIZE(mgcp_requests); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+  for (int i = 0; i < ARRAY_SIZE(mgcp_requests); i++) {</span><br><span>             if (strcmp(mgcp_requests[i].name, rq.name) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* Check if the request requires and endpoint, if yes, check if we have it, otherwise don't</span><br><span style="color: hsl(0, 100%, 40%);">-                  * execute the request handler. */</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (mgcp_requests[i].require_endp && !rq.endp) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     "%s: the request handler \"%s\" requires an endpoint resource for \"%s\", which is not available -- abort\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     rq.name, mgcp_requests[i].debug_name, pdata.epname);</span><br><span style="color: hsl(0, 100%, 40%);">-                               return create_err_response(rq.trunk, NULL, -rq.mgcp_cause, rq.name, pdata.trans);</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>                    /* Execute request handler */</span><br><span>                        if (rq.endp)</span><br><span>                                 LOGP(DLMGCP, LOGL_INFO,</span><br><span>@@ -465,6 +454,11 @@</span><br><span> static struct msgb *handle_audit_endpoint(struct mgcp_request_data *rq)</span><br><span> {</span><br><span>       LOGPENDP(rq->endp, DLMGCP, LOGL_NOTICE, "AUEP: auditing endpoint ...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!rq->endp || !mgcp_endp_avail(rq->endp)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPENDP(rq->endp, DLMGCP, LOGL_ERROR, "AUEP: selected endpoint not available!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return create_err_response(rq->trunk, NULL, 501, "AUEP", rq->pdata->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return create_ok_response(rq->trunk, rq->endp, 200, "AUEP", rq->pdata->trans);</span><br><span> }</span><br><span> </span><br><span>@@ -859,6 +853,13 @@</span><br><span> </span><br><span>     LOGPENDP(endp, DLMGCP, LOGL_NOTICE, "CRCX: creating new connection ...\n");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     /* we must have a free ep */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!endp) {</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_AVAIL));</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPENDP(endp, DLMGCP, LOGL_ERROR, "CRCX: no free endpoints available!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(rq->trunk, NULL, 403, "CRCX", pdata->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!mgcp_endp_avail(endp)) {</span><br><span>                rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_AVAIL));</span><br><span>               LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>@@ -1116,13 +1117,6 @@</span><br><span> </span><br><span>      LOGPENDP(endp, DLMGCP, LOGL_NOTICE, "MDCX: modifying existing connection ...\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!mgcp_endp_avail(endp)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_AVAIL));</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                       "MDCX: selected endpoint not available!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return create_err_response(endp, NULL, 501, "MDCX", pdata->trans);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Prohibit wildcarded requests */</span><br><span>   if (rq->wildcarded) {</span><br><span>             LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>@@ -1131,6 +1125,11 @@</span><br><span>          return create_err_response(rq->trunk, endp, 507, "MDCX", pdata->trans);</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!endp || !mgcp_endp_avail(endp)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_AVAIL));</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPENDP(endp, DLMGCP, LOGL_ERROR, "MDCX: selected endpoint not available!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return create_err_response(rq->trunk, NULL, 501, "MDCX", pdata->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    if (llist_count(&endp->conns) <= 0) {</span><br><span>              LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "MDCX: endpoint is not holding a connection.\n");</span><br><span>@@ -1349,6 +1348,19 @@</span><br><span>                return create_err_response(endp, endp, 515, "DLCX", pdata->trans);</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 trunk 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 (rq->wildcarded) {</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 < trunk->number_endpoints; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 num_conns += llist_count(&trunk->endpoints[i]->conns);</span><br><span style="color: hsl(120, 100%, 40%);">+                      mgcp_endp_release(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(trunk, NULL, 200, "DLCX", pdata->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  for_each_line(line, pdata->save) {</span><br><span>                if (!mgcp_check_param(endp, trunk, line))</span><br><span>                    continue;</span><br><span>@@ -1398,19 +1410,6 @@</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Handle wildcarded DLCX that refers to the whole trunk. This means</span><br><span style="color: hsl(0, 100%, 40%);">-     * that we walk over all endpoints on the trunk in order to drop all</span><br><span style="color: hsl(0, 100%, 40%);">-     * connections on the trunk. (see also RFC3435 Annex F.7) */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rq->wildcarded) {</span><br><span style="color: hsl(0, 100%, 40%);">-                int num_conns = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-              for (i = 0; i < trunk->number_endpoints; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   num_conns += llist_count(&trunk->endpoints[i]->conns);</span><br><span style="color: hsl(0, 100%, 40%);">-                        mgcp_endp_release(trunk->endpoints[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               rate_ctr_add(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_SUCCESS), num_conns);</span><br><span style="color: hsl(0, 100%, 40%);">-          return create_ok_response(trunk, NULL, 200, "DLCX", pdata->trans);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* The logic does not permit to go past this point without having the</span><br><span>         * the endp pointer populated. */</span><br><span>    OSMO_ASSERT(endp);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/26189">change 26189</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/+/26189"/><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: I8cbbe5936067ea1caa7935e8d14908ac5c4010bd </div>
<div style="display:none"> Gerrit-Change-Number: 26189 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>