aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2013-06-03 18:46:41 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2017-12-01 03:37:43 +0100
commit2085b6a51dd6ce752390f92342efc99e56fdda15 (patch)
tree1dcca7e992f1ae0a3e5c8793cad241135f164241
parent558b466383623b1496f0397fcb0eb3f09c73bfbd (diff)
HO: In case of assignment failure, release all call control transactions
If the initial assignment to the TCH channel fails, the call is released and the MNCC application receives cause 41 (Temporary Failure).
-rw-r--r--include/osmocom/bsc/gsm_04_08.h2
-rw-r--r--src/libmsc/gsm_04_08.c13
-rw-r--r--src/libmsc/osmo_msc.c2
3 files changed, 17 insertions, 0 deletions
diff --git a/include/osmocom/bsc/gsm_04_08.h b/include/osmocom/bsc/gsm_04_08.h
index d071ad595..7944a05b1 100644
--- a/include/osmocom/bsc/gsm_04_08.h
+++ b/include/osmocom/bsc/gsm_04_08.h
@@ -78,4 +78,6 @@ int tch_frame_down(struct gsm_network *net, uint32_t callref, struct gsm_data_fr
int gsm48_multirate_config(uint8_t *lv, struct amr_multirate_conf *mr, int ms);
+void gsm48_lchan_modify_error(struct gsm_subscriber_connection *conn);
+
#endif
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index ea0aedf0a..e504925a5 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -3017,6 +3017,19 @@ static int _gsm48_lchan_modify_error(struct gsm_trans *trans, void *arg)
return 0;
}
+void gsm48_lchan_modify_error(struct gsm_subscriber_connection *conn)
+{
+ struct gsm_network *net = conn->lchan->ts->trx->bts->network;
+ struct gsm_trans *trans, *trans2;
+
+ llist_for_each_entry_safe(trans, trans2, &net->trans_list, entry) {
+ if (trans->protocol != GSM48_PDISC_CC)
+ continue;
+ if (trans->conn == conn)
+ _gsm48_lchan_modify_error(trans, NULL);
+ }
+}
+
static int _gsm48_lchan_modify(struct gsm_trans *trans, void *arg)
{
struct gsm_bts *bts = trans->conn->bts;
diff --git a/src/libmsc/osmo_msc.c b/src/libmsc/osmo_msc.c
index 31b72b925..2b1655905 100644
--- a/src/libmsc/osmo_msc.c
+++ b/src/libmsc/osmo_msc.c
@@ -76,6 +76,8 @@ static void msc_assign_compl(struct gsm_subscriber_connection *conn,
static void msc_assign_fail(struct gsm_subscriber_connection *conn,
uint8_t cause, uint8_t *rr_cause)
{
+ /* release call transactions */
+ gsm48_lchan_modify_error(conn);
}
static void msc_classmark_chg(struct gsm_subscriber_connection *conn,