ECM-IDLE/CONNECTED state is added in MME Context Library

This commit is contained in:
Sukchan Lee 2018-02-01 22:48:59 +09:00
parent c9e44579d8
commit 4e5d156a6a
6 changed files with 114 additions and 34 deletions

View File

@ -1702,6 +1702,53 @@ int mme_enb_sock_type(sock_id sock)
return SOCK_STREAM;
}
int ecm_state_is_idle(mme_ue_t *mme_ue)
{
mme_sess_t *sess = NULL;
d_assert(mme_ue, return CORE_ERROR,);
if (mme_ue->enb_ue == NULL) return 1;
sess = mme_sess_first(mme_ue);
while(sess)
{
mme_bearer_t *bearer = mme_bearer_first(sess);
while(bearer)
{
if (MME_HAVE_ENB_S1U_PATH(bearer))
{
return 0;
}
bearer = mme_bearer_next(bearer);
}
sess = mme_sess_next(sess);
}
return 1;
}
status_t ecm_state_set_idle(mme_ue_t *mme_ue)
{
mme_sess_t *sess = NULL;
d_assert(mme_ue, return CORE_ERROR,);
sess = mme_sess_first(mme_ue);
while(sess)
{
mme_bearer_t *bearer = mme_bearer_first(sess);
while(bearer)
{
CLEAR_ENB_S1U_PATH(bearer);
bearer = mme_bearer_next(bearer);
}
sess = mme_sess_next(sess);
}
return CORE_OK;
}
/** enb_ue_context handling function */
enb_ue_t* enb_ue_add(mme_enb_t *enb)
{

View File

@ -401,6 +401,11 @@ typedef struct _mme_sess_t {
#define MME_HAVE_ENB_S1U_PATH(__bEARER) \
((__bEARER) && ((__bEARER)->enb_s1u_teid))
#define CLEAR_ENB_S1U_PATH(__bEARER) \
do { \
d_assert((__bEARER), break, "Null param"); \
(__bEARER)->enb_s1u_teid = 0; \
} while(0)
#define MME_HAVE_ENB_DL_INDIRECT_TUNNEL(__bEARER) \
((__bEARER) && ((__bEARER)->enb_dl_teid))
@ -473,6 +478,15 @@ CORE_DECLARE(hash_index_t *) mme_enb_next(hash_index_t *hi);
CORE_DECLARE(mme_enb_t *) mme_enb_this(hash_index_t *hi);
CORE_DECLARE(int) mme_enb_sock_type(sock_id sock);
#define ECM_IDLE(__mME) \
(ecm_state_is_idle(__mME) == 1)
#define ECM_CONNECTED(__mME) \
(ecm_state_is_idle(__mME) == 0)
#define ECM_STATE_TO_IDLE(__mME) \
ecm_state_set_idle(__mME)
CORE_DECLARE(int) ecm_state_is_idle(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) ecm_state_set_idle(mme_ue_t *mme_ue);
CORE_DECLARE(enb_ue_t*) enb_ue_add(mme_enb_t *enb);
CORE_DECLARE(unsigned int) enb_ue_count();
CORE_DECLARE(status_t) enb_ue_remove(enb_ue_t *enb_ue);

View File

@ -515,16 +515,20 @@ void mme_s11_handle_release_access_bearers_response(
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return, "Null param");
d_trace(5, " MME_S11_TEID[%d] SGW_S11_TEID[%d]\n",
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK,, "xact_commit error");
if (rsp->cause.presence == 0)
{
d_error("No Cause");
return;
}
d_trace(5, " MME_S11_TEID[%d] SGW_S11_TEID[%d]\n",
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
rv = ECM_STATE_TO_IDLE(mme_ue);
d_assert(rv == CORE_OK,, "ECM_STATE_TO_IDLE failed");
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,

View File

@ -30,7 +30,6 @@ void mme_s6a_handle_aia(mme_ue_t *mme_ue, s6a_aia_message_t *aia_message)
void mme_s6a_handle_ula(mme_ue_t *mme_ue, s6a_ula_message_t *ula_message)
{
status_t rv;
s6a_subscription_data_t *subscription_data = NULL;
d_assert(mme_ue, return, "Null param");
@ -40,28 +39,4 @@ void mme_s6a_handle_ula(mme_ue_t *mme_ue, s6a_ula_message_t *ula_message)
memcpy(&mme_ue->subscription_data,
subscription_data, sizeof(s6a_subscription_data_t));
if (FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup))
{
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST)
{
rv = nas_send_emm_to_esm(mme_ue, &mme_ue->pdn_connectivity_request);
d_assert(rv == CORE_OK,, "nas_send_emm_to_esm() failed");
}
else
d_assert(0,, "Invalid Type(%d)", mme_ue->nas_eps.type);
}
else if (FSM_CHECK(&mme_ue->sm, emm_state_registered))
{
if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST)
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,, "nas_send_tau_accept() failed");
}
else
d_assert(0,, "Invalid EPS-Type[%d]", mme_ue->nas_eps.type);
}
else
d_assert(0,, "Invaild EMM state for EPS-Type[%d]",
mme_ue->nas_eps.type);
}

