X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=RIC-E2-TERMINATION%2FsctpThread.cpp;h=a0131429cd03141bff38c850e0a73307c686acc8;hb=c40ea1f7632d62130943768c82bb4a72e6780073;hp=651edd96c1c422f6642181302ed4d38bec880dfe;hpb=31768a96251638b85869aebfcb88f0663ee3a0e4;p=ric-plt%2Fe2.git diff --git a/RIC-E2-TERMINATION/sctpThread.cpp b/RIC-E2-TERMINATION/sctpThread.cpp index 651edd9..a013142 100644 --- a/RIC-E2-TERMINATION/sctpThread.cpp +++ b/RIC-E2-TERMINATION/sctpThread.cpp @@ -23,10 +23,15 @@ #include <3rdparty/oranE2/RANfunctions-List.h> #include "sctpThread.h" #include "BuildRunName.h" - +#include //#include "3rdparty/oranE2SM/E2SM-gNB-NRT-RANfunction-Definition.h" //#include "BuildXml.h" //#include "pugixml/src/pugixml.hpp" +#include +#include +#include +#include +#include using namespace std; //using namespace std::placeholders; @@ -41,6 +46,7 @@ using namespace prometheus; // need to expose without the include of gcov extern "C" void __gcov_flush(void); +#define LOG_FILE_CONFIG_MAP "CONFIG_MAP_NAME" static void catch_function(int signal) { __gcov_flush(); @@ -54,11 +60,187 @@ boost::shared_ptr> boostLogger double cpuClock = 0.0; bool jsonTrace = false; + +static int enable_log_change_notify(const char* fileName) +{ + int ret = -1; + struct stat fileInfo; + if ( lstat(fileName,&fileInfo) == 0 ) + { + ret = register_log_change_notify(fileName); + } + return ret; +} + + +static int register_log_change_notify(const char *fileName) +{ + pthread_attr_t cb_attr; + pthread_t tid; + pthread_attr_init(&cb_attr); + pthread_attr_setdetachstate(&cb_attr,PTHREAD_CREATE_DETACHED); + return pthread_create(&tid, &cb_attr,&monitor_loglevel_change_handler,(void *)strdup(fileName)); +} + + +static void * monitor_loglevel_change_handler(void* arg) +{ + char *fileName = (char*) arg; + int ifd; // the inotify file des + int wfd; // the watched file des + ssize_t n = 0; + char rbuf[4096]; // large read buffer as the event is var len + fd_set fds; + int res = 0; + struct timeval timeout; + char* dname=NULL; // directory name + char* bname = NULL; // basename + char* tok=NULL; + char* log_level=NULL; + + dname = strdup( fileName); // defrock the file name into dir and basename + if( (tok = strrchr( dname, '/' )) != NULL ) { + *tok = '\0'; + bname = strdup( tok+1 ); + } + + + ifd = inotify_init1( 0 ); // initialise watcher setting blocking read (no option) + if( ifd < 0 ) { + fprintf( stderr, "### ERR ### unable to initialise file watch %s\n", strerror( errno ) ); + } else { + wfd = inotify_add_watch( ifd, dname, IN_MOVED_TO | IN_CLOSE_WRITE ); // we only care about close write changes + + if( wfd < 0 ) { + fprintf( stderr, "### ERR ### unable to add watch on config file %s: %s\n", fileName, strerror( errno ) ); + } else { + + + memset( &timeout, 0, sizeof(timeout) ); + while( 1 ) { + FD_ZERO (&fds); + FD_SET (ifd, &fds); + timeout.tv_sec=1; + res = select (ifd + 1, &fds, NULL, NULL, &timeout); + if(res) + { + n = read( ifd, rbuf, sizeof( rbuf ) ); // read the event + if( n < 0 ) { + if( errno == EAGAIN ) { + } else { + fprintf( stderr, "### CRIT ### config listener read err: %s\n", strerror( errno ) ); + } + continue; + } + + //Retrieving Log Level from configmap by parsing configmap file + log_level = parse_file(fileName); + update_mdc_log_level_severity(log_level); //setting log level + free(log_level); + } + } + inotify_rm_watch(ifd,wfd); + } + close(ifd); + } + free(bname); + free(dname); + + pthread_exit(NULL); +} + +void update_mdc_log_level_severity(char* log_level) +{ + mdclog_severity_t level = MDCLOG_ERR; + + if(log_level == NULL) + { + printf("### ERR ### Invalid Log-Level Configuration in ConfigMap, Default Log-Level Applied: %d\n",level); + } + else if(strcasecmp(log_level,"1")==0) + { + level = MDCLOG_ERR; + } + else if(strcasecmp(log_level,"2")==0) + { + level = MDCLOG_WARN; + } + else if(strcasecmp(log_level,"3")==0) + { + level = MDCLOG_INFO; + } + else if(strcasecmp(log_level,"4")==0) + { + level = MDCLOG_DEBUG; + } + + mdclog_level_set(level); +} +static char* parse_file(char* filename) +{ + char *token=NULL; + char *search = ": "; + char *string_match = "log-level"; + bool found = false; + FILE *file = fopen ( filename, "r" ); + if ( file != NULL ) + { + char line [ 128 ]; + while ( fgets ( line, sizeof line, file ) != NULL ) + { + token = strtok(line, search); + if(strcmp(token,string_match)==0) + { + found = true; + token = strtok(NULL, search); + token = strtok(token, "\n");//removing newline if any + break; + } + } + fclose ( file ); + } + if(found) + return(strdup(token)); + else + return(NULL); +} + +char *read_env_param(const char*envkey) +{ + if(envkey) + { + char *value = getenv(envkey); + if(value) + return strdup(value); + } + return NULL; +} + +void dynamic_log_level_change() +{ + char *logFile_Name = read_env_param(LOG_FILE_CONFIG_MAP); + char* log_level_init=NULL; + if(logFile_Name) + { + log_level_init = parse_file(logFile_Name); + update_mdc_log_level_severity(log_level_init); //setting log level + free(log_level_init); + + } + enable_log_change_notify(logFile_Name); + free(logFile_Name); + +} + void init_log() { + int log_change_monitor = 0; mdclog_attr_t *attr; mdclog_attr_init(&attr); mdclog_attr_set_ident(attr, "E2Terminator"); mdclog_init(attr); + if(mdclog_format_initialize(log_change_monitor)!=0) + mdclog_write(MDCLOG_ERR, "Failed to intialize MDC log format !!!"); + dynamic_log_level_change(); mdclog_attr_destroy(attr); } auto start_time = std::chrono::high_resolution_clock::now(); @@ -157,29 +339,7 @@ int buildConfiguration(sctp_params_t &sctpParams) { } sctpParams.rmrPort = (uint16_t)rmrPort; snprintf(sctpParams.rmrAddress, sizeof(sctpParams.rmrAddress), "%d", (int) (sctpParams.rmrPort)); - - auto tmpStr = conf.getStringValue("loglevel"); - if (tmpStr.length() == 0) { - mdclog_write(MDCLOG_ERR, "illegal loglevel. Set loglevel to MDCLOG_INFO"); - tmpStr = "info"; - } - transform(tmpStr.begin(), tmpStr.end(), tmpStr.begin(), ::tolower); - - if ((tmpStr.compare("debug")) == 0) { - sctpParams.logLevel = MDCLOG_DEBUG; - } else if ((tmpStr.compare("info")) == 0) { - sctpParams.logLevel = MDCLOG_INFO; - } else if ((tmpStr.compare("warning")) == 0) { - sctpParams.logLevel = MDCLOG_WARN; - } else if ((tmpStr.compare("error")) == 0) { - sctpParams.logLevel = MDCLOG_ERR; - } else { - mdclog_write(MDCLOG_ERR, "illegal loglevel = %s. Set loglevel to MDCLOG_INFO", tmpStr.c_str()); - sctpParams.logLevel = MDCLOG_INFO; - } - mdclog_level_set(sctpParams.logLevel); - - tmpStr = conf.getStringValue("volume"); + auto tmpStr = conf.getStringValue("volume"); if (tmpStr.length() == 0) { mdclog_write(MDCLOG_ERR, "illegal volume."); return -1; @@ -216,6 +376,7 @@ int buildConfiguration(sctp_params_t &sctpParams) { } std::string pod = conf.getStringValue("pod_name"); +#ifndef UNIT_TEST if (pod.length() == 0) { mdclog_write(MDCLOG_ERR, "illegal pod_name in config file"); return -1; @@ -232,7 +393,7 @@ int buildConfiguration(sctp_params_t &sctpParams) { return -1; } } - +#endif tmpStr = conf.getStringValue("trace"); transform(tmpStr.begin(), tmpStr.end(), tmpStr.begin(), ::tolower); if ((tmpStr.compare("start")) == 0) { @@ -263,16 +424,15 @@ int buildConfiguration(sctp_params_t &sctpParams) { sctpParams.podName.c_str()); if (mdclog_level_get() >= MDCLOG_INFO) { - mdclog_mdc_add("RMR Port", to_string(sctpParams.rmrPort).c_str()); - mdclog_mdc_add("LogLevel", to_string(sctpParams.logLevel).c_str()); - mdclog_mdc_add("volume", sctpParams.volume); - mdclog_mdc_add("tmpLogFilespec", tmpLogFilespec); - mdclog_mdc_add("my ip", sctpParams.myIP.c_str()); - mdclog_mdc_add("pod name", sctpParams.podName.c_str()); + mdclog_write(MDCLOG_DEBUG,"RMR Port: %s", to_string(sctpParams.rmrPort).c_str()); + mdclog_write(MDCLOG_DEBUG,"LogLevel: %s", to_string(sctpParams.logLevel).c_str()); + mdclog_write(MDCLOG_DEBUG,"volume: %s", sctpParams.volume); + mdclog_write(MDCLOG_DEBUG,"tmpLogFilespec: %s", tmpLogFilespec); + mdclog_write(MDCLOG_DEBUG,"my ip: %s", sctpParams.myIP.c_str()); + mdclog_write(MDCLOG_DEBUG,"pod name: %s", sctpParams.podName.c_str()); mdclog_write(MDCLOG_INFO, "running parameters for instance : %s", sctpParams.ka_message); } - mdclog_mdc_clean(); // Files written to the current working directory boostLogger = logging::add_file_log( @@ -314,9 +474,9 @@ void startPrometheus(sctp_params_t &sctpParams) { sctpParams.prometheusExposer->RegisterCollectable(sctpParams.prometheusRegistry); } #ifndef UNIT_TEST + int main(const int argc, char **argv) { sctp_params_t sctpParams; - { std::random_device device{}; std::mt19937 generator(device()); @@ -330,8 +490,6 @@ int main(const int argc, char **argv) { unsigned num_cpus = std::thread::hardware_concurrency(); init_log(); - mdclog_level_set(MDCLOG_INFO); - if (std::signal(SIGINT, catch_function) == SIG_ERR) { mdclog_write(MDCLOG_ERR, "Error initializing SIGINT"); exit(1); @@ -368,7 +526,6 @@ int main(const int argc, char **argv) { mdclog_write(MDCLOG_ERR, "failed to open epoll descriptor"); exit(-1); } - getRmrContext(sctpParams); if (sctpParams.rmrCtx == nullptr) { close(sctpParams.epoll_fd); @@ -537,11 +694,14 @@ int buildInotify(sctp_params_t &sctpParams) { void listener(sctp_params_t *params) { int num_of_SCTP_messages = 0; auto totalTime = 0.0; - mdclog_mdc_clean(); - mdclog_level_set(params->logLevel); - std::thread::id this_id = std::this_thread::get_id(); //save cout + auto pod_name = std::getenv("POD_NAME"); + auto container_name = std::getenv("CONTAINER_NAME"); + auto service_name = std::getenv("SERVICE_NAME"); + auto host_name = std::getenv("HOST_NAME"); + auto system_name = std::getenv("SYSTEM_NAME"); + auto pid = std::to_string(getpid()).c_str(); streambuf *oldCout = cout.rdbuf(); ostringstream memCout; // create new cout @@ -553,7 +713,12 @@ void listener(sctp_params_t *params) { char tid[32]; memcpy(tid, memCout.str().c_str(), memCout.str().length() < 32 ? memCout.str().length() : 31); tid[memCout.str().length()] = 0; - mdclog_mdc_add("thread id", tid); + mdclog_mdc_add("SYSTEM_NAME", system_name); + mdclog_mdc_add("HOST_NAME", host_name); + mdclog_mdc_add("SERVICE_NAME", service_name); + mdclog_mdc_add("CONTAINER_NAME", container_name); + mdclog_mdc_add("POD_NAME", pod_name); + mdclog_mdc_add("PID", pid); if (mdclog_level_get() >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "started thread number %s", tid); @@ -589,7 +754,11 @@ void listener(sctp_params_t *params) { if (mdclog_level_get() >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Start EPOLL Wait. Timeout = %d", params->epollTimeOut); } +#ifndef UNIT_TEST auto numOfEvents = epoll_wait(params->epoll_fd, events, MAXEVENTS, params->epollTimeOut); +#else + auto numOfEvents = 1; +#endif if (numOfEvents == 0) { // time out if (mdclog_level_get() >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "got epoll timeout"); @@ -714,6 +883,9 @@ void listener(sctp_params_t *params) { end.tv_nsec - start.tv_nsec); } } +#ifdef UNIT_TEST + break; +#endif } } @@ -725,11 +897,17 @@ void handleConfigChange(sctp_params_t *sctpParams) { char buf[4096] __attribute__ ((aligned(__alignof__(struct inotify_event)))); const struct inotify_event *event; char *ptr; - +#ifdef UNIT_TEST + struct inotify_event tmpEvent; +#endif path p = (sctpParams->configFilePath + "/" + sctpParams->configFileName).c_str(); auto endlessLoop = true; while (endlessLoop) { - auto len = read(sctpParams->inotifyFD, buf, sizeof buf); +#ifndef UNIT_TEST + auto len = read(sctpParams->inotifyFD, buf, sizeof buf); +#else + auto len=10; +#endif if (len == -1) { if (errno != EAGAIN) { mdclog_write(MDCLOG_ERR, "read %s ", strerror(errno)); @@ -743,7 +921,12 @@ void handleConfigChange(sctp_params_t *sctpParams) { } for (ptr = buf; ptr < buf + len; ptr += sizeof(struct inotify_event) + event->len) { - event = (const struct inotify_event *)ptr; +#ifndef UNIT_TEST + event = (const struct inotify_event *)ptr; +#else + tmpEvent.mask = (uint32_t)IN_CLOSE_WRITE; + event = &tmpEvent; +#endif if (event->mask & (uint32_t)IN_ISDIR) { continue; } @@ -781,7 +964,6 @@ void handleConfigChange(sctp_params_t *sctpParams) { p.string().c_str(), strerror(errno)); return; } - auto tmpStr = conf.getStringValue("loglevel"); if (tmpStr.length() == 0) { mdclog_write(MDCLOG_ERR, "illegal loglevel. Set loglevel to MDCLOG_INFO"); @@ -806,8 +988,6 @@ void handleConfigChange(sctp_params_t *sctpParams) { sctpParams->logLevel = MDCLOG_INFO; } mdclog_level_set(sctpParams->logLevel); - - tmpStr = conf.getStringValue("trace"); if (tmpStr.length() == 0) { mdclog_write(MDCLOG_ERR, "illegal trace. Set trace to stop"); @@ -830,6 +1010,9 @@ void handleConfigChange(sctp_params_t *sctpParams) { endlessLoop = false; } +#ifdef UNIT_TEST + break; +#endif } } } @@ -946,17 +1129,13 @@ int setSocketNoBlocking(int socket) { auto flags = fcntl(socket, F_GETFL, 0); if (flags == -1) { - mdclog_mdc_add("func", "fcntl"); mdclog_write(MDCLOG_ERR, "%s, %s", __FUNCTION__, strerror(errno)); - mdclog_mdc_clean(); return -1; } flags = (unsigned) flags | (unsigned) O_NONBLOCK; if (fcntl(socket, F_SETFL, flags) == -1) { - mdclog_mdc_add("func", "fcntl"); mdclog_write(MDCLOG_ERR, "%s, %s", __FUNCTION__, strerror(errno)); - mdclog_mdc_clean(); return -1; } @@ -994,7 +1173,11 @@ void cleanHashEntry(ConnectedCU_t *val, Sctp_Map_t *m) { */ int sendSctpMsg(ConnectedCU_t *peerInfo, ReportingMessages_t &message, Sctp_Map_t *m) { auto loglevel = mdclog_level_get(); +#ifndef UNIT_TEST int fd = peerInfo->fileDescriptor; +#else + int fd = FILE_DESCRIPTOR; +#endif if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Send SCTP message for CU %s, %s", message.message.enodbName, __FUNCTION__); @@ -1006,11 +1189,13 @@ int sendSctpMsg(ConnectedCU_t *peerInfo, ReportingMessages_t &message, Sctp_Map_ continue; } mdclog_write(MDCLOG_ERR, "error writing to CU a message, %s ", strerror(errno)); +#ifndef UNIT_TEST if (!peerInfo->isConnected) { mdclog_write(MDCLOG_ERR, "connection to CU %s is still in progress.", message.message.enodbName); return -1; } cleanHashEntry(peerInfo, m); +#endif close(fd); char key[MAX_ENODB_NAME_SIZE * 2]; snprintf(key, MAX_ENODB_NAME_SIZE * 2, "msg:%s|%d", message.message.enodbName, @@ -1023,7 +1208,9 @@ int sendSctpMsg(ConnectedCU_t *peerInfo, ReportingMessages_t &message, Sctp_Map_ free(tmp); } m->erase(key); +#ifndef UNIT_TEST return -1; +#endif } message.message.direction = 'D'; // send report.buffer of size @@ -1093,8 +1280,12 @@ int receiveDataFromSctp(struct epoll_event *events, } // read the buffer directly to rmr payload message.message.asndata = rmrMessageBuffer.sendMessage->payload; +#ifndef UNIT_TEST message.message.asnLength = rmrMessageBuffer.sendMessage->len = read(message.peerInfo->fileDescriptor, rmrMessageBuffer.sendMessage->payload, RECEIVE_SCTP_BUFFER_SIZE); +#else + message.message.asnLength = rmrMessageBuffer.sendMessage->len; +#endif if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Finish Read from SCTP %d fd message length = %ld", @@ -1144,9 +1335,13 @@ int receiveDataFromSctp(struct epoll_event *events, printBuffer); clock_gettime(CLOCK_MONOTONIC, &decodeStart); } - +#ifndef UNIT_TEST auto rval = asn_decode(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void **) &pdu, - message.message.asndata, message.message.asnLength); + message.message.asndata, message.message.asnLength); +#else + asn_dec_rval_t rval = {RC_OK, 0}; + pdu = (E2AP_PDU_t*)rmrMessageBuffer.sendMessage->tp_buf; +#endif if (rval.code != RC_OK) { mdclog_write(MDCLOG_ERR, "Error %d Decoding (unpack) E2AP PDU from RAN : %s", rval.code, message.peerInfo->enodbName); @@ -1197,6 +1392,10 @@ int receiveDataFromSctp(struct epoll_event *events, //ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu); //pdu = nullptr; } +#ifdef UNIT_TEST + done = 1; + break; +#endif } if (done) { @@ -1209,12 +1408,13 @@ int receiveDataFromSctp(struct epoll_event *events, "%s|CU disconnected unexpectedly", message.peerInfo->enodbName); message.message.asndata = rmrMessageBuffer.sendMessage->payload; - +#ifndef UNIT_TEST if (sendRequestToXapp(message, RIC_SCTP_CONNECTION_FAILURE, rmrMessageBuffer) != 0) { mdclog_write(MDCLOG_ERR, "SCTP_CONNECTION_FAIL message failed to send to xAPP"); } +#endif /* Closing descriptor make epoll remove it from the set of descriptors which are monitored. */ close(message.peerInfo->fileDescriptor); @@ -1312,8 +1512,9 @@ static void buildAndSendSetupRequest(ReportingMessages_t &message, static unsigned char tx[32]; snprintf((char *) tx, sizeof tx, "%15ld", transactionCounter++); rmr_bytes2xact(rmrMsg, tx, strlen((const char *) tx)); - +#ifndef UNIT_TEST rmrMsg = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMsg); +#endif if (rmrMsg == nullptr) { mdclog_write(MDCLOG_ERR, "RMR failed to send returned nullptr"); } else if (rmrMsg->state != 0) { @@ -1323,7 +1524,9 @@ static void buildAndSendSetupRequest(ReportingMessages_t &message, rmrMsg->state = 0; mdclog_write(MDCLOG_INFO, "RETRY sending Message %d to Xapp from %s", rmrMsg->mtype, rmr_get_meid(rmrMsg, (unsigned char *) meid)); +#ifndef UNIT_TEST rmrMsg = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMsg); +#endif if (rmrMsg == nullptr) { mdclog_write(MDCLOG_ERR, "RMR failed send returned nullptr"); } else if (rmrMsg->state != 0) { @@ -1654,9 +1857,10 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, string messageName("RICserviceUpdate"); string ieName("RICserviceUpdateIEs"); message.message.messageType = RIC_SERVICE_UPDATE; +#ifndef UNIT_TEST message.peerInfo->counters[IN_INITI][MSG_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(); message.peerInfo->counters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment((double)message.message.asnLength); - +#endif buildAndSendSetupRequest(message, rmrMessageBuffer, pdu); break; } @@ -1664,8 +1868,10 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, if (logLevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Got ErrorIndication %s", message.message.enodbName); } +#ifndef UNIT_TEST message.peerInfo->counters[IN_INITI][MSG_COUNTER][ProcedureCode_id_ErrorIndication]->Increment(); message.peerInfo->counters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_ErrorIndication]->Increment((double)message.message.asnLength); +#endif if (sendRequestToXapp(message, RIC_ERROR_INDICATION, rmrMessageBuffer) != 0) { mdclog_write(MDCLOG_ERR, "RIC_ERROR_INDICATION failed to send to xAPP"); } @@ -1675,9 +1881,10 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, if (logLevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Got Reset %s", message.message.enodbName); } - +#ifndef UNIT_TEST message.peerInfo->counters[IN_INITI][MSG_COUNTER][ProcedureCode_id_Reset]->Increment(); message.peerInfo->counters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_Reset]->Increment((double)message.message.asnLength); +#endif if (XML_From_PER(message, rmrMessageBuffer) < 0) { break; } @@ -1720,8 +1927,10 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, ie->value.choice.RICrequestID.ricInstanceID, ie->value.choice.RICrequestID.ricRequestorID); } +#ifndef UNIT_TEST message.peerInfo->counters[IN_INITI][MSG_COUNTER][ProcedureCode_id_RICindication]->Increment(); message.peerInfo->counters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_RICindication]->Increment((double)message.message.asnLength); +#endif sendRmrMessage(rmrMessageBuffer, message); messageSent = true; } else { @@ -1765,8 +1974,10 @@ void asnSuccessfulMsg(E2AP_PDU_t *pdu, if (logLevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Got Reset %s", message.message.enodbName); } +#ifndef UNIT_TEST message.peerInfo->counters[IN_SUCC][MSG_COUNTER][ProcedureCode_id_Reset]->Increment(); message.peerInfo->counters[IN_SUCC][BYTES_COUNTER][ProcedureCode_id_Reset]->Increment((double)message.message.asnLength); +#endif if (XML_From_PER(message, rmrMessageBuffer) < 0) { break; } @@ -1802,9 +2013,10 @@ void asnSuccessfulMsg(E2AP_PDU_t *pdu, rmr_bytes2meid(rmrMessageBuffer.sendMessage, (unsigned char *)message.message.enodbName, strlen(message.message.enodbName)); - +#ifndef UNIT_TEST message.peerInfo->counters[IN_SUCC][MSG_COUNTER][ProcedureCode_id_RICcontrol]->Increment(); message.peerInfo->counters[IN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICcontrol]->Increment((double)message.message.asnLength); +#endif sendRmrMessage(rmrMessageBuffer, message); messageSent = true; } else { @@ -1822,8 +2034,10 @@ void asnSuccessfulMsg(E2AP_PDU_t *pdu, if (logLevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Got RICsubscription %s", message.message.enodbName); } +#ifndef UNIT_TEST message.peerInfo->counters[IN_SUCC][MSG_COUNTER][ProcedureCode_id_RICsubscription]->Increment(); message.peerInfo->counters[IN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICsubscription]->Increment((double)message.message.asnLength); +#endif if (sendRequestToXapp(message, RIC_SUB_RESP, rmrMessageBuffer) != 0) { mdclog_write(MDCLOG_ERR, "Subscription successful message failed to send to xAPP"); } @@ -1833,8 +2047,10 @@ void asnSuccessfulMsg(E2AP_PDU_t *pdu, if (logLevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Got RICsubscriptionDelete %s", message.message.enodbName); } +#ifndef UNIT_TEST message.peerInfo->counters[IN_SUCC][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment(); message.peerInfo->counters[IN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment((double)message.message.asnLength); +#endif if (sendRequestToXapp(message, RIC_SUB_DEL_RESP, rmrMessageBuffer) != 0) { mdclog_write(MDCLOG_ERR, "Subscription delete successful message failed to send to xAPP"); } @@ -1891,8 +2107,10 @@ void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu, rmr_bytes2xact(rmrMessageBuffer.sendMessage, tx, strlen((const char *) tx)); rmr_bytes2meid(rmrMessageBuffer.sendMessage, (unsigned char *) message.message.enodbName, strlen(message.message.enodbName)); +#ifndef UNIT_TEST message.peerInfo->counters[IN_UN_SUCC][MSG_COUNTER][ProcedureCode_id_RICcontrol]->Increment(); message.peerInfo->counters[IN_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICcontrol]->Increment((double)message.message.asnLength); +#endif sendRmrMessage(rmrMessageBuffer, message); messageSent = true; } else { @@ -1909,8 +2127,10 @@ void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu, if (logLevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Got RICsubscription %s", message.message.enodbName); } +#ifndef UNIT_TEST message.peerInfo->counters[IN_UN_SUCC][MSG_COUNTER][ProcedureCode_id_RICsubscription]->Increment(); message.peerInfo->counters[IN_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICsubscription]->Increment((double)message.message.asnLength); +#endif if (sendRequestToXapp(message, RIC_SUB_FAILURE, rmrMessageBuffer) != 0) { mdclog_write(MDCLOG_ERR, "Subscription unsuccessful message failed to send to xAPP"); } @@ -1920,8 +2140,10 @@ void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu, if (logLevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Got RICsubscriptionDelete %s", message.message.enodbName); } +#ifndef UNIT_TEST message.peerInfo->counters[IN_UN_SUCC][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment(); message.peerInfo->counters[IN_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment((double)message.message.asnLength); +#endif if (sendRequestToXapp(message, RIC_SUB_FAILURE, rmrMessageBuffer) != 0) { mdclog_write(MDCLOG_ERR, "Subscription Delete unsuccessful message failed to send to xAPP"); } @@ -1930,9 +2152,9 @@ void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu, default: { mdclog_write(MDCLOG_WARN, "Undefined or not supported message = %ld", procedureCode); message.message.messageType = 0; // no RMR message type yet - +#ifndef UNIT_TEST buildJsonMessage(message); - +#endif break; } } @@ -2027,6 +2249,9 @@ int PER_FromXML(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuf mdclog_write(MDCLOG_DEBUG, "%s After decoding the XML to PDU", __func__ ); } if (rval.code != RC_OK) { +#ifdef UNIT_TEST + return 0; +#endif mdclog_write(MDCLOG_ERR, "Error %d Decoding (unpack) setup response from E2MGR : %s", rval.code, message.message.enodbName); @@ -2087,6 +2312,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, // get message payload //auto msgData = msg->payload; +#ifdef UNIT_TEST + rmrMessageBuffer.rcvMessage->state = 0; +#endif if (rmrMessageBuffer.rcvMessage->state != 0) { mdclog_write(MDCLOG_ERR, "RMR Receiving message with stat = %d", rmrMessageBuffer.rcvMessage->state); return -1; @@ -2101,6 +2329,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, case RIC_HEALTH_CHECK_REQ: break; default: +#ifdef UNIT_TEST + break; +#endif mdclog_write(MDCLOG_ERR, "Failed to send message no CU entry %s", message.message.enodbName); return -1; } @@ -2118,8 +2349,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_SUCC][MSG_COUNTER][ProcedureCode_id_E2setup]->Increment(); message.peerInfo->counters[OUT_SUCC][BYTES_COUNTER][ProcedureCode_id_E2setup]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_SETUP_RESP"); return -6; @@ -2133,8 +2366,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_UN_SUCC][MSG_COUNTER][ProcedureCode_id_E2setup]->Increment(); message.peerInfo->counters[OUT_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_E2setup]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_SETUP_FAILURE"); return -6; @@ -2145,8 +2380,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_ERROR_INDICATION"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_ErrorIndication]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_ErrorIndication]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_ERROR_INDICATION"); return -6; @@ -2157,8 +2394,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_SUB_REQ"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscription]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscription]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SUB_REQ"); return -6; @@ -2169,8 +2408,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_SUB_DEL_REQ"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICsubscriptionDelete]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SUB_DEL_REQ"); return -6; @@ -2181,8 +2422,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC_CONTROL_REQ"); } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICcontrol]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICcontrol]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_CONTROL_REQ"); return -6; @@ -2196,8 +2439,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_RICserviceQuery]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_RICserviceQuery]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SERVICE_QUERY"); return -6; @@ -2212,8 +2457,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, mdclog_write(MDCLOG_ERR, "error in PER_FromXML"); break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_SUCC][MSG_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(); message.peerInfo->counters[OUT_SUCC][BYTES_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (loglevel >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Before sending to CU"); } @@ -2230,8 +2477,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_UN_SUCC][MSG_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(); message.peerInfo->counters[OUT_UN_SUCC][BYTES_COUNTER][ProcedureCode_id_RICserviceUpdate]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_SERVICE_UPDATE_FAILURE"); return -6; @@ -2245,8 +2494,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_INITI][MSG_COUNTER][ProcedureCode_id_Reset]->Increment(); message.peerInfo->counters[OUT_INITI][BYTES_COUNTER][ProcedureCode_id_Reset]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_RESET"); return -6; @@ -2260,8 +2511,10 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, if (PER_FromXML(message, rmrMessageBuffer) != 0) { break; } +#ifndef UNIT_TEST message.peerInfo->counters[OUT_SUCC][MSG_COUNTER][ProcedureCode_id_Reset]->Increment(); message.peerInfo->counters[OUT_SUCC][BYTES_COUNTER][ProcedureCode_id_Reset]->Increment(rmrMessageBuffer.rcvMessage->len); +#endif if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) { mdclog_write(MDCLOG_ERR, "Failed to send RIC_E2_RESET_RESP"); return -6; @@ -2313,7 +2566,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap, static unsigned char tx[32]; auto txLen = snprintf((char *) tx, sizeof tx, "%15ld", transactionCounter++); rmr_bytes2xact(rmrMessageBuffer.sendMessage, tx, txLen); +#ifndef UNIT_TEST rmrMessageBuffer.sendMessage = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMessageBuffer.sendMessage); +#endif if (rmrMessageBuffer.sendMessage == nullptr) { rmrMessageBuffer.sendMessage = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, RECEIVE_XAPP_BUFFER_SIZE); mdclog_write(MDCLOG_ERR, "Failed to send E2_TERM_KEEP_ALIVE_RESP RMR message returned NULL"); @@ -2508,9 +2763,11 @@ int modifyToEpoll(int epoll_fd, int sendRmrMessage(RmrMessagesBuffer_t &rmrMessageBuffer, ReportingMessages_t &message) { buildJsonMessage(message); - +#ifndef UNIT_TEST rmrMessageBuffer.sendMessage = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMessageBuffer.sendMessage); - +#else + rmrMessageBuffer.sendMessage->state = RMR_ERR_RETRY; +#endif if (rmrMessageBuffer.sendMessage == nullptr) { rmrMessageBuffer.sendMessage = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, RECEIVE_XAPP_BUFFER_SIZE); mdclog_write(MDCLOG_ERR, "RMR failed send message returned with NULL pointer"); @@ -2525,7 +2782,9 @@ int sendRmrMessage(RmrMessagesBuffer_t &rmrMessageBuffer, ReportingMessages_t &m mdclog_write(MDCLOG_INFO, "RETRY sending Message type %d to Xapp from %s", rmrMessageBuffer.sendMessage->mtype, rmr_get_meid(rmrMessageBuffer.sendMessage, (unsigned char *)meid)); +#ifndef UNIT_TEST rmrMessageBuffer.sendMessage = rmr_send_msg(rmrMessageBuffer.rmrCtx, rmrMessageBuffer.sendMessage); +#endif if (rmrMessageBuffer.sendMessage == nullptr) { mdclog_write(MDCLOG_ERR, "RMR failed send message returned with NULL pointer"); rmrMessageBuffer.sendMessage = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, RECEIVE_XAPP_BUFFER_SIZE); @@ -2551,6 +2810,9 @@ int sendRmrMessage(RmrMessagesBuffer_t &rmrMessageBuffer, ReportingMessages_t &m } void buildJsonMessage(ReportingMessages_t &message) { +#ifdef UNIT_TEST + jsonTrace = true; +#endif if (jsonTrace) { message.outLen = sizeof(message.base64Data); base64::encode((const unsigned char *) message.message.asndata,