aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,