deactivate bearer context request is added

This commit is contained in:
Sukchan Lee 2018-01-16 20:49:39 +09:00
parent 733f598f24
commit 60b59babe0
10 changed files with 190 additions and 0 deletions

View File

@ -240,6 +240,7 @@ void mme_s11_handle_delete_session_response(
d_assert(0,, "Invalid EMM state");
}
void mme_s11_handle_create_bearer_request(
gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_create_bearer_request_t *req)
{
@ -338,6 +339,67 @@ void mme_s11_handle_create_bearer_request(
}
}
void mme_s11_handle_delete_bearer_request(
gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_delete_bearer_request_t *req)
{
status_t rv;
mme_bearer_t *bearer = NULL;
d_assert(xact, return, "Null param");
d_assert(mme_ue, return, "Null param");
d_assert(req, return, "Null param");
d_trace(3, "[MME] Delete Bearer Request : MME[%d] <-- SGW[%d]\n",
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
if (req->linked_eps_bearer_id.presence == 1)
{
bearer = mme_bearer_find_by_ue_ebi(mme_ue, req->linked_eps_bearer_id.u8);
d_assert(bearer, return,
"No Bearer Context(EBI:%d)", req->linked_eps_bearer_id.u8);
}
else if (req->eps_bearer_ids.presence == 1)
{
bearer = mme_bearer_find_by_ue_ebi(
mme_ue, req->eps_bearer_ids.u8);
d_assert(bearer, return,
"No Bearer Context(EBI:%d)", req->eps_bearer_ids.u8);
}
else
{
d_error("No Linked EBI or EPS Bearer ID");
return;
}
/* Save Transaction. will be handled after EMM-attached */
bearer->xact = xact;
if (/* Check if Activate Default/Dedicated Bearer Accept is received */
FSM_CHECK(&bearer->sm, esm_state_active) &&
/* Check if Initial Context Setup Response or
* E-RAB Setup Response is received */
MME_HAVE_ENB_S1U_PATH(bearer))
{
rv = nas_send_deactivate_bearer_context_request(bearer);
d_assert(rv == CORE_OK, return,
"nas_send_deactivate_bearer_context_request failed");
}
else
{
if (!FSM_CHECK(&bearer->sm, esm_state_active))
{
d_assert(0,, "Invalid Bearer State");
}
else if (!MME_HAVE_ENB_S1U_PATH(bearer))
{
d_assert(0,, "No ENB S1U PATH");
}
else
d_assert(0,,);
}
}
void mme_s11_handle_release_access_bearers_response(
gtp_xact_t *xact, mme_ue_t *mme_ue,
gtp_release_access_bearers_response_t *rsp)

View File

@ -17,6 +17,8 @@ CORE_DECLARE(void) mme_s11_handle_delete_session_response(
gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_delete_session_response_t *rsp);
CORE_DECLARE(void) mme_s11_handle_create_bearer_request(
gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_create_bearer_request_t *rsp);
CORE_DECLARE(void) mme_s11_handle_delete_bearer_request(
gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_delete_bearer_request_t *rsp);
CORE_DECLARE(void) mme_s11_handle_release_access_bearers_response(
gtp_xact_t *xact, mme_ue_t *mme_ue,

View File

@ -407,6 +407,10 @@ void mme_state_operational(fsm_t *s, event_t *e)
mme_s11_handle_create_bearer_request(
xact, mme_ue, &message.create_bearer_request);
break;
case GTP_DELETE_BEARER_REQUEST_TYPE:
mme_s11_handle_delete_bearer_request(
xact, mme_ue, &message.delete_bearer_request);
break;
case GTP_RELEASE_ACCESS_BEARERS_RESPONSE_TYPE:
mme_s11_handle_release_access_bearers_response(
xact, mme_ue, &message.release_access_bearers_response);

View File

@ -188,6 +188,19 @@ static status_t bearer_binding(pgw_sess_t *sess, gx_message_t *gx_message)
bearer = pgw_bearer_find_by_name(sess, pcc_rule->name);
d_assert(bearer, return CORE_ERROR,);
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_DELETE_BEARER_REQUEST_TYPE;
h.teid = sess->sgw_s5c_teid;
rv = pgw_s5c_build_delete_bearer_request(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->gnode, &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;
}
else

View File

@ -348,6 +348,45 @@ status_t pgw_s5c_build_create_bearer_request(
return CORE_OK;
}
status_t pgw_s5c_build_delete_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, pgw_bearer_t *bearer)
{
status_t rv;
pgw_sess_t *sess = NULL;
pgw_bearer_t *linked_bearer = NULL;
gtp_message_t gtp_message;
gtp_delete_bearer_request_t *req = NULL;
d_assert(bearer, return CORE_ERROR, "Null param");
sess = bearer->sess;
d_assert(sess, return CORE_ERROR, "Null param");
linked_bearer = pgw_default_bearer_in_sess(sess);
d_assert(linked_bearer, return CORE_ERROR, "Null param");
req = &gtp_message.delete_bearer_request;
memset(&gtp_message, 0, sizeof(gtp_message_t));
if (bearer->ebi == linked_bearer->ebi)
{
/* Linked EBI */
req->linked_eps_bearer_id.presence = 1;
req->linked_eps_bearer_id.u8 = bearer->ebi;
}
else
{
/* Bearer EBI */
req->eps_bearer_ids.presence = 1;
req->eps_bearer_ids.u8 = bearer->ebi;
}
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;
}
static c_int16_t pgw_pco_build(c_uint8_t *pco_buf, tlv_pco_t *tlv_pco)
{
status_t rv;

View File

@ -16,6 +16,8 @@ CORE_DECLARE(status_t) pgw_s5c_build_delete_session_response(
CORE_DECLARE(status_t) pgw_s5c_build_create_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, pgw_bearer_t *bearer);
CORE_DECLARE(status_t) pgw_s5c_build_delete_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, pgw_bearer_t *bearer);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -313,3 +313,44 @@ void sgw_s5c_handle_create_bearer_request(gtp_xact_t *s5c_xact,
s5u_tunnel->local_teid, s5u_tunnel->remote_teid);
}
void sgw_s5c_handle_delete_bearer_request(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message)
{
status_t rv;
gtp_xact_t *s11_xact = NULL;
gtp_delete_bearer_request_t *req = NULL;
pkbuf_t *pkbuf = NULL;
sgw_ue_t *sgw_ue = NULL;
d_assert(sess, return, "Null param");
sgw_ue = sess->sgw_ue;
d_assert(sgw_ue, return, "Null param");
d_assert(s5c_xact, return, "Null param");
d_assert(gtp_message, return, "Null param");
req = &gtp_message->delete_bearer_request;
if (req->linked_eps_bearer_id.presence == 0 &&
req->eps_bearer_ids.presence == 0)
{
d_error("No Linked EBI or EPS Bearer ID");
return;
}
gtp_message->h.type = GTP_DELETE_BEARER_REQUEST_TYPE;
gtp_message->h.teid = sgw_ue->mme_s11_teid;
rv = gtp_build_msg(&pkbuf, gtp_message);
d_assert(rv == CORE_OK, return, "gtp build failed");
s11_xact = gtp_xact_local_create(sgw_ue->gnode, &gtp_message->h, pkbuf);
d_assert(s11_xact, return, "Null param");
gtp_xact_associate(s5c_xact, s11_xact);
rv = gtp_xact_commit(s11_xact);
d_assert(rv == CORE_OK, return, "xact_commit error");
d_trace(3, "[SGW] Delete Bearer Request : SGW <-- PGW\n");
}

View File

@ -15,6 +15,8 @@ CORE_DECLARE(void) sgw_s5c_handle_delete_session_response(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_s5c_handle_create_bearer_request(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
CORE_DECLARE(void) sgw_s5c_handle_delete_bearer_request(gtp_xact_t *s5c_xact,
sgw_sess_t *sess, gtp_message_t *gtp_message);
#ifdef __cplusplus
}

View File

@ -167,6 +167,10 @@ void sgw_state_operational(fsm_t *s, event_t *e)
sgw_s5c_handle_create_bearer_request(xact, sess,
&message);
break;
case GTP_DELETE_BEARER_REQUEST_TYPE:
sgw_s5c_handle_delete_bearer_request(xact, sess,
&message);
break;
default:
d_warn("Not implmeneted(type:%d)", message.h.type);
break;

View File

@ -265,6 +265,27 @@ static void volte_test1(abts_case *tc, void *data)
/* Send Session-Termination-Request */
pcscf_rx_send_str(rx_sid);
/* Receive E-RAB Release Command +
* Dectivate EPS bearer context request */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rv = tests1ap_enb_read(sock, recvbuf);
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);
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);
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
/* Send PDN disconnectivity request */