Max has uploaded this change for review. ( https://gerrit.osmocom.org/12331


Change subject: MNCC: internalize bridge error handling
......................................................................

MNCC: internalize bridge error handling

This can be handled internally instead of checking tch_bridge() outcome
and than calling disconnect_bridge() with the same arguments.

Change-Id: I66f6fac254d78dcf64bcb6aa4a443b899fb378a7
---
M src/libmsc/gsm_04_08_cc.c
1 file changed, 30 insertions(+), 33 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/31/12331/1

diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index 3fe427e..723c9f3 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -345,6 +345,31 @@
        return 0;
 }

+static int gsm48_cc_tx_disconnect(struct gsm_trans *trans, void *arg);
+
+/* disconnect both calls from the bridge */
+static inline int disconnect_bridge(struct gsm_trans *trans0, struct gsm_trans 
*trans1, int err)
+{
+       struct gsm_mncc mx_rel;
+       if (!trans0 || !trans1)
+               return -err;
+
+       DEBUGP(DCC, "Failed to bridge TCH for calls %x <-> %x :: %s \n",
+              trans0->callref, trans1->callref, strerror(err));
+
+       memset(&mx_rel, 0, sizeof(struct gsm_mncc));
+       mncc_set_cause(&mx_rel, GSM48_CAUSE_LOC_INN_NET,
+                      GSM48_CC_CAUSE_CHAN_UNACCEPT);
+
+       mx_rel.callref = trans0->callref;
+       gsm48_cc_tx_disconnect(trans0, &mx_rel);
+
+       mx_rel.callref = trans1->callref;
+       gsm48_cc_tx_disconnect(trans1, &mx_rel);
+
+       return -err;
+}
+
 /* bridge channels of two transactions */
 static int tch_bridge(struct gsm_network *net, struct gsm_mncc_bridge *bridge)
 {
@@ -353,10 +378,10 @@
        int rc;

        if (!trans1 || !trans2)
-               return -EIO;
+               return disconnect_bridge(trans1, trans2, EIO);

        if (!trans1->conn || !trans2->conn)
-               return -EIO;
+               return disconnect_bridge(trans1, trans2, EIO);

        /* Which subscriber do we want to track trans1 or trans2? */
        log_set_context(LOG_CTX_VLR_SUBSCR, trans1->vsub);
@@ -374,12 +399,12 @@
        rc = msc_mgcp_call_complete(trans1, trans2->conn->rtp.local_port_cn,
                                    trans2->conn->rtp.local_addr_cn);
        if (rc)
-               return -EINVAL;
+               return disconnect_bridge(trans1, trans2, EINVAL);

        rc = msc_mgcp_call_complete(trans2, trans1->conn->rtp.local_port_cn,
                                    trans1->conn->rtp.local_addr_cn);
        if (rc)
-               return -EINVAL;
+               return disconnect_bridge(trans1, trans2, EINVAL);

        return 0;
 }
@@ -391,7 +416,6 @@
 }

 static int gsm48_cc_tx_release(struct gsm_trans *trans, void *arg);
-static int gsm48_cc_tx_disconnect(struct gsm_trans *trans, void *arg);

 static void gsm48_cc_timeout(void *arg)
 {
@@ -475,30 +499,6 @@

 }

-/* disconnect both calls from the bridge */
-static inline void disconnect_bridge(struct gsm_network *net,
-                                    struct gsm_mncc_bridge *bridge, int err)
-{
-       struct gsm_trans *trans0 = trans_find_by_callref(net, 
bridge->callref[0]);
-       struct gsm_trans *trans1 = trans_find_by_callref(net, 
bridge->callref[1]);
-       struct gsm_mncc mx_rel;
-       if (!trans0 || !trans1)
-               return;
-
-       DEBUGP(DCC, "Failed to bridge TCH for calls %x <-> %x :: %s \n",
-              trans0->callref, trans1->callref, strerror(err));
-
-       memset(&mx_rel, 0, sizeof(struct gsm_mncc));
-       mncc_set_cause(&mx_rel, GSM48_CAUSE_LOC_INN_NET,
-                      GSM48_CC_CAUSE_CHAN_UNACCEPT);
-
-       mx_rel.callref = trans0->callref;
-       gsm48_cc_tx_disconnect(trans0, &mx_rel);
-
-       mx_rel.callref = trans1->callref;
-       gsm48_cc_tx_disconnect(trans1, &mx_rel);
-}
-
 static void gsm48_start_cc_timer(struct gsm_trans *trans, int current,
                                 int sec, int micro)
 {
@@ -1865,10 +1865,7 @@
        /* handle special messages */
        switch(msg_type) {
        case MNCC_BRIDGE:
-               rc = tch_bridge(net, arg);
-               if (rc < 0)
-                       disconnect_bridge(net, arg, -rc);
-               return rc;
+               return tch_bridge(net, arg);
        case MNCC_RTP_CREATE:
                return tch_rtp_create(net, data->callref);
        case MNCC_RTP_CONNECT:

--
To view, visit https://gerrit.osmocom.org/12331
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I66f6fac254d78dcf64bcb6aa4a443b899fb378a7
Gerrit-Change-Number: 12331
Gerrit-PatchSet: 1
Gerrit-Owner: Max <msur...@sysmocom.de>

Reply via email to