move EBI from Session to Bearer Context in MME
This commit is contained in:
parent
1dddde1d74
commit
038bb7037d
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 = >p_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 = >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 = 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 = >p_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(>p_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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue