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>