diff options
author | Harald Welte <laforge@osmocom.org> | 2020-06-17 10:29:46 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2020-06-17 21:09:03 +0000 |
commit | 5e1a486a72f2bd51f94ccd83cd33cc8b5b7a5a5e (patch) | |
tree | 8d3a2be9e64b6f4399664adbd305078f41d5f42e /src/sgsn | |
parent | 627e285fd0dc82aeb15f0c35c946190da40e6f8c (diff) |
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
Diffstat (limited to 'src/sgsn')
-rw-r--r-- | src/sgsn/gprs_gmm_fsm.c | 11 |
1 files 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, }, |