reorder control plane flow
This commit is contained in:
parent
bb5edf2a57
commit
a69760c689
|
@ -10,6 +10,7 @@
|
||||||
#include "s1ap_build.h"
|
#include "s1ap_build.h"
|
||||||
#include "s1ap_path.h"
|
#include "s1ap_path.h"
|
||||||
#include "nas_path.h"
|
#include "nas_path.h"
|
||||||
|
#include "mme_s11_build.h"
|
||||||
|
|
||||||
void esm_handle_pdn_connectivity_request(mme_sess_t *sess,
|
void esm_handle_pdn_connectivity_request(mme_sess_t *sess,
|
||||||
nas_pdn_connectivity_request_t *pdn_connectivity_request)
|
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,,);
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,6 +15,10 @@ CORE_DECLARE(void) esm_handle_information_response(mme_sess_t *sess,
|
||||||
nas_esm_information_response_t *bearer_information_response);
|
nas_esm_information_response_t *bearer_information_response);
|
||||||
CORE_DECLARE(void) esm_handle_activate_dedicated_bearer_request(
|
CORE_DECLARE(void) esm_handle_activate_dedicated_bearer_request(
|
||||||
mme_bearer_t *bearer);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,21 +86,11 @@ void esm_state_inactive(fsm_t *s, event_t *e)
|
||||||
}
|
}
|
||||||
case NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT:
|
case NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT:
|
||||||
{
|
{
|
||||||
mme_bearer_t *dedicated_bearer = NULL;
|
|
||||||
|
|
||||||
d_trace(3, "[NAS] Activate default EPS bearer "
|
d_trace(3, "[NAS] Activate default EPS bearer "
|
||||||
"context accept : UE[%s] --> ESM[%d]\n",
|
"context accept : UE[%s] --> ESM[%d]\n",
|
||||||
mme_ue->imsi_bcd, bearer->pti);
|
mme_ue->imsi_bcd, bearer->pti);
|
||||||
dedicated_bearer = mme_bearer_next(bearer);
|
|
||||||
while(dedicated_bearer)
|
esm_handle_activate_default_bearer_accept(bearer);
|
||||||
{
|
|
||||||
if (!MME_HAVE_ENB_S1U_PATH(dedicated_bearer))
|
|
||||||
{
|
|
||||||
esm_handle_activate_dedicated_bearer_request(
|
|
||||||
dedicated_bearer);
|
|
||||||
}
|
|
||||||
dedicated_bearer = mme_bearer_next(dedicated_bearer);
|
|
||||||
}
|
|
||||||
FSM_TRAN(s, esm_state_active);
|
FSM_TRAN(s, esm_state_active);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -109,6 +99,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
|
||||||
d_trace(3, "[NAS] Activate dedicated EPS bearer "
|
d_trace(3, "[NAS] Activate dedicated EPS bearer "
|
||||||
"context accept : UE[%s] --> ESM[%d]\n",
|
"context accept : UE[%s] --> ESM[%d]\n",
|
||||||
mme_ue->imsi_bcd, bearer->pti);
|
mme_ue->imsi_bcd, bearer->pti);
|
||||||
|
esm_handle_activate_dedicated_bearer_accept(bearer);
|
||||||
FSM_TRAN(s, esm_state_active);
|
FSM_TRAN(s, esm_state_active);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -429,18 +429,21 @@ void s1ap_handle_initial_context_setup_response(
|
||||||
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||||
sizeof(bearer->enb_s1u_addr));
|
sizeof(bearer->enb_s1u_addr));
|
||||||
|
|
||||||
memset(&h, 0, sizeof(gtp_header_t));
|
if (FSM_CHECK(&bearer->sm, esm_state_active))
|
||||||
h.type = GTP_MODIFY_BEARER_REQUEST_TYPE;
|
{
|
||||||
h.teid = mme_ue->sgw_s11_teid;
|
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);
|
rv = mme_s11_build_modify_bearer_request(&pkbuf, h.type, bearer);
|
||||||
d_assert(rv == CORE_OK, return, "S11 build error");
|
d_assert(rv == CORE_OK, return, "S11 build error");
|
||||||
|
|
||||||
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
|
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
|
||||||
d_assert(xact, return, "Null param");
|
d_assert(xact, return, "Null param");
|
||||||
|
|
||||||
rv = gtp_xact_commit(xact);
|
rv = gtp_xact_commit(xact);
|
||||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
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,
|
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
|
||||||
sizeof(bearer->enb_s1u_addr));
|
sizeof(bearer->enb_s1u_addr));
|
||||||
|
|
||||||
memset(&h, 0, sizeof(gtp_header_t));
|
if (FSM_CHECK(&bearer->sm, esm_state_active))
|
||||||
h.type = GTP_CREATE_BEARER_RESPONSE_TYPE;
|
{
|
||||||
h.teid = mme_ue->sgw_s11_teid;
|
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);
|
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
|
||||||
d_assert(rv == CORE_OK, return, "S11 build error");
|
d_assert(rv == CORE_OK, return, "S11 build error");
|
||||||
|
|
||||||
rv = gtp_xact_update_tx(xact, &h, pkbuf);
|
rv = gtp_xact_update_tx(xact, &h, pkbuf);
|
||||||
d_assert(xact, return, "Null param");
|
d_assert(xact, return, "Null param");
|
||||||
|
|
||||||
rv = gtp_xact_commit(xact);
|
rv = gtp_xact_commit(xact);
|
||||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
d_assert(rv == CORE_OK, return, "xact_commit error");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -191,6 +191,8 @@ static void attach_test1(abts_case *tc, void *data)
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Attach Request : Known IMSI, Integrity Protected, No Security Context
|
* Attach Request : Known IMSI, Integrity Protected, No Security Context
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
mme_self()->mme_ue_s1ap_id = 16777372;
|
mme_self()->mme_ue_s1ap_id = 16777372;
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
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
|
* Attach Request : Known GUTI, Integrity Protected, MAC Matched
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+1);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+1);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
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);
|
rc = tests1ap_enb_read(sock, recvbuf);
|
||||||
pkbuf_free(recvbuf);
|
pkbuf_free(recvbuf);
|
||||||
|
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
/* Send Detach Request */
|
/* Send Detach Request */
|
||||||
rv = tests1ap_build_detach_request(&sendbuf, msgindex);
|
rv = tests1ap_build_detach_request(&sendbuf, msgindex);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
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
|
* Attach Request : Unknown GUTI, Integrity Protected
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
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
|
* Attach Request : Known IMSI, Plain NAS message
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
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);
|
rv = tests1ap_enb_send(sock, sendbuf);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
|
|
||||||
core_sleep(time_from_msec(300));
|
|
||||||
|
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
* Attach Request : IMSI, Integrity Protected, MAC Matched
|
* Attach Request : IMSI, Integrity Protected, MAC Matched
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+1);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+1);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
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
|
* Attach Request : IMSI, Integrity Protected, MAC Failed
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex+2);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
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
|
* Attach Request : Known IMSI, Plain NAS message
|
||||||
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
* Send Initial-UE Message + Attach Request + PDN Connectivity */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
|
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
rv = tests1ap_enb_send(sock, sendbuf);
|
||||||
|
@ -843,6 +857,8 @@ static void attach_test3(abts_case *tc, void *data)
|
||||||
pkbuf_free(recvbuf);
|
pkbuf_free(recvbuf);
|
||||||
|
|
||||||
/* Send UE Release Request */
|
/* Send UE Release Request */
|
||||||
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
rv = tests1ap_build_ue_context_release_request(&sendbuf, msgindex);
|
rv = tests1ap_build_ue_context_release_request(&sendbuf, msgindex);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
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);
|
rv = tests1ap_enb_send(sock, sendbuf);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
|
|
||||||
|
/* Send Service Request */
|
||||||
core_sleep(time_from_msec(300));
|
core_sleep(time_from_msec(300));
|
||||||
|
|
||||||
/* Send Service Request */
|
|
||||||
rv = tests1ap_build_service_request(&sendbuf, msgindex);
|
rv = tests1ap_build_service_request(&sendbuf, msgindex);
|
||||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||||
rv = tests1ap_enb_send(sock, sendbuf);
|
rv = tests1ap_enb_send(sock, sendbuf);
|
||||||
|
|
Loading…
Reference in New Issue