version 4.0.8 93/3293/1
authoraa7133@att.com <aa7133@att.com>
Thu, 16 Apr 2020 08:34:26 +0000 (11:34 +0300)
committeraa7133@att.com <aa7133@att.com>
Thu, 16 Apr 2020 08:35:01 +0000 (11:35 +0300)
change typo in sub_id
replace redirection cout (<<) with buffer writer to string on XML builder
added parameters to messages in test

Change-Id: I350fe454f31923171b0ec37a5f2c743cf56ef719
Signed-off-by: aa7133@att.com <aa7133@att.com>
RIC-E2-TERMINATION/BuildXml.h
RIC-E2-TERMINATION/TEST/T1/E2Builder.h
RIC-E2-TERMINATION/TEST/testAsn/setUpMessages/SetUpMessages.cpp
RIC-E2-TERMINATION/container-tag.yaml
RIC-E2-TERMINATION/sctpThread.cpp

index 7853172..457ef8b 100644 (file)
 #include <string.h>
 #include <sstream>
 
-
 using namespace std;
 
-void buildXmlData(vector<string> &repValues, unsigned char *buffer) {
+/*
+ * Copied from pugixml samples
+ */
+struct xml_string_writer : pugi::xml_writer {
+    std::string result;
+
+    virtual void write(const void *data, size_t size) {
+        result.append(static_cast<const char *>(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;
+    }
+};
+
+std::string node_to_string(pugi::xml_node node) {
+    xml_string_writer writer;
+    node.print(writer);
+
+    return writer.result;
+}
+
+
+void buildXmlData(const string &messageName, const string &ieName, vector<string> &repValues, unsigned char *buffer) {
     pugi::xml_document doc;
 
-    pugi::xml_parse_result result = doc.load_string((const char *) buffer);
+    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(messageName.c_str())
                 .child("protocolIEs")
-                .children("E2setupRequestIEs")) {
+                .children(ieName.c_str())) {
             for (auto n : tool.child("value").child("RANfunctions-List").child(
                     "ProtocolIE-SingleContainer").children()) {
 //ProtocolIE-SingleContainer
@@ -73,14 +117,17 @@ void buildXmlData(vector<string> &repValues, unsigned char *buffer) {
             }
         }
 
-        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());
+        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());
     }
 }
 
