deactivate dedicated bearer is done

This commit is contained in:
Sukchan Lee 2018-01-16 22:14:59 +09:00
parent 60b59babe0
commit 47407e4855
19 changed files with 359 additions and 50 deletions

View File

@ -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
{

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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, &gtp_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 = &gtp_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(&gtp_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, &gtp_message);

View File

@ -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(

View File

@ -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;

View File

@ -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)
{

View File

@ -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);

View File

@ -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))

View File

@ -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);
}

View File

@ -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
}

View File

@ -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);

View File

@ -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 = &gtp_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, &gtp_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)
{

View File

@ -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,

View File

@ -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);

View File

@ -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,

View File

@ -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

View File

@ -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,