summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2023-10-17 16:40:32 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2023-10-18 08:08:24 +0200
commit014646fc66032a8ef1961fdb129509174a9589a0 (patch)
tree01df9f2ca547147d77209b3bead20de4b9cb5549
parent86fed8fc97a68297658463f080c9f9b1ff5c20e5 (diff)
ASCI: Change state correctly when leaving group mode
Use new_mm_state() to leave group mode. This will trigger IMSI detach when returning to IDLE mode, if it has been delayed. Related: OS#5364 Change-Id: I3c83c9e0fe10b35d60d125df6929fcb5ddc35f1a
-rw-r--r--src/host/layer23/src/mobile/gsm48_mm.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c
index e2924f7e..5e026598 100644
--- a/src/host/layer23/src/mobile/gsm48_mm.c
+++ b/src/host/layer23/src/mobile/gsm48_mm.c
@@ -1125,6 +1125,8 @@ static void new_mm_state(struct gsm48_mmlayer *mm, int state, int substate)
if (!nmsg)
return;
gsm48_mmevent_msg(ms, nmsg);
+ /* Stop here and wait for the IMSI_DETACH event being handled. */
+ return;
}
/* 4.4.2 start T3212 in MM IDLE mode if not started or has expired */
@@ -2153,6 +2155,8 @@ static int gsm48_mm_imsi_detach_vgcs(struct osmocom_ms *ms, struct msgb *msg)
struct gsm48_mmxx_hdr *nmmh;
int msg_type;
+ LOGP(DMM, LOGL_INFO, "IMSI detach delayed until group receive/transmit mode is left.\n");
+
/* remember to detach later */
mm->delay_detach = 1;
@@ -3889,9 +3893,9 @@ static int gsm48_mm_group_rel_ind(struct osmocom_ms *ms, struct msgb *msg)
/* Change mode back to normal or limited service. */
if (mm->substate == GSM48_MM_SST_RX_VGCS_LIMITED)
- mm->substate = GSM48_MM_SST_LIMITED_SERVICE;
+ new_mm_state(mm, GSM48_MM_ST_MM_IDLE, GSM48_MM_SST_LIMITED_SERVICE);
if (mm->substate == GSM48_MM_SST_RX_VGCS_NORMAL)
- mm->substate = GSM48_MM_SST_NORMAL_SERVICE;
+ new_mm_state(mm, GSM48_MM_ST_MM_IDLE, GSM48_MM_SST_NORMAL_SERVICE);
/* Return IDLE, if not already. Also select the sub-state to use. */
gsm48_mm_return_idle(ms, NULL);
@@ -3937,9 +3941,9 @@ static int gsm48_mm_group_rel_req(struct osmocom_ms *ms, struct msgb *msg)
/* Change mode back to normal or limited service. */
if (mm->substate == GSM48_MM_SST_RX_VGCS_LIMITED)
- mm->substate = GSM48_MM_SST_LIMITED_SERVICE;
+ new_mm_state(mm, GSM48_MM_ST_MM_IDLE, GSM48_MM_SST_LIMITED_SERVICE);
if (mm->substate == GSM48_MM_SST_RX_VGCS_NORMAL)
- mm->substate = GSM48_MM_SST_NORMAL_SERVICE;
+ new_mm_state(mm, GSM48_MM_ST_MM_IDLE, GSM48_MM_SST_NORMAL_SERVICE);
/* We are already IDLE. Also select the sub-state to use. */
gsm48_mm_return_idle(ms, NULL);