index 039f7c5..3ee6305 100644 (file)
@@ -693,18 +693,49 @@ void buildSetupUnSuccsessfulResponse(E2AP_PDU_t *pdu) {
     uns->criticality = Criticality_reject;
     uns->value.present = UnsuccessfulOutcome__value_PR_E2setupFailure;
 
-    auto *e2SetupFIE = (E2setupFailureIEs_t *)calloc(1, sizeof(E2setupFailureIEs_t));
-    ASN_STRUCT_RESET(asn_DEF_E2setupFailureIEs, e2SetupFIE);
+    ASN_STRUCT_RESET(asn_DEF_E2setupFailure, &uns->value.choice.E2setupFailure);
 
-    e2SetupFIE->criticality = Criticality_reject;
-    e2SetupFIE->id = ProtocolIE_ID_id_GlobalRIC_ID;
-    e2SetupFIE->value.present = E2setupFailureIEs__value_PR_Cause;
-    e2SetupFIE->value.choice.Cause.present = Cause_PR_transport;
-    e2SetupFIE->value.choice.Cause.choice.transport = CauseTransport_transport_resource_unavailable;
 
+    {
+        auto *e2SetupFIE = (E2setupFailureIEs_t *) calloc(1, sizeof(E2setupFailureIEs_t));
+        ASN_STRUCT_RESET(asn_DEF_E2setupFailureIEs, e2SetupFIE);
 
-    ASN_STRUCT_RESET(asn_DEF_E2setupFailure, &uns->value.choice.E2setupFailure);
-    ASN_SEQUENCE_ADD(&uns->value.choice.E2setupFailure.protocolIEs.list, e2SetupFIE);
+        e2SetupFIE->criticality = Criticality_ignore;
+        e2SetupFIE->id = ProtocolIE_ID_id_Cause;
+        e2SetupFIE->value.present = E2setupFailureIEs__value_PR_Cause;
+        e2SetupFIE->value.choice.Cause.present = Cause_PR_transport;
+        e2SetupFIE->value.choice.Cause.choice.transport = CauseTransport_transport_resource_unavailable;
+
+
+        ASN_SEQUENCE_ADD(&uns->value.choice.E2setupFailure.protocolIEs.list, e2SetupFIE);
+    }
+
+    {
+        auto *e2SetupFIE = (E2setupFailureIEs_t *) calloc(1, sizeof(E2setupFailureIEs_t));
+        ASN_STRUCT_RESET(asn_DEF_E2setupFailureIEs, e2SetupFIE);
+
+        e2SetupFIE->criticality = Criticality_ignore;
+        e2SetupFIE->id = ProtocolIE_ID_id_TimeToWait;
+        e2SetupFIE->value.present = E2setupFailureIEs__value_PR_TimeToWait;
+        e2SetupFIE->value.choice.TimeToWait = TimeToWait_v60s;
+
+        ASN_SEQUENCE_ADD(&uns->value.choice.E2setupFailure.protocolIEs.list, e2SetupFIE);
+    }
+    {
+        auto *e2SetupFIE = (E2setupFailureIEs_t *) calloc(1, sizeof(E2setupFailureIEs_t));
+        ASN_STRUCT_RESET(asn_DEF_E2setupFailureIEs, e2SetupFIE);
+
+        e2SetupFIE->criticality = Criticality_ignore;
+        e2SetupFIE->id = ProtocolIE_ID_id_CriticalityDiagnostics;
+        e2SetupFIE->value.present = E2setupFailureIEs__value_PR_CriticalityDiagnostics;
+        e2SetupFIE->value.choice.CriticalityDiagnostics.procedureCode = (ProcedureCode_t *)calloc(1,sizeof(ProcedureCode_t));
+        *e2SetupFIE->value.choice.CriticalityDiagnostics.procedureCode = ProcedureCode_id_E2setup;
+        e2SetupFIE->value.choice.CriticalityDiagnostics.triggeringMessage = (TriggeringMessage_t *)calloc(1,sizeof(TriggeringMessage_t));
+        *e2SetupFIE->value.choice.CriticalityDiagnostics.triggeringMessage = TriggeringMessage_initiating_message;
+        e2SetupFIE->value.choice.CriticalityDiagnostics.procedureCriticality = (Criticality_t *)calloc(1, sizeof(Criticality_t));
+        *e2SetupFIE->value.choice.CriticalityDiagnostics.procedureCriticality = Criticality_reject;
+        ASN_SEQUENCE_ADD(&uns->value.choice.E2setupFailure.protocolIEs.list, e2SetupFIE);
+    }
 
     pdu->present = E2AP_PDU_PR_unsuccessfulOutcome;
 }
index 7137401..ca18a12 100644 (file)
@@ -138,6 +138,31 @@ std::string otherXml = "<E2AP-PDU>\n"
 
 std::string newXml =
         "<E2AP-PDU><successfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupResponse><protocolIEs><E2setupResponseIEs><id>4</id><criticality><reject/></criticality><value><GlobalRIC-ID><pLMN-Identity>13 10 14</pLMN-Identity><ric-ID>10101010110011001110</ric-ID></GlobalRIC-ID></value></E2setupResponseIEs><E2setupResponseIEs><id>9</id><criticality><reject/></criticality><value><RANfunctionsID-List><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>1</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>2</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>3</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer></RANfunctionsID-List></value></E2setupResponseIEs></protocolIEs></E2setupResponse></value></successfulOutcome></E2AP-PDU>";
