aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2021-07-19 19:07:28 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2021-07-24 00:00:40 +0200
commitbb56236e59726daa9950ec9350c6acf1c112feed (patch)
tree37bae8b5f9f49621bc0cac4954ce7be5f9508343
parent56eda358741a871a519db52a7eae896af503a712 (diff)
fix CM Re-Establishment Request: allocate new A conn
For a call re-establishment, the MS shows up on a different cell and requests CM Re-Establishment (3GPP TS 24.008 9.2.4). As soon as the Layer 3 is established, the MSC will clear the first A-connection; the re-establishment *has* to happen on a new separate A-connection. So for a brief moment we must allow two distinct A-interface connections to be used for the same subscriber. Tested by BSC_Tests.TC_cm_reestablishment added in I1e7d446644f46b8a0a94688e618ffb4f23a8900e Related: SYS#5130 Change-Id: I2da9a971dd36c4289a78040adfe85704c8282c59
-rw-r--r--src/osmo-bsc/gsm_08_08.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c
index 80ed874be..1f6b38ef6 100644
--- a/src/osmo-bsc/gsm_08_08.c
+++ b/src/osmo-bsc/gsm_08_08.c
@@ -415,8 +415,13 @@ int bsc_compl_l3(struct gsm_lchan *lchan, struct msgb *msg, uint16_t chosen_chan
/* If this Mobile Identity already has an active bsc_subscr, look whether there also is an active A-interface
* conn for this subscriber. This may be the case during a Perform Location Request (LCS) from the MSC that
- * started on an IDLE MS, and now the MS is becoming active. Associate with the existing conn. */
- if (bsub)
+ * started on an IDLE MS, and now the MS is becoming active. Associate with the existing conn.
+ *
+ * However, for a CM Re-Establishment Request, we must *not* re-use the existing conn, but allocate a second
+ * conn for the same bsub. The previous conn will be Clear'ed by the MSC as soon as it receives the L3 Complete
+ * message == the CM Re-Establishment Request.
+ */
+ if (bsub && !(pdisc == GSM48_PDISC_MM && mtype == GSM48_MT_MM_CM_REEST_REQ))
conn = bsc_conn_by_bsub(bsub);
if (!conn) {