X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=RIC-E2-TERMINATION%2FsctpThread.cpp;h=f9a56ddaf59cc247dd7e4cbc2428f6399936fa20;hb=233facdf921c63a800c75724d153998b91b12a36;hp=c5ba2295442ebae90d4e6d3e5125ff113f0c7fb2;hpb=1c4f50f7e4f81e6f60f73ff2f0415a63317d3841;p=ric-plt%2Fe2.git diff --git a/RIC-E2-TERMINATION/sctpThread.cpp b/RIC-E2-TERMINATION/sctpThread.cpp index c5ba229..f9a56dd 100644 --- a/RIC-E2-TERMINATION/sctpThread.cpp +++ b/RIC-E2-TERMINATION/sctpThread.cpp @@ -24,17 +24,9 @@ #include "sctpThread.h" #include "BuildRunName.h" -//#define asn_DEF_E2SM_gNB_NRT_RANfunction_Definition e2sm_asn_DEF_E2SM_gNB_NRT_RANfunction_Definition -//#define __gcov_init e2sm___gcov_init -//#define __gcov_merge_add e2sm___gcov_merge_add -//#define calloc e2sm_calloc - #include "3rdparty/oranE2SM/E2SM-gNB-NRT-RANfunction-Definition.h" -//#undef calloc -//#undef __gcov_merge_add -//#undef __gcov_init -//#undef asn_DEF_E2SM_gNB_NRT_RANfunction_Definition +#include "pugixml/src/pugixml.hpp" using namespace std; //using namespace std::placeholders; @@ -726,12 +718,16 @@ void handleConfigChange(sctp_params_t *sctpParams) { // not the directory } if (event->len) { - if (!(sctpParams->configFileName.compare(event->name))) { + auto retVal = strcmp(sctpParams->configFileName.c_str(), event->name); + if (retVal != 0) { continue; } } // only the file we want if (event->mask & (uint32_t)IN_CLOSE_WRITE) { + if (mdclog_level_get() >= MDCLOG_INFO) { + mdclog_write(MDCLOG_INFO, "Configuration file changed"); + } if (exists(p)) { const int size = 2048; auto fileSize = file_size(p); @@ -1207,7 +1203,8 @@ int receiveDataFromSctp(struct epoll_event *events, static void buildAndsendSetupRequest(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuffer, - E2AP_PDU_t *pdu) { + E2AP_PDU_t *pdu, + vector repValues) { auto logLevel = mdclog_level_get(); // now we can send the data to e2Mgr @@ -1224,10 +1221,64 @@ static void buildAndsendSetupRequest(ReportingMessages_t &message, if (er.encoded == -1) { mdclog_write(MDCLOG_ERR, "encoding of %s failed, %s", asn_DEF_E2AP_PDU.name, strerror(errno)); } else if (er.encoded > (ssize_t) buffer_size) { - mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s", + mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s, at %s line %d", (int) buffer_size, - asn_DEF_E2AP_PDU.name); + asn_DEF_E2AP_PDU.name, __func__, __LINE__); } else { + // we have the XML + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_string((const char *)buffer); + if (result) { + unsigned int index = 0; + for (auto tool : doc.child("E2AP-PDU") + .child("initiatingMessage") + .child("value") + .child("E2setupRequest") + .child("protocolIEs") + .children("E2setupRequestIEs")) { + for (auto n : tool.child("value").child("RANfunctions-List").child( + "ProtocolIE-SingleContainer").children()) { + //ProtocolIE-SingleContainer + //cout << "\t1 " << n.name() << endl; + if (strcmp(n.name(), "value") == 0) { + for (auto l : tool.child("value").children()) { + //cout << "\t\t2 " << l.name() << endl; + for (auto f : l.children()) { + //cout << "\t\t\t3 " << f.name() << endl; + for (auto g : f.child("value").children()) { + //cout << "\t\t\t\t4 " << g.name() << endl; + for (auto a : g.children()) { + if (strcmp(a.name(), "ranFunctionDefinition") == 0) { + if (repValues.size() > index) { + a.remove_children(); + string val = repValues.at(index++); + // here we get vector with counter + a.append_child(pugi::node_pcdata).set_value(val.c_str()); + + } + } + //cout << "\t\t\t\t\t5 " << a.name() << " " << a.child_value() << endl; + } + } + } + } + } + } + } + +// memstream strinBuf(buffer, RECEIVE_SCTP_BUFFER_SIZE * 2); +// +// strinBuf.read(, RECEIVE_SCTP_BUFFER_SIZE * 2); + + streambuf *oldCout = cout.rdbuf(); + ostringstream memCout; + // create new cout + cout.rdbuf(memCout.rdbuf()); + doc.save(std::cout); + //return to the normal cout + cout.rdbuf(oldCout); + memcpy(buffer, memCout.str().c_str(), memCout.str().length()); + } rmrMsg->len = snprintf((char *)rmrMsg->payload, RECEIVE_SCTP_BUFFER_SIZE * 2, "%s:%d|%s", message.peerInfo->sctpParams->myIP.c_str(), message.peerInfo->sctpParams->rmrPort, @@ -1309,12 +1360,15 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, if (er.encoded == -1) { mdclog_write(MDCLOG_ERR, "encoding of %s failed, %s", asn_DEF_E2AP_PDU.name, strerror(errno)); } else if (er.encoded > (ssize_t) setup_xml_buffer_size) { - mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s", + mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s, at %s line %d", (int)setup_xml_buffer_size, - asn_DEF_E2AP_PDU.name); + asn_DEF_E2AP_PDU.name, __func__, __LINE__); } std::string xmlString(setup_xml_buffer_size, setup_xml_buffer_size + er.encoded); + vector runFunDEFXML_v; + runFunDEFXML_v.clear(); + string runFuncStr = {}; auto failed = false; memset(message.peerInfo->enodbName, 0 , MAX_ENODB_NAME_SIZE); for (auto i = 0; i < pdu->choice.initiatingMessage->value.choice.E2setupRequest.protocolIEs.list.count; i++) { @@ -1357,8 +1411,10 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, char *printBuffer; size_t size; FILE *stream = open_memstream(&printBuffer, &size); - asn_fprint(stream, &asn_DEF_E2SM_gNB_NRT_RANfunction_Definition, pdu); - mdclog_write(MDCLOG_DEBUG, "Encoding E2AP PDU past : %s", printBuffer); + asn_fprint(stream, &asn_DEF_E2SM_gNB_NRT_RANfunction_Definition, ranFunDef); + mdclog_write(MDCLOG_DEBUG, "Encoding E2SM %s PDU past : %s", + asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name, + printBuffer); } auto xml_buffer_size = RECEIVE_SCTP_BUFFER_SIZE * 2; unsigned char xml_buffer[RECEIVE_SCTP_BUFFER_SIZE * 2]; @@ -1374,11 +1430,18 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name, strerror(errno)); } else if (er.encoded > (ssize_t)xml_buffer_size) { - mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s", + mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s, at %s line %d", (int) xml_buffer_size, - asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name); + asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name, __func__, __LINE__); } else { - // we have the xml + if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "Encoding E2SM %s PDU past : %s", + asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name, + xml_buffer); + } + //TODO replace the ranFunctionDefinition with the XML + string runFuncs = (char *)(xml_buffer); + runFunDEFXML_v.emplace_back(runFuncs); } } @@ -1395,7 +1458,7 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, //build all parts and send the XML (need to copy the XML with the header to the rmrMessageBuffer payload //TODO replace with new function - buildAndsendSetupRequest(message, rmrMessageBuffer, pdu); + buildAndsendSetupRequest(message, rmrMessageBuffer, pdu, runFunDEFXML_v); break; } case ProcedureCode_id_ErrorIndication: { @@ -1907,17 +1970,21 @@ int BuildPERSetupResponseMessaeFromXML(ReportingMessages_t &message, RmrMessages return -1; } - auto er = asn_encode_to_buffer(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, pdu, - rmrMessageBuffer.rcvMessage->payload, rmrMessageBuffer.rcvMessage->len); + int buff_size = RECEIVE_XAPP_BUFFER_SIZE; + auto er = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu, + rmrMessageBuffer.rcvMessage->payload, buff_size); if (er.encoded == -1) { mdclog_write(MDCLOG_ERR, "encoding of %s failed, %s", asn_DEF_E2AP_PDU.name, strerror(errno)); return -1; - } else if (er.encoded > (ssize_t)rmrMessageBuffer.rcvMessage->len) { - mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s", + } else if (er.encoded > (ssize_t)buff_size) { + mdclog_write(MDCLOG_ERR, "Buffer of size %d is to small for %s, at %s line %d", (int)rmrMessageBuffer.rcvMessage->len, - asn_DEF_E2AP_PDU.name); + asn_DEF_E2AP_PDU.name, + __func__, + __LINE__); return -1; } + rmrMessageBuffer.rcvMessage->len = er.encoded; return 0; }