diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/TrackingAreaUpdate.c b/openair-cn/NAS/EURECOM-NAS/src/emm/TrackingAreaUpdate.c index 4ff7e485f75f50ed11fc4afe8c842eaed659f678..4c29dcc40ad5a49c5735628f8b73d20d38ffc724 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/TrackingAreaUpdate.c +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/TrackingAreaUpdate.c @@ -32,6 +32,9 @@ Description Defines the tracking area update EMM procedure executed by the #include "emmData.h" #include "emm_sap.h" +#include "emm_cause.h" + +#include <string.h> // memcmp, memcpy /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -59,12 +62,58 @@ void *_emm_tau_t3430_handler(void *); * -------------------------------------------------------------------------- */ #ifdef NAS_MME +static int _emm_tracking_area_update_reject(void *args); #endif // NAS_MME /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ +/**************************************************************************** + ** ** + ** Name: emm_proc_tracking_area_update_reject() ** + ** ** + ** Description: ** + ** ** + ** Inputs: ueid: UE lower layer identifier ** + ** emm_cause: EMM cause code to be reported ** + ** Others: None ** + ** ** + ** Outputs: None ** + ** Return: RETURNok, RETURNerror ** + ** Others: _emm_data ** + ** ** + ***************************************************************************/ +int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause) +{ + LOG_FUNC_IN; + + int rc; + + /* Create temporary UE context */ + emm_data_context_t ue_ctx; + memset(&ue_ctx, 0 , sizeof(emm_data_context_t)); + ue_ctx.is_dynamic = FALSE; + ue_ctx.ueid = ueid; + + /* Update the EMM cause code */ +#if defined(EPC_BUILD) + if (ueid > 0) +#else + if (ueid < EMM_DATA_NB_UE_MAX) +#endif + { + ue_ctx.emm_cause = emm_cause; + } else { + ue_ctx.emm_cause = EMM_CAUSE_ILLEGAL_UE; + } + + /* Do not accept attach request with protocol error */ + rc = _emm_tracking_area_update_reject(&ue_ctx); + + LOG_FUNC_RETURN(rc); +} + /****************************************************************************/ /********************* L O C A L F U N C T I O N S *********************/ /****************************************************************************/ @@ -78,18 +127,18 @@ void *_emm_tau_t3430_handler(void *); /**************************************************************************** ** ** - ** Name: _emm_tau_t3430_handler() ** + ** Name: _emm_tau_t3430_handler() ** ** ** ** Description: T3430 timeout handler ** ** ** ** 3GPP TS 24.301, section 5.5.3.2.6 case c ** ** ** - ** Inputs: args: handler parameters ** - ** Others: None ** + ** Inputs: args: handler parameters ** + ** Others: None ** ** ** ** Outputs: None ** - ** Return: None ** - ** Others: None ** + ** Return: None ** + ** Others: None ** ** ** ***************************************************************************/ void *_emm_tau_t3430_handler(void *args) @@ -105,3 +154,58 @@ void *_emm_tau_t3430_handler(void *args) } #endif // NAS_UE + +#ifdef NAS_MME +/**************************************************************************** + ** ** + ** Name: _emm_tracking_area_update_reject() ** + ** ** + ** Description: Performs the tracking area update procedure not accepted ** + ** by the network. ** + ** ** + ** Inputs: args: UE context data ** + ** Others: None ** + ** ** + ** Outputs: None ** + ** Return: RETURNok, RETURNerror ** + ** Others: None ** + ** ** + ***************************************************************************/ +static int _emm_tracking_area_update_reject(void *args) +{ + LOG_FUNC_IN; + + int rc = RETURNerror; + + emm_data_context_t *emm_ctx = (emm_data_context_t *)(args); + + if (emm_ctx) { + emm_sap_t emm_sap; + LOG_TRACE(WARNING, "EMM-PROC - EMM tracking area update procedure not accepted " + "by the network (ueid=%08x, cause=%d)", + emm_ctx->ueid, emm_ctx->emm_cause); + /* + * Notify EMM-AS SAP that Tracking Area Update Reject message has to be sent + * onto the network + */ + emm_sap.primitive = EMMAS_ESTABLISH_REJ; + emm_sap.u.emm_as.u.establish.ueid = emm_ctx->ueid; + emm_sap.u.emm_as.u.establish.UEid.guti = NULL; + if (emm_ctx->emm_cause == EMM_CAUSE_SUCCESS) { + emm_ctx->emm_cause = EMM_CAUSE_ILLEGAL_UE; + } + emm_sap.u.emm_as.u.establish.emm_cause = emm_ctx->emm_cause; + emm_sap.u.emm_as.u.establish.NASinfo = EMM_AS_NAS_INFO_TAU; + emm_sap.u.emm_as.u.establish.NASmsg.length = 0; + emm_sap.u.emm_as.u.establish.NASmsg.value = NULL; + + /* Setup EPS NAS security data */ + emm_as_set_security_data(&emm_sap.u.emm_as.u.establish.sctx, + emm_ctx->security, FALSE, TRUE); + rc = emm_sap_send(&emm_sap); + } + + LOG_FUNC_RETURN(rc); +} + +#endif // NAS_MME diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h index d194e2728a0c386b700f35c21088866f37f7a694..50e490280eaca9ca8b0a6c8daf3420433b0f631b 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h @@ -137,6 +137,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type, imei_t *imei, tai_t *tai, int eea, int eia, const OctetString *esm_msg); int emm_proc_attach_reject(unsigned int ueid, int emm_cause); int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg); +int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause); #endif /* diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c index 29b483c8c7b4abe9984c79516fabcf5d67c7c472..176b9f9940bcc5ec095bcca012434fc5a25476d7 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c @@ -368,6 +368,12 @@ static int _emm_as_recv(unsigned int ueid, const char *msg, int len, break; #endif #ifdef NAS_MME + case ATTACH_REQUEST: + rc = emm_recv_attach_request(ueid, + &emm_msg->attach_request, + emm_cause); + break; + case IDENTITY_RESPONSE: rc = emm_recv_identity_response(ueid, &emm_msg->identity_response, @@ -722,7 +728,9 @@ static int _emm_as_establish_req(const emm_as_establish_t *msg, int *emm_cause) break; case TRACKING_AREA_UPDATE_REQUEST: - rc = RETURNok; /* TODO */ + rc = emm_recv_tracking_area_update_request(msg->ueid, + &emm_msg->tracking_area_update_request, + emm_cause); break; case SERVICE_REQUEST: @@ -1096,6 +1104,7 @@ static int _emm_as_send(const emm_as_t *msg) LOG_FUNC_RETURN (RETURNok); } break; + case AS_NAS_ESTABLISH_RSP: case AS_NAS_ESTABLISH_CNF: { if (as_msg.msg.nas_establish_rsp.errCode != AS_SUCCESS) { nas_itti_dl_data_req(as_msg.msg.nas_establish_rsp.UEid, @@ -1768,6 +1777,10 @@ static int _emm_as_establish_rej(const emm_as_establish_t *msg, size = emm_send_attach_reject(msg, &emm_msg->attach_reject); break; + case EMM_AS_NAS_INFO_TAU: + size = emm_send_tracking_area_update_reject(msg, &emm_msg->tracking_area_update_reject); + break; + default: LOG_TRACE(WARNING, "EMMAS-SAP - Type of initial NAS " "message 0x%.2x is not valid", msg->NASinfo); diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c index 993bfa53c97ae6a80665c5d43516d4cfa8bab111..dcd5ad46921b84f7fecb1e5fefdaa6e3912b8940 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c @@ -745,6 +745,37 @@ int emm_recv_detach_request(unsigned int ueid, const detach_request_msg *msg, LOG_FUNC_RETURN (rc); } +/**************************************************************************** + ** ** + ** Name: emm_recv_tracking_area_update_request() ** + ** ** + ** Description: Processes Tracking Area Update Request message ** + ** ** + ** Inputs: ueid: UE lower layer identifier ** + ** msg: The received EMM message ** + ** Others: None ** + ** ** + ** Outputs: emm_cause: EMM cause code ** + ** Return: RETURNok, RETURNerror ** + ** Others: None ** + ** ** + ***************************************************************************/ +int emm_recv_tracking_area_update_request(unsigned int ueid, + const tracking_area_update_request_msg *msg, + int *emm_cause) +{ + int rc = RETURNok; + + LOG_FUNC_IN; + + LOG_TRACE(INFO, "EMMAS-SAP - Received Tracking Area Update Request message"); + + /* LW: Not completely implemented; send a Received Tracking Area Update Reject to induce a Attach Request from UE! */ + rc = emm_proc_tracking_area_update_reject(ueid, EMM_CAUSE_IMPLICITLY_DETACHED); + + LOG_FUNC_RETURN (rc); +} + /**************************************************************************** ** ** ** Name: emm_recv_identity_response() ** diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.h b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.h index 60fa19d72fdd7b341f492bb04661584c869bb181..e9e29f4ec24eba7ea3d6d21323147ac27e345e8e 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.h +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.h @@ -116,6 +116,10 @@ int emm_recv_attach_complete(unsigned int ueid, const attach_complete_msg *msg, int emm_recv_detach_request(unsigned int ueid, const detach_request_msg *msg, int *emm_cause); +int emm_recv_tracking_area_update_request(unsigned int ueid, + const tracking_area_update_request_msg *msg, + int *emm_cause); + int emm_recv_identity_response(unsigned int ueid, identity_response_msg *msg, int *emm_cause); int emm_recv_authentication_response(unsigned int ueid, diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c index b81484eae2987e8f56335b2b7e4615641d5cdf60..6ba7469cf48017554490714ae55ca26286f704de 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c @@ -990,6 +990,44 @@ int emm_send_attach_reject(const emm_as_establish_t *msg, LOG_FUNC_RETURN (size); } +/**************************************************************************** + ** ** + ** Name: emm_send_tracking_area_update_reject() ** + ** ** + ** Description: Builds Tracking Area Update Reject message ** + ** ** + ** The Tracking Area Update Reject message is sent by the ** + ** network to the UE to indicate that the corresponding ** + ** tracking area update has been rejected. ** + ** ** + ** Inputs: msg: The EMMAS-SAP primitive to process ** + ** Others: None ** + ** ** + ** Outputs: emm_msg: The EMM message to be sent ** + ** Return: The size of the EMM message ** + ** Others: None ** + ** ** + ***************************************************************************/ +int emm_send_tracking_area_update_reject(const emm_as_establish_t *msg, + tracking_area_update_reject_msg *emm_msg) +{ + LOG_FUNC_IN; + + int size = EMM_HEADER_MAXIMUM_LENGTH; + + LOG_TRACE(INFO, "EMMAS-SAP - Send Tracking Area Update Reject message (cause=%d)", + msg->emm_cause); + + /* Mandatory - Message type */ + emm_msg->messagetype = TRACKING_AREA_UPDATE_REJECT; + + /* Mandatory - EMM cause */ + size += EMM_CAUSE_MAXIMUM_LENGTH; + emm_msg->emmcause = msg->emm_cause; + + LOG_FUNC_RETURN (size); +} + /**************************************************************************** ** ** ** Name: emm_send_identity_request() ** diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.h b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.h index 735f167b943032fecf253de83800eab512454456..25040dbf66e111377440d01275e3f948a5ede0a0 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.h +++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.h @@ -130,6 +130,9 @@ int emm_send_security_mode_reject(const emm_as_security_t *, int emm_send_attach_accept(const emm_as_establish_t *, attach_accept_msg *); int emm_send_attach_reject(const emm_as_establish_t *, attach_reject_msg *); +int emm_send_tracking_area_update_reject(const emm_as_establish_t *msg, + tracking_area_update_reject_msg *emm_msg); + int emm_send_identity_request(const emm_as_security_t *, identity_request_msg *); int emm_send_authentication_request(const emm_as_security_t *, authentication_request_msg *);