update trace log for S1AP/NAS

This commit is contained in:
Sukchan Lee 2018-01-22 23:14:20 +09:00
parent 17cbd61552
commit 67870af84f
11 changed files with 385 additions and 252 deletions

View File

@ -28,6 +28,8 @@ status_t emm_build_attach_accept(
d_assert(mme_ue->enb_ue, return CORE_ERROR, "Null param");
d_assert(esmbuf, return CORE_ERROR, "Null param");
d_trace(3, "[EMM] Attach accept\n");
memset(&message, 0, sizeof(message));
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
@ -59,6 +61,9 @@ status_t emm_build_attach_accept(
guti->guti.mme_gid = mme_ue->guti.mme_gid;
guti->guti.mme_code = mme_ue->guti.mme_code;
guti->guti.m_tmsi = mme_ue->guti.m_tmsi;
d_trace(3, " GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]\n",
guti->guti.mme_gid, guti->guti.mme_code, guti->guti.m_tmsi,
mme_ue->imsi_bcd);
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT;
attach_accept->emm_cause = EMM_CAUSE_CS_DOMAIN_NOT_AVAILABLE;
@ -129,6 +134,8 @@ status_t emm_build_identity_request(
message.emm.h.message_type = NAS_IDENTITY_REQUEST;
/* Request IMSI */
d_trace(3, "[EMM] Identity request\n");
d_trace(3, " Identity Type 2 : IMSI\n");
identity_request->identity_type.type = NAS_IDENTITY_TYPE_2_IMSI;
rv = nas_plain_encode(emmbuf, &message);
@ -198,6 +205,9 @@ status_t emm_build_security_mode_command(
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[EMM] Security mode command\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
memset(&message, 0, sizeof(message));
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_NEW_SECURITY_CONTEXT;
@ -270,6 +280,9 @@ status_t emm_build_detach_accept(pkbuf_t **emmbuf, mme_ue_t *mme_ue)
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
message.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
d_trace(3, "[EMM] Detach accept\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.emm.h.message_type = NAS_DETACH_ACCEPT;
@ -286,6 +299,11 @@ status_t emm_build_tau_accept(pkbuf_t **emmbuf, mme_ue_t *mme_ue)
&message.emm.tracking_area_update_accept;
int served_tai_index = 0;
d_assert(mme_ue, return CORE_ERROR,);
d_trace(3, "[EMM] Tracking area update accept\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
memset(&message, 0, sizeof(message));
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.emm.h.message_type = NAS_TRACKING_AREA_UPDATE_ACCEPT;
@ -363,6 +381,11 @@ status_t emm_build_tau_reject(pkbuf_t **emmbuf, nas_emm_cause_t emm_cause,
nas_tracking_area_update_reject_t *tau_reject =
&message.emm.tracking_area_update_reject;
d_assert(mme_ue, return CORE_ERROR,);
d_trace(3, "[EMM] Tracking area update reject\n");
d_trace(3, " IMSI[%s] Cause[%d]\n", mme_ue->imsi_bcd, emm_cause);
memset(&message, 0, sizeof(message));
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.emm.h.message_type = NAS_TRACKING_AREA_UPDATE_REJECT;
@ -382,6 +405,9 @@ status_t emm_build_service_reject(pkbuf_t **emmbuf, nas_emm_cause_t emm_cause,
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[EMM] Service reject\n");
d_trace(3, " IMSI[%s] Cause[%d]\n", mme_ue->imsi_bcd, emm_cause);
memset(&message, 0, sizeof(message));
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.emm.h.message_type = NAS_SERVICE_REJECT;

View File

@ -113,7 +113,7 @@ status_t emm_handle_attach_request(
imsi_bcd);
mme_ue_set_imsi(mme_ue, imsi_bcd);
d_trace(3, "[NAS] Attach request : IMSI[%s] --> EMM\n", imsi_bcd);
d_trace(3, " IMSI[%s]\n", imsi_bcd);
break;
}
@ -128,21 +128,17 @@ status_t emm_handle_attach_request(
guti.mme_code = nas_guti->mme_code;
guti.m_tmsi = nas_guti->m_tmsi;
d_trace(3, "[NAS] Attach request : GUTI[G:%d,C:%d,M_TMSI:0x%x]-"
"IMSI:[%s] --> EMM\n",
d_trace(3, " GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI[%s]\n",
guti.mme_gid,
guti.mme_code,
guti.m_tmsi,
MME_UE_HAVE_IMSI(mme_ue)
? mme_ue->imsi_bcd : "Unknown");
break;
}
default:
{
d_warn("Not implemented(type:%d)",
eps_mobile_identity->imsi.type);
d_warn("Not implemented[%d]", eps_mobile_identity->imsi.type);
break;
}
}
@ -204,13 +200,13 @@ status_t emm_handle_attach_complete(
NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT;
network_daylight_saving_time->length = 1;
d_trace(3, "[NAS] EMM information : UE[%s] <-- EMM\n",
mme_ue->imsi_bcd);
rv = nas_security_encode(&emmbuf, mme_ue, &message);
d_assert(rv == CORE_OK && emmbuf, return CORE_ERROR, "emm build error");
d_assert(nas_send_to_downlink_nas_transport(mme_ue, emmbuf) == CORE_OK,,);
d_trace(3, "[EMM] EMM information\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
return CORE_OK;
}
@ -237,11 +233,11 @@ status_t emm_handle_identity_response(
mme_ue_set_imsi(mme_ue, imsi_bcd);
d_assert(mme_ue->imsi_len, return CORE_ERROR,
"Can't get IMSI(len:%d\n", mme_ue->imsi_len);
"Can't get IMSI : [LEN:%d]\n", mme_ue->imsi_len);
}
else
{
d_warn("Not supported Identity type(%d)", mobile_identity->imsi.type);
d_warn("Not supported Identity type[%d]", mobile_identity->imsi.type);
}
return CORE_OK;
@ -258,24 +254,24 @@ status_t emm_handle_detach_request(
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
d_trace(3, "[NAS] Detach request[0x%x] : UE_IMSI[%s] --> EMM\n",
detach_request->detach_type, mme_ue->imsi_bcd);
switch (detach_request->detach_type.detach_type)
{
/* 0 0 1 : EPS detach */
case NAS_DETACH_TYPE_FROM_UE_EPS_DETACH:
d_trace(3, " EPS Detach\n");
break;
/* 0 1 0 : IMSI detach */
case NAS_DETACH_TYPE_FROM_UE_IMSI_DETACH:
d_trace(3, " IMSI Detach\n");
break;
case 6: /* 1 1 0 : reserved */
case 7: /* 1 1 1 : reserved */
d_warn("[NAS] (Unknown) Detach request : UE_IMSI[%s] --> EMM",
mme_ue->imsi_bcd);
d_warn("Unknown Detach type[%d]",
detach_request->detach_type.detach_type);
break;
/* 0 1 1 : combined EPS/IMSI detach */
case NAS_DETACH_TYPE_FROM_UE_COMBINED_EPS_IMSI_DETACH:
d_trace(3, " Combined EPS/IMSI Detach\n");
default: /* all other values */
break;
}
@ -427,8 +423,7 @@ status_t emm_handle_tau_request(
guti.mme_code = nas_guti->mme_code;
guti.m_tmsi = nas_guti->m_tmsi;
d_trace(3, "[NAS] TAU request : GUTI[G:%d,C:%d,M_TMSI:0x%x]-"
"IMSI:[%s] --> EMM\n",
d_trace(3, " GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]\n",
guti.mme_gid,
guti.mme_code,
guti.m_tmsi,
@ -438,7 +433,7 @@ status_t emm_handle_tau_request(
}
default:
{
d_warn("Not implemented(type:%d)",
d_warn("Not implemented[%d]",
eps_mobile_identity->imsi.type);
return CORE_OK;

View File

@ -84,6 +84,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
if (message->emm.h.security_header_type
== NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE)
{
d_trace(3, "[EMM] Service request\n");
rv = emm_handle_service_request(
mme_ue, &message->emm.service_request);
if (rv != CORE_OK)
@ -106,7 +107,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
if (!SECURITY_CONTEXT_IS_VALID(mme_ue))
{
d_warn("No Security Context");
d_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
rv = nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
d_assert(rv == CORE_OK, return,
@ -119,7 +120,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK,,
"s1ap_send_ue_context_release_command() failed");
"s1ap_send_ue_context_release_command() failed");
return;
}
@ -133,6 +134,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
{
case NAS_IDENTITY_RESPONSE:
{
d_trace(3, "[EMM] Identity response\n");
rv = emm_handle_identity_response(mme_ue,
&message->emm.identity_response);
if (rv != CORE_OK)
@ -150,10 +152,12 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
return;
}
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
break;
}
case NAS_ATTACH_REQUEST:
{
d_trace(3, "[EMM] Attach request\n", mme_ue->imsi_bcd);
rv = emm_handle_attach_request(
mme_ue, &message->emm.attach_request);
if (rv != CORE_OK)
@ -163,11 +167,11 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
FSM_TRAN(s, emm_state_exception);
return;
}
break;
}
case NAS_TRACKING_AREA_UPDATE_REQUEST:
{
d_trace(3, "[EMM] Tracking area update request\n");
rv = emm_handle_tau_request(
mme_ue, &message->emm.tracking_area_update_request);
if (rv != CORE_OK)
@ -182,8 +186,8 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
}
case NAS_TRACKING_AREA_UPDATE_COMPLETE:
{
d_trace(3, "[NAS] Tracking area update complete : "
"UE[%s] --> EMM\n", mme_ue->imsi_bcd);
d_trace(3, "[EMM] Tracking area update complete\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param");
@ -196,8 +200,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
}
case NAS_EMM_STATUS:
{
d_warn("[NAS] EMM STATUS [IMSI:%s,Cause:%d] "
"in emm_state_attached",
d_warn("[EMM] EMM STATUS : IMSI[%s] Cause[%d]",
mme_ue->imsi_bcd,
message->emm.emm_status.emm_cause);
FSM_TRAN(s, &emm_state_exception);
@ -205,6 +208,8 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
}
case NAS_DETACH_REQUEST:
{
d_trace(3, "[EMM] Detach request\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
FSM_TRAN(s, &emm_state_detached);
@ -212,8 +217,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
}
default:
{
d_warn("Unknown message(type:%d)",
message->emm.h.message_type);
d_warn("Unknown message[%d]", message->emm.h.message_type);
return;
}
}
@ -224,7 +228,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
if (mme_ue->max_paging_retry >= MAX_NUM_OF_PAGING)
{
/* Paging failed */
d_warn("Paging to UE(%s) failed. Stop paging",
d_warn("[EMM] Paging to IMSI[%s] failed. Stop paging",
mme_ue->imsi_bcd);
if (mme_ue->last_paging_msg)
{
@ -243,7 +247,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
}
default:
{
d_error("Unknown event %s", mme_event_get_name(e));
d_error("Unknown event[%s]", mme_event_get_name(e));
return;
}
}
@ -263,8 +267,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
{
rv = nas_send_emm_to_esm(mme_ue,
&mme_ue->pdn_connectivity_request);
d_assert(rv == CORE_OK,,
"nas_send_emm_to_esm() failed");
d_assert(rv == CORE_OK,, "nas_send_emm_to_esm() failed");
FSM_TRAN(s, &emm_state_initial_context_setup);
}
else
@ -288,8 +291,7 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,,
"nas_send_tau_accept() failed");
d_assert(rv == CORE_OK,, "nas_send_tau_accept() failed");
FSM_TRAN(&mme_ue->sm, &emm_state_attached);
}
else
@ -297,23 +299,21 @@ static void emm_state_detached_attached(fsm_t *s, event_t *e)
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
mme_s6a_send_air(mme_ue, NULL);
FSM_TRAN(&mme_ue->sm,
&emm_state_authentication);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
d_warn("No PDN Connection");
d_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
rv = nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
d_assert(rv == CORE_OK,,
"nas_send_tau_reject() failed");
d_assert(rv == CORE_OK,, "nas_send_tau_reject() failed");
FSM_TRAN(s, emm_state_exception);
}
}
break;
}
default:
d_assert(0,, "Invalid EPS-Type[%d]", mme_ue->nas_eps.type);
d_assert(0,, "Invalid NAS-EPS[%d]", mme_ue->nas_eps.type);
break;
}
}
@ -356,6 +356,9 @@ void emm_state_authentication(fsm_t *s, event_t *e)
&authentication_response->
authentication_response_parameter;
d_trace(3, "[EMM] Authentication response\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
if (authentication_response_parameter->length !=
mme_ue->xres_len ||
memcmp(authentication_response_parameter->res,
@ -363,9 +366,6 @@ void emm_state_authentication(fsm_t *s, event_t *e)
{
status_t rv;
d_warn("[NAS] Authentication failure [IMSI:%s]",
mme_ue->imsi_bcd);
rv = nas_send_authentication_reject(mme_ue);
d_assert(rv == CORE_OK,, "nas send error");
FSM_TRAN(&mme_ue->sm, &emm_state_exception);
@ -385,13 +385,15 @@ void emm_state_authentication(fsm_t *s, event_t *e)
&authentication_failure->
authentication_failure_parameter;
d_trace(3, "[EMM] Authentication failure\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
mme_s6a_send_air(mme_ue, authentication_failure_parameter);
break;
}
case NAS_EMM_STATUS:
{
d_warn("[NAS] EMM STATUS [IMSI:%s,Cause:%d] "
"in emm_state_authentication",
d_warn("[EMM] EMM STATUS : IMSI[%s] Cause[%d]",
mme_ue->imsi_bcd,
message->emm.emm_status.emm_cause);
FSM_TRAN(s, &emm_state_exception);
@ -399,8 +401,7 @@ void emm_state_authentication(fsm_t *s, event_t *e)
}
default:
{
d_warn("Unknown message(type:%d)",
message->emm.h.message_type);
d_warn("Unknown message[%d]", message->emm.h.message_type);
break;
}
}
@ -408,7 +409,7 @@ void emm_state_authentication(fsm_t *s, event_t *e)
}
default:
{
d_error("Unknown event %s", mme_event_get_name(e));
d_error("Unknown event[%s]", mme_event_get_name(e));
break;
}
}
@ -439,8 +440,6 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
d_assert(rv == CORE_OK && emmbuf, break, "emm send error");
d_trace(3, "[NAS] Security mode command : UE[%s] <-- EMM\n",
mme_ue->imsi_bcd);
break;
}
case FSM_EXIT_SIG:
@ -456,8 +455,8 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
{
case NAS_SECURITY_MODE_COMPLETE:
{
d_trace(3, "[NAS] Security mode complete : "
"UE[%s] --> EMM\n", mme_ue->imsi_bcd);
d_trace(3, "[EMM] Security mode complete\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
/* Update Kenb */
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
@ -480,22 +479,21 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
FSM_TRAN(s, &emm_state_attached);
}
else
d_assert(0,, "Invalid EPS-Type[%d]",
d_assert(0,, "Invalid NAS_EPS[%d]",
mme_ue->nas_eps.type);
break;
}
case NAS_SECURITY_MODE_REJECT:
{
d_warn("[NAS] Security mode reject [IMSI:%s,Cause:%d] "
"UE[%s] --> EMM\n", mme_ue->imsi_bcd,
d_warn("[EMM] Security mode reject : IMSI[%s] Cause[%d]",
mme_ue->imsi_bcd,
message->emm.security_mode_reject.emm_cause);
FSM_TRAN(s, &emm_state_exception);
break;
}
case NAS_EMM_STATUS:
{
d_warn("[NAS] EMM STATUS [IMSI:%s,Cause:%d] "
"in emm_state_security_mode",
d_warn("[EMM] EMM STATUS : IMSI[%s] Cause[%d]",
mme_ue->imsi_bcd,
message->emm.emm_status.emm_cause);
FSM_TRAN(s, &emm_state_exception);
@ -503,8 +501,7 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
}
default:
{
d_warn("Unknown message(type:%d)",
message->emm.h.message_type);
d_warn("Unknown message[%d]", message->emm.h.message_type);
break;
}
}
@ -512,7 +509,7 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
}
default:
{
d_error("Unknown event %s", mme_event_get_name(e));
d_error("Unknown event[%s]", mme_event_get_name(e));
break;
}
}
@ -550,8 +547,8 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
{
case NAS_ATTACH_COMPLETE:
{
d_trace(3, "[NAS] Attach complete : UE[%s] --> EMM\n",
mme_ue->imsi_bcd);
d_trace(3, "[EMM] Attach complete\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
rv = emm_handle_attach_complete(
mme_ue, &message->emm.attach_complete);
if (rv != CORE_OK)
@ -566,8 +563,7 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
}
case NAS_EMM_STATUS:
{
d_warn("[NAS] EMM STATUS [IMSI:%s,Cause:%d] "
"in emm_state_initial_context_setup",
d_warn("[EMM] EMM STATUS : IMSI[%s] Cause[%d]",
mme_ue->imsi_bcd,
message->emm.emm_status.emm_cause);
FSM_TRAN(s, &emm_state_exception);
@ -575,7 +571,7 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
}
default:
{
d_warn("Unknown message(type:%d)",
d_warn("Unknown message[%d]",
message->emm.h.message_type);
break;
}
@ -584,7 +580,7 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
}
default:
{
d_error("Unknown event %s", mme_event_get_name(e));
d_error("Unknown event[%s]", mme_event_get_name(e));
break;
}
}
@ -606,7 +602,7 @@ void emm_state_exception(fsm_t *s, event_t *e)
}
default:
{
d_error("Unknown event %s", mme_event_get_name(e));
d_error("Unknown event[%s]", mme_event_get_name(e));
break;
}
}

View File

@ -21,6 +21,10 @@ status_t esm_build_pdn_connectivity_reject(
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[ESM] PDN connectivity reject\n");
d_trace(3, " IMSI[%s] PTI[%d] Cause[%d]\n",
mme_ue->imsi_bcd, sess->pti, esm_cause);
memset(&message, 0, sizeof(message));
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
@ -61,6 +65,10 @@ status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer)
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[ESM] ESM information request\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
memset(&message, 0, sizeof(message));
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
@ -109,6 +117,10 @@ status_t esm_build_activate_default_bearer_context_request(
d_assert(mme_bearer_next(bearer) == NULL,
return CORE_ERROR, "there is dedicated bearer");
d_trace(3, "[ESM] Activate default bearer context request\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
memset(&message, 0, sizeof(message));
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
@ -131,17 +143,20 @@ status_t esm_build_activate_default_bearer_context_request(
access_point_name->length = strlen(pdn->apn);
core_cpystrn(access_point_name->apn, pdn->apn,
c_min(access_point_name->length, MAX_APN_LEN) + 1);
d_trace(3, " APN[%s]\n", pdn->apn);
pdn_address->pdn_type = pdn->paa.pdn_type;
if (pdn_address->pdn_type == GTP_PDN_TYPE_IPV4)
{
pdn_address->addr = pdn->paa.addr;
pdn_address->length = NAS_PDN_ADDRESS_IPV4_LEN;
d_trace(3, " IPv4\n");
}
else if (pdn_address->pdn_type == GTP_PDN_TYPE_IPV6)
{
memcpy(pdn_address->addr6, pdn->paa.addr6+(IPV6_LEN>>1), IPV6_LEN>>1);
pdn_address->length = NAS_PDN_ADDRESS_IPV6_LEN;
d_trace(3, " IPv6\n");
}
else if (pdn_address->pdn_type == GTP_PDN_TYPE_IPV4V6)
{
@ -149,6 +164,7 @@ status_t esm_build_activate_default_bearer_context_request(
memcpy(pdn_address->both.addr6,
pdn->paa.both.addr6+(IPV6_LEN>>1), IPV6_LEN>>1);
pdn_address->length = NAS_PDN_ADDRESS_IPV4V6_LEN;
d_trace(3, " IPv4v6\n");
}
else
d_assert(0, return CORE_ERROR,
@ -208,6 +224,10 @@ status_t esm_build_activate_dedicated_bearer_context_request(
linked_bearer = mme_linked_bearer(bearer);
d_assert(linked_bearer, return CORE_ERROR, "Null param");
d_trace(3, "[ESM] Activate dedicated bearer context request\n");
d_trace(3, " IMSI[%s] EBI[%d] Linked-EBI[%d]\n",
mme_ue->imsi_bcd, bearer->ebi, linked_bearer->ebi);
memset(&message, 0, sizeof(message));
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
@ -255,6 +275,10 @@ status_t esm_build_modify_bearer_context_request(
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[ESM] Modify bearer context request\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
memset(&message, 0, sizeof(message));
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
@ -306,6 +330,11 @@ status_t esm_build_deactivate_bearer_context_request(
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[ESM] Deactivate bearer context request\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
d_trace(3, " Cause[%d]\n", esm_cause);
memset(&message, 0, sizeof(message));
message.h.security_header_type =
NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;

View File

@ -42,6 +42,8 @@ status_t esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
&pdn_connectivity_request->esm_information_transfer_flag;
security_protected_required =
esm_information_transfer_flag->security_protected_required;
d_trace(3, " EIT(ESM information transfer)[%d]\n",
security_protected_required);
}
if (pdn_connectivity_request->presencemask &
@ -85,6 +87,7 @@ status_t esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
if (sess->pdn)
{
d_trace(3, " APN[%s]\n", sess->pdn->apn);
rv = mme_gtp_send_create_session_request(sess);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp send failed");
}
@ -127,6 +130,7 @@ status_t esm_handle_information_response(mme_sess_t *sess,
if (sess->pdn)
{
d_trace(3, " APN[%s]\n", sess->pdn->apn);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = nas_send_attach_accept(mme_ue);

View File

@ -68,6 +68,9 @@ void esm_state_inactive(fsm_t *s, event_t *e)
{
case NAS_PDN_CONNECTIVITY_REQUEST:
{
d_trace(3, "[ESM] PDN Connectivity request\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request);
if (rv != CORE_OK)
@ -79,9 +82,9 @@ void esm_state_inactive(fsm_t *s, event_t *e)
}
case NAS_ESM_INFORMATION_RESPONSE:
{
d_trace(3, "[NAS] ESM information response : "
"UE[%s] --> ESM[PTI:%d]\n",
mme_ue->imsi_bcd, sess->pti);
d_trace(3, "[ESM] ESM information response\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_information_response(
sess, &message->esm.esm_information_response);
if (rv != CORE_OK)
@ -93,10 +96,10 @@ void esm_state_inactive(fsm_t *s, event_t *e)
}
case NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT:
{
d_trace(3, "[NAS] Activate default EPS bearer "
"context accept : UE[%s] --> ESM[EBI:%d]\n",
mme_ue->imsi_bcd, bearer->ebi);
d_trace(3, "[ESM] Activate default EPS bearer "
"context accept\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
if (MME_HAVE_ENB_S1U_PATH(bearer))
{
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
@ -109,9 +112,10 @@ void esm_state_inactive(fsm_t *s, event_t *e)
}
case NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT:
{
d_trace(3, "[NAS] Activate dedicated EPS bearer "
"context accept : UE[%s] --> ESM[EBI:%d]\n",
mme_ue->imsi_bcd, bearer->ebi);
d_trace(3, "[ESM] Activate dedicated EPS bearer "
"context accept\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
if (MME_HAVE_ENB_S1U_PATH(bearer))
{
@ -178,9 +182,9 @@ void esm_state_active(fsm_t *s, event_t *e)
{
case NAS_PDN_CONNECTIVITY_REQUEST:
{
d_trace(3, "[NAS] PDN connectivity request : "
"UE[%s] --> ESM[EBI:%d]\n",
mme_ue->imsi_bcd, bearer->ebi);
d_trace(3, "[ESM] PDN Connectivity request\n");
d_trace(3, " IMSI[%s] PTI[%d] EBI[%d]\n",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request);
if (rv != CORE_OK)

View File

@ -1486,10 +1486,16 @@ status_t mme_context_setup_trace_module()
d_trace_level(&_emm_sm, nas);
extern int _esm_sm;
d_trace_level(&_esm_sm, nas);
extern int _emm_build;
d_trace_level(&_emm_build, nas);
extern int _esm_build;
d_trace_level(&_esm_build, nas);
extern int _emm_handler;
d_trace_level(&_emm_handler, nas);
extern int _esm_handler;
d_trace_level(&_esm_handler, nas);
extern int _nas_path;
d_trace_level(&_nas_path, nas);
extern int _nas_decoder;
d_trace_level(&_nas_decoder, nas);
extern int _nas_encoder;

View File

@ -108,6 +108,9 @@ status_t nas_send_attach_reject(mme_ue_t *mme_ue,
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[EMM] Attach reject\n");
d_trace(3, " IMSI[%s] Cause[%d]\n", mme_ue->imsi_bcd, emm_cause);
sess = mme_sess_first(mme_ue);
if (sess)
{
@ -153,6 +156,9 @@ status_t nas_send_authentication_request(
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_assert(e_utran_vector, return CORE_ERROR, "Null param");
d_trace(3, "[EMM] Authentication request\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
rv = emm_build_authentication_request(&emmbuf, e_utran_vector);
d_assert(rv == CORE_OK && emmbuf, return CORE_ERROR,
"nas_build_detach_accept failed");
@ -170,6 +176,9 @@ status_t nas_send_authentication_reject(mme_ue_t *mme_ue)
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_trace(3, "[EMM] Authentication reject\n");
d_trace(3, " IMSI[%s]\n", mme_ue->imsi_bcd);
rv = emm_build_authentication_reject(&emmbuf);
d_assert(rv == CORE_OK && emmbuf, return CORE_ERROR,
"nas_build_detach_accept failed");
@ -295,9 +304,6 @@ status_t nas_send_activate_dedicated_bearer_context_request(
rv = esm_build_activate_dedicated_bearer_context_request(&esmbuf, bearer);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
d_trace(3, "[NAS] Activate dedicated bearer context request : "
"EMM <-- ESM\n");
rv = s1ap_build_e_rab_setup_request(&s1apbuf, bearer, esmbuf);
d_assert(rv == CORE_OK && s1apbuf,
pkbuf_free(esmbuf); return CORE_ERROR, "s1ap build error");
@ -323,8 +329,6 @@ status_t nas_send_modify_bearer_context_request(
&esmbuf, bearer, qos_presence, tft_presence);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
d_trace(3, "[NAS] Modify bearer context request : EMM <-- ESM\n");
if (qos_presence == 1)
{
rv = s1ap_build_e_rab_modify_request(&s1apbuf, bearer, esmbuf);
@ -357,8 +361,6 @@ status_t nas_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
&esmbuf, bearer, ESM_CAUSE_REGULAR_DEACTIVATION);
d_assert(rv == CORE_OK && esmbuf, return CORE_ERROR, "esm build error");
d_trace(3, "[NAS] Deactivate bearer context request : EMM <-- ESM\n");
rv = s1ap_build_e_rab_release_command(&s1apbuf, bearer, esmbuf,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release);
d_assert(rv == CORE_OK && s1apbuf,

View File

@ -39,6 +39,9 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
s1ap_buffer_to_OCTET_STRING(
&served_gummei->plmn_id[j], PLMN_ID_LEN, plmnIdentity);
ASN_SEQUENCE_ADD(&servedGUMMEI->servedPLMNs, plmnIdentity);
d_trace(3, " PLMN_ID[MCC:%d MNC:%d]\n",
plmn_id_mcc(&served_gummei->plmn_id[j]),
plmn_id_mnc(&served_gummei->plmn_id[j]));
}
for (j = 0; j < served_gummei->num_of_mme_gid; j++)
@ -48,6 +51,7 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
s1ap_uint16_to_OCTET_STRING(
served_gummei->mme_gid[j], mmeGroupId);
ASN_SEQUENCE_ADD(&servedGUMMEI->servedGroupIDs, mmeGroupId);
d_trace(3, " MME Group[%d]\n", served_gummei->mme_gid[j]);
}
for (j = 0; j < served_gummei->num_of_mme_code; j++)
@ -57,6 +61,7 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
s1ap_uint8_to_OCTET_STRING(
served_gummei->mme_code[j], mmeCode);
ASN_SEQUENCE_ADD(&servedGUMMEI->servedMMECs, mmeCode);
d_trace(3, " MME Code[%d]\n", served_gummei->mme_code[j]);
}
ASN_SEQUENCE_ADD(&ies->servedGUMMEIs, servedGUMMEI);
}
@ -111,8 +116,6 @@ status_t s1ap_build_setup_failure(
status_t s1ap_build_downlink_nas_transport(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, pkbuf_t *emmbuf)
{
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_DownlinkNASTransport_IEs_t *ies =
@ -123,6 +126,10 @@ status_t s1ap_build_downlink_nas_transport(
d_assert(enb_ue, return CORE_ERROR, "Null param");
memset(&message, 0, sizeof(s1ap_message_t));
d_trace(3, "[MME] Downlink NAS transport\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
ies->eNB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id;
@ -140,11 +147,6 @@ status_t s1ap_build_downlink_nas_transport(
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
pkbuf_free(emmbuf);
d_trace(3, "[S1AP] downlinkNASTransport : "
"UE[eNB-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
return CORE_OK;
}
@ -152,7 +154,6 @@ status_t s1ap_build_initial_context_setup_request(
pkbuf_t **s1apbuf, mme_ue_t *mme_ue, pkbuf_t *emmbuf)
{
status_t rv;
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
@ -172,6 +173,10 @@ status_t s1ap_build_initial_context_setup_request(
subscription_data = &mme_ue->subscription_data;
d_assert(subscription_data, return CORE_ERROR, "Null param");
d_trace(3, "[MME] Initial context setup request\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
@ -195,6 +200,8 @@ status_t s1ap_build_initial_context_setup_request(
e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci;
d_trace(3, " EBI[%d] QCI[%d]\n", bearer->ebi, bearer->qos.qci);
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
@ -297,11 +304,6 @@ status_t s1ap_build_initial_context_setup_request(
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] Initial Context Setup Request : "
"UE[eNB-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
if (emmbuf && emmbuf->len)
{
pkbuf_free(emmbuf);
@ -313,8 +315,6 @@ status_t s1ap_build_initial_context_setup_request(
status_t s1ap_build_e_rab_setup_request(
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *esmbuf)
{
char buf[CORE_ADDRSTRLEN];
status_t rv;
int encoded;
s1ap_message_t message;
@ -333,6 +333,10 @@ status_t s1ap_build_e_rab_setup_request(
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
d_trace(3, "[MME] E-RAB setup request\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
@ -343,6 +347,8 @@ status_t s1ap_build_e_rab_setup_request(
e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci;
d_trace(3, " EBI[%d] QCI[%d]\n", bearer->ebi, bearer->qos.qci);
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
@ -395,11 +401,6 @@ status_t s1ap_build_e_rab_setup_request(
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] E-RAB Setup Request : "
"UE[eNB-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
pkbuf_free(esmbuf);
return CORE_OK;
@ -408,8 +409,6 @@ status_t s1ap_build_e_rab_setup_request(
status_t s1ap_build_e_rab_modify_request(
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *esmbuf)
{
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_E_RABModifyRequestIEs_t *ies = &message.s1ap_E_RABModifyRequestIEs;
@ -427,6 +426,10 @@ status_t s1ap_build_e_rab_modify_request(
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
d_trace(3, "[MME] E-RAB modify request\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
@ -437,6 +440,8 @@ status_t s1ap_build_e_rab_modify_request(
e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABLevelQoSParameters.qCI = bearer->qos.qci;
d_trace(3, " EBI[%d] QCI[%d]\n", bearer->ebi, bearer->qos.qci);
e_rab->e_RABLevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level;
e_rab->e_RABLevelQoSParameters.allocationRetentionPriority.
@ -484,11 +489,6 @@ status_t s1ap_build_e_rab_modify_request(
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] E-RAB Modify Request : "
"UE[eNB-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
pkbuf_free(esmbuf);
return CORE_OK;
@ -498,8 +498,6 @@ status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
mme_bearer_t *bearer, pkbuf_t *esmbuf,
S1ap_Cause_PR group, long cause)
{
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_E_RABReleaseCommandIEs_t *ies = &message.s1ap_E_RABReleaseCommandIEs;
@ -519,6 +517,10 @@ status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
subscription_data = &mme_ue->subscription_data;
d_assert(subscription_data, return CORE_ERROR, "Null param");
d_trace(3, "[MME] E-RAB release request\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
@ -538,6 +540,8 @@ status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
e_rab->cause.present = group;
e_rab->cause.choice.radioNetwork = cause;
d_trace(3, " EBI[%d] Gruop[%d] Cause[%d]\n", bearer->ebi, group, cause);
ies->presenceMask |= S1AP_E_RABRELEASECOMMANDIES_NAS_PDU_PRESENT;
nasPdu = &ies->nas_pdu;
nasPdu->size = esmbuf->len;
@ -554,11 +558,6 @@ status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] E-RAB Release Command : "
"UE[eNB-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
pkbuf_free(esmbuf);
return CORE_OK;
@ -567,8 +566,6 @@ status_t s1ap_build_e_rab_release_command(pkbuf_t **s1apbuf,
status_t s1ap_build_ue_context_release_command(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_PR group, long cause)
{
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_UEContextReleaseCommand_IEs_t *ies =
@ -610,12 +607,6 @@ status_t s1ap_build_ue_context_release_command(
d_assert(s1apbuf && encoded >= 0, return CORE_ERROR,);
d_trace(3, "[S1AP] UE Context Release Command[%d:%d] : "
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
ies->cause.present, ies->cause.choice.radioNetwork,
enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
return CORE_OK;
}
@ -633,6 +624,8 @@ status_t s1ap_build_paging(pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
memset(&message, 0, sizeof(s1ap_message_t));
d_trace(3, "[MME] Paging\n");
/* Set UE Identity Index value : IMSI mod 4096 */
ies->ueIdentityIndexValue.size = 2;
ies->ueIdentityIndexValue.buf =
@ -658,6 +651,9 @@ status_t s1ap_build_paging(pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
s1ap_uint32_to_OCTET_STRING(mme_ue->guti.m_tmsi,
&ies->uePagingID.choice.s_TMSI.m_TMSI);
d_trace(3, " MME_CODE[%d] M_TMSI[0x%x]\n",
mme_ue->guti.mme_code, mme_ue->guti.m_tmsi);
/* FIXME : fixed to ps */
ies->cnDomain = S1ap_CNDomain_ps;
@ -677,15 +673,11 @@ status_t s1ap_build_paging(pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
d_assert(s1apbuf && encoded >= 0, return CORE_ERROR,);
d_trace(3, "[S1AP] Paging to UE[m_tmsi:0x%x]\n", mme_ue->guti.m_tmsi);
return CORE_OK;
}
status_t s1ap_build_path_switch_ack(pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
{
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_PathSwitchRequestAcknowledgeIEs_t *ies =
@ -696,6 +688,10 @@ status_t s1ap_build_path_switch_ack(pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
d_trace(3, "[MME] Path switch acknowledge\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
@ -718,11 +714,6 @@ status_t s1ap_build_path_switch_ack(pkbuf_t **s1apbuf, mme_ue_t *mme_ue)
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] Path Switch Ack : "
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb_ue->enb->addr, buf), enb_ue->enb->enb_id);
return CORE_OK;
}
@ -737,6 +728,11 @@ status_t s1ap_build_path_switch_failure(pkbuf_t **s1apbuf,
memset(&message, 0, sizeof(s1ap_message_t));
d_trace(3, "[MME] Path switch failure\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue_s1ap_id, mme_ue_s1ap_id);
d_trace(3, " Group[%d] Cause[%d]\n", group, cause);
ies->mme_ue_s1ap_id = mme_ue_s1ap_id;
ies->eNB_UE_S1AP_ID = enb_ue_s1ap_id;
ies->cause.present = group;
@ -750,17 +746,12 @@ status_t s1ap_build_path_switch_failure(pkbuf_t **s1apbuf,
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] PathSwitchFailure : "
"UE[eNB-UE-S1AP-ID(%d), mME-UE-S1AP-ID(%d)]",
enb_ue_s1ap_id, mme_ue_s1ap_id);
return CORE_OK;
}
status_t s1ap_build_handover_command(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
{
status_t rv;
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
@ -774,12 +765,17 @@ status_t s1ap_build_handover_command(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
d_assert(source_ue, return CORE_ERROR, "Null param");
mme_ue = source_ue->mme_ue;
d_trace(3, "[MME] Handover command\n");
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = source_ue->mme_ue_s1ap_id;
ies->eNB_UE_S1AP_ID = source_ue->enb_ue_s1ap_id;
ies->handoverType = source_ue->handover_type;
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
sess = mme_sess_first(mme_ue);
while(sess)
{
@ -852,19 +848,12 @@ status_t s1ap_build_handover_command(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] Handover Command : ",
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
source_ue->mme_ue_s1ap_id,
CORE_ADDR(source_ue->enb->addr, buf), source_ue->enb->enb_id);
return CORE_OK;
}
status_t s1ap_build_handover_preparation_failure(
pkbuf_t **s1apbuf, enb_ue_t *source_ue, S1ap_Cause_t *cause)
{
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_HandoverPreparationFailureIEs_t *ies =
@ -876,11 +865,18 @@ status_t s1ap_build_handover_preparation_failure(
memset(&message, 0, sizeof(s1ap_message_t));
d_trace(3, "[MME] Handover preparation failure\n");
ies->mme_ue_s1ap_id = source_ue->mme_ue_s1ap_id;
ies->eNB_UE_S1AP_ID = source_ue->enb_ue_s1ap_id;
ies->cause.present = cause->present;
ies->cause.choice.radioNetwork = cause->choice.radioNetwork;
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
d_trace(3, " Group[%d] Cause[%d]\n",
cause->present, cause->choice.radioNetwork);
message.procedureCode = S1ap_ProcedureCode_id_HandoverPreparation;
message.direction = S1AP_PDU_PR_unsuccessfulOutcome;
@ -889,11 +885,6 @@ status_t s1ap_build_handover_preparation_failure(
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] Handover Preparation Failure : ",
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
source_ue->mme_ue_s1ap_id,
CORE_ADDR(source_ue->enb->addr, buf), source_ue->enb->enb_id);
return CORE_OK;
}
@ -902,7 +893,6 @@ status_t s1ap_build_handover_request(
S1ap_HandoverRequiredIEs_t *required)
{
status_t rv;
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
@ -1030,18 +1020,11 @@ status_t s1ap_build_handover_request(
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] Handover Request : ",
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
target_ue->mme_ue_s1ap_id,
CORE_ADDR(target_ue->enb->addr, buf), target_ue->enb->enb_id);
return CORE_OK;
}
status_t s1ap_build_handover_cancel_ack(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
{
char buf[CORE_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_HandoverCancelAcknowledgeIEs_t *ies =
@ -1049,11 +1032,16 @@ status_t s1ap_build_handover_cancel_ack(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
d_assert(source_ue, return CORE_ERROR, "Null param");
d_trace(3, "[MME] Handover cancel acknowledge\n");
memset(&message, 0, sizeof(s1ap_message_t));
ies->mme_ue_s1ap_id = source_ue->mme_ue_s1ap_id;
ies->eNB_UE_S1AP_ID = source_ue->enb_ue_s1ap_id;
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
message.procedureCode = S1ap_ProcedureCode_id_HandoverCancel;
message.direction = S1AP_PDU_PR_successfulOutcome;
@ -1062,18 +1050,12 @@ status_t s1ap_build_handover_cancel_ack(pkbuf_t **s1apbuf, enb_ue_t *source_ue)
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] Handover Cancel Ack : ",
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
source_ue->mme_ue_s1ap_id,
CORE_ADDR(source_ue->enb->addr, buf), source_ue->enb->enb_id);
return CORE_OK;
}
status_t s1ap_build_mme_status_transfer(pkbuf_t **s1apbuf,
enb_ue_t *target_ue, S1ap_ENBStatusTransferIEs_t *enb_ies)
{
char buf[CORE_ADDRSTRLEN];
int i;
int encoded;
@ -1082,12 +1064,17 @@ status_t s1ap_build_mme_status_transfer(pkbuf_t **s1apbuf,
d_assert(target_ue, return CORE_ERROR, "Null param");
d_assert(enb_ies, return CORE_ERROR, "Null param");
d_trace(3, "[MME] MME status transfer\n");
memset(&message, 0, sizeof(s1ap_message_t));
mme_ies->mme_ue_s1ap_id = target_ue->mme_ue_s1ap_id;
mme_ies->eNB_UE_S1AP_ID = target_ue->enb_ue_s1ap_id;
d_trace(3, " Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
for (i = 0; i < enb_ies->eNB_StatusTransfer_TransparentContainer.
bearers_SubjectToStatusTransferList.list.count; i++)
{
@ -1114,10 +1101,5 @@ status_t s1ap_build_mme_status_transfer(pkbuf_t **s1apbuf,
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_trace(3, "[S1AP] MME Status Transfer : ",
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
target_ue->mme_ue_s1ap_id,
CORE_ADDR(target_ue->enb->addr, buf), target_ue->enb->enb_id);
return CORE_OK;
}

View File

@ -32,7 +32,10 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_S1SetupRequestIEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] S1-Setup request\n");
s1ap_ENB_ID_to_uint32(&ies->global_ENB_ID.eNB_ID, &enb_id);
d_trace(3, " IP[%s] ENB_ID[%d]\n", CORE_ADDR(enb->addr, buf), enb_id);
/* Parse Supported TA */
enb->num_of_supported_ta_list = 0;
@ -55,10 +58,17 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
enb->supported_ta_list[enb->num_of_supported_ta_list].tac =
ntohs(enb->supported_ta_list
[enb->num_of_supported_ta_list].tac);
d_trace(3, " TAC[%d]\n",
enb->supported_ta_list[enb->num_of_supported_ta_list].tac);
memcpy(&enb->supported_ta_list
[enb->num_of_supported_ta_list].plmn_id,
pLMNidentity->buf, sizeof(plmn_id_t));
d_trace(3, " PLMN_ID[MCC:%d MNC:%d]\n",
plmn_id_mcc(&enb->supported_ta_list
[enb->num_of_supported_ta_list].plmn_id),
plmn_id_mnc(&enb->supported_ta_list
[enb->num_of_supported_ta_list].plmn_id));
enb->num_of_supported_ta_list++;
}
}
@ -69,8 +79,8 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
}
d_assert(enb->sock, return,);
d_trace(3, "[S1AP] S1SetupRequest : eNB[%s:%d] --> MME\n",
CORE_ADDR(enb->addr, buf), enb_id);
d_trace(3, "[MME] S1-Setup response\n");
d_assert(mme_enb_set_enb_id(enb, enb_id) == CORE_OK,
return, "hash add error");
@ -80,8 +90,6 @@ void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK, , "send error");
d_assert(enb->sock, return,);
d_trace(3, "[S1AP] S1SetupResponse: eNB[%s:%d] <-- MME\n",
CORE_ADDR(enb->addr, buf), enb_id);
}
void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
@ -101,6 +109,10 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_InitialUEMessage_IEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] Initial UE Message\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
if (!enb_ue)
{
@ -137,6 +149,8 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
}
else
{
d_trace(3, " S_TMSI[G:%d,C:%d,M_TMSI:0x%x]\n",
guti.mme_gid, guti.mme_code, guti.m_tmsi);
mme_ue_associate_enb_ue(mme_ue, enb_ue);
}
}
@ -167,10 +181,8 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message)
enb_ue->nas.e_cgi.cell_id = (ntohl(enb_ue->nas.e_cgi.cell_id) >> 4);
d_assert(enb->sock, enb_ue_remove(enb_ue); return,);
d_trace(3, "[S1AP] InitialUEMessage : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
d_trace(3, " ENB_UE_S1AP_ID[%d] TAC[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->nas.tai.tac);
d_assert(s1ap_send_to_nas(enb_ue, &ies->nas_pdu) == CORE_OK,,
"s1ap_send_to_nas failed");
@ -187,13 +199,15 @@ void s1ap_handle_uplink_nas_transport(
ies = &message->s1ap_UplinkNASTransport_IEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] Uplink NAS transport\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
d_trace(3, "[S1AP] uplinkNASTransport : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
d_assert(s1ap_send_to_nas(enb_ue, &ies->nas_pdu) == CORE_OK,,
"s1ap_send_to_nas failed");
@ -210,9 +224,16 @@ void s1ap_handle_ue_capability_info_indication(
ies = &message->s1ap_UECapabilityInfoIndicationIEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] UE capability info indication\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
if (enb_ue->mme_ue)
{
S1ap_UERadioCapability_t *ue_radio_capa = NULL;
@ -242,11 +263,6 @@ void s1ap_handle_ue_capability_info_indication(
radio_capa->size);
memcpy(radio_capa->buf, ue_radio_capa->buf, radio_capa->size);
}
d_trace(3, "[S1AP] UE Capability Info Indication : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
}
void s1ap_handle_initial_context_setup_response(
@ -263,15 +279,17 @@ void s1ap_handle_initial_context_setup_response(
ies = &message->s1ap_InitialContextSetupResponseIEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] Initial context setup response\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
mme_ue = enb_ue->mme_ue;
d_assert(mme_ue, return,);
d_trace(3, "[S1AP] Initial Context Setup Response : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
for (i = 0; i < ies->e_RABSetupListCtxtSURes.
s1ap_E_RABSetupItemCtxtSURes.count; i++)
@ -295,6 +313,8 @@ void s1ap_handle_initial_context_setup_response(
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip);
d_assert(rv == CORE_OK, return,);
d_trace(3, " EBI[%d]\n", bearer->ebi);
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
int uli_presence = 0;
@ -326,10 +346,9 @@ void s1ap_handle_initial_context_setup_failure(
mme_ue = enb_ue->mme_ue;
d_assert(mme_ue, return,);
d_warn("[S1AP] Initial Context Setup Failure(%ld:%ld) : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
ies->cause.present, ies->cause.choice.radioNetwork,
enb_ue->enb_ue_s1ap_id,
d_error("[MME] Initial context setup failure : "
"ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d] ENB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
@ -364,15 +383,17 @@ void s1ap_handle_e_rab_setup_response(
ies = &message->s1ap_E_RABSetupResponseIEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] E-RAB setup response\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
mme_ue = enb_ue->mme_ue;
d_assert(mme_ue, return,);
d_trace(3, "[S1AP] E-RAB Setup Response : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
for (i = 0; i < ies->e_RABSetupListBearerSURes.
s1ap_E_RABSetupItemBearerSURes.count; i++)
@ -394,12 +415,15 @@ void s1ap_handle_e_rab_setup_response(
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip);
d_assert(rv == CORE_OK, return,);
d_trace(3, " EBI[%d]\n", bearer->ebi);
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
status_t rv;
mme_bearer_t *linked_bearer = mme_linked_bearer(bearer);
d_assert(bearer, return, "Null param");
d_assert(linked_bearer, return, "Null param");
d_trace(3, " Linked-EBI[%d]\n", linked_bearer->ebi);
if (bearer->ebi == linked_bearer->ebi)
{
@ -427,14 +451,17 @@ void s1ap_handle_ue_context_release_request(
ies = &message->s1ap_UEContextReleaseRequest_IEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] UE Context release request\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
enb_ue = enb_ue_find_by_mme_ue_s1ap_id(ies->mme_ue_s1ap_id);
d_assert(enb_ue, return, "No UE Context[%d]", ies->mme_ue_s1ap_id);
d_trace(3, "[S1AP] UE Context Release Request[%d:%d] : "
"UE[mME-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
ies->cause.present, ies->cause.choice.radioNetwork,
enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
d_trace(3, " Cause[Group:%d Cause:%d]\n",
ies->cause.present, ies->cause.choice.radioNetwork);
switch(ies->cause.present)
{
@ -462,11 +489,11 @@ void s1ap_handle_ue_context_release_request(
}
else
{
d_error("[S1AP] UE Context Release Request"
"[RadioNetwork Cause: %d] : "
"UE[mME-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
d_error("[MME] UE Context release request : "
"RadioNetwork Cause[%d] "
"ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d] ENB[%s:%d]\n",
ies->cause.choice.radioNetwork,
enb_ue->enb_ue_s1ap_id,
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
@ -488,13 +515,12 @@ void s1ap_handle_ue_context_release_request(
{
mme_ue_t *mme_ue = enb_ue->mme_ue;
d_error("[S1AP] UE Context Release Request"
"[Transport Cause: %d] : "
"UE[mME-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
ies->cause.choice.transport,
enb_ue->enb_ue_s1ap_id,
d_error("[MME] UE Context release request : "
"Transport Cause[%d] "
"ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d] ENB[%s:%d]\n",
ies->cause.choice.radioNetwork,
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = mme_gtp_send_delete_all_sessions(mme_ue);
@ -541,13 +567,15 @@ void s1ap_handle_ue_context_release_complete(
ies = &message->s1ap_UEContextReleaseComplete_IEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] UE Context release complete\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
enb_ue = enb_ue_find_by_mme_ue_s1ap_id(ies->mme_ue_s1ap_id);
d_assert(enb_ue, return, "No UE Context[%d]", ies->mme_ue_s1ap_id);
d_trace(3, "[S1AP] UE Context Release Complete : "
"UE[mME-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->mme_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
ue_ctx_rel_action = enb_ue->ue_ctx_rel_action;
enb_ue->ue_ctx_rel_action = S1AP_UE_CTX_REL_INVALID_ACTION;
@ -561,15 +589,18 @@ void s1ap_handle_ue_context_release_complete(
{
case S1AP_UE_CTX_REL_NO_ACTION:
{
d_trace(3, " No Action\n");
break;
}
case S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT:
{
d_trace(3, " Action: UE(mme) context\n");
mme_ue_remove(mme_ue);
break;
}
case S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL:
{
d_trace(3, " Action: Delete indirect tunnel\n");
rv = mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
mme_ue);
d_assert(rv == CORE_OK, return, "gtp send error");
@ -577,7 +608,7 @@ void s1ap_handle_ue_context_release_complete(
}
default:
{
d_assert(0, return, "Invalid action(%d)", ue_ctx_rel_action);
d_assert(0, return, "Invalid action[%d]", ue_ctx_rel_action);
break;
}
}
@ -647,6 +678,10 @@ void s1ap_handle_path_switch_request(
ies = &message->s1ap_PathSwitchRequestIEs;
d_assert(ies, return, "Null param");
d_trace(3, "[MME] Path switch request\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
eutran_cgi = &ies->eutran_cgi;
d_assert(eutran_cgi, return,);
pLMNidentity = &eutran_cgi->pLMNidentity;
@ -682,6 +717,9 @@ void s1ap_handle_path_switch_request(
return;
}
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
mme_ue = enb_ue->mme_ue;
d_assert(mme_ue, return, "Null param");
@ -750,11 +788,6 @@ void s1ap_handle_path_switch_request(
/* Switch to enb */
enb_ue_switch_to_enb(enb_ue, enb);
d_trace(3, "[S1AP] PathSwitchRequest : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
enb_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
}
void s1ap_handle_handover_required(mme_enb_t *enb, s1ap_message_t *message)
@ -772,6 +805,10 @@ void s1ap_handle_handover_required(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_HandoverRequiredIEs;
d_assert(ies, return,);
d_trace(3, "[MME] Handover required\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
source_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(source_ue, return,
"Cannot find UE for eNB-UE-S1AP-ID[%d] and eNB[%s:%d]",
@ -781,6 +818,9 @@ void s1ap_handle_handover_required(mme_enb_t *enb, s1ap_message_t *message)
"Conflict MME-UE-S1AP-ID : %d != %d\n",
source_ue->mme_ue_s1ap_id, ies->mme_ue_s1ap_id);
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
mme_ue = source_ue->mme_ue;
d_assert(mme_ue, return,);
@ -801,11 +841,6 @@ void s1ap_handle_handover_required(mme_enb_t *enb, s1ap_message_t *message)
rv = s1ap_send_handover_request(mme_ue, ies);
d_assert(rv == CORE_OK,, "s1ap send error");
d_trace(3, "[S1AP] Handover Required : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
source_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
}
void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
@ -825,6 +860,10 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_HandoverRequestAcknowledgeIEs;
d_assert(ies, return,);
d_trace(3, "[MME] Handover request acknowledge\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
target_ue = enb_ue_find_by_mme_ue_s1ap_id(ies->mme_ue_s1ap_id);
d_assert(target_ue, return,
"Cannot find UE for MME-UE-S1AP-ID[%d] and eNB[%s:%d]",
@ -838,6 +877,11 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
mme_ue = source_ue->mme_ue;
d_assert(mme_ue, return,);
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
d_trace(3, " Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
for (i = 0; i < ies->e_RABAdmittedList.s1ap_E_RABAdmittedItem.count; i++)
{
mme_bearer_t *bearer = NULL;
@ -896,11 +940,6 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
rv = s1ap_send_handover_command(source_ue);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
d_trace(3, "[S1AP] Handover Request Ack : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
target_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
}
void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
@ -917,6 +956,10 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_HandoverFailureIEs;
d_assert(ies, return,);
d_trace(3, "[MME] Handover failure\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
target_ue = enb_ue_find_by_mme_ue_s1ap_id(ies->mme_ue_s1ap_id);
d_assert(target_ue, return,
"Cannot find UE for MME-UE-S1AP-ID[%d] and eNB[%s:%d]",
@ -925,6 +968,12 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
source_ue = target_ue->source_ue;
d_assert(source_ue, return,);
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
d_trace(3, " Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
rv = s1ap_send_handover_preparation_failure(source_ue, &ies->cause);
d_assert(rv == CORE_OK, return, "s1ap send error");
@ -933,11 +982,6 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system,
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 0);
d_assert(rv == CORE_OK, return, "s1ap send error");
d_trace(3, "[S1AP] Handover Failure : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
target_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
}
void s1ap_handle_handover_cancel(mme_enb_t *enb, s1ap_message_t *message)
@ -955,6 +999,10 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_HandoverCancelIEs;
d_assert(ies, return,);
d_trace(3, "[MME] Handover cancel\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
source_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(source_ue, return,
"Cannot find UE for eNB-UE-S1AP-ID[%d] and eNB[%s:%d]",
@ -967,6 +1015,11 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, s1ap_message_t *message)
target_ue = source_ue->target_ue;
d_assert(target_ue, return,);
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
d_trace(3, " Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
rv = s1ap_send_handover_cancel_ack(source_ue);
d_assert(rv == CORE_OK,, "s1ap send error");
@ -976,7 +1029,7 @@ void s1ap_handle_handover_cancel(mme_enb_t *enb, s1ap_message_t *message)
S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL, 300);
d_assert(rv == CORE_OK, return, "s1ap send error");
d_trace(3, "[S1AP] Handover Cancel : "
d_trace(3, "[MME] Handover Cancel : "
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
source_ue->enb_ue_s1ap_id,
CORE_ADDR(enb->addr, buf), enb->enb_id);
@ -996,6 +1049,10 @@ void s1ap_handle_enb_status_transfer(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_ENBStatusTransferIEs;
d_assert(ies, return,);
d_trace(3, "[MME] ENB status transfer\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
source_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(source_ue, return,
"Cannot find UE for eNB-UE-S1AP-ID[%d] and eNB[%s:%d]",
@ -1008,6 +1065,11 @@ void s1ap_handle_enb_status_transfer(mme_enb_t *enb, s1ap_message_t *message)
target_ue = source_ue->target_ue;
d_assert(target_ue, return,);
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
d_trace(3, " Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
rv = s1ap_send_mme_status_transfer(target_ue, ies);
d_assert(rv == CORE_OK,,);
}
@ -1035,6 +1097,10 @@ void s1ap_handle_handover_notification(mme_enb_t *enb, s1ap_message_t *message)
ies = &message->s1ap_HandoverNotifyIEs;
d_assert(ies, return,);
d_trace(3, "[MME] Handover notification\n");
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
eutran_cgi = &ies->eutran_cgi;
d_assert(eutran_cgi, return,);
pLMNidentity = &eutran_cgi->pLMNidentity;
@ -1063,6 +1129,11 @@ void s1ap_handle_handover_notification(mme_enb_t *enb, s1ap_message_t *message)
mme_ue = source_ue->mme_ue;
d_assert(mme_ue, return,);
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
d_trace(3, " Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
mme_ue_associate_enb_ue(mme_ue, target_ue);
memcpy(&mme_ue->tai.plmn_id, pLMNidentity->buf,

View File

@ -70,10 +70,15 @@ static status_t s1ap_delete_list(list_t *list)
status_t s1ap_send_to_enb(mme_enb_t *enb, pkbuf_t *pkbuf)
{
status_t rv = CORE_ERROR;
d_assert(enb,,);
d_assert(pkbuf,,);
d_assert(enb->sock,,);
char buf[CORE_ADDRSTRLEN];
status_t rv;
d_assert(enb, return CORE_ERROR,);
d_assert(pkbuf, return CORE_ERROR,);
d_assert(enb->sock, return CORE_ERROR,);
d_trace(3, " IP[%s] ENB_ID[%d]\n",
CORE_ADDR(enb->addr, buf), enb->enb_id);
rv = s1ap_send(enb->sock, pkbuf,
enb->sock_type == SOCK_STREAM ? NULL : enb->addr);
@ -83,7 +88,7 @@ status_t s1ap_send_to_enb(mme_enb_t *enb, pkbuf_t *pkbuf)
pkbuf_free(pkbuf);
}
return rv;
return CORE_OK;;
}
status_t s1ap_delayed_send_to_enb(
@ -250,12 +255,18 @@ status_t s1ap_send_ue_context_release_command(
enb = enb_ue->enb;
d_assert(enb, return CORE_ERROR, "Null param");
d_trace(3, "[MME] UE Context release command\n");
d_trace(3, " ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
d_trace(3, " Group[%d] Cause[%d] Action[%d] Delay[%d]\n",
group, cause, action, delay);
rv = s1ap_build_ue_context_release_command(&s1apbuf, enb_ue, group, cause);
d_assert(rv == CORE_OK && s1apbuf, return CORE_ERROR, "s1ap build error");
rv = s1ap_delayed_send_to_enb(enb, s1apbuf, delay);
d_assert(rv == CORE_OK,, "s1ap send error");
return CORE_OK;
}
@ -368,6 +379,8 @@ status_t s1ap_send_handover_request(
mme_enb_t *target_enb = NULL;
enb_ue_t *source_ue = NULL, *target_ue = NULL;
d_trace(3, "[MME] Handover request\n");
d_assert(mme_ue, return CORE_ERROR,);
source_ue = mme_ue->enb_ue;
d_assert(source_ue, return CORE_ERROR,);
@ -402,6 +415,11 @@ status_t s1ap_send_handover_request(
target_ue = enb_ue_add(target_enb);
d_assert(target_ue, return CORE_ERROR,);
d_trace(3, " Source : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
source_ue->enb_ue_s1ap_id, source_ue->mme_ue_s1ap_id);
d_trace(3, " Target : ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n",
target_ue->enb_ue_s1ap_id, target_ue->mme_ue_s1ap_id);
rv = source_ue_associate_target_ue(source_ue, target_ue);
d_assert(rv == CORE_OK, return CORE_ERROR,);