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