forked from acouzens/open5gs
S1SetupFailure is implemented
This commit is contained in:
parent
d4d0548694
commit
6a05d4e69f
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue