S1SetupFailure is implemented

This commit is contained in:
Sukchan Lee 2017-02-13 20:10:05 +09:00
parent d4d0548694
commit 6a05d4e69f
5 changed files with 64 additions and 11 deletions

View File

@ -190,6 +190,14 @@ static int s1ap_decode_unsuccessfull_outcome(s1ap_message *message,
message->procedureCode = unSuccessfulOutcome_p->procedureCode;
switch (unSuccessfulOutcome_p->procedureCode)
{
case S1ap_ProcedureCode_id_S1Setup:
ret = s1ap_decode_s1ap_s1setupfailureies(
&message->msg.s1ap_S1SetupFailureIEs,
&unSuccessfulOutcome_p->value);
s1ap_decode_xer_print_message(
s1ap_xer_print_s1ap_s1setupfailure,
s1ap_xer__print2sp, message);
break;
case S1ap_ProcedureCode_id_InitialContextSetup:
ret = s1ap_decode_s1ap_initialcontextsetupfailureies(
&message->msg.s1ap_InitialContextSetupFailureIEs,

View File

@ -153,6 +153,7 @@ status_t enb_s1_handle_s1setuprequest(enb_ctx_t *enb, s1ap_message *message)
S1ap_S1SetupRequestIEs_t *ies = NULL;
status_t rv;
pkbuf_t *sendbuf = NULL;
c_uint32_t enb_id;
d_assert(enb, return CORE_ERROR, "Null param");
d_assert(enb->s1_sock, return CORE_ERROR, "Null param");
@ -161,16 +162,32 @@ status_t enb_s1_handle_s1setuprequest(enb_ctx_t *enb, s1ap_message *message)
ies = &message->msg.s1ap_S1SetupRequestIEs;
d_assert(ies, return CORE_ERROR, "Null param");
rv = s1ap_conv_uint32_from_enb_id(&enb->id, &ies->global_ENB_ID.eNB_ID);
rv = s1ap_conv_uint32_from_enb_id(&enb_id, &ies->global_ENB_ID.eNB_ID);
d_assert(rv == CORE_OK, return rv, "Null param");
d_info("eNB-id[0x%x] sends S1-Setup-Request from [%s]", enb->id,
INET_NTOP(&enb->s1_sock->remote.sin_addr.s_addr, buf));
if (enb_ctx_find_by_id(enb_id))
{
S1ap_Cause_t cause;
d_error("eNB-id[0x%x] duplicated from [%s]", enb_id,
INET_NTOP(&enb->s1_sock->remote.sin_addr.s_addr, buf));
cause.present = S1ap_Cause_PR_protocol;
cause.choice.protocol =
S1ap_CauseProtocol_message_not_compatible_with_receiver_state;
rv = s1ap_build_setup_failure(&sendbuf, cause);
}
else
{
d_info("eNB-id[0x%x] sends S1-Setup-Request from [%s]", enb_id,
INET_NTOP(&enb->s1_sock->remote.sin_addr.s_addr, buf));
enb->id = enb_id;
rv = s1ap_build_setup_rsp(&sendbuf);
}
rv = s1ap_build_setup_rsp(&sendbuf);
if (rv != CORE_OK)
{
d_error("Can't build S1 Setup Response");
d_error("Can't build S1-Setup-Response/Failure");
return CORE_ERROR;
}

View File

@ -79,3 +79,29 @@ status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf)
}
status_t s1ap_build_setup_failure(pkbuf_t **pkbuf, S1ap_Cause_t cause)
{
int erval;
s1ap_message message;
S1ap_S1SetupFailureIEs_t *ies = NULL;
memset(&message, 0, sizeof(s1ap_message));
ies = &message.msg.s1ap_S1SetupFailureIEs;
ies->cause = cause;
message.procedureCode = S1ap_ProcedureCode_id_S1Setup;
message.direction = S1AP_PDU_PR_unsuccessfulOutcome;
erval = s1ap_encode_pdu(pkbuf, &message);
s1ap_free_pdu(&message);
if (erval < 0)
{
d_error("s1ap_encode_error : (%d)", erval);
return CORE_ERROR;
}
return CORE_OK;
}

View File

@ -8,6 +8,8 @@ extern "C" {
#endif /* __cplusplus */
CORE_DECLARE(status_t) s1ap_build_setup_rsp(pkbuf_t **pkbuf);
CORE_DECLARE(status_t) s1ap_build_setup_failure(
pkbuf_t **pkbuf, S1ap_Cause_t cause);
#ifdef __cplusplus
}

View File

@ -53,24 +53,24 @@ int enb_net_read(net_sock_t *sock, pkbuf_t *recvbuf, int size)
static void enb_setup_test1(abts_case *tc, void *data)
{
status_t rv;
net_sock_t *sock;
net_sock_t *sock[2];
pkbuf_t *sendbuf;
pkbuf_t *recvbuf = pkbuf_alloc(0, S1AP_SDU_SIZE);
s1ap_message message;
int rc;
sock = enb_s1ap_connect();
ABTS_PTR_NOTNULL(tc, sock);
sock[0] = enb_s1ap_connect();
ABTS_PTR_NOTNULL(tc, sock[0]);
rv = s1ap_build_setup_req(&sendbuf, 0x54f64);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
rv = s1ap_send(sock, sendbuf);
rv = s1ap_send(sock[0], sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
pkbuf_free(sendbuf);
rc = enb_net_read(sock, recvbuf, 27);
rc = enb_net_read(sock[0], recvbuf, 27);
ABTS_INT_EQUAL(tc, 27, rc);
rv = s1ap_decode_pdu(&message, recvbuf);
@ -79,7 +79,7 @@ static void enb_setup_test1(abts_case *tc, void *data)
s1ap_free_pdu(&message);
pkbuf_free(recvbuf);
rv = enb_s1ap_disconnect(sock);
rv = enb_s1ap_disconnect(sock[0]);
ABTS_INT_EQUAL(tc, CORE_OK, rv);
}