+bool getE2tProcedureOngoingStatus(char *enbName, E2NodeConnectionHandling &e2NodeConnectionHandling)
+{
+ mdclog_write(MDCLOG_DEBUG, "Inside getE2tProcedureOngoingStatus, Checking for enb %s", enbName);
+ if(strcmp(enbName, "") == 0)
+ {
+ mdclog_write(MDCLOG_DEBUG, "enbName is empty");
+ return false;
+ }
+ else if(connectionHandlingPerE2NodeMap.empty())
+ {
+ mdclog_write(MDCLOG_DEBUG, "connectionHandlingPerE2Node map is empty");
+ return false;
+ }
+ else
+ {
+ std::map<std::string, E2NodeConnectionHandling>::iterator itr = connectionHandlingPerE2NodeMap.begin();
+ while (itr != connectionHandlingPerE2NodeMap.end())
+ {
+ int result = itr->first.compare(enbName);
+ if (result == 0)
+ {
+ mdclog_write(MDCLOG_DEBUG, "enb name in map :%s, status :%d", itr->first.c_str(), itr->second.e2tProcedureOngoingStatus);
+ e2NodeConnectionHandling = itr->second;
+ return true;
+ break;
+ }
+ ++itr;
+ }
+ }
+ return false;
+}
+
+void setE2ProcedureOngoingStatus(char *enbName, E2T_Procedure_States state)
+{
+ printEntryPresentInMap();
+ if(connectionHandlingPerE2NodeMap.empty())
+ {
+ mdclog_write(MDCLOG_DEBUG, "connectionHandlingPerE2Node map is empty");
+ return;
+ }
+ else
+ {
+ mdclog_write(MDCLOG_DEBUG, "Entry Present in connectionHandlingPerE2NodeMap Map");
+ std::map<std::string, E2NodeConnectionHandling>::iterator itr = connectionHandlingPerE2NodeMap.begin();
+ while(itr != connectionHandlingPerE2NodeMap.end())
+ {
+ int result = itr->first.compare(enbName);
+ if (result == 0)
+ {
+ mdclog_write(MDCLOG_DEBUG, "Key %s Found in connectionHandlingPerE2NodeMap Map, Current Procedure is %d", enbName, itr->second.e2tProcedureOngoingStatus);
+ itr->second.e2tProcedureOngoingStatus = state;
+ mdclog_write(MDCLOG_DEBUG, "Current procedure updated to %d", itr->second.e2tProcedureOngoingStatus);
+ break;
+ }
+ ++itr;
+ }
+ }
+}
+
+void insertE2SetupProcedureOngoing(char *enbName, long &transactionID)
+{
+ struct E2NodeConnectionHandling e2NodeConnectionHandling;
+ e2NodeConnectionHandling.e2tProcedureOngoingStatus = E2_SETUP_PROCEDURE_ONGOING;
+ e2NodeConnectionHandling.e2SetupProcedureTransactionId = transactionID;
+
+ std::string key(enbName);
+ printEntryPresentInMap();
+ if(connectionHandlingPerE2NodeMap.empty())
+ {
+ mdclog_write(MDCLOG_DEBUG, "connectionHandlingPerE2Node map is empty");
+ mdclog_write(MDCLOG_DEBUG, "Inserting %s to connectionHandlingPerE2NodeMap Map", enbName);
+
+ connectionHandlingPerE2NodeMap.insert(std::make_pair(key, e2NodeConnectionHandling));
+
+ mdclog_write(MDCLOG_DEBUG, "Default Value after Inserting Key for %s - Value is {e2tProcedureOngoingStatus is %d, e2SetupProcedureTransactionId: %ld}",
+ key.c_str(),
+ e2NodeConnectionHandling.e2tProcedureOngoingStatus,
+ e2NodeConnectionHandling.e2SetupProcedureTransactionId);
+ return;
+ }
+ else
+ {
+ mdclog_write(MDCLOG_DEBUG, "Entry Present in connectionHandlingPerE2NodeMap Map");
+ std::map<std::string, E2NodeConnectionHandling>::iterator itr = connectionHandlingPerE2NodeMap.begin();
+ bool enodebNameFound = false;
+ while(itr != connectionHandlingPerE2NodeMap.end())
+ {
+ int result = itr->first.compare(enbName);
+ if (result == 0)
+ {
+ enodebNameFound = true;
+ break;
+ }
+ ++itr;
+ }
+ if (enodebNameFound == false)
+ {
+ mdclog_write(MDCLOG_DEBUG, "Inserting %s to connectionHandlingPerE2NodeMap Map", enbName);
+ connectionHandlingPerE2NodeMap.insert(std::make_pair(key, e2NodeConnectionHandling));
+
+ mdclog_write(MDCLOG_DEBUG, "Default Value after Inserting Key for %s - Value is {e2tProcedureOngoingStatus is %d, e2SetupProcedureTransactionId: %ld}",
+ key.c_str(),
+ e2NodeConnectionHandling.e2tProcedureOngoingStatus,
+ e2NodeConnectionHandling.e2SetupProcedureTransactionId);
+ }
+ else
+ {
+ mdclog_write(MDCLOG_DEBUG, "Processing E2Setup Req received for same gnb - %s", enbName);
+ setE2ProcedureOngoingStatus(enbName, E2_SETUP_PROCEDURE_ONGOING);
+ }
+ }
+}
+
+E2T_Procedure_States currentE2tProcedureOngoingStatus(char *enbName)
+{
+ printEntryPresentInMap();
+ if(connectionHandlingPerE2NodeMap.empty())
+ {
+ mdclog_write(MDCLOG_DEBUG, "connectionHandlingPerE2Node map is empty");
+ return E2_SETUP_PROCEDURE_NOT_INITIATED;
+ }
+ else
+ {
+ mdclog_write(MDCLOG_DEBUG, "Entry Present in connectionHandlingPerE2NodeMap Map");
+ std::map<std::string, E2NodeConnectionHandling>::iterator itr = connectionHandlingPerE2NodeMap.begin();
+ while(itr != connectionHandlingPerE2NodeMap.end())
+ {
+ int result = itr->first.compare(enbName);
+ if (result == 0)
+ {
+ mdclog_write(MDCLOG_DEBUG, "Key %s Found in connectionHandlingPerE2NodeMap Map, Current Procedure is %d", enbName, itr->second.e2tProcedureOngoingStatus);
+ mdclog_write(MDCLOG_DEBUG, "%s Entry has found", enbName);
+ return itr->second.e2tProcedureOngoingStatus;
+ }
+ ++itr;
+ }
+ mdclog_write(MDCLOG_DEBUG, "No Key %s Found in connectionHandlingPerE2NodeMap Map", enbName);
+ return E2_SETUP_PROCEDURE_NOT_INITIATED;
+ }
+}
+
+bitset<sendMsgMaxBitPosition> getSendMsgBitSetValue(int procedureCode, bitset<requiredIePresentMaxBitSetPosition> isRequiredIesPresent, char* enbName)
+{
+ bitset<sendMsgMaxBitPosition> sendMsgTo(0); // Msg being sent to E2M = 0, Msg being sent to SubMgr = 1
+ switch(procedureCode)
+ {
+ case numberZero:
+ {
+ E2T_Procedure_States currentProcedureOngoing = currentE2tProcedureOngoingStatus(enbName);
+ if ((currentProcedureOngoing == E2_SETUP_PROCEDURE_COMPLETED ||
+ currentProcedureOngoing == RIC_SERVICE_UPDATE_PROCEDURE_ONGOING) &&
+ (isRequiredIesPresent.test(transactionIdIeBitSetPosition)))
+ {
+ sendMsgTo.set(sendMsgToE2MBitSetPosition);
+ }
+ else if ((currentProcedureOngoing == RIC_SUBS_PROCEDURE_ONGOING) &&
+ isRequiredIesPresent.test(ricRequestIdIeBitSetPosition) && isRequiredIesPresent.test(causeIeBitSetPosition))
+ {
+ sendMsgTo.set(sendMsgToSubMgrBitSetPosition);
+ }
+ break;
+ }
+ case ProcedureCode_id_E2setup:
+ case ProcedureCode_id_RICserviceUpdate:
+ {
+ if(isRequiredIesPresent.test(transactionIdIeBitSetPosition))
+ {
+ sendMsgTo.set(sendMsgToE2MBitSetPosition);
+ }
+ break;
+
+ }
+ case ProcedureCode_id_RICsubscription:
+ {
+ if(isRequiredIesPresent.test(ricRequestIdIeBitSetPosition) && isRequiredIesPresent.test(causeIeBitSetPosition))
+ {
+ sendMsgTo.set(sendMsgToSubMgrBitSetPosition);
+ }
+ break;
+ }
+ default:
+ {
+ mdclog_write(MDCLOG_ERR, "Invalid procedure code received");
+ }
+ }
+ return sendMsgTo;
+}
+
+void printEntryPresentInMap()
+{
+ mdclog_write(MDCLOG_DEBUG, "Inside printEntryPresentInMap");
+ if(connectionHandlingPerE2NodeMap.empty())
+ {
+ mdclog_write(MDCLOG_DEBUG, "connectionHandlingPerE2Node map is empty");
+ return;
+ }
+ else
+ {
+ mdclog_write(MDCLOG_DEBUG, "Entry Present in Map");
+ std::map<std::string, E2NodeConnectionHandling>::iterator it = connectionHandlingPerE2NodeMap.begin();
+ while (it != connectionHandlingPerE2NodeMap.end())
+ {
+ mdclog_write(MDCLOG_DEBUG, "Key -> { enb name in map : %s }, Value -> { e2tProcedureOngoingStatus is %d, e2SetupProcedureTransactionId is %ld }", it->first.c_str(), it->second.e2tProcedureOngoingStatus, it->second.e2SetupProcedureTransactionId);
+ ++it;
+ }
+ mdclog_write(MDCLOG_DEBUG, "All entries currently present in connectionHandlingPerE2NodeMap are printed successfully");
+ }
+}
+
+void handleE2SetupReq(ReportingMessages_t &message, RmrMessagesBuffer_t &rmrMessageBuffer, E2AP_PDU_t *pdu, long &transactionID, int streamId, Sctp_Map_t *sctpMap)
+{
+ auto logLevel = mdclog_level_get();
+
+ #ifndef UNIT_TEST
+ buildPrometheusList(message.peerInfo, message.peerInfo->sctpParams->prometheusFamily);
+ buildInternalCounterPrometheusList(message.peerInfo, message.peerInfo->sctpParams->prometheusFamily);
+ #endif
+
+ struct sctp_status status;
+ int stat_size = sizeof(status);
+ getsockopt( message.peerInfo->fileDescriptor, SOL_SCTP, SCTP_STATUS,(void *)&status, (socklen_t *)&stat_size );
+
+ if (logLevel >= MDCLOG_DEBUG) {
+ mdclog_write(MDCLOG_DEBUG, "Start from SCTP %d fd", message.peerInfo->fileDescriptor);
+ mdclog_write(MDCLOG_DEBUG, "SCTP status assoc id %d instrms %d outstrms %d", status.sstat_assoc_id,
+ status.sstat_instrms, status.sstat_outstrms);
+ }
+ if(status.sstat_outstrms == numberOne || status.sstat_instrms == numberOne)
+ {
+ message.peerInfo->isSingleStream = true;
+ message.peerInfo->singleStreamId = streamId;
+ if (status.sstat_outstrms == numberOne && status.sstat_instrms == numberOne){
+ if (logLevel >= MDCLOG_DEBUG) {
+ mdclog_write(MDCLOG_DEBUG, "Single SCTP stream is used for sending from now on, assoc id %d streamId %d #instrms %d #outstrms %d, %s",status.sstat_assoc_id, streamId, status.sstat_instrms, status.sstat_outstrms, __FUNCTION__);
+ }
+ }
+ else {
+ mdclog_write(MDCLOG_ERR, "Single SCTP stream used for sending messages even if there is a mismatch in number of in & out streams, assoc id %d instrms %d outstrms %d", status.sstat_assoc_id,
+ status.sstat_instrms, status.sstat_outstrms);
+ }
+ }
+
+ string messageName("E2setupRequest");
+ string ieName("E2setupRequestIEs");
+ message.message.messageType = RIC_E2_SETUP_REQ;
+ #ifndef UNIT_TEST
+ message.peerInfo->counters[IN_INITI][MSG_COUNTER][ProcedureCode_id_E2setup]->Increment();
+ message.peerInfo->counters[IN_INITI][BYTES_COUNTER][ProcedureCode_id_E2setup]->Increment((double)message.message.asnLength);
+
+ buildAndSendSetupRequest(message, rmrMessageBuffer, pdu); //UT - Segmentation Fault Happening.
+ #endif
+
+ mdclog_write(MDCLOG_DEBUG, "Called insertE2ProcedureOngoing: EnbName is %s and transactionID is %ld", message.message.enodbName, transactionID);
+ insertE2SetupProcedureOngoing(message.message.enodbName, transactionID);
+}
+