forked from acouzens/open5gs
under re-architecturing
This commit is contained in:
parent
e6e2183801
commit
69607fbbb4
|
@ -22,7 +22,7 @@
|
|||
|
||||
#include "emm_handler.h"
|
||||
|
||||
static status_t emm_send_to_enb(enb_ue_t *enb_ue, pkbuf_t *pkbuf)
|
||||
static status_t emm_send_s1ap_to_enb(enb_ue_t *enb_ue, pkbuf_t *pkbuf)
|
||||
{
|
||||
mme_enb_t *enb = NULL;
|
||||
|
||||
|
@ -33,6 +33,22 @@ static status_t emm_send_to_enb(enb_ue_t *enb_ue, pkbuf_t *pkbuf)
|
|||
return s1ap_send_to_enb(enb, pkbuf);
|
||||
}
|
||||
|
||||
static status_t emm_send_nas_to_enb(mme_ue_t *mme_ue, pkbuf_t *pkbuf)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *s1apbuf = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, pkbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(pkbuf); return CORE_ERROR, "s1ap build error");
|
||||
|
||||
return emm_send_s1ap_to_enb(enb_ue, s1apbuf);
|
||||
}
|
||||
|
||||
static void emm_handle_esm_message_container(
|
||||
mme_ue_t *mme_ue, nas_esm_message_container_t *esm_message_container)
|
||||
{
|
||||
|
@ -136,38 +152,14 @@ void emm_handle_attach_request(
|
|||
/* Update Kenb */
|
||||
mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb);
|
||||
|
||||
/* FIXME :
|
||||
* Need to refine the code to start from ESM_Info_req.
|
||||
* Call esm_handle_s6a_update_location(bearer) here
|
||||
* or send event ?
|
||||
*/
|
||||
{
|
||||
mme_sess_t *sess = mme_sess_first(mme_ue);
|
||||
while(sess)
|
||||
{
|
||||
mme_bearer_t *bearer = mme_bearer_first(sess);
|
||||
while(bearer)
|
||||
{
|
||||
event_t e;
|
||||
event_set(&e, MME_EVT_ESM_BEARER_FROM_S6A);
|
||||
event_set_param1(&e, (c_uintptr_t)bearer->index);
|
||||
event_set_param2(&e,
|
||||
(c_uintptr_t)S6A_CMD_UPDATE_LOCATION);
|
||||
mme_event_send(&e);
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
}
|
||||
|
||||
/* Send ESM Information Request */
|
||||
emm_handle_esm_information_request(mme_ue);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MME_SESSION_IS_CREATED(mme_ue))
|
||||
{
|
||||
emm_handle_delete_session_request(mme_ue);
|
||||
emm_handle_s11_delete_session_request(mme_ue);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -205,38 +197,14 @@ void emm_handle_attach_request(
|
|||
mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32,
|
||||
mme_ue->kenb);
|
||||
|
||||
/* FIXME :
|
||||
* Need to refine the code to start from ESM_Info_req.
|
||||
* Call esm_handle_s6a_update_location(bearer) here
|
||||
* or send event ?
|
||||
*/
|
||||
{
|
||||
|
||||
mme_sess_t *sess = mme_sess_first(mme_ue);
|
||||
while(sess)
|
||||
{
|
||||
mme_bearer_t *bearer = mme_bearer_first(sess);
|
||||
while(bearer)
|
||||
{
|
||||
event_t e;
|
||||
event_set(&e, MME_EVT_ESM_BEARER_FROM_S6A);
|
||||
event_set_param1(&e, (c_uintptr_t)bearer->index);
|
||||
event_set_param2(&e,
|
||||
(c_uintptr_t)S6A_CMD_UPDATE_LOCATION);
|
||||
mme_event_send(&e);
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
}
|
||||
/* Send ESM Information Request */
|
||||
emm_handle_esm_information_request(mme_ue);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MME_SESSION_IS_CREATED(mme_ue))
|
||||
{
|
||||
emm_handle_delete_session_request(mme_ue);
|
||||
emm_handle_s11_delete_session_request(mme_ue);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -264,17 +232,13 @@ void emm_handle_attach_request(
|
|||
|
||||
void emm_handle_identity_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
status_t rv;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
|
||||
pkbuf_t *emmbuf = NULL;
|
||||
|
||||
nas_message_t message;
|
||||
nas_identity_request_t *identity_request =
|
||||
&message.emm.identity_request;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
message.emm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
|
@ -284,12 +248,7 @@ void emm_handle_identity_request(mme_ue_t *mme_ue)
|
|||
identity_request->identity_type.type = NAS_IDENTITY_TYPE_2_IMSI;
|
||||
|
||||
d_assert(nas_plain_encode(&emmbuf, &message) == CORE_OK && emmbuf,,);
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build error");
|
||||
|
||||
d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
|
||||
d_assert(emm_send_nas_to_enb(mme_ue, emmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
void emm_handle_identity_response(
|
||||
|
@ -332,7 +291,7 @@ void emm_handle_identity_response(
|
|||
{
|
||||
if (MME_SESSION_IS_CREATED(mme_ue))
|
||||
{
|
||||
emm_handle_delete_session_request(mme_ue);
|
||||
emm_handle_s11_delete_session_request(mme_ue);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -343,17 +302,13 @@ void emm_handle_identity_response(
|
|||
|
||||
void emm_handle_authentication_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
status_t rv;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
|
||||
pkbuf_t *emmbuf = NULL;
|
||||
|
||||
nas_message_t message;
|
||||
nas_authentication_request_t *authentication_request =
|
||||
&message.emm.authentication_request;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
|
||||
d_trace(3, "[NAS] Authentication request : UE[%s] <-- EMM\n",
|
||||
mme_ue->imsi_bcd);
|
||||
|
@ -370,20 +325,14 @@ void emm_handle_authentication_request(mme_ue_t *mme_ue)
|
|||
AUTN_LEN;
|
||||
|
||||
d_assert(nas_plain_encode(&emmbuf, &message) == CORE_OK && emmbuf,,);
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build error");
|
||||
|
||||
d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
|
||||
d_assert(emm_send_nas_to_enb(mme_ue, emmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
void emm_handle_authentication_response(mme_ue_t *mme_ue,
|
||||
nas_authentication_response_t *authentication_response)
|
||||
{
|
||||
status_t rv;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
|
||||
pkbuf_t *emmbuf = NULL;
|
||||
int i;
|
||||
|
||||
nas_authentication_response_parameter_t *authentication_response_parameter =
|
||||
|
@ -400,8 +349,6 @@ void emm_handle_authentication_response(mme_ue_t *mme_ue,
|
|||
&security_mode_command->replayed_ue_security_capabilities;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
|
||||
if (authentication_response_parameter->length != mme_ue->xres_len ||
|
||||
memcmp(authentication_response_parameter->res,
|
||||
|
@ -473,45 +420,7 @@ void emm_handle_authentication_response(mme_ue_t *mme_ue,
|
|||
|
||||
rv = nas_security_encode(&emmbuf, mme_ue, &message);
|
||||
d_assert(rv == CORE_OK && emmbuf, return, "emm build error");
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build 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)
|
||||
{
|
||||
status_t rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
pkbuf_t *esmbuf = NULL, *emmbuf = NULL, *s1apbuf = NULL;
|
||||
|
||||
d_assert(bearer, return, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
|
||||
rv = esm_build_activate_default_bearer_context(&esmbuf, bearer);
|
||||
d_assert(rv == CORE_OK && esmbuf,
|
||||
return, "bearer build error");
|
||||
|
||||
d_trace(3, "[NAS] Activate default bearer context request : "
|
||||
"EMM <-- ESM[%d]\n", bearer->ebi);
|
||||
|
||||
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
|
||||
d_assert(rv == CORE_OK && emmbuf,
|
||||
pkbuf_free(esmbuf); return, "emm build error");
|
||||
|
||||
d_trace(3, "[NAS] Attach accept : UE[%s] <-- EMM\n", mme_ue->imsi_bcd);
|
||||
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build error");
|
||||
|
||||
d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
|
||||
d_assert(emm_send_nas_to_enb(mme_ue, emmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
void emm_handle_attach_accept(mme_ue_t *mme_ue)
|
||||
|
@ -522,7 +431,7 @@ void emm_handle_attach_accept(mme_ue_t *mme_ue)
|
|||
mme_bearer_t *bearer = mme_default_bearer_in_sess(sess);
|
||||
if (bearer)
|
||||
{
|
||||
emm_handle_create_session_response(bearer);
|
||||
emm_handle_s11_create_session_response(bearer);
|
||||
}
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
|
@ -532,8 +441,7 @@ void emm_handle_attach_complete(
|
|||
mme_ue_t *mme_ue, nas_attach_complete_t *attach_complete)
|
||||
{
|
||||
status_t rv;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
|
||||
pkbuf_t *emmbuf = NULL;
|
||||
|
||||
nas_message_t message;
|
||||
nas_emm_information_t *emm_information = &message.emm.emm_information;
|
||||
|
@ -546,8 +454,6 @@ void emm_handle_attach_complete(
|
|||
time_exp_lt(&time_exp, time_now());
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
|
||||
emm_handle_esm_message_container(
|
||||
mme_ue, &attach_complete->esm_message_container);
|
||||
|
@ -588,20 +494,7 @@ void emm_handle_attach_complete(
|
|||
|
||||
rv = nas_security_encode(&emmbuf, mme_ue, &message);
|
||||
d_assert(rv == CORE_OK && emmbuf, return, "emm build error");
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build 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)
|
||||
{
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
|
||||
d_warn("[NAS] EMM status(%d) : UE[%s] --> EMM",
|
||||
emm_status->emm_cause, mme_ue->imsi_bcd);
|
||||
d_assert(emm_send_nas_to_enb(mme_ue, emmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
void emm_handle_detach_request(
|
||||
|
@ -642,7 +535,7 @@ void emm_handle_detach_request(
|
|||
|
||||
if (MME_SESSION_IS_CREATED(mme_ue))
|
||||
{
|
||||
emm_handle_delete_session_request(mme_ue);
|
||||
emm_handle_s11_delete_session_request(mme_ue);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -657,7 +550,7 @@ void emm_handle_detach_accept(
|
|||
|
||||
status_t rv;
|
||||
nas_message_t message;
|
||||
pkbuf_t *emmbuf = NULL, *s1apbuf = NULL;
|
||||
pkbuf_t *emmbuf = NULL;
|
||||
mme_enb_t *enb = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
nas_detach_type_t *detach_type = NULL;
|
||||
|
@ -688,13 +581,7 @@ void emm_handle_detach_accept(
|
|||
|
||||
rv = nas_security_encode(&emmbuf, mme_ue, &message);
|
||||
d_assert(rv == CORE_OK && emmbuf, return, "emm build error");
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build error");
|
||||
|
||||
d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,,
|
||||
"s1ap send error");
|
||||
d_assert(emm_send_nas_to_enb(mme_ue, emmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
event_set(&e, MME_EVT_S1AP_UE_FROM_EMM);
|
||||
|
@ -704,7 +591,121 @@ void emm_handle_detach_accept(
|
|||
mme_event_send(&e);
|
||||
}
|
||||
|
||||
void emm_handle_delete_session_request(mme_ue_t *mme_ue)
|
||||
void emm_handle_service_request(
|
||||
mme_ue_t *mme_ue, nas_service_request_t *service_request)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *s1apbuf = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
sess = mme_sess_first(mme_ue);
|
||||
d_assert(sess, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, NULL);
|
||||
d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error");
|
||||
|
||||
d_assert(emm_send_s1ap_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)
|
||||
{
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
|
||||
d_warn("[NAS] EMM status(%d) : UE[%s] --> EMM",
|
||||
emm_status->emm_cause, mme_ue->imsi_bcd);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* ESM Layer in EMM Handler
|
||||
*/
|
||||
void emm_handle_esm_information_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *esmbuf = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
sess = mme_sess_first(mme_ue);
|
||||
d_assert(sess, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
|
||||
rv = esm_build_information_request(&esmbuf, bearer);
|
||||
d_assert(rv == CORE_OK && esmbuf, return, "esm_build failed");
|
||||
d_assert(emm_send_nas_to_enb(mme_ue, esmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* S6A Layer in EMM Handler
|
||||
*/
|
||||
void emm_handle_s6a_aia(mme_ue_t *mme_ue, c_uint32_t result_code)
|
||||
{
|
||||
if (result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
/* TODO */
|
||||
/* Send Attach Reject */
|
||||
return;
|
||||
}
|
||||
|
||||
emm_handle_authentication_request(mme_ue);
|
||||
}
|
||||
|
||||
void emm_handle_s6a_ula(mme_ue_t *mme_ue, c_uint32_t result_code)
|
||||
{
|
||||
if (result_code != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
/* TODO */
|
||||
return;
|
||||
}
|
||||
|
||||
emm_handle_esm_information_request(mme_ue);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* S11 Layer in EMM Handler
|
||||
*/
|
||||
void emm_handle_s11_create_session_response(mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
pkbuf_t *esmbuf = NULL, *emmbuf = NULL, *s1apbuf = NULL;
|
||||
|
||||
d_assert(bearer, return, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
|
||||
rv = esm_build_activate_default_bearer_context(&esmbuf, bearer);
|
||||
d_assert(rv == CORE_OK && esmbuf,
|
||||
return, "bearer build error");
|
||||
|
||||
d_trace(3, "[NAS] Activate default bearer context request : "
|
||||
"EMM <-- ESM[%d]\n", bearer->ebi);
|
||||
|
||||
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
|
||||
d_assert(rv == CORE_OK && emmbuf,
|
||||
pkbuf_free(esmbuf); return, "emm build error");
|
||||
|
||||
d_trace(3, "[NAS] Attach accept : UE[%s] <-- EMM\n", mme_ue->imsi_bcd);
|
||||
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build error");
|
||||
|
||||
d_assert(emm_send_s1ap_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
|
||||
}
|
||||
|
||||
void emm_handle_s11_delete_session_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *s11buf = NULL;
|
||||
|
@ -727,7 +728,7 @@ void emm_handle_delete_session_request(mme_ue_t *mme_ue)
|
|||
}
|
||||
}
|
||||
|
||||
void emm_handle_delete_session_response(mme_bearer_t *bearer)
|
||||
void emm_handle_s11_delete_session_response(mme_bearer_t *bearer)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess;
|
||||
|
@ -767,30 +768,7 @@ void emm_handle_delete_session_response(mme_bearer_t *bearer)
|
|||
}
|
||||
}
|
||||
|
||||
void emm_handle_service_request(
|
||||
mme_ue_t *mme_ue, nas_service_request_t *service_request)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *s1apbuf = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
sess = mme_sess_first(mme_ue);
|
||||
d_assert(sess, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, NULL);
|
||||
d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error");
|
||||
|
||||
d_assert(emm_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
|
||||
}
|
||||
|
||||
void emm_handle_downlink_data_notification(gtp_xact_t *xact,
|
||||
void emm_handle_s11_downlink_data_notification(gtp_xact_t *xact,
|
||||
mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
|
@ -815,16 +793,3 @@ void emm_handle_downlink_data_notification(gtp_xact_t *xact,
|
|||
sess->sgw_s11_teid, s11buf) == CORE_OK,
|
||||
return , "xact commit error");
|
||||
}
|
||||
|
||||
void emm_handle_s6a_aia(mme_ue_t *mme_ue, c_uint32_t result_code)
|
||||
{
|
||||
if (result_code == ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
emm_handle_authentication_request(mme_ue);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO */
|
||||
/* Send Attach Reject */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,19 +28,22 @@ CORE_DECLARE(void) emm_handle_detach_request(
|
|||
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_emm_status(
|
||||
mme_ue_t *mme_ue, nas_emm_status_t *emm_status);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_service_request(
|
||||
mme_ue_t *mme_ue, nas_service_request_t *service_request);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_create_session_response(mme_bearer_t *bearer);
|
||||
CORE_DECLARE(void) emm_handle_delete_session_request(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(void) emm_handle_delete_session_response(mme_bearer_t *bearer);
|
||||
CORE_DECLARE(void) emm_handle_downlink_data_notification(gtp_xact_t *xact,
|
||||
mme_bearer_t *bearer);
|
||||
CORE_DECLARE(void) emm_handle_emm_status(
|
||||
mme_ue_t *mme_ue, nas_emm_status_t *emm_status);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_esm_information_request(mme_ue_t *mme_ue);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_s6a_aia(mme_ue_t *mme_ue, c_uint32_t result_code);
|
||||
CORE_DECLARE(void) emm_handle_s6a_ula(mme_ue_t *mme_ue, c_uint32_t result_code);
|
||||
|
||||
CORE_DECLARE(void) emm_handle_s11_create_session_response(mme_bearer_t *bearer);
|
||||
CORE_DECLARE(void) emm_handle_s11_delete_session_request(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(void) emm_handle_s11_delete_session_response(mme_bearer_t *bearer);
|
||||
CORE_DECLARE(void) emm_handle_s11_downlink_data_notification(gtp_xact_t *xact,
|
||||
mme_bearer_t *bearer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -56,17 +56,17 @@ void emm_state_operational(fsm_t *s, event_t *e)
|
|||
switch(event_get_param2(e))
|
||||
{
|
||||
case GTP_CREATE_SESSION_RESPONSE_TYPE:
|
||||
emm_handle_create_session_response(bearer);
|
||||
emm_handle_s11_create_session_response(bearer);
|
||||
break;
|
||||
case GTP_DELETE_SESSION_RESPONSE_TYPE:
|
||||
emm_handle_delete_session_response(bearer);
|
||||
emm_handle_s11_delete_session_response(bearer);
|
||||
break;
|
||||
case GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
gtp_xact_t *xact = (gtp_xact_t *)event_get_param3(e);
|
||||
|
||||
emm_handle_downlink_data_notification(xact, bearer);
|
||||
emm_handle_s11_downlink_data_notification(xact, bearer);
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, break, "Null param");
|
||||
|
||||
|
@ -99,24 +99,8 @@ void emm_state_operational(fsm_t *s, event_t *e)
|
|||
}
|
||||
case S6A_CMD_UPDATE_LOCATION:
|
||||
{
|
||||
mme_sess_t *sess = mme_sess_first(mme_ue);
|
||||
while(sess)
|
||||
{
|
||||
mme_bearer_t *bearer = mme_bearer_first(sess);
|
||||
while(bearer)
|
||||
{
|
||||
event_t e;
|
||||
event_set(&e, MME_EVT_ESM_BEARER_FROM_S6A);
|
||||
event_set_param1(&e, (c_uintptr_t)bearer->index);
|
||||
event_set_param2(&e,
|
||||
(c_uintptr_t)S6A_CMD_UPDATE_LOCATION);
|
||||
mme_event_send(&e);
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
c_uint32_t result_code = event_get_param3(e);
|
||||
emm_handle_s6a_ula(mme_ue, result_code);
|
||||
break;
|
||||
}
|
||||
case GTP_MODIFY_BEARER_RESPONSE_TYPE:
|
||||
|
@ -220,16 +204,6 @@ void emm_state_operational(fsm_t *s, event_t *e)
|
|||
}
|
||||
break;
|
||||
}
|
||||
case MME_EVT_EMM_UE_T3:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
d_assert(index, return, "Null param");
|
||||
mme_ue = mme_ue_find(index);
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
break;
|
||||
}
|
||||
case MME_EVT_EMM_UE_T3413:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
|
|
|
@ -28,32 +28,6 @@ void esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
|||
}
|
||||
}
|
||||
|
||||
void esm_handle_s6a_update_location(mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
mme_enb_t *enb = NULL;
|
||||
pkbuf_t *esmbuf = NULL, *s1apbuf = NULL;
|
||||
|
||||
d_assert(bearer, return, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
enb = enb_ue->enb;
|
||||
d_assert(enb, return, "Null param");
|
||||
|
||||
rv = esm_build_information_request(&esmbuf, bearer);
|
||||
d_assert(rv == CORE_OK && esmbuf, return, "esm_build failed");
|
||||
|
||||
rv = s1ap_build_downlink_nas_transport(&s1apbuf, enb_ue, esmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(esmbuf); return, "s1ap build error");
|
||||
|
||||
d_assert(s1ap_send_to_enb(enb, s1apbuf) == CORE_OK,, "s1ap send error");
|
||||
}
|
||||
|
||||
void esm_handle_modify_bearer_request(mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
|
|
|
@ -11,7 +11,6 @@ extern "C" {
|
|||
|
||||
CORE_DECLARE(void) esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
||||
nas_pdn_connectivity_request_t *pdn_connectivity_request);
|
||||
CORE_DECLARE(void) esm_handle_s6a_update_location(mme_bearer_t *bearer);
|
||||
CORE_DECLARE(void) esm_handle_information_response(mme_bearer_t *bearer,
|
||||
nas_esm_information_response_t *bearer_information_response);
|
||||
CORE_DECLARE(void) esm_handle_modify_bearer_request(mme_bearer_t *bearer);
|
||||
|
|
|
@ -41,7 +41,6 @@ void esm_state_operational(fsm_t *s, event_t *e)
|
|||
{
|
||||
break;
|
||||
}
|
||||
case MME_EVT_ESM_BEARER_FROM_S6A:
|
||||
case MME_EVT_ESM_BEARER_TO_S11:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
|
@ -56,14 +55,6 @@ void esm_state_operational(fsm_t *s, event_t *e)
|
|||
|
||||
switch(event_get_param2(e))
|
||||
{
|
||||
case S6A_CMD_UPDATE_LOCATION:
|
||||
{
|
||||
d_trace(3, "[NAS] ESM information request : "
|
||||
"UE[%s] <--- ESM[%d]\n",
|
||||
mme_ue->imsi_bcd, bearer->pti);
|
||||
esm_handle_s6a_update_location(bearer);
|
||||
break;
|
||||
}
|
||||
case GTP_MODIFY_BEARER_REQUEST_TYPE:
|
||||
{
|
||||
esm_handle_modify_bearer_request(bearer);
|
||||
|
|
|
@ -29,9 +29,19 @@ char* mme_event_get_name(event_t *e)
|
|||
|
||||
case MME_EVT_EMM_UE_MSG:
|
||||
return "MME_EVT_EMM_UE_MSG";
|
||||
case MME_EVT_EMM_UE_FROM_S6A:
|
||||
return "MME_EVT_EMM_UE_FROM_S6A";
|
||||
case MME_EVT_EMM_UE_FROM_S11:
|
||||
return "MME_EVT_EMM_UE_FROM_S11";
|
||||
case MME_EVT_EMM_BEARER_FROM_S11:
|
||||
return "MME_EVT_EMM_BEARER_FROM_S11";
|
||||
case MME_EVT_EMM_UE_T3413:
|
||||
return "MME_EVT_EMM_UE_T3413";
|
||||
|
||||
case MME_EVT_ESM_BEARER_MSG:
|
||||
return "MME_EVT_ESM_BEARER_MSG";
|
||||
case MME_EVT_ESM_BEARER_TO_S11:
|
||||
return "MME_EVT_ESM_BEARER_TO_S11";
|
||||
|
||||
case MME_EVT_S11_UE_MSG:
|
||||
return "MME_EVT_S11_UE_MSG";
|
||||
|
|
|
@ -25,11 +25,9 @@ typedef enum {
|
|||
MME_EVT_EMM_UE_FROM_S6A,
|
||||
MME_EVT_EMM_UE_FROM_S11,
|
||||
MME_EVT_EMM_BEARER_FROM_S11,
|
||||
MME_EVT_EMM_UE_T3,
|
||||
MME_EVT_EMM_UE_T3413,
|
||||
|
||||
MME_EVT_ESM_BEARER_MSG,
|
||||
MME_EVT_ESM_BEARER_FROM_S6A,
|
||||
MME_EVT_ESM_BEARER_TO_S11,
|
||||
|
||||
MME_EVT_S11_UE_MSG,
|
||||
|
|
|
@ -342,11 +342,12 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
struct sess_state *mi = NULL;
|
||||
struct timespec ts;
|
||||
struct session *sess;
|
||||
struct avp *avp;
|
||||
struct avp *avp, *avpch;
|
||||
struct avp *avpch1, *avpch2, *avpch3, *avpch4, *avpch5;
|
||||
struct avp_hdr *hdr;
|
||||
unsigned long dur;
|
||||
int error = 0;
|
||||
c_uint32_t result_code = 0;
|
||||
int new;
|
||||
|
||||
event_t e;
|
||||
|
@ -374,17 +375,29 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avp, &hdr), return);
|
||||
d_trace(3, "Status: %d\n", hdr->avp_value->i32);
|
||||
if (hdr->avp_value->i32 != ER_DIAMETER_SUCCESS)
|
||||
{
|
||||
d_error("ERROR DIAMETER Result Code(%d)", hdr->avp_value->i32);
|
||||
error++;
|
||||
}
|
||||
result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Result Code: %d\n", hdr->avp_value->i32);
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("no Result-Code");
|
||||
error++;
|
||||
CHECK_FCT_DO( fd_msg_search_avp(*msg,
|
||||
fd_experimental_result, &avp), return );
|
||||
if (avp)
|
||||
{
|
||||
CHECK_FCT_DO( fd_avp_search_avp(avp,
|
||||
fd_experimental_result_code, &avpch), return );
|
||||
if (avpch)
|
||||
{
|
||||
CHECK_FCT_DO( fd_msg_avp_hdr(avpch, &hdr), return);
|
||||
result_code = hdr->avp_value->i32;
|
||||
d_trace(3, "Experimental Result Code: %d\n", result_code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("no Result-Code");
|
||||
error++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Value of Origin-Host */
|
||||
|
@ -638,6 +651,7 @@ static void mme_s6a_ula_cb(void *data, struct msg **msg)
|
|||
event_set(&e, MME_EVT_EMM_UE_FROM_S6A);
|
||||
event_set_param1(&e, (c_uintptr_t)mme_ue->index);
|
||||
event_set_param2(&e, (c_uintptr_t)S6A_CMD_UPDATE_LOCATION);
|
||||
event_set_param3(&e, (c_uintptr_t)result_code);
|
||||
mme_event_send(&e);
|
||||
|
||||
/* Free the message */
|
||||
|
|
|
@ -223,7 +223,6 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
case MME_EVT_EMM_UE_FROM_S6A:
|
||||
case MME_EVT_EMM_UE_FROM_S11:
|
||||
case MME_EVT_EMM_BEARER_FROM_S11:
|
||||
case MME_EVT_EMM_UE_T3:
|
||||
case MME_EVT_EMM_UE_T3413:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
|
@ -249,7 +248,6 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
|
||||
break;
|
||||
}
|
||||
case MME_EVT_ESM_BEARER_FROM_S6A:
|
||||
case MME_EVT_ESM_BEARER_TO_S11:
|
||||
case MME_EVT_ESM_BEARER_MSG:
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue