<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>