forked from acouzens/open5gs
move the followings from mme_baerer_t to mme_sess_t
1. ESM State Machine 2. pti and ebi
This commit is contained in:
parent
0242e104c8
commit
2a8c8526d3
|
@ -31,6 +31,7 @@ static void event_emm_to_esm(
|
|||
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 param");
|
||||
d_assert(esm_message_container, return, "Null param");
|
||||
|
@ -41,13 +42,18 @@ static void event_emm_to_esm(
|
|||
|
||||
pti = h->procedure_transaction_identity;
|
||||
ebi = h->eps_bearer_identity;
|
||||
if (pti == NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED && ebi)
|
||||
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
|
||||
else if (ebi == NAS_EPS_BEARER_IDENTITY_UNASSIGNED && pti)
|
||||
bearer = mme_bearer_find_by_ue_pti(mme_ue, pti);
|
||||
|
||||
if (!bearer)
|
||||
bearer = mme_sess_add(mme_ue, pti);
|
||||
if (ebi != NAS_EPS_BEARER_IDENTITY_UNASSIGNED)
|
||||
sess = mme_sess_find_by_ebi(mme_ue, ebi);
|
||||
else if (pti != NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED)
|
||||
sess = mme_sess_find_by_pti(mme_ue, pti);
|
||||
else
|
||||
d_assert(0, return, "Invalid pti(%d) and ebi(%d)\n", pti, ebi);
|
||||
|
||||
if (!sess)
|
||||
sess = mme_sess_add(mme_ue, pti);
|
||||
d_assert(sess, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "No Bearer Context");
|
||||
|
||||
/* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM.
|
||||
|
@ -58,7 +64,7 @@ static void event_emm_to_esm(
|
|||
esm_message_container->data, esm_message_container->len);
|
||||
|
||||
event_set(&e, MME_EVT_ESM_MESSAGE);
|
||||
event_set_param1(&e, (c_uintptr_t)bearer->index);
|
||||
event_set_param1(&e, (c_uintptr_t)sess->index);
|
||||
event_set_param3(&e, (c_uintptr_t)esmbuf);
|
||||
mme_event_send(&e);
|
||||
}
|
||||
|
@ -162,7 +168,6 @@ void emm_handle_attach_accept(mme_sess_t *sess)
|
|||
status_t rv;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
pkbuf_t *esmbuf = NULL, *emmbuf = NULL, *s1apbuf = NULL;
|
||||
|
||||
d_assert(sess, return, "Null param");
|
||||
|
@ -170,14 +175,12 @@ void emm_handle_attach_accept(mme_sess_t *sess)
|
|||
d_assert(mme_ue, return, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
|
||||
rv = esm_build_activate_default_bearer_context(&esmbuf, bearer);
|
||||
rv = esm_build_activate_default_bearer_context(&esmbuf, sess);
|
||||
d_assert(rv == CORE_OK && esmbuf, return, "esm build error");
|
||||
|
||||
d_trace(3, "[NAS] Activate default bearer context request : "
|
||||
"EMM <-- ESM[%d]\n", bearer->ebi);
|
||||
"EMM <-- ESM[%d]\n", sess->ebi);
|
||||
|
||||
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
|
||||
d_assert(rv == CORE_OK && emmbuf,
|
||||
|
@ -185,7 +188,7 @@ void emm_handle_attach_accept(mme_sess_t *sess)
|
|||
|
||||
d_trace(3, "[NAS] Attach accept : UE[%s] <-- EMM\n", mme_ue->imsi_bcd);
|
||||
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, emmbuf);
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, sess, emmbuf);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
pkbuf_free(emmbuf); return, "s1ap build error");
|
||||
|
||||
|
@ -554,17 +557,14 @@ void emm_handle_service_request(
|
|||
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);
|
||||
rv = s1ap_build_initial_context_setup_request(&s1apbuf, sess, NULL);
|
||||
d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error");
|
||||
|
||||
d_assert(nas_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error");
|
||||
|
|
|
@ -28,13 +28,13 @@ status_t esm_build_pdn_connectivity_reject(
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer)
|
||||
status_t esm_build_information_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
||||
{
|
||||
nas_message_t message;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
|
@ -43,7 +43,7 @@ status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer)
|
|||
message.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM;
|
||||
|
||||
message.esm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_ESM;
|
||||
message.esm.h.procedure_transaction_identity = bearer->pti;
|
||||
message.esm.h.procedure_transaction_identity = sess->pti;
|
||||
message.esm.h.message_type = NAS_ESM_INFORMATION_REQUEST;
|
||||
|
||||
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
|
||||
|
@ -53,7 +53,7 @@ status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer)
|
|||
}
|
||||
|
||||
status_t esm_build_activate_default_bearer_context(
|
||||
pkbuf_t **pkbuf, mme_bearer_t *bearer)
|
||||
pkbuf_t **pkbuf, mme_sess_t *sess)
|
||||
{
|
||||
nas_message_t message;
|
||||
nas_activate_default_eps_bearer_context_request_t
|
||||
|
@ -72,11 +72,8 @@ status_t esm_build_activate_default_bearer_context(
|
|||
->protocol_configuration_options;
|
||||
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
pdn_t *pdn = NULL;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
@ -84,9 +81,9 @@ status_t esm_build_activate_default_bearer_context(
|
|||
d_assert(pdn, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(&message, 0, sizeof(message));
|
||||
message.esm.h.eps_bearer_identity = bearer->ebi;
|
||||
message.esm.h.eps_bearer_identity = sess->ebi;
|
||||
message.esm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_ESM;
|
||||
message.esm.h.procedure_transaction_identity = bearer->pti;
|
||||
message.esm.h.procedure_transaction_identity = sess->pti;
|
||||
message.esm.h.message_type =
|
||||
NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST;
|
||||
|
||||
|
@ -116,13 +113,13 @@ status_t esm_build_activate_default_bearer_context(
|
|||
apn_ambr_build(apn_ambr, pdn->ambr.downlink, pdn->ambr.uplink);
|
||||
}
|
||||
|
||||
if (bearer->pgw_pco_len)
|
||||
if (sess->pgw_pco_len)
|
||||
{
|
||||
activate_default_eps_bearer_context_request->presencemask |=
|
||||
NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
|
||||
protocol_configuration_options->length = bearer->pgw_pco_len;
|
||||
protocol_configuration_options->length = sess->pgw_pco_len;
|
||||
memcpy(protocol_configuration_options->buffer,
|
||||
bearer->pgw_pco, protocol_configuration_options->length);
|
||||
sess->pgw_pco, protocol_configuration_options->length);
|
||||
}
|
||||
|
||||
d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,,);
|
||||
|
|
|
@ -11,10 +11,10 @@ CORE_DECLARE(status_t) esm_build_pdn_connectivity_reject(pkbuf_t **pkbuf,
|
|||
c_uint8_t pti, nas_esm_cause_t esm_cause);
|
||||
|
||||
CORE_DECLARE(status_t) esm_build_information_request(pkbuf_t **pkbuf,
|
||||
mme_bearer_t *bearer);
|
||||
mme_sess_t *sess);
|
||||
|
||||
CORE_DECLARE(status_t) esm_build_activate_default_bearer_context(
|
||||
pkbuf_t **pkbuf, mme_bearer_t *bearer);
|
||||
pkbuf_t **pkbuf, mme_sess_t *sess);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -11,19 +11,21 @@
|
|||
#include "s1ap_path.h"
|
||||
#include "nas_path.h"
|
||||
|
||||
void esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
||||
void esm_handle_pdn_connectivity_request(mme_sess_t *sess,
|
||||
nas_pdn_connectivity_request_t *pdn_connectivity_request)
|
||||
{
|
||||
d_assert(sess, return, "Null param");
|
||||
|
||||
if (pdn_connectivity_request->presencemask &
|
||||
NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT)
|
||||
{
|
||||
nas_protocol_configuration_options_t *protocol_configuration_options =
|
||||
&pdn_connectivity_request->protocol_configuration_options;
|
||||
bearer->ue_pco_len = protocol_configuration_options->length;
|
||||
d_assert(bearer->ue_pco_len <= MAX_PCO_LEN, return,
|
||||
"length(%d) exceeds MAX:%d", bearer->ue_pco_len, MAX_PCO_LEN);
|
||||
memcpy(bearer->ue_pco, protocol_configuration_options->buffer,
|
||||
bearer->ue_pco_len);
|
||||
sess->ue_pco_len = protocol_configuration_options->length;
|
||||
d_assert(sess->ue_pco_len <= MAX_PCO_LEN, return,
|
||||
"length(%d) exceeds MAX:%d", sess->ue_pco_len, MAX_PCO_LEN);
|
||||
memcpy(sess->ue_pco, protocol_configuration_options->buffer,
|
||||
sess->ue_pco_len);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -32,31 +34,25 @@ void esm_handle_information_request(mme_sess_t *sess)
|
|||
status_t rv;
|
||||
pkbuf_t *esmbuf = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(sess, return, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
|
||||
rv = esm_build_information_request(&esmbuf, bearer);
|
||||
rv = esm_build_information_request(&esmbuf, sess);
|
||||
d_assert(rv == CORE_OK && esmbuf, return, "esm_build failed");
|
||||
d_assert(nas_send_to_downlink_nas_transport(mme_ue, esmbuf) == CORE_OK,,);
|
||||
}
|
||||
|
||||
|
||||
void esm_handle_information_response(mme_bearer_t *bearer,
|
||||
void esm_handle_information_response(mme_sess_t *sess,
|
||||
nas_esm_information_response_t *esm_information_response)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
|
||||
d_assert(bearer, return, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
|
||||
if (esm_information_response->presencemask &
|
||||
NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT)
|
||||
|
@ -72,10 +68,10 @@ void esm_handle_information_response(mme_bearer_t *bearer,
|
|||
{
|
||||
nas_protocol_configuration_options_t *protocol_configuration_options =
|
||||
&esm_information_response->protocol_configuration_options;
|
||||
bearer->ue_pco_len = protocol_configuration_options->length;
|
||||
d_assert(bearer->ue_pco_len <= MAX_PCO_LEN, return,
|
||||
"length(%d) exceeds MAX:%d", bearer->ue_pco_len, MAX_PCO_LEN);
|
||||
memcpy(bearer->ue_pco, protocol_configuration_options->buffer,
|
||||
bearer->ue_pco_len);
|
||||
sess->ue_pco_len = protocol_configuration_options->length;
|
||||
d_assert(sess->ue_pco_len <= MAX_PCO_LEN, return,
|
||||
"length(%d) exceeds MAX:%d", sess->ue_pco_len, MAX_PCO_LEN);
|
||||
memcpy(sess->ue_pco, protocol_configuration_options->buffer,
|
||||
sess->ue_pco_len);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,10 +9,10 @@
|
|||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
CORE_DECLARE(void) esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
||||
CORE_DECLARE(void) esm_handle_pdn_connectivity_request(mme_sess_t *sess,
|
||||
nas_pdn_connectivity_request_t *pdn_connectivity_request);
|
||||
CORE_DECLARE(void) esm_handle_information_request(mme_sess_t *sess);
|
||||
CORE_DECLARE(void) esm_handle_information_response(mme_bearer_t *bearer,
|
||||
CORE_DECLARE(void) esm_handle_information_response(mme_sess_t *sess,
|
||||
nas_esm_information_response_t *bearer_information_response);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -47,15 +47,12 @@ void esm_state_operational(fsm_t *s, event_t *e)
|
|||
case MME_EVT_ESM_MESSAGE:
|
||||
{
|
||||
index_t index = event_get_param1(e);
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
nas_message_t *message = NULL;
|
||||
|
||||
d_assert(index, return, "Null param");
|
||||
bearer = mme_bearer_find(index);
|
||||
d_assert(bearer, return, "Null param");
|
||||
sess = bearer->sess;
|
||||
sess = mme_sess_find(index);
|
||||
d_assert(sess, return, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
|
@ -70,10 +67,10 @@ void esm_state_operational(fsm_t *s, event_t *e)
|
|||
case NAS_PDN_CONNECTIVITY_REQUEST:
|
||||
{
|
||||
esm_handle_pdn_connectivity_request(
|
||||
bearer, &message->esm.pdn_connectivity_request);
|
||||
sess, &message->esm.pdn_connectivity_request);
|
||||
d_trace(3, "[NAS] PDN connectivity request : "
|
||||
"UE[%s] --> ESM[%d]\n",
|
||||
mme_ue->imsi_bcd, bearer->pti);
|
||||
mme_ue->imsi_bcd, sess->pti);
|
||||
|
||||
if (!MME_UE_HAVE_IMSI(mme_ue))
|
||||
{
|
||||
|
@ -117,9 +114,9 @@ void esm_state_operational(fsm_t *s, event_t *e)
|
|||
{
|
||||
d_trace(3, "[NAS] ESM information response : "
|
||||
"UE[%s] --> ESM[%d]\n",
|
||||
mme_ue->imsi_bcd, bearer->pti);
|
||||
mme_ue->imsi_bcd, sess->pti);
|
||||
esm_handle_information_response(
|
||||
bearer, &message->esm.esm_information_response);
|
||||
sess, &message->esm.esm_information_response);
|
||||
|
||||
mme_s11_handle_create_session_request(sess);
|
||||
break;
|
||||
|
@ -128,7 +125,7 @@ void esm_state_operational(fsm_t *s, event_t *e)
|
|||
{
|
||||
d_trace(3, "[NAS] Activate default eps bearer "
|
||||
"context accept : UE[%s] --> ESM[%d]\n",
|
||||
mme_ue->imsi_bcd, bearer->pti);
|
||||
mme_ue->imsi_bcd, sess->pti);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
@ -1405,14 +1405,21 @@ status_t mme_ue_reset_ebi(mme_ue_t *mme_ue)
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
mme_bearer_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti)
|
||||
mme_sess_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(mme_ue, return NULL, "Null param");
|
||||
d_assert(pti != NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED,
|
||||
return NULL, "Invalid PTI(%d)", pti);
|
||||
|
||||
index_alloc(&mme_sess_pool, &sess);
|
||||
d_assert(sess, return NULL, "Null param");
|
||||
|
||||
sess->pti = pti;
|
||||
sess->ebi = NEXT_ID(mme_ue->ebi, MIN_EPS_BEARER_ID, MAX_EPS_BEARER_ID);
|
||||
|
||||
sess->mme_s11_teid = sess->index;
|
||||
sess->mme_s11_addr = mme_self()->s11_addr;
|
||||
|
||||
|
@ -1422,11 +1429,14 @@ mme_bearer_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti)
|
|||
sess->mme_ue = mme_ue;
|
||||
sess->sgw = mme_sgw_first();
|
||||
|
||||
bearer = mme_bearer_add(sess, pti);
|
||||
bearer = mme_bearer_add(sess);
|
||||
d_assert(bearer, mme_sess_remove(sess); return NULL,
|
||||
"Can't add default bearer context");
|
||||
|
||||
return bearer;
|
||||
fsm_create(&sess->sm, esm_state_initial, esm_state_final);
|
||||
fsm_init(&sess->sm, 0);
|
||||
|
||||
return sess;
|
||||
}
|
||||
|
||||
status_t mme_sess_remove(mme_sess_t *sess)
|
||||
|
@ -1434,6 +1444,9 @@ status_t mme_sess_remove(mme_sess_t *sess)
|
|||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
d_assert(sess->mme_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
fsm_final(&sess->sm, 0);
|
||||
fsm_clear(&sess->sm);
|
||||
|
||||
mme_bearer_remove_all(sess);
|
||||
|
||||
list_remove(&sess->mme_ue->sess_list, sess);
|
||||
|
@ -1470,22 +1483,31 @@ mme_sess_t* mme_sess_find_by_teid(c_uint32_t teid)
|
|||
return mme_sess_find(teid);
|
||||
}
|
||||
|
||||
mme_sess_t* mme_sess_find_by_ebi(mme_ue_t *mme_ue, c_uint8_t ebi)
|
||||
mme_sess_t* mme_sess_find_by_pti(mme_ue_t *mme_ue, c_uint8_t pti)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while (sess)
|
||||
{
|
||||
bearer = mme_bearer_first(sess);
|
||||
while (bearer)
|
||||
{
|
||||
if (ebi == bearer->ebi)
|
||||
return sess;
|
||||
if (pti == sess->pti)
|
||||
return sess;
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mme_sess_t* mme_sess_find_by_ebi(mme_ue_t *mme_ue, c_uint8_t ebi)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while (sess)
|
||||
{
|
||||
if (ebi == sess->ebi)
|
||||
return sess;
|
||||
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
|
@ -1495,7 +1517,6 @@ mme_sess_t* mme_sess_find_by_ebi(mme_ue_t *mme_ue, c_uint8_t ebi)
|
|||
|
||||
mme_sess_t* mme_sess_find_by_last_esm_message(mme_ue_t *mme_ue)
|
||||
{
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
nas_message_t *message = NULL;
|
||||
|
||||
|
@ -1507,11 +1528,9 @@ mme_sess_t* mme_sess_find_by_last_esm_message(mme_ue_t *mme_ue)
|
|||
{
|
||||
case NAS_PDN_CONNECTIVITY_REQUEST:
|
||||
{
|
||||
bearer = mme_bearer_find_by_ue_pti(mme_ue,
|
||||
sess = mme_sess_find_by_pti(mme_ue,
|
||||
message->esm.h.procedure_transaction_identity);
|
||||
|
||||
if (bearer) sess = bearer->sess;
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -1533,7 +1552,7 @@ mme_sess_t* mme_sess_next(mme_sess_t *sess)
|
|||
return list_next(sess);
|
||||
}
|
||||
|
||||
mme_bearer_t* mme_bearer_add(mme_sess_t *sess, c_uint8_t pti)
|
||||
mme_bearer_t* mme_bearer_add(mme_sess_t *sess)
|
||||
{
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
@ -1545,17 +1564,11 @@ mme_bearer_t* mme_bearer_add(mme_sess_t *sess, c_uint8_t pti)
|
|||
index_alloc(&mme_bearer_pool, &bearer);
|
||||
d_assert(bearer, return NULL, "Null param");
|
||||
|
||||
bearer->pti = pti;
|
||||
bearer->ebi = NEXT_ID(mme_ue->ebi, MIN_EPS_BEARER_ID, MAX_EPS_BEARER_ID);
|
||||
|
||||
list_append(&sess->bearer_list, bearer);
|
||||
|
||||
bearer->mme_ue = mme_ue;
|
||||
bearer->sess = sess;
|
||||
|
||||
fsm_create(&bearer->sm, esm_state_initial, esm_state_final);
|
||||
fsm_init(&bearer->sm, 0);
|
||||
|
||||
return bearer;
|
||||
}
|
||||
|
||||
|
@ -1564,9 +1577,6 @@ status_t mme_bearer_remove(mme_bearer_t *bearer)
|
|||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
d_assert(bearer->sess, return CORE_ERROR, "Null param");
|
||||
|
||||
fsm_final(&bearer->sm, 0);
|
||||
fsm_clear(&bearer->sm);
|
||||
|
||||
list_remove(&bearer->sess->bearer_list, bearer);
|
||||
index_free(&mme_bearer_pool, bearer);
|
||||
|
||||
|
@ -1598,74 +1608,6 @@ mme_bearer_t* mme_bearer_find(index_t index)
|
|||
return index_find(&mme_bearer_pool, index);
|
||||
}
|
||||
|
||||
mme_bearer_t* mme_bearer_find_by_ue_pti(mme_ue_t *mme_ue, c_uint8_t pti)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(mme_ue, return NULL, "Null param");
|
||||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while (sess)
|
||||
{
|
||||
bearer = mme_bearer_first(sess);
|
||||
while (bearer)
|
||||
{
|
||||
if (pti == bearer->pti)
|
||||
return bearer;
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mme_bearer_t* mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, c_uint8_t ebi)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(mme_ue, return NULL, "Null param");
|
||||
|
||||
sess = mme_sess_first(mme_ue);
|
||||
while (sess)
|
||||
{
|
||||
bearer = mme_bearer_first(sess);
|
||||
while (bearer)
|
||||
{
|
||||
if (ebi == bearer->ebi)
|
||||
return bearer;
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
|
||||
sess = mme_sess_next(sess);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mme_bearer_t* mme_bearer_find_by_sess_ebi(mme_sess_t *sess, c_uint8_t ebi)
|
||||
{
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(sess, return NULL, "Null param");
|
||||
|
||||
bearer = mme_bearer_first(sess);
|
||||
while (bearer)
|
||||
{
|
||||
if (ebi == bearer->ebi)
|
||||
return bearer;
|
||||
|
||||
bearer = mme_bearer_next(bearer);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mme_bearer_t* mme_default_bearer_in_sess(mme_sess_t *sess)
|
||||
{
|
||||
return mme_bearer_first(sess);
|
||||
|
|
|
@ -229,6 +229,10 @@ struct _mme_ue_t {
|
|||
typedef struct _mme_sess_t {
|
||||
lnode_t node; /* A node of list_t */
|
||||
index_t index; /* An index of this node */
|
||||
fsm_t sm; /* State Machine */
|
||||
|
||||
c_uint8_t pti; /* Procedure Trasaction Identity */
|
||||
c_uint8_t ebi; /* EPS Bearer ID */
|
||||
|
||||
/* IMPORTANT!
|
||||
* MME-S11-TEID is same with an index */
|
||||
|
@ -246,6 +250,12 @@ typedef struct _mme_sess_t {
|
|||
c_uint32_t sgw_s11_teid;
|
||||
c_uint32_t sgw_s11_addr;
|
||||
|
||||
/* Protocol Configuration Options */
|
||||
c_uint8_t ue_pco[MAX_PCO_LEN];
|
||||
int ue_pco_len;
|
||||
c_uint8_t pgw_pco[MAX_PCO_LEN];
|
||||
int pgw_pco_len;
|
||||
|
||||
/* mme_bearer_first(sess) : Default Bearer Context */
|
||||
list_t bearer_list;
|
||||
|
||||
|
@ -261,22 +271,12 @@ typedef struct _mme_sess_t {
|
|||
typedef struct _mme_bearer_t {
|
||||
lnode_t node; /* A node of list_t */
|
||||
index_t index; /* An index of this node */
|
||||
fsm_t sm; /* State Machine */
|
||||
|
||||
c_uint8_t pti; /* Procedure Trasaction Identity */
|
||||
c_uint8_t ebi; /* EPS Bearer ID */
|
||||
|
||||
c_uint32_t enb_s1u_teid;
|
||||
c_uint32_t enb_s1u_addr;
|
||||
c_uint32_t sgw_s1u_teid;
|
||||
c_uint32_t sgw_s1u_addr;
|
||||
|
||||
/* Protocol Configuration Options */
|
||||
c_uint8_t ue_pco[MAX_PCO_LEN];
|
||||
int ue_pco_len;
|
||||
c_uint8_t pgw_pco[MAX_PCO_LEN];
|
||||
int pgw_pco_len;
|
||||
|
||||
/* Related Context */
|
||||
mme_ue_t *mme_ue;
|
||||
mme_sess_t *sess;
|
||||
|
@ -325,27 +325,23 @@ CORE_DECLARE(hash_index_t *) mme_ue_first();
|
|||
CORE_DECLARE(hash_index_t *) mme_ue_next(hash_index_t *hi);
|
||||
CORE_DECLARE(mme_ue_t *) mme_ue_this(hash_index_t *hi);
|
||||
|
||||
CORE_DECLARE(mme_bearer_t*) mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti);
|
||||
CORE_DECLARE(mme_sess_t*) mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti);
|
||||
CORE_DECLARE(status_t ) mme_sess_remove(mme_sess_t *sess);
|
||||
CORE_DECLARE(status_t ) mme_sess_remove_all(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(mme_sess_t*) mme_sess_find(index_t index);
|
||||
CORE_DECLARE(mme_sess_t*) mme_sess_find_by_teid(c_uint32_t teid);
|
||||
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_last_esm_message(mme_ue_t *mme_ue);
|
||||
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);
|
||||
|
||||
CORE_DECLARE(mme_bearer_t*) mme_bearer_add(mme_sess_t *sess, c_uint8_t pti);
|
||||
CORE_DECLARE(mme_bearer_t*) mme_bearer_add(mme_sess_t *sess);
|
||||
CORE_DECLARE(status_t) mme_bearer_remove(mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_bearer_remove_all(mme_sess_t *sess);
|
||||
CORE_DECLARE(mme_bearer_t*) mme_bearer_find(index_t index);
|
||||
CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_ue_pti(
|
||||
mme_ue_t *mme_ue, c_uint8_t pti);
|
||||
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_by_sess_ebi(
|
||||
mme_sess_t *sess, c_uint8_t ebi);
|
||||
CORE_DECLARE(mme_bearer_t*) mme_default_bearer_in_sess(mme_sess_t *sess);
|
||||
CORE_DECLARE(mme_bearer_t*) mme_bearer_first(mme_sess_t *sess);
|
||||
CORE_DECLARE(mme_bearer_t*) mme_bearer_next(mme_bearer_t *bearer);
|
||||
|
|
|
@ -14,7 +14,6 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
pdn_t *pdn = NULL;
|
||||
mme_sgw_t *sgw = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
gtp_message_t gtp_message;
|
||||
gtp_create_session_request_t *req = >p_message.create_session_request;
|
||||
|
||||
|
@ -30,8 +29,6 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
sgw = sess->sgw;
|
||||
d_assert(sgw, return CORE_ERROR, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
pdn = sess->pdn;
|
||||
d_assert(pdn, return CORE_ERROR, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
|
@ -117,16 +114,16 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
req->aggregate_maximum_bit_rate.len = sizeof(ambr);
|
||||
}
|
||||
|
||||
if (bearer->ue_pco_len)
|
||||
if (sess->ue_pco_len)
|
||||
{
|
||||
req->protocol_configuration_options.presence = 1;
|
||||
req->protocol_configuration_options.data = bearer->ue_pco;
|
||||
req->protocol_configuration_options.len = bearer->ue_pco_len;
|
||||
req->protocol_configuration_options.data = sess->ue_pco;
|
||||
req->protocol_configuration_options.len = sess->ue_pco_len;
|
||||
}
|
||||
|
||||
req->bearer_contexts_to_be_created.presence = 1;
|
||||
req->bearer_contexts_to_be_created.eps_bearer_id.presence = 1;
|
||||
req->bearer_contexts_to_be_created.eps_bearer_id.u8 = bearer->ebi;
|
||||
req->bearer_contexts_to_be_created.eps_bearer_id.u8 = sess->ebi;
|
||||
|
||||
memset(&bearer_qos, 0, sizeof(bearer_qos));
|
||||
bearer_qos.qci = pdn->qos.qci;
|
||||
|
@ -164,13 +161,19 @@ status_t mme_s11_build_modify_bearer_request(
|
|||
gtp_message_t gtp_message;
|
||||
gtp_modify_bearer_request_t *req = >p_message.modify_bearer_request;
|
||||
|
||||
mme_sess_t *sess = NULL;
|
||||
|
||||
gtp_f_teid_t enb_s1u_teid;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(>p_message, 0, sizeof(gtp_message_t));
|
||||
|
||||
req->bearer_contexts_to_be_modified.presence = 1;
|
||||
req->bearer_contexts_to_be_modified.eps_bearer_id.presence = 1;
|
||||
req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = bearer->ebi;
|
||||
req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = sess->ebi;
|
||||
|
||||
/* Send Data Plane(DL) : ENB-S1U */
|
||||
memset(&enb_s1u_teid, 0, sizeof(gtp_f_teid_t));
|
||||
|
@ -194,7 +197,6 @@ status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
status_t rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
gtp_message_t gtp_message;
|
||||
mme_bearer_t *bearer;
|
||||
gtp_delete_session_request_t *req = >p_message.delete_session_request;
|
||||
|
||||
gtp_uli_t uli;
|
||||
|
@ -207,12 +209,8 @@ status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_sess_t *sess)
|
|||
|
||||
memset(>p_message, 0, sizeof(gtp_message_t));
|
||||
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
if (bearer)
|
||||
{
|
||||
req->linked_eps_bearer_id.presence = 1;
|
||||
req->linked_eps_bearer_id.u8 = bearer->ebi;
|
||||
}
|
||||
req->linked_eps_bearer_id.presence = 1;
|
||||
req->linked_eps_bearer_id.u8 = sess->ebi;
|
||||
|
||||
memset(&uli, 0, sizeof(gtp_uli_t));
|
||||
uli.flags.e_cgi = 1;
|
||||
|
|
|
@ -41,8 +41,12 @@ void mme_s11_handle_create_session_response(
|
|||
mme_bearer_t *bearer = NULL;
|
||||
pdn_t *pdn = NULL;
|
||||
|
||||
d_assert(sess, return, "Null param");
|
||||
d_assert(rsp, return, "Null param");
|
||||
d_assert(sess, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
pdn = sess->pdn;
|
||||
d_assert(pdn, return, "Null param");
|
||||
|
||||
if (rsp->sender_f_teid_for_control_plane.presence == 0)
|
||||
{
|
||||
|
@ -70,12 +74,6 @@ void mme_s11_handle_create_session_response(
|
|||
return;
|
||||
}
|
||||
|
||||
bearer = mme_bearer_find_by_sess_ebi(
|
||||
sess, rsp->bearer_contexts_created.eps_bearer_id.u8);
|
||||
d_assert(bearer, return, "No ESM Context");
|
||||
pdn = sess->pdn;
|
||||
d_assert(pdn, return, "No PDN Context");
|
||||
|
||||
/* Receive Control Plane(UL) : SGW-S11 */
|
||||
sgw_s11_teid = rsp->sender_f_teid_for_control_plane.data;
|
||||
sess->sgw_s11_teid = ntohl(sgw_s11_teid->teid);
|
||||
|
@ -86,9 +84,9 @@ void mme_s11_handle_create_session_response(
|
|||
|
||||
if (rsp->protocol_configuration_options.presence)
|
||||
{
|
||||
bearer->pgw_pco_len = rsp->protocol_configuration_options.len;
|
||||
memcpy(bearer->pgw_pco, rsp->protocol_configuration_options.data,
|
||||
bearer->pgw_pco_len);
|
||||
sess->pgw_pco_len = rsp->protocol_configuration_options.len;
|
||||
memcpy(sess->pgw_pco, rsp->protocol_configuration_options.data,
|
||||
sess->pgw_pco_len);
|
||||
}
|
||||
|
||||
/* Receive Data Plane(UL) : SGW-S1U */
|
||||
|
@ -143,7 +141,6 @@ void mme_s11_handle_downlink_data_notification(
|
|||
gtp_downlink_data_notification_t *noti)
|
||||
{
|
||||
status_t rv;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
pkbuf_t *s11buf = NULL;
|
||||
|
||||
d_assert(xact, return, "Null param");
|
||||
|
@ -153,9 +150,6 @@ void mme_s11_handle_downlink_data_notification(
|
|||
d_trace(3, "[GTP] Downlink Data Notification : "
|
||||
"MME[%d] <-- SGW[%d]\n", sess->mme_s11_teid, sess->sgw_s11_teid);
|
||||
|
||||
bearer = mme_bearer_find_by_sess_ebi(sess, noti->eps_bearer_id.u8);
|
||||
d_assert(bearer, return, "No ESM Context");
|
||||
|
||||
/* Build Downlink data notification ack */
|
||||
rv = mme_s11_build_downlink_data_notification_ack(&s11buf, sess);
|
||||
d_assert(rv == CORE_OK, return, "S11 build error");
|
||||
|
|
|
@ -236,32 +236,26 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
{
|
||||
nas_message_t message;
|
||||
index_t index = event_get_param1(e);
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
pkbuf_t *pkbuf = NULL;
|
||||
|
||||
d_assert(index, break, "Null param");
|
||||
bearer = mme_bearer_find(index);
|
||||
d_assert(bearer, break, "No ESM context");
|
||||
d_assert(mme_ue = bearer->mme_ue, break, "No UE context");
|
||||
d_assert(FSM_STATE(&bearer->sm), break, "No ESM State Machine");
|
||||
sess = mme_sess_find(index);
|
||||
d_assert(sess, break, "No Session context");
|
||||
d_assert(mme_ue = sess->mme_ue, break, "No UE context");
|
||||
d_assert(FSM_STATE(&sess->sm), break, "No ESM State Machine");
|
||||
|
||||
if (event_get(e) == MME_EVT_ESM_MESSAGE)
|
||||
{
|
||||
pkbuf = (pkbuf_t *)event_get_param3(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");
|
||||
pkbuf = (pkbuf_t *)event_get_param3(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");
|
||||
|
||||
event_set_param4(e, (c_uintptr_t)&message);
|
||||
}
|
||||
event_set_param4(e, (c_uintptr_t)&message);
|
||||
|
||||
fsm_dispatch(&bearer->sm, (fsm_event_t*)e);
|
||||
fsm_dispatch(&sess->sm, (fsm_event_t*)e);
|
||||
|
||||
if (event_get(e) == MME_EVT_ESM_MESSAGE)
|
||||
{
|
||||
pkbuf_free(pkbuf);
|
||||
}
|
||||
pkbuf_free(pkbuf);
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ status_t s1ap_build_downlink_nas_transport(
|
|||
}
|
||||
|
||||
status_t s1ap_build_initial_context_setup_request(
|
||||
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *emmbuf)
|
||||
pkbuf_t **s1apbuf, mme_sess_t *sess, pkbuf_t *emmbuf)
|
||||
{
|
||||
char buf[INET_ADDRSTRLEN];
|
||||
|
||||
|
@ -163,13 +163,13 @@ status_t s1ap_build_initial_context_setup_request(
|
|||
S1ap_NAS_PDU_t *nasPdu = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
s6a_subscription_data_t *subscription_data = NULL;
|
||||
pdn_t *pdn = NULL;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
mme_ue = sess->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
|
@ -193,7 +193,7 @@ status_t s1ap_build_initial_context_setup_request(
|
|||
|
||||
e_rab = (S1ap_E_RABToBeSetupItemCtxtSUReq_t *)
|
||||
core_calloc(1, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t));
|
||||
e_rab->e_RAB_ID = bearer->ebi;
|
||||
e_rab->e_RAB_ID = sess->ebi;
|
||||
e_rab->e_RABlevelQoSParameters.qCI = pdn->qos.qci;
|
||||
|
||||
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
|
||||
|
|
|
@ -14,7 +14,7 @@ CORE_DECLARE(status_t) s1ap_build_setup_failure(
|
|||
CORE_DECLARE(status_t) s1ap_build_downlink_nas_transport(
|
||||
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, pkbuf_t *emmbuf);
|
||||
CORE_DECLARE(status_t) s1ap_build_initial_context_setup_request(
|
||||
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *emmbuf);
|
||||
pkbuf_t **s1apbuf, mme_sess_t *sess, pkbuf_t *emmbuf);
|
||||
CORE_DECLARE(status_t) s1ap_build_ue_context_release_commmand(
|
||||
pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_t *cause);
|
||||
CORE_DECLARE(status_t) s1ap_build_paging(pkbuf_t **s1apbuf, mme_ue_t *mme_ue);
|
||||
|
|
|
@ -92,7 +92,7 @@ static void event_s1ap_to_nas(enb_ue_t *enb_ue, S1ap_NAS_PDU_t *nasPdu)
|
|||
}
|
||||
else if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_ESM)
|
||||
{
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_ue_t *mme_ue = enb_ue->mme_ue;
|
||||
|
||||
if (!mme_ue)
|
||||
|
@ -102,12 +102,11 @@ static void event_s1ap_to_nas(enb_ue_t *enb_ue, S1ap_NAS_PDU_t *nasPdu)
|
|||
return;
|
||||
}
|
||||
|
||||
bearer = mme_bearer_find_by_ue_pti(mme_ue,
|
||||
h->procedure_transaction_identity);
|
||||
if (bearer)
|
||||
sess = mme_sess_find_by_pti(mme_ue, h->procedure_transaction_identity);
|
||||
if (sess)
|
||||
{
|
||||
event_set(&e, MME_EVT_ESM_MESSAGE);
|
||||
event_set_param1(&e, (c_uintptr_t)bearer->index);
|
||||
event_set_param1(&e, (c_uintptr_t)sess->index);
|
||||
event_set_param2(&e, (c_uintptr_t)security_header_type.type);
|
||||
event_set_param3(&e, (c_uintptr_t)nasbuf);
|
||||
mme_event_send(&e);
|
||||
|
@ -406,7 +405,9 @@ void s1ap_handle_initial_context_setup_response(
|
|||
ies->e_RABSetupListCtxtSURes.s1ap_E_RABSetupItemCtxtSURes.array[i];
|
||||
d_assert(e_rab, return, "Null param");
|
||||
|
||||
bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID);
|
||||
sess = mme_sess_find_by_ebi(mme_ue, e_rab->e_RAB_ID);
|
||||
d_assert(sess, return, "Null param");
|
||||
bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf,
|
||||
sizeof(bearer->enb_s1u_teid));
|
||||
|
@ -414,9 +415,6 @@ void s1ap_handle_initial_context_setup_response(
|
|||
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||
sizeof(bearer->enb_s1u_addr));
|
||||
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return, "Null param");
|
||||
|
||||
rv = mme_s11_build_modify_bearer_request(&pkbuf, bearer);
|
||||
d_assert(rv == CORE_OK, return, "S11 build error");
|
||||
|
||||
|
|
|
@ -484,7 +484,7 @@ static void *sess_hash_keygen(c_uint8_t *out, int *out_len,
|
|||
return out;
|
||||
}
|
||||
|
||||
pgw_bearer_t *pgw_sess_add(
|
||||
pgw_sess_t *pgw_sess_add(
|
||||
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id)
|
||||
{
|
||||
pgw_sess_t *sess = NULL;
|
||||
|
@ -521,7 +521,7 @@ pgw_bearer_t *pgw_sess_add(
|
|||
imsi, imsi_len, apn);
|
||||
hash_set(self.sess_hash, sess->hash_keybuf, sess->hash_keylen, sess);
|
||||
|
||||
return bearer;
|
||||
return sess;
|
||||
}
|
||||
|
||||
status_t pgw_sess_remove(pgw_sess_t *sess)
|
||||
|
@ -600,11 +600,9 @@ pgw_sess_t *pgw_sess_find_or_add_by_message(gtp_message_t *gtp_message)
|
|||
sess = pgw_sess_find_by_imsi_apn(req->imsi.data, req->imsi.len, apn);
|
||||
if (!sess)
|
||||
{
|
||||
pgw_bearer_t *bearer = NULL;
|
||||
bearer = pgw_sess_add(req->imsi.data, req->imsi.len, apn,
|
||||
sess = pgw_sess_add(req->imsi.data, req->imsi.len, apn,
|
||||
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
|
||||
d_assert(bearer, return NULL, "No Bearer Context");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return NULL, "No Session Context");
|
||||
}
|
||||
|
||||
return sess;
|
||||
|
|
|
@ -119,7 +119,7 @@ CORE_DECLARE(pgw_context_t*) pgw_self(void);
|
|||
CORE_DECLARE(status_t) pgw_context_parse_config(void);
|
||||
CORE_DECLARE(status_t) pgw_context_setup_trace_module(void);
|
||||
|
||||
CORE_DECLARE(pgw_bearer_t*) pgw_sess_add(
|
||||
CORE_DECLARE(pgw_sess_t*) pgw_sess_add(
|
||||
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id);
|
||||
CORE_DECLARE(status_t ) pgw_sess_remove(pgw_sess_t *sess);
|
||||
CORE_DECLARE(status_t ) pgw_sess_remove_all();
|
||||
|
|
|
@ -445,7 +445,7 @@ static void *sess_hash_keygen(c_uint8_t *out, int *out_len,
|
|||
return out;
|
||||
}
|
||||
|
||||
sgw_bearer_t *sgw_sess_add(
|
||||
sgw_sess_t *sgw_sess_add(
|
||||
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id)
|
||||
{
|
||||
sgw_sess_t *sess = NULL;
|
||||
|
@ -481,7 +481,7 @@ sgw_bearer_t *sgw_sess_add(
|
|||
imsi, imsi_len, apn);
|
||||
hash_set(self.sess_hash, sess->hash_keybuf, sess->hash_keylen, sess);
|
||||
|
||||
return bearer;
|
||||
return sess;
|
||||
}
|
||||
|
||||
status_t sgw_sess_remove(sgw_sess_t *sess)
|
||||
|
@ -558,11 +558,9 @@ sgw_sess_t *sgw_sess_find_or_add_by_message(gtp_message_t *gtp_message)
|
|||
sess = sgw_sess_find_by_imsi_apn(req->imsi.data, req->imsi.len, apn);
|
||||
if (!sess)
|
||||
{
|
||||
sgw_bearer_t *bearer = NULL;
|
||||
bearer = sgw_sess_add(req->imsi.data, req->imsi.len, apn,
|
||||
sess = sgw_sess_add(req->imsi.data, req->imsi.len, apn,
|
||||
req->bearer_contexts_to_be_created.eps_bearer_id.u8);
|
||||
d_assert(bearer, return NULL, "No Bearer Context");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return NULL, "No Session Context");
|
||||
}
|
||||
|
||||
return sess;
|
||||
|
|
|
@ -126,7 +126,7 @@ CORE_DECLARE(sgw_context_t*) sgw_self(void);
|
|||
CORE_DECLARE(status_t) sgw_context_parse_config(void);
|
||||
CORE_DECLARE(status_t) sgw_context_setup_trace_module(void);
|
||||
|
||||
CORE_DECLARE(sgw_bearer_t*) sgw_sess_add(
|
||||
CORE_DECLARE(sgw_sess_t*) sgw_sess_add(
|
||||
c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id);
|
||||
CORE_DECLARE(status_t) sgw_sess_remove(sgw_sess_t *sess);
|
||||
CORE_DECLARE(status_t) sgw_sess_remove_all();
|
||||
|
|
Loading…
Reference in New Issue