View File

@ -444,11 +444,49 @@ void mme_state_operational(fsm_t *s, event_t *e)
case S6A_CMD_CODE_UPDATE_LOCATION:
{
mme_s6a_handle_ula(mme_ue, &s6a_message->ula_message);
if (FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup))
{
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST)
{
rv = nas_send_emm_to_esm(mme_ue,
&mme_ue->pdn_connectivity_request);
d_assert(rv == CORE_OK,,
"nas_send_emm_to_esm() failed");
}
else
d_assert(0,, "Invalid Type[%d]",
mme_ue->nas_eps.type);
}
else if (FSM_CHECK(&mme_ue->sm, emm_state_registered))
{
if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST)
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,,
"nas_send_tau_accept() failed");
}
else if (mme_ue->nas_eps.type ==
MME_EPS_TYPE_SERVICE_REQUEST)
{
rv = s1ap_send_initial_context_setup_request(
mme_ue);
d_assert(rv == CORE_OK,,
"s1ap_send_initial_context_setup_request()"
"failed");
}
else
d_assert(0,, "Invalid EPS-Type[%d]",
mme_ue->nas_eps.type);
}
else
d_assert(0,, "Invaild EMM state for EPS-Type[%d]",
mme_ue->nas_eps.type);
break;
}
default:
{
d_error("Invalid type(%d)", event_get_param2(e));
d_error("Invalid Type[%d]", event_get_param2(e));
break;
}
}
@ -526,7 +564,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
* If the MME receives a Downlink Data Notification after step 2 and
* before step 9, the MME shall not send S1 interface paging messages
*/
if (mme_ue->enb_ue == NULL)
if (ECM_IDLE(mme_ue))
{
s1ap_handle_paging(mme_ue);
/* Start T3413 */

View File

@ -562,14 +562,16 @@ void s1ap_handle_ue_context_release_request(
d_assert(mme_ue,,);
if (mme_ue && FSM_CHECK(&mme_ue->sm, emm_state_registered))
{
d_trace(5, " Registered State\n");
if (MME_HAVE_SGW_S11_PATH(mme_ue))
d_trace(5, " EMM-Registered\n");
if (ECM_CONNECTED(mme_ue))
{
d_trace(5, " ECM-Connected\n");
rv = mme_gtp_send_release_access_bearers_request(mme_ue);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
else
{
d_trace(5, " ECM-Idle\n");
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_NO_ACTION, 0);
@ -578,7 +580,7 @@ void s1ap_handle_ue_context_release_request(
}
else
{
d_trace(5, " NOT Registered State\n");
d_trace(5, " NOT EMM-Registered\n");
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
d_trace(5, " WITH Delete Sesson\n");