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;
|
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");
|
enb_ue_t *source = NULL;
|
||||||
d_assert(enb_ue, return CORE_ERROR, "Null param");
|
|
||||||
|
|
||||||
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;
|
return CORE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,11 +133,12 @@ struct _enb_ue_t {
|
||||||
|
|
||||||
/* Handover Info */
|
/* Handover Info */
|
||||||
S1ap_HandoverType_t handover_type;
|
S1ap_HandoverType_t handover_type;
|
||||||
|
enb_ue_t *target;
|
||||||
|
|
||||||
/* mme_ue_context */
|
/* MME UE(NAS) */
|
||||||
mme_ue_t *mme_ue;
|
mme_ue_t *mme_ue;
|
||||||
|
|
||||||
/* Connected enodeB */
|
/* Connected eNB */
|
||||||
mme_enb_t *enb;
|
mme_enb_t *enb;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -285,6 +286,7 @@ struct _mme_ue_t {
|
||||||
#define GTP_COUNTER_CHECK(__mME, __tYPE, __eXPR) \
|
#define GTP_COUNTER_CHECK(__mME, __tYPE, __eXPR) \
|
||||||
do { \
|
do { \
|
||||||
d_assert((__mME), break,); \
|
d_assert((__mME), break,); \
|
||||||
|
if ((__mME)->gtp_counter[__tYPE].request == 0) break; \
|
||||||
((__mME)->gtp_counter[__tYPE].response)++; \
|
((__mME)->gtp_counter[__tYPE].response)++; \
|
||||||
if (((__mME)->gtp_counter[__tYPE].request) == \
|
if (((__mME)->gtp_counter[__tYPE].request) == \
|
||||||
((__mME)->gtp_counter[__tYPE].response)) \
|
((__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);
|
mme_ue_t *mme_ue, c_int8_t *imsi_bcd);
|
||||||
CORE_DECLARE(status_t) mme_associate_ue_context(
|
CORE_DECLARE(status_t) mme_associate_ue_context(
|
||||||
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
|
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
|
||||||
CORE_DECLARE(status_t) mme_partial_associate_ue_context(
|
CORE_DECLARE(status_t) mme_handover_associate_ue_context(
|
||||||
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
|
mme_ue_t *mme_ue, enb_ue_t *target);
|
||||||
|
|
||||||
CORE_DECLARE(hash_index_t *) mme_ue_first();
|
CORE_DECLARE(hash_index_t *) mme_ue_first();
|
||||||
CORE_DECLARE(hash_index_t *) mme_ue_next(hash_index_t *hi);
|
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)
|
gtp_create_indirect_data_forwarding_tunnel_response_t *rsp)
|
||||||
{
|
{
|
||||||
status_t rv;
|
status_t rv;
|
||||||
enb_ue_t *enb_ue = NULL;
|
|
||||||
mme_bearer_t *bearer = NULL;
|
mme_bearer_t *bearer = NULL;
|
||||||
int i;
|
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(mme_ue, return, "Null param");
|
||||||
d_assert(rsp, 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)
|
if (rsp->cause.presence == 0)
|
||||||
{
|
{
|
||||||
d_error("No Cause");
|
d_error("No Cause");
|
||||||
|
@ -399,6 +395,6 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
||||||
d_assert(0, return, "Not Supported");
|
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");
|
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(
|
S1AP_STORE_DATA(
|
||||||
&mme_ue->container, &ies->target_ToSource_TransparentContainer);
|
&mme_ue->container, &ies->target_ToSource_TransparentContainer);
|
||||||
|
|
||||||
rv = mme_gtp_send_create_indirect_data_forwarding_tunnel_request(mme_ue);
|
if (i > 0)
|
||||||
|
{
|
||||||
|
rv = mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||||
|
mme_ue);
|
||||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
d_assert(rv == CORE_OK, return, "gtp send failed");
|
||||||
|
}
|
||||||
|
else
|
||||||
#if 0
|
{
|
||||||
rv = mme_gtp_send_modify_bearer_request(bearer);
|
rv = s1ap_send_handover_command(mme_ue);
|
||||||
d_assert(rv == CORE_OK, return, "gtp send failed");
|
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
|
|
||||||
|
|
||||||
d_trace(3, "[S1AP] Handover Request Ack : "
|
d_trace(3, "[S1AP] Handover Request Ack : "
|
||||||
"UE[eNB-UE-S1AP-ID(%d)] --> eNB[%s:%d]\n",
|
"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)
|
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)
|
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)
|
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);
|
enb_ue = enb_ue_add(enb);
|
||||||
d_assert(enb_ue, return CORE_ERROR,);
|
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);
|
rv = s1ap_build_handover_request(&s1apbuf, mme_ue, enb_ue, ies);
|
||||||
d_assert(rv == CORE_OK && s1apbuf,
|
d_assert(rv == CORE_OK && s1apbuf,
|
||||||
|
@ -476,13 +476,16 @@ status_t s1ap_send_handover_request(
|
||||||
return rv;
|
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;
|
status_t rv;
|
||||||
pkbuf_t *s1apbuf = NULL;
|
pkbuf_t *s1apbuf = NULL;
|
||||||
|
|
||||||
mme_enb_t *enb = 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,);
|
d_assert(enb_ue, return CORE_ERROR,);
|
||||||
enb = enb_ue->enb;
|
enb = enb_ue->enb;
|
||||||
d_assert(enb, return CORE_ERROR,);
|
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(
|
CORE_DECLARE(status_t) s1ap_send_handover_request(
|
||||||
mme_ue_t *mme_ue, S1ap_HandoverRequiredIEs_t *required);
|
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);
|
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);
|
ABTS_INT_NEQUAL(tc, 0, rc);
|
||||||
pkbuf_free(recvbuf);
|
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 */
|
/********** Remove Subscriber in Database */
|
||||||
doc = BCON_NEW("imsi", BCON_UTF8("001010123456815"));
|
doc = BCON_NEW("imsi", BCON_UTF8("001010123456815"));
|
||||||
ABTS_PTR_NOTNULL(tc, doc);
|
ABTS_PTR_NOTNULL(tc, doc);
|
||||||
|
@ -605,11 +613,8 @@ abts_suite *test_handover(abts_suite *suite)
|
||||||
{
|
{
|
||||||
suite = ADD_SUITE(suite)
|
suite = ADD_SUITE(suite)
|
||||||
|
|
||||||
#if 0
|
|
||||||
abts_run_test(suite, handover_test1, NULL);
|
abts_run_test(suite, handover_test1, NULL);
|
||||||
#else
|
|
||||||
abts_run_test(suite, handover_test2, NULL);
|
abts_run_test(suite, handover_test2, NULL);
|
||||||
#endif
|
|
||||||
|
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue