/**************************************************************************** ** ** ** Name: _identification_t3470_handler() ** ** ** ** Description: T3470 timeout handler ** ** Upon T3470 timer expiration, the identification request ** ** message is retransmitted and the timer restarted. When ** ** retransmission counter is exceed, the MME shall abort the ** ** identification procedure and any ongoing EMM procedure. ** ** ** ** 3GPP TS 24.301, section 5.4.4.6, case b ** ** ** ** Inputs: args: handler parameters ** ** Others: None ** ** ** ** Outputs: None ** ** Return: None ** ** Others: None ** ** ** ***************************************************************************/ static void *_identification_t3470_handler(void *args) { LOG_FUNC_IN; int rc; identification_data_t *data = (identification_data_t *)(args); /* Increment the retransmission counter */ data->retransmission_count += 1; LOG_TRACE(WARNING, "EMM-PROC - T3470 timer expired, retransmission " "counter = %d", data->retransmission_count); if (data->retransmission_count < IDENTIFICATION_COUNTER_MAX) { /* Send identity request message to the UE */ rc = _identification_request(data); } else { /* Set the failure notification indicator */ data->notify_failure = TRUE; /* Abort the identification procedure */ rc = _identification_abort(data); } LOG_FUNC_RETURN (NULL); }
/******************************************************************** ** ** ** Name: emm_proc_identification() ** ** ** ** Description: Initiates an identification procedure. ** ** ** ** 3GPP TS 24.301, section 5.4.4.2 ** ** The network initiates the identification procedure by ** ** sending an IDENTITY REQUEST message to the UE and star- ** ** ting the timer T3470. The IDENTITY REQUEST message speci- ** ** fies the requested identification parameters in the Iden- ** ** tity type information element. ** ** ** ** Inputs: ueid: UE lower layer identifier ** ** type: Type of the requested identity ** ** success: Callback function executed when the identi- ** ** fication procedure successfully completes ** ** reject: Callback function executed when the identi- ** ** fication procedure fails or is rejected ** ** failure: Callback function executed whener a lower ** ** layer failure occured before the identifi- ** ** cation procedure completes ** ** Others: None ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: _emm_data ** ** ** ********************************************************************/ int emm_proc_identification(unsigned int ueid, emm_data_context_t *emm_ctx, emm_proc_identity_type_t type, emm_common_success_callback_t success, emm_common_reject_callback_t reject, emm_common_failure_callback_t failure) { LOG_FUNC_IN; int rc = RETURNerror; LOG_TRACE(INFO, "EMM-PROC - Initiate identification type = %s (%d), ctx = %p", _emm_identity_type_str[type], type, emm_ctx); /* Allocate parameters of the retransmission timer callback */ identification_data_t *data = (identification_data_t *)malloc(sizeof(identification_data_t)); if (data != NULL) { /* Setup ongoing EMM procedure callback functions */ rc = emm_proc_common_initialize(ueid, success, reject, failure, _identification_abort, data); if (rc != RETURNok) { LOG_TRACE(WARNING, "Failed to initialize EMM callback functions"); free(data); LOG_FUNC_RETURN (RETURNerror); } /* Set the UE identifier */ data->ueid = ueid; /* Reset the retransmission counter */ data->retransmission_count = 0; /* Set the type of the requested identity */ data->type = type; /* Set the failure notification indicator */ data->notify_failure = FALSE; /* Send identity request message to the UE */ rc = _identification_request(data); if (rc != RETURNerror) { /* * Notify EMM that common procedure has been initiated */ MSC_LOG_TX_MESSAGE( MSC_NAS_EMM_MME, MSC_NAS_EMM_MME, NULL,0, "0 EMMREG_COMMON_PROC_REQ ue id "NAS_UE_ID_FMT" (identification)", ueid); emm_sap_t emm_sap; emm_sap.primitive = EMMREG_COMMON_PROC_REQ; emm_sap.u.emm_reg.ueid = ueid; emm_sap.u.emm_reg.ctx = emm_ctx; rc = emm_sap_send(&emm_sap); } } LOG_FUNC_RETURN (rc); }