forked from acouzens/open5gs
update it
This commit is contained in:
parent
bd4a816587
commit
913762c317
|
@ -190,6 +190,7 @@ 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;
|
||||
|
@ -230,6 +231,74 @@ void esm_state_active(fsm_t *s, event_t *e)
|
|||
FSM_TRAN(s, esm_state_inactive);
|
||||
break;
|
||||
}
|
||||
case NAS_PDN_DISCONNECT_REQUEST:
|
||||
{
|
||||
if (MME_HAVE_SGW_S1U_PATH(sess))
|
||||
{
|
||||
rv = mme_gtp_send_delete_session_request(sess);
|
||||
d_assert(rv == CORE_OK, return,
|
||||
"mme_gtp_send_delete_session_request error");
|
||||
}
|
||||
else
|
||||
{
|
||||
mme_sess_remove(sess);
|
||||
}
|
||||
FSM_TRAN(s, esm_state_disconnect);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_warn("Not implemented(type:%d)",
|
||||
message->esm.h.message_type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
d_error("Unknown event %s", mme_event_get_name(e));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void esm_state_disconnect(fsm_t *s, event_t *e)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(s, return, "Null param");
|
||||
d_assert(e, return, "Null param");
|
||||
|
||||
mme_sm_trace(3, e);
|
||||
|
||||
bearer = mme_bearer_find(event_get_param1(e));
|
||||
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");
|
||||
|
||||
switch (event_get(e))
|
||||
{
|
||||
case FSM_ENTRY_SIG:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case FSM_EXIT_SIG:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case MME_EVT_ESM_MESSAGE:
|
||||
{
|
||||
nas_message_t *message = (nas_message_t *)event_get_param3(e);
|
||||
d_assert(message, break, "Null param");
|
||||
|
||||
switch(message->esm.h.message_type)
|
||||
{
|
||||
default:
|
||||
{
|
||||
d_warn("Not implemented(type:%d)",
|
||||
|
|
|
@ -124,6 +124,36 @@ status_t mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer)
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_gtp_send_delete_session_request(mme_sess_t *sess)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *s11buf = NULL;
|
||||
gtp_header_t h;
|
||||
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_DELETE_SESSION_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_delete_session_request(&s11buf, h.type, sess);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
|
||||
|
||||
xact = gtp_xact_local_create(sess->sgw, &h, s11buf);
|
||||
d_assert(xact, return CORE_ERROR, "Null param");
|
||||
|
||||
GTP_XACT_STORE_SESSION(xact, sess);
|
||||
|
||||
rv = gtp_xact_commit(xact);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
|
|
|
@ -14,6 +14,8 @@ CORE_DECLARE(status_t) mme_gtp_close();
|
|||
|
||||
CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request(
|
||||
mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_delete_session_request(
|
||||
mme_sess_t *sess);
|
||||
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(
|
||||
|
|
|
@ -127,7 +127,6 @@ void mme_s11_handle_modify_bearer_response(
|
|||
void mme_s11_handle_delete_all_sessions_in_ue(mme_ue_t *mme_ue)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *s11buf = NULL;
|
||||
mme_sess_t *sess = NULL, *next_sess = NULL;
|
||||
|
||||
d_assert(mme_ue, return, "Null param");
|
||||
|
@ -138,23 +137,9 @@ void mme_s11_handle_delete_all_sessions_in_ue(mme_ue_t *mme_ue)
|
|||
|
||||
if (MME_HAVE_SGW_S1U_PATH(sess))
|
||||
{
|
||||
gtp_header_t h;
|
||||
gtp_xact_t *xact = NULL;
|
||||
|
||||
memset(&h, 0, sizeof(gtp_header_t));
|
||||
h.type = GTP_DELETE_SESSION_REQUEST_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_delete_session_request(&s11buf, h.type, sess);
|
||||
d_assert(rv == CORE_OK, return, "S11 build error");
|
||||
|
||||
xact = gtp_xact_local_create(sess->sgw, &h, s11buf);
|
||||
d_assert(xact, return, "Null param");
|
||||
|
||||
GTP_XACT_STORE_SESSION(xact, sess);
|
||||
|
||||
rv = gtp_xact_commit(xact);
|
||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
||||
rv = mme_gtp_send_delete_session_request(sess);
|
||||
d_assert(rv == CORE_OK, return,
|
||||
"mme_gtp_send_delete_session_request error");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -348,6 +348,8 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
if (rv != CORE_OK)
|
||||
break;
|
||||
|
||||
d_assert(xact, return, "Null param");
|
||||
|
||||
mme_ue = mme_ue_find_by_teid(message.h.teid);
|
||||
d_assert(mme_ue, pkbuf_free(pkbuf); break,
|
||||
"No UE Context(TEID:%d)", message.h.teid);
|
||||
|
@ -425,31 +427,57 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
break;
|
||||
case GTP_DELETE_SESSION_RESPONSE_TYPE:
|
||||
{
|
||||
mme_s11_handle_delete_session_response(
|
||||
xact, mme_ue, &message.delete_session_response);
|
||||
mme_sess_t *sess = NULL;
|
||||
gtp_delete_session_response_t *rsp =
|
||||
&message.delete_session_response;
|
||||
|
||||
if (mme_sess_first(mme_ue) == NULL)
|
||||
d_assert(rsp, return, "Null param");
|
||||
sess = GTP_XACT_RETRIEVE_SESSION(xact);
|
||||
d_assert(sess, return, "Null param");
|
||||
|
||||
if (rsp->cause.presence == 0)
|
||||
{
|
||||
CLEAR_SGW_S11_PATH(mme_ue);
|
||||
d_error("No Cause");
|
||||
return;
|
||||
}
|
||||
|
||||
d_trace(3, "[GTP] Delete Session Response : "
|
||||
"MME[%d] <-- SGW[%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");
|
||||
|
||||
if (FSM_CHECK(&mme_ue->sm, emm_state_authentication))
|
||||
{
|
||||
mme_sess_remove(sess);
|
||||
if (mme_sess_first(mme_ue) == NULL)
|
||||
{
|
||||
CLEAR_SGW_S11_PATH(mme_ue);
|
||||
mme_s6a_send_air(mme_ue);
|
||||
}
|
||||
}
|
||||
else if (FSM_CHECK(&mme_ue->sm, emm_state_detached))
|
||||
{
|
||||
mme_sess_remove(sess);
|
||||
if (mme_sess_first(mme_ue) == NULL)
|
||||
{
|
||||
CLEAR_SGW_S11_PATH(mme_ue);
|
||||
emm_handle_detach_accept(mme_ue);
|
||||
}
|
||||
}
|
||||
else if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
|
||||
{
|
||||
d_assert(0, , "Coming Soon!");
|
||||
mme_bearer_t *bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(bearer, return, "Null param");
|
||||
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_disconnect))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
d_assert(0, break, "Invalid ESM state");
|
||||
}
|
||||
}
|
||||
else
|
||||
d_assert(0, break, "Invalid EMM state");
|
||||
|
|
|
@ -34,6 +34,7 @@ void esm_state_final(fsm_t *s, event_t *e);
|
|||
void esm_state_inactive(fsm_t *s, event_t *e);
|
||||
void esm_state_information(fsm_t *s, event_t *e);
|
||||
void esm_state_active(fsm_t *s, event_t *e);
|
||||
void esm_state_disconnect(fsm_t *s, event_t *e);
|
||||
void esm_state_session_exception(fsm_t *s, event_t *e);
|
||||
void esm_state_bearer_exception(fsm_t *s, event_t *e);
|
||||
|
||||
|
|
Loading…
Reference in New Issue