S1HO modify bearer request/response is done..
This commit is contained in:
parent
eb1ff95ca6
commit
345f055dd7
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 = >p_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(>p_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 = >p_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 = >p_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(>p_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(>p_message, 0, sizeof(gtp_message_t));
|
||||
|
||||
memset(&cause, 0, sizeof(cause));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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",
|
||||
"",
|
||||
"",
|
||||
|
|
Loading…
Reference in New Issue