X2 HO is added. but Security Context is not yet!
This commit is contained in:
parent
4595fd666d
commit
f6a1944d36
|
@ -79,9 +79,11 @@ void esm_state_inactive(fsm_t *s, event_t *e)
|
|||
|
||||
if (MME_HAVE_ENB_S1U_PATH(bearer))
|
||||
{
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
|
||||
d_assert(rv == CORE_OK, return,
|
||||
"mme_gtp_send_modify_bearer_request failed");
|
||||
MODIFY_BEARER_TRANSACTION_BEGIN(
|
||||
mme_ue, MODIFY_BEARER_BY_EPS_ATTACH);
|
||||
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
}
|
||||
|
||||
esm_handle_activate_default_bearer_accept(bearer);
|
||||
|
@ -97,8 +99,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
|
|||
if (MME_HAVE_ENB_S1U_PATH(bearer))
|
||||
{
|
||||
rv = mme_gtp_send_create_bearer_response(bearer);
|
||||
d_assert(rv == CORE_OK, return,
|
||||
"mme_gtp_send_create_bearer_response failed");
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
}
|
||||
|
||||
FSM_TRAN(s, esm_state_active);
|
||||
|
|
|
@ -262,6 +262,33 @@ struct _mme_ue_t {
|
|||
|
||||
/* Detach Request */
|
||||
nas_detach_type_t detach_type;
|
||||
|
||||
/* Modify Bearer Request/Response */
|
||||
struct {
|
||||
#define MODIFY_BEARER_BY_EPS_ATTACH 1
|
||||
#define MODIFY_BEARER_BY_EPS_UPDATE 2
|
||||
#define MODIFY_BEARER_BY_E_RAB_SETUP 3
|
||||
#define MODIFY_BEARER_BY_PATH_SWITCH_REQUEST 4
|
||||
c_uint8_t type;
|
||||
|
||||
#define MODIFY_BEARER_TRANSACTION_BEGIN(__mME, __tYPE) \
|
||||
do { \
|
||||
d_assert((__mME), break,); \
|
||||
d_assert(\
|
||||
((__mME)->modify_bearer.counter.request) == \
|
||||
((__mME)->modify_bearer.counter.response), break,); \
|
||||
(__mME)->modify_bearer.type = (__tYPE); \
|
||||
} while(0);
|
||||
|
||||
#define MODIFY_BEARER_TRANSACTION_END(__mME) \
|
||||
(__mME) && \
|
||||
((__mME)->modify_bearer.counter.request) == \
|
||||
((__mME)->modify_bearer.counter.response)
|
||||
struct {
|
||||
c_uint64_t request;
|
||||
c_uint64_t response;
|
||||
} counter;
|
||||
} modify_bearer;
|
||||
};
|
||||
|
||||
#define MME_HAVE_SGW_S1U_PATH(__sESS) \
|
||||
|
|
|
@ -123,8 +123,7 @@ status_t mme_gtp_send_create_session_request(mme_sess_t *sess)
|
|||
}
|
||||
|
||||
|
||||
status_t mme_gtp_send_modify_bearer_request(
|
||||
mme_bearer_t *bearer, c_uint32_t presencemask)
|
||||
status_t mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
|
||||
|
@ -145,8 +144,7 @@ status_t mme_gtp_send_modify_bearer_request(
|
|||
h.type = GTP_MODIFY_BEARER_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_modify_bearer_request(
|
||||
&pkbuf, h.type, bearer, presencemask);
|
||||
rv = mme_s11_build_modify_bearer_request(&pkbuf, h.type, bearer);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
|
||||
|
||||
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
|
||||
|
|
|
@ -13,12 +13,9 @@ CORE_DECLARE(status_t) mme_gtp_open();
|
|||
CORE_DECLARE(status_t) mme_gtp_close();
|
||||
|
||||
CORE_DECLARE(status_t) mme_gtp_send_create_session_request(mme_sess_t *sess);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request(
|
||||
mme_bearer_t *bearer, c_uint32_t presencemask);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_delete_session_request(
|
||||
mme_sess_t *sess);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_delete_all_sessions(
|
||||
mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_delete_session_request(mme_sess_t *sess);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_create_bearer_response(
|
||||
mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_release_access_bearers_response(
|
||||
|
|
|
@ -160,18 +160,22 @@ status_t mme_s11_build_create_session_request(
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
|
||||
c_uint8_t type, mme_bearer_t *bearer, c_uint32_t presencemask)
|
||||
status_t mme_s11_build_modify_bearer_request(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
gtp_message_t gtp_message;
|
||||
gtp_modify_bearer_request_t *req = >p_message.modify_bearer_request;
|
||||
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
gtp_f_teid_t enb_s1u_teid;
|
||||
gtp_uli_t uli;
|
||||
char uli_buf[GTP_MAX_ULI_LEN];
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(>p_message, 0, sizeof(gtp_message_t));
|
||||
|
||||
|
@ -191,11 +195,9 @@ status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
|
|||
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.len =
|
||||
GTP_F_TEID_IPV4_LEN;
|
||||
|
||||
if (presencemask & MME_S11_MODIFY_BEARER_REQUEST_ULI_PRESENT)
|
||||
if (mme_ue->modify_bearer.type == MODIFY_BEARER_BY_EPS_UPDATE ||
|
||||
mme_ue->modify_bearer.type == MODIFY_BEARER_BY_PATH_SWITCH_REQUEST)
|
||||
{
|
||||
mme_ue_t *mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(&uli, 0, sizeof(gtp_uli_t));
|
||||
uli.flags.e_cgi = 1;
|
||||
uli.flags.tai = 1;
|
||||
|
@ -214,6 +216,8 @@ status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
|
|||
rv = gtp_build_msg(pkbuf, >p_message);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
|
||||
|
||||
mme_ue->modify_bearer.counter.request++;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,20 +9,14 @@ extern "C" {
|
|||
|
||||
CORE_DECLARE(status_t) mme_s11_build_create_session_request(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_sess_t *sess);
|
||||
|
||||
#define MME_S11_MODIFY_BEARER_REQUEST_ULI_PRESENT (1<<0)
|
||||
CORE_DECLARE(status_t) mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
|
||||
c_uint8_t type, mme_bearer_t *bearer, c_uint32_t presencemask);
|
||||
|
||||
CORE_DECLARE(status_t) mme_s11_build_modify_bearer_request(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_s11_build_delete_session_request(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_sess_t *sess);
|
||||
|
||||
CORE_DECLARE(status_t) mme_s11_build_create_bearer_response(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
|
||||
|
||||
CORE_DECLARE(status_t) mme_s11_build_release_access_bearers_request(
|
||||
pkbuf_t **pkbuf, c_uint8_t type);
|
||||
|
||||
CORE_DECLARE(status_t) mme_s11_build_downlink_data_notification_ack(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_ue_t *mme_ue);
|
||||
|
||||
|
|
|
@ -119,6 +119,17 @@ void mme_s11_handle_modify_bearer_response(
|
|||
|
||||
rv = gtp_xact_commit(xact);
|
||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
||||
|
||||
mme_ue->modify_bearer.counter.response++;
|
||||
|
||||
if (MODIFY_BEARER_TRANSACTION_END(mme_ue))
|
||||
{
|
||||
if (mme_ue->modify_bearer.type == MODIFY_BEARER_BY_PATH_SWITCH_REQUEST)
|
||||
{
|
||||
rv = s1ap_send_path_switch_ack(mme_ue);
|
||||
d_assert(rv == CORE_OK, return, "s1ap send error");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mme_s11_handle_delete_session_response(
|
||||
|
|
|
@ -253,6 +253,7 @@ void s1ap_handle_initial_context_setup_response(
|
|||
char buf[INET_ADDRSTRLEN];
|
||||
int i = 0;
|
||||
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
S1ap_InitialContextSetupResponseIEs_t *ies = NULL;
|
||||
|
||||
|
@ -261,6 +262,8 @@ void s1ap_handle_initial_context_setup_response(
|
|||
|
||||
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
|
||||
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
|
||||
mme_ue = enb_ue->mme_ue;
|
||||
d_assert(mme_ue, return,);
|
||||
|
||||
d_trace(3, "[S1AP] Initial Context Setup Response : "
|
||||
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
|
||||
|
@ -268,12 +271,20 @@ void s1ap_handle_initial_context_setup_response(
|
|||
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
|
||||
enb->enb_id);
|
||||
|
||||
if (mme_ue->nas_eps.type == MME_UE_EPS_ATTACH_TYPE)
|
||||
{
|
||||
MODIFY_BEARER_TRANSACTION_BEGIN(mme_ue, MODIFY_BEARER_BY_EPS_ATTACH);
|
||||
}
|
||||
else if (mme_ue->nas_eps.type == MME_UE_EPS_UPDATE_TYPE)
|
||||
{
|
||||
MODIFY_BEARER_TRANSACTION_BEGIN(mme_ue, MODIFY_BEARER_BY_EPS_UPDATE);
|
||||
}
|
||||
|
||||
for (i = 0; i < ies->e_RABSetupListCtxtSURes.
|
||||
s1ap_E_RABSetupItemCtxtSURes.count; i++)
|
||||
{
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_ue_t *mme_ue = enb_ue->mme_ue;
|
||||
S1ap_E_RABSetupItemCtxtSURes_t *e_rab = NULL;
|
||||
|
||||
e_rab = (S1ap_E_RABSetupItemCtxtSURes_t *)
|
||||
|
@ -293,12 +304,7 @@ void s1ap_handle_initial_context_setup_response(
|
|||
if (FSM_CHECK(&bearer->sm, esm_state_active))
|
||||
{
|
||||
status_t rv;
|
||||
c_uint32_t presencemask = 0;
|
||||
|
||||
if (mme_ue->nas_eps.type == MME_UE_EPS_UPDATE_TYPE)
|
||||
presencemask = MME_S11_MODIFY_BEARER_REQUEST_ULI_PRESENT;
|
||||
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, presencemask);
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
}
|
||||
}
|
||||
|
@ -312,6 +318,7 @@ void s1ap_handle_e_rab_setup_response(
|
|||
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
S1ap_E_RABSetupResponseIEs_t *ies = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
d_assert(enb, return, "Null param");
|
||||
d_assert(message, return, "Null param");
|
||||
|
@ -321,6 +328,8 @@ void s1ap_handle_e_rab_setup_response(
|
|||
|
||||
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
|
||||
d_assert(enb_ue, return, "No UE Context[%d]", ies->eNB_UE_S1AP_ID);
|
||||
mme_ue = enb_ue->mme_ue;
|
||||
d_assert(mme_ue, return,);
|
||||
|
||||
d_trace(3, "[S1AP] E-RAB Setup Response : "
|
||||
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
|
||||
|
@ -328,11 +337,12 @@ void s1ap_handle_e_rab_setup_response(
|
|||
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
|
||||
enb->enb_id);
|
||||
|
||||
MODIFY_BEARER_TRANSACTION_BEGIN(mme_ue, MODIFY_BEARER_BY_E_RAB_SETUP);
|
||||
|
||||
for (i = 0; i < ies->e_RABSetupListBearerSURes.
|
||||
s1ap_E_RABSetupItemBearerSURes.count; i++)
|
||||
{
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_ue_t *mme_ue = enb_ue->mme_ue;
|
||||
S1ap_E_RABSetupItemBearerSURes_t *e_rab = NULL;
|
||||
|
||||
e_rab = (S1ap_E_RABSetupItemBearerSURes_t *)ies->
|
||||
|
@ -357,7 +367,7 @@ void s1ap_handle_e_rab_setup_response(
|
|||
|
||||
if (bearer->ebi == linked_bearer->ebi)
|
||||
{
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
}
|
||||
else
|
||||
|
@ -599,6 +609,9 @@ void s1ap_handle_path_switch_request(
|
|||
else
|
||||
mme_ue->ue_network_capability.eia0 = eia >> 9;
|
||||
|
||||
MODIFY_BEARER_TRANSACTION_BEGIN(mme_ue,
|
||||
MODIFY_BEARER_BY_PATH_SWITCH_REQUEST);
|
||||
|
||||
for (i = 0; i < ies->e_RABToBeSwitchedDLList.
|
||||
s1ap_E_RABToBeSwitchedDLItem.count; i++)
|
||||
{
|
||||
|
@ -620,8 +633,7 @@ void s1ap_handle_path_switch_request(
|
|||
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||
sizeof(bearer->enb_s1u_addr));
|
||||
|
||||
rv = mme_gtp_send_modify_bearer_request(
|
||||
bearer, MME_S11_MODIFY_BEARER_REQUEST_ULI_PRESENT);
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
}
|
||||
|
||||
|
|
|
@ -258,7 +258,11 @@ static void handover_test1(abts_case *tc, void *data)
|
|||
rv = tests1ap_enb_send(sock2, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
||||
core_sleep(time_from_msec(300));
|
||||
/* Receive Path Switch Ack */
|
||||
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
|
||||
rc = tests1ap_enb_read(sock1, recvbuf);
|
||||
ABTS_INT_NEQUAL(tc, 0, rc);
|
||||
pkbuf_free(recvbuf);
|
||||
|
||||
/********** Remove Subscriber in Database */
|
||||
doc = BCON_NEW("imsi", BCON_UTF8("001010123456801"));
|
||||
|
|
Loading…
Reference in New Issue