Change in osmo-msc[master]: MNCC: internalize bridge error handling

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Max gerrit-no-reply at lists.osmocom.org
Mon Dec 17 12:14:33 UTC 2018


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 <msuraev at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20181217/f1136b9f/attachment.htm>


More information about the gerrit-log mailing list