forked from acouzens/open5gs
execute mme_bearer_find after ESM message decoded
This commit is contained in:
parent
94686be197
commit
c2de3c5596
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue