ECM-IDLE/CONNECTED state is added in MME Context Library
This commit is contained in:
parent
c9e44579d8
commit
4e5d156a6a
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue