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