reorder control plane flow

This commit is contained in:
Sukchan Lee 2017-09-05 13:15:04 +09:00
parent bb5edf2a57
commit a69760c689
5 changed files with 128 additions and 33 deletions

View File

@ -10,6 +10,7 @@
#include "s1ap_build.h"
#include "s1ap_path.h"
#include "nas_path.h"
#include "mme_s11_build.h"
void esm_handle_pdn_connectivity_request(mme_sess_t *sess,
nas_pdn_connectivity_request_t *pdn_connectivity_request)
@ -85,3 +86,80 @@ void esm_handle_activate_dedicated_bearer_request(mme_bearer_t *bearer)
d_assert(nas_send_to_enb(enb_ue, s1apbuf) == CORE_OK,,);
}
void esm_handle_activate_default_bearer_accept(mme_bearer_t *bearer)
{
status_t rv;
gtp_header_t h;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *dedicated_bearer = NULL;
pkbuf_t *pkbuf = NULL;
d_assert(bearer, 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 (MME_HAVE_ENB_S1U_PATH(bearer))
{
memset(&h, 0, sizeof(gtp_header_t));
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);
d_assert(rv == CORE_OK, return, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
d_assert(xact, return, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
}
dedicated_bearer = mme_bearer_next(bearer);
while(dedicated_bearer)
{
if (!MME_HAVE_ENB_S1U_PATH(dedicated_bearer))
{
esm_handle_activate_dedicated_bearer_request(dedicated_bearer);
}
dedicated_bearer = mme_bearer_next(dedicated_bearer);
}
}
void esm_handle_activate_dedicated_bearer_accept(mme_bearer_t *bearer)
{
status_t rv;
gtp_header_t h;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
pkbuf_t *pkbuf = NULL;
d_assert(bearer, return, "Null param");
sess = bearer->sess;
d_assert(sess, return, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return, "Null param");
xact = bearer->xact;
d_assert(xact, return, "Null param");
if (MME_HAVE_ENB_S1U_PATH(bearer))
{
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_CREATE_BEARER_RESPONSE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);
d_assert(xact, return, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
}
}

View File

@ -15,6 +15,10 @@ CORE_DECLARE(void) esm_handle_information_response(mme_sess_t *sess,
nas_esm_information_response_t *bearer_information_response);
CORE_DECLARE(void) esm_handle_activate_dedicated_bearer_request(
mme_bearer_t *bearer);
CORE_DECLARE(void) esm_handle_activate_default_bearer_accept(
mme_bearer_t *bearer);
CORE_DECLARE(void) esm_handle_activate_dedicated_bearer_accept(
mme_bearer_t *bearer);
#ifdef __cplusplus
}

View File

@ -86,21 +86,11 @@ void esm_state_inactive(fsm_t *s, event_t *e)
}
case NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT:
{
mme_bearer_t *dedicated_bearer = NULL;
d_trace(3, "[NAS] Activate default EPS bearer "
"context accept : UE[%s] --> ESM[%d]\n",
mme_ue->imsi_bcd, bearer->pti);
dedicated_bearer = mme_bearer_next(bearer);
while(dedicated_bearer)
{
if (!MME_HAVE_ENB_S1U_PATH(dedicated_bearer))
{
esm_handle_activate_dedicated_bearer_request(
dedicated_bearer);
}
dedicated_bearer = mme_bearer_next(dedicated_bearer);
}
esm_handle_activate_default_bearer_accept(bearer);
FSM_TRAN(s, esm_state_active);
break;
}
@ -109,6 +99,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
d_trace(3, "[NAS] Activate dedicated EPS bearer "
"context accept : UE[%s] --> ESM[%d]\n",
mme_ue->imsi_bcd, bearer->pti);
esm_handle_activate_dedicated_bearer_accept(bearer);
FSM_TRAN(s, esm_state_active);
break;
}

View File

@ -429,18 +429,21 @@ void s1ap_handle_initial_context_setup_response(
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
sizeof(bearer->enb_s1u_addr));
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_MODIFY_BEARER_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
memset(&h, 0, sizeof(gtp_header_t));
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);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = mme_s11_build_modify_bearer_request(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
d_assert(xact, return, "Null param");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
d_assert(xact, return, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
}
}
}
@ -495,18 +498,21 @@ void s1ap_handle_e_rab_setup_response(
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
sizeof(bearer->enb_s1u_addr));
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_CREATE_BEARER_RESPONSE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_CREATE_BEARER_RESPONSE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);
d_assert(xact, return, "Null param");
rv = gtp_xact_update_tx(xact, &h, pkbuf);
d_assert(xact, return, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
}
}
}

View File

@ -191,6 +191,8 @@ static void attach_test1(abts_case *tc, void *data)
/***********************************************************************
* Attach Request : Known IMSI, Integrity Protected, No Security Context
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));
mme_self()->mme_ue_s1ap_id = 16777372;
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@ -287,6 +289,8 @@ static void attach_test1(abts_case *tc, void *data)
/*****************************************************************
* Attach Request : Known GUTI, Integrity Protected, MAC Matched
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+1);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
@ -311,6 +315,8 @@ static void attach_test1(abts_case *tc, void *data)
rc = tests1ap_enb_read(sock, recvbuf);
pkbuf_free(recvbuf);
core_sleep(time_from_msec(300));
/* Send Detach Request */
rv = tests1ap_build_detach_request(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
@ -333,6 +339,8 @@ static void attach_test1(abts_case *tc, void *data)
/*****************************************************************
* Attach Request : Unknown GUTI, Integrity Protected
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
@ -493,6 +501,8 @@ static void attach_test2(abts_case *tc, void *data)
/*****************************************************************
* Attach Request : Known IMSI, Plain NAS message
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
@ -560,11 +570,11 @@ static void attach_test2(abts_case *tc, void *data)
rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
core_sleep(time_from_msec(300));
/*****************************************************************
* Attach Request : IMSI, Integrity Protected, MAC Matched
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+1);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
@ -592,6 +602,8 @@ static void attach_test2(abts_case *tc, void *data)
/*****************************************************************
* Attach Request : IMSI, Integrity Protected, MAC Failed
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
@ -755,6 +767,8 @@ static void attach_test3(abts_case *tc, void *data)
/*****************************************************************
* Attach Request : Known IMSI, Plain NAS message
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
@ -843,6 +857,8 @@ static void attach_test3(abts_case *tc, void *data)
pkbuf_free(recvbuf);
/* Send UE Release Request */
core_sleep(time_from_msec(300));
rv = tests1ap_build_ue_context_release_request(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);
@ -864,9 +880,9 @@ static void attach_test3(abts_case *tc, void *data)
rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
/* Send Service Request */
core_sleep(time_from_msec(300));
/* Send Service Request */
rv = tests1ap_build_service_request(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock, sendbuf);