diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-08-14 19:11:10 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-08-20 17:48:31 +0200 |
commit | a299d6511486dc384af920592f1ff8488e8fcf0c (patch) | |
tree | d7babaf8adf609c9c597ee34e33e2e87777396f2 /src/gprs/gprs_gmm_attach.c | |
parent | a43fb7b8e5dda567b25e7110b999ee4adf9eaa41 (diff) |
Replace own timer infra with libosmocore osmo_tdef
VTY command "show timer" is also available now.
Change-Id: Ia0cf5f0a49737fbc419e2ccc86312d01c6e0056e
Diffstat (limited to 'src/gprs/gprs_gmm_attach.c')
-rw-r--r-- | src/gprs/gprs_gmm_attach.c | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/src/gprs/gprs_gmm_attach.c b/src/gprs/gprs_gmm_attach.c index 2217b0ab3..130f8d1c0 100644 --- a/src/gprs/gprs_gmm_attach.c +++ b/src/gprs/gprs_gmm_attach.c @@ -1,3 +1,5 @@ +#include <osmocom/core/tdef.h> + #include <osmocom/sgsn/gprs_gmm_attach.h> #include <osmocom/gsm/protocol/gsm_04_08_gprs.h> @@ -10,6 +12,18 @@ static int require_identity_imei = 1; static int require_auth = 1; +static const struct osmo_tdef_state_timeout gmm_attach_fsm_timeouts[32] = { + [ST_IDENTIY] = { .T=3370 }, + [ST_AUTH] = { .T=3360 }, + [ST_ACCEPT] = { .T=3350 }, + [ST_ASK_VLR] = { .T=3350 }, + [ST_IU_SECURITY_CMD] = { .T=3350 }, +}; + +#define gmm_attach_fsm_state_chg(fi, NEXT_STATE) \ + osmo_tdef_fsm_inst_state_chg(fi, NEXT_STATE, gmm_attach_fsm_timeouts, sgsn->cfg.T_defs, -1) + + static void st_init(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct sgsn_mm_ctx *ctx = fi->priv; @@ -33,14 +47,14 @@ static void st_init(struct osmo_fsm_inst *fi, uint32_t event, void *data) if (require_identity_imei) { ctx->gmm_att_req.id_type = GSM_MI_TYPE_IMEI; - osmo_fsm_inst_state_chg(fi, ST_IDENTIY, sgsn->cfg.timers.T3370, 3370); + gmm_attach_fsm_state_chg(fi, ST_IDENTIY); } else if (!strlen(ctx->imsi)) { ctx->gmm_att_req.id_type = GSM_MI_TYPE_IMSI; - osmo_fsm_inst_state_chg(fi, ST_IDENTIY, sgsn->cfg.timers.T3370, 3370); + gmm_attach_fsm_state_chg(fi, ST_IDENTIY); } else if (require_auth) - osmo_fsm_inst_state_chg(fi, ST_AUTH, sgsn->cfg.timers.T3360, 3360); + gmm_attach_fsm_state_chg(fi, ST_AUTH); else - osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ACCEPT); } static void st_identity_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) @@ -94,11 +108,11 @@ static void st_identity(struct osmo_fsm_inst *fi, uint32_t event, void *data) if (type == GSM_MI_TYPE_IMEI && !strlen(ctx->imsi)) { ctx->gmm_att_req.id_type = GSM_MI_TYPE_IMSI; - osmo_fsm_inst_state_chg(fi, ST_IDENTIY, sgsn->cfg.timers.T3370, 3370); + gmm_attach_fsm_state_chg(fi, ST_IDENTIY); } else if (require_auth) - osmo_fsm_inst_state_chg(fi, ST_AUTH, sgsn->cfg.timers.T3360, 3360); + gmm_attach_fsm_state_chg(fi, ST_AUTH); else - osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ACCEPT); } static void st_auth_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) @@ -124,19 +138,19 @@ static void st_auth_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) switch(auth_state) { case SGSN_AUTH_UMTS_RESYNC: /* ask the vlr for a new vector to match the simcards seq */ case SGSN_AUTH_UNKNOWN: /* the SGSN doesn know this MS */ - osmo_fsm_inst_state_chg(fi, ST_ASK_VLR, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ASK_VLR); break; case SGSN_AUTH_REJECTED: /* TODO: correct GMM cause */ osmo_fsm_inst_dispatch(fi, E_REJECT, (void *) GMM_CAUSE_GPRS_NOTALLOWED); break; case SGSN_AUTH_ACCEPTED: - osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ACCEPT); break; case SGSN_AUTH_AUTHENTICATE: if (ctx->auth_triplet.key_seq == GSM_KEY_SEQ_INVAL) { /* invalid key material */ - osmo_fsm_inst_state_chg(fi, ST_ASK_VLR, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ASK_VLR); } struct gsm_auth_tuple *at = &ctx->auth_triplet; @@ -159,14 +173,14 @@ static void st_auth(struct osmo_fsm_inst *fi, uint32_t event, void *data) sgsn_auth_request(ctx); #ifdef BUILD_IU if (ctx->ran_type == MM_CTX_T_UTRAN_Iu && !ctx->iu.ue_ctx->integrity_active) - osmo_fsm_inst_state_chg(fi, ST_IU_SECURITY_CMD, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_IU_SECURITY_CMD); else #endif /* BUILD_IU */ - osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ACCEPT); break; case E_AUTH_RESP_RECV_RESYNC: if (ctx->gmm_att_req.auth_reattempt <= 1) - osmo_fsm_inst_state_chg(fi, ST_ASK_VLR, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ASK_VLR); else osmo_fsm_inst_dispatch(fi, E_REJECT, (void *) GMM_CAUSE_SYNC_FAIL); break; @@ -234,7 +248,7 @@ static void st_ask_vlr(struct osmo_fsm_inst *fi, uint32_t event, void *data) { switch(event) { case E_VLR_ANSWERED: - osmo_fsm_inst_state_chg(fi, ST_AUTH, sgsn->cfg.timers.T3360, 3360); + gmm_attach_fsm_state_chg(fi, ST_AUTH); break; } } @@ -246,7 +260,7 @@ static void st_iu_security_cmd_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_ /* TODO: shouldn't this set always? not only when the integrity_active? */ if (ctx->iu.ue_ctx->integrity_active) { - osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ACCEPT); return; } @@ -259,7 +273,7 @@ static void st_iu_security_cmd(struct osmo_fsm_inst *fi, uint32_t event, void *d { switch(event) { case E_IU_SECURITY_CMD_COMPLETE: - osmo_fsm_inst_state_chg(fi, ST_ACCEPT, sgsn->cfg.timers.T3350, 3350); + gmm_attach_fsm_state_chg(fi, ST_ACCEPT); break; } } @@ -373,6 +387,7 @@ int gmm_attach_timer_cb(struct osmo_fsm_inst *fi) { struct sgsn_mm_ctx *ctx = fi->priv; struct gsm_auth_tuple *at = &ctx->auth_triplet; + unsigned long t_secs; ctx->num_T_exp++; @@ -392,7 +407,9 @@ int gmm_attach_timer_cb(struct osmo_fsm_inst *fi) break; } gsm48_tx_gmm_id_req(ctx, ctx->gmm_att_req.id_type); - osmo_timer_schedule(&fi->timer, sgsn->cfg.timers.T3370, 0); + t_secs = osmo_tdef_get(sgsn->cfg.T_defs, 3370, OSMO_TDEF_S, -1); + osmo_timer_schedule(&fi->timer, t_secs, 0); + break; case ST_AUTH: /* T3360 */ @@ -401,7 +418,8 @@ int gmm_attach_timer_cb(struct osmo_fsm_inst *fi) break; } gsm48_tx_gmm_auth_ciph_req(ctx, &at->vec, at->key_seq, false); - osmo_timer_schedule(&fi->timer, sgsn->cfg.timers.T3360, 0); + t_secs = osmo_tdef_get(sgsn->cfg.T_defs, 3360, OSMO_TDEF_S, -1); + osmo_timer_schedule(&fi->timer, t_secs, 0); break; case ST_ACCEPT: /* T3350 */ @@ -410,7 +428,8 @@ int gmm_attach_timer_cb(struct osmo_fsm_inst *fi) break; } gsm48_tx_gmm_att_ack(ctx); - osmo_timer_schedule(&fi->timer, sgsn->cfg.timers.T3350, 0); + t_secs = osmo_tdef_get(sgsn->cfg.T_defs, 3350, OSMO_TDEF_S, -1); + osmo_timer_schedule(&fi->timer, t_secs, 0); break; } |