#include <atomic>
#include <sys/param.h>
#include <sys/file.h>
+#include <sys/types.h>
+#include <ifaddrs.h>
#include <ctime>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/inotify.h>
#include <csignal>
#include <future>
+#include <bitset>
#include <rmr/rmr.h>
#include <rmr/RIC_message_types.h>
#define MAXEVENTS 128
-#define RECEIVE_SCTP_BUFFER_SIZE (256 * 1024)
+#define RECEIVE_SCTP_BUFFER_SIZE (8 * 1024)
#define RECEIVE_XAPP_BUFFER_SIZE RECEIVE_SCTP_BUFFER_SIZE
typedef mapWrapper Sctp_Map_t;
#define VOLUME_URL_SIZE 256
#define KA_MESSAGE_SIZE 2048
+enum E2T_Internal_Counters
+{
+ SCTP_ABORT_INITIATED_BY_E2NODE = 0,
+ INVALID_MESSAGE_RECEIVED = 1,
+ E2T_MAX_INTERNAL_COUNTER = 2,
+};
+
typedef struct sctp_params {
int epollTimeOut = -1;
uint16_t rmrPort = 0;
Sctp_Map_t *sctpMap = nullptr;
char ka_message[KA_MESSAGE_SIZE] {};
int ka_message_length = 0;
- char rmrAddress[256] {}; // "tcp:portnumber" "tcp:5566" listen to all address on port 5566
- mdclog_severity_t logLevel = MDCLOG_INFO;
+ char rmrAddress[256] {}; // "tcp:port number" "tcp:5566" listen to all address on port 5566
char volume[VOLUME_URL_SIZE];
string myIP {};
string fqdn {};
string prometheusPort {"8088"};
Family<Counter> *prometheusFamily;
Exposer *prometheusExposer = nullptr;
+ Counter *e2tCounters[6][2][ProcedureCode_id_RICsubscriptionDeleteRequired + 1] {};
+ Counter *e2tInternalCounters[E2T_Internal_Counters::E2T_MAX_INTERNAL_COUNTER] {};
} sctp_params_t;
// RAN to RIC
#define IN_INITI 0 //INITIATING
-#define IN_SUCC 1 //SUCCESSFULL
-#define IN_UN_SUCC 2 //UN-Successfull
+#define IN_SUCC 1 //SUCCESSFUL
+#define IN_UN_SUCC 2 //UN-Successful
// RIC To RAN
#define OUT_INITI 3 //INITIATING
-#define OUT_SUCC 4 //SUCCESSFULL
-#define OUT_UN_SUCC 5 //UN-Successfull
+#define OUT_SUCC 4 //SUCCESSFUL
+#define OUT_UN_SUCC 5 //UN-Successful
#define MSG_COUNTER 0
#define BYTES_COUNTER 1
+#define INVALID_STREAM_ID -1
+
typedef struct ConnectedCU {
int fileDescriptor = 0;
char hostName[NI_MAXHOST] {};
bool isConnected = false;
bool gotSetup = false;
sctp_params_t *sctpParams = nullptr;
- Counter *counters[6][2][ProcedureCode_id_RICsubscriptionDelete + 1] {};
+ Counter *counters[6][2][ProcedureCode_id_RICsubscriptionDeleteRequired + 1] {};
+ bool isSingleStream = false;
+ int singleStreamId = 0;
+ Counter *e2tInternalCounters[E2T_Internal_Counters::E2T_MAX_INTERNAL_COUNTER] {};
} ConnectedCU_t ;
-#define MAX_RMR_BUFF_ARRY 32
+#define MAX_RMR_BUFF_ARRAY 32
typedef struct RmrMessagesBuffer {
char ka_message[KA_MESSAGE_SIZE] {};
int ka_message_len = 0;
void *rmrCtx = nullptr;
rmr_mbuf_t *sendMessage= nullptr;
- //rmr_mbuf_t *sendBufferedMessages[MAX_RMR_BUFF_ARRY] {};
+ //rmr_mbuf_t *sendBufferedMessages[MAX_RMR_BUFF_ARRAY] {};
rmr_mbuf_t *rcvMessage= nullptr;
- //rmr_mbuf_t *rcvBufferedMessages[MAX_RMR_BUFF_ARRY] {};
+ //rmr_mbuf_t *rcvBufferedMessages[MAX_RMR_BUFF_ARRAY] {};
} RmrMessagesBuffer_t;
typedef struct formatedMessage {
char buffer[RECEIVE_SCTP_BUFFER_SIZE * 8] {};
} ReportingMessages_t;
+enum E2T_Procedure_States
+{
+ E2_SETUP_PROCEDURE_NOT_INITIATED = 0,
+ E2_SETUP_PROCEDURE_ONGOING = 1,
+ E2_SETUP_PROCEDURE_COMPLETED = 2,
+ RIC_SERVICE_UPDATE_PROCEDURE_ONGOING = 3,
+ RIC_SERVICE_UPDATE_PROCEDURE_COMPLETED = 4,
+ RIC_SUBS_PROCEDURE_ONGOING = 5,
+ RIC_SUBS_PROCEDURE_COMPLETED = 6,
+ RIC_INDICATION_PROCEDURE_ONGOING = 7,
+ RIC_INDICATION_PROCEDURE_COMPLETED = 8,
+ RIC_SUBS_DEL_PROCEDURE_ONGOING = 9,
+ RIC_SUBS_DEL_PROCEDURE_COMPLETED = 10,
+ CONTROL_PROCEDURE_ONGOING = 11,
+ CONTROL_PROCEDURE_COMPLETED = 12,
+ E2_NODE_CONF_UPDATE_PROCEDURE_ONGOING = 13,
+ E2_NODE_CONF_UPDATE_PROCEDURE_COMPLETED = 14,
+ RESET_PROCEDURE_ONGOING = 15,
+ RESET_PROCEDURE_COMPLETED = 16,
+};
+
+struct E2NodeConnectionHandling
+{
+ E2T_Procedure_States e2tProcedureOngoingStatus;
+ long e2SetupProcedureTransactionId;
+};
+
+constexpr int negativeOne = -1;
+constexpr int negativeSix = -6;
+constexpr int negativeSeven = -7;
+constexpr int numberZero = 0;
+constexpr int numberOne = 1;
+constexpr int numberTwo = 2;
+constexpr int numberThree = 3;
+constexpr int numberFour = 4;
+constexpr int numberFive = 5;
+constexpr int numberTwenty = 20;
+
+constexpr uint8_t sendMsgMaxBitPosition = 2;
+constexpr uint8_t sendMsgToE2MBitSetPosition = 0;
+constexpr uint8_t sendMsgToSubMgrBitSetPosition = 1;
+
+constexpr uint8_t requiredIePresentMaxBitSetPosition = 3;
+constexpr uint8_t transactionIdIeBitSetPosition = 0;
+constexpr uint8_t ricRequestIdIeBitSetPosition = 1;
+constexpr uint8_t causeIeBitSetPosition = 2;
+
cxxopts::ParseResult parse(int argc, char *argv[], sctp_params_t &pSctpParams);
int buildInotify(sctp_params_t &sctpParams);
/**
*
* @param sctpMap
- * @param messagBuffer
+ * @param messageBuffer
* @param message
* @param failedMesgId
* @return
*/
int sendMessagetoCu(Sctp_Map_t *sctpMap,
- RmrMessagesBuffer_t &messagBuffer,
+ RmrMessagesBuffer_t &messageBuffer,
ReportingMessages_t &message,
int failedMesgId);
/**
*
- * @param epoll_fd
- * @param rmrCtx
* @param sctpMap
- * @param messagBuffer
+ * @param rmrMessageBuffer
+ * @param ts
* @return
*/
int receiveXappMessages(Sctp_Map_t *sctpMap,
/**
*
- * @param messagBuffer
+ * @param messageBuffer
* @param failedMsgId
* @param sctpMap
* @return
*/
-int sendDirectionalSctpMsg(RmrMessagesBuffer_t &messagBuffer,
+int sendDirectionalSctpMsg(RmrMessagesBuffer_t &messageBuffer,
ReportingMessages_t &message,
int failedMsgId,
Sctp_Map_t *sctpMap);
void asnInitiatingRequest(E2AP_PDU_t *pdu,
Sctp_Map_t *sctpMap,
ReportingMessages_t &message,
- RmrMessagesBuffer_t &rmrMessageBuffer);
+ RmrMessagesBuffer_t &rmrMessageBuffer,int streamId);
/**
*
* @param pdu
* @param sctpMap
* @param rmrMessageBuffer
*/
-void asnSuccsesfulMsg(E2AP_PDU_t *pdu,
+void asnSuccessfulMsg(E2AP_PDU_t *pdu,
Sctp_Map_t *sctpMap,
ReportingMessages_t &message,
RmrMessagesBuffer_t &rmrMessageBuffer);
*/
string translateRmrErrorMessages(int state);
+int buildConfiguration(sctp_params_t &sctpParams);
+void startPrometheus(sctp_params_t &sctpParams);
+static int enable_log_change_notify(const char* fileName);
+static int register_log_change_notify(const char *fileName);
+static void * monitor_loglevel_change_handler(void* arg);
+void update_mdc_log_level_severity(char* log_level);
+char* getinterfaceip();
+static char* parse_file(char* filename);
+
static inline uint64_t rdtscp(uint32_t &aux) {
uint64_t rax,rdx;
#define RIC_SCTP_CONNECTION_FAILURE 10080
#endif
+#ifdef UNIT_TEST
+ #define FILE_DESCRIPTOR 53424 /*Dummy value for file descriptor only when UT is defined*/
+#endif
+
+int buildListeningPort(sctp_params_t &sctpParams);
+void buildE2TPrometheusCounters(sctp_params_t &sctpParams);
+
+int fetchStreamId(ConnectedCU_t *peerInfo, ReportingMessages_t &message);
+void removeE2ConnectionEntryFromMap(char* eNBName);
+bool getE2tProcedureOngoingStatus(char *enbName, E2NodeConnectionHandling &e2NodeConnectionHandling);
+void setE2ProcedureOngoingStatus(char *enbName, E2T_Procedure_States state);
+void insertE2ProcedureOngoing(char *enbName, long &transactionID);
+E2T_Procedure_States currentE2tProcedureOngoingStatus(char *enbName);
+void printEntryPresentInMap();
+void handleE2SetupReq(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuffer, E2AP_PDU_t *pdu, long &transactionID, int streamId, Sctp_Map_t *sctpMap);
+bitset<sendMsgMaxBitPosition> getSendMsgBitSetValue(int procedureCode, bitset<requiredIePresentMaxBitSetPosition> isRequiredIesPresent, char* enbName);
#endif //X2_SCTP_THREAD_H