From 0a67e55835ea12bb6f20f03f62f8e6629e8820e4 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 2 Aug 2021 02:04:02 +0200 Subject: fix gscon clear 1/n: store clear cause in gscon Allow returning a context sensitive cause instead of a hardcoded one in gscon pre_term(). Also, the conn->cause is needed to move message dispatch to an "onenter" function in patch I234b2a754d0c98031056981823cdbc187e977741. I Split this part off as a separate patch for better readability. Related: OS#5337 Change-Id: Ib6432746040899129d1d73ae8dc59add2d88a915 --- include/osmocom/bsc/gsm_data.h | 2 ++ src/osmo-bsc/bsc_subscr_conn_fsm.c | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index a1aa2df67..8bebfee29 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -406,6 +406,8 @@ struct gsm_subscriber_connection { bool last_eutran_plmn_valid; /* Is information stored in field below available? */ struct osmo_plmn_id last_eutran_plmn; } fast_return; + + enum gsm0808_cause clear_cause; }; diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c index 2140c9ba9..ff742a267 100644 --- a/src/osmo-bsc/bsc_subscr_conn_fsm.c +++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c @@ -144,6 +144,7 @@ static void gscon_bssmap_clear(struct gsm_subscriber_connection *conn, struct msgb *resp; int rc; + conn->clear_cause = cause; if (conn->rx_clear_command) { LOGPFSML(conn->fi, LOGL_DEBUG, "Not sending BSSMAP CLEAR REQUEST, already got CLEAR COMMAND from MSC\n"); @@ -976,9 +977,7 @@ static void gscon_pre_term(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause ca } LOGPFSML(fi, LOGL_DEBUG, "Releasing all lchans (if any) because this conn is terminating\n"); - /* when things go smoothly, the lchan should have been released before FSM instance termination. So if this is - * necessary it's probably "abnormal". */ - gscon_release_lchans(conn, true, GSM48_RR_CAUSE_ABNORMAL_UNSPEC); + gscon_release_lchans(conn, true, bsc_gsm48_rr_cause_from_gsm0808_cause(conn->clear_cause)); /* drop pending messages */ gscon_dtap_queue_flush(conn, 0); @@ -1057,6 +1056,9 @@ struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *ne INIT_LLIST_HEAD(&conn->hodec2.penalty_timers); conn->sccp.conn_id = -1; + /* Default clear cause (on RR translates to GSM48_RR_CAUSE_ABNORMAL_UNSPEC) */ + conn->clear_cause = GSM0808_CAUSE_EQUIPMENT_FAILURE; + /* don't allocate from 'conn' context, as gscon_cleanup() will call talloc_free(conn) before * libosmocore will call talloc_free(conn->fi), i.e. avoid use-after-free during cleanup */ conn->fi = osmo_fsm_inst_alloc(&gscon_fsm, net, conn, LOGL_DEBUG, NULL); -- cgit v1.2.3