execute mme_bearer_find after ESM message decoded

This commit is contained in:
Sukchan Lee 2017-09-21 16:03:42 +09:00
parent 94686be197
commit c2de3c5596
4 changed files with 97 additions and 47 deletions

View File

@ -1659,6 +1659,22 @@ mme_sess_t* mme_sess_find_by_ebi(mme_ue_t *mme_ue, c_uint8_t ebi)
return NULL;
}
mme_sess_t* mme_sess_find_by_apn(mme_ue_t *mme_ue, c_int8_t *apn)
{
mme_sess_t *sess = NULL;
sess = mme_sess_first(mme_ue);
while(sess)
{
if (sess->pdn && strcmp(sess->pdn->apn, apn) == 0)
return sess;
sess = mme_sess_next(sess);
}
return NULL;
}
mme_sess_t* mme_sess_first(mme_ue_t *mme_ue)
{
return list_first(&mme_ue->sess_list);
@ -1777,6 +1793,75 @@ mme_bearer_t* mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, c_uint8_t ebi)
return NULL;
}
mme_bearer_t* mme_bearer_find_or_add_by_message(
mme_ue_t *mme_ue, nas_message_t *message)
{
c_uint8_t pti = NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
c_uint8_t ebi = NAS_EPS_BEARER_IDENTITY_UNASSIGNED;
mme_bearer_t *bearer = NULL;
mme_sess_t *sess = NULL;
d_assert(mme_ue, return NULL,);
d_assert(message, return NULL,);
if (message->esm.h.message_type == NAS_PDN_DISCONNECT_REQUEST)
{
nas_pdn_disconnect_request_t *pdn_disconnect_request =
&message->esm.pdn_disconnect_request;
nas_linked_eps_bearer_identity_t *linked_eps_bearer_identity =
&pdn_disconnect_request->linked_eps_bearer_identity;
bearer = mme_bearer_find_by_ue_ebi(mme_ue,
linked_eps_bearer_identity->eps_bearer_identity);
d_assert(bearer, return NULL,
"Invalid pti(%d) and ebi(%d)\n", pti, ebi);
sess = bearer->sess;
d_assert(sess, return NULL, "Null param");
sess->pti = pti;
return bearer;
}
pti = message->esm.h.procedure_transaction_identity;
ebi = message->esm.h.eps_bearer_identity;
if (ebi != NAS_EPS_BEARER_IDENTITY_UNASSIGNED)
{
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
d_assert(bearer, return NULL,);
return bearer;
}
d_assert(pti != NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED,
return NULL, );
if (message->esm.h.message_type == NAS_PDN_CONNECTIVITY_REQUEST)
{
nas_pdn_connectivity_request_t *pdn_connectivity_request =
&message->esm.pdn_connectivity_request;
if (pdn_connectivity_request->presencemask &
NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT)
sess = mme_sess_find_by_apn(mme_ue,
pdn_connectivity_request->access_point_name.apn);
else
sess = mme_sess_first(mme_ue);
if (!sess)
sess = mme_sess_add(mme_ue, pti);
d_assert(sess, return NULL,);
}
else
{
sess = mme_sess_find_by_pti(mme_ue, pti);
d_assert(sess, return NULL,);
}
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return NULL,);
return bearer;
}
mme_bearer_t* mme_default_bearer_in_sess(mme_sess_t *sess)
{
return mme_bearer_first(sess);

View File

@ -482,6 +482,8 @@ CORE_DECLARE(mme_sess_t*) mme_sess_find_by_pti(
mme_ue_t *mme_ue, c_uint8_t pti);
CORE_DECLARE(mme_sess_t*) mme_sess_find_by_ebi(
mme_ue_t *mme_ue, c_uint8_t ebi);
CORE_DECLARE(mme_sess_t*) mme_sess_find_by_apn(
mme_ue_t *mme_ue, c_int8_t *apn);
CORE_DECLARE(mme_sess_t*) mme_sess_first(mme_ue_t *mme_ue);
CORE_DECLARE(mme_sess_t*) mme_sess_next(mme_sess_t *sess);
@ -493,6 +495,8 @@ CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_sess_ebi(
mme_sess_t *sess, c_uint8_t ebi);
CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_ue_ebi(
mme_ue_t *mme_ue, c_uint8_t ebi);
CORE_DECLARE(mme_bearer_t*) mme_bearer_find_or_add_by_message(
mme_ue_t *mme_ue, nas_message_t *message);
CORE_DECLARE(mme_bearer_t*) mme_default_bearer_in_sess(mme_sess_t *sess);
CORE_DECLARE(mme_bearer_t*) mme_linked_bearer(mme_bearer_t *bearer);
CORE_DECLARE(mme_bearer_t*) mme_bearer_first(mme_sess_t *sess);

View File

@ -247,17 +247,22 @@ void mme_state_operational(fsm_t *s, event_t *e)
case MME_EVT_ESM_MESSAGE:
{
nas_message_t message;
mme_ue_t *mme_ue = NULL;
mme_bearer_t *bearer = NULL;
pkbuf_t *pkbuf = NULL;
bearer = mme_bearer_find(event_get_param1(e));
d_assert(bearer, break, "No Bearer context");
mme_ue = mme_ue_find(event_get_param1(e));
d_assert(mme_ue, break, "No UE context");
pkbuf = (pkbuf_t *)event_get_param2(e);
d_assert(pkbuf, break, "Null param");
d_assert(nas_esm_decode(&message, pkbuf) == CORE_OK,
pkbuf_free(pkbuf); break, "Can't decode NAS_ESM");
bearer = mme_bearer_find_or_add_by_message(mme_ue, &message);
d_assert(bearer, break, "No Bearer context");
event_set_param1(e, (c_uintptr_t)bearer->index);
event_set_param3(e, (c_uintptr_t)&message);
fsm_dispatch(&bearer->sm, (fsm_event_t*)e);

View File

@ -246,56 +246,12 @@ status_t s1ap_delayed_send_to_enb(
status_t s1ap_send_to_esm(mme_ue_t *mme_ue, pkbuf_t *esmbuf)
{
event_t e;
nas_esm_header_t *h = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
c_uint8_t pti = NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED;
c_uint8_t ebi = NAS_EPS_BEARER_IDENTITY_UNASSIGNED;
d_assert(mme_ue, return CORE_ERROR, "Null param");
d_assert(esmbuf, return CORE_ERROR, "Null param");
h = esmbuf->payload;
d_assert(h, return CORE_ERROR, "Null param");
pti = h->procedure_transaction_identity;
ebi = h->eps_bearer_identity;
if (h->message_type == NAS_PDN_DISCONNECT_REQUEST)
{
nas_pdn_disconnect_request_t *pdn_disconnect_request =
esmbuf->payload + sizeof(nas_esm_header_t);
nas_linked_eps_bearer_identity_t *linked_eps_bearer_identity =
&pdn_disconnect_request->linked_eps_bearer_identity;
bearer = mme_bearer_find_by_ue_ebi(mme_ue,
linked_eps_bearer_identity->eps_bearer_identity);
d_assert(bearer, return CORE_ERROR,
"Invalid pti(%d) and ebi(%d)\n", pti, ebi);
sess = bearer->sess;
d_assert(sess, return CORE_ERROR, "Null param");
sess->pti = pti;
}
else
{
if (ebi != NAS_EPS_BEARER_IDENTITY_UNASSIGNED)
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
else if (pti != NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED)
{
sess = mme_sess_find_by_pti(mme_ue, pti);
if (!sess)
sess = mme_sess_add(mme_ue, pti);
d_assert(sess, return CORE_ERROR, "Null param");
bearer = mme_default_bearer_in_sess(sess);
}
else
d_assert(0, return CORE_ERROR,
"Invalid pti(%d) and ebi(%d)\n", pti, ebi);
}
d_assert(bearer, return CORE_ERROR, "Null param");
event_set(&e, MME_EVT_ESM_MESSAGE);
event_set_param1(&e, (c_uintptr_t)bearer->index);
event_set_param1(&e, (c_uintptr_t)mme_ue->index);
event_set_param2(&e, (c_uintptr_t)esmbuf);
mme_event_send(&e);