Save NAS decoded message instead of message type

This commit is contained in:
Sukchan Lee 2017-07-26 19:40:52 +09:00
parent 396791f441
commit 26749de828
5 changed files with 47 additions and 65 deletions

View File

@ -98,7 +98,18 @@ mme_ue_t *emm_find_ue_by_message(enb_ue_t *enb_ue, nas_message_t *message)
return mme_ue; return mme_ue;
} }
void emm_handle_esm_message_container( static status_t emm_send_to_enb(enb_ue_t *enb_ue, pkbuf_t *pkbuf)
{
mme_enb_t *enb = NULL;
d_assert(enb_ue, return CORE_ERROR, "Null param");
enb = enb_ue->enb;
d_assert(enb, return CORE_ERROR, "Null param");
return s1ap_send_to_enb(enb, pkbuf);
}
static void emm_handle_esm_message_container(
mme_ue_t *mme_ue, nas_esm_message_container_t *esm_message_container) mme_ue_t *mme_ue, nas_esm_message_container_t *esm_message_container)
{ {
pkbuf_t *esmbuf = NULL; pkbuf_t *esmbuf = NULL;
@ -240,7 +251,6 @@ void emm_handle_attach_request(
void emm_handle_identity_request(mme_ue_t *mme_ue) void emm_handle_identity_request(mme_ue_t *mme_ue)
{ {
status_t rv; status_t rv;
mme_enb_t *enb = NULL;
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL; pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
@ -251,8 +261,6 @@ void emm_handle_identity_request(mme_ue_t *mme_ue)
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM; message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
@ -267,7 +275,7 @@ void emm_handle_identity_request(mme_ue_t *mme_ue)
d_assert(rv == CORE_OK && s1apbuf, d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return, "s1ap build error"); pkbuf_free(emmbuf); return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error"); d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
} }
void emm_handle_identity_response( void emm_handle_identity_response(
@ -307,7 +315,6 @@ void emm_handle_identity_response(
void emm_handle_authentication_request(mme_ue_t *mme_ue) void emm_handle_authentication_request(mme_ue_t *mme_ue)
{ {
status_t rv; status_t rv;
mme_enb_t *enb = NULL;
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL; pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
@ -318,8 +325,6 @@ void emm_handle_authentication_request(mme_ue_t *mme_ue)
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM; message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
@ -338,14 +343,13 @@ void emm_handle_authentication_request(mme_ue_t *mme_ue)
d_assert(rv == CORE_OK && s1apbuf, d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return, "s1ap build error"); pkbuf_free(emmbuf); return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error"); d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
} }
void emm_handle_authentication_response(mme_ue_t *mme_ue, void emm_handle_authentication_response(mme_ue_t *mme_ue,
nas_authentication_response_t *authentication_response) nas_authentication_response_t *authentication_response)
{ {
status_t rv; status_t rv;
mme_enb_t *enb = NULL;
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL; pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
int i; int i;
@ -366,8 +370,6 @@ void emm_handle_authentication_response(mme_ue_t *mme_ue,
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
if (authentication_response_parameter->length != mme_ue->xres_len || if (authentication_response_parameter->length != mme_ue->xres_len ||
memcmp(authentication_response_parameter->res, memcmp(authentication_response_parameter->res,
@ -445,7 +447,7 @@ void emm_handle_authentication_response(mme_ue_t *mme_ue,
d_assert(rv == CORE_OK && s1apbuf, d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return, "s1ap build error"); pkbuf_free(emmbuf); return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error"); d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
} }
void emm_handle_create_session_response(mme_bearer_t *bearer) void emm_handle_create_session_response(mme_bearer_t *bearer)
@ -453,7 +455,6 @@ void emm_handle_create_session_response(mme_bearer_t *bearer)
status_t rv; status_t rv;
mme_ue_t *mme_ue = NULL; mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
mme_enb_t *enb = NULL;
pkbuf_t *esmbuf = NULL, *emmbuf = NULL, *s1apbuf = NULL; pkbuf_t *esmbuf = NULL, *emmbuf = NULL, *s1apbuf = NULL;
d_assert(bearer, return, "Null param"); d_assert(bearer, return, "Null param");
@ -461,8 +462,6 @@ void emm_handle_create_session_response(mme_bearer_t *bearer)
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
rv = esm_build_activate_default_bearer_context(&esmbuf, bearer); rv = esm_build_activate_default_bearer_context(&esmbuf, bearer);
d_assert(rv == CORE_OK && esmbuf, d_assert(rv == CORE_OK && esmbuf,
@ -481,14 +480,13 @@ void emm_handle_create_session_response(mme_bearer_t *bearer)
d_assert(rv == CORE_OK && s1apbuf, d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return, "s1ap build error"); pkbuf_free(emmbuf); return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error"); d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
} }
void emm_handle_attach_complete( void emm_handle_attach_complete(
mme_ue_t *mme_ue, nas_attach_complete_t *attach_complete) mme_ue_t *mme_ue, nas_attach_complete_t *attach_complete)
{ {
status_t rv; status_t rv;
mme_enb_t *enb = NULL;
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL; pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
@ -505,8 +503,6 @@ void emm_handle_attach_complete(
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
emm_handle_esm_message_container( emm_handle_esm_message_container(
mme_ue, &attach_complete->esm_message_container); mme_ue, &attach_complete->esm_message_container);
@ -552,7 +548,7 @@ void emm_handle_attach_complete(
d_assert(rv == CORE_OK && s1apbuf, d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return, "s1ap build error"); pkbuf_free(emmbuf); return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error"); d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
} }
void emm_handle_emm_status(mme_ue_t *mme_ue, nas_emm_status_t *emm_status) void emm_handle_emm_status(mme_ue_t *mme_ue, nas_emm_status_t *emm_status)
@ -567,27 +563,19 @@ void emm_handle_detach_request(
mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request) mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request)
{ {
status_t rv; status_t rv;
mme_enb_t *enb = NULL;
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
pkbuf_t *s11buf = NULL; pkbuf_t *s11buf = NULL;
mme_sess_t *sess; mme_sess_t *sess;
int delete_session_request_needed = 0; int delete_session_request_needed = 0;
nas_detach_type_t *detach_type = NULL;
nas_detach_type_t *detach_type = &detach_request->detach_type; d_assert(detach_request, return, "Null param");
detach_type = &detach_request->detach_type;
d_assert(detach_type, return, "Null param");
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
/* save detach_type in MME UE context */
d_assert(detach_type, return, "Null param");
mme_ue->detach_type.tsc = detach_type->tsc;
mme_ue->detach_type.nas_key_set_identifier =
detach_type->nas_key_set_identifier;
mme_ue->detach_type.switch_off = detach_type->switch_off;
mme_ue->detach_type.detach_type = detach_type->detach_type;
switch (detach_type->detach_type) switch (detach_type->detach_type)
{ {
@ -636,11 +624,12 @@ void emm_handle_detach_request(
if (!delete_session_request_needed) if (!delete_session_request_needed)
{ {
emm_handle_detach_accept(mme_ue); emm_handle_detach_accept(mme_ue, detach_request);
} }
} }
void emm_handle_detach_accept(mme_ue_t *mme_ue) void emm_handle_detach_accept(
mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request)
{ {
event_t e; event_t e;
@ -657,7 +646,8 @@ void emm_handle_detach_accept(mme_ue_t *mme_ue)
enb = enb_ue->enb; enb = enb_ue->enb;
d_assert(enb, return, "Null param"); d_assert(enb, return, "Null param");
detach_type = &mme_ue->detach_type; d_assert(detach_request, return, "Null param");
detach_type = &detach_request->detach_type;
d_assert(detach_type, return, "Null param"); d_assert(detach_type, return, "Null param");
/* reply with detach accept */ /* reply with detach accept */
@ -681,7 +671,8 @@ void emm_handle_detach_accept(mme_ue_t *mme_ue)
d_assert(rv == CORE_OK && s1apbuf, d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(emmbuf); return, "s1ap build error"); pkbuf_free(emmbuf); return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error"); d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,,
"s1ap send error");
} }
event_set(&e, MME_EVT_S1AP_UE_FROM_EMM); event_set(&e, MME_EVT_S1AP_UE_FROM_EMM);
@ -689,41 +680,31 @@ void emm_handle_detach_accept(mme_ue_t *mme_ue)
event_set_param2(&e, (c_uintptr_t)enb_ue->index); event_set_param2(&e, (c_uintptr_t)enb_ue->index);
event_set_param3(&e, (c_uintptr_t)NAS_DETACH_ACCEPT); event_set_param3(&e, (c_uintptr_t)NAS_DETACH_ACCEPT);
mme_event_send(&e); mme_event_send(&e);
#if 0
rv = s1ap_build_ue_context_release_commmand(
&s1apbuf, enb_ue, &enb_ue->s1ap.cause);
d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error");
#endif
} }
void emm_handle_delete_session_response(mme_bearer_t *bearer) void emm_handle_delete_session_response(mme_bearer_t *bearer)
{ {
mme_ue_t *mme_ue = NULL; mme_ue_t *mme_ue = NULL;
mme_enb_t *enb = NULL;
mme_sess_t *sess; mme_sess_t *sess;
enb_ue_t *enb_ue = NULL; nas_message_t *message = NULL;
d_assert(bearer, return, "Null param"); d_assert(bearer, return, "Null param");
mme_ue = bearer->mme_ue; mme_ue = bearer->mme_ue;
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; message = &mme_ue->last_emm_message;
d_assert(enb_ue, return, "Null param"); d_assert(message, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
sess = mme_sess_find_by_ebi(mme_ue, bearer->ebi); sess = mme_sess_find_by_ebi(mme_ue, bearer->ebi);
mme_sess_remove(sess); mme_sess_remove(sess);
d_info("[NAS] Delete Session Response : UE[%s] <-- EMM", mme_ue->imsi_bcd); d_info("[NAS] Delete Session Response : UE[%s] <-- EMM", mme_ue->imsi_bcd);
switch(mme_ue->last_emm_message_type) switch(message->emm.h.message_type)
{ {
case NAS_DETACH_REQUEST: case NAS_DETACH_REQUEST:
{ {
emm_handle_detach_accept(mme_ue); emm_handle_detach_accept(mme_ue,
&message->emm.detach_request_from_ue);
break; break;
} }
default: default:
@ -737,15 +718,12 @@ void emm_handle_service_request(
status_t rv; status_t rv;
pkbuf_t *s1apbuf = NULL; pkbuf_t *s1apbuf = NULL;
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
mme_enb_t *enb = NULL;
mme_sess_t *sess = NULL; mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL; mme_bearer_t *bearer = NULL;
d_assert(mme_ue, return, "Null param"); d_assert(mme_ue, return, "Null param");
enb_ue = mme_ue->enb_ue; enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param"); d_assert(enb_ue, return, "Null param");
enb = enb_ue->enb;
d_assert(enb, return, "Null param");
sess = mme_sess_first(mme_ue); sess = mme_sess_first(mme_ue);
d_assert(sess, return, "Null param"); d_assert(sess, return, "Null param");
bearer = mme_default_bearer_in_sess(sess); bearer = mme_default_bearer_in_sess(sess);
@ -754,6 +732,6 @@ void emm_handle_service_request(
rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, NULL); rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, NULL);
d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error"); d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error");
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error"); d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
} }

View File

@ -24,7 +24,8 @@ CORE_DECLARE(void) emm_handle_identity_response(
mme_ue_t *mme_ue, nas_identity_response_t *identity_response); mme_ue_t *mme_ue, nas_identity_response_t *identity_response);
CORE_DECLARE(void) emm_handle_detach_request( CORE_DECLARE(void) emm_handle_detach_request(
mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request); mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request);
CORE_DECLARE(void) emm_handle_detach_accept(mme_ue_t *mme_ue); CORE_DECLARE(void) emm_handle_detach_accept(
mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request);
CORE_DECLARE(void) emm_handle_delete_session_response(mme_bearer_t *bearer); CORE_DECLARE(void) emm_handle_delete_session_response(mme_bearer_t *bearer);
CORE_DECLARE(void) emm_handle_service_request( CORE_DECLARE(void) emm_handle_service_request(
mme_ue_t *mme_ue, nas_service_request_t *service_request); mme_ue_t *mme_ue, nas_service_request_t *service_request);

View File

@ -126,6 +126,9 @@ void emm_state_operational(fsm_t *s, event_t *e)
message = (nas_message_t *)event_get_param3(e); message = (nas_message_t *)event_get_param3(e);
d_assert(message, break, "Null param"); d_assert(message, break, "Null param");
/* Save Last Received NAS-EMM message */
memcpy(&mme_ue->last_emm_message, message, sizeof(nas_message_t));
if (message->emm.h.security_header_type if (message->emm.h.security_header_type
== NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) == NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE)
{ {
@ -134,9 +137,6 @@ void emm_state_operational(fsm_t *s, event_t *e)
break; break;
} }
/* save Last EMM Message Type in MME UE Context */
mme_ue->last_emm_message_type = message->emm.h.message_type;
switch(message->emm.h.message_type) switch(message->emm.h.message_type)
{ {
case NAS_ATTACH_REQUEST: case NAS_ATTACH_REQUEST:

View File

@ -88,6 +88,9 @@ void esm_state_operational(fsm_t *s, event_t *e)
message = (nas_message_t *)event_get_param3(e); message = (nas_message_t *)event_get_param3(e);
d_assert(message, break, "Null param"); d_assert(message, break, "Null param");
/* Save Last Received NAS-ESM message */
memcpy(&mme_ue->last_esm_message, message, sizeof(nas_message_t));
switch(message->esm.h.message_type) switch(message->esm.h.message_type)
{ {
case NAS_PDN_CONNECTIVITY_REQUEST: case NAS_PDN_CONNECTIVITY_REQUEST:

View File

@ -9,7 +9,7 @@
#include "core_hash.h" #include "core_hash.h"
#include "types.h" #include "types.h"
#include "nas_types.h" #include "nas_message.h"
#include "gtp_xact.h" #include "gtp_xact.h"
#include "mme_sm.h" #include "mme_sm.h"
@ -156,7 +156,6 @@ struct _mme_ue_t {
e_cgi_t e_cgi; e_cgi_t e_cgi;
#endif #endif
plmn_id_t visited_plmn_id; plmn_id_t visited_plmn_id;
nas_detach_type_t detach_type;
/* Security Context */ /* Security Context */
int security_context_available; int security_context_available;
@ -207,8 +206,9 @@ struct _mme_ue_t {
/* eNB UE context */ /* eNB UE context */
enb_ue_t *enb_ue; enb_ue_t *enb_ue;
/* Last Received NAS-EMM Messasge */ /* Last Received NAS Messasge */
c_uint8_t last_emm_message_type; nas_message_t last_emm_message;
nas_message_t last_esm_message;
}; };
typedef struct _mme_sess_t { typedef struct _mme_sess_t {