X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=sim%2Fe2-interface.git;a=blobdiff_plain;f=e2sim%2Fe2apv1sim%2Fricsim%2Fsrc%2FX2AP%2Fx2ap_message_handler.c;fp=e2sim%2Fe2apv1sim%2Fricsim%2Fsrc%2FX2AP%2Fx2ap_message_handler.c;h=4fa635e5e0a8a8042cc82ad047c66ee2693c938d;hp=0000000000000000000000000000000000000000;hb=3ebf932d23dcbec9ed19f4a51f9d00a0a54f5124;hpb=6896318f2b4ff01b4a88b16019c3dc93b0b693f5 diff --git a/e2sim/e2apv1sim/ricsim/src/X2AP/x2ap_message_handler.c b/e2sim/e2apv1sim/ricsim/src/X2AP/x2ap_message_handler.c new file mode 100644 index 0000000..4fa635e --- /dev/null +++ b/e2sim/e2apv1sim/ricsim/src/X2AP/x2ap_message_handler.c @@ -0,0 +1,139 @@ +/* + * + * Copyright 2019 AT&T Intellectual Property + * Copyright 2019 Nokia + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "x2ap_message_handler.h" + +typedef int (*x2ap_message_decoded_handler)(X2AP_PDU_t *pdu, sctp_data_t *response); + +static int handle_x2_setup_request(X2AP_PDU_t *pdu, sctp_data_t *response); + +static int handle_x2_setup_response(X2AP_PDU_t *pdu, sctp_data_t *response); + +static int handle_x2_setup_failure(X2AP_PDU_t *pdu, sctp_data_t *response); + +/* Handlers matrix. Only eNB related procedure present here +/* rowID = procedureCode (start with 0) +*/ +x2ap_message_decoded_handler x2ap_messages_handler[][3] = { + { 0, 0, 0 }, /* handoverPreparation */ + { 0, 0, 0 }, /* handoverCancel */ + { 0, 0, 0 }, /* loadIndication */ + { 0, 0, 0 }, /* errorIndication */ + { 0, 0, 0 }, /* snStatusTransfer */ + { 0, 0, 0 }, /* uEContextRelease */ + { handle_x2_setup_request, handle_x2_setup_response, handle_x2_setup_failure }, /* x2Setup */ + { 0, 0, 0 }, /* reset */ + { 0, 0, 0 }, /* eNBConfigurationUpdate */ + { 0, 0, 0 }, /* resourceStatusReportingInitiation */ + { 0, 0, 0 }, /* resourceStatusReporting */ + { 0, 0, 0 }, /* privateMessage */ + { 0, 0, 0 }, /* mobilitySettingsChange */ + { 0, 0, 0 }, /* rLFIndication */ + { 0, 0, 0 }, /* handoverReport */ + { 0, 0, 0 }, /* cellActivation */ + { 0, 0, 0 }, /* x2Release */ + { 0, 0, 0 }, /* x2APMessageTransfer */ + { 0, 0, 0 }, /* x2Removal */ + { 0, 0, 0 }, /* seNBAdditionPreparation */ + { 0, 0, 0 }, /* seNBReconfigurationCompletion */ + { 0, 0, 0 }, /* meNBinitiatedSeNBModificationPreparation */ + { 0, 0, 0 }, /* seNBinitiatedSeNBModification */ + { 0, 0, 0 }, /* meNBinitiatedSeNBRelease */ + { 0, 0, 0 }, /* seNBinitiatedSeNBRelease */ + { 0, 0, 0 }, /* seNBCounterCheck */ + { 0, 0, 0 } /* retrieveUEContext */ +}; + +char *x2ap_direction2String(int x2ap_dir) +{ + static char *x2ap_direction_String[] = { + "", /* Nothing */ + "Originating message", /* originating message */ + "Successfull outcome", /* successfull outcome */ + "UnSuccessfull outcome", /* successfull outcome */ + }; + return(x2ap_direction_String[x2ap_dir]); +} + +int x2ap_eNB_handle_message(const uint8_t *const data, const int data_len, sctp_data_t* response) +{ + X2AP_PDU_t pdu; + int ret; + + memset(&pdu, 0, sizeof(pdu)); + + //printf("Decode the PDU \n"); + + if (X2AP_ASN_decode(&pdu, data, data_len) < 0){ + return -1; + } + + /* Checking procedure Code and direction of message */ + if (pdu.choice.initiatingMessage.procedureCode > sizeof(x2ap_messages_handler) + / (3 * sizeof(x2ap_message_decoded_handler)) + || (pdu.present > X2AP_PDU_PR_unsuccessfulOutcome)) { + + fprintf(stderr, "Either procedureCode %ld or direction %d exceed expected\n", + pdu.choice.initiatingMessage.procedureCode, pdu.present); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_PDU, &pdu); + return -1; + } + + if (x2ap_messages_handler[pdu.choice.initiatingMessage.procedureCode][pdu.present - 1] == NULL) + { + fprintf(stderr, "No handler for procedureCode %ld in direction %s\n", + pdu.choice.initiatingMessage.procedureCode, + x2ap_direction2String(pdu.present - 1)); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_PDU, &pdu); + return -1; + } + + /*calling the appropriate handler */ + ret = (*x2ap_messages_handler[pdu.choice.initiatingMessage.procedureCode][pdu.present - 1])(&pdu, response); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_PDU, &pdu); + return ret; +} + +int handle_x2_setup_request(X2AP_PDU_t *pdu, sctp_data_t* response) +{ + fprintf(stderr, "Received X2 SETUP REQUEST\n"); + + /* Todo: when to generate X2 Setup Failure??? + */ + + response->len = x2ap_generate_x2_setup_response(&response->data); + + return 0; +} + +int handle_x2_setup_response(X2AP_PDU_t *pdu, sctp_data_t* response) +{ + fprintf(stderr, "Received X2 SETUP RESPONSE\n"); + return 0; +} + +int handle_x2_setup_failure(X2AP_PDU_t *pdu, sctp_data_t* response) +{ + fprintf(stderr, "Received X2 SETUP FAILURE\n"); + return 0; +}