gtp counter is newly proposed for checking multiple GTP transaction

This commit is contained in:
Sukchan Lee 2017-09-13 11:18:17 +09:00
parent e45d1887a5
commit 0bc90a7829
9 changed files with 48 additions and 63 deletions

View File

@ -79,10 +79,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
if (MME_HAVE_ENB_S1U_PATH(bearer))
{
MODIFY_BEARER_TRANSACTION_BEGIN(
mme_ue, MODIFY_BEARER_BY_EPS_ATTACH);
rv = mme_gtp_send_modify_bearer_request(bearer);
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
d_assert(rv == CORE_OK, return, "gtp send failed");
}

View File

@ -268,32 +268,36 @@ 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) \
/* GTP Request/Response Counter */
#define GTP_COUNTER_INCREMENT(__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); \
((__mME)->gtp_counter[__tYPE].request)++; \
} 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 GTP_COUNTER_CHECK(__mME, __tYPE, __eXPR) \
do { \
d_assert((__mME), break,); \
((__mME)->gtp_counter[__tYPE].response)++; \
if (((__mME)->gtp_counter[__tYPE].request) == \
((__mME)->gtp_counter[__tYPE].response)) \
{ \
((__mME)->gtp_counter[__tYPE].request) = 0; \
((__mME)->gtp_counter[__tYPE].response) = 0; \
__eXPR \
} \
} while(0);
#define MAX_NUM_OF_GTP_COUNTER 16
#define GTP_COUNTER_DELETE_SESSION 0
#define GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH 1
#define GTP_COUNTER_CREATE_INDIRECT_TUNNEL 2
#define GTP_COUNTER_DELETE_INDIRECT_TUNNEL 3
struct {
c_uint8_t request;
c_uint8_t response;
} gtp_counter[MAX_NUM_OF_GTP_COUNTER];
};
#define MME_HAVE_SGW_S1U_PATH(__sESS) \

View File

@ -123,7 +123,8 @@ status_t mme_gtp_send_create_session_request(mme_sess_t *sess)
}
status_t mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer)
status_t mme_gtp_send_modify_bearer_request(
mme_bearer_t *bearer, int uli_present)
{
status_t rv;
@ -144,7 +145,8 @@ status_t mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer)
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, uli_present);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);

View File

@ -13,7 +13,8 @@ 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);
CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request(
mme_bearer_t *bearer, int uli_present);
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(

View File

@ -161,7 +161,7 @@ status_t mme_s11_build_create_session_request(
}
status_t mme_s11_build_modify_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer)
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer, int uli_present)
{
status_t rv;
gtp_message_t gtp_message;
@ -195,8 +195,7 @@ status_t mme_s11_build_modify_bearer_request(
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.len =
GTP_F_TEID_IPV4_LEN;
if (mme_ue->modify_bearer.type == MODIFY_BEARER_BY_EPS_UPDATE ||
mme_ue->modify_bearer.type == MODIFY_BEARER_BY_PATH_SWITCH_REQUEST)
if (uli_present)
{
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
@ -216,8 +215,6 @@ status_t mme_s11_build_modify_bearer_request(
rv = gtp_build_msg(pkbuf, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
mme_ue->modify_bearer.counter.request++;
return CORE_OK;
}

View File

@ -10,7 +10,7 @@ extern "C" {
CORE_DECLARE(status_t) mme_s11_build_create_session_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_sess_t *sess);
CORE_DECLARE(status_t) mme_s11_build_modify_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer, int uli_present);
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(

View File

@ -120,16 +120,10 @@ 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");
}
}
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH,
rv = s1ap_send_path_switch_ack(mme_ue);
d_assert(rv == CORE_OK, return, "s1ap send error");
);
}
void mme_s11_handle_delete_session_response(

View File

@ -272,15 +272,6 @@ 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++)
{
@ -305,7 +296,8 @@ void s1ap_handle_initial_context_setup_response(
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
status_t rv;
rv = mme_gtp_send_modify_bearer_request(bearer);
rv = mme_gtp_send_modify_bearer_request(bearer,
mme_ue->nas_eps.type != MME_UE_EPS_ATTACH_TYPE ? 1 : 0);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
}
@ -338,8 +330,6 @@ 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++)
{
@ -368,7 +358,7 @@ void s1ap_handle_e_rab_setup_response(
if (bearer->ebi == linked_bearer->ebi)
{
rv = mme_gtp_send_modify_bearer_request(bearer);
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
else
@ -621,9 +611,6 @@ void s1ap_handle_path_switch_request(
mme_ue->ue_network_capability.eia = eia >> 9;
mme_ue->ue_network_capability.eia0 = 0;
MODIFY_BEARER_TRANSACTION_BEGIN(mme_ue,
MODIFY_BEARER_BY_PATH_SWITCH_REQUEST);
for (i = 0; i < ies->e_RABToBeSwitchedDLList.
s1ap_E_RABToBeSwitchedDLItem.count; i++)
{
@ -645,7 +632,10 @@ 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);
GTP_COUNTER_INCREMENT(
mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH);
rv = mme_gtp_send_modify_bearer_request(bearer, 1);
d_assert(rv == CORE_OK, return, "gtp send failed");
}

View File

@ -601,7 +601,7 @@ abts_suite *test_handover(abts_suite *suite)
{
suite = ADD_SUITE(suite)
#if 0
#if 1
abts_run_test(suite, handover_test1, NULL);
#else
abts_run_test(suite, handover_test2, NULL);