aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2020-06-17 10:29:46 +0200
committerlaforge <laforge@osmocom.org>2020-06-17 21:09:03 +0000
commit5e1a486a72f2bd51f94ccd83cd33cc8b5b7a5a5e (patch)
tree8d3a2be9e64b6f4399664adbd305078f41d5f42e
parent627e285fd0dc82aeb15f0c35c946190da40e6f8c (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
-rw-r--r--src/sgsn/gprs_gmm_fsm.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/sgsn/gprs_gmm_fsm.c b/src/sgsn/gprs_gmm_fsm.c
index 37ea9040..11b4e4ec 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,
},