add eNB status transfer handler
This commit is contained in:
parent
dadadc5179
commit
d39fd987e4
|
@ -1467,12 +1467,17 @@ status_t mme_associate_ue_context(mme_ue_t *mme_ue, enb_ue_t *enb_ue)
|
|||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_partial_associate_ue_context(mme_ue_t *mme_ue, enb_ue_t *enb_ue)
|
||||
status_t mme_handover_associate_ue_context(mme_ue_t *mme_ue, enb_ue_t *target)
|
||||
{
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
||||
enb_ue_t *source = NULL;
|
||||
|
||||
enb_ue->mme_ue = mme_ue;
|
||||
d_assert(target, return CORE_ERROR, "Null param");
|
||||
d_assert(mme_ue, return CORE_ERROR, "Null param");
|
||||
source = mme_ue->enb_ue;
|
||||
d_assert(source, return CORE_ERROR, "Null param");
|
||||
|
||||
target->mme_ue = mme_ue;
|
||||
source->target = target;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -133,11 +133,12 @@ struct _enb_ue_t {
|
|||
|
||||
/* Handover Info */
|
||||
S1ap_HandoverType_t handover_type;
|
||||
enb_ue_t *target;
|
||||
|
||||
/* mme_ue_context */
|
||||
/* MME UE(NAS) */
|
||||
mme_ue_t *mme_ue;
|
||||
|
||||
/* Connected enodeB */
|
||||
/* Connected eNB */
|
||||
mme_enb_t *enb;
|
||||
};
|
||||
|
||||
|
@ -285,6 +286,7 @@ struct _mme_ue_t {
|
|||
#define GTP_COUNTER_CHECK(__mME, __tYPE, __eXPR) \
|
||||
do { \
|
||||
d_assert((__mME), break,); \
|
||||
if ((__mME)->gtp_counter[__tYPE].request == 0) break; \
|
||||
((__mME)->gtp_counter[__tYPE].response)++; \
|
||||
if (((__mME)->gtp_counter[__tYPE].request) == \
|
||||
((__mME)->gtp_counter[__tYPE].response)) \
|
||||
|
@ -461,8 +463,8 @@ CORE_DECLARE(status_t) mme_ue_set_imsi(
|
|||
mme_ue_t *mme_ue, c_int8_t *imsi_bcd);
|
||||
CORE_DECLARE(status_t) mme_associate_ue_context(
|
||||
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
|
||||
CORE_DECLARE(status_t) mme_partial_associate_ue_context(
|
||||
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
|
||||
CORE_DECLARE(status_t) mme_handover_associate_ue_context(
|
||||
mme_ue_t *mme_ue, enb_ue_t *target);
|
||||
|
||||
CORE_DECLARE(hash_index_t *) mme_ue_first();
|
||||
CORE_DECLARE(hash_index_t *) mme_ue_next(hash_index_t *hi);
|
||||
|
|
|
@ -339,7 +339,6 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
gtp_create_indirect_data_forwarding_tunnel_response_t *rsp)
|
||||
{
|
||||
status_t rv;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
mme_bearer_t *bearer = NULL;
|
||||
int i;
|
||||
|
||||
|
@ -350,9 +349,6 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
d_assert(mme_ue, return, "Null param");
|
||||
d_assert(rsp, return, "Null param");
|
||||
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return, "Null param");
|
||||
|
||||
if (rsp->cause.presence == 0)
|
||||
{
|
||||
d_error("No Cause");
|
||||
|
@ -399,6 +395,6 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
d_assert(0, return, "Not Supported");
|
||||
}
|
||||
|
||||
rv = s1ap_send_handover_command(enb_ue);
|
||||
rv = s1ap_send_handover_command(mme_ue);
|
||||
d_assert(rv == CORE_OK,, "s1ap send error");
|
||||
}
|
||||
|
|
|
@ -763,19 +763,17 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
|
|||
S1AP_STORE_DATA(
|
||||
&mme_ue->container, &ies->target_ToSource_TransparentContainer);
|
||||
|
||||
rv = mme_gtp_send_create_indirect_data_forwarding_tunnel_request(mme_ue);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
|
||||
|
||||
#if 0
|
||||
rv = mme_gtp_send_modify_bearer_request(bearer);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
rv = s1ap_send_handover_request(mme_ue, ies);
|
||||
d_assert(rv == CORE_OK,, "s1ap send error");
|
||||
#endif
|
||||
if (i > 0)
|
||||
{
|
||||
rv = mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = s1ap_send_handover_command(mme_ue);
|
||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||
}
|
||||
|
||||
d_trace(3, "[S1AP] Handover Request Ack : "
|
||||
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
|
||||
|
@ -786,10 +784,39 @@ void s1ap_handle_handover_request_ack(mme_enb_t *enb, s1ap_message_t *message)
|
|||
|
||||
void s1ap_handle_handover_failure(mme_enb_t *enb, s1ap_message_t *message)
|
||||
{
|
||||
d_error("Not implemented");
|
||||
}
|
||||
|
||||
void s1ap_handle_enb_status_transfer(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;
|
||||
|
||||
S1ap_ENBStatusTransferIEs_t *ies = NULL;
|
||||
|
||||
d_assert(enb, return,);
|
||||
|
||||
ies = &message->s1ap_ENBStatusTransferIEs;
|
||||
d_assert(ies, return,);
|
||||
|
||||
source = enb_ue_find_by_enb_ue_s1ap_id(enb, ies->eNB_UE_S1AP_ID);
|
||||
d_assert(source, 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(source->mme_ue_s1ap_id == ies->mme_ue_s1ap_id, return,
|
||||
"Conflict MME-UE-S1AP-ID : %d != %d\n",
|
||||
source->mme_ue_s1ap_id, ies->mme_ue_s1ap_id);
|
||||
|
||||
mme_ue = source->mme_ue;
|
||||
d_assert(mme_ue, return,);
|
||||
target = source->target;
|
||||
d_assert(target, return,);
|
||||
|
||||
}
|
||||
|
||||
void s1ap_handle_handover_notification(mme_enb_t *enb, s1ap_message_t *message)
|
||||
|
|
|
@ -464,7 +464,7 @@ status_t s1ap_send_handover_request(
|
|||
enb_ue = enb_ue_add(enb);
|
||||
d_assert(enb_ue, return CORE_ERROR,);
|
||||
|
||||
mme_partial_associate_ue_context(mme_ue, enb_ue);
|
||||
mme_handover_associate_ue_context(mme_ue, enb_ue);
|
||||
|
||||
rv = s1ap_build_handover_request(&s1apbuf, mme_ue, enb_ue, ies);
|
||||
d_assert(rv == CORE_OK && s1apbuf,
|
||||
|
@ -476,13 +476,16 @@ status_t s1ap_send_handover_request(
|
|||
return rv;
|
||||
}
|
||||
|
||||
status_t s1ap_send_handover_command(enb_ue_t *enb_ue)
|
||||
status_t s1ap_send_handover_command(mme_ue_t *mme_ue)
|
||||
{
|
||||
status_t rv;
|
||||
pkbuf_t *s1apbuf = NULL;
|
||||
|
||||
mme_enb_t *enb = NULL;
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
|
||||
d_assert(mme_ue, return CORE_ERROR,);
|
||||
enb_ue = mme_ue->enb_ue;
|
||||
d_assert(enb_ue, return CORE_ERROR,);
|
||||
enb = enb_ue->enb;
|
||||
d_assert(enb, return CORE_ERROR,);
|
||||
|
|
|
@ -31,7 +31,7 @@ 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(enb_ue_t *enb_ue);
|
||||
CORE_DECLARE(status_t) s1ap_send_handover_command(mme_ue_t *mme_ue);
|
||||
|
||||
int _s1ap_recv_cb(net_sock_t *net_sock, void *data);
|
||||
|
||||
|
|
|
@ -582,6 +582,14 @@ static void handover_test2(abts_case *tc, void *data)
|
|||
ABTS_INT_NEQUAL(tc, 0, rc);
|
||||
pkbuf_free(recvbuf);
|
||||
|
||||
/* Send eNB Status Transfer */
|
||||
rv = tests1ap_build_enb_status_transfer(&sendbuf, 0);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock1, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
|
||||
core_sleep(time_from_msec(1000));
|
||||
|
||||
/********** Remove Subscriber in Database */
|
||||
doc = BCON_NEW("imsi", BCON_UTF8("001010123456815"));
|
||||
ABTS_PTR_NOTNULL(tc, doc);
|
||||
|
@ -605,11 +613,8 @@ abts_suite *test_handover(abts_suite *suite)
|
|||
{
|
||||
suite = ADD_SUITE(suite)
|
||||
|
||||
#if 0
|
||||
abts_run_test(suite, handover_test1, NULL);
|
||||
#else
|
||||
abts_run_test(suite, handover_test2, NULL);
|
||||
#endif
|
||||
|
||||
return suite;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue