IuPS: sgsn_mm_ctx: add enum gprs_pmm_state field, track PMM state
Iu needs to page to transfer data in PMM-IDLE state. Change-Id: Id37778cb9a0328a21c8e8246998ecdb43dd687d8
This commit is contained in:
parent
af241727a9
commit
5b2363ebb2
|
@ -31,6 +31,16 @@ enum gprs_gmm_state {
|
||||||
GMM_DEREGISTERED_INIT, /* 4.1.3.3.1.4 */
|
GMM_DEREGISTERED_INIT, /* 4.1.3.3.1.4 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* TS 23.060 6.1.1 and 6.1.2 Mobility management states A/Gb and Iu mode */
|
||||||
|
enum gprs_pmm_state {
|
||||||
|
PMM_DETACHED,
|
||||||
|
PMM_CONNECTED,
|
||||||
|
PMM_IDLE,
|
||||||
|
MM_IDLE = PMM_DETACHED,
|
||||||
|
MM_READY = PMM_CONNECTED,
|
||||||
|
MM_STANDBY = PMM_IDLE,
|
||||||
|
};
|
||||||
|
|
||||||
enum gprs_mm_ctr {
|
enum gprs_mm_ctr {
|
||||||
GMM_CTR_PKTS_SIG_IN,
|
GMM_CTR_PKTS_SIG_IN,
|
||||||
GMM_CTR_PKTS_SIG_OUT,
|
GMM_CTR_PKTS_SIG_OUT,
|
||||||
|
@ -117,6 +127,7 @@ struct sgsn_mm_ctx {
|
||||||
|
|
||||||
char imsi[GSM23003_IMSI_MAX_DIGITS+1];
|
char imsi[GSM23003_IMSI_MAX_DIGITS+1];
|
||||||
enum gprs_gmm_state mm_state;
|
enum gprs_gmm_state mm_state;
|
||||||
|
enum gprs_pmm_state pmm_state; /* Iu: page when in PMM-IDLE mode */
|
||||||
uint32_t p_tmsi;
|
uint32_t p_tmsi;
|
||||||
uint32_t p_tmsi_old; /* old P-TMSI before new is confirmed */
|
uint32_t p_tmsi_old; /* old P-TMSI before new is confirmed */
|
||||||
uint32_t p_tmsi_sig;
|
uint32_t p_tmsi_sig;
|
||||||
|
|
|
@ -131,6 +131,8 @@ int sgsn_ranap_iu_event(struct ue_conn_ctx *ctx, enum iu_event_type type, void *
|
||||||
case IU_EVENT_LINK_INVALIDATED:
|
case IU_EVENT_LINK_INVALIDATED:
|
||||||
/* Clean up ue_conn_ctx here */
|
/* Clean up ue_conn_ctx here */
|
||||||
LOGMMCTXP(LOGL_INFO, mm, "IU release for imsi %s\n", mm->imsi);
|
LOGMMCTXP(LOGL_INFO, mm, "IU release for imsi %s\n", mm->imsi);
|
||||||
|
if (mm->pmm_state == PMM_CONNECTED)
|
||||||
|
mm->pmm_state = PMM_IDLE;
|
||||||
rc = 0;
|
rc = 0;
|
||||||
break;
|
break;
|
||||||
case IU_EVENT_SECURITY_MODE_COMPLETE:
|
case IU_EVENT_SECURITY_MODE_COMPLETE:
|
||||||
|
@ -241,6 +243,7 @@ static void mm_ctx_cleanup_free(struct sgsn_mm_ctx *ctx, const char *log_text)
|
||||||
|
|
||||||
/* Mark MM state as deregistered */
|
/* Mark MM state as deregistered */
|
||||||
ctx->mm_state = GMM_DEREGISTERED;
|
ctx->mm_state = GMM_DEREGISTERED;
|
||||||
|
ctx->pmm_state = PMM_DETACHED;
|
||||||
|
|
||||||
sgsn_mm_ctx_cleanup_free(ctx);
|
sgsn_mm_ctx_cleanup_free(ctx);
|
||||||
}
|
}
|
||||||
|
@ -852,6 +855,7 @@ static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx)
|
||||||
case GSM48_MT_GMM_SERVICE_REQ:
|
case GSM48_MT_GMM_SERVICE_REQ:
|
||||||
/* TODO: PMM State transition */
|
/* TODO: PMM State transition */
|
||||||
ctx->pending_req = 0;
|
ctx->pending_req = 0;
|
||||||
|
ctx->pmm_state = PMM_CONNECTED;
|
||||||
rc = gsm48_tx_gmm_service_ack(ctx);
|
rc = gsm48_tx_gmm_service_ack(ctx);
|
||||||
|
|
||||||
if (ctx->iu.service.type != GPRS_SERVICE_T_SIGNALLING)
|
if (ctx->iu.service.type != GPRS_SERVICE_T_SIGNALLING)
|
||||||
|
@ -1793,6 +1797,7 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
|
||||||
mmctx->gb.tlli_new);
|
mmctx->gb.tlli_new);
|
||||||
}
|
}
|
||||||
mmctx->mm_state = GMM_REGISTERED_NORMAL;
|
mmctx->mm_state = GMM_REGISTERED_NORMAL;
|
||||||
|
mmctx->pmm_state = PMM_CONNECTED;
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
memset(&sig_data, 0, sizeof(sig_data));
|
memset(&sig_data, 0, sizeof(sig_data));
|
||||||
|
@ -1815,6 +1820,7 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
|
||||||
mmctx->gb.tlli_new);
|
mmctx->gb.tlli_new);
|
||||||
}
|
}
|
||||||
mmctx->mm_state = GMM_REGISTERED_NORMAL;
|
mmctx->mm_state = GMM_REGISTERED_NORMAL;
|
||||||
|
mmctx->pmm_state = PMM_CONNECTED;
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
memset(&sig_data, 0, sizeof(sig_data));
|
memset(&sig_data, 0, sizeof(sig_data));
|
||||||
|
|
|
@ -246,6 +246,7 @@ struct sgsn_mm_ctx *sgsn_mm_ctx_alloc_iu(void *uectx)
|
||||||
ctx->iu.ue_ctx = uectx;
|
ctx->iu.ue_ctx = uectx;
|
||||||
ctx->iu.new_key = 1;
|
ctx->iu.new_key = 1;
|
||||||
ctx->mm_state = GMM_DEREGISTERED;
|
ctx->mm_state = GMM_DEREGISTERED;
|
||||||
|
ctx->pmm_state = PMM_DETACHED;
|
||||||
ctx->auth_triplet.key_seq = GSM_KEY_SEQ_INVAL;
|
ctx->auth_triplet.key_seq = GSM_KEY_SEQ_INVAL;
|
||||||
ctx->ctrg = rate_ctr_group_alloc(ctx, &mmctx_ctrg_desc, 0);
|
ctx->ctrg = rate_ctr_group_alloc(ctx, &mmctx_ctrg_desc, 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue