From 0829b8b91c245c19a4eb7288f81c4da762184f28 Mon Sep 17 00:00:00 2001 From: "aa7133@att.com" Date: Thu, 16 Apr 2020 19:27:42 +0300 Subject: [PATCH] version 4.0.8 Fix bug in the XML builder using string with using buffer to avoid overwrite on the XML (XML doc failed translate the buffer) Fix the processing of the XML to skip loops and use more direct access to entries Change-Id: I9221edfd7c9ed96e9c2f300280417b59ac9be5ba Signed-off-by: aa7133@att.com --- RIC-E2-TERMINATION/BuildXml.h | 117 ++++++++++++++++++-------------------- RIC-E2-TERMINATION/sctpThread.cpp | 51 ++++++++++------- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/RIC-E2-TERMINATION/BuildXml.h b/RIC-E2-TERMINATION/BuildXml.h index 457ef8b..fe6d757 100644 --- a/RIC-E2-TERMINATION/BuildXml.h +++ b/RIC-E2-TERMINATION/BuildXml.h @@ -25,8 +25,10 @@ #include #include #include "pugixml/src/pugixml.hpp" -#include +#include #include +#include +#include using namespace std; @@ -36,36 +38,36 @@ using namespace std; struct xml_string_writer : pugi::xml_writer { std::string result; - virtual void write(const void *data, size_t size) { + void write(const void *data, size_t size) override { result.append(static_cast(data), size); } }; // end::code[] -struct xml_memory_writer : pugi::xml_writer { - char *buffer; - size_t capacity; - size_t result; - - xml_memory_writer() : buffer(0), capacity(0), result(0) { - } - - xml_memory_writer(char *buffer, size_t capacity) : buffer(buffer), capacity(capacity), result(0) { - } - - size_t written_size() const { - return result < capacity ? result : capacity; - } - - virtual void write(const void *data, size_t size) { - if (result < capacity) { - size_t chunk = (capacity - result < size) ? capacity - result : size; - - memcpy(buffer + result, data, chunk); - } - result += size; - } -}; +//struct xml_memory_writer : pugi::xml_writer { +// char *buffer; +// size_t capacity; +// size_t result; +// +// xml_memory_writer() : buffer(nullptr), capacity(0), result(0) { +// } +// +// xml_memory_writer(char *buffer, size_t capacity) : buffer(buffer), capacity(capacity), result(0) { +// } +// +// [[nodiscard]] size_t written_size() const { +// return result < capacity ? result : capacity; +// } +// +// void write(const void *data, size_t size) override { +// if (result < capacity) { +// size_t chunk = (capacity - result < size) ? capacity - result : size; +// +// memcpy(buffer + result, data, chunk); +// } +// result += size; +// } +//}; std::string node_to_string(pugi::xml_node node) { xml_string_writer writer; @@ -75,10 +77,11 @@ std::string node_to_string(pugi::xml_node node) { } -void buildXmlData(const string &messageName, const string &ieName, vector &repValues, unsigned char *buffer) { +int buildXmlData(const string &messageName, const string &ieName, vector &RANfunctionsAdded, unsigned char *buffer, size_t size) { pugi::xml_document doc; - pugi::xml_parse_result result = doc.load_string((const char *)buffer); + doc.reset(); + pugi::xml_parse_result result = doc.load_buffer((const char *)buffer, size); if (result) { unsigned int index = 0; for (auto tool : doc.child("E2AP-PDU") @@ -87,48 +90,38 @@ void buildXmlData(const string &messageName, const string &ieName, vector 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; - } - } - } + auto node = tool.child("id"); + if (strcmp(node.name(), "id") == 0 && strcmp(node.child_value(), "10") == 0) { + auto nodea = tool.child("value"). + child("RANfunctions-List"). + children("ProtocolIE-SingleContainer"); + for (auto n1 : nodea) { + auto n2 = n1.child("value").child("RANfunction-Item").child("ranFunctionDefinition"); + n2.remove_children(); + string val = RANfunctionsAdded.at(index++); + // here we get vector with counter + n2.append_child(pugi::node_pcdata).set_value(val.c_str()); + if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "entry %s Replaced with : %s", n2.name(), n2.child_value()); } } + } else { + if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "Entry %s = value %s skipped", node.name(), node.child_value()); + } + continue; } } auto res = node_to_string(doc); memcpy(buffer, res.c_str(), res.length()); - -// 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()); + doc.reset(); + } else { + mdclog_write(MDCLOG_ERR, "Error loading xml string"); + return -1; } + return 0; + } #endif //E2_BUILDXML_H diff --git a/RIC-E2-TERMINATION/sctpThread.cpp b/RIC-E2-TERMINATION/sctpThread.cpp index c2ad2c5..f622d53 100644 --- a/RIC-E2-TERMINATION/sctpThread.cpp +++ b/RIC-E2-TERMINATION/sctpThread.cpp @@ -1197,16 +1197,10 @@ static void buildAndsendSetupRequest(ReportingMessages_t &message, E2AP_PDU_t *pdu, vector &repValues) { auto logLevel = mdclog_level_get(); - // now we can send the data to e2Mgr auto buffer_size = RECEIVE_SCTP_BUFFER_SIZE * 2; - - auto *rmrMsg = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, buffer_size); - // add addrees to message - - - // unsigned char *buffer = &rmrMsg->payload[j]; unsigned char buffer[RECEIVE_SCTP_BUFFER_SIZE * 2]; + auto *rmrMsg = rmr_alloc_msg(rmrMessageBuffer.rmrCtx, buffer_size); // encode to xml auto er = asn_encode_to_buffer(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, pdu, buffer, buffer_size); if (er.encoded == -1) { @@ -1218,7 +1212,9 @@ static void buildAndsendSetupRequest(ReportingMessages_t &message, } else { string messageType("E2setupRequest"); string ieName("E2setupRequestIEs"); - buildXmlData(messageType, ieName, repValues, buffer); + buffer[er.encoded] = '\0'; + buildXmlData(messageType, ieName, repValues, buffer, (size_t)er.encoded); + // string xmlStr = (char *)buffer; // auto removeSpaces = [] (string str) -> string { // str.erase(remove(str.begin(), str.end(), ' '), str.end()); @@ -1348,10 +1344,11 @@ int RAN_Function_list_To_Vector(RANfunctions_List_t& list, vector &runF -int collectSetupRequestData(E2AP_PDU_t *pdu, - Sctp_Map_t *sctpMap, - ReportingMessages_t &message, - vector &runFunDEFXML_v) { +int collectSetupAndServiceUpdate_RequestData(E2AP_PDU_t *pdu, + Sctp_Map_t *sctpMap, + ReportingMessages_t &message, + vector &RANfunctionsAdded_v, + vector &RANfunctionsModified_v) { memset(message.peerInfo->enodbName, 0 , MAX_ENODB_NAME_SIZE); for (auto i = 0; i < pdu->choice.initiatingMessage->value.choice.E2setupRequest.protocolIEs.list.count; i++) { auto *ie = pdu->choice.initiatingMessage->value.choice.E2setupRequest.protocolIEs.list.array[i]; @@ -1366,15 +1363,23 @@ int collectSetupRequestData(E2AP_PDU_t *pdu, memcpy(message.message.enodbName, message.peerInfo->enodbName, strlen(message.peerInfo->enodbName)); sctpMap->setkey(message.message.enodbName, message.peerInfo); } - } - // reformat RANFUNCTION Definition to XML - if (ie->id == ProtocolIE_ID_id_RANfunctionsAdded) { + } else if (ie->id == ProtocolIE_ID_id_RANfunctionsAdded) { if (ie->value.present == E2setupRequestIEs__value_PR_RANfunctions_List) { if (mdclog_level_get() >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Run function list have %d entries", ie->value.choice.RANfunctions_List.list.count); } - if (RAN_Function_list_To_Vector(ie->value.choice.RANfunctions_List, runFunDEFXML_v) != 0 ) { + if (RAN_Function_list_To_Vector(ie->value.choice.RANfunctions_List, RANfunctionsAdded_v) != 0 ) { + return -1; + } + } + } else if (ie->id == ProtocolIE_ID_id_RANfunctionsModified) { + if (ie->value.present == E2setupRequestIEs__value_PR_RANfunctions_List) { + if (mdclog_level_get() >= MDCLOG_DEBUG) { + mdclog_write(MDCLOG_DEBUG, "Run function list have %d entries", + ie->value.choice.RANfunctions_List.list.count); + } + if (RAN_Function_list_To_Vector(ie->value.choice.RANfunctions_List, RANfunctionsModified_v) != 0 ) { return -1; } } @@ -1382,7 +1387,7 @@ int collectSetupRequestData(E2AP_PDU_t *pdu, } if (mdclog_level_get() >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "Run function vector have %ld entries", - runFunDEFXML_v.size()); + RANfunctionsAdded_v.size()); } return 0; } @@ -1423,13 +1428,16 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu, } std::string xmlString(setup_xml_buffer_size, setup_xml_buffer_size + er.encoded); - vector runFunDEFXML_v; - runFunDEFXML_v.clear(); - if (collectSetupRequestData(pdu, sctpMap, message, runFunDEFXML_v) != 0) { + vector RANfunctionsAdded_v; + vector RANfunctionsModified_v; + RANfunctionsAdded_v.clear(); + RANfunctionsModified_v.clear(); + if (collectSetupAndServiceUpdate_RequestData(pdu, sctpMap, message, + RANfunctionsAdded_v, RANfunctionsModified_v) != 0) { break; } - buildAndsendSetupRequest(message, rmrMessageBuffer, pdu, runFunDEFXML_v); + buildAndsendSetupRequest(message, rmrMessageBuffer, pdu, RANfunctionsAdded_v); break; } case ProcedureCode_id_RICserviceUpdate: { @@ -1643,7 +1651,6 @@ void asnSuccsesfulMsg(E2AP_PDU_t *pdu, (unsigned char *)message.message.enodbName, strlen(message.message.enodbName)); rmrMessageBuffer.sendMessage->state = 0; -// rmrMessageBuffer.sendMessage->sub_id = (int)ie->value.choice.RICrequestID.ricRequestorID; rmrMessageBuffer.sendMessage->sub_id = (int)ie->value.choice.RICrequestID.ricInstanceID; if (mdclog_level_get() >= MDCLOG_DEBUG) { mdclog_write(MDCLOG_DEBUG, "RIC sub id = %d, message type = %d", -- 2.16.6