From 03121afb4ca71cea5bbe1e06501a8685cca0593c Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Tue, 31 Jan 2017 16:32:33 +0100 Subject: split MM states from PMM states Change-Id: Ib78300de12b1cbf0f8c9a943aee8770ae8fee7cd --- openbsc/include/openbsc/gprs_sgsn.h | 6 +++--- openbsc/src/gprs/gprs_gmm.c | 21 ++++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/openbsc/include/openbsc/gprs_sgsn.h b/openbsc/include/openbsc/gprs_sgsn.h index 1828921d1..62470be41 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 ed01500cf..fffbe9cfc 100644 --- a/openbsc/src/gprs/gprs_gmm.c +++ b/openbsc/src/gprs/gprs_gmm.c @@ -119,8 +119,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; @@ -277,8 +289,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)); -- cgit v1.2.3