summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2017-01-31 16:32:33 +0100
committerAlexander Couzens <lynxis@fe80.eu>2017-01-31 18:16:42 +0100
commit9a2b7938ef9bda6356f35975636e81e4ad34ee99 (patch)
treea09d500efb8c61033346ab1f0ea2739f654157c7
parentsgsn: rename gprs->mm_state -> gmm_state (diff)
downloadOpenBSC-9a2b7938ef9bda6356f35975636e81e4ad34ee99.tar.xz
OpenBSC-9a2b7938ef9bda6356f35975636e81e4ad34ee99.zip
split MM states from PMM states
Change-Id: Ib78300de12b1cbf0f8c9a943aee8770ae8fee7cd
-rw-r--r--openbsc/include/openbsc/gprs_sgsn.h6
-rw-r--r--openbsc/src/gprs/gprs_gmm.c25
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");