diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2023-10-17 16:40:32 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2023-10-18 08:08:24 +0200 |
commit | 014646fc66032a8ef1961fdb129509174a9589a0 (patch) | |
tree | 01df9f2ca547147d77209b3bead20de4b9cb5549 | |
parent | 86fed8fc97a68297658463f080c9f9b1ff5c20e5 (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.c | 12 |
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); |