<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24941">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgcp_protocol: refactor MGCP request handling<br><br>At the moment the MGCP request handling and message parsing is not<br>clearly separated. The function mgcp_parse_header() in mgcp_msg.c is<br>also responsible for resolving an endpoint. This leads to unclear layer<br>separation. We eventually end up in a situation where we can not execute<br>any request handler without beeing able to resolve an endpoint, however<br>this is necessary if we want to implement wildcarded DLCX resquests.<br><br>In the current situation a wildcarded DLCX is not possible to implement<br>as we always have to resolve a an to get to the trunk which we need to<br>iterate. However, we just can't resolve a free endpoint in a situation<br>where all endpoints on te trunk are in use.<br><br>We have to refactor the request handler so that the parsing in mgcp_msg<br>only extracts us the endpoint name. The resolving is then done in<br>mgcp_handle_message() in mgcp_protocol.c. Then we are able to decide<br>what to do if we are unable to resolve an endpoint but still be able to<br>resolve the trunk.<br><br>This patch does not change the behaviour of osmo-mgw yet, but it lays<br>the foundation for request handler implementations that can still<br>perform useful actions if no endpoint but a trunk has been resolved. A<br>wilcarded DLCX is such a case. It does not need an endpoint, just the<br>trunk.<br><br>Change-Id: I9f519d8a0ee8a513fa1e74acf3ee7dbc0991cdde<br>Related: SYS#5535<br>---<br>M include/osmocom/mgcp/mgcp_protocol.h<br>M src/libosmo-mgcp/mgcp_msg.c<br>M src/libosmo-mgcp/mgcp_protocol.c<br>M src/libosmo-mgcp/mgcp_sdp.c<br>4 files changed, 190 insertions(+), 126 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/41/24941/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/mgcp/mgcp_protocol.h b/include/osmocom/mgcp/mgcp_protocol.h</span><br><span>index cdce02d..7ab283d 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_protocol.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_protocol.h</span><br><span>@@ -3,7 +3,7 @@</span><br><span> /* Internal structure while parsing a request */</span><br><span> struct mgcp_parse_data {</span><br><span>         struct mgcp_config *cfg;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct mgcp_endpoint *endp;</span><br><span style="color: hsl(120, 100%, 40%);">+   char *epname;</span><br><span>        char *trans;</span><br><span>         char *save;</span><br><span> };</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_msg.c b/src/libosmo-mgcp/mgcp_msg.c</span><br><span>index 8783e20..fdd2e0d 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_msg.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_msg.c</span><br><span>@@ -132,10 +132,10 @@</span><br><span> }</span><br><span> </span><br><span> /*! Analyze and parse the the hader of an MGCP messeage string.</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[out] pdata caller provided memory to store the parsing results</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] data mgcp message string</span><br><span style="color: hsl(0, 100%, 40%);">- *  \returns when the status line was complete and transaction_id and</span><br><span style="color: hsl(0, 100%, 40%);">- *  endp out parameters are set, -1 on error */</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] pdata caller provided memory to store the parsing results.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] data mgcp message string.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 when the status line was complete and parseable, negative (MGCP</span><br><span style="color: hsl(120, 100%, 40%);">+ *  cause code) on error. */</span><br><span> int mgcp_parse_header(struct mgcp_parse_data *pdata, char *data)</span><br><span> {</span><br><span>      int i = 0;</span><br><span>@@ -143,10 +143,7 @@</span><br><span>    int cause;</span><br><span> </span><br><span>       /*! This function will parse the header part of the received</span><br><span style="color: hsl(0, 100%, 40%);">-     *  MGCP message. The parsing results are stored in pdata.</span><br><span style="color: hsl(0, 100%, 40%);">-       *  The function will also automatically search the pool with</span><br><span style="color: hsl(0, 100%, 40%);">-    *  available endpoints in order to find an endpoint that matches</span><br><span style="color: hsl(0, 100%, 40%);">-        *  the endpoint string in in the header */</span><br><span style="color: hsl(120, 100%, 40%);">+    *  MGCP message. The parsing results are stored in pdata. */</span><br><span> </span><br><span>    OSMO_ASSERT(data);</span><br><span>   pdata->trans = "000000";</span><br><span>@@ -158,26 +155,20 @@</span><br><span>                        pdata->trans = elem;</span><br><span>                      break;</span><br><span>               case 1:</span><br><span style="color: hsl(0, 100%, 40%);">-                 pdata->endp = mgcp_endp_by_name(&cause, elem, pdata->cfg);</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (!pdata->endp) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     "Unable to find Endpoint `%s'\n", elem);</span><br><span style="color: hsl(0, 100%, 40%);">-                             OSMO_ASSERT(cause < 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                              return cause;</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(120, 100%, 40%);">+                     pdata->epname = elem;</span><br><span>                     break;</span><br><span>               case 2:</span><br><span>                      if (strcasecmp("MGCP", elem)) {</span><br><span>                            LOGP(DLMGCP, LOGL_ERROR,</span><br><span>                                  "MGCP header parsing error\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                          return -510;</span><br><span style="color: hsl(120, 100%, 40%);">+                          cause = -510;</span><br><span style="color: hsl(120, 100%, 40%);">+                         goto error;</span><br><span>                  }</span><br><span>                    break;</span><br><span>               case 3:</span><br><span>                      if (strcmp("1.0", elem)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            LOGP(DLMGCP, LOGL_ERROR, "MGCP version `%s' "</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "not supported\n", elem);</span><br><span style="color: hsl(0, 100%, 40%);">-                                return -528;</span><br><span style="color: hsl(120, 100%, 40%);">+                          cause = -528;</span><br><span style="color: hsl(120, 100%, 40%);">+                         goto error;</span><br><span>                  }</span><br><span>                    break;</span><br><span>               }</span><br><span>@@ -186,12 +177,15 @@</span><br><span> </span><br><span>        if (i != 4) {</span><br><span>                LOGP(DLMGCP, LOGL_ERROR, "MGCP status line too short.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            pdata->trans = "000000";</span><br><span style="color: hsl(0, 100%, 40%);">-           pdata->endp = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-          return -510;</span><br><span style="color: hsl(120, 100%, 40%);">+          cause = -510;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto error;</span><br><span>  }</span><br><span> </span><br><span>        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+error:</span><br><span style="color: hsl(120, 100%, 40%);">+     pdata->trans = "000000";</span><br><span style="color: hsl(120, 100%, 40%);">+ pdata->epname = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+      return cause;</span><br><span> }</span><br><span> </span><br><span> /*! Extract OSMUX CID from an MGCP parameter line (string).</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>index dbbf308..7f6fa69 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -46,6 +46,24 @@</span><br><span> #include <osmocom/mgcp/mgcp_codec.h></span><br><span> #include <osmocom/mgcp/mgcp_conn.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Request data passed to the request handler */</span><br><span style="color: hsl(120, 100%, 40%);">+struct mgcp_request_data {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* request name (e.g. "MDCX") */</span><br><span style="color: hsl(120, 100%, 40%);">+    const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* parsing results from the MGCP header (trans id, endpoint name ...) */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_parse_data *pdata;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* pointer to endpoint resource (may be NULL, handler must check!) */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_endpoint *endp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* pointer to trunk resource (may be NULL, handler must check!) */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mgcp_trunk *trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* contains cause code in case of problems during endp/trunk resolution */</span><br><span style="color: hsl(120, 100%, 40%);">+    int mgcp_cause;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Request handler specification, here we specify an array with function</span><br><span>  * pointers to the various MGCP requests implemented below */</span><br><span> struct mgcp_request {</span><br><span>@@ -53,7 +71,11 @@</span><br><span>     char *name;</span><br><span> </span><br><span>      /* function pointer to the request handler */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *(*handle_request) (struct mgcp_parse_data * data);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *(*handle_request) (struct mgcp_request_data * data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* true if the request requires an endpoint, false if only a trunk</span><br><span style="color: hsl(120, 100%, 40%);">+     * is sufficient. (corner cases, e.g. wildcarded DLCX) */</span><br><span style="color: hsl(120, 100%, 40%);">+     bool require_endp;</span><br><span> </span><br><span>       /* a humen readable name that describes the request */</span><br><span>       char *debug_name;</span><br><span>@@ -68,24 +90,30 @@</span><br><span> static const struct mgcp_request mgcp_requests[] = {</span><br><span>      { .name = "AUEP",</span><br><span>    .handle_request = handle_audit_endpoint,</span><br><span style="color: hsl(0, 100%, 40%);">-        .debug_name = "AuditEndpoint" },</span><br><span style="color: hsl(120, 100%, 40%);">+    .debug_name = "AuditEndpoint",</span><br><span style="color: hsl(120, 100%, 40%);">+      .require_endp = true },</span><br><span>    { .name = "CRCX",</span><br><span>    .handle_request = handle_create_con,</span><br><span style="color: hsl(0, 100%, 40%);">-    .debug_name = "CreateConnection" },</span><br><span style="color: hsl(120, 100%, 40%);">+         .debug_name = "CreateConnection",</span><br><span style="color: hsl(120, 100%, 40%);">+   .require_endp = true },</span><br><span>    { .name = "DLCX",</span><br><span>    .handle_request = handle_delete_con,</span><br><span style="color: hsl(0, 100%, 40%);">-    .debug_name = "DeleteConnection" },</span><br><span style="color: hsl(120, 100%, 40%);">+         .debug_name = "DeleteConnection",</span><br><span style="color: hsl(120, 100%, 40%);">+   .require_endp = true },</span><br><span>    { .name = "MDCX",</span><br><span>    .handle_request = handle_modify_con,</span><br><span style="color: hsl(0, 100%, 40%);">-    .debug_name = "ModifiyConnection" },</span><br><span style="color: hsl(120, 100%, 40%);">+        .debug_name = "ModifiyConnection",</span><br><span style="color: hsl(120, 100%, 40%);">+          .require_endp = true },</span><br><span>    { .name = "RQNT",</span><br><span>    .handle_request = handle_noti_req,</span><br><span style="color: hsl(0, 100%, 40%);">-      .debug_name = "NotificationRequest" },</span><br><span style="color: hsl(120, 100%, 40%);">+      .debug_name = "NotificationRequest",</span><br><span style="color: hsl(120, 100%, 40%);">+        .require_endp = true },</span><br><span> </span><br><span>        /* SPEC extension */</span><br><span>         { .name = "RSIP",</span><br><span>    .handle_request = handle_rsip,</span><br><span style="color: hsl(0, 100%, 40%);">-          .debug_name = "ReSetInProgress" },</span><br><span style="color: hsl(120, 100%, 40%);">+          .debug_name = "ReSetInProgress",</span><br><span style="color: hsl(120, 100%, 40%);">+    .require_endp = true },</span><br><span> };</span><br><span> </span><br><span> /* Initalize transcoder */</span><br><span>@@ -295,6 +323,7 @@</span><br><span> {</span><br><span>         struct rate_ctr_group *rate_ctrs = cfg->ratectr.mgcp_general_ctr_group;</span><br><span>   struct mgcp_parse_data pdata;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_request_data rq;</span><br><span>         int rc, i, code, handled = 0;</span><br><span>        struct msgb *resp = NULL;</span><br><span>    char *data;</span><br><span>@@ -324,53 +353,91 @@</span><br><span> </span><br><span>      msg->l3h = &msg->l2h[4];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /*</span><br><span style="color: hsl(0, 100%, 40%);">-       * Check for a duplicate message and respond.</span><br><span style="color: hsl(0, 100%, 40%);">-    */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Parse message, extract endpoint name and transaction identifier */</span><br><span>        memset(&pdata, 0, sizeof(pdata));</span><br><span>        pdata.cfg = cfg;</span><br><span>     data = mgcp_strline((char *)msg->l3h, &pdata.save);</span><br><span style="color: hsl(120, 100%, 40%);">+    rq.name = (const char *)&msg->l2h[0];</span><br><span>         rc = mgcp_parse_header(&pdata, data);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (pdata.endp && pdata.trans</span><br><span style="color: hsl(0, 100%, 40%);">-       && pdata.endp->last_trans</span><br><span style="color: hsl(0, 100%, 40%);">-            && strcmp(pdata.endp->last_trans, pdata.trans) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_GENERAL_RX_MSGS_RETRANSMITTED));</span><br><span style="color: hsl(0, 100%, 40%);">-            return do_retransmission(pdata.endp);</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%);">-       /* check for general parser failure */</span><br><span>       if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLMGCP, LOGL_NOTICE, "%s: failed to find the endpoint\n", msg->l2h);</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_GENERAL_RX_FAIL_NO_ENDPOINT));</span><br><span style="color: hsl(0, 100%, 40%);">-              return create_err_response(NULL, -rc, (const char *) msg->l2h, pdata.trans);</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DLMGCP, LOGL_ERROR, "%s: failed to parse MCGP message\n", rq.name);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_GENERAL_RX_FAIL_MSG_PARSE));</span><br><span style="color: hsl(120, 100%, 40%);">+              return create_err_response(NULL, -rc, rq.name, pdata.trans);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < ARRAY_SIZE(mgcp_requests); ++i) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (strncmp</span><br><span style="color: hsl(0, 100%, 40%);">-                 (mgcp_requests[i].name, (const char *)&msg->l2h[0],</span><br><span style="color: hsl(0, 100%, 40%);">-               4) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Locate endpoint and trunk, if no endpoint can be located try at least to identify the trunk. */</span><br><span style="color: hsl(120, 100%, 40%);">+    rq.pdata = &pdata;</span><br><span style="color: hsl(120, 100%, 40%);">+        rq.endp = mgcp_endp_by_name(&rc, pdata.epname, pdata.cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!rq.endp) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                   "%s: failed to find endpoint \"%s\", cause=%d -- trying to identify trunk...\n", rq.name,</span><br><span style="color: hsl(120, 100%, 40%);">+                 pdata.epname, -rc);</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_GENERAL_RX_FAIL_NO_ENDPOINT));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* If we are unable to find the endpoint we still may be able to identify the trunk. Some request</span><br><span style="color: hsl(120, 100%, 40%);">+              * handler will still be able to perform a useful action if the request refers to the whole trunk</span><br><span style="color: hsl(120, 100%, 40%);">+              * (wildcarded) */</span><br><span style="color: hsl(120, 100%, 40%);">+            rq.trunk = mgcp_trunk_by_name(pdata.cfg, pdata.epname);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!rq.trunk) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DLMGCP, LOGL_ERROR, "%s: failed to identify trunk for endpoint \"%s\" -- abort\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        rq.name, pdata.epname);</span><br><span style="color: hsl(120, 100%, 40%);">+                  return create_err_response(NULL, -rc, rq.name, pdata.trans);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             rq.mgcp_cause = rc;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              rq.trunk = rq.endp->trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+         rq.mgcp_cause = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Check if we have to retransmit a response from a previous transaction */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (pdata.trans && rq.endp->last_trans && strcmp(rq.endp->last_trans, pdata.trans) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_GENERAL_RX_MSGS_RETRANSMITTED));</span><br><span style="color: hsl(120, 100%, 40%);">+                  return do_retransmission(rq.endp);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Find an approriate handler for the current request and execute it */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < ARRAY_SIZE(mgcp_requests); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (strncmp(mgcp_requests[i].name, rq.name, 4) == 0) {</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+                        * execute the request handler. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (mgcp_requests[i].require_endp && !rq.endp) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+                                   rq.name, mgcp_requests[i].debug_name, pdata.epname);</span><br><span style="color: hsl(120, 100%, 40%);">+                             return create_err_response(NULL, -rq.mgcp_cause, rq.name, pdata.trans);</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%);">+                   /* Execute request handler */</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (rq.endp)</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOGP(DLMGCP, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "%s: executing request handler \"%s\" for endpoint resource \"%s\"\n", rq.name,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 mgcp_requests[i].debug_name, rq.endp->name);</span><br><span style="color: hsl(120, 100%, 40%);">+                  else</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOGP(DLMGCP, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "%s: executing request handler \"%s\" for trunk resource of endpoint \"%s\"\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 rq.name, mgcp_requests[i].debug_name, pdata.epname);</span><br><span style="color: hsl(120, 100%, 40%);">+                     resp = mgcp_requests[i].handle_request(&rq);</span><br><span>                     handled = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                    resp = mgcp_requests[i].handle_request(&pdata);</span><br><span>                  break;</span><br><span>               }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Check if the MGCP request was handled and increment rate counters accordingly. */</span><br><span>         if (handled) {</span><br><span>               rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_GENERAL_RX_MSGS_HANDLED));</span><br><span>       } else {</span><br><span>             rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_GENERAL_RX_MSGS_UNHANDLED));</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLMGCP, LOGL_NOTICE, "MSG with type: '%.4s' not handled\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   &msg->l2h[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DLMGCP, LOGL_ERROR, "MSG with type: '%.4s' not handled\n", &msg->l2h[0]);</span><br><span>      }</span><br><span> </span><br><span>        return resp;</span><br><span> }</span><br><span> </span><br><span> /* AUEP command handler, processes the received command */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *handle_audit_endpoint(struct mgcp_parse_data *p)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *handle_audit_endpoint(struct mgcp_request_data *rq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   LOGPENDP(p->endp, DLMGCP, LOGL_NOTICE, "AUEP: auditing endpoint ...\n");</span><br><span style="color: hsl(0, 100%, 40%);">-   return create_ok_response(p->endp, 200, "AUEP", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGPENDP(rq->endp, DLMGCP, LOGL_NOTICE, "AUEP: auditing endpoint ...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        return create_ok_response(rq->endp, 200, "AUEP", rq->pdata->trans);</span><br><span> }</span><br><span> </span><br><span> /* Try to find a free port by attempting to bind on it. Also handle the</span><br><span>@@ -661,9 +728,9 @@</span><br><span> </span><br><span> /* Process codec information contained in CRCX/MDCX */</span><br><span> static int handle_codec_info(struct mgcp_conn_rtp *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                           struct mgcp_parse_data *p, int have_sdp, bool crcx)</span><br><span style="color: hsl(120, 100%, 40%);">+                           struct mgcp_request_data *rq, int have_sdp, bool crcx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct mgcp_endpoint *endp = p->endp;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_endpoint *endp = rq->endp;</span><br><span>    int rc;</span><br><span>      char *cmd;</span><br><span> </span><br><span>@@ -677,7 +744,7 @@</span><br><span>                 /* If we have SDP, we ignore the local connection options and</span><br><span>                 * use only the SDP information. */</span><br><span>          mgcp_codec_reset_all(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-             rc = mgcp_parse_sdp_data(endp, conn, p);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = mgcp_parse_sdp_data(endp, conn, rq->pdata);</span><br><span>          if (rc != 0) {</span><br><span>                       LOGPCONN(conn->conn, DLMGCP,  LOGL_ERROR,</span><br><span>                                  "%s: sdp not parseable\n", cmd);</span><br><span>@@ -743,10 +810,11 @@</span><br><span> }</span><br><span> </span><br><span> /* CRCX command handler, processes the received command */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *handle_create_con(struct mgcp_parse_data *p)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *handle_create_con(struct mgcp_request_data *rq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct mgcp_trunk *trunk = p->endp->trunk;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct mgcp_endpoint *endp = p->endp;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_parse_data *pdata = rq->pdata;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_trunk *trunk = rq->trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_endpoint *endp = rq->endp;</span><br><span>    struct rate_ctr_group *rate_ctrs = trunk->ratectr.mgcp_crcx_ctr_group;</span><br><span>    int error_code = 400;</span><br><span>        const char *local_options = NULL;</span><br><span>@@ -765,11 +833,11 @@</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>                    "CRCX: selected endpoint not available!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return create_err_response(NULL, 501, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(NULL, 501, "CRCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        /* parse CallID C: and LocalParameters L: */</span><br><span style="color: hsl(0, 100%, 40%);">-    for_each_line(line, p->save) {</span><br><span style="color: hsl(120, 100%, 40%);">+     for_each_line(line, pdata->save) {</span><br><span>                if (!mgcp_check_param(endp, line))</span><br><span>                   continue;</span><br><span> </span><br><span>@@ -785,7 +853,7 @@</span><br><span>                   * together with a CRCX, the MGW will assign the</span><br><span>                      * connection identifier by itself on CRCX */</span><br><span>                        rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_BAD_ACTION));</span><br><span style="color: hsl(0, 100%, 40%);">-                     return create_err_response(NULL, 523, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(NULL, 523, "CRCX", pdata->trans);</span><br><span>                    break;</span><br><span>               case 'M':</span><br><span>                    mode = (const char *)line + 3;</span><br><span>@@ -793,7 +861,7 @@</span><br><span>                 case 'X':</span><br><span>                    if (strncasecmp("Osmux: ", line + 2, strlen("Osmux: ")) == 0) {</span><br><span>                          /* If osmux is disabled, just skip setting it up */</span><br><span style="color: hsl(0, 100%, 40%);">-                             if (!p->endp->cfg->osmux)</span><br><span style="color: hsl(120, 100%, 40%);">+                            if (!rq->endp->cfg->osmux)</span><br><span>                                  break;</span><br><span>                               osmux_cid = mgcp_osmux_setup(endp, line);</span><br><span>                            break;</span><br><span>@@ -811,7 +879,7 @@</span><br><span>                         LOGPENDP(endp, DLMGCP, LOGL_NOTICE,</span><br><span>                           "CRCX: unhandled option: '%c'/%d\n", *line, *line);</span><br><span>                       rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_UNHANDLED_PARAM));</span><br><span style="color: hsl(0, 100%, 40%);">-                        return create_err_response(NULL, 539, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(NULL, 539, "CRCX", pdata->trans);</span><br><span>                    break;</span><br><span>               }</span><br><span>    }</span><br><span>@@ -822,14 +890,14 @@</span><br><span>            LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "CRCX: insufficient parameters, missing callid\n");</span><br><span>               rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_MISSING_CALLID));</span><br><span style="color: hsl(0, 100%, 40%);">-         return create_err_response(endp, 516, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(endp, 516, "CRCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        if (!mode) {</span><br><span>                 LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "CRCX: insufficient parameters, missing mode\n");</span><br><span>                 rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_INVALID_MODE));</span><br><span style="color: hsl(0, 100%, 40%);">-           return create_err_response(endp, 517, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(endp, 517, "CRCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        /* Check if we are able to accept the creation of another connection */</span><br><span>@@ -846,7 +914,7 @@</span><br><span>                        /* There is no more room for a connection, leave</span><br><span>                      * everything as it is and return with an error */</span><br><span>                   rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_LIMIT_EXCEEDED));</span><br><span style="color: hsl(0, 100%, 40%);">-                 return create_err_response(endp, 540, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(endp, 540, "CRCX", pdata->trans);</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span>@@ -864,7 +932,7 @@</span><br><span>                  /* This is not our call, leave everything as it is and</span><br><span>                        * return with an error. */</span><br><span>                  rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_UNKNOWN_CALLID));</span><br><span style="color: hsl(0, 100%, 40%);">-                 return create_err_response(endp, 400, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(endp, 400, "CRCX", pdata->trans);</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span>@@ -875,7 +943,7 @@</span><br><span>          rc = mgcp_endp_claim(endp, callid);</span><br><span>          if (rc != 0) {</span><br><span>                       rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_CLAIM));</span><br><span style="color: hsl(0, 100%, 40%);">-                  return create_err_response(endp, 502, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(endp, 502, "CRCX", pdata->trans);</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span>@@ -928,7 +996,7 @@</span><br><span>  }</span><br><span> </span><br><span>        /* Handle codec information and decide for a suitable codec */</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = handle_codec_info(conn, p, have_sdp, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = handle_codec_info(conn, rq, have_sdp, true);</span><br><span>    mgcp_codec_summary(conn);</span><br><span>    if (rc) {</span><br><span>            error_code = rc;</span><br><span>@@ -939,8 +1007,8 @@</span><br><span>      conn->end.fmtp_extra = talloc_strdup(trunk->endpoints,</span><br><span>                                              trunk->audio_fmtp_extra);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (p->cfg->force_ptime) {</span><br><span style="color: hsl(0, 100%, 40%);">-                conn->end.packet_duration_ms = p->cfg->force_ptime;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (pdata->cfg->force_ptime) {</span><br><span style="color: hsl(120, 100%, 40%);">+          conn->end.packet_duration_ms = pdata->cfg->force_ptime;</span><br><span>             conn->end.force_output_ptime = 1;</span><br><span>         }</span><br><span> </span><br><span>@@ -973,16 +1041,16 @@</span><br><span>       }</span><br><span> </span><br><span>        /* policy CB */</span><br><span style="color: hsl(0, 100%, 40%);">- if (p->cfg->policy_cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pdata->cfg->policy_cb) {</span><br><span>           int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = p->cfg->policy_cb(endp, MGCP_ENDP_CRCX, p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = pdata->cfg->policy_cb(endp, MGCP_ENDP_CRCX, pdata->trans);</span><br><span>             switch (rc) {</span><br><span>                case MGCP_POLICY_REJECT:</span><br><span>                     LOGPCONN(_conn, DLMGCP, LOGL_NOTICE,</span><br><span>                                  "CRCX: CRCX rejected by policy\n");</span><br><span>                       mgcp_endp_release(endp);</span><br><span>                     rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_FAIL_REJECTED_BY_POLICY));</span><br><span style="color: hsl(0, 100%, 40%);">-                     return create_err_response(endp, 400, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(endp, 400, "CRCX", pdata->trans);</span><br><span>                    break;</span><br><span>               case MGCP_POLICY_DEFER:</span><br><span>                      /* stop processing */</span><br><span>@@ -996,8 +1064,8 @@</span><br><span> </span><br><span>     LOGPCONN(conn->conn, DLMGCP, LOGL_DEBUG,</span><br><span>           "CRCX: Creating connection: port: %u\n", conn->end.local_port);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (p->cfg->change_cb)</span><br><span style="color: hsl(0, 100%, 40%);">-            p->cfg->change_cb(endp, MGCP_ENDP_CRCX);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pdata->cfg->change_cb)</span><br><span style="color: hsl(120, 100%, 40%);">+              pdata->cfg->change_cb(endp, MGCP_ENDP_CRCX);</span><br><span> </span><br><span>       /* Send dummy packet, see also comments in mgcp_keepalive_timer_cb() */</span><br><span>      OSMO_ASSERT(trunk->keepalive_interval >= MGCP_KEEPALIVE_ONCE);</span><br><span>@@ -1010,19 +1078,20 @@</span><br><span>                "CRCX: connection successfully created\n");</span><br><span>       rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_CRCX_SUCCESS));</span><br><span>  mgcp_endp_update(endp);</span><br><span style="color: hsl(0, 100%, 40%);">- return create_response_with_sdp(endp, conn, "CRCX", p->trans, true);</span><br><span style="color: hsl(120, 100%, 40%);">+     return create_response_with_sdp(endp, conn, "CRCX", pdata->trans, true);</span><br><span> error2:</span><br><span>     mgcp_endp_release(endp);</span><br><span>     LOGPENDP(endp, DLMGCP, LOGL_NOTICE,</span><br><span>           "CRCX: unable to create connection\n");</span><br><span style="color: hsl(0, 100%, 40%);">-      return create_err_response(endp, error_code, "CRCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+  return create_err_response(endp, error_code, "CRCX", pdata->trans);</span><br><span> }</span><br><span> </span><br><span> /* MDCX command handler, processes the received command */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *handle_modify_con(struct mgcp_parse_data *p)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *handle_modify_con(struct mgcp_request_data *rq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct mgcp_endpoint *endp = p->endp;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct rate_ctr_group *rate_ctrs = endp->trunk->ratectr.mgcp_mdcx_ctr_group;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mgcp_parse_data *pdata = rq->pdata;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_endpoint *endp = rq->endp;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct rate_ctr_group *rate_ctrs = endp->trunk->ratectr.mgcp_mdcx_ctr_group;;</span><br><span>  char new_local_addr[INET6_ADDRSTRLEN];</span><br><span>       int error_code = 500;</span><br><span>        int silent = 0;</span><br><span>@@ -1041,7 +1110,7 @@</span><br><span>              rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_AVAIL));</span><br><span>               LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "MDCX: selected endpoint not available!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return create_err_response(NULL, 501, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(NULL, 501, "MDCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        /* Prohibit wildcarded requests */</span><br><span>@@ -1049,17 +1118,17 @@</span><br><span>                 LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "MDCX: wildcarded endpoint names not supported.\n");</span><br><span>              rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_WILDCARD));</span><br><span style="color: hsl(0, 100%, 40%);">-               return create_err_response(endp, 507, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(endp, 507, "MDCX", pdata->trans);</span><br><span>    }</span><br><span> </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>                 rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_NO_CONN));</span><br><span style="color: hsl(0, 100%, 40%);">-                return create_err_response(endp, 400, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(endp, 400, "MDCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   for_each_line(line, p->save) {</span><br><span style="color: hsl(120, 100%, 40%);">+     for_each_line(line, pdata->save) {</span><br><span>                if (!mgcp_check_param(endp, line))</span><br><span>                   continue;</span><br><span> </span><br><span>@@ -1090,7 +1159,7 @@</span><br><span>                case 'X':</span><br><span>                    if (strncasecmp("Osmux: ", line + 2, strlen("Osmux: ")) == 0) {</span><br><span>                          /* If osmux is disabled, just skip setting it up */</span><br><span style="color: hsl(0, 100%, 40%);">-                             if (!p->endp->cfg->osmux)</span><br><span style="color: hsl(120, 100%, 40%);">+                            if (!endp->cfg->osmux)</span><br><span>                                         break;</span><br><span>                               osmux_cid = mgcp_osmux_setup(endp, line);</span><br><span>                            break;</span><br><span>@@ -1106,7 +1175,7 @@</span><br><span>                                "MDCX: Unhandled MGCP option: '%c'/%d\n",</span><br><span>                                  line[0], line[0]);</span><br><span>                  rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_UNHANDLED_PARAM));</span><br><span style="color: hsl(0, 100%, 40%);">-                        return create_err_response(NULL, 539, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(NULL, 539, "MDCX", pdata->trans);</span><br><span>                    break;</span><br><span>               }</span><br><span>    }</span><br><span>@@ -1116,13 +1185,13 @@</span><br><span>          LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "MDCX: insufficient parameters, missing ci (connectionIdentifier)\n");</span><br><span>            rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_NO_CONNID));</span><br><span style="color: hsl(0, 100%, 40%);">-              return create_err_response(endp, 515, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(endp, 515, "MDCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     if (!conn) {</span><br><span>                 rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_CONN_NOT_FOUND));</span><br><span style="color: hsl(0, 100%, 40%);">-         return create_err_response(endp, 400, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(endp, 400, "MDCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        mgcp_conn_watchdog_kick(conn->conn);</span><br><span>@@ -1150,7 +1219,7 @@</span><br><span>      }</span><br><span> </span><br><span>        /* Handle codec information and decide for a suitable codec */</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = handle_codec_info(conn, p, have_sdp, false);</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = handle_codec_info(conn, rq, have_sdp, false);</span><br><span>   mgcp_codec_summary(conn);</span><br><span>    if (rc) {</span><br><span>            error_code = rc;</span><br><span>@@ -1209,9 +1278,9 @@</span><br><span> </span><br><span> </span><br><span>     /* policy CB */</span><br><span style="color: hsl(0, 100%, 40%);">- if (p->cfg->policy_cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pdata->cfg->policy_cb) {</span><br><span>           int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = p->cfg->policy_cb(endp, MGCP_ENDP_MDCX, p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = pdata->cfg->policy_cb(endp, MGCP_ENDP_MDCX, pdata->trans);</span><br><span>             switch (rc) {</span><br><span>                case MGCP_POLICY_REJECT:</span><br><span>                     LOGPCONN(conn->conn, DLMGCP, LOGL_NOTICE,</span><br><span>@@ -1219,7 +1288,7 @@</span><br><span>                         rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_MDCX_FAIL_REJECTED_BY_POLICY));</span><br><span>                  if (silent)</span><br><span>                          goto out_silent;</span><br><span style="color: hsl(0, 100%, 40%);">-                        return create_err_response(endp, 400, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(endp, 400, "MDCX", pdata->trans);</span><br><span>                    break;</span><br><span>               case MGCP_POLICY_DEFER:</span><br><span>                      /* stop processing */</span><br><span>@@ -1239,8 +1308,8 @@</span><br><span>        /* modify */</span><br><span>         LOGPCONN(conn->conn, DLMGCP, LOGL_DEBUG,</span><br><span>           "MDCX: modified conn:%s\n", mgcp_conn_dump(conn->conn));</span><br><span style="color: hsl(0, 100%, 40%);">-  if (p->cfg->change_cb)</span><br><span style="color: hsl(0, 100%, 40%);">-            p->cfg->change_cb(endp, MGCP_ENDP_MDCX);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pdata->cfg->change_cb)</span><br><span style="color: hsl(120, 100%, 40%);">+              pdata->cfg->change_cb(endp, MGCP_ENDP_MDCX);</span><br><span> </span><br><span>       /* Send dummy packet, see also comments in mgcp_keepalive_timer_cb() */</span><br><span>      OSMO_ASSERT(endp->trunk->keepalive_interval >= MGCP_KEEPALIVE_ONCE);</span><br><span>@@ -1256,9 +1325,9 @@</span><br><span>        LOGPCONN(conn->conn, DLMGCP, LOGL_NOTICE,</span><br><span>                  "MDCX: connection successfully modified\n");</span><br><span>      mgcp_endp_update(endp);</span><br><span style="color: hsl(0, 100%, 40%);">- return create_response_with_sdp(endp, conn, "MDCX", p->trans, false);</span><br><span style="color: hsl(120, 100%, 40%);">+    return create_response_with_sdp(endp, conn, "MDCX", pdata->trans, false);</span><br><span> error3:</span><br><span style="color: hsl(0, 100%, 40%);">-       return create_err_response(endp, error_code, "MDCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+  return create_err_response(endp, error_code, "MDCX", pdata->trans);</span><br><span> </span><br><span> out_silent:</span><br><span>  LOGPENDP(endp, DLMGCP, LOGL_DEBUG, "MDCX: silent exit\n");</span><br><span>@@ -1266,10 +1335,11 @@</span><br><span> }</span><br><span> </span><br><span> /* DLCX command handler, processes the received command */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *handle_delete_con(struct mgcp_parse_data *p)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *handle_delete_con(struct mgcp_request_data *rq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_endpoint *endp = p->endp;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct rate_ctr_group *rate_ctrs = endp->trunk->ratectr.mgcp_dlcx_ctr_group;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct mgcp_parse_data *pdata = rq->pdata;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_endpoint *endp = rq->endp;;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct rate_ctr_group *rate_ctrs = endp->trunk->ratectr.mgcp_dlcx_ctr_group;;</span><br><span>  int error_code = 400;</span><br><span>        int silent = 0;</span><br><span>      char *line;</span><br><span>@@ -1284,7 +1354,7 @@</span><br><span>          rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_FAIL_AVAIL));</span><br><span>               LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "DLCX: selected endpoint not available!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return create_err_response(NULL, 501, "DLCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(NULL, 501, "DLCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        /* Prohibit wildcarded requests */</span><br><span>@@ -1292,17 +1362,17 @@</span><br><span>                 LOGPENDP(endp, DLMGCP, LOGL_ERROR,</span><br><span>                    "DLCX: wildcarded endpoint names not supported.\n");</span><br><span>              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(120, 100%, 40%);">+         return create_err_response(endp, 507, "DLCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span>        if (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 style="color: hsl(0, 100%, 40%);">-                return create_err_response(endp, 515, "DLCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+         return create_err_response(endp, 515, "DLCX", pdata->trans);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   for_each_line(line, p->save) {</span><br><span style="color: hsl(120, 100%, 40%);">+     for_each_line(line, pdata->save) {</span><br><span>                if (!mgcp_check_param(endp, line))</span><br><span>                   continue;</span><br><span> </span><br><span>@@ -1329,22 +1399,22 @@</span><br><span>                               "DLCX: Unhandled MGCP option: '%c'/%d\n",</span><br><span>                                  line[0], line[0]);</span><br><span>                  rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_FAIL_UNHANDLED_PARAM));</span><br><span style="color: hsl(0, 100%, 40%);">-                        return create_err_response(NULL, 539, "DLCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(NULL, 539, "DLCX", pdata->trans);</span><br><span>                    break;</span><br><span>               }</span><br><span>    }</span><br><span> </span><br><span>        /* policy CB */</span><br><span style="color: hsl(0, 100%, 40%);">- if (p->cfg->policy_cb) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pdata->cfg->policy_cb) {</span><br><span>           int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = p->cfg->policy_cb(endp, MGCP_ENDP_DLCX, p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = pdata->cfg->policy_cb(endp, MGCP_ENDP_DLCX, pdata->trans);</span><br><span>             switch (rc) {</span><br><span>                case MGCP_POLICY_REJECT:</span><br><span>                     LOGPENDP(endp, DLMGCP, LOGL_NOTICE, "DLCX: rejected by policy\n");</span><br><span>                         rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_FAIL_REJECTED_BY_POLICY));</span><br><span>                  if (silent)</span><br><span>                          goto out_silent;</span><br><span style="color: hsl(0, 100%, 40%);">-                        return create_err_response(endp, 400, "DLCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return create_err_response(endp, 400, "DLCX", pdata->trans);</span><br><span>                    break;</span><br><span>               case MGCP_POLICY_DEFER:</span><br><span>                      /* stop processing */</span><br><span>@@ -1374,7 +1444,7 @@</span><br><span>                /* Note: In this case we do not return any statistics,</span><br><span>                * as we assume that the client is not interested in</span><br><span>                  * this case. */</span><br><span style="color: hsl(0, 100%, 40%);">-                return create_ok_response(endp, 200, "DLCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+          return create_ok_response(endp, 200, "DLCX", pdata->trans);</span><br><span>     }</span><br><span> </span><br><span>        /* Find the connection */</span><br><span>@@ -1400,16 +1470,16 @@</span><br><span>          LOGPENDP(endp, DLMGCP, LOGL_DEBUG, "DLCX: endpoint released\n");</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (p->cfg->change_cb)</span><br><span style="color: hsl(0, 100%, 40%);">-            p->cfg->change_cb(endp, MGCP_ENDP_DLCX);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pdata->cfg->change_cb)</span><br><span style="color: hsl(120, 100%, 40%);">+              pdata->cfg->change_cb(endp, MGCP_ENDP_DLCX);</span><br><span> </span><br><span>       rate_ctr_inc(rate_ctr_group_get_ctr(rate_ctrs, MGCP_DLCX_SUCCESS));</span><br><span>  if (silent)</span><br><span>          goto out_silent;</span><br><span style="color: hsl(0, 100%, 40%);">-        return create_ok_resp_with_param(endp, 250, "DLCX", p->trans, stats);</span><br><span style="color: hsl(120, 100%, 40%);">+    return create_ok_resp_with_param(endp, 250, "DLCX", pdata->trans, stats);</span><br><span> </span><br><span> error3:</span><br><span style="color: hsl(0, 100%, 40%);">-   return create_err_response(endp, error_code, "DLCX", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+  return create_err_response(endp, error_code, "DLCX", pdata->trans);</span><br><span> </span><br><span> out_silent:</span><br><span>  LOGPENDP(endp, DLMGCP, LOGL_DEBUG, "DLCX: silent exit\n");</span><br><span>@@ -1417,7 +1487,7 @@</span><br><span> }</span><br><span> </span><br><span> /* RSIP command handler, processes the received command */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *handle_rsip(struct mgcp_parse_data *p)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *handle_rsip(struct mgcp_request_data *rq)</span><br><span> {</span><br><span>    /* TODO: Also implement the resetting of a specific endpoint</span><br><span>          * to make mgcp_send_reset_ep() work. Currently this will call</span><br><span>@@ -1429,8 +1499,8 @@</span><br><span> </span><br><span>   LOGP(DLMGCP, LOGL_NOTICE, "RSIP: resetting all endpoints ...\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (p->cfg->reset_cb)</span><br><span style="color: hsl(0, 100%, 40%);">-             p->cfg->reset_cb(p->endp->trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rq->pdata->cfg->reset_cb)</span><br><span style="color: hsl(120, 100%, 40%);">+                rq->pdata->cfg->reset_cb(rq->endp->trunk);</span><br><span>    return NULL;</span><br><span> }</span><br><span> </span><br><span>@@ -1446,7 +1516,7 @@</span><br><span> /* This can request like DTMF detection and forward, fax detection... it</span><br><span>  * can also request when the notification should be send and such. We don't</span><br><span>  * do this right now. */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *handle_noti_req(struct mgcp_parse_data *p)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *handle_noti_req(struct mgcp_request_data *rq)</span><br><span> {</span><br><span>       int res = 0;</span><br><span>         char *line;</span><br><span>@@ -1454,7 +1524,7 @@</span><br><span> </span><br><span>      LOGP(DLMGCP, LOGL_NOTICE, "RQNT: processing request for notification ...\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     for_each_line(line, p->save) {</span><br><span style="color: hsl(120, 100%, 40%);">+     for_each_line(line, rq->pdata->save) {</span><br><span>                 switch (toupper(line[0])) {</span><br><span>          case 'S':</span><br><span>                    tone = extract_tone(line);</span><br><span>@@ -1464,14 +1534,14 @@</span><br><span> </span><br><span>     /* we didn't see a signal request with a tone */</span><br><span>         if (tone == CHAR_MAX)</span><br><span style="color: hsl(0, 100%, 40%);">-           return create_ok_response(p->endp, 200, "RQNT", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+            return create_ok_response(rq->endp, 200, "RQNT", rq->pdata->trans);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (p->cfg->rqnt_cb)</span><br><span style="color: hsl(0, 100%, 40%);">-              res = p->cfg->rqnt_cb(p->endp, tone);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rq->pdata->cfg->rqnt_cb)</span><br><span style="color: hsl(120, 100%, 40%);">+         res = rq->pdata->cfg->rqnt_cb(rq->endp, tone);</span><br><span> </span><br><span>       return res == 0 ?</span><br><span style="color: hsl(0, 100%, 40%);">-           create_ok_response(p->endp, 200, "RQNT", p->trans) :</span><br><span style="color: hsl(0, 100%, 40%);">-            create_err_response(p->endp, res, "RQNT", p->trans);</span><br><span style="color: hsl(120, 100%, 40%);">+          create_ok_response(rq->endp, 200, "RQNT", rq->pdata->trans) :</span><br><span style="color: hsl(120, 100%, 40%);">+      create_err_response(rq->endp, res, "RQNT", rq->pdata->trans);</span><br><span> }</span><br><span> </span><br><span> /* Connection keepalive timer, will take care that dummy packets are send</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_sdp.c b/src/libosmo-mgcp/mgcp_sdp.c</span><br><span>index e98ca94..0759c96 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_sdp.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_sdp.c</span><br><span>@@ -398,7 +398,7 @@</span><br><span>                            return -1;</span><br><span>                   break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (p->endp)</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (endp)</span><br><span>                            /* TODO: Check spec: We used the bare endpoint number before,</span><br><span>                                 * now we use the endpoint name as a whole? Is this allowed? */</span><br><span>                              LOGP(DLMGCP, LOGL_NOTICE,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/24941">change 24941</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/+/24941"/><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: I9f519d8a0ee8a513fa1e74acf3ee7dbc0991cdde </div>
<div style="display:none"> Gerrit-Change-Number: 24941 </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>