From 5e1a486a72f2bd51f94ccd83cd33cc8b5b7a5a5e Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 17 Jun 2020 10:29:46 +0200 Subject: Treat RAU as implicit RESUME if GMM is suspended We so far only resumed from suspend upon receiving an explicit BSSGP RESUME message from the BSS. The latter is only possible in BSC-colocated PCU, where the BSC can trigger the message when releasing the dedicated channel. In BTS-colocated PCUs, this is not possible, and we have to rely on the MS resuming by RAU. See 3GPP TS 23.060 section 16.2.1.1.1 clause 6: The MS shall resume GPRS services by sending a Routeing Area Update Request message to the SGSN: * if the BSS did not successfully request the SGSN to resume GPRS services, * if the RR Channel Release message was not received before the MS left dedicated mode, * if the MS locally determines that the conditions for the GPRS suspension have disappeared Without this patch, the GMM state would forever be stuck in SUSPEND, which in turn causes the SGSN to page the MS all the time. Change-Id: I3c09187a27483d95fa0070bbb467f94a2ea3978f Related: OS4616 --- src/sgsn/gprs_gmm_fsm.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sgsn/gprs_gmm_fsm.c b/src/sgsn/gprs_gmm_fsm.c index 37ea90408..11b4e4ec5 100644 --- a/src/sgsn/gprs_gmm_fsm.c +++ b/src/sgsn/gprs_gmm_fsm.c @@ -69,9 +69,12 @@ static void st_gmm_registered_normal(struct osmo_fsm_inst *fi, uint32_t event, v static void st_gmm_registered_suspended(struct osmo_fsm_inst *fi, uint32_t event, void *data) { switch(event) { - case E_GMM_RESUME: + case E_GMM_RESUME: /* explicit BSSGP RESUME from BSS */ gmm_fsm_state_chg(fi, ST_GMM_REGISTERED_NORMAL); break; + case E_GMM_COMMON_PROC_INIT_REQ: /* implicit resume from MS */ + gmm_fsm_state_chg(fi, ST_GMM_COMMON_PROC_INIT); + break; } } @@ -123,10 +126,12 @@ static struct osmo_fsm_state gmm_fsm_states[] = { .action = st_gmm_registered_normal, }, [ST_GMM_REGISTERED_SUSPENDED] = { - .in_event_mask = X(E_GMM_RESUME), + .in_event_mask = X(E_GMM_RESUME) | + X(E_GMM_COMMON_PROC_INIT_REQ), .out_state_mask = X(ST_GMM_DEREGISTERED) | - X(ST_GMM_REGISTERED_NORMAL), + X(ST_GMM_REGISTERED_NORMAL) | + X(ST_GMM_COMMON_PROC_INIT), .name = "Registered.SUSPENDED", .action = st_gmm_registered_suspended, }, -- cgit v1.2.3