temporal commit for deleting s11 session

This commit is contained in:
Brandon 2017-04-28 11:20:09 +09:00
parent b95e40a851
commit a21cb41c7a
7 changed files with 143 additions and 0 deletions

View File

@ -103,6 +103,23 @@ void emm_state_operational(fsm_t *s, event_t *e)
ue->mme_s11_teid, ue->sgw_s11_teid);
break;
}
case GTP_DELETE_SESSION_RESPONSE_TYPE:
{
mme_bearer_t *bearer = mme_bearer_first(ue);
while(bearer)
{
event_t e;
event_set(&e, MME_EVT_ESM_BEARER_FROM_S6A);
event_set_param1(&e, (c_uintptr_t)bearer->index);
event_set_param2(&e,
(c_uintptr_t)S6A_CMD_UPDATE_LOCATION);
mme_event_send(&e);
bearer = mme_bearer_next(bearer);
}
break;
}
}
break;
}

View File

@ -174,3 +174,39 @@ status_t mme_s11_build_modify_bearer_request(
return CORE_OK;
}
status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_bearer_t *bearer)
{
status_t rv;
pdn_t *pdn = NULL;
mme_sgw_t *sgw = NULL;
mme_ue_t *ue = NULL;
gtp_message_t gtp_message;
gtp_delete_session_request_t *req = &gtp_message.delete_session_request;
gtp_f_teid_t sender_cp_teid;
d_assert(bearer, return CORE_ERROR, "Null param");
pdn = bearer->pdn;
d_assert(pdn, return CORE_ERROR, "Null param");
sgw = bearer->sgw;
d_assert(sgw, return CORE_ERROR, "Null param");
ue = bearer->ue;
d_assert(ue, return CORE_ERROR, "Null param");
memset(&gtp_message, 0, sizeof(gtp_message_t));
memset(&mme_s11_teid, 0, sizeof(gtp_f_teid_t));
mme_s11_teid.ipv4 = 1;
mme_s11_teid.interface_type = GTP_F_TEID_S11_MME_GTP_C;
mme_s11_teid.teid = htonl(ue->mme_s11_teid);
mme_s11_teid.ipv4_addr = ue->mme_s11_addr;
req->sender_f_teid_for_control_plane.presence = 1;
req->sender_f_teid_for_control_plane.data = &mme_s11_teid;
req->sender_f_teid_for_control_plane.len = GTP_F_TEID_IPV4_LEN;
rv = gtp_build_msg(pkbuf, GTP_DELETE_SESSION_REQUEST_TYPE, &gtp_message);
d_assert(rv == CORE_OK, return CORE_ERROR, "gtp build failed");
return CORE_OK;
}

View File

@ -93,3 +93,32 @@ void mme_s11_handle_modify_bearer_response(
event_set_param2(&e, (c_uintptr_t)GTP_MODIFY_BEARER_RESPONSE_TYPE);
mme_event_send(&e);
}
void mme_s11_handle_delete_session_response(
mme_ue_t *ue, gtp_delete_session_response_t *rsp)
{
event_t e;
gtp_f_teid_t *sgw_s11_teid = NULL;
gtp_f_teid_t *sgw_s1u_teid = NULL;
mme_bearer_t *bearer = NULL;
pdn_t *pdn = NULL;
d_assert(ue, return, "Null param");
d_assert(rsp, return, "Null param");
if (rsp->cause == 0)
{
d_error("No Cause");
return;
}
d_info("[GTP] Delete Session Response : "
"MME[%d] <-- SGW[%d]", ue->mme_s11_teid, ue->sgw_s11_teid);
event_set(&e, MME_EVT_EMM_UE_FROM_S11);
event_set_param1(&e, (c_uintptr_t)ue->index);
event_set_param2(&e, (c_uintptr_t)GTP_DELETE_SESSION_RESPONSE_TYPE);
mme_event_send(&e);
}

View File

@ -13,6 +13,8 @@ CORE_DECLARE(void) mme_s11_handle_create_session_response(
mme_ue_t *ue, gtp_create_session_response_t *rsp);
CORE_DECLARE(void) mme_s11_handle_modify_bearer_response(
mme_ue_t *ue, gtp_modify_bearer_response_t *rsp);
CORE_DECLARE(void) mme_s11_handle_delete_session_response(
mme_ue_t *ue, gtp_delete_session_response_t *rsp);
#ifdef __cplusplus
}

View File

@ -257,6 +257,10 @@ void mme_state_operational(fsm_t *s, event_t *e)
mme_s11_handle_modify_bearer_response(
ue, &gtp_message.modify_bearer_response);
break;
case GTP_DELETE_SESSION_RESPONSE_TYPE:
mme_s11_handle_delete_session_response(
ue, &gtp_message.delete_session_response);
break;
default:
d_warn("Not implmeneted(type:%d)", type);
break;

View File

@ -8,6 +8,7 @@
#include "s1ap_build.h"
#include "s1ap_conv.h"
status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
{
int erval;
@ -257,3 +258,55 @@ status_t s1ap_build_initial_context_setup_request(
return CORE_OK;
}
status_t s1ap_build_ue_context_release_commnad(
pkbuf_t **s1apbuf, mme_ue_t *ue, S1ap_Cause_t cause)
{
char buf[INET_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_UEContextReleaseCommand_IEs_t *ies =
&message.s1ap_UEContextReleaseCommand_IEs;
d_assert(ue, return CORE_ERROR, "Null param");
memset(&message, 0, sizeof(s1ap_message_t));
if (ue->mme_ue_s1ap_id == 0)
{
d_error("invalid mme ue s1ap id (idx: %d)", ue->index);
return CORE_ERROR;
}
if (ue->enb_ue_s1ap_id)
{
ies->uE_S1AP_IDs.present = S1ap_UE_S1AP_IDs_PR_uE_S1AP_ID_pair;
ies->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID = ue->mme_ue_s1ap_id;
ies->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.eNB_UE_S1AP_ID = ue->enb_ue_s1ap_id;
ies->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.iE_Extensions = NULL;
}
else
{
ies->uE_S1AP_IDs.present = S1ap_UE_S1AP_IDs_PR_mME_UE_S1AP_ID;
ies->uE_S1AP_IDs.choice.mME_UE_S1AP_ID = ue->mme_ue_s1ap_id;
}
ies->cause = cause;
message.procedureCode = S1ap_ProcedureCode_id_UEContextRelease;
message.direction = S1AP_PDU_PR_initiatingMessage;
encoded = s1ap_encode_pdu(s1apbuf, &message);
s1ap_free_pdu(&message);
d_assert(s1apbuf && encoded >= 0,return CORE_ERROR,);
d_info("[S1AP] UE Context Release Command : "
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]",
ue->mme_ue_s1ap_id,
INET_NTOP(&ue->enb->s1ap_sock->remote.sin_addr.s_addr, buf),
ue->enb->enb_id);
return CORE_OK;
}

View File

@ -15,6 +15,8 @@ CORE_DECLARE(status_t) s1ap_build_downlink_nas_transport(
pkbuf_t **s1apbuf, mme_ue_t *ue, pkbuf_t *emmbuf);
CORE_DECLARE(status_t) s1ap_build_initial_context_setup_request(
pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *emmbuf);
CORE_DECLARE(status_t) s1ap_build_ue_context_release_commnad(
pkbuf_t **s1apbuf, mme_ue_t *ue, S1ap_Cause_t cause);
#ifdef __cplusplus
}