<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12331">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">MNCC: internalize bridge error handling<br><br>This can be handled internally instead of checking tch_bridge() outcome<br>and than calling disconnect_bridge() with the same arguments.<br><br>Change-Id: I66f6fac254d78dcf64bcb6aa4a443b899fb378a7<br>---<br>M src/libmsc/gsm_04_08_cc.c<br>1 file changed, 30 insertions(+), 33 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/31/12331/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c</span><br><span>index 3fe427e..723c9f3 100644</span><br><span>--- a/src/libmsc/gsm_04_08_cc.c</span><br><span>+++ b/src/libmsc/gsm_04_08_cc.c</span><br><span>@@ -345,6 +345,31 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int gsm48_cc_tx_disconnect(struct gsm_trans *trans, void *arg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* disconnect both calls from the bridge */</span><br><span style="color: hsl(120, 100%, 40%);">+static inline int disconnect_bridge(struct gsm_trans *trans0, struct gsm_trans *trans1, int err)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_mncc mx_rel;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!trans0 || !trans1)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -err;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ DEBUGP(DCC, "Failed to bridge TCH for calls %x <-> %x :: %s \n",</span><br><span style="color: hsl(120, 100%, 40%);">+ trans0->callref, trans1->callref, strerror(err));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(&mx_rel, 0, sizeof(struct gsm_mncc));</span><br><span style="color: hsl(120, 100%, 40%);">+ mncc_set_cause(&mx_rel, GSM48_CAUSE_LOC_INN_NET,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM48_CC_CAUSE_CHAN_UNACCEPT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mx_rel.callref = trans0->callref;</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm48_cc_tx_disconnect(trans0, &mx_rel);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mx_rel.callref = trans1->callref;</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm48_cc_tx_disconnect(trans1, &mx_rel);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return -err;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* bridge channels of two transactions */</span><br><span> static int tch_bridge(struct gsm_network *net, struct gsm_mncc_bridge *bridge)</span><br><span> {</span><br><span>@@ -353,10 +378,10 @@</span><br><span> int rc;</span><br><span> </span><br><span> if (!trans1 || !trans2)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+ return disconnect_bridge(trans1, trans2, EIO);</span><br><span> </span><br><span> if (!trans1->conn || !trans2->conn)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+ return disconnect_bridge(trans1, trans2, EIO);</span><br><span> </span><br><span> /* Which subscriber do we want to track trans1 or trans2? */</span><br><span> log_set_context(LOG_CTX_VLR_SUBSCR, trans1->vsub);</span><br><span>@@ -374,12 +399,12 @@</span><br><span> rc = msc_mgcp_call_complete(trans1, trans2->conn->rtp.local_port_cn,</span><br><span> trans2->conn->rtp.local_addr_cn);</span><br><span> if (rc)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return disconnect_bridge(trans1, trans2, EINVAL);</span><br><span> </span><br><span> rc = msc_mgcp_call_complete(trans2, trans1->conn->rtp.local_port_cn,</span><br><span> trans1->conn->rtp.local_addr_cn);</span><br><span> if (rc)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ return disconnect_bridge(trans1, trans2, EINVAL);</span><br><span> </span><br><span> return 0;</span><br><span> }</span><br><span>@@ -391,7 +416,6 @@</span><br><span> }</span><br><span> </span><br><span> static int gsm48_cc_tx_release(struct gsm_trans *trans, void *arg);</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsm48_cc_tx_disconnect(struct gsm_trans *trans, void *arg);</span><br><span> </span><br><span> static void gsm48_cc_timeout(void *arg)</span><br><span> {</span><br><span>@@ -475,30 +499,6 @@</span><br><span> </span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* disconnect both calls from the bridge */</span><br><span style="color: hsl(0, 100%, 40%);">-static inline void disconnect_bridge(struct gsm_network *net,</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_mncc_bridge *bridge, int err)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_trans *trans0 = trans_find_by_callref(net, bridge->callref[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_trans *trans1 = trans_find_by_callref(net, bridge->callref[1]);</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_mncc mx_rel;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!trans0 || !trans1)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- DEBUGP(DCC, "Failed to bridge TCH for calls %x <-> %x :: %s \n",</span><br><span style="color: hsl(0, 100%, 40%);">- trans0->callref, trans1->callref, strerror(err));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(&mx_rel, 0, sizeof(struct gsm_mncc));</span><br><span style="color: hsl(0, 100%, 40%);">- mncc_set_cause(&mx_rel, GSM48_CAUSE_LOC_INN_NET,</span><br><span style="color: hsl(0, 100%, 40%);">- GSM48_CC_CAUSE_CHAN_UNACCEPT);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- mx_rel.callref = trans0->callref;</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_cc_tx_disconnect(trans0, &mx_rel);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- mx_rel.callref = trans1->callref;</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_cc_tx_disconnect(trans1, &mx_rel);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void gsm48_start_cc_timer(struct gsm_trans *trans, int current,</span><br><span> int sec, int micro)</span><br><span> {</span><br><span>@@ -1865,10 +1865,7 @@</span><br><span> /* handle special messages */</span><br><span> switch(msg_type) {</span><br><span> case MNCC_BRIDGE:</span><br><span style="color: hsl(0, 100%, 40%);">- rc = tch_bridge(net, arg);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- disconnect_bridge(net, arg, -rc);</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ return tch_bridge(net, arg);</span><br><span> case MNCC_RTP_CREATE:</span><br><span> return tch_rtp_create(net, data->callref);</span><br><span> case MNCC_RTP_CONNECT:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12331">change 12331</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/12331"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I66f6fac254d78dcf64bcb6aa4a443b899fb378a7 </div>
<div style="display:none"> Gerrit-Change-Number: 12331 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>