diff options
-rw-r--r-- | include/osmocom/bsc/gsm_04_08.h | 2 | ||||
-rw-r--r-- | src/libmsc/gsm_04_08.c | 13 | ||||
-rw-r--r-- | src/libmsc/osmo_msc.c | 2 |
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, |