aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2019-09-11 02:17:31 +0200
committerlynxis lazus <lynxis@fe80.eu>2019-10-08 10:34:09 +0000
commit3bad31bcb42c3449e6847ea7495578817029a2e1 (patch)
tree7459886d9c2d959cde28749938abef65652796ce
parenteb5aee580d01d9f0f30c1190697f8499ce1f070a (diff)
Iu: implement a user inactivity timer
The user inactivity timer is similiar to the Gb READY timer and reduces the resources taken by an idle UE. Change-Id: I66c2ac0350cb074aefd9a22c5121acf723f239d3
-rw-r--r--include/osmocom/sgsn/gprs_mm_state_iu_fsm.h1
-rw-r--r--src/sgsn/gprs_mm_state_iu_fsm.c27
-rw-r--r--src/sgsn/sgsn_vty.c2
-rw-r--r--tests/test_nodes.vty1
4 files changed, 29 insertions, 2 deletions
diff --git a/include/osmocom/sgsn/gprs_mm_state_iu_fsm.h b/include/osmocom/sgsn/gprs_mm_state_iu_fsm.h
index 7f02bcc45..05342f9fb 100644
--- a/include/osmocom/sgsn/gprs_mm_state_iu_fsm.h
+++ b/include/osmocom/sgsn/gprs_mm_state_iu_fsm.h
@@ -19,6 +19,7 @@ enum mm_state_iu_fsm_events {
E_PMM_PS_CONN_ESTABLISH,
E_PMM_IMPLICIT_DETACH, /* = E_PS_ATTACH_REJECT, E_RAU_REJECT */
E_PMM_RA_UPDATE, /* = Serving RNC relocation */
+ E_PMM_USER_INACTIVITY, /* when the inactivity timer runs out */
};
extern struct osmo_fsm mm_state_iu_fsm;
diff --git a/src/sgsn/gprs_mm_state_iu_fsm.c b/src/sgsn/gprs_mm_state_iu_fsm.c
index b098f2018..e6b80d743 100644
--- a/src/sgsn/gprs_mm_state_iu_fsm.c
+++ b/src/sgsn/gprs_mm_state_iu_fsm.c
@@ -12,7 +12,8 @@
static const struct osmo_tdef_state_timeout mm_state_iu_fsm_timeouts[32] = {
[ST_PMM_DETACHED] = { },
- [ST_PMM_CONNECTED] = { },
+ /* non-spec -T3314 (User inactivity timer) */
+ [ST_PMM_CONNECTED] = { .T=-3314 },
[ST_PMM_IDLE] = { },
};
@@ -47,6 +48,10 @@ static void st_pmm_detached(struct osmo_fsm_inst *fi, uint32_t event, void *data
static void st_pmm_connected(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct sgsn_mm_ctx *ctx = fi->priv;
+ const struct RANAP_Cause user_inactive_cause = {
+ .present = RANAP_Cause_PR_radioNetwork,
+ .choice.radioNetwork = RANAP_CauseRadioNetwork_user_inactivity,
+ };
switch(event) {
case E_PMM_PS_CONN_RELEASE:
@@ -57,6 +62,10 @@ static void st_pmm_connected(struct osmo_fsm_inst *fi, uint32_t event, void *dat
sgsn_ranap_iu_release_free(ctx, NULL);
mm_state_iu_fsm_state_chg(fi, ST_PMM_DETACHED);
break;
+ case E_PMM_USER_INACTIVITY:
+ sgsn_ranap_iu_release_free(ctx, &user_inactive_cause);
+ mm_state_iu_fsm_state_chg(fi, ST_PMM_DETACHED);
+ break;
case E_PMM_RA_UPDATE:
break;
}
@@ -81,6 +90,18 @@ static void st_pmm_idle(struct osmo_fsm_inst *fi, uint32_t event, void *data)
}
}
+static int pmm_state_fsm_timer_cb(struct osmo_fsm_inst *fi)
+{
+ switch(fi->state) {
+ case ST_PMM_CONNECTED:
+ /* timer for pmm state. state=CONNECTED: -T3314 (User inactivity timer) */
+ osmo_fsm_inst_dispatch(fi, E_PMM_USER_INACTIVITY, NULL);
+ break;
+ }
+
+ return 0;
+}
+
static struct osmo_fsm_state mm_state_iu_fsm_states[] = {
[ST_PMM_DETACHED] = {
.in_event_mask = X(E_PMM_PS_ATTACH) | X(E_PMM_IMPLICIT_DETACH),
@@ -89,7 +110,8 @@ static struct osmo_fsm_state mm_state_iu_fsm_states[] = {
.action = st_pmm_detached,
},
[ST_PMM_CONNECTED] = {
- .in_event_mask = X(E_PMM_PS_CONN_RELEASE) | X(E_PMM_RA_UPDATE) | X(E_PMM_IMPLICIT_DETACH),
+ .in_event_mask = X(E_PMM_PS_CONN_RELEASE) | X(E_PMM_RA_UPDATE)
+ | X(E_PMM_IMPLICIT_DETACH) | X(E_PMM_USER_INACTIVITY),
.out_state_mask = X(ST_PMM_DETACHED) | X(ST_PMM_IDLE),
.name = "Connected",
.action = st_pmm_connected,
@@ -109,6 +131,7 @@ const struct value_string mm_state_iu_fsm_event_names[] = {
OSMO_VALUE_STRING(E_PMM_PS_CONN_ESTABLISH),
OSMO_VALUE_STRING(E_PMM_IMPLICIT_DETACH),
OSMO_VALUE_STRING(E_PMM_RA_UPDATE),
+ OSMO_VALUE_STRING(E_PMM_USER_INACTIVITY),
{ 0, NULL }
};
diff --git a/src/sgsn/sgsn_vty.c b/src/sgsn/sgsn_vty.c
index 9200822e3..17b64c890 100644
--- a/src/sgsn/sgsn_vty.c
+++ b/src/sgsn/sgsn_vty.c
@@ -104,6 +104,8 @@ static struct osmo_tdef sgsn_T_defs[] = {
{ .T=3386, .default_val=GSM0408_T3386_SECS, .desc="Wait for MODIFY PDP CTX ACK timer (s)" },
{ .T=3395, .default_val=GSM0408_T3395_SECS, .desc="Wait for DEACT PDP CTX ACK timer (s)" },
{ .T=3397, .default_val=GSM0408_T3397_SECS, .desc="Wait for DEACT AA PDP CTX ACK timer (s)" },
+ /* non spec timers */
+ { .T=-3314, .default_val=GSM0408_T3314_SECS, .desc="Iu User inactivity timer. On expiry release Iu connection (s)" },
{}
};
diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty
index 2ef926af1..b9cf91e7f 100644
--- a/tests/test_nodes.vty
+++ b/tests/test_nodes.vty
@@ -12,6 +12,7 @@ T3385 = 8 s Wait for ACT PDP CTX REQ timer (s) (default: 8 s)
T3386 = 8 s Wait for MODIFY PDP CTX ACK timer (s) (default: 8 s)
T3395 = 8 s Wait for DEACT PDP CTX ACK timer (s) (default: 8 s)
T3397 = 8 s Wait for DEACT AA PDP CTX ACK timer (s) (default: 8 s)
+X3314 = 44 s Iu User inactivity timer. On expiry release Iu connection (s) (default: 44 s)
OsmoSGSN# configure terminal
OsmoSGSN(config)# list
...