forked from acouzens/open5gs
deactivate dedicated bearer is done
This commit is contained in:
parent
60b59babe0
commit
47407e4855
|
@ -116,7 +116,8 @@ void emm_state_detached(fsm_t *s, event_t *e)
|
|||
{
|
||||
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
|
||||
{
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
|
||||
FSM_TRAN(&mme_ue->sm,
|
||||
&emm_state_initial_context_setup);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -237,7 +238,8 @@ void emm_state_identity(fsm_t *s, event_t *e)
|
|||
{
|
||||
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
|
||||
{
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
|
||||
FSM_TRAN(&mme_ue->sm,
|
||||
&emm_state_initial_context_setup);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -437,7 +439,7 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
|
|||
}
|
||||
|
||||
mme_s6a_send_ulr(mme_ue);
|
||||
FSM_TRAN(s, &emm_state_default_esm);
|
||||
FSM_TRAN(s, &emm_state_initial_context_setup);
|
||||
break;
|
||||
}
|
||||
case NAS_EMM_STATUS:
|
||||
|
@ -463,7 +465,7 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
|
|||
}
|
||||
}
|
||||
|
||||
void emm_state_default_esm(fsm_t *s, event_t *e)
|
||||
void emm_state_initial_context_setup(fsm_t *s, event_t *e)
|
||||
{
|
||||
status_t rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
@ -630,7 +632,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
|
|||
{
|
||||
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
|
||||
{
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
|
||||
FSM_TRAN(&mme_ue->sm,
|
||||
&emm_state_initial_context_setup);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -72,7 +72,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
|
|||
bearer, &message->esm.pdn_connectivity_request);
|
||||
if (rv != CORE_OK)
|
||||
{
|
||||
FSM_TRAN(s, esm_state_session_exception);
|
||||
FSM_TRAN(s, esm_state_exception);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -86,7 +86,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
|
|||
sess, &message->esm.esm_information_response);
|
||||
if (rv != CORE_OK)
|
||||
{
|
||||
FSM_TRAN(s, esm_state_session_exception);
|
||||
FSM_TRAN(s, esm_state_exception);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -124,7 +124,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
|
|||
}
|
||||
default:
|
||||
{
|
||||
d_warn("Not implemented(type:%d)",
|
||||
d_error("Unknown message(type:%d)",
|
||||
message->esm.h.message_type);
|
||||
break;
|
||||
}
|
||||
|
@ -178,11 +178,14 @@ void esm_state_active(fsm_t *s, event_t *e)
|
|||
{
|
||||
case NAS_PDN_CONNECTIVITY_REQUEST:
|
||||
{
|
||||
d_trace(3, "[NAS] PDN connectivity request : "
|
||||
"UE[%s] --> ESM[EBI:%d]\n",
|
||||
mme_ue->imsi_bcd, bearer->ebi);
|
||||
rv = esm_handle_pdn_connectivity_request(
|
||||
bearer, &message->esm.pdn_connectivity_request);
|
||||
if (rv != CORE_OK)
|
||||
{
|
||||
FSM_TRAN(s, esm_state_session_exception);
|
||||
FSM_TRAN(s, esm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -191,6 +194,9 @@ void esm_state_active(fsm_t *s, event_t *e)
|
|||
}
|
||||
case NAS_PDN_DISCONNECT_REQUEST:
|
||||
{
|
||||
d_trace(3, "[NAS] PDN disconnect request : "
|
||||
"UE[%s] --> ESM[EBI:%d]\n",
|
||||
mme_ue->imsi_bcd, bearer->ebi);
|
||||
if (MME_HAVE_SGW_S1U_PATH(sess))
|
||||
{
|
||||
rv = mme_gtp_send_delete_session_request(sess);
|
||||
|
@ -199,14 +205,27 @@ void esm_state_active(fsm_t *s, event_t *e)
|
|||
}
|
||||
else
|
||||
{
|
||||
mme_sess_remove(sess);
|
||||
rv = nas_send_deactivate_bearer_context_request(bearer);
|
||||
d_assert(rv == CORE_OK, return,
|
||||
"nas_send_deactivate_bearer_context_request failed");
|
||||
}
|
||||
FSM_TRAN(s, esm_state_disconnect);
|
||||
FSM_TRAN(s, esm_state_pdn_will_disconnect);
|
||||
break;
|
||||
}
|
||||
case NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
{
|
||||
d_trace(3, "[NAS] Deactivate EPS bearer context accept : "
|
||||
"UE[%s] --> ESM[EBI:%d] in ACTIVE state\n",
|
||||
mme_ue->imsi_bcd, bearer->ebi);
|
||||
rv = mme_gtp_send_delete_bearer_response(bearer);
|
||||
d_assert(rv == CORE_OK, return,
|
||||
"mme_gtp_send_delete_session_request error");
|
||||
FSM_TRAN(s, esm_state_bearer_deactivated);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_warn("Not implemented(type:%d)",
|
||||
d_error("Unknown message(type:%d)",
|
||||
message->esm.h.message_type);
|
||||
break;
|
||||
}
|
||||
|
@ -222,7 +241,7 @@ void esm_state_active(fsm_t *s, event_t *e)
|
|||
}
|
||||
}
|
||||
|
||||
void esm_state_disconnect(fsm_t *s, event_t *e)
|
||||
void esm_state_pdn_will_disconnect(fsm_t *s, event_t *e)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
|
@ -257,9 +276,18 @@ void esm_state_disconnect(fsm_t *s, event_t *e)
|
|||
|
||||
switch(message->esm.h.message_type)
|
||||
{
|
||||
case NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
{
|
||||
d_trace(3, "[NAS] Deactivate EPS bearer context accept : "
|
||||
"UE[%s] --> ESM[EBI:%d] in PDN WILL DISCONNECT state\n",
|
||||
mme_ue->imsi_bcd, bearer->ebi);
|
||||
FSM_TRAN(s, esm_state_pdn_did_disconnect);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
FSM_TRAN(s, esm_state_session_exception);
|
||||
d_error("Unknown message(type:%d)",
|
||||
message->esm.h.message_type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -274,7 +302,7 @@ void esm_state_disconnect(fsm_t *s, event_t *e)
|
|||
}
|
||||
}
|
||||
|
||||
void esm_state_session_exception(fsm_t *s, event_t *e)
|
||||
void esm_state_pdn_did_disconnect(fsm_t *s, event_t *e)
|
||||
{
|
||||
mme_sm_trace(3, e);
|
||||
|
||||
|
@ -296,7 +324,29 @@ void esm_state_session_exception(fsm_t *s, event_t *e)
|
|||
}
|
||||
}
|
||||
|
||||
void esm_state_bearer_exception(fsm_t *s, event_t *e)
|
||||
void esm_state_bearer_deactivated(fsm_t *s, event_t *e)
|
||||
{
|
||||
mme_sm_trace(3, e);
|
||||
|
||||
switch (event_get(e))
|
||||
{
|
||||
case FSM_ENTRY_SIG:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case FSM_EXIT_SIG:
|
||||
{
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
d_error("Unknown event %s", mme_event_get_name(e));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void esm_state_exception(fsm_t *s, event_t *e)
|
||||
{
|
||||
mme_sm_trace(3, e);
|
||||
|
||||
|
|
|
@ -259,6 +259,38 @@ status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_gtp_send_delete_bearer_response(mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
|
||||
gtp_xact_t *xact = NULL;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
gtp_header_t h;
|
||||
pkbuf_t *pkbuf = NULL;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
xact = bearer->xact;
|
||||
d_assert(xact, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(&h, 0, sizeof(gtp_header_t));
|
||||
h.type = GTP_DELETE_BEARER_RESPONSE_TYPE;
|
||||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
rv = mme_s11_build_delete_bearer_response(&pkbuf, h.type, bearer);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
|
||||
|
||||
rv = gtp_xact_update_tx(xact, &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;
|
||||
}
|
||||
|
||||
status_t mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
status_t rv;
|
||||
|
|
|
@ -19,6 +19,8 @@ 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(
|
||||
mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_delete_bearer_response(
|
||||
mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_gtp_send_release_access_bearers_request(
|
||||
mme_ue_t *mme_ue);
|
||||
|
||||
|
|
|
@ -30,10 +30,8 @@ status_t mme_s11_build_create_session_request(
|
|||
gtp_bearer_qos_t bearer_qos;
|
||||
char bearer_qos_buf[GTP_BEARER_QOS_LEN];
|
||||
gtp_ue_timezone_t ue_timezone;
|
||||
c_int8_t apn[MAX_APN_LEN];
|
||||
|
||||
time_exp_t time_exp;
|
||||
time_exp_lt(&time_exp, time_now());
|
||||
c_int8_t apn[MAX_APN_LEN];
|
||||
|
||||
d_assert(sess, return CORE_ERROR, "Null param");
|
||||
pdn = sess->pdn;
|
||||
|
@ -201,7 +199,9 @@ status_t mme_s11_build_create_session_request(
|
|||
gtp_build_bearer_qos(&req->bearer_contexts_to_be_created.bearer_level_qos,
|
||||
&bearer_qos, bearer_qos_buf, GTP_BEARER_QOS_LEN);
|
||||
|
||||
/* UE Time Zone */
|
||||
memset(&ue_timezone, 0, sizeof(ue_timezone));
|
||||
time_exp_lt(&time_exp, time_now());
|
||||
if (time_exp.tm_gmtoff > 0)
|
||||
ue_timezone.sign = 0;
|
||||
else
|
||||
|
@ -262,6 +262,7 @@ status_t mme_s11_build_modify_bearer_request(pkbuf_t **pkbuf,
|
|||
|
||||
if (uli_presence)
|
||||
{
|
||||
/* User Location Information(ULI) */
|
||||
memset(&uli, 0, sizeof(gtp_uli_t));
|
||||
uli.flags.e_cgi = 1;
|
||||
uli.flags.tai = 1;
|
||||
|
@ -307,6 +308,7 @@ status_t mme_s11_build_delete_session_request(
|
|||
req->linked_eps_bearer_id.presence = 1;
|
||||
req->linked_eps_bearer_id.u8 = bearer->ebi;
|
||||
|
||||
/* User Location Information(ULI) */
|
||||
memset(&uli, 0, sizeof(gtp_uli_t));
|
||||
uli.flags.e_cgi = 1;
|
||||
uli.flags.tai = 1;
|
||||
|
@ -343,6 +345,8 @@ status_t mme_s11_build_create_bearer_response(
|
|||
int len;
|
||||
gtp_uli_t uli;
|
||||
char uli_buf[GTP_MAX_ULI_LEN];
|
||||
gtp_ue_timezone_t ue_timezone;
|
||||
time_exp_t time_exp;
|
||||
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
|
@ -389,6 +393,7 @@ status_t mme_s11_build_create_bearer_response(
|
|||
rsp->bearer_contexts.cause.len = sizeof(cause);
|
||||
rsp->bearer_contexts.cause.data = &cause;
|
||||
|
||||
/* User Location Information(ULI) */
|
||||
memset(&uli, 0, sizeof(gtp_uli_t));
|
||||
uli.flags.e_cgi = 1;
|
||||
uli.flags.tai = 1;
|
||||
|
@ -401,7 +406,93 @@ status_t mme_s11_build_create_bearer_response(
|
|||
gtp_build_uli(&rsp->user_location_information, &uli,
|
||||
uli_buf, GTP_MAX_ULI_LEN);
|
||||
|
||||
/* TODO : UE Time Zone */
|
||||
/* UE Time Zone */
|
||||
memset(&ue_timezone, 0, sizeof(ue_timezone));
|
||||
time_exp_lt(&time_exp, time_now());
|
||||
if (time_exp.tm_gmtoff > 0)
|
||||
ue_timezone.sign = 0;
|
||||
else
|
||||
ue_timezone.sign = 1;
|
||||
/* quarters of an hour */
|
||||
ue_timezone.gmtoff = GTP_TIME_TO_BCD(time_exp.tm_gmtoff / 900);
|
||||
ue_timezone.daylight_saving_time =
|
||||
GTP_UE_TIME_ZONE_NO_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME;
|
||||
rsp->ue_time_zone.presence = 1;
|
||||
rsp->ue_time_zone.data = &ue_timezone;
|
||||
rsp->ue_time_zone.len = sizeof(ue_timezone);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = gtp_build_msg(pkbuf, >p_message);
|
||||
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_s11_build_delete_bearer_response(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer)
|
||||
{
|
||||
status_t rv;
|
||||
gtp_message_t gtp_message;
|
||||
gtp_delete_bearer_response_t *rsp = >p_message.delete_bearer_response;
|
||||
|
||||
gtp_cause_t cause;
|
||||
gtp_uli_t uli;
|
||||
char uli_buf[GTP_MAX_ULI_LEN];
|
||||
gtp_ue_timezone_t ue_timezone;
|
||||
time_exp_t time_exp;
|
||||
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
||||
d_assert(bearer, return CORE_ERROR, "Null param");
|
||||
mme_ue = bearer->mme_ue;
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
|
||||
memset(>p_message, 0, sizeof(gtp_message_t));
|
||||
|
||||
/* Set Cause */
|
||||
memset(&cause, 0, sizeof(cause));
|
||||
cause.value = GTP_CAUSE_REQUEST_ACCEPTED;
|
||||
rsp->cause.presence = 1;
|
||||
rsp->cause.len = sizeof(cause);
|
||||
rsp->cause.data = &cause;
|
||||
|
||||
/* Bearer Context : EBI */
|
||||
rsp->bearer_contexts.presence = 1;
|
||||
rsp->bearer_contexts.eps_bearer_id.presence = 1;
|
||||
rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi;
|
||||
|
||||
/* Bearer Context : Cause */
|
||||
rsp->bearer_contexts.cause.presence = 1;
|
||||
rsp->bearer_contexts.cause.len = sizeof(cause);
|
||||
rsp->bearer_contexts.cause.data = &cause;
|
||||
|
||||
/* User Location Information(ULI) */
|
||||
memset(&uli, 0, sizeof(gtp_uli_t));
|
||||
uli.flags.e_cgi = 1;
|
||||
uli.flags.tai = 1;
|
||||
memcpy(&uli.tai.plmn_id, &mme_ue->tai.plmn_id, sizeof(uli.tai.plmn_id));
|
||||
uli.tai.tac = mme_ue->tai.tac;
|
||||
memcpy(&uli.e_cgi.plmn_id, &mme_ue->e_cgi.plmn_id,
|
||||
sizeof(uli.e_cgi.plmn_id));
|
||||
uli.e_cgi.cell_id = mme_ue->e_cgi.cell_id;
|
||||
rsp->user_location_information.presence = 1;
|
||||
gtp_build_uli(&rsp->user_location_information, &uli,
|
||||
uli_buf, GTP_MAX_ULI_LEN);
|
||||
|
||||
/* UE Time Zone */
|
||||
memset(&ue_timezone, 0, sizeof(ue_timezone));
|
||||
time_exp_lt(&time_exp, time_now());
|
||||
if (time_exp.tm_gmtoff > 0)
|
||||
ue_timezone.sign = 0;
|
||||
else
|
||||
ue_timezone.sign = 1;
|
||||
/* quarters of an hour */
|
||||
ue_timezone.gmtoff = GTP_TIME_TO_BCD(time_exp.tm_gmtoff / 900);
|
||||
ue_timezone.daylight_saving_time =
|
||||
GTP_UE_TIME_ZONE_NO_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME;
|
||||
rsp->ue_time_zone.presence = 1;
|
||||
rsp->ue_time_zone.data = &ue_timezone;
|
||||
rsp->ue_time_zone.len = sizeof(ue_timezone);
|
||||
|
||||
gtp_message.h.type = type;
|
||||
rv = gtp_build_msg(pkbuf, >p_message);
|
||||
|
|
|
@ -15,6 +15,8 @@ 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(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_s11_build_delete_bearer_response(
|
||||
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer);
|
||||
CORE_DECLARE(status_t) mme_s11_build_release_access_bearers_request(
|
||||
pkbuf_t **pkbuf, c_uint8_t type);
|
||||
CORE_DECLARE(status_t) mme_s11_build_downlink_data_notification_ack(
|
||||
|
|
|
@ -94,7 +94,7 @@ void mme_s11_handle_create_session_response(
|
|||
rv = gtp_xact_commit(xact);
|
||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
||||
|
||||
if (FSM_CHECK(&mme_ue->sm, emm_state_default_esm))
|
||||
if (FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup))
|
||||
{
|
||||
rv = nas_send_attach_accept(mme_ue);
|
||||
d_assert(rv == CORE_OK, return, "nas_send_attach_accept failed");
|
||||
|
@ -193,7 +193,7 @@ void mme_s11_handle_delete_session_response(
|
|||
|
||||
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_DELETE_SESSION,);
|
||||
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_disconnect))
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_pdn_will_disconnect))
|
||||
{
|
||||
rv = nas_send_deactivate_bearer_context_request(bearer);
|
||||
d_assert(rv == CORE_OK, return,
|
||||
|
@ -220,7 +220,7 @@ void mme_s11_handle_delete_session_response(
|
|||
d_assert(0,, "Invalid ESM state");
|
||||
}
|
||||
}
|
||||
else if (FSM_CHECK(&mme_ue->sm, emm_state_default_esm))
|
||||
else if (FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup))
|
||||
{
|
||||
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_DELETE_SESSION,
|
||||
S1ap_Cause_t cause;
|
||||
|
|
|
@ -41,7 +41,7 @@ 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_default_esm))
|
||||
if (FSM_CHECK(&mme_ue->sm, emm_state_initial_context_setup))
|
||||
{
|
||||
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST)
|
||||
{
|
||||
|
|
|
@ -288,6 +288,8 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
nas_message_t message;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
mme_bearer_t *default_bearer = NULL;
|
||||
mme_sess_t *sess = NULL;
|
||||
pkbuf_t *pkbuf = NULL;
|
||||
|
||||
mme_ue = mme_ue_find(event_get_param1(e));
|
||||
|
@ -300,20 +302,38 @@ void mme_state_operational(fsm_t *s, event_t *e)
|
|||
|
||||
bearer = mme_bearer_find_or_add_by_message(mme_ue, &message);
|
||||
d_assert(bearer, pkbuf_free(pkbuf); break, "No Bearer context");
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, pkbuf_free(pkbuf); break, "Null param");
|
||||
default_bearer = mme_default_bearer_in_sess(sess);
|
||||
d_assert(default_bearer, pkbuf_free(pkbuf); break, "Null param");
|
||||
|
||||
event_set_param1(e, (c_uintptr_t)bearer->index);
|
||||
event_set_param3(e, (c_uintptr_t)&message);
|
||||
|
||||
fsm_dispatch(&bearer->sm, (fsm_event_t*)e);
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_session_exception))
|
||||
if (FSM_CHECK(&bearer->sm, esm_state_bearer_deactivated) ||
|
||||
FSM_CHECK(&bearer->sm, esm_state_exception))
|
||||
{
|
||||
mme_sess_t *sess = bearer->sess;
|
||||
d_assert(sess, pkbuf_free(pkbuf); break, "Null param");
|
||||
mme_sess_remove(sess);
|
||||
if (default_bearer->ebi == bearer->ebi)
|
||||
{
|
||||
/* if the bearer is a default bearer,
|
||||
* remove all session context linked the default bearer */
|
||||
mme_sess_remove(sess);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if the bearer is not a default bearer,
|
||||
* just remove the bearer context */
|
||||
mme_bearer_remove(bearer);
|
||||
}
|
||||
}
|
||||
else if (FSM_CHECK(&bearer->sm, esm_state_bearer_exception))
|
||||
else if (FSM_CHECK(&bearer->sm, esm_state_pdn_did_disconnect))
|
||||
{
|
||||
d_assert(0, pkbuf_free(pkbuf); break, "Not implemented");
|
||||
d_assert(default_bearer->ebi == bearer->ebi,
|
||||
pkbuf_free(pkbuf); break,
|
||||
"Bearer[%d] is not Default Bearer",
|
||||
default_bearer->ebi, bearer->ebi);
|
||||
mme_sess_remove(sess);
|
||||
}
|
||||
|
||||
pkbuf_free(pkbuf);
|
||||
|
|
|
@ -25,7 +25,7 @@ void emm_state_detached(fsm_t *s, event_t *e);
|
|||
void emm_state_identity(fsm_t *s, event_t *e);
|
||||
void emm_state_authentication(fsm_t *s, event_t *e);
|
||||
void emm_state_security_mode(fsm_t *s, event_t *e);
|
||||
void emm_state_default_esm(fsm_t *s, event_t *e);
|
||||
void emm_state_initial_context_setup(fsm_t *s, event_t *e);
|
||||
void emm_state_attached(fsm_t *s, event_t *e);
|
||||
void emm_state_exception(fsm_t *s, event_t *e);
|
||||
|
||||
|
@ -33,9 +33,10 @@ void esm_state_initial(fsm_t *s, event_t *e);
|
|||
void esm_state_final(fsm_t *s, event_t *e);
|
||||
void esm_state_inactive(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);
|
||||
void esm_state_pdn_will_disconnect(fsm_t *s, event_t *e);
|
||||
void esm_state_pdn_did_disconnect(fsm_t *s, event_t *e);
|
||||
void esm_state_bearer_deactivated(fsm_t *s, event_t *e);
|
||||
void esm_state_exception(fsm_t *s, event_t *e);
|
||||
|
||||
#define mme_sm_print(__pe) \
|
||||
d_print("%s(): %s\n", __func__, mme_event_get_name(__pe))
|
||||
|
|
|
@ -197,3 +197,38 @@ void pgw_s5c_handle_create_bearer_response(
|
|||
d_trace(3, "[PGW] Create Bearer Response : SGW[0x%x] --> PGW[0x%x]\n",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
}
|
||||
|
||||
void pgw_s5c_handle_delete_bearer_response(
|
||||
pgw_sess_t *sess, gtp_xact_t *xact, gtp_delete_bearer_response_t *req)
|
||||
{
|
||||
status_t rv;
|
||||
pgw_bearer_t *bearer = NULL;
|
||||
|
||||
d_assert(xact, return, "Null param");
|
||||
d_assert(sess, return, "Null param");
|
||||
d_assert(req, return, "Null param");
|
||||
|
||||
if (req->bearer_contexts.presence == 0)
|
||||
{
|
||||
d_error("No Bearer");
|
||||
return;
|
||||
}
|
||||
if (req->bearer_contexts.eps_bearer_id.presence == 0)
|
||||
{
|
||||
d_error("No EPS Bearer ID");
|
||||
return;
|
||||
}
|
||||
|
||||
bearer = pgw_bearer_find_by_ebi(
|
||||
sess, req->bearer_contexts.eps_bearer_id.u8);
|
||||
d_assert(bearer, return, "No Bearer Context[EBI:%d]",
|
||||
req->bearer_contexts.eps_bearer_id);
|
||||
|
||||
rv = gtp_xact_commit(xact);
|
||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
||||
|
||||
d_trace(3, "[PGW] Delete Bearer Response : SGW[0x%x] --> PGW[0x%x]\n",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
pgw_bearer_remove(bearer);
|
||||
}
|
||||
|
|
|
@ -15,6 +15,8 @@ CORE_DECLARE(void) pgw_s5c_handle_delete_session_request(
|
|||
pgw_sess_t *sess, gtp_xact_t *xact, gtp_delete_session_request_t *req);
|
||||
CORE_DECLARE(void) pgw_s5c_handle_create_bearer_response(
|
||||
pgw_sess_t *sess, gtp_xact_t *xact, gtp_create_bearer_response_t *req);
|
||||
CORE_DECLARE(void) pgw_s5c_handle_delete_bearer_response(
|
||||
pgw_sess_t *sess, gtp_xact_t *xact, gtp_delete_bearer_response_t *req);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -126,8 +126,14 @@ void pgw_state_operational(fsm_t *s, event_t *e)
|
|||
sess, xact, &message->create_bearer_response);
|
||||
pkbuf_free(copybuf);
|
||||
break;
|
||||
case GTP_DELETE_BEARER_RESPONSE_TYPE:
|
||||
pgw_s5c_handle_delete_bearer_response(
|
||||
sess, xact, &message->delete_bearer_response);
|
||||
pkbuf_free(copybuf);
|
||||
break;
|
||||
default:
|
||||
d_warn("Not implmeneted(type:%d)", message->h.type);
|
||||
pkbuf_free(copybuf);
|
||||
break;
|
||||
}
|
||||
pkbuf_free(recvbuf);
|
||||
|
|
|
@ -459,6 +459,61 @@ void sgw_s11_handle_create_bearer_response(gtp_xact_t *s11_xact,
|
|||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_delete_bearer_response(gtp_xact_t *s11_xact,
|
||||
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *pkbuf = NULL;
|
||||
gtp_xact_t *s5c_xact = NULL;
|
||||
sgw_sess_t *sess = NULL;
|
||||
sgw_bearer_t *bearer = NULL;
|
||||
gtp_delete_bearer_response_t *req = NULL;
|
||||
|
||||
d_assert(s11_xact, return, "Null param");
|
||||
d_assert(sgw_ue, return, "Null param");
|
||||
d_assert(gtp_message, return, "Null param");
|
||||
s5c_xact = s11_xact->assoc_xact;
|
||||
d_assert(s5c_xact, return, "Null param");
|
||||
|
||||
req = >p_message->delete_bearer_response;
|
||||
d_assert(req, return, "Null param");
|
||||
|
||||
if (req->bearer_contexts.presence == 0)
|
||||
{
|
||||
d_error("No Bearer");
|
||||
return;
|
||||
}
|
||||
if (req->bearer_contexts.eps_bearer_id.presence == 0)
|
||||
{
|
||||
d_error("No EPS Bearer ID");
|
||||
return;
|
||||
}
|
||||
|
||||
bearer = sgw_bearer_find_by_ue_ebi(
|
||||
sgw_ue, req->bearer_contexts.eps_bearer_id.u8);
|
||||
d_assert(bearer, return, "No Bearer Context[EBI:%d]",
|
||||
req->bearer_contexts.eps_bearer_id);
|
||||
sess = bearer->sess;
|
||||
d_assert(sess, return, "Null param");
|
||||
|
||||
gtp_message->h.type = GTP_DELETE_BEARER_RESPONSE_TYPE;
|
||||
gtp_message->h.teid = sess->pgw_s5c_teid;
|
||||
|
||||
rv = gtp_build_msg(&pkbuf, gtp_message);
|
||||
d_assert(rv == CORE_OK, return, "gtp build failed");
|
||||
|
||||
rv = gtp_xact_update_tx(s5c_xact, >p_message->h, pkbuf);
|
||||
d_assert(s5c_xact, return, "Null param");
|
||||
|
||||
rv = gtp_xact_commit(s5c_xact);
|
||||
d_assert(rv == CORE_OK, return, "xact_commit error");
|
||||
|
||||
d_trace(3, "[SGW] Delete Bearer Response : SGW[0x%x] --> PGW[0x%x]\n",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
sgw_bearer_remove(bearer);
|
||||
}
|
||||
|
||||
void sgw_s11_handle_release_access_bearers_request(gtp_xact_t *s11_xact,
|
||||
sgw_ue_t *sgw_ue, gtp_release_access_bearers_request_t *req)
|
||||
{
|
||||
|
|
|
@ -17,6 +17,8 @@ CORE_DECLARE(void) sgw_s11_handle_delete_session_request(gtp_xact_t *s11_xact,
|
|||
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
|
||||
CORE_DECLARE(void) sgw_s11_handle_create_bearer_response(gtp_xact_t *s11_xact,
|
||||
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
|
||||
CORE_DECLARE(void) sgw_s11_handle_delete_bearer_response(gtp_xact_t *s11_xact,
|
||||
sgw_ue_t *sgw_ue, gtp_message_t *gtp_message);
|
||||
|
||||
CORE_DECLARE(void) sgw_s11_handle_release_access_bearers_request(
|
||||
gtp_xact_t *s11_xact, sgw_ue_t *sgw_ue,
|
||||
|
|
|
@ -106,6 +106,10 @@ void sgw_state_operational(fsm_t *s, event_t *e)
|
|||
sgw_s11_handle_create_bearer_response(xact, sgw_ue,
|
||||
&message);
|
||||
break;
|
||||
case GTP_DELETE_BEARER_RESPONSE_TYPE:
|
||||
sgw_s11_handle_delete_bearer_response(xact, sgw_ue,
|
||||
&message);
|
||||
break;
|
||||
case GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE:
|
||||
sgw_s11_handle_release_access_bearers_request(xact, sgw_ue,
|
||||
&message.release_access_bearers_request);
|
||||
|
|
|
@ -1108,8 +1108,9 @@ status_t tests1ap_build_e_rab_release_response(pkbuf_t **pkbuf, int i)
|
|||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"2007001d0000"
|
||||
"0300004005c08000 0108000840030001 000045400600000f 40010c",
|
||||
"",
|
||||
"0300004005c00000 0001000840030001 000045400600000f 40010c",
|
||||
"2007001d0000"
|
||||
"0300004005c00000 0001000840030001 000045400600000f 40010e",
|
||||
"",
|
||||
|
||||
"",
|
||||
|
@ -1123,7 +1124,7 @@ status_t tests1ap_build_e_rab_release_response(pkbuf_t **pkbuf, int i)
|
|||
};
|
||||
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
33,
|
||||
0,
|
||||
33,
|
||||
0,
|
||||
|
||||
0,
|
||||
|
@ -1251,9 +1252,11 @@ status_t tests1ap_build_deactivate_bearer_accept(
|
|||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"000d40370000"
|
||||
"0500000005c08000 0108000800030001 00001a000a09274c b2ebbd056200ce00"
|
||||
"0500000005c00000 0001000800030001 00001a000a09274c b2ebbd056200ce00"
|
||||
"6440080055f50100 19d0100043400600 55f5011022",
|
||||
"000d40370000"
|
||||
"0500000005c00000 0001000800030001 00001a000a09273e c7610a057200ce00"
|
||||
"6440080055f50100 19d0100043400600 55f5011022",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
|
@ -1267,7 +1270,7 @@ status_t tests1ap_build_deactivate_bearer_accept(
|
|||
};
|
||||
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
59,
|
||||
0,
|
||||
59,
|
||||
0,
|
||||
|
||||
0,
|
||||
|
|
|
@ -272,19 +272,17 @@ static void volte_test1(abts_case *tc, void *data)
|
|||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
pkbuf_free(recvbuf);
|
||||
|
||||
#if 0
|
||||
/* Send E-RAB Release Response */
|
||||
rv = tests1ap_build_e_rab_release_response(&sendbuf, msgindex);
|
||||
rv = tests1ap_build_e_rab_release_response(&sendbuf, msgindex+1);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
||||
/* Deactivate EPS bearer context accept */
|
||||
rv = tests1ap_build_deactivate_bearer_accept(&sendbuf, msgindex);
|
||||
rv = tests1ap_build_deactivate_bearer_accept(&sendbuf, msgindex+1);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
#endif
|
||||
|
||||
core_sleep(time_from_msec(1000));
|
||||
#if 0
|
||||
|
|
|
@ -1108,8 +1108,9 @@ status_t tests1ap_build_e_rab_release_response(pkbuf_t **pkbuf, int i)
|
|||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"2007001d0000"
|
||||
"0300004005c08000 0108000840030001 000045400600000f 40010c",
|
||||
"",
|
||||
"0300004005c00000 0001000840030001 000045400600000f 40010c",
|
||||
"2007001d0000"
|
||||
"0300004005c00000 0001000840030001 000045400600000f 40010e",
|
||||
"",
|
||||
|
||||
"",
|
||||
|
@ -1123,7 +1124,7 @@ status_t tests1ap_build_e_rab_release_response(pkbuf_t **pkbuf, int i)
|
|||
};
|
||||
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
33,
|
||||
0,
|
||||
33,
|
||||
0,
|
||||
|
||||
0,
|
||||
|
@ -1251,9 +1252,11 @@ status_t tests1ap_build_deactivate_bearer_accept(
|
|||
{
|
||||
char *payload[TESTS1AP_MAX_MESSAGE] = {
|
||||
"000d40370000"
|
||||
"0500000005c08000 0108000800030001 00001a000a09274c b2ebbd056200ce00"
|
||||
"0500000005c00000 0001000800030001 00001a000a09274c b2ebbd056200ce00"
|
||||
"6440080055f50100 19d0100043400600 55f5011022",
|
||||
"000d40370000"
|
||||
"0500000005c00000 0001000800030001 00001a000a09273e c7610a057200ce00"
|
||||
"6440080055f50100 19d0100043400600 55f5011022",
|
||||
"",
|
||||
"",
|
||||
|
||||
"",
|
||||
|
@ -1267,7 +1270,7 @@ status_t tests1ap_build_deactivate_bearer_accept(
|
|||
};
|
||||
c_uint16_t len[TESTS1AP_MAX_MESSAGE] = {
|
||||
59,
|
||||
0,
|
||||
59,
|
||||
0,
|
||||
|
||||
0,
|
||||
|
|
Loading…
Reference in New Issue