deactivate bearer context request is added
This commit is contained in:
parent
733f598f24
commit
60b59babe0
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = >p_message.delete_bearer_request;
|
||||
memset(>p_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, >p_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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 = >p_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, >p_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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue