aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2013-06-03 18:46:41 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2013-07-29 12:44:36 +0200
commit66d7ef8a1fab715ed7254c7ffb4e032a9aba6f3b (patch)
treec27e098c3263efd92da29c98a4fce7fe56c605bb
parentc186375109757598414fbf5aace3276f76c58ffa (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--openbsc/include/openbsc/gsm_04_08.h2
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c13
-rw-r--r--openbsc/src/libmsc/osmo_msc.c2
3 files changed, 17 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/gsm_04_08.h b/openbsc/include/openbsc/gsm_04_08.h
index d071ad595..7944a05b1 100644
--- a/openbsc/include/openbsc/gsm_04_08.h
+++ b/openbsc/include/openbsc/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/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index ea0aedf0a..e504925a5 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/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/openbsc/src/libmsc/osmo_msc.c b/openbsc/src/libmsc/osmo_msc.c
index 31b72b925..2b1655905 100644
--- a/openbsc/src/libmsc/osmo_msc.c
+++ b/openbsc/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,