move EBI from Session to Bearer Context in MME

This commit is contained in:
Sukchan Lee 2017-09-01 22:21:12 +09:00
parent 1dddde1d74
commit 038bb7037d
11 changed files with 80 additions and 53 deletions

View File

@ -143,11 +143,11 @@ status_t emm_build_tau_accept(pkbuf_t **emmbuf, mme_ue_t *mme_ue)
tau_accept->eps_bearer_context_status.length = 2;
tau_accept->eps_bearer_context_status.ebi5 =
(mme_sess_find_by_ebi(mme_ue, 5) ? 1 : 0);
(mme_bearer_find_by_ue_ebi(mme_ue, 5) ? 1 : 0);
tau_accept->eps_bearer_context_status.ebi6 =
(mme_sess_find_by_ebi(mme_ue, 6) ? 1 : 0);
(mme_bearer_find_by_ue_ebi(mme_ue, 6) ? 1 : 0);
tau_accept->eps_bearer_context_status.ebi7 =
(mme_sess_find_by_ebi(mme_ue, 7) ? 1 : 0);
(mme_bearer_find_by_ue_ebi(mme_ue, 7) ? 1 : 0);
/* FIXME : Need to set other ebi */
/* Set T3402 */

View File

@ -177,7 +177,7 @@ void emm_handle_attach_accept(mme_ue_t *mme_ue)
d_assert(rv == CORE_OK && esmbuf, return, "esm build error");
d_trace(3, "[NAS] Activate default bearer context request : "
"EMM <-- ESM[%d]\n", sess->ebi);
"EMM <-- ESM[%d]\n", sess->pti);
rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf);
d_assert(rv == CORE_OK && emmbuf,

View File

@ -72,6 +72,7 @@ status_t esm_build_activate_default_bearer_context(
->protocol_configuration_options;
mme_ue_t *mme_ue = NULL;
mme_bearer_t *bearer = NULL;
pdn_t *pdn = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
@ -79,9 +80,11 @@ status_t esm_build_activate_default_bearer_context(
d_assert(mme_ue, return CORE_ERROR, "Null param");
pdn = sess->pdn;
d_assert(pdn, return CORE_ERROR, "Null param");
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return CORE_ERROR, "Null param");
memset(&message, 0, sizeof(message));
message.esm.h.eps_bearer_identity = sess->ebi;
message.esm.h.eps_bearer_identity = bearer->ebi;
message.esm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_ESM;
message.esm.h.procedure_transaction_identity = sess->pti;
message.esm.h.message_type =

View File

@ -1470,7 +1470,6 @@ mme_sess_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti)
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);
list_init(&sess->bearer_list);
list_append(&mme_ue->sess_list, sess);
@ -1478,7 +1477,8 @@ mme_sess_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);
bearer = mme_bearer_add(sess,
NEXT_ID(mme_ue->ebi, MIN_EPS_BEARER_ID, MAX_EPS_BEARER_ID));
d_assert(bearer, mme_sess_remove(sess); return NULL,
"Can't add default bearer context");
@ -1545,16 +1545,11 @@ mme_sess_t* mme_sess_find_by_pti(mme_ue_t *mme_ue, c_uint8_t pti)
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;
mme_bearer_t *bearer = NULL;
sess = mme_sess_next(sess);
}
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
if (bearer)
return bearer->sess;
return NULL;
}
@ -1569,7 +1564,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)
mme_bearer_t* mme_bearer_add(mme_sess_t *sess, c_uint8_t ebi)
{
mme_bearer_t *bearer = NULL;
mme_ue_t *mme_ue = NULL;
@ -1581,6 +1576,8 @@ mme_bearer_t* mme_bearer_add(mme_sess_t *sess)
index_alloc(&mme_bearer_pool, &bearer);
d_assert(bearer, return NULL, "Null param");
bearer->ebi = ebi;
list_append(&sess->bearer_list, bearer);
bearer->mme_ue = mme_ue;
@ -1625,6 +1622,42 @@ mme_bearer_t* mme_bearer_find(index_t index)
return index_find(&mme_bearer_pool, index);
}
mme_bearer_t* mme_bearer_find_by_sess_ebi(mme_sess_t *sess, c_uint8_t ebi)
{
mme_bearer_t *bearer = NULL;
bearer = mme_bearer_first(sess);
while(bearer)
{
if (ebi == bearer->ebi)
return bearer;
bearer = mme_bearer_next(bearer);
}
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;
sess = mme_sess_first(mme_ue);
while (sess)
{
bearer = mme_bearer_find_by_sess_ebi(sess, ebi);
if (bearer)
{
return bearer;
}
sess = mme_sess_next(sess);
}
return NULL;
}
mme_bearer_t* mme_default_bearer_in_sess(mme_sess_t *sess)
{
return mme_bearer_first(sess);

View File

@ -263,7 +263,6 @@ typedef struct _mme_sess_t {
fsm_t sm; /* State Machine */
c_uint8_t pti; /* Procedure Trasaction Identity */
c_uint8_t ebi; /* EPS Bearer ID */
/* mme_bearer_first(sess) : Default Bearer Context */
list_t bearer_list;
@ -291,6 +290,8 @@ typedef struct _mme_bearer_t {
lnode_t node; /* A node of list_t */
index_t index; /* An index of this node */
c_uint8_t ebi; /* EPS Bearer ID */
#define MME_UE_HAVE_SESSION(mme) \
((mme) && (mme_sess_first(mme)) && \
(mme_default_bearer_in_sess(mme_sess_first(mme))) && \
@ -368,10 +369,14 @@ CORE_DECLARE(mme_sess_t*) mme_sess_find_by_ebi(
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);
CORE_DECLARE(mme_bearer_t*) mme_bearer_add(mme_sess_t *sess, c_uint8_t ebi);
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_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_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);

View File

@ -15,6 +15,7 @@ status_t mme_s11_build_create_session_request(
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 = &gtp_message.create_session_request;
@ -33,6 +34,8 @@ status_t mme_s11_build_create_session_request(
d_assert(sgw, return CORE_ERROR, "Null param");
pdn = sess->pdn;
d_assert(pdn, return CORE_ERROR, "Null param");
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return CORE_ERROR, "Null param");
pgw_ipv4_addr = MME_SESSION_GET_PGW_IPV4_ADDR(sess);
d_assert(pgw_ipv4_addr, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
@ -121,7 +124,7 @@ status_t mme_s11_build_create_session_request(
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 = sess->ebi;
req->bearer_contexts_to_be_created.eps_bearer_id.u8 = bearer->ebi;
memset(&bearer_qos, 0, sizeof(bearer_qos));
bearer_qos.qci = pdn->qos.qci;
@ -160,19 +163,15 @@ status_t mme_s11_build_modify_bearer_request(
gtp_message_t gtp_message;
gtp_modify_bearer_request_t *req = &gtp_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(&gtp_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 = sess->ebi;
req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = bearer->ebi;
/* Send Data Plane(DL) : ENB-S1U */
memset(&enb_s1u_teid, 0, sizeof(gtp_f_teid_t));
@ -197,6 +196,7 @@ status_t mme_s11_build_delete_session_request(
{
status_t rv;
mme_ue_t *mme_ue = NULL;
mme_bearer_t *bearer = NULL;
gtp_message_t gtp_message;
gtp_delete_session_request_t *req = &gtp_message.delete_session_request;
@ -207,11 +207,13 @@ status_t mme_s11_build_delete_session_request(
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return CORE_ERROR, "Null param");
memset(&gtp_message, 0, sizeof(gtp_message_t));
req->linked_eps_bearer_id.presence = 1;
req->linked_eps_bearer_id.u8 = sess->ebi;
req->linked_eps_bearer_id.u8 = bearer->ebi;
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;

View File

@ -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 = sess->ebi;
e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = pdn->qos.qci;
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.

View File

@ -625,7 +625,7 @@ pgw_sess_t *pgw_sess_this(hash_index_t *hi)
return hash_this_val(hi);
}
pgw_bearer_t* pgw_bearer_add(pgw_sess_t *sess, c_uint8_t id)
pgw_bearer_t* pgw_bearer_add(pgw_sess_t *sess, c_uint8_t ebi)
{
pgw_bearer_t *bearer = NULL;
@ -634,7 +634,7 @@ pgw_bearer_t* pgw_bearer_add(pgw_sess_t *sess, c_uint8_t id)
index_alloc(&pgw_bearer_pool, &bearer);
d_assert(bearer, return NULL, "Bearer context allocation failed");
bearer->id = id;
bearer->ebi = ebi;
bearer->pgw_s5u_teid = bearer->index;
bearer->pgw_s5u_addr = pgw_self()->s5u_addr;
@ -685,7 +685,7 @@ pgw_bearer_t* pgw_bearer_find_by_pgw_s5u_teid(c_uint32_t pgw_s5u_teid)
return pgw_bearer_find(pgw_s5u_teid);
}
pgw_bearer_t* pgw_bearer_find_by_id(pgw_sess_t *sess, c_uint8_t id)
pgw_bearer_t* pgw_bearer_find_by_ebi(pgw_sess_t *sess, c_uint8_t ebi)
{
pgw_bearer_t *bearer = NULL;
@ -694,7 +694,7 @@ pgw_bearer_t* pgw_bearer_find_by_id(pgw_sess_t *sess, c_uint8_t id)
bearer = list_first(&sess->bearer_list);
while (bearer)
{
if (bearer->id == id)
if (bearer->ebi == ebi)
break;
bearer = list_next(bearer);
@ -758,7 +758,7 @@ pgw_bearer_t* pgw_bearer_find_by_packet(pkbuf_t *pkt)
bearer = pgw_default_bearer_in_sess(sess);
d_assert(bearer, return NULL, "No Bearer");
d_trace(50, "Found bearer(id = %d)\n",bearer->id);
d_trace(50, "Found bearer(EBI = %d)\n", bearer->ebi);
return bearer;
}
}

View File

@ -93,7 +93,7 @@ typedef struct _pgw_bearer_t {
lnode_t node; /**< A node of list_t */
index_t index;
c_uint8_t id;
c_uint8_t ebi;
/* IMPORTANT!
* PGW-S5U-TEID is same with an index */
@ -129,11 +129,11 @@ CORE_DECLARE(hash_index_t *) pgw_sess_first();
CORE_DECLARE(hash_index_t *) pgw_sess_next(hash_index_t *hi);
CORE_DECLARE(pgw_sess_t *) pgw_sess_this(hash_index_t *hi);
CORE_DECLARE(pgw_bearer_t*) pgw_bearer_add(pgw_sess_t *sess, c_uint8_t id);
CORE_DECLARE(pgw_bearer_t*) pgw_bearer_add(pgw_sess_t *sess, c_uint8_t ebi);
CORE_DECLARE(status_t) pgw_bearer_remove(pgw_bearer_t *bearer);
CORE_DECLARE(status_t) pgw_bearer_remove_all(pgw_sess_t *sess);
CORE_DECLARE(pgw_bearer_t*) pgw_bearer_find_by_id(
pgw_sess_t *sess, c_uint8_t id);
CORE_DECLARE(pgw_bearer_t*) pgw_bearer_find_by_ebi(
pgw_sess_t *sess, c_uint8_t ebi);
CORE_DECLARE(pgw_bearer_t*) pgw_default_bearer_in_sess(pgw_sess_t *sess);
CORE_DECLARE(pgw_bearer_t*) pgw_bearer_first(pgw_sess_t *sess);
CORE_DECLARE(pgw_bearer_t*) pgw_bearer_next(pgw_bearer_t *bearer);

View File

@ -80,7 +80,7 @@ void pgw_gx_handle_cca_initial_request(
rsp->bearer_contexts_created.presence = 1;
rsp->bearer_contexts_created.eps_bearer_id.presence = 1;
rsp->bearer_contexts_created.eps_bearer_id.u8 = bearer->id;
rsp->bearer_contexts_created.eps_bearer_id.u8 = bearer->ebi;
/* TODO : Bearer QoS
* if PCRF changes Bearer QoS, this should be included. */

View File

@ -131,22 +131,6 @@ 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);
#if 0
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();
CORE_DECLARE(sgw_sess_t*) sgw_sess_find(index_t index);
CORE_DECLARE(sgw_sess_t*) sgw_sess_find_by_teid(c_uint32_t teid);
CORE_DECLARE(sgw_sess_t*) sgw_sess_find_by_imsi_apn(
c_uint8_t *imsi, int imsi_len, c_int8_t *apn);
CORE_DECLARE(sgw_sess_t *) sgw_sess_find_or_add_by_message(
gtp_message_t *gtp_message);
CORE_DECLARE(hash_index_t *) sgw_sess_first();
CORE_DECLARE(hash_index_t *) sgw_sess_next(hash_index_t *hi);
CORE_DECLARE(sgw_sess_t *) sgw_sess_this(hash_index_t *hi);
#endif
CORE_DECLARE(sgw_ue_t*) sgw_ue_add(c_uint8_t *imsi, int imsi_len,
c_int8_t *apn, c_uint8_t id);
CORE_DECLARE(status_t) sgw_ue_remove(sgw_ue_t *sgw_ue);