/**************************************************************************** ** ** ** Name: _authentication_request() ** ** ** ** Description: Sends AUTHENTICATION REQUEST message and start timer T3460** ** ** ** Inputs: args: handler parameters ** ** Others: None ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: T3460 ** ** ** ***************************************************************************/ int _authentication_request(authentication_data_t *data) { LOG_FUNC_IN; emm_sap_t emm_sap; int rc; struct emm_data_context_s *emm_ctx; /* * Notify EMM-AS SAP that Authentication Request message has to be sent * to the UE */ emm_sap.primitive = EMMAS_SECURITY_REQ; emm_sap.u.emm_as.u.security.guti = NULL; emm_sap.u.emm_as.u.security.ueid = data->ueid; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH; emm_sap.u.emm_as.u.security.ksi = data->ksi; emm_sap.u.emm_as.u.security.rand = &data->rand; emm_sap.u.emm_as.u.security.autn = &data->autn; /* TODO: check for pointer validity */ #if defined(NAS_BUILT_IN_EPC) emm_ctx = emm_data_context_get(&_emm_data, data->ueid); #else emm_ctx = _emm_data.ctx[data->ueid]; #endif /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, emm_ctx->security, FALSE, TRUE); MSC_LOG_TX_MESSAGE( MSC_NAS_EMM_MME, MSC_NAS_EMM_MME, NULL,0, "0 EMMAS_SECURITY_REQ ue id "NAS_UE_ID_FMT" ", data->ueid); rc = emm_sap_send(&emm_sap); if (rc != RETURNerror) { if (emm_ctx) { if (emm_ctx->T3460.id != NAS_TIMER_INACTIVE_ID) { /* Re-start T3460 timer */ emm_ctx->T3460.id = nas_timer_restart(emm_ctx->T3460.id); MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 restarted UE "NAS_UE_ID_FMT" ", data->ueid); } else { /* Start T3460 timer */ emm_ctx->T3460.id = nas_timer_start(emm_ctx->T3460.sec, _authentication_t3460_handler, data); MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3460 started UE "NAS_UE_ID_FMT" ", data->ueid); } } LOG_TRACE(INFO,"EMM-PROC - Timer T3460 (%d) expires in %ld seconds", emm_ctx->T3460.id, emm_ctx->T3460.sec); } LOG_FUNC_RETURN (rc); }
/**************************************************************************** ** ** ** Name: _identification_request() ** ** ** ** Description: Sends IDENTITY REQUEST message and start timer T3470. ** ** ** ** Inputs: args: handler parameters ** ** Others: None ** ** ** ** Outputs: None ** ** Return: None ** ** Others: T3470 ** ** ** ***************************************************************************/ int _identification_request(identification_data_t *data) { emm_sap_t emm_sap; int rc; struct emm_data_context_s *emm_ctx = NULL; LOG_FUNC_IN; /* * Notify EMM-AS SAP that Identity Request message has to be sent * to the UE */ MSC_LOG_TX_MESSAGE( MSC_NAS_EMM_MME, MSC_NAS_EMM_MME, NULL,0, "0 EMMAS_SECURITY_REQ ue id "NAS_UE_ID_FMT" ", data->ueid); emm_sap.primitive = EMMAS_SECURITY_REQ; emm_sap.u.emm_as.u.security.guti = NULL; emm_sap.u.emm_as.u.security.ueid = data->ueid; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT; emm_sap.u.emm_as.u.security.identType = data->type; #if defined(NAS_BUILT_IN_EPC) if (data->ueid > 0) { emm_ctx = emm_data_context_get(&_emm_data, data->ueid); } #else if (data->ueid < EMM_DATA_NB_UE_MAX) { emm_ctx = _emm_data.ctx[data->ueid]; } #endif /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, emm_ctx->security, FALSE, TRUE); rc = emm_sap_send(&emm_sap); if (rc != RETURNerror) { if (emm_ctx->T3470.id != NAS_TIMER_INACTIVE_ID) { /* Re-start T3470 timer */ emm_ctx->T3470.id = nas_timer_restart(emm_ctx->T3470.id); MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 restarted UE "NAS_UE_ID_FMT" ", data->ueid); } else { /* Start T3470 timer */ emm_ctx->T3470.id = nas_timer_start(emm_ctx->T3470.sec, _identification_t3470_handler, data); MSC_LOG_EVENT(MSC_NAS_EMM_MME, "0 T3470 started UE "NAS_UE_ID_FMT" ", data->ueid); } LOG_TRACE(INFO,"EMM-PROC - Timer T3470 (%d) expires in %ld seconds", emm_ctx->T3470.id, emm_ctx->T3470.sec); } LOG_FUNC_RETURN (rc); }
/**************************************************************************** ** ** ** Name: esm_pt_start_timer() ** ** ** ** Description: Start the timer of the specified procedure transaction to ** ** expire after a given time interval. Timer expiration will ** ** schedule execution of the callback function where stored ** ** ESM message should be re-transmit. ** ** ** ** Inputs: pti: The identity of the procedure transaction ** ** msg: The encoded ESM message to be stored ** ** sec: The value of the time interval in seconds ** ** cb: Function executed upon timer expiration ** ** Others: None ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: _esm_pt_data ** ** ** ***************************************************************************/ int esm_pt_start_timer(int pti, const OctetString *msg, long sec, nas_timer_callback_t cb) { LOG_FUNC_IN; if ( (pti < ESM_PTI_MIN) || (pti > ESM_PTI_MAX) ) { LOG_FUNC_RETURN (RETURNerror); } /* Get procedure transaction data */ esm_pt_context_t *ctx = _esm_pt_data.context[pti - ESM_PTI_MIN]; if ( (ctx == NULL) || (ctx->pti != pti) ) { /* Procedure transaction not assigned */ LOG_FUNC_RETURN (RETURNerror); } if (ctx->timer.id != NAS_TIMER_INACTIVE_ID) { if (ctx->args) { /* Re-start the retransmission timer */ ctx->timer.id = nas_timer_restart(ctx->timer.id); } } else { /* Setup the retransmission timer parameters */ ctx->args = (esm_pt_timer_data_t *)malloc(sizeof(esm_pt_timer_data_t)); if (ctx->args) { /* Set the EPS bearer identity */ ctx->args->pti = pti; /* Reset the retransmission counter */ ctx->args->count = 0; /* Set the ESM message to be re-transmited */ ctx->args->msg.value = (uint8_t *)malloc(msg->length); ctx->args->msg.length = 0; if (ctx->args->msg.value) { memcpy(ctx->args->msg.value, msg->value, msg->length); ctx->args->msg.length = msg->length; } /* Setup the retransmission timer to expire at the given * time interval */ ctx->timer.id = nas_timer_start(sec, cb, ctx->args); ctx->timer.sec = sec; } } if ( (ctx->args != NULL) && (ctx->timer.id != NAS_TIMER_INACTIVE_ID) ) { LOG_TRACE(INFO, "ESM-FSM - Retransmission timer %d expires in " "%ld seconds", ctx->timer.id, ctx->timer.sec); LOG_FUNC_RETURN (RETURNok); } LOG_FUNC_RETURN (RETURNerror); }