From 2085b6a51dd6ce752390f92342efc99e56fdda15 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Mon, 3 Jun 2013 18:46:41 +0200 Subject: 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). --- include/osmocom/bsc/gsm_04_08.h | 2 ++ src/libmsc/gsm_04_08.c | 13 +++++++++++++ src/libmsc/osmo_msc.c | 2 ++ 3 files changed, 17 insertions(+) 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, -- cgit v1.2.3