diff options
author | Alexander Couzens <lynxis@fe80.eu> | 2017-01-31 16:32:33 +0100 |
---|---|---|
committer | Alexander Couzens <lynxis@fe80.eu> | 2017-01-31 18:16:42 +0100 |
commit | 9a2b7938ef9bda6356f35975636e81e4ad34ee99 (patch) | |
tree | a09d500efb8c61033346ab1f0ea2739f654157c7 | |
parent | sgsn: rename gprs->mm_state -> gmm_state (diff) | |
download | OpenBSC-9a2b7938ef9bda6356f35975636e81e4ad34ee99.tar.xz OpenBSC-9a2b7938ef9bda6356f35975636e81e4ad34ee99.zip |
split MM states from PMM states
Change-Id: Ib78300de12b1cbf0f8c9a943aee8770ae8fee7cd
-rw-r--r-- | openbsc/include/openbsc/gprs_sgsn.h | 6 | ||||
-rw-r--r-- | openbsc/src/gprs/gprs_gmm.c | 25 |
2 files changed, 23 insertions, 8 deletions
diff --git a/openbsc/include/openbsc/gprs_sgsn.h b/openbsc/include/openbsc/gprs_sgsn.h index f5fc15901..f50de1115 100644 --- a/openbsc/include/openbsc/gprs_sgsn.h +++ b/openbsc/include/openbsc/gprs_sgsn.h @@ -36,9 +36,9 @@ enum gprs_pmm_state { PMM_DETACHED, PMM_CONNECTED, PMM_IDLE, - MM_IDLE = PMM_DETACHED, - MM_READY = PMM_CONNECTED, - MM_STANDBY = PMM_IDLE, + MM_IDLE, + MM_READY, + MM_STANDBY, }; enum gprs_mm_ctr { diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c index c7e44fd6d..3005d5fb6 100644 --- a/openbsc/src/gprs/gprs_gmm.c +++ b/openbsc/src/gprs/gprs_gmm.c @@ -117,8 +117,20 @@ static void mmctx_change_gtpu_endpoints_to_sgsn(struct sgsn_mm_ctx *mm_ctx) } } -void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state state) +void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state iu, enum gprs_pmm_state gb) { + enum gprs_pmm_state state; + + switch (ctx->ran_type) { + case MM_CTX_T_GERAN_Gb: + state = gb; + break; + case MM_CTX_T_GERAN_Iu: + case MM_CTX_T_UTRAN_Iu: + state = iu; + break; + } + if (ctx->pmm_state == state) return; @@ -275,8 +287,7 @@ static void mm_ctx_cleanup_free(struct sgsn_mm_ctx *ctx, const char *log_text) /* Mark MM state as deregistered */ ctx->gmm_state = GMM_DEREGISTERED; - - mmctx_set_pmm_state(ctx, PMM_DETACHED); + mmctx_set_pmm_state(ctx, PMM_DETACHED, MM_IDLE); sgsn_mm_ctx_cleanup_free(ctx); } @@ -1832,7 +1843,7 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg, mmctx->gb.tlli_new); } mmctx->gmm_state = GMM_REGISTERED_NORMAL; - mmctx_set_pmm_state(mmctx, PMM_CONNECTED); + mmctx_set_pmm_state(mmctx, PMM_CONNECTED, MM_READY); rc = 0; memset(&sig_data, 0, sizeof(sig_data)); @@ -1855,7 +1866,7 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg, mmctx->gb.tlli_new); } mmctx->gmm_state = GMM_REGISTERED_NORMAL; - mmctx_set_pmm_state(mmctx, PMM_CONNECTED); + mmctx_set_pmm_state(mmctx, PMM_CONNECTED, MM_READY); rc = 0; memset(&sig_data, 0, sizeof(sig_data)); @@ -1910,6 +1921,10 @@ static void mmctx_timer_cb(void *_mm) mm->num_T_exp++; switch (mm->T) { + case 3314: /* MM ready -> idle timeout */ + LOGMMCTXP(LOGL_INFO, mm, "T3314 timeed out, falling back to MM_STANDBY"); + mmctx_set_pmm_state(mm, PMM_IDLE, MM_STANDBY); + break; case 3350: /* waiting for ATTACH COMPLETE */ if (mm->num_T_exp >= 5) { LOGMMCTXP(LOGL_NOTICE, mm, "T3350 expired >= 5 times\n"); |