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
This commit is contained in:
Alexander Couzens 2019-09-11 02:17:31 +02:00 committed by lynxis lazus
parent eb5aee580d
commit 3bad31bcb4
4 changed files with 29 additions and 2 deletions

View File

@ -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;

View File

@ -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 }
};

View File

@ -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)" },
{}
};

View File

@ -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
...