+std::string setupFailure = "<E2AP-PDU>"
+                             "<unsuccessfulOutcome>"
+                               "<procedureCode>1</procedureCode>"
+                               "<criticality><reject/></criticality>"
+                               "<value>"
+                                 "<E2setupFailure>"
+                                   "<protocolIEs>"
+                                     "<E2setupFailureIEs>"
+                                       "<id>1</id>"
+                                       "<criticality><reject/></criticality>"
+                                       "<value>"
+                                         "<Cause>"
+                                           "<transport>"
+                                             "<transport-resource-unavailable/>"
+                                           "</transport>"
+                                         "</Cause>"
+                                       "</value>"
+                                     "</E2setupFailureIEs>"
+                                   "</protocolIEs>"
+                                 "</E2setupFailure>"
+                               "</value>"
+                             "</unsuccessfulOutcome>"
+                           "</E2AP-PDU>";
+
+
 
 auto main(const int argc, char **argv) -> int {
     E2AP_PDU_t pdu;
@@ -149,7 +174,7 @@ auto main(const int argc, char **argv) -> int {
 
     E2AP_PDU_t *XERpdu  = nullptr;
     auto rval = asn_decode(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, (void **) &XERpdu,
-                           newXml.c_str(), newXml.length());
+                           setupFailure.c_str(), setupFailure.length());
     if (rval.code != RC_OK) {
         cout <<  "Error " << rval.code << " (unpack) setup response " << endl;
         //return -1;
index 5693926..fb2ad1f 100644 (file)
@@ -1,3 +1,3 @@
 # The Jenkins job requires a tag to build the Docker image.
 # Global-JJB script assumes this file is in the repo root.
-tag: 4.0.7.1
+tag: 4.0.8
index b65b1be..c2ad2c5 100644 (file)
@@ -1216,9 +1216,22 @@ static void buildAndsendSetupRequest(ReportingMessages_t &message,
                      (int) buffer_size,
                      asn_DEF_E2AP_PDU.name, __func__, __LINE__);
     } else {
-
-        buildXmlData(repValues, buffer);
-        // we have the XML
+        string messageType("E2setupRequest");
+        string ieName("E2setupRequestIEs");
+        buildXmlData(messageType, ieName, repValues, buffer);
+//        string xmlStr = (char *)buffer;
+//        auto removeSpaces = [] (string str) -> string {
+//            str.erase(remove(str.begin(), str.end(), ' '), str.end());
+//            str.erase(remove(str.begin(), str.end(), '\t'), str.end());
+//            return str;
+//        };
+//
+//        xmlStr = removeSpaces(xmlStr);
+//        // we have the XML
+//        rmrMsg->len = snprintf((char *)rmrMsg->payload, RECEIVE_SCTP_BUFFER_SIZE * 2, "%s:%d|%s",
+//                               message.peerInfo->sctpParams->myIP.c_str(),
+//                               message.peerInfo->sctpParams->rmrPort,
+//                               xmlStr.c_str());
         rmrMsg->len = snprintf((char *)rmrMsg->payload, RECEIVE_SCTP_BUFFER_SIZE * 2, "%s:%d|%s",
                                message.peerInfo->sctpParams->myIP.c_str(),
                                message.peerInfo->sctpParams->rmrPort,
@@ -1271,6 +1284,67 @@ static void buildAndsendSetupRequest(ReportingMessages_t &message,
 
 }
 
+int RAN_Function_list_To_Vector(RANfunctions_List_t& list, vector <string> &runFunXML_v) {
+    auto index = 0;
+    runFunXML_v.clear();
+    for (auto j = 0; j < list.list.count; j++) {
+        auto *raNfunctionItemIEs = (RANfunction_ItemIEs_t *)list.list.array[j];
+        if (raNfunctionItemIEs->id == ProtocolIE_ID_id_RANfunction_Item &&
+            (raNfunctionItemIEs->value.present == RANfunction_ItemIEs__value_PR_RANfunction_Item)) {
+            // encode to xml
+            E2SM_gNB_NRT_RANfunction_Definition_t *ranFunDef = nullptr;
+            auto rval = asn_decode(nullptr, ATS_ALIGNED_BASIC_PER,
+                                   &asn_DEF_E2SM_gNB_NRT_RANfunction_Definition,
+                                   (void **)&ranFunDef,
+                                   raNfunctionItemIEs->value.choice.RANfunction_Item.ranFunctionDefinition.buf,
+                                   raNfunctionItemIEs->value.choice.RANfunction_Item.ranFunctionDefinition.size);
+            if (rval.code != RC_OK) {
+                mdclog_write(MDCLOG_ERR, "Error %d Decoding (unpack) E2SM message from : %s",
+                             rval.code,
+                             asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name);
+                return -1;
+            }
+
+//                        if (mdclog_level_get() >= MDCLOG_DEBUG) {
+//                            char *printBuffer;
+//                            size_t size;
+//                            FILE *stream = open_memstream(&printBuffer, &size);
+//                            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];
+            // encode to xml
+            auto er = asn_encode_to_buffer(nullptr,
+                                           ATS_BASIC_XER,
+                                           &asn_DEF_E2SM_gNB_NRT_RANfunction_Definition,
+                                           ranFunDef,
+                                           xml_buffer,
+                                           xml_buffer_size);
+            if (er.encoded == -1) {
+                mdclog_write(MDCLOG_ERR, "encoding of %s failed, %s",
+                             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, at %s line %d",
+                             (int) xml_buffer_size,
+                             asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name, __func__, __LINE__);
+            } else {
+                if (mdclog_level_get() >= MDCLOG_DEBUG) {
+                    mdclog_write(MDCLOG_DEBUG, "Encoding E2SM %s PDU number %d : %s",
+                                 asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name,
+                                 index++,
+                                 xml_buffer);
+                }
+                string runFuncs = (char *)(xml_buffer);
+                runFunXML_v.emplace_back(runFuncs);
+            }
+        }
+    }
+    return 0;
+}
 
 
 
@@ -1278,7 +1352,6 @@ int collectSetupRequestData(E2AP_PDU_t *pdu,
                             Sctp_Map_t *sctpMap,
                             ReportingMessages_t &message,
                             vector <string> &runFunDEFXML_v) {
-    auto index = 0;
     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];
@@ -1298,66 +1371,11 @@ int collectSetupRequestData(E2AP_PDU_t *pdu,
         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 and size %d",
-                                 ie->value.choice.RANfunctions_List.list.count,
-                                 ie->value.choice.RANfunctions_List.list.size);
+                    mdclog_write(MDCLOG_DEBUG, "Run function list have %d entries",
+                                 ie->value.choice.RANfunctions_List.list.count);
                 }
-                for (auto j = 0; j < ie->value.choice.RANfunctions_List.list.count; j++) {
-                    auto *raNfunctionItemIEs = (RANfunction_ItemIEs_t *)ie->value.choice.RANfunctions_List.list.array[j];
-                    if (raNfunctionItemIEs->id == ProtocolIE_ID_id_RANfunction_Item &&
-                        (raNfunctionItemIEs->value.present == RANfunction_ItemIEs__value_PR_RANfunction_Item)) {
-                        // encode to xml
-                        E2SM_gNB_NRT_RANfunction_Definition_t *ranFunDef = nullptr;
-                        auto rval = asn_decode(nullptr, ATS_ALIGNED_BASIC_PER,
-                                               &asn_DEF_E2SM_gNB_NRT_RANfunction_Definition,
-                                               (void **)&ranFunDef,
-                                               raNfunctionItemIEs->value.choice.RANfunction_Item.ranFunctionDefinition.buf,
-                                               raNfunctionItemIEs->value.choice.RANfunction_Item.ranFunctionDefinition.size);
-                        if (rval.code != RC_OK) {
-                            mdclog_write(MDCLOG_ERR, "Error %d Decoding (unpack) E2SM message from : %s",
-                                         rval.code,
-                                         asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name);
-                            return -1;
-                        }
-
-//                        if (mdclog_level_get() >= MDCLOG_DEBUG) {
-//                            char *printBuffer;
-//                            size_t size;
-//                            FILE *stream = open_memstream(&printBuffer, &size);
-//                            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];
-                        // encode to xml
-                        auto er = asn_encode_to_buffer(nullptr,
-                                                  ATS_BASIC_XER,
-                                                  &asn_DEF_E2SM_gNB_NRT_RANfunction_Definition,
-                                                  ranFunDef,
-                                                  xml_buffer,
-                                                  xml_buffer_size);
-                        if (er.encoded == -1) {
-                            mdclog_write(MDCLOG_ERR, "encoding of %s failed, %s",
-                                         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, at %s line %d",
-                                         (int) xml_buffer_size,
-                                         asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name, __func__, __LINE__);
-                        } else {
-                            if (mdclog_level_get() >= MDCLOG_DEBUG) {
-                                mdclog_write(MDCLOG_DEBUG, "Encoding E2SM %s PDU number %d : %s",
-                                             asn_DEF_E2SM_gNB_NRT_RANfunction_Definition.name,
-                                             index++,
-                                             xml_buffer);
-                            }
-                            string runFuncs = (char *)(xml_buffer);
-                            runFunDEFXML_v.emplace_back(runFuncs);
-                        }
-
-                    }
+                if (RAN_Function_list_To_Vector(ie->value.choice.RANfunctions_List, runFunDEFXML_v) != 0 ) {
+                    return -1;
                 }
             }
         }
@@ -1386,37 +1404,43 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu,
     switch (procedureCode) {
         case ProcedureCode_id_E2setup: {
             if (logLevel >= MDCLOG_DEBUG) {
-                mdclog_write(MDCLOG_DEBUG, "Got E2setup\n");
+                mdclog_write(MDCLOG_DEBUG, "Got E2setup");
             }
 
             // first get the message as XML buffer
             auto setup_xml_buffer_size = RECEIVE_SCTP_BUFFER_SIZE * 2;
             unsigned char setup_xml_buffer[RECEIVE_SCTP_BUFFER_SIZE * 2];
-            //unsigned char *tmp_buff_cursor = setup_xml_buffer;
 
             auto er = asn_encode_to_buffer(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, pdu, setup_xml_buffer, setup_xml_buffer_size);
             if (er.encoded == -1) {
                 mdclog_write(MDCLOG_ERR, "encoding of %s failed, %s", asn_DEF_E2AP_PDU.name, strerror(errno));
+                break;
             } else if (er.encoded > (ssize_t) setup_xml_buffer_size) {
                 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, __func__, __LINE__);
+                break;
             }
             std::string xmlString(setup_xml_buffer_size,  setup_xml_buffer_size + er.encoded);
 
             vector <string> runFunDEFXML_v;
             runFunDEFXML_v.clear();
-
-            auto ret = collectSetupRequestData(pdu, sctpMap,  message, runFunDEFXML_v);
-            if (ret != 0) {
+            if (collectSetupRequestData(pdu, sctpMap,  message, runFunDEFXML_v) != 0) {
                 break;
             }
 
-            //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, runFunDEFXML_v);
             break;
         }
+        case ProcedureCode_id_RICserviceUpdate: {
+            if (logLevel >= MDCLOG_DEBUG) {
+                mdclog_write(MDCLOG_DEBUG, "Got RICserviceUpdate %s", message.message.enodbName);
+            }
+            if (sendRequestToXapp(message, RIC_SERVICE_UPDATE, rmrMessageBuffer) != 0) {
+                mdclog_write(MDCLOG_ERR, "RIC_SERVICE_UPDATE message failed to send to xAPP");
+            }
+            break;
+        }
         case ProcedureCode_id_ErrorIndication: {
             if (logLevel >= MDCLOG_DEBUG) {
                 mdclog_write(MDCLOG_DEBUG, "Got ErrorIndication %s", message.message.enodbName);
@@ -1492,15 +1516,6 @@ void asnInitiatingRequest(E2AP_PDU_t *pdu,
             }
             break;
         }
-        case ProcedureCode_id_RICserviceUpdate: {
-            if (logLevel >= MDCLOG_DEBUG) {
-                mdclog_write(MDCLOG_DEBUG, "Got RICserviceUpdate %s", message.message.enodbName);
-            }
-            if (sendRequestToXapp(message, RIC_SERVICE_UPDATE, rmrMessageBuffer) != 0) {
-                mdclog_write(MDCLOG_ERR, "RIC_SERVICE_UPDATE message failed to send to xAPP");
-            }
-            break;
-        }
         case ProcedureCode_id_RICsubscription: {
             if (logLevel >= MDCLOG_DEBUG) {
                 mdclog_write(MDCLOG_DEBUG, "Got RICsubscription %s", message.message.enodbName);
@@ -1582,7 +1597,9 @@ void asnSuccsesfulMsg(E2AP_PDU_t *pdu,
                     if (ie->value.present == RICcontrolAcknowledge_IEs__value_PR_RICrequestID) {
                         message.message.messageType = rmrMessageBuffer.sendMessage->mtype = RIC_CONTROL_ACK;
                         rmrMessageBuffer.sendMessage->state = 0;
-                        rmrMessageBuffer.sendMessage->sub_id = (int) ie->value.choice.RICrequestID.ricRequestorID;
+//                        rmrMessageBuffer.sendMessage->sub_id = (int) ie->value.choice.RICrequestID.ricRequestorID;
+                        rmrMessageBuffer.sendMessage->sub_id = (int)ie->value.choice.RICrequestID.ricInstanceID;
+
                         static unsigned char tx[32];
                         snprintf((char *) tx, sizeof tx, "%15ld", transactionCounter++);
                         rmr_bytes2xact(rmrMessageBuffer.sendMessage, tx, strlen((const char *) tx));
@@ -1626,7 +1643,8 @@ 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.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",
                                          rmrMessageBuffer.sendMessage->sub_id,
@@ -1745,7 +1763,8 @@ void asnUnSuccsesfulMsg(E2AP_PDU_t *pdu,
                     if (ie->value.present == RICcontrolFailure_IEs__value_PR_RICrequestID) {
                         message.message.messageType = rmrMessageBuffer.sendMessage->mtype = RIC_CONTROL_FAILURE;
                         rmrMessageBuffer.sendMessage->state = 0;
-                        rmrMessageBuffer.sendMessage->sub_id = (int) ie->value.choice.RICrequestID.ricRequestorID;
+//                        rmrMessageBuffer.sendMessage->sub_id = (int)ie->value.choice.RICrequestID.ricRequestorID;
+                        rmrMessageBuffer.sendMessage->sub_id = (int)ie->value.choice.RICrequestID.ricInstanceID;
                         static unsigned char tx[32];
                         snprintf((char *) tx, sizeof tx, "%15ld", transactionCounter++);
                         rmr_bytes2xact(rmrMessageBuffer.sendMessage, tx, strlen((const char *) tx));
@@ -1786,7 +1805,8 @@ void asnUnSuccsesfulMsg(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.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",
                                          rmrMessageBuffer.sendMessage->sub_id,
@@ -1915,7 +1935,7 @@ void getRmrContext(sctp_params_t &pSctpParams) {
     }
 }
 
-int BuildPERSetupResponseMessaeFromXML(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuffer) {
+int PER_FromXML(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuffer) {
     E2AP_PDU_t *pdu;
 
     if (mdclog_level_get() >= MDCLOG_DEBUG) {
@@ -1987,7 +2007,7 @@ int receiveXappMessages(Sctp_Map_t *sctpMap,
     rmr_get_meid(rmrMessageBuffer.rcvMessage, (unsigned char *)message.message.enodbName);
     switch (rmrMessageBuffer.rcvMessage->mtype) {
         case RIC_E2_SETUP_RESP : {
-            if (BuildPERSetupResponseMessaeFromXML(message, rmrMessageBuffer) != 0) {
+            if (PER_FromXML(message, rmrMessageBuffer) != 0) {
                 break;
             }
 
@@ -1998,7 +2018,7 @@ int receiveXappMessages(Sctp_Map_t *sctpMap,
             break;
         }
         case RIC_E2_SETUP_FAILURE : {
-            if (BuildPERSetupResponseMessaeFromXML(message, rmrMessageBuffer) != 0) {
+            if (PER_FromXML(message, rmrMessageBuffer) != 0) {
                 break;
             }
             if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) {
@@ -2036,6 +2056,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap,
             break;
         }
         case RIC_SERVICE_QUERY: {
+            if (PER_FromXML(message, rmrMessageBuffer) != 0) {
+                break;
+            }
             if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) {
                 mdclog_write(MDCLOG_ERR, "Failed to send RIC_SERVICE_QUERY");
                 return -6;
@@ -2043,6 +2066,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap,
             break;
         }
         case RIC_SERVICE_UPDATE_ACK: {
+            if (PER_FromXML(message, rmrMessageBuffer) != 0) {
+                break;
+            }
             if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) {
                 mdclog_write(MDCLOG_ERR, "Failed to send RIC_SERVICE_UPDATE_ACK");
                 return -6;
@@ -2050,6 +2076,9 @@ int receiveXappMessages(Sctp_Map_t *sctpMap,
             break;
         }
         case RIC_SERVICE_UPDATE_FAILURE: {
+            if (PER_FromXML(message, rmrMessageBuffer) != 0) {
+                break;
+            }
             if (sendDirectionalSctpMsg(rmrMessageBuffer, message, 0, sctpMap) != 0) {
                 mdclog_write(MDCLOG_ERR, "Failed to send RIC_SERVICE_UPDATE_FAILURE");
                 return -6;