update state machine

This commit is contained in:
Sukchan Lee 2017-09-07 19:44:08 +09:00
parent 71a31cf353
commit c8dd87123c
5 changed files with 50 additions and 91 deletions

View File

@ -77,24 +77,18 @@ void esm_handle_activate_default_bearer_accept(mme_bearer_t *bearer)
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param");
if (MME_HAVE_ENB_S1U_PATH(bearer))
rv = mme_gtp_send_modify_bearer_request(bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_modify_bearer_request failed");
mme_bearer_t *dedicated_bearer = mme_bearer_next(bearer);
while(dedicated_bearer)
{
rv = mme_gtp_send_modify_bearer_request(bearer);
rv = nas_send_activate_dedicated_bearer_context(
enb_ue, dedicated_bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_modify_bearer_request failed");
}
}
void esm_handle_activate_dedicated_bearer_accept(mme_bearer_t *bearer)
{
status_t rv;
d_assert(bearer, return, "Null param");
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");
"nas_send_activate_dedicated_bearer_context failed");
dedicated_bearer = mme_bearer_next(dedicated_bearer);
}
}

View File

@ -11,6 +11,7 @@
#include "esm_handler.h"
#include "mme_s11_handler.h"
#include "nas_path.h"
#include "mme_gtp_path.h"
static void esm_state_pdn_connectivity_request(
fsm_t *s, event_t *e, mme_ue_t *mme_ue, mme_sess_t *sess,
@ -85,10 +86,14 @@ void esm_state_inactive(fsm_t *s, event_t *e)
}
case NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT:
{
status_t rv;
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);
rv = mme_gtp_send_create_bearer_response(bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_create_bearer_response failed");
FSM_TRAN(s, esm_state_active);
break;
}
@ -185,7 +190,6 @@ void esm_state_information(fsm_t *s, event_t *e)
void esm_state_active(fsm_t *s, event_t *e)
{
status_t rv;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
@ -206,30 +210,6 @@ void esm_state_active(fsm_t *s, event_t *e)
{
case FSM_ENTRY_SIG:
{
enb_ue_t *enb_ue = NULL;
mme_bearer_t *linked_bearer = mme_linked_bearer(bearer);
d_assert(linked_bearer, return, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param");
if (linked_bearer->ebi == bearer->ebi)
{
/* Check dedicated bearer */
mme_bearer_t *dedicated_bearer = mme_bearer_next(bearer);
while(dedicated_bearer)
{
if (!MME_HAVE_ENB_S1U_PATH(dedicated_bearer))
{
rv = nas_send_activate_dedicated_bearer_context(
enb_ue, dedicated_bearer);
d_assert(rv == CORE_OK, return,
"nas_send_activate_dedicated_bearer_context failed");
}
dedicated_bearer = mme_bearer_next(dedicated_bearer);
}
}
break;
}
case FSM_EXIT_SIG:

View File

@ -155,3 +155,31 @@ status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
return CORE_OK;
}
status_t mme_gtp_send_release_access_bearers_response(mme_sess_t *sess)
{
status_t rv;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_release_access_bearers_request(&pkbuf, h.type);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
d_assert(xact, return CORE_ERROR, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
return CORE_OK;
}

View File

@ -16,6 +16,8 @@ CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request(
mme_bearer_t *bearer);
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(
mme_sess_t *sess);
#ifdef __cplusplus
}

View File

@ -8,7 +8,6 @@
#include "s1ap_build.h"
#include "s1ap_path.h"
#include "nas_path.h"
#include "mme_s11_build.h"
#include "mme_gtp_path.h"
#include "s1ap_handler.h"
@ -321,15 +320,6 @@ void s1ap_handle_initial_context_setup_response(
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
sizeof(bearer->enb_s1u_addr));
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
status_t rv;
rv = mme_gtp_send_modify_bearer_request(bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_modify_bearer_request failed");
}
}
}
@ -360,8 +350,6 @@ void s1ap_handle_e_rab_setup_response(
for (i = 0; i < ies->e_RABSetupListBearerSURes.
s1ap_E_RABSetupItemBearerSURes.count; i++)
{
status_t rv;
mme_bearer_t *bearer = NULL;
mme_ue_t *mme_ue = enb_ue->mme_ue;
S1ap_E_RABSetupItemBearerSURes_t *e_rab = NULL;
@ -378,25 +366,6 @@ void s1ap_handle_e_rab_setup_response(
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
sizeof(bearer->enb_s1u_addr));
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
mme_bearer_t *linked_bearer = mme_linked_bearer(bearer);
d_assert(linked_bearer, return, "Null param");
if (linked_bearer->ebi == bearer->ebi) /* Default Bearer */
{
rv = mme_gtp_send_modify_bearer_request(bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_modify_bearer_request failed");
}
else /* Dedicated Bearer */
{
rv = mme_gtp_send_create_bearer_response(bearer);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_create_bearer_response failed");
}
}
}
}
@ -435,23 +404,9 @@ void s1ap_handle_ue_context_release_request(
mme_sess_t *sess = mme_sess_first(mme_ue);
while (sess != NULL)
{
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
gtp_xact_t *xact = NULL;
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_release_access_bearers_request(
&pkbuf, h.type);
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");
rv = mme_gtp_send_release_access_bearers_response(sess);
d_assert(rv == CORE_OK, return,
"mme_gtp_send_release_access_bearers_response failed");
sess = mme_sess_next(sess);
}