S1HO modify bearer request/response is done..

This commit is contained in:
Sukchan Lee 2017-09-14 11:12:02 +09:00
parent eb1ff95ca6
commit 345f055dd7
15 changed files with 239 additions and 87 deletions

View File

@ -79,7 +79,7 @@ void esm_state_inactive(fsm_t *s, event_t *e)
if (MME_HAVE_ENB_S1U_PATH(bearer))
{
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
rv = mme_gtp_send_modify_bearer_request(NULL, bearer);
d_assert(rv == CORE_OK, return, "gtp send failed");
}

View File

@ -298,10 +298,11 @@ struct _mme_ue_t {
} \
} while(0);
#define MAX_NUM_OF_GTP_COUNTER 16
#define MAX_NUM_OF_GTP_COUNTER 16
#define GTP_COUNTER_DELETE_SESSION 0
#define GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH 1
#define GTP_COUNTER_DELETE_SESSION 0
#define GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH 1
#define GTP_COUNTER_MODIFY_BEARER_BY_HANDOVER_NOTIFY 2
struct {
c_uint8_t request;
c_uint8_t response;
@ -407,6 +408,9 @@ typedef struct _mme_bearer_t {
c_uint32_t sgw_s1u_teid;
c_uint32_t sgw_s1u_addr;
c_uint32_t target_s1u_teid; /* Target S1U TEID from HO-Req-Ack */
c_uint32_t target_s1u_addr; /* Target S1U ADDR from HO-Req-Ack */
c_uint32_t enb_dl_teid;
c_uint32_t enb_dl_addr;
c_uint32_t enb_ul_teid;

View File

@ -124,7 +124,7 @@ status_t mme_gtp_send_create_session_request(mme_sess_t *sess)
status_t mme_gtp_send_modify_bearer_request(
mme_bearer_t *bearer, int uli_present)
enb_ue_t *enb_ue, mme_bearer_t *bearer)
{
status_t rv;
@ -145,8 +145,7 @@ status_t mme_gtp_send_modify_bearer_request(
h.type = GTP_MODIFY_BEARER_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_modify_bearer_request(
&pkbuf, h.type, bearer, uli_present);
rv = mme_s11_build_modify_bearer_request(&pkbuf, h.type, enb_ue, bearer);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
@ -165,16 +164,19 @@ status_t mme_gtp_send_delete_session_request(mme_sess_t *sess)
gtp_header_t h;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_DELETE_SESSION_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_delete_session_request(&s11buf, h.type, sess);
rv = mme_s11_build_delete_session_request(&s11buf, h.type, enb_ue, sess);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, s11buf);
@ -224,6 +226,7 @@ status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
@ -231,6 +234,8 @@ status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
d_assert(bearer, return CORE_ERROR, "Null param");
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
xact = bearer->xact;
d_assert(xact, return CORE_ERROR, "Null param");
@ -238,7 +243,7 @@ status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
h.type = GTP_CREATE_BEARER_RESPONSE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, enb_ue, bearer);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);

View File

@ -14,7 +14,7 @@ CORE_DECLARE(status_t) mme_gtp_close();
CORE_DECLARE(status_t) mme_gtp_send_create_session_request(mme_sess_t *sess);
CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request(
mme_bearer_t *bearer, int uli_present);
enb_ue_t *enb_ue, mme_bearer_t *bearer);
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(

View File

@ -162,21 +162,17 @@ status_t mme_s11_build_create_session_request(
}
status_t mme_s11_build_modify_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer, int uli_present)
pkbuf_t **pkbuf, c_uint8_t type, enb_ue_t *enb_ue, mme_bearer_t *bearer)
{
status_t rv;
gtp_message_t gtp_message;
gtp_modify_bearer_request_t *req = &gtp_message.modify_bearer_request;
mme_ue_t *mme_ue = NULL;
gtp_f_teid_t enb_s1u_teid;
gtp_uli_t uli;
char uli_buf[GTP_MAX_ULI_LEN];
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));
@ -196,17 +192,17 @@ status_t mme_s11_build_modify_bearer_request(
req->bearer_contexts_to_be_modified.s1_u_enodeb_f_teid.len =
GTP_F_TEID_IPV4_LEN;
if (uli_present)
if (enb_ue)
{
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
memcpy(&uli.tai.plmn_id, &mme_ue->enb_ue->tai.plmn_id,
memcpy(&uli.tai.plmn_id, &enb_ue->tai.plmn_id,
sizeof(uli.tai.plmn_id));
uli.tai.tac = mme_ue->enb_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &mme_ue->enb_ue->e_cgi.plmn_id,
uli.tai.tac = enb_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &enb_ue->e_cgi.plmn_id,
sizeof(uli.e_cgi.plmn_id));
uli.e_cgi.cell_id = mme_ue->enb_ue->e_cgi.cell_id;
uli.e_cgi.cell_id = enb_ue->e_cgi.cell_id;
req->user_location_information.presence = 1;
gtp_build_uli(&req->user_location_information, &uli,
uli_buf, GTP_MAX_ULI_LEN);
@ -220,10 +216,9 @@ status_t mme_s11_build_modify_bearer_request(
}
status_t mme_s11_build_delete_session_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_sess_t *sess)
pkbuf_t **pkbuf, c_uint8_t type, enb_ue_t *enb_ue, mme_sess_t *sess)
{
status_t rv;
mme_ue_t *mme_ue = NULL;
mme_bearer_t *bearer = NULL;
gtp_message_t gtp_message;
gtp_delete_session_request_t *req = &gtp_message.delete_session_request;
@ -233,8 +228,6 @@ status_t mme_s11_build_delete_session_request(
gtp_indication_t indication;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
bearer = mme_default_bearer_in_sess(sess);
d_assert(bearer, return CORE_ERROR, "Null param");
@ -243,18 +236,21 @@ status_t mme_s11_build_delete_session_request(
req->linked_eps_bearer_id.presence = 1;
req->linked_eps_bearer_id.u8 = bearer->ebi;
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
memcpy(&uli.tai.plmn_id, &mme_ue->enb_ue->tai.plmn_id,
sizeof(uli.tai.plmn_id));
uli.tai.tac = mme_ue->enb_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &mme_ue->enb_ue->e_cgi.plmn_id,
sizeof(uli.tai.plmn_id));
uli.e_cgi.cell_id = mme_ue->enb_ue->e_cgi.cell_id;
req->user_location_information.presence = 1;
gtp_build_uli(&req->user_location_information, &uli,
uli_buf, GTP_MAX_ULI_LEN);
if (enb_ue)
{
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
memcpy(&uli.tai.plmn_id, &enb_ue->tai.plmn_id,
sizeof(uli.tai.plmn_id));
uli.tai.tac = enb_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &enb_ue->e_cgi.plmn_id,
sizeof(uli.tai.plmn_id));
uli.e_cgi.cell_id = enb_ue->e_cgi.cell_id;
req->user_location_information.presence = 1;
gtp_build_uli(&req->user_location_information, &uli,
uli_buf, GTP_MAX_ULI_LEN);
}
memset(&indication, 0, sizeof(gtp_indication_t));
indication.oi = 1;
@ -270,22 +266,18 @@ status_t mme_s11_build_delete_session_request(
}
status_t mme_s11_build_create_bearer_response(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer)
pkbuf_t **pkbuf, c_uint8_t type, enb_ue_t *enb_ue, mme_bearer_t *bearer)
{
status_t rv;
gtp_message_t gtp_message;
gtp_create_bearer_response_t *rsp = &gtp_message.create_bearer_response;
mme_ue_t *mme_ue = NULL;
gtp_cause_t cause;
gtp_f_teid_t enb_s1u_teid, sgw_s1u_teid;
gtp_uli_t uli;
char uli_buf[GTP_MAX_ULI_LEN];
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));
@ -326,18 +318,21 @@ status_t mme_s11_build_create_bearer_response(
rsp->bearer_contexts.cause.len = sizeof(cause);
rsp->bearer_contexts.cause.data = &cause;
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
memcpy(&uli.tai.plmn_id, &mme_ue->enb_ue->tai.plmn_id,
sizeof(uli.tai.plmn_id));
uli.tai.tac = mme_ue->enb_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &mme_ue->enb_ue->e_cgi.plmn_id,
sizeof(uli.e_cgi.plmn_id));
uli.e_cgi.cell_id = mme_ue->enb_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);
if (enb_ue)
{
memset(&uli, 0, sizeof(gtp_uli_t));
uli.flags.e_cgi = 1;
uli.flags.tai = 1;
memcpy(&uli.tai.plmn_id, &enb_ue->tai.plmn_id,
sizeof(uli.tai.plmn_id));
uli.tai.tac = enb_ue->tai.tac;
memcpy(&uli.e_cgi.plmn_id, &enb_ue->e_cgi.plmn_id,
sizeof(uli.e_cgi.plmn_id));
uli.e_cgi.cell_id = enb_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);
}
/* TODO : UE Time Zone */
@ -369,7 +364,7 @@ status_t mme_s11_build_release_access_bearers_request(
}
status_t mme_s11_build_downlink_data_notification_ack(
pkbuf_t **pkbuf, c_uint8_t type, mme_ue_t *mme_ue)
pkbuf_t **pkbuf, c_uint8_t type)
{
status_t rv;
gtp_message_t gtp_message;
@ -378,8 +373,6 @@ status_t mme_s11_build_downlink_data_notification_ack(
gtp_cause_t cause;
d_assert(mme_ue, return CORE_ERROR, "Null param");
memset(&gtp_message, 0, sizeof(gtp_message_t));
memset(&cause, 0, sizeof(cause));

View File

@ -10,15 +10,17 @@ extern "C" {
CORE_DECLARE(status_t) mme_s11_build_create_session_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_sess_t *sess);
CORE_DECLARE(status_t) mme_s11_build_modify_bearer_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_bearer_t *bearer, int uli_present);
pkbuf_t **pkbuf, c_uint8_t type,
enb_ue_t *enb_ue, mme_bearer_t *bearer);
CORE_DECLARE(status_t) mme_s11_build_delete_session_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_sess_t *sess);
pkbuf_t **pkbuf, c_uint8_t type, enb_ue_t *enb_ue, 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);
pkbuf_t **pkbuf, c_uint8_t type,
enb_ue_t *enb_ue, 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(
pkbuf_t **pkbuf, c_uint8_t type, mme_ue_t *mme_ue);
pkbuf_t **pkbuf, c_uint8_t type);
CORE_DECLARE(status_t)
mme_s11_build_create_indirect_data_forwarding_tunnel_request(
pkbuf_t **pkbuf, c_uint8_t type, mme_ue_t *mme_ue);

View File

@ -125,6 +125,10 @@ void mme_s11_handle_modify_bearer_response(
rv = s1ap_send_path_switch_ack(mme_ue);
d_assert(rv == CORE_OK, return, "s1ap send error");
);
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_HANDOVER_NOTIFY,
printf("Handover Notify\n");
);
}
void mme_s11_handle_delete_session_response(
@ -324,7 +328,7 @@ void mme_s11_handle_downlink_data_notification(
h.type = GTP_DOWNLINK_DATA_NOTIFICATION_ACKNOWLEDGE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_downlink_data_notification_ack(&s11buf, h.type, mme_ue);
rv = mme_s11_build_downlink_data_notification_ack(&s11buf, h.type);
d_assert(rv == CORE_OK, return, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, s11buf);

View File

@ -928,6 +928,43 @@ status_t s1ap_build_handover_command(pkbuf_t **s1apbuf, enb_ue_t *enb_ue)
return CORE_OK;
}
status_t s1ap_build_mme_status_transfer(pkbuf_t **s1apbuf,
enb_ue_t *enb_ue, S1ap_ENBStatusTransferIEs_t *enb_ies)
{
char buf[INET_ADDRSTRLEN];
int encoded;
s1ap_message_t message;
S1ap_MMEStatusTransferIEs_t *mme_ies = &message.s1ap_MMEStatusTransferIEs;
d_assert(enb_ue, return CORE_ERROR, "Null param");
d_assert(enb_ies, return CORE_ERROR, "Null param");
memset(&message, 0, sizeof(s1ap_message_t));
mme_ies->mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id;
mme_ies->eNB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id;
memcpy(&mme_ies->eNB_StatusTransfer_TransparentContainer,
&enb_ies->eNB_StatusTransfer_TransparentContainer,
sizeof(S1ap_ENB_StatusTransfer_TransparentContainer_t));
message.procedureCode = S1ap_ProcedureCode_id_MMEStatusTransfer;
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_trace(3, "[S1AP] MME Status Transfer : ",
"UE[mME-UE-S1AP-ID(%d)] <-- eNB[%s:%d]\n",
enb_ue->mme_ue_s1ap_id,
INET_NTOP(&enb_ue->enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb_ue->enb->enb_id);
return CORE_OK;
}
static void s1ap_build_cause(S1ap_Cause_t *dst, S1ap_Cause_t *src)
{
d_assert(src, return, "Null param");

View File

@ -33,6 +33,8 @@ CORE_DECLARE(status_t) s1ap_build_handover_request(
S1ap_HandoverRequiredIEs_t *required);
CORE_DECLARE(status_t) s1ap_build_handover_command(
pkbuf_t **s1apbuf, enb_ue_t *enb_ue);
CORE_DECLARE(status_t) s1ap_build_mme_status_transfer(pkbuf_t **s1apbuf,
enb_ue_t *enb_ue, S1ap_ENBStatusTransferIEs_t *enb_ies);
#ifdef __cplusplus
}

View File

@ -251,6 +251,7 @@ void s1ap_handle_ue_capability_info_indication(
void s1ap_handle_initial_context_setup_response(
mme_enb_t *enb, s1ap_message_t *message)
{
status_t rv;
char buf[INET_ADDRSTRLEN];
int i = 0;
@ -295,9 +296,13 @@ void s1ap_handle_initial_context_setup_response(
if (FSM_CHECK(&bearer->sm, esm_state_active))
{
status_t rv;
rv = mme_gtp_send_modify_bearer_request(bearer,
mme_ue->nas_eps.type != MME_EPS_TYPE_ATTACH_REQUEST ? 1 : 0);
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST)
{
/* if ATTACH REQUEST,
ULI(CellID, TAC) is excluded in Modify Bearer Request */
enb_ue = NULL;
}
rv = mme_gtp_send_modify_bearer_request(enb_ue, bearer);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
}
@ -358,7 +363,7 @@ void s1ap_handle_e_rab_setup_response(
if (bearer->ebi == linked_bearer->ebi)
{
rv = mme_gtp_send_modify_bearer_request(bearer, 0);
rv = mme_gtp_send_modify_bearer_request(NULL, bearer);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
else
@ -629,7 +634,7 @@ void s1ap_handle_path_switch_request(
GTP_COUNTER_INCREMENT(
mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH);
rv = mme_gtp_send_modify_bearer_request(bearer, 1);
rv = mme_gtp_send_modify_bearer_request(enb_ue, bearer);
d_assert(rv == CORE_OK, return, "gtp send failed");
}
@ -730,11 +735,11 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID);
d_assert(bearer, return, "Null param");
memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf,
sizeof(bearer->enb_s1u_teid));
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf,
sizeof(bearer->enb_s1u_addr));
memcpy(&bearer->target_s1u_teid, e_rab->gTP_TEID.buf,
sizeof(bearer->target_s1u_teid));
bearer->target_s1u_teid = ntohl(bearer->target_s1u_teid);
memcpy(&bearer->target_s1u_addr, e_rab->transportLayerAddress.buf,
sizeof(bearer->target_s1u_addr));
if (e_rab->dL_transportLayerAddress && e_rab->dL_gTP_TEID)
{
@ -789,7 +794,7 @@ void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
void s1ap_handle_enb_status_transfer(mme_enb_t *enb, s1ap_message_t *message)
{
// status_t rv;
status_t rv;
char buf[INET_ADDRSTRLEN];
enb_ue_t *source = NULL, *target = NULL;
@ -817,8 +822,87 @@ void s1ap_handle_enb_status_transfer(mme_enb_t *enb, s1ap_message_t *message)
target = source->target;
d_assert(target, return,);
rv = s1ap_send_mme_status_transfer(target, ies);
d_assert(rv == CORE_OK,,);
}
void s1ap_handle_handover_notification(mme_enb_t *enb, s1ap_message_t *message)
{
status_t rv;
char buf[INET_ADDRSTRLEN];
enb_ue_t *source = NULL, *target = NULL;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
S1ap_HandoverNotifyIEs_t *ies = NULL;
S1ap_EUTRAN_CGI_t *eutran_cgi;
S1ap_PLMNidentity_t *pLMNidentity = NULL;
S1ap_CellIdentity_t *cell_ID = NULL;
S1ap_TAI_t *tai;
S1ap_TAC_t *tAC = NULL;
d_assert(enb, return,);
ies = &message->s1ap_HandoverNotifyIEs;
d_assert(ies, return,);
eutran_cgi = &ies->eutran_cgi;
d_assert(eutran_cgi, return,);
pLMNidentity = &eutran_cgi->pLMNidentity;
d_assert(pLMNidentity && pLMNidentity->size == sizeof(plmn_id_t), return,);
cell_ID = &eutran_cgi->cell_ID;
d_assert(cell_ID, return,);
tai = &ies->tai;
d_assert(tai, return,);
pLMNidentity = &tai->pLMNidentity;
d_assert(pLMNidentity && pLMNidentity->size == sizeof(plmn_id_t), return,);
tAC = &tai->tAC;
d_assert(tAC && tAC->size == sizeof(c_uint16_t), return,);
target = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
d_assert(target, return,
"Cannot find UE for eNB-UE-S1AP-ID[%d] and eNB[%s:%d]",
ies->eNB_UE_S1AP_ID,
INET_NTOP(&enb->s1ap_sock->remote.sin_addr.s_addr, buf),
enb->enb_id);
d_assert(target->mme_ue_s1ap_id == ies->mme_ue_s1ap_id, return,
"Conflict MME-UE-S1AP-ID : %d != %d\n",
target->mme_ue_s1ap_id, ies->mme_ue_s1ap_id);
mme_ue = target->mme_ue;
d_assert(mme_ue, return,);
source = mme_ue->enb_ue;
d_assert(source, return,);
memcpy(&target->tai.plmn_id, pLMNidentity->buf,
sizeof(target->tai.plmn_id));
memcpy(&target->tai.tac, tAC->buf, sizeof(target->tai.tac));
target->tai.tac = ntohs(target->tai.tac);
memcpy(&target->e_cgi.plmn_id, pLMNidentity->buf,
sizeof(target->e_cgi.plmn_id));
memcpy(&target->e_cgi.cell_id, cell_ID->buf, sizeof(target->e_cgi.cell_id));
target->e_cgi.cell_id = (ntohl(target->e_cgi.cell_id) >> 4);
sess = mme_sess_first(mme_ue);
while(sess)
{
bearer = mme_bearer_first(sess);
while(bearer)
{
bearer->enb_s1u_teid = bearer->target_s1u_teid;
bearer->enb_s1u_addr = bearer->target_s1u_addr;
GTP_COUNTER_INCREMENT(
mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_HANDOVER_NOTIFY);
rv = mme_gtp_send_modify_bearer_request(target, bearer);
d_assert(rv == CORE_OK, return, "gtp send failed");
bearer = mme_bearer_next(bearer);
}
sess = mme_sess_next(sess);
}
}

View File

@ -498,3 +498,24 @@ status_t s1ap_send_handover_command(mme_ue_t *mme_ue)
return rv;
}
status_t s1ap_send_mme_status_transfer(
enb_ue_t *enb_ue, S1ap_ENBStatusTransferIEs_t *ies)
{
status_t rv;
pkbuf_t *s1apbuf = NULL;
mme_enb_t *enb = NULL;
d_assert(enb_ue, return CORE_ERROR,);
enb = enb_ue->enb;
d_assert(enb, return CORE_ERROR,);
rv = s1ap_build_mme_status_transfer(&s1apbuf, enb_ue, ies);
d_assert(rv == CORE_OK && s1apbuf, return CORE_ERROR, "s1ap build error");
rv = s1ap_send_to_enb(enb, s1apbuf);
d_assert(rv == CORE_OK,, "s1ap send error");
return rv;
}

View File

@ -32,6 +32,8 @@ CORE_DECLARE(status_t) s1ap_send_path_switch_failure(mme_enb_t *enb,
CORE_DECLARE(status_t) s1ap_send_handover_request(
mme_ue_t *mme_ue, S1ap_HandoverRequiredIEs_t *required);
CORE_DECLARE(status_t) s1ap_send_handover_command(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) s1ap_send_mme_status_transfer(
enb_ue_t *enb_ue, S1ap_ENBStatusTransferIEs_t *ies);
int _s1ap_recv_cb(net_sock_t *net_sock, void *data);

View File

@ -285,20 +285,6 @@ static int _gtpv1_s1u_recv_cb(net_sock_t *sock, void *data)
gtp_send(&gnode, pkbuf);
}
#if 0
bearer = sgw_bearer_find_by_sgw_s1u_teid(teid);
if (bearer)
{
/* Convert Teid and send to PGW via s5u */
gtp_h->teid = htonl(bearer->pgw_s5u_teid);
gnode.addr = bearer->pgw_s5u_addr;
gnode.port = GTPV1_U_UDP_PORT;
gnode.sock = sgw_self()->s5u_sock;
gtp_send(&gnode, pkbuf);
}
#endif
}
pkbuf_free(pkbuf);

View File

@ -588,6 +588,18 @@ static void handover_test2(abts_case *tc, void *data)
rv = tests1ap_enb_send(sock1, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
/* Receive MME Status Transfer */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rc = tests1ap_enb_read(sock2, recvbuf);
ABTS_INT_NEQUAL(tc, 0, rc);
pkbuf_free(recvbuf);
/* Send Handover Notify */
rv = tests1ap_build_handover_notify(&sendbuf, 0);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = tests1ap_enb_send(sock2, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
core_sleep(time_from_msec(1000));
/********** Remove Subscriber in Database */

View File

@ -1378,7 +1378,7 @@ status_t tests1ap_build_handover_notify(
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"0002"
"4028000004000000 05c0020000c30008 0002000800644008 0000f11000043a00"
"4028000004000000 05c0020000c50008 0002000800644008 0000f11000043a00"
"004340060000f110 3039",
"",
"",