1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
18 #include "common_def.h"
24 #include "du_app_mac_inf.h"
25 #include "du_app_rlc_inf.h"
26 #include "du_e2ap_mgr.h"
27 #include "du_e2ap_msg_hdl.h"
30 #include "du_mgr_main.h"
32 #include "GlobalE2node-gNB-ID.h"
33 #include "ProtocolIE-FieldE2.h"
34 #include "E2setupRequest.h"
35 #include "InitiatingMessageE2.h"
36 #include "SuccessfulOutcomeE2.h"
37 #include "UnsuccessfulOutcomeE2.h"
39 #include "odu_common_codec.h"
40 #include "E2nodeComponentInterfaceF1.h"
41 #include "E2setupRequest.h"
42 #include "du_e2_conversions.h"
43 #include "E2SM-KPM-RANfunction-Description.h"
44 #include "RANfunction-Name.h"
45 #include "RIC-EventTriggerStyle-Item.h"
46 #include "RIC-ReportStyle-Item.h"
47 #include "MeasurementInfo-Action-Item.h"
48 #include "E2SM-KPM-EventTriggerDefinition.h"
49 #include "E2SM-KPM-EventTriggerDefinition-Format1.h"
50 #include "E2SM-KPM-ActionDefinition.h"
51 #include "E2SM-KPM-ActionDefinition-Format1.h"
52 #include "MeasurementInfoItem.h"
53 #include "RANfunctionsIDcause-List.h"
54 #include "MeasurementRecord.h"
55 #include "MeasurementData.h"
56 #include "MeasurementRecordItem.h"
57 #include "MeasurementDataItem.h"
58 #include "E2SM-KPM-IndicationMessage-Format1.h"
59 #include "E2SM-KPM-IndicationMessage.h"
60 #include "E2SM-KPM-IndicationHeader.h"
61 #include "E2SM-KPM-IndicationHeader-Format1.h"
62 #include "LabelInfoItem.h"
64 /*******************************************************************
66 * @brief Fill E2 Failure Cause
70 * Function : fillE2Cause
72 * Functionality: Fill E2 Failure Cause
74 * @params[in] E2 Cause pointer to be filled in
75 * E2 Cause to be filled from
78 ******************************************************************/
79 void fillE2Cause(CauseE2_t *e2Cause, E2FailureCause failureCause)
81 e2Cause->present = failureCause.causeType;
82 switch(e2Cause->present)
84 case CauseE2_PR_ricRequest:
86 e2Cause->choice.ricRequest = failureCause.cause;
89 case CauseE2_PR_ricService:
91 e2Cause->choice.ricService = failureCause.cause;
94 case CauseE2_PR_e2Node:
96 e2Cause->choice.e2Node = failureCause.cause;
99 case CauseE2_PR_transport:
101 e2Cause->choice.transport = failureCause.cause;
104 case CauseE2_PR_protocol:
106 e2Cause->choice.protocol = failureCause.cause;
109 case CauseE2_PR_misc:
111 e2Cause->choice.misc = failureCause.cause;
114 case CauseE2_PR_NOTHING:
120 /*******************************************************************
122 * @brief Printing Type and Cause of failure
126 * Function : printE2ErrorCause
128 * Functionality: Printing Type and Cause of failure
130 * @params[in] E2 Cause
133 ******************************************************************/
134 void printE2ErrorCause(CauseE2_t *cause)
136 switch(cause->present)
138 case CauseE2_PR_ricRequest:
140 DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Request", cause->choice.ricRequest);
143 case CauseE2_PR_ricService:
145 DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Service", cause->choice.ricService);
148 case CauseE2_PR_e2Node:
150 DU_LOG("Failure_Type [%s] Cause [%ld]", "E2_Node", cause->choice.e2Node);
153 case CauseE2_PR_transport:
155 DU_LOG("Failure_Type [%s] Cause [%ld]", "Transport", cause->choice.transport);
158 case CauseE2_PR_protocol:
160 DU_LOG("Failure_Type [%s] Cause [%ld]", "Protocol", cause->choice.protocol);
163 case CauseE2_PR_misc:
165 DU_LOG("Failure_Type [%s] Cause [%ld]", "Miscellaneous", cause->choice.misc);
170 DU_LOG("Failure_Type and Cause unknown");
176 /*******************************************************************
178 * @brief Free the ErrorIndication Message
182 * Function : FreeRicIndication
184 * Functionality: Free the ErrorIndication Message
187 * E2AP_PDU is to freed
190 ******************************************************************/
191 void FreeErrorIndication(E2AP_PDU_t *e2apMsg)
194 ErrorIndicationE2_t *errorIndicationMsg= NULLP;
198 if(e2apMsg->choice.initiatingMessage != NULLP)
200 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
201 if(errorIndicationMsg!= NULLP)
203 if(errorIndicationMsg->protocolIEs.list.array != NULLP)
205 for(arrIdx=0; arrIdx<errorIndicationMsg->protocolIEs.list.count; arrIdx++)
207 DU_FREE(errorIndicationMsg->protocolIEs.list.array[arrIdx],sizeof(ErrorIndicationE2_t));
209 DU_FREE(errorIndicationMsg->protocolIEs.list.array,errorIndicationMsg->protocolIEs.list.size);
212 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
214 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
218 /*******************************************************************
220 * @brief Builds and Send the ErrorIndication Message
224 * Function : BuildAndSendErrorIndication
226 * Functionality:Fills the ErrorIndication Message
233 * @return ROK - success
236 ******************************************************************/
238 uint8_t BuildAndSendErrorIndication(int8_t transId, RicRequestId requestId, uint16_t ranFuncId, E2FailureCause failureCause)
240 uint8_t elementCnt =0, arrIdx=0, ret = RFAILED;
241 E2AP_PDU_t *e2apMsg = NULLP;
242 ErrorIndicationE2_t *errorIndicationMsg=NULLP;
243 asn_enc_rval_t encRetVal; /* Encoder return value */
247 DU_LOG("\nINFO --> E2AP : Building Error Indication Message\n");
249 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
252 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
256 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
257 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
258 if(e2apMsg->choice.initiatingMessage == NULLP)
260 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
263 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_ErrorIndicationE2;
264 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
265 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ErrorIndicationE2;
267 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
269 /* Element count is 2 for TransactionID/RICrequestID and Cause.
270 * If the RAN function id is present, the count will be increased.*/
277 errorIndicationMsg->protocolIEs.list.count = elementCnt;
278 errorIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(ErrorIndicationE2_IEs_t*);
280 /* Initialize the E2Setup members */
281 DU_ALLOC(errorIndicationMsg->protocolIEs.list.array, errorIndicationMsg->protocolIEs.list.size);
282 if(errorIndicationMsg->protocolIEs.list.array == NULLP)
284 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements in %s at line %d",__func__, __LINE__);
288 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
290 DU_ALLOC(errorIndicationMsg->protocolIEs.list.array[arrIdx], sizeof(ErrorIndicationE2_IEs_t));
291 if(errorIndicationMsg->protocolIEs.list.array[arrIdx] == NULLP)
293 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array [%d] elements in %s at line %d", arrIdx, __func__, __LINE__);
297 if(arrIdx < elementCnt)
302 if(transId >=0 && transId<=255)
305 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
306 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
307 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_TransactionID;
308 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
313 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RICrequestID;
314 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
315 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RICrequestID;
316 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricRequestorID = requestId.requestorId;
317 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricInstanceID = requestId.instanceId;
322 /* RAN Function ID */
324 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionID;
325 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
326 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RANfunctionID;
327 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionID = ranFuncId;
332 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
333 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
334 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
335 fillE2Cause(&errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, failureCause);
337 /* Prints the Msg formed */
338 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
339 memset(encBuf, 0, ENC_BUF_MAX_LEN);
341 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
343 if(encRetVal.encoded == ENCODE_FAIL)
345 DU_LOG("\nERROR --> E2AP : Could not encode Error Indication Message (at %s)\n",\
346 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
351 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for Error Indication Message \n");
352 #ifdef DEBUG_ASN_PRINT
353 for(int i=0; i< encBufSize; i++)
355 printf("%x",encBuf[i]);
360 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
362 DU_LOG("\nINFO --> E2AP : Sending Error Indication Message");
368 FreeErrorIndication(e2apMsg);
372 /******************************************************************
374 * @brief Deallocation of memory allocated by aper decoder for e2
375 * Config Update Failure
379 * Function : freeAperDecodingOfE2Node Config UpdateFailure
381 * Functionality: Deallocation of memory allocated by aper decoder
382 * for e2 Config Update Failure
384 * @params[in] E2nodeConfigurationUpdateFailure_t to be deallocated
387 * ****************************************************************/
389 void freeAperDecodingOfE2NodeConfigUpdateFailure(E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail)
395 if(e2NodeCfgUpdFail->protocolIEs.list.array)
397 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
399 if(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx])
401 free(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]);
404 free(e2NodeCfgUpdFail->protocolIEs.list.array);
409 /******************************************************************
411 * @brief Processes E2 Node Config Update Failure sent by RIC
415 * Function : procE2NodeConfigUpdateFailure
417 * Functionality: Processes E2 Node Config Update failure sent by RIC
419 * @params[in] E2AP_PDU_t ASN decoded E2AP message
420 * @return ROK - success
423 * ****************************************************************/
425 void procE2NodeConfigUpdateFailure(E2AP_PDU_t *e2apMsg)
427 uint8_t arrIdx =0, transId =0, timerValue=0;
428 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail=NULL;
430 DU_LOG("\nINFO --> E2AP : E2 Node Config Update failure received");
431 e2NodeCfgUpdFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
433 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
435 switch(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]->id)
437 case ProtocolIE_IDE2_id_TransactionID:
439 transId = e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
440 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
441 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
443 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
447 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
451 case ProtocolIE_IDE2_id_TimeToWaitE2:
453 timerValue = convertE2WaitTimerEnumToValue(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
454 if((duChkTmr((PTR)&(duCb.e2apDb), EVENT_E2_NODE_CONFIG_UPDATE_TMR)) == FALSE)
456 duStartTmr((PTR)&(duCb.e2apDb), EVENT_E2_NODE_CONFIG_UPDATE_TMR, timerValue);
460 DU_LOG("\nERROR --> E2AP : EVENT_E2_NODE_CONFIG_UPDATE_TMR timer is already running");
467 freeAperDecodingOfE2NodeConfigUpdateFailure(e2NodeCfgUpdFail);
470 /*******************************************************************
472 * @brief Builds Global gNodeB Params
476 * Function : BuildGlobalgNBId
478 * Functionality: Building the Plmn and gNB id
480 * @params[in] GlobalE2node_gNB_ID_t *gNbId
481 * @return ROK - success
484 ******************************************************************/
486 uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId)
489 uint8_t byteSize = 4;
490 uint8_t gnbId = duCb.gnbId;
493 /* fill Global gNB ID Id */
494 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(uint8_t);
495 gNbId->global_gNB_ID.plmn_id.buf = NULLP;
496 DU_ALLOC(gNbId->global_gNB_ID.plmn_id.buf , gNbId->global_gNB_ID.plmn_id.size);
497 if(gNbId->global_gNB_ID.plmn_id.buf == NULLP)
499 DU_LOG("\nERROR --> E2AP: Memory allocation failed for Plmn buffer");
504 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
505 gNbId->global_gNB_ID.plmn_id.buf);
506 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
507 /* Allocate Buffer size */
508 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size = byteSize * sizeof(uint8_t);
509 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf = NULLP;
510 DU_ALLOC(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf, \
511 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
512 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf == NULLP)
514 DU_LOG("\nERROR --> E2AP: Memory allocation failed for gnb buffer");
519 fillBitString(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, gnbId);
524 DU_ALLOC( gNbId->gNB_DU_ID, sizeof(GNB_DU_ID_t));
525 if(gNbId->gNB_DU_ID == NULLP)
527 DU_LOG("\nERROR --> E2AP: Memory allocation failed for gNB_DU_ID ");
532 gNbId->gNB_DU_ID->size = sizeof(uint8_t);
533 DU_ALLOC( gNbId->gNB_DU_ID->buf, sizeof(uint8_t));
534 if(gNbId->gNB_DU_ID->buf)
536 gNbId->gNB_DU_ID->buf[0] =duCb.e2apDb.e2NodeId;
540 DU_LOG("\nERROR --> E2AP: Memory allocation failed for gNB_DU_ID buffer");
548 /*******************************************************************
550 * @brief fill the E2 node config information
554 * Function : fillE2NodeConfig
556 * Functionality: fill E2 node config information
559 * Pointer to e2NodeCfg to be filled
560 * E2 Node Component information
561 * Type of configuration
562 * @return ROK - success
565 ******************************************************************/
567 uint8_t fillE2NodeConfig(PTR e2NodeCfg, E2NodeComponent *e2NodeComponentInfo, ConfigType configType)
569 E2NodeConfig *e2NodeConfig=NULLP;
570 E2nodeComponentInterfaceType_t *interfaceType=NULLP;
571 E2nodeComponentID_t *componentID =NULLP;
572 E2nodeComponentConfiguration_t *configuration=NULLP;
573 E2nodeComponentConfigAddition_Item_t *e2NodeAddItem=NULL;
574 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULL;
575 E2nodeComponentConfigRemoval_Item_t *e2NodeRemovalItem=NULL;
581 e2NodeAddItem = (E2nodeComponentConfigAddition_Item_t*)e2NodeCfg;
582 interfaceType = &e2NodeAddItem->e2nodeComponentInterfaceType;
583 componentID = &e2NodeAddItem->e2nodeComponentID;
584 configuration = &e2NodeAddItem->e2nodeComponentConfiguration;
585 e2NodeConfig = e2NodeComponentInfo->addConfiguration;
590 e2NodeUpdateItem = (E2nodeComponentConfigUpdate_Item_t *) e2NodeCfg;
591 interfaceType = &e2NodeUpdateItem->e2nodeComponentInterfaceType;
592 componentID = &e2NodeUpdateItem->e2nodeComponentID;
593 configuration = &e2NodeUpdateItem->e2nodeComponentConfiguration;
594 e2NodeConfig = e2NodeComponentInfo->updateConfiguration;
599 e2NodeRemovalItem = (E2nodeComponentConfigRemoval_Item_t*) e2NodeCfg;
600 interfaceType = &e2NodeRemovalItem->e2nodeComponentInterfaceType;
601 componentID = &e2NodeRemovalItem->e2nodeComponentID;
606 DU_LOG("\nERROR --> E2AP : Configuration type %d does not supported ", configType);
610 /* E2nodeComponentInterfaceType */
611 *interfaceType = convertInterfaceToE2ComponentInterfaceType(e2NodeComponentInfo->interfaceType);
613 /* We now only support the F1 interface out of these interfaces
614 * (NG,XN,E1,F1,W1,S1,X2), therefore only the F1 component identifier was filled in. */
616 if(*interfaceType == F1)
618 /* E2 Node Component ID */
619 componentID->present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1;
620 DU_ALLOC(componentID->choice.e2nodeComponentInterfaceTypeF1,sizeof(E2nodeComponentInterfaceF1_t));
621 if(componentID->choice.e2nodeComponentInterfaceTypeF1 == NULLP)
623 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
626 componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t);
627 DU_ALLOC(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\
628 componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
630 if(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP)
632 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
635 memcpy(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, &e2NodeComponentInfo->componentId,\
636 componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
639 if(configType == CONFIG_DEL)
641 /* We don't need to fill out the E2 Node Component Request and Response
642 * information in the case of CONFIG_DEL, therefore returning ROK from here. */
646 /* E2 Node Component Request Part */
647 if(e2NodeConfig->componentRequestPart)
649 configuration->e2nodeComponentRequestPart.size = e2NodeConfig->reqBufSize ;
650 DU_ALLOC(configuration->e2nodeComponentRequestPart.buf,\
651 configuration->e2nodeComponentRequestPart.size);
652 if(configuration->e2nodeComponentRequestPart.buf == NULLP)
654 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
658 memcpy(configuration->e2nodeComponentRequestPart.buf,\
659 e2NodeConfig->componentRequestPart, configuration->\
660 e2nodeComponentRequestPart.size);
664 DU_LOG("\nERROR --> E2AP: componentRequestPart is null ");
668 /* E2 Node Component Response Part */
669 if(e2NodeConfig->componentResponsePart)
671 configuration->e2nodeComponentResponsePart.size = e2NodeConfig->rspBufSize;
672 DU_ALLOC(configuration->e2nodeComponentResponsePart.buf, configuration->e2nodeComponentResponsePart.size);
673 if(configuration->e2nodeComponentResponsePart.buf == NULLP)
675 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
678 memcpy(configuration->e2nodeComponentResponsePart.buf, e2NodeConfig->componentResponsePart, configuration->\
679 e2nodeComponentResponsePart.size);
683 DU_LOG("\nERROR --> E2AP: componentResponsePart is null");
690 /*******************************************************************
692 * @brief Builds E2 node config addition list
696 * Function : BuildE2NodeConfigAddList
698 * Functionality: Building E2 node config addition list
701 * E2nodeComponentConfigAddition_List_t to be filled
703 * Count of E2 node to be added in the list
704 * Received list of E2 node configuration
706 * @return ROK - success
709 ******************************************************************/
711 uint8_t BuildE2NodeConfigAddList(E2nodeComponentConfigAddition_List_t *e2NodeAddList, uint8_t procedureCode, uint16_t count, E2NodeConfigItem *e2NodeList)
715 E2NodeComponent *e2NodeComponentInfo=NULL;
716 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItemIe=NULL;
717 E2nodeComponentConfigAddition_Item_t *e2NodeAddItem=NULL;
720 /* For ProcedureCodeE2_id_E2setup, the number of E2 node configuration list items is
721 * equal to the number of E2 node configuration entries stored in the database.
722 * For any other procedure, the E2 node configuration list count is equal
723 * to the count of E2 node configuration obtained from the function's caller */
725 if(procedureCode == ProcedureCodeE2_id_E2setup)
726 e2NodeAddList->list.count = duCb.e2apDb.e2NodeComponentList.count;
728 e2NodeAddList->list.count = count;
730 e2NodeAddList->list.size = e2NodeAddList->list.count * sizeof(E2nodeComponentConfigAddition_ItemIEs_t *);
731 DU_ALLOC(e2NodeAddList->list.array, e2NodeAddList->list.size);
732 if(e2NodeAddList->list.array == NULLP)
734 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__);
738 for(arrIdx = 0; arrIdx< e2NodeAddList->list.count; arrIdx++)
740 DU_ALLOC(e2NodeAddList->list.array[arrIdx], sizeof(E2nodeComponentConfigAddition_ItemIEs_t));
741 if(e2NodeAddList->list.array[arrIdx] == NULLP)
743 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__);
747 if(procedureCode == ProcedureCodeE2_id_E2setup)
749 /* Getting all of the E2 node configuration's information from DuCb one by one*/
752 CM_LLIST_FIRST_NODE(&duCb.e2apDb.e2NodeComponentList, node);
760 DU_LOG("\nERROR --> E2AP : E2 node component list node is null");
763 e2NodeComponentInfo = (E2NodeComponent*)node->node;
767 /* Getting only those E2 node configuration from DuCb whose interface
768 * and action type is present in the received array */
769 e2NodeComponentInfo = fetchE2NodeComponentInfo(e2NodeList[arrIdx].interface, e2NodeList[arrIdx].componentId, &node);
772 if(!e2NodeComponentInfo)
774 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
778 e2NodeAddItemIe = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[arrIdx];
779 e2NodeAddItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition_Item;
780 e2NodeAddItemIe->criticality = CriticalityE2_reject;
781 e2NodeAddItemIe->value.present = E2nodeComponentConfigAddition_ItemIEs__value_PR_E2nodeComponentConfigAddition_Item;
782 e2NodeAddItem = &e2NodeAddItemIe->value.choice.E2nodeComponentConfigAddition_Item;
783 if(fillE2NodeConfig((PTR)e2NodeAddItem, e2NodeComponentInfo, CONFIG_ADD) != ROK)
785 DU_LOG("\nERROR --> E2AP : Failed to fill the E2 node configuration");
792 /*******************************************************************
794 * @brief Builds E2 node config update list
798 * Function : BuildE2NodeConfigUpdateList
800 * Functionality: Building E2 node config update list
803 * E2nodeComponentConfigUpdate_List_t to be filled
804 * Count of E2 node to be update in the list
805 * Received list of E2 node configuration
807 * @return ROK - success
810 ******************************************************************/
812 uint8_t BuildE2NodeConfigUpdateList(E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList, uint16_t count, E2NodeConfigItem *updateE2Node)
816 E2NodeComponent *e2NodeComponentInfo =NULL;
817 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe =NULL;
818 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULL;
820 e2NodeUpdateList->list.count = count;
821 e2NodeUpdateList->list.size = e2NodeUpdateList->list.count * sizeof(E2nodeComponentConfigUpdate_ItemIEs_t *);
822 DU_ALLOC(e2NodeUpdateList->list.array, e2NodeUpdateList->list.size);
823 if(e2NodeUpdateList->list.array == NULLP)
825 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigUpdateList %d",__LINE__);
829 for(arrIdx = 0; arrIdx< e2NodeUpdateList->list.count; arrIdx++)
831 DU_ALLOC(e2NodeUpdateList->list.array[arrIdx], sizeof(E2nodeComponentConfigUpdate_ItemIEs_t));
832 if(e2NodeUpdateList->list.array[arrIdx] == NULLP)
834 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigUpdateList %d",__LINE__);
838 e2NodeComponentInfo= fetchE2NodeComponentInfo(updateE2Node[arrIdx].interface, updateE2Node[arrIdx].componentId, &node);
839 if(!e2NodeComponentInfo)
841 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
845 e2NodeUpdateItemIe = (E2nodeComponentConfigUpdate_ItemIEs_t *) e2NodeUpdateList->list.array[arrIdx];
846 e2NodeUpdateItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate_Item;
847 e2NodeUpdateItemIe->criticality = CriticalityE2_reject;
848 e2NodeUpdateItemIe->value.present = E2nodeComponentConfigUpdate_ItemIEs__value_PR_E2nodeComponentConfigUpdate_Item;
849 e2NodeUpdateItem = &e2NodeUpdateItemIe->value.choice.E2nodeComponentConfigUpdate_Item;
851 if(fillE2NodeConfig((PTR)e2NodeUpdateItem, e2NodeComponentInfo, CONFIG_MOD) != ROK)
853 DU_LOG("\nERROR --> E2AP : Failed to fill the E2 node configuration");
863 /*******************************************************************
865 * @brief Builds E2 node config remove list
869 * Function :BuildE2NodeConfigRemoveList
871 * Functionality: Building E2 node config remove list
874 * E2nodeComponentConfigRemoval_List_t to be filled
875 * Count of E2 node to be remove in the list
876 * Received list of E2 node configuration
877 * @return ROK - success
880 ******************************************************************/
882 uint8_t BuildE2NodeConfigRemoveList(E2nodeComponentConfigRemoval_List_t *e2NodeRemoveList, uint16_t count, E2NodeConfigItem *updateE2Node)
886 E2NodeComponent *e2NodeComponentInfo=NULL;
887 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItemIe=NULL;
888 E2nodeComponentConfigRemoval_Item_t *e2NodeRemovalItem=NULL;
890 e2NodeRemoveList->list.count = count;
891 e2NodeRemoveList->list.size = e2NodeRemoveList->list.count * sizeof(E2nodeComponentConfigRemoval_ItemIEs_t *);
892 DU_ALLOC(e2NodeRemoveList->list.array, e2NodeRemoveList->list.size);
893 if(e2NodeRemoveList->list.array == NULLP)
895 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigRemoveList %d",__LINE__);
899 for(arrIdx = 0; arrIdx< e2NodeRemoveList->list.count; arrIdx++)
901 DU_ALLOC(e2NodeRemoveList->list.array[arrIdx], sizeof(E2nodeComponentConfigRemoval_ItemIEs_t));
902 if(e2NodeRemoveList->list.array[arrIdx] == NULLP)
904 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigRemoveList %d",__LINE__);
908 e2NodeComponentInfo= fetchE2NodeComponentInfo(updateE2Node[arrIdx].interface,updateE2Node[arrIdx].componentId, &node);
909 if(!e2NodeComponentInfo)
911 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
915 e2NodeRemovalItemIe = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemoveList->list.array[arrIdx];
916 e2NodeRemovalItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval_Item;
917 e2NodeRemovalItemIe->criticality = CriticalityE2_reject;
918 e2NodeRemovalItemIe->value.present = E2nodeComponentConfigRemoval_ItemIEs__value_PR_E2nodeComponentConfigRemoval_Item;
919 e2NodeRemovalItem = &e2NodeRemovalItemIe->value.choice.E2nodeComponentConfigRemoval_Item;
921 if(fillE2NodeConfig((PTR)e2NodeRemovalItem, e2NodeComponentInfo, CONFIG_DEL) != ROK)
923 DU_LOG("\nERROR --> E2AP : Failed to fill the E2 node configuration");
930 /*******************************************************************
932 * @brief deallocation of E2SM_KPM_RANfunction_Description_t
936 * Function : freeE2smKpmRanFunctionDefinition
938 * Functionality: deallocation of E2SM_KPM_RANfunction_Description_t
940 * @params[in] E2SM_KPM_RANfunction_Description_t *ranFunctionDefinition
943 ******************************************************************/
945 void freeE2smKpmRanFunctionDefinition(E2SM_KPM_RANfunction_Description_t *ranFunctionDefinition)
947 MeasurementInfo_Action_Item_t *measInfoList;
948 uint8_t eventTriggerIdx, reportStyleIdx, measInfoIdx;
949 RANfunction_Name_t *ranFuncName;
950 struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List *ricReportStyle;
951 struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List *eventTriggerStyle;
952 if(ranFunctionDefinition)
954 ranFuncName = &ranFunctionDefinition->ranFunction_Name;
955 /* Free RAN function Name */
956 DU_FREE(ranFuncName->ranFunction_ShortName.buf, ranFuncName->ranFunction_ShortName.size);
957 DU_FREE(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncName->ranFunction_E2SM_OID.size);
958 DU_FREE(ranFuncName->ranFunction_Description.buf, ranFuncName->ranFunction_Description.size);
960 /* Sequence of Event Trigger styles */
961 eventTriggerStyle = ranFunctionDefinition->ric_EventTriggerStyle_List;
962 if(eventTriggerStyle)
964 if(eventTriggerStyle->list.array)
966 for(eventTriggerIdx =0;eventTriggerIdx<eventTriggerStyle->list.count; eventTriggerIdx++)
968 if(eventTriggerStyle->list.array[eventTriggerIdx])
970 DU_FREE(eventTriggerStyle->list.array[eventTriggerIdx]->ric_EventTriggerStyle_Name.buf,\
971 eventTriggerStyle->list.array[eventTriggerIdx]->ric_EventTriggerStyle_Name.size);
972 DU_FREE(eventTriggerStyle->list.array[eventTriggerIdx], sizeof(RIC_EventTriggerStyle_Item_t ));
975 DU_FREE(eventTriggerStyle->list.array, eventTriggerStyle->list.size)
977 DU_FREE(eventTriggerStyle, sizeof(struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List));
980 /* Sequence of Report styles */
981 ricReportStyle = ranFunctionDefinition->ric_ReportStyle_List;
984 if(ricReportStyle->list.array)
986 for(reportStyleIdx =0;reportStyleIdx<ricReportStyle->list.count; reportStyleIdx++)
988 if(ricReportStyle->list.array[reportStyleIdx])
990 if(ricReportStyle->list.array[reportStyleIdx]->ric_ReportStyle_Name.buf)
992 DU_FREE(ricReportStyle->list.array[reportStyleIdx]->ric_ReportStyle_Name.buf,\
993 ricReportStyle->list.array[reportStyleIdx]->ric_ReportStyle_Name.size);
995 if(ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.array)
997 for(measInfoIdx=0; measInfoIdx<ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.count; \
1000 measInfoList = ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.array[measInfoIdx];
1003 DU_FREE(measInfoList->measID, sizeof(long));
1004 DU_FREE(measInfoList->measName.buf, measInfoList->measName.size);
1005 DU_FREE(measInfoList,sizeof(MeasurementInfo_Action_Item_t));
1008 DU_FREE(measInfoList,ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.size);
1010 DU_FREE(ricReportStyle->list.array[reportStyleIdx], sizeof(RIC_ReportStyle_Item_t));
1013 DU_FREE(ricReportStyle->list.array, ricReportStyle->list.size);
1015 DU_FREE(ricReportStyle, sizeof(struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List));
1017 DU_FREE(ranFunctionDefinition, sizeof(E2SM_KPM_RANfunction_Description_t));
1021 /*******************************************************************
1023 * @brief fill the e2sm ric report style
1027 * Function : fillRicReportStyle
1029 * Functionality: fill the report style
1031 * @params[in] RanFunction *ranFuncDb, struct
1032 * E2SM_KPM_RANfunction_Description__ric_ReportStyle_List *ricReportStyle
1033 * @return ROK - success
1036 ******************************************************************/
1037 uint8_t fillRicReportStyle(RanFunction *ranFuncDb, struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List *ricReportStyle)
1039 uint8_t styleIdx, measInfoIdx;
1040 MeasurementInfo_Action_List_t *measInfo;
1043 ricReportStyle->list.count = ranFuncDb->numOfReportStyleSupported;
1044 ricReportStyle->list.size = ricReportStyle->list.count * sizeof(RIC_ReportStyle_Item_t*);
1045 DU_ALLOC(ricReportStyle->list.array, ricReportStyle->list.size);
1046 if(!ricReportStyle->list.array)
1048 DU_LOG("\nERROR --> E2AP: Memory allocation failed for ranFuncDefinition %d",__LINE__);
1052 for(styleIdx =0;styleIdx<ricReportStyle->list.count; styleIdx++)
1054 DU_ALLOC(ricReportStyle->list.array[styleIdx], sizeof(RIC_ReportStyle_Item_t));
1055 if(!ricReportStyle->list.array[styleIdx])
1057 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1061 /* RIC Report Style Type */
1062 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Type = ranFuncDb->reportStyleList[styleIdx].reportStyle.styleType;
1064 /* RIC Report Style Format Type */
1065 ricReportStyle->list.array[styleIdx]->ric_ActionFormat_Type = ranFuncDb->reportStyleList[styleIdx].reportStyle.formatType;
1067 /* RIC Report Style Name */
1068 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.size = strlen(ranFuncDb->reportStyleList[styleIdx].reportStyle.name);
1069 DU_ALLOC(ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.buf,\
1070 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.size);
1071 if(!ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.buf)
1073 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1076 memcpy(ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.buf, ranFuncDb->reportStyleList[styleIdx].reportStyle.name,\
1077 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.size);
1079 /* RIC Indication Header Format Type*/
1080 ricReportStyle->list.array[styleIdx]->ric_IndicationHeaderFormat_Type = ranFuncDb->ricIndicationHeaderFormat;
1082 /* RIC Indication Message Format Type*/
1083 ricReportStyle->list.array[styleIdx]->ric_IndicationMessageFormat_Type = ranFuncDb->ricIndicationMessageFormat;
1085 /* Measurement Info Action List */
1086 CmLListCp measInfoList =ranFuncDb->reportStyleList[styleIdx].measurementInfoList;
1087 if(!measInfoList.count)
1092 CM_LLIST_FIRST_NODE(&ranFuncDb->reportStyleList[styleIdx].measurementInfoList, node);
1093 measInfo = &ricReportStyle->list.array[styleIdx]->measInfo_Action_List;
1095 measInfo->list.count = measInfoList.count;
1096 measInfo->list.size = measInfoList.count*sizeof(MeasurementInfo_Action_Item_t*);
1097 DU_ALLOC(measInfo->list.array, measInfo->list.size);
1098 if(!measInfo->list.array)
1100 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1104 for(measInfoIdx=0; measInfoIdx<measInfo->list.count; measInfoIdx++)
1108 DU_LOG("\nERROR --> E2AP: Measurement info node is null");
1112 DU_ALLOC(measInfo->list.array[measInfoIdx],sizeof(MeasurementInfo_Action_Item_t));
1113 if(!measInfo->list.array[measInfoIdx])
1115 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1118 MeasurementInfoForAction *measInfoForAction= (MeasurementInfoForAction*)node->node;
1119 DU_ALLOC(measInfo->list.array[measInfoIdx]->measID, sizeof(long));
1120 if(!measInfo->list.array[measInfoIdx]->measID)
1122 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1126 memcpy(measInfo->list.array[measInfoIdx]->measID, &measInfoForAction->measurementTypeId,sizeof(long));
1127 measInfo->list.array[measInfoIdx]->measName.size= strlen(measInfoForAction->measurementTypeName);
1128 DU_ALLOC(measInfo->list.array[measInfoIdx]->measName.buf, measInfo->list.array[measInfoIdx]->measName.size);
1129 if(!measInfo->list.array[measInfoIdx]->measName.size)
1131 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1135 memcpy(measInfo->list.array[measInfoIdx]->measName.buf, \
1136 measInfoForAction->measurementTypeName,\
1137 measInfo->list.array[measInfoIdx]->measName.size);
1144 /*******************************************************************
1146 * @brief fill the ric event trigger style
1150 * Function : fillRicEventTriggerStyle
1152 * Functionality: fill the ric event trigger style
1155 * @return ROK - success
1158 ******************************************************************/
1159 uint8_t fillRicEventTriggerStyle(RanFunction *ranFuncDb, struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List *ricEventTriggerStyle)
1163 ricEventTriggerStyle->list.count = ranFuncDb->numOfEventTriggerStyleSupported;
1164 ricEventTriggerStyle->list.size = ricEventTriggerStyle->list.count* sizeof(RIC_EventTriggerStyle_Item_t *);
1165 DU_ALLOC(ricEventTriggerStyle->list.array, ricEventTriggerStyle->list.size);
1166 if(!ricEventTriggerStyle->list.array)
1168 DU_LOG("\nERROR --> E2AP: Memory allocation failed for ric_EventTriggerStyle_List %d",__LINE__);
1172 for(styleIdx =0;styleIdx<ricEventTriggerStyle->list.count; styleIdx++)
1174 DU_ALLOC(ricEventTriggerStyle->list.array[styleIdx], sizeof(RIC_EventTriggerStyle_Item_t ));
1175 if(!ricEventTriggerStyle->list.array[styleIdx])
1177 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1180 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Type = ranFuncDb->eventTriggerStyleList[styleIdx].styleType;
1182 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerFormat_Type = ranFuncDb->eventTriggerStyleList[styleIdx].formatType;
1184 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.size = strlen(ranFuncDb->eventTriggerStyleList[styleIdx].name);
1185 DU_ALLOC(ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.buf,\
1186 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.size);
1187 if(!ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.buf)
1189 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1192 memcpy(ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.buf,ranFuncDb->eventTriggerStyleList[styleIdx].name,\
1193 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.size);
1199 /*******************************************************************
1201 * @brief Builds Ran function item
1205 * Function : BuildRanFunctionItem
1207 * Functionality: Building RAN function item
1210 * RAN function item that has to be filled
1211 * Stored RAN Function information
1212 * @return ROK - success
1215 ******************************************************************/
1217 uint8_t BuildRanFunctionItem(RANfunction_Item_t *ranFuncItem, RanFunction *ranFuncDb)
1219 uint8_t ret =RFAILED;
1220 RANfunctionDefinition_t *ranFunctionDefinition;
1221 RANfunction_Name_t *ranFuncName;
1222 asn_enc_rval_t encRetVal;
1223 E2SM_KPM_RANfunction_Description_t *ranFuncDefinition;
1227 /* RAN function Id*/
1228 ranFuncItem->ranFunctionID = ranFuncDb->id;
1230 /* RAN Function Revision*/
1231 ranFuncItem->ranFunctionRevision = ranFuncDb->revisionCounter;
1233 /* RAN function OID*/
1234 ranFuncItem->ranFunctionOID.size = strlen(ranFuncDb->name.serviceModelOID);
1235 DU_ALLOC(ranFuncItem->ranFunctionOID.buf, ranFuncItem->ranFunctionOID.size);
1236 if(!ranFuncItem->ranFunctionOID.buf)
1238 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1241 memcpy(ranFuncItem->ranFunctionOID.buf, ranFuncDb->name.serviceModelOID, ranFuncItem->ranFunctionOID.size);
1243 /* RAN function Definition */
1244 DU_ALLOC(ranFuncDefinition, sizeof(E2SM_KPM_RANfunction_Description_t));
1245 if(!ranFuncDefinition)
1247 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1251 /* RAN function Name */
1252 ranFuncName = &ranFuncDefinition->ranFunction_Name;
1254 /* RAN function ShortName */
1255 ranFuncName->ranFunction_ShortName.size = strlen(ranFuncDb->name.shortName);
1256 DU_ALLOC(ranFuncName->ranFunction_ShortName.buf, ranFuncName->ranFunction_ShortName.size);
1257 if(!ranFuncName->ranFunction_ShortName.buf)
1259 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1262 memcpy(ranFuncName->ranFunction_ShortName.buf, ranFuncDb->name.shortName, strlen(ranFuncDb->name.shortName));
1264 /* RAN function E2SM_OID */
1265 ranFuncName->ranFunction_E2SM_OID.size = strlen(ranFuncDb->name.serviceModelOID);
1266 DU_ALLOC(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncName->ranFunction_E2SM_OID.size);
1267 if(!ranFuncName->ranFunction_E2SM_OID.buf)
1269 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1272 memcpy(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncDb->name.serviceModelOID, ranFuncName->ranFunction_E2SM_OID.size);
1274 /* RAN Function Name Description */
1275 ranFuncName->ranFunction_Description.size = strlen(ranFuncDb->name.description);
1276 DU_ALLOC(ranFuncName->ranFunction_Description.buf, ranFuncName->ranFunction_Description.size);
1277 if(!ranFuncName->ranFunction_Description.buf)
1279 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1282 memcpy(ranFuncName->ranFunction_Description.buf, ranFuncDb->name.description, ranFuncName->ranFunction_Description.size);
1284 /* RIC Event Trigger Style List */
1285 DU_ALLOC(ranFuncDefinition->ric_EventTriggerStyle_List, sizeof(struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List));
1286 if(!ranFuncDefinition->ric_EventTriggerStyle_List)
1288 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1292 if(fillRicEventTriggerStyle(ranFuncDb, ranFuncDefinition->ric_EventTriggerStyle_List)!=ROK)
1294 DU_LOG("\nERROR --> E2AP: failed to fill ric event trigger style");
1298 /* RIC Report Style List */
1299 DU_ALLOC(ranFuncDefinition->ric_ReportStyle_List, sizeof(struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List));
1300 if(!ranFuncDefinition->ric_ReportStyle_List)
1302 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1305 if(fillRicReportStyle(ranFuncDb, ranFuncDefinition->ric_ReportStyle_List) != ROK)
1307 DU_LOG("\nERROR --> E2AP: failed to fill ric report style");
1311 /* Encode the F1SetupRequest type as APER */
1312 xer_fprint(stdout, &asn_DEF_E2SM_KPM_RANfunction_Description, ranFuncDefinition);
1314 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1316 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_RANfunction_Description, 0, ranFuncDefinition, PrepFinalEncBuf, encBuf);
1318 /* Encode results */
1319 if(encRetVal.encoded == ENCODE_FAIL)
1321 DU_LOG("\nERROR --> F1AP : Could not encode RAN function definition (at %s)\n",\
1322 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1327 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RAN function definition \n");
1328 for(uint8_t measIeIdx=0; measIeIdx< encBufSize; measIeIdx++)
1330 printf("%x",encBuf[measIeIdx]);
1332 ranFunctionDefinition = &ranFuncItem->ranFunctionDefinition;
1333 ranFunctionDefinition->size = encBufSize;
1334 DU_ALLOC(ranFunctionDefinition->buf, encBufSize);
1335 if(ranFunctionDefinition->buf == NULLP)
1337 DU_LOG("\nERROR --> F1AP : Memory allocation failed for RAN function definition buffer");
1340 memcpy(ranFunctionDefinition->buf, &encBuf, encBufSize);
1345 freeE2smKpmRanFunctionDefinition(ranFuncDefinition);
1349 /*******************************************************************
1351 * @brief Builds Ran function add list based on the procedure code
1355 * Function : BuildRanFunctionAddList
1357 * Functionality: Building RAN addition addition list
1358 * In case of ProcedureCodeE2_id_E2setup we add all the RAN Function list
1359 * which is present in E2 database.
1360 * In the case of other procedures, we just fill the RAN functions whose ID
1361 * is contained in recvList
1366 * Count of ran functions to be added in the list
1367 * Received list of RAN functions
1369 * @return ROK - success
1372 ******************************************************************/
1374 uint8_t BuildRanFunctionAddList(RANfunctions_List_t *ranFunctionsList, uint8_t procedureCode, uint8_t count, RanFuncInfo *recvList)
1377 RanFunction *ranFuncDb;
1379 RANfunction_ItemIEs_t *ranFuncItemIe;
1381 /* For ProcedureCodeE2_id_E2setup, the number of RAN function list items is
1382 * equal to the number of ran function entries stored in the database.
1383 * For any other procedure, the RAN function list count is equal
1384 * to the count of ran functions obtained from the function's caller */
1386 if(procedureCode == ProcedureCodeE2_id_E2setup)
1387 ranFunctionsList->list.count = duCb.e2apDb.numOfRanFunction;
1389 ranFunctionsList->list.count = count;
1391 ranFunctionsList->list.size = ranFunctionsList->list.count * sizeof(RANfunction_ItemIEs_t*);
1392 DU_ALLOC(ranFunctionsList->list.array, ranFunctionsList->list.size);
1393 if(ranFunctionsList->list.array == NULLP)
1395 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
1399 for(ranFuncIdx = 0; ranFuncIdx< ranFunctionsList->list.count; ranFuncIdx++)
1401 DU_ALLOC(ranFunctionsList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
1402 if(ranFunctionsList->list.array[ranFuncIdx] == NULLP)
1404 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
1407 if(procedureCode == ProcedureCodeE2_id_E2setup)
1409 /* Getting all of the RAN function's information from DuCb one by one*/
1410 ranFuncDb = &duCb.e2apDb.ranFunction[ranFuncIdx];
1414 /* Getting only the RAN function information from DuCb whose Id is
1415 * present in the received array */
1416 id =recvList[ranFuncIdx].id;
1417 ranFuncDb = &duCb.e2apDb.ranFunction[id-1];
1419 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
1420 ranFuncItemIe->id = ProtocolIE_IDE2_id_RANfunction_Item;
1421 ranFuncItemIe->criticality = CriticalityE2_ignore;
1422 ranFuncItemIe->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
1423 BuildRanFunctionItem(&ranFuncItemIe->value.choice.RANfunction_Item, ranFuncDb);
1428 /*******************************************************************
1430 * @brief De Allocate E2 Setup Request Message
1434 * Function : FreeE2SetupReq
1436 * Functionality: De-Allocating E2 Setup request Message
1438 * @params[in] E2AP_PDU_t *e2apMsg
1442 * ****************************************************************/
1444 void FreeE2SetupReq(E2AP_PDU_t *e2apMsg)
1447 uint8_t e2NodeAddListIdx =0, ranFuncAddListIdx;
1448 E2setupRequest_t *e2SetupReq;
1449 E2nodeComponentConfigAddition_List_t *e2NodeAddList;
1450 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem;
1451 RANfunctions_List_t *ranFunctionsList;
1452 RANfunction_ItemIEs_t *ranFuncItemIe;
1453 RANfunction_Item_t *ranFunItem;
1455 /* De-allocating Memory */
1456 if(e2apMsg != NULLP)
1458 if(e2apMsg->choice.initiatingMessage != NULLP)
1460 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
1461 if(e2SetupReq->protocolIEs.list.array != NULLP)
1463 for(arrIdx = 0; arrIdx < e2SetupReq->protocolIEs.list.count; arrIdx++)
1465 if(e2SetupReq->protocolIEs.list.array[arrIdx] != NULLP)
1467 switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id)
1469 case ProtocolIE_IDE2_id_TransactionID:
1471 case ProtocolIE_IDE2_id_GlobalE2node_ID:
1473 if(e2SetupReq->protocolIEs.list.array[arrIdx]->\
1474 value.choice.GlobalE2node_ID.choice.gNB != NULLP)
1476 GlobalE2node_gNB_ID_t *gNbId = NULLP;
1477 gNbId = e2SetupReq->protocolIEs.list.array[arrIdx]->\
1478 value.choice.GlobalE2node_ID.choice.gNB;
1479 if(gNbId->global_gNB_ID.plmn_id.buf != NULLP)
1481 DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\
1482 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
1483 DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\
1484 gNbId->global_gNB_ID.plmn_id.size);
1487 if(gNbId->gNB_DU_ID != NULLP)
1489 DU_FREE( gNbId->gNB_DU_ID->buf, gNbId->gNB_DU_ID->size);
1490 DU_FREE(gNbId->gNB_DU_ID, sizeof(GNB_DU_ID_t));
1492 DU_FREE(e2SetupReq->protocolIEs.list.array[arrIdx]->value.\
1493 choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
1497 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
1499 e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
1500 if(e2NodeAddList->list.array)
1502 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
1504 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[e2NodeAddListIdx];
1506 /* Free E2 Node Component Request Part */
1507 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentRequestPart.buf,\
1508 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentRequestPart.size);
1510 /* Free E2 Node Component Response Part */
1511 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.\
1512 e2nodeComponentResponsePart.buf, \
1513 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentResponsePart.size);
1515 /* Free E2 Node Component ID */
1516 if(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1)
1518 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.\
1519 e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\
1520 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.\
1521 e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
1522 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1,\
1523 sizeof(E2nodeComponentInterfaceF1_t));
1525 DU_FREE(e2NodeAddList->list.array[e2NodeAddListIdx], sizeof(E2nodeComponentConfigAddition_ItemIEs_t));
1527 DU_FREE(e2NodeAddList->list.array, e2NodeAddList->list.size);
1531 case ProtocolIE_IDE2_id_RANfunctionsAdded:
1533 ranFunctionsList = &(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List);
1534 if(ranFunctionsList->list.array)
1536 for(ranFuncAddListIdx= 0; ranFuncAddListIdx< ranFunctionsList->list.count; ranFuncAddListIdx++)
1538 if(ranFunctionsList->list.array[ranFuncAddListIdx])
1540 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncAddListIdx];
1541 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
1542 DU_FREE(ranFunItem->ranFunctionOID.buf, ranFunItem->ranFunctionOID.size);
1543 DU_FREE(ranFunItem->ranFunctionDefinition.buf, ranFunItem->ranFunctionDefinition.size);
1544 DU_FREE(ranFunctionsList->list.array[ranFuncAddListIdx], sizeof(RANfunction_ItemIEs_t));
1547 DU_FREE(ranFunctionsList->list.array, ranFunctionsList->list.size);
1553 DU_LOG("\nERROR --> E2AP: Invalid event at e2SetupRequet %ld ",\
1554 (e2SetupReq->protocolIEs.list.array[arrIdx]->id));
1557 DU_FREE(e2SetupReq->protocolIEs.list.array[arrIdx], sizeof(E2setupRequestIEs_t));
1560 DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size);
1562 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1564 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1568 /*******************************************************************
1570 * @brief Builds and Send the E2SetupRequest
1574 * Function : BuildAndSendE2SetupReq
1576 * Functionality:Fills the E2SetupRequest
1578 * @return ROK - success
1581 ******************************************************************/
1583 uint8_t BuildAndSendE2SetupReq()
1585 uint8_t arrIdx = 0, elementCnt=0;
1586 uint8_t transId = 0, ret = RFAILED;
1587 bool memAllocFailed = false;
1588 E2AP_PDU_t *e2apMsg = NULLP;
1589 E2setupRequest_t *e2SetupReq = NULLP;
1590 asn_enc_rval_t encRetVal; /* Encoder return value */
1592 DU_LOG("\nINFO --> E2AP : Building E2 Setup Request\n");
1595 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1596 if(e2apMsg == NULLP)
1598 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1601 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
1602 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1603 if(e2apMsg->choice.initiatingMessage == NULLP)
1605 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1608 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1609 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
1610 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
1611 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
1614 e2SetupReq->protocolIEs.list.count = elementCnt;
1615 e2SetupReq->protocolIEs.list.size = elementCnt * sizeof(E2setupRequestIEs_t*);
1617 /* Initialize the E2Setup members */
1618 DU_ALLOC(e2SetupReq->protocolIEs.list.array, \
1619 e2SetupReq->protocolIEs.list.size);
1620 if(e2SetupReq->protocolIEs.list.array == NULLP)
1622 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements");
1625 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
1627 DU_ALLOC(e2SetupReq->protocolIEs.list.array[arrIdx],\
1628 sizeof(E2setupRequestIEs_t));
1629 if(e2SetupReq->protocolIEs.list.array[arrIdx] == NULLP)
1631 memAllocFailed = true;
1632 DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayarrIdx [%d]", arrIdx);
1636 if(memAllocFailed == true)
1642 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
1643 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1644 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_TransactionID;
1645 transId = assignTransactionId();
1646 e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
1649 /* GlobalE2node_gNB_ID */
1650 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_GlobalE2node_ID;
1651 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1652 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_GlobalE2node_ID;
1653 e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB;
1655 DU_ALLOC(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.\
1656 GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
1657 if(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.\
1658 GlobalE2node_ID.choice.gNB == NULLP)
1660 DU_LOG("\nERROR --> E2AP : Memory allocation failed for gNbId");
1665 ret = BuildGlobalgNBId(e2SetupReq->protocolIEs.list.array[arrIdx]->value.\
1666 choice.GlobalE2node_ID.choice.gNB);
1669 DU_LOG("\nERROR --> E2AP : Failed to build Global Gnb Id");
1674 /* RAN Functions Added List */
1676 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAdded;
1677 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1678 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_RANfunctions_List;
1679 if(BuildRanFunctionAddList(&(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List), ProcedureCodeE2_id_E2setup, 0, NULL)!=ROK)
1681 DU_LOG("\nERROR --> E2AP : Failed to create RAN Function");
1685 /* E2 Node Component Configuration Addition List */
1687 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition;
1688 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1689 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_E2nodeComponentConfigAddition_List;
1690 if(BuildE2NodeConfigAddList(&(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List), ProcedureCodeE2_id_E2setup, 0, NULL)!=ROK)
1692 DU_LOG("\nERROR --> E2AP : Failed to create E2 Node config list");
1698 /* Prints the Msg formed */
1699 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1701 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1703 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
1705 if(encRetVal.encoded == ENCODE_FAIL)
1707 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupRequest structure (at %s)\n",\
1708 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1713 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupRequest\n");
1714 #ifdef DEBUG_ASN_PRINT
1715 for(int i=0; i< encBufSize; i++)
1717 printf("%x",encBuf[i]);
1721 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
1723 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
1728 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
1729 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
1731 FreeE2SetupReq(e2apMsg);
1733 }/* End of BuildAndSendE2SetupReq */
1735 /*******************************************************************
1737 * @brief Builds RIC Action Admitted List
1741 * Function : BuildRicActionAdmitList
1743 * Functionality: Builds RIC Action Admitted List
1745 * @params[in] Pointer to RIC Action Admitted List to be filled
1746 * Subscription Response information
1747 * @return ROK - success
1750 * ****************************************************************/
1751 uint8_t BuildRicActionAdmitList(RICaction_Admitted_List_t *admitList, PendingSubsRspInfo *subsRspInfo)
1754 uint8_t elementCnt = 0;
1755 RICaction_Admitted_ItemIEs_t *admitItem = NULLP;
1757 elementCnt = subsRspInfo->numOfAcceptedActions;
1759 admitList->list.count = elementCnt;
1760 admitList->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t *);
1762 DU_ALLOC(admitList->list.array, admitList->list.size);
1763 if(admitList->list.array == NULLP)
1765 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1769 for(idx=0; idx<elementCnt; idx++)
1771 DU_ALLOC(admitList->list.array[idx], sizeof(RICaction_Admitted_ItemIEs_t));
1772 if(admitList->list.array[idx] == NULLP)
1774 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1778 admitItem = (RICaction_Admitted_ItemIEs_t *)admitList->list.array[idx];
1779 admitItem->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
1780 admitItem->criticality = CriticalityE2_reject;
1781 admitItem->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
1782 admitItem->value.choice.RICaction_Admitted_Item.ricActionID = subsRspInfo->acceptedActionList[idx];
1787 /*******************************************************************
1789 * @brief Builds RIC Action Not Admitted List
1793 * Function : BuildRicActionNotAdmitList
1795 * Functionality: Builds RIC Action Not Admitted List
1797 * @params[in] Pointer to RIC Action Not Admitted List to be filled
1798 * Subscription Response information
1799 * @return ROK - success
1802 * ****************************************************************/
1803 uint8_t BuildRicActionNotAdmitList(RICaction_NotAdmitted_List_t *notAdmitList, PendingSubsRspInfo *subsRspInfo)
1806 uint8_t elementCnt = 0;
1807 RICaction_NotAdmitted_ItemIEs_t *notAdmitItem = NULLP;
1809 elementCnt = subsRspInfo->numOfRejectedActions;
1811 notAdmitList->list.count = elementCnt;
1812 notAdmitList->list.size = elementCnt * sizeof(RICaction_NotAdmitted_ItemIEs_t *);
1814 DU_ALLOC(notAdmitList->list.array, notAdmitList->list.size);
1815 if(notAdmitList->list.array == NULLP)
1817 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1821 for(idx=0; idx<elementCnt; idx++)
1823 DU_ALLOC(notAdmitList->list.array[idx], sizeof(RICaction_NotAdmitted_ItemIEs_t));
1824 if(notAdmitList->list.array[idx] == NULLP)
1826 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1830 notAdmitItem = (RICaction_NotAdmitted_ItemIEs_t *)notAdmitList->list.array[idx];
1831 notAdmitItem->id = ProtocolIE_IDE2_id_RICaction_NotAdmitted_Item;
1832 notAdmitItem->criticality = CriticalityE2_reject;
1833 notAdmitItem->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
1834 notAdmitItem->value.choice.RICaction_NotAdmitted_Item.ricActionID = \
1835 subsRspInfo->rejectedActionList[idx].id;
1836 fillE2Cause(¬AdmitItem->value.choice.RICaction_NotAdmitted_Item.cause, \
1837 subsRspInfo->rejectedActionList[idx].failureCause);
1842 /*******************************************************************
1844 * @breif Deallocation of BuildAndSendRicSubscriptionRsp memory
1848 * Function : FreeRicSubscriptionRsp
1850 * Functionality:Free the RicSubscriptionRsp
1852 * @param[in] E2AP_PDU_t *e2apRicMsg
1856 ******************************************************************/
1857 void FreeRicSubscriptionRsp(E2AP_PDU_t *e2apRicMsg)
1859 RICsubscriptionResponse_t *ricSubscriptionRsp= NULLP;
1862 RICaction_Admitted_List_t *admitList = NULLP;
1863 RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
1865 if(e2apRicMsg != NULLP)
1867 if(e2apRicMsg->choice.successfulOutcome != NULLP)
1869 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
1870 if(ricSubscriptionRsp)
1872 if(ricSubscriptionRsp->protocolIEs.list.array != NULLP)
1874 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
1876 if(ricSubscriptionRsp->protocolIEs.list.array[idx] != NULLP)
1878 switch(ricSubscriptionRsp->protocolIEs.list.array[idx]->id)
1880 case ProtocolIE_IDE2_id_RICactions_Admitted:
1882 admitList = &ricSubscriptionRsp->protocolIEs.list.\
1883 array[idx]->value.choice.RICaction_Admitted_List;
1884 if(admitList->list.array != NULLP)
1886 for(listIdx=0 ; listIdx < admitList->list.count; listIdx++)
1888 DU_FREE(admitList->list.array[listIdx], sizeof(RICaction_Admitted_ItemIEs_t));
1890 DU_FREE(admitList->list.array, admitList->list.size);
1894 case ProtocolIE_IDE2_id_RICactions_NotAdmitted:
1896 notAdmitList = &ricSubscriptionRsp->protocolIEs.list.\
1897 array[idx]->value.choice.RICaction_NotAdmitted_List;
1898 if(notAdmitList->list.array != NULLP)
1900 for(listIdx=0 ; listIdx < notAdmitList->list.count; listIdx++)
1902 DU_FREE(notAdmitList->list.array[listIdx], sizeof(RICaction_NotAdmitted_ItemIEs_t));
1904 DU_FREE(notAdmitList->list.array, notAdmitList->list.size);
1911 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array[idx], sizeof(RICsubscriptionResponse_IEs_t));
1914 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array, ricSubscriptionRsp->protocolIEs.list.size);
1917 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1919 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
1923 /*******************************************************************
1925 * @brief Fill RIC Subscription Response IEs
1929 * Function : fillRicSubscriptionRsp
1931 * functionality: Fill RIC Subscription Response IEs
1933 * @param Pointer to RIC subscription response
1934 * Subscription response information
1935 * @return ROK - success
1938 ******************************************************************/
1939 uint8_t fillRicSubscriptionRsp(RICsubscriptionResponse_t *ricSubscriptionRsp, PendingSubsRspInfo *subsRspInfo)
1942 uint8_t elementCnt = 0;
1943 RICsubscriptionResponse_IEs_t *subsRspIe = NULLP;
1946 if(subsRspInfo->numOfRejectedActions)
1949 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
1950 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
1951 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, ricSubscriptionRsp->protocolIEs.list.size);
1952 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
1954 DU_LOG("\nERROR --> E2AP : Memory allocation failed at %s : line %d", __func__, __LINE__);
1958 for(ieIdx=0; ieIdx<ricSubscriptionRsp->protocolIEs.list.count; ieIdx++)
1960 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionResponse_IEs_t));
1961 if(ricSubscriptionRsp->protocolIEs.list.array[ieIdx] == NULLP)
1963 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d] : ieIdx [%d]", __func__, __LINE__,ieIdx);
1968 /* RIC Request ID */
1970 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1971 subsRspIe->id = ProtocolIE_IDE2_id_RICrequestID;
1972 subsRspIe->criticality = CriticalityE2_reject;
1973 subsRspIe->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
1974 subsRspIe->value.choice.RICrequestID.ricRequestorID = subsRspInfo->requestId.requestorId;
1975 subsRspIe->value.choice.RICrequestID.ricInstanceID = subsRspInfo->requestId.instanceId;
1977 /* RAN Function ID */
1979 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1980 subsRspIe->id = ProtocolIE_IDE2_id_RANfunctionID;
1981 subsRspIe->criticality = CriticalityE2_reject;
1982 subsRspIe->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
1983 subsRspIe->value.choice.RANfunctionID = subsRspInfo->ranFuncId;
1985 /* RIC Action Admitted List */
1987 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1988 subsRspIe->id = ProtocolIE_IDE2_id_RICactions_Admitted;
1989 subsRspIe->criticality = CriticalityE2_reject;
1990 subsRspIe->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
1991 if(BuildRicActionAdmitList(&subsRspIe->value.choice.RICaction_Admitted_List, subsRspInfo) != ROK)
1993 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Action Admitted List in RIC Subscription Response");
1997 /* RIC Action Not Admitted List */
1998 if(subsRspInfo->numOfRejectedActions)
2001 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
2002 subsRspIe->id = ProtocolIE_IDE2_id_RICactions_NotAdmitted;
2003 subsRspIe->criticality = CriticalityE2_reject;
2004 subsRspIe->criticality = CriticalityE2_reject;
2005 subsRspIe->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List;
2006 if(BuildRicActionNotAdmitList(&subsRspIe->value.choice.RICaction_NotAdmitted_List, subsRspInfo) != ROK)
2008 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Action Not Admitted List in RIC Subscription Response");
2016 /*******************************************************************
2018 * @brief Builds and Send the RicSubscriptionRsp
2022 * Function : BuildAndSendRicSubscriptionRsp
2024 * Functionality:Fills the RicSubscriptionRsp
2026 * @return ROK - success
2029 ******************************************************************/
2031 uint8_t BuildAndSendRicSubscriptionRsp(PendingSubsRspInfo *subsRspInfo)
2033 uint8_t ret = RFAILED;
2034 E2AP_PDU_t *e2apRicMsg = NULLP;
2035 RICsubscriptionResponse_t *ricSubscriptionRsp=NULLP;
2036 asn_enc_rval_t encRetVal;
2040 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Response\n");
2042 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
2043 if(e2apRicMsg == NULLP)
2045 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2049 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
2050 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2051 if(e2apRicMsg->choice.successfulOutcome == NULLP)
2053 DU_LOG("\nERROR --> E2AP : Memory allocation for RIC subscription Response failed");
2057 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
2058 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2059 e2apRicMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
2061 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
2063 if(fillRicSubscriptionRsp(ricSubscriptionRsp, subsRspInfo) != ROK)
2065 DU_LOG("\nERROR --> E2AP : Memory allocation for RICsubscriptionResponseIE failed");
2069 /* Prints the Msg formed */
2070 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
2072 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2074 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
2075 if(encRetVal.encoded == ENCODE_FAIL)
2077 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
2078 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2083 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription response \n");
2084 #ifdef DEBUG_ASN_PRINT
2085 for(int i=0; i< encBufSize; i++)
2087 printf("%x",encBuf[i]);
2092 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
2094 DU_LOG("\nERROR --> E2AP : Sending RIC Subscription Response failed");
2103 FreeRicSubscriptionRsp(e2apRicMsg);
2107 /******************************************************************
2109 * @brief Deallocation of memory allocated by aper decoder for e2 setup response
2113 * Function : freeAperDecodingOfE2SetupRsp
2115 * Functionality: Deallocation of memory allocated by aper decoder for e2
2118 * @params[in] E2setupResponse_t *e2SetRspMsg;
2121 * ****************************************************************/
2122 void freeAperDecodingOfE2SetupRsp(E2setupResponse_t *e2SetRspMsg)
2124 uint8_t arrIdx, e2NodeConfigAddAckListIdx;
2125 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem;
2126 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAddAckList;
2130 if(e2SetRspMsg->protocolIEs.list.array)
2132 for(arrIdx=0; arrIdx<e2SetRspMsg->protocolIEs.list.count; arrIdx++)
2134 if(e2SetRspMsg->protocolIEs.list.array[arrIdx])
2136 switch(e2SetRspMsg->protocolIEs.list.array[arrIdx]->id)
2138 case ProtocolIE_IDE2_id_TransactionID:
2141 case ProtocolIE_IDE2_id_GlobalRIC_ID:
2143 free(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.pLMN_Identity.buf);
2144 free(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.ric_ID.buf);
2148 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
2150 e2NodeConfigAddAckList = &e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
2151 if(e2NodeConfigAddAckList->list.array )
2153 for(e2NodeConfigAddAckListIdx = 0; e2NodeConfigAddAckListIdx< e2NodeConfigAddAckList->list.count; e2NodeConfigAddAckListIdx++)
2155 if(e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx])
2157 e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx];
2158 free(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.\
2159 e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf);
2160 free(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.\
2161 e2nodeComponentInterfaceTypeF1);
2162 free(e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx]);
2165 free(e2NodeConfigAddAckList->list.array);
2170 free(e2SetRspMsg->protocolIEs.list.array[arrIdx]);
2173 free(e2SetRspMsg->protocolIEs.list.array);
2178 /******************************************************************
2180 * @brief handling of e2 noe config update ack ies
2184 * Function :handleE2NodeConfigUpdateAckIes
2186 * Functionality: handling of e2 noe config update ack ies
2189 * Pointer to the E2 Node cfg
2192 ******************************************************************/
2194 void handleE2NodeConfigUpdateAckIes(PTR e2NodeCfg, uint8_t procedureCode)
2196 CmLList *node=NULLP;
2197 E2NodeComponent *e2NodeComponentInfo=NULLP;
2198 E2nodeComponentID_t *e2nodeComponentID=NULLP;
2199 E2nodeComponentConfigRemovalAck_Item_t *removalAckItem=NULLP;
2200 E2nodeComponentConfigUpdateAck_Item_t *updateAckItem=NULLP;
2201 E2nodeComponentConfigAdditionAck_Item_t *additionAckItem=NULLP;
2203 switch(procedureCode)
2205 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
2207 additionAckItem = (E2nodeComponentConfigAdditionAck_Item_t *)e2NodeCfg;
2208 e2nodeComponentID = &additionAckItem->e2nodeComponentID;
2211 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
2213 updateAckItem = (E2nodeComponentConfigUpdateAck_Item_t*) e2NodeCfg;
2214 e2nodeComponentID = &updateAckItem->e2nodeComponentID;
2217 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
2219 removalAckItem= (E2nodeComponentConfigRemovalAck_Item_t*)e2NodeCfg;
2220 e2nodeComponentID = &removalAckItem->e2nodeComponentID;
2225 switch(e2nodeComponentID->present)
2227 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
2229 e2NodeComponentInfo = fetchE2NodeComponentInfo(F1, e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0], &node);
2230 if(!e2NodeComponentInfo)
2232 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
2241 switch(procedureCode)
2243 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
2245 DU_FREE(e2NodeComponentInfo->addConfiguration->componentRequestPart, e2NodeComponentInfo->addConfiguration->reqBufSize);
2246 DU_FREE(e2NodeComponentInfo->addConfiguration->componentResponsePart, e2NodeComponentInfo->addConfiguration->rspBufSize);
2247 DU_FREE(e2NodeComponentInfo->addConfiguration, sizeof(E2NodeConfig));
2250 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
2252 DU_FREE(e2NodeComponentInfo->updateConfiguration->componentRequestPart, e2NodeComponentInfo->updateConfiguration->reqBufSize);
2253 DU_FREE(e2NodeComponentInfo->updateConfiguration->componentResponsePart, e2NodeComponentInfo->updateConfiguration->rspBufSize);
2254 DU_FREE(e2NodeComponentInfo->updateConfiguration, sizeof(E2NodeConfig));
2257 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
2259 cmLListDelFrm(&duCb.e2apDb.e2NodeComponentList, node);
2260 if(e2NodeComponentInfo->addConfiguration)
2262 DU_FREE(e2NodeComponentInfo->addConfiguration->componentRequestPart, e2NodeComponentInfo->addConfiguration->reqBufSize);
2263 DU_FREE(e2NodeComponentInfo->addConfiguration->componentResponsePart, e2NodeComponentInfo->addConfiguration->rspBufSize);
2264 DU_FREE(e2NodeComponentInfo->addConfiguration, sizeof(E2NodeConfig));
2266 if(e2NodeComponentInfo->updateConfiguration)
2268 DU_FREE(e2NodeComponentInfo->updateConfiguration->componentRequestPart, e2NodeComponentInfo->updateConfiguration->reqBufSize);
2269 DU_FREE(e2NodeComponentInfo->updateConfiguration->componentResponsePart, e2NodeComponentInfo->updateConfiguration->rspBufSize);
2270 DU_FREE(e2NodeComponentInfo->updateConfiguration, sizeof(E2NodeConfig));
2272 DU_FREE(node, sizeof(CmLList));
2278 /******************************************************************
2280 * @brief Processes E2 Setup Response sent by RIC
2284 * Function : procE2SetupRsp
2286 * Functionality: Processes E2 Setup Response sent by RIC
2288 * @params[in] E2AP_PDU_t ASN decoded E2AP message
2291 * ****************************************************************/
2293 void procE2SetupRsp(E2AP_PDU_t *e2apMsg)
2295 bool invalidTransId = false;
2296 uint8_t arrIdx =0, transId=0, idx=0;
2297 uint32_t recvBufLen;
2298 E2setupResponse_t *e2SetRspMsg=NULL;
2299 E2nodeComponentConfigAdditionAck_List_t *e2NodeCfgAckList=NULL;
2300 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem=NULL;
2302 DU_LOG("\nINFO --> E2AP : E2 Setup Response received");
2303 duCb.e2Status = TRUE; //Set E2 status as true
2304 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
2306 for(arrIdx=0; arrIdx<e2SetRspMsg->protocolIEs.list.count; arrIdx++)
2308 switch(e2SetRspMsg->protocolIEs.list.array[arrIdx]->id)
2310 case ProtocolIE_IDE2_id_TransactionID:
2312 transId = e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
2313 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
2314 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
2316 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
2320 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
2321 invalidTransId = true;
2326 case ProtocolIE_IDE2_id_GlobalRIC_ID:
2328 /* To store the Ric Id Params */
2329 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value\
2330 .choice.GlobalRIC_ID.pLMN_Identity.size);
2331 memcpy(&duCb.e2apDb.ricId.plmnId, e2SetRspMsg->protocolIEs.list.array[arrIdx]\
2332 ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen);
2333 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.ric_ID, &duCb.e2apDb.ricId);
2334 /*TODO : duCb.e2apDb.ricId.plmnId memory to be deallocated after the usage */
2338 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
2340 e2NodeCfgAckList = &e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
2341 for(idx =0; idx <e2NodeCfgAckList->list.count; idx++)
2343 e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeCfgAckList->list.array[idx];
2344 handleE2NodeConfigUpdateAckIes((PTR)&e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item,\
2345 ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck);
2352 DU_LOG("\nERROR --> E2AP : Invalid IE received in E2SetupRsp:%ld",
2353 e2SetRspMsg->protocolIEs.list.array[arrIdx]->id);
2358 if(invalidTransId == true)
2363 freeAperDecodingOfE2SetupRsp(e2SetRspMsg);
2365 if(invalidTransId == false)
2367 if(duSendE2NodeConfigurationUpdate() != ROK)
2369 DU_LOG("\nERROR --> E2AP : Failed to send E2 node config update");
2374 /*******************************************************************
2376 * @brief Free RIC Subscription Request
2380 * Function : freeAperDecodingOfRicSubsReq
2382 * Functionality : Free RIC Subscription Request
2386 ******************************************************************/
2387 void freeAperDecodingOfRicSubsReq(RICsubscriptionRequest_t *ricSubscriptionReq)
2390 uint8_t elementIdx = 0;
2391 RICsubscriptionDetails_t *subsDetails = NULLP;
2392 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
2394 if(ricSubscriptionReq->protocolIEs.list.array)
2396 for(idx=0; idx < ricSubscriptionReq->protocolIEs.list.count; idx++)
2398 switch(ricSubscriptionReq->protocolIEs.list.array[idx]->id)
2400 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
2402 subsDetails = &(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails);
2403 free(subsDetails->ricEventTriggerDefinition.buf);
2405 if(subsDetails->ricAction_ToBeSetup_List.list.array)
2407 for(elementIdx = 0; elementIdx < subsDetails->ricAction_ToBeSetup_List.list.count; elementIdx++)
2409 if(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
2411 actionItem = (RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx];
2412 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
2414 free(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf);
2415 free(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition);
2417 free(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx]);
2420 free(subsDetails->ricAction_ToBeSetup_List.list.array);
2425 free(ricSubscriptionReq->protocolIEs.list.array[idx]);
2427 free(ricSubscriptionReq->protocolIEs.list.array);
2431 /*******************************************************************
2433 * @brief Free Event Trigger Definition
2437 * Function : freeAperDecodingOfEventTriggerDef
2439 * Functionality: Free Event Trigger Definition
2441 * @params[in] E2SM-KPM Event Trigger Definition
2444 * ****************************************************************/
2445 void freeAperDecodingOfEventTriggerDef(E2SM_KPM_EventTriggerDefinition_t *eventTiggerDef)
2449 switch(eventTiggerDef->eventDefinition_formats.present)
2451 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING:
2454 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1:
2455 free(eventTiggerDef->eventDefinition_formats.choice.eventDefinition_Format1);
2461 /*******************************************************************
2463 * @brief Extract E2SM-KPM Event trigger definition
2467 * Function : extractEventTriggerDef
2469 * Functionality : This function :
2470 * - Decodes E2SM-KPM Event Trigger Definition
2471 * - Validates that even trigger style is supported by E2 node
2472 * - Stores event trigger details in local DB
2474 * @params[in] RAN Function Database structure
2475 * RIC Subscription Info to be added to RAN function
2476 * RIC Event Trigger Definition buffer received from RIC
2477 * @return ROK - success
2480 ******************************************************************/
2481 uint8_t extractEventTriggerDef(RanFunction *ranFuncDb, RicSubscription *ricSubscriptionInfo, \
2482 RICeventTriggerDefinition_t *ricEventTriggerDef, E2FailureCause *failureCause)
2484 uint8_t ret = RFAILED;
2485 uint8_t eventIdx = 0;
2486 asn_dec_rval_t rval ={0};
2487 E2SM_KPM_EventTriggerDefinition_t eventTiggerDef, *eventTiggerDefPtr = NULLP;
2489 /* Decoding E2SM-KPM Even Trigger Definition */
2490 eventTiggerDefPtr = &eventTiggerDef;
2491 memset(eventTiggerDefPtr, 0, sizeof(E2SM_KPM_EventTriggerDefinition_t));
2493 rval = aper_decode(0, &asn_DEF_E2SM_KPM_EventTriggerDefinition, (void **)&eventTiggerDefPtr, ricEventTriggerDef->buf,\
2494 ricEventTriggerDef->size, 0, 0);
2495 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2497 DU_LOG("\nERROR --> E2AP : ASN decode failed for E2SM-KPM Event Trigger Definition");
2498 failureCause->causeType = E2_PROTOCOL;
2499 failureCause->cause = E2_ABSTRACT_SYNTAX_ERROR_FALSELY_CONSTRUCTED_MESSAGE;
2503 xer_fprint(stdout, &asn_DEF_E2SM_KPM_EventTriggerDefinition, eventTiggerDefPtr);
2505 /* Validating the received event trigger definition format */
2506 for(eventIdx = 0; eventIdx < ranFuncDb->numOfEventTriggerStyleSupported; eventIdx++)
2508 if((eventTiggerDefPtr->eventDefinition_formats.present != \
2509 E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING) && \
2510 (eventTiggerDefPtr->eventDefinition_formats.present == ranFuncDb->eventTriggerStyleList[eventIdx].formatType))
2512 ricSubscriptionInfo->eventTriggerDefinition.formatType = ranFuncDb->eventTriggerStyleList[eventIdx].formatType;
2513 ricSubscriptionInfo->eventTriggerDefinition.choice.format1.reportingPeriod = \
2514 eventTiggerDefPtr->eventDefinition_formats.choice.eventDefinition_Format1->reportingPeriod;
2523 failureCause->causeType = E2_RIC_REQUEST;
2524 failureCause->cause = E2_EVENT_TRIGGER_NOT_SUPPORTED;
2526 /* Free E2SM_KPM_EventTriggerDefinition_t */
2527 freeAperDecodingOfEventTriggerDef(eventTiggerDefPtr);
2531 /*******************************************************************
2533 * @brief Free RIC Action Definition
2537 * Function : freeAperDecodingOfRicActionDefinition
2539 * Functionality: Free RIC Action Definition
2541 * @params[in] E2SM-KPM Action definition
2544 * ****************************************************************/
2545 void freeAperDecodingOfRicActionDefinition(E2SM_KPM_ActionDefinition_t *actionDef)
2547 uint8_t elementIdx = 0;
2548 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
2549 MeasurementInfoItem_t *measItem = NULLP;
2551 switch(actionDef->actionDefinition_formats.present)
2553 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
2555 if(actionDef->actionDefinition_formats.choice.actionDefinition_Format1)
2557 actionFormat1 = actionDef->actionDefinition_formats.choice.actionDefinition_Format1;
2558 if(actionFormat1->measInfoList.list.array)
2560 for(elementIdx = 0; elementIdx < actionFormat1->measInfoList.list.count; elementIdx++)
2562 if(actionFormat1->measInfoList.list.array[elementIdx])
2564 measItem = actionFormat1->measInfoList.list.array[elementIdx];
2565 switch(measItem->measType.present)
2567 case MeasurementType_PR_NOTHING:
2570 case MeasurementType_PR_measName:
2572 free(measItem->measType.choice.measName.buf);
2576 case MeasurementType_PR_measID:
2582 free(actionFormat1->measInfoList.list.array);
2584 free(actionFormat1);
2588 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2:
2589 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3:
2590 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format4:
2591 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format5:
2597 /*******************************************************************
2599 * @brief Extract Measurement Info list from action definition
2603 * Function : extractMeasInfoList
2605 * Functionality : This function :
2606 * - Traverses Measurement-to-be-subscribed list
2607 * - Validates that each measurement in Measurement-to-be-subscribed
2608 * list is supported in RAN-Function->Measurement-supported list.
2609 * - If all measurements in an action is supported by RAN function,
2610 * it is added to measurement-subscribed list in local DB
2612 * @params[in] Measurement Info supported list by RAN function
2613 * Measurement Info to be subscribed as requested by RIC
2614 * Measurement Info finally subscribed
2615 * Memory failure indicator
2616 * @return ROK - success
2619 ******************************************************************/
2620 uint8_t extractMeasInfoList(CmLListCp *measInfoSupportedList, MeasurementInfoList_t *measInfoToBeSubscribedList, \
2621 CmLListCp *measInfoSubscribedList, bool *memFailure)
2623 uint8_t elementIdx = 0;
2624 MeasurementInfoForAction *measInfoSupportedDb = NULLP;
2625 MeasurementInfo *measInfoSubscribedDb = NULLP;
2626 CmLList *supportedMeasNode = NULLP, *measToAddNode = NULLP;
2627 MeasurementInfoItem_t *measItem = NULLP;
2629 /* Validate Measurement list is supported by E2 node.
2631 * Traverse and compare the Measurement-Supported List in E2
2632 * node with Measurement-to-be-subscribed list received from RIC.
2633 * If a match is found, add it to measurement-subscription list.
2635 for(elementIdx = 0; elementIdx < measInfoToBeSubscribedList->list.count; elementIdx++)
2637 measInfoSubscribedDb = NULLP;
2638 measToAddNode = NULLP;
2639 measItem = measInfoToBeSubscribedList->list.array[elementIdx];
2641 CM_LLIST_FIRST_NODE(measInfoSupportedList, supportedMeasNode);
2642 while(supportedMeasNode)
2644 measInfoSupportedDb = (MeasurementInfoForAction*)supportedMeasNode->node;
2645 switch(measItem->measType.present)
2647 case MeasurementType_PR_measName:
2649 if(!strcmp(measInfoSupportedDb->measurementTypeName, (char *)measItem->measType.choice.measName.buf))
2651 DU_ALLOC(measInfoSubscribedDb, sizeof(MeasurementInfo));
2656 case MeasurementType_PR_measID:
2658 if(measInfoSupportedDb->measurementTypeId == measItem->measType.choice.measID)
2660 DU_ALLOC(measInfoSubscribedDb, sizeof(MeasurementInfo));
2667 DU_LOG("\nERROR -> DUAPP: Invalid Measurement-type identifier in \
2668 E2SM-KPM Action Definition Format");
2671 } /* End of switch, for measurement type identifier */
2673 /* If measurement type is supported, add to measurement-subscription list */
2674 if(measInfoSubscribedDb)
2676 measInfoSubscribedDb->measurementTypeId = measInfoSupportedDb->measurementTypeId;
2677 memcpy(measInfoSubscribedDb->measurementTypeName, measInfoSupportedDb->measurementTypeName, \
2678 strlen(measInfoSupportedDb->measurementTypeName));
2680 DU_ALLOC(measToAddNode, sizeof(CmLList));
2683 measToAddNode->node = (PTR) measInfoSubscribedDb;
2684 cmLListAdd2Tail(measInfoSubscribedList, measToAddNode);
2686 /* Break out of while loop if measurement info is found in measurement-supported list */
2691 DU_FREE(measInfoSubscribedDb, sizeof(MeasurementInfo));
2692 measInfoSubscribedDb = NULLP;
2698 supportedMeasNode = supportedMeasNode->next;
2700 } /* End of while for traversing measurement-supported list in a report style */
2702 /* If a measurement-to-be-subscribed is not found in measurement-supported list in this report style
2704 * Delete all entries from measurement-subscription list and
2705 * Break out of for loop to search in next report style */
2706 if(!measInfoSubscribedDb)
2708 deleteMeasurementInfoList(measInfoSubscribedList);
2712 } /* End of for loop , traversing measurement-to-be-subscribed list */
2714 /* If all measurement-to-be-subscribed was found in measurement-supported list and
2715 * was added to measurement-subscription list successfully, return from here */
2716 if(measInfoToBeSubscribedList->list.count == measInfoSubscribedList->count)
2722 /*******************************************************************
2724 * @brief Extract E2SM-KPM Action definition
2728 * Function : extractRicActionDef
2730 * Functionality : This function :
2731 * - Decodes E2SM-KPM Action Definition
2732 * - Validates that action is supported by E2 node
2733 * - Stores action details in local DB
2735 * @params[in] RAN Function Database structure
2736 * RIC subscription's Action definition to be added to
2738 * RIC Action Definition buffer received from RIC
2739 * @return ROK - success
2742 ******************************************************************/
2743 uint8_t extractRicActionDef(RanFunction *ranFuncDb, ActionDefinition *actionDefDb, RICactionDefinition_t *ricActionDef,\
2744 E2FailureCause *failureCause)
2746 bool memFailure = false;
2747 uint8_t styleIdx = 0;
2748 asn_dec_rval_t rval ={0};
2750 E2SM_KPM_ActionDefinition_t actionDef, *actionDefPtr = NULLP;
2751 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
2752 CmLListCp *measInfoSupportedList = NULLP;
2753 CmLListCp *measInfoSubscribedList = NULLP;
2755 /* Decoding E2SM-KPM Action Definition */
2756 actionDefPtr = &actionDef;
2757 memset(actionDefPtr, 0, sizeof(E2SM_KPM_EventTriggerDefinition_t));
2759 rval = aper_decode(0, &asn_DEF_E2SM_KPM_ActionDefinition, (void **)&actionDefPtr, ricActionDef->buf,\
2760 ricActionDef->size, 0, 0);
2761 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2763 DU_LOG("\nERROR --> E2AP : ASN decode failed for E2SM-KPM Action Definition");
2764 failureCause->causeType = E2_PROTOCOL;
2765 failureCause->cause = E2_ABSTRACT_SYNTAX_ERROR_FALSELY_CONSTRUCTED_MESSAGE;
2769 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, actionDefPtr);
2772 /* Validate if Report style to subscribe is supported by E2 Node */
2773 for(styleIdx= 0; styleIdx < ranFuncDb->numOfReportStyleSupported; styleIdx++)
2775 /* Validate Report style type and report style format type is supported by E2 Node */
2776 if((ranFuncDb->reportStyleList[styleIdx].reportStyle.styleType == actionDefPtr->ric_Style_Type) &&
2777 (ranFuncDb->reportStyleList[styleIdx].reportStyle.formatType == actionDefPtr->actionDefinition_formats.present))
2779 /* Fetch Report stype type and format type */
2780 actionDefDb->styleType = actionDefPtr->ric_Style_Type;
2781 actionDefDb->formatType = actionDefPtr->actionDefinition_formats.present;
2783 switch(actionDefPtr->actionDefinition_formats.present)
2785 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
2787 actionFormat1 = actionDefPtr->actionDefinition_formats.choice.actionDefinition_Format1;
2789 /* Fetch granularity period */
2790 actionDefDb->choice.format1.granularityPeriod = actionFormat1->granulPeriod;
2792 /* Validate and add the Measurement to subscription list */
2793 measInfoSupportedList = &ranFuncDb->reportStyleList[styleIdx].measurementInfoList;
2794 measInfoSubscribedList = &actionDefDb->choice.format1.measurementInfoList;
2795 if(extractMeasInfoList(measInfoSupportedList, &actionFormat1->measInfoList, \
2796 measInfoSubscribedList, &memFailure) == ROK)
2800 /* Free E2SM_KPM_ActionDefinition_t */
2801 freeAperDecodingOfRicActionDefinition(actionDefPtr);
2806 break; /* End of E2SM-KPM Action definition format 1 case */
2811 DU_LOG("\nERROR -> DUAPP: Only E2SM-KPM Action Definition Format 1 is supported");
2814 } /* End of switch for E2SM-KPM Action definition formats */
2819 failureCause->causeType = E2_MISCELLANEOUS;
2820 failureCause->cause = E2_MISCELLANEOUS_CAUSE_UNSPECIFIED;
2823 } /* End of for loop, traversing Report-styles-supported list in E2 node */
2825 /* Memset action Db and Free E2SM_KPM_ActionDefinition_t */
2826 memset(actionDefDb, 0, sizeof(ActionDefinition));
2827 freeAperDecodingOfRicActionDefinition(actionDefPtr);
2829 if(failureCause->causeType == E2_NOTHING)
2831 failureCause->causeType = E2_RIC_REQUEST;
2832 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2837 /*******************************************************************
2839 * @brief Extract RIC Action to be setup
2843 * Function : extractRicActionToBeSetup
2845 * Functionality : This function :
2846 * - Validates that each action-to-be-setup is supported by E2 node
2847 * - Stores event trigger details in local DB
2849 * @params[in] RAN Function Database structure
2850 * RIC Subscription Info to be added to RAN function
2851 * RIC Action To Be Setup List received from RIC
2852 * @return ROK - success
2855 ******************************************************************/
2856 uint8_t extractRicActionToBeSetup(RanFunction *ranFuncDb, RicSubscription *ricSubscriptionInfo, \
2857 RICactions_ToBeSetup_List_t *actionList, E2FailureCause *failureCause, PendingSubsRspInfo *subsRsp)
2859 uint8_t actionIdx = 0;
2860 uint8_t ricActionId = 0;
2861 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
2863 if(actionList->list.array)
2865 for(actionIdx = 0; actionIdx < actionList->list.count; actionIdx++)
2867 actionItem =(RICaction_ToBeSetup_ItemIEs_t *)actionList->list.array[actionIdx];
2868 switch(actionItem->id)
2870 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
2872 /* If Action type is REPORT and
2873 * If RIC action definition's extraction and validation passes,
2875 * This action is added to action sequence list of subscription info */
2876 ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
2878 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType == RICactionType_report)
2880 ricSubscriptionInfo->actionSequence[ricActionId].actionId = ricActionId;
2881 ricSubscriptionInfo->actionSequence[ricActionId].type = REPORT;
2883 if(extractRicActionDef(ranFuncDb, &ricSubscriptionInfo->actionSequence[ricActionId].definition, \
2884 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, failureCause) == ROK)
2886 ricSubscriptionInfo->actionSequence[ricActionId].action = CONFIG_ADD;
2887 ricSubscriptionInfo->numOfActions++;
2892 /* In case of any failure, action is rejected
2893 * Added to rejected-action-list in subscription response */
2894 deleteActionSequence(&ricSubscriptionInfo->actionSequence[ricActionId]);
2896 subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].id = ricActionId;
2897 if(failureCause->causeType == E2_NOTHING)
2899 failureCause->causeType = E2_RIC_REQUEST;
2900 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2902 memcpy(&subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].failureCause, \
2903 failureCause, sizeof(E2FailureCause));
2904 subsRsp->numOfRejectedActions++;
2908 DU_LOG("\nERROR --> E2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
2914 /* If there is even 1 action that can be added, return ROK */
2915 if(ricSubscriptionInfo->numOfActions)
2918 if(failureCause->causeType == E2_NOTHING)
2920 failureCause->causeType = E2_RIC_REQUEST;
2921 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2926 /******************************************************************
2928 * @brief Processes RIC Subscription Req sent by RIC
2932 * Function : procRicSubscriptionRequest
2934 * Functionality: Processes RIC Subscription Request from RIC
2936 * @params[in] E2AP_PDU_t ASN decoded E2AP message
2937 * @return ROK - success
2940 * ****************************************************************/
2941 uint8_t procRicSubscriptionRequest(E2AP_PDU_t *e2apMsg)
2943 uint8_t idx = 0, actionIdx = 0;
2945 uint16_t ranFuncId = 0;
2946 RicRequestId ricReqId;
2947 CmLList *ricSubscriptionNode = NULLP;
2948 RanFunction *ranFuncDb = NULLP;
2949 RICsubscriptionRequest_t *ricSubsReq = NULLP;
2950 RICsubscriptionDetails_t *subsDetails = NULLP;
2951 RicSubscription *ricSubscriptionInfo = NULLP;
2952 E2FailureCause failureCause;
2954 DU_LOG("\nINFO --> E2AP : RIC Subscription request received");
2956 memset(&failureCause, 0, sizeof(E2FailureCause));
2957 memset(&ricReqId, 0, sizeof(RicRequestId));
2959 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
2960 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
2962 if(ricSubsReq->protocolIEs.list.array[idx])
2964 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
2966 case ProtocolIE_IDE2_id_RICrequestID:
2968 ricReqId.requestorId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID;
2969 ricReqId.instanceId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID;
2974 case ProtocolIE_IDE2_id_RANfunctionID:
2976 ranFuncId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID;
2978 /* Validating RAN Function id */
2979 ranFuncDb = fetchRanFuncFromRanFuncId(ranFuncId);
2983 failureCause.causeType = E2_RIC_REQUEST;
2984 failureCause.cause = E2_RAN_FUNCTION_ID_INVALID;
2989 if(ranFuncDb->numPendingSubsRsp >= MAX_PENDING_SUBSCRIPTION_RSP)
2991 failureCause.causeType = E2_RIC_REQUEST;
2992 failureCause.cause = E2_FUNCTION_RESOURCE_LIMIT;
2997 DU_ALLOC(ricSubscriptionInfo, sizeof(RicSubscription));
2998 if(!ricSubscriptionInfo)
3000 DU_LOG("\nERROR --> E2AP : Memory allocation failed for ricSubscriptionInfo");
3001 failureCause.causeType = E2_MISCELLANEOUS;
3002 failureCause.cause = E2_MISCELLANEOUS_CAUSE_UNSPECIFIED;
3006 ricSubscriptionInfo->requestId.requestorId = ricReqId.requestorId;
3007 ricSubscriptionInfo->requestId.instanceId = ricReqId.instanceId;
3008 ricSubscriptionInfo->ranFuncId = ranFuncId;
3010 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
3012 ricSubscriptionInfo->actionSequence[actionIdx].actionId = -1;
3015 memset(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp], 0, sizeof(PendingSubsRspInfo));
3016 memcpy(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp].requestId,
3017 &ricReqId, sizeof(RicRequestId));
3018 ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp].ranFuncId = ranFuncId;
3022 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
3024 subsDetails = &ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails;
3026 /* Decode, Validate and record Event Trigger Definition */
3027 if(extractEventTriggerDef(ranFuncDb, ricSubscriptionInfo, &subsDetails->ricEventTriggerDefinition, \
3028 &failureCause) != ROK)
3034 /* Decode, Validate and record RIC actions */
3035 if(extractRicActionToBeSetup(ranFuncDb, ricSubscriptionInfo, &subsDetails->ricAction_ToBeSetup_List, \
3036 &failureCause, &ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp]) != ROK)
3045 DU_LOG("\nERROR --> E2AP : Invalid IE received in RIC SubsReq:%ld",
3046 ricSubsReq->protocolIEs.list.array[idx]->id);
3055 freeAperDecodingOfRicSubsReq(ricSubsReq);
3059 cmInitTimers(&(ricSubscriptionInfo->ricSubsReportTimer), 1);
3060 ricSubscriptionInfo->action = CONFIG_ADD;
3062 /* Add RAN subcription detail to RAN function */
3063 DU_ALLOC(ricSubscriptionNode, sizeof(CmLList));
3064 if(ricSubscriptionNode)
3066 ricSubscriptionNode->node = (PTR) ricSubscriptionInfo;
3067 cmLListAdd2Tail(&ranFuncDb->subscriptionList, ricSubscriptionNode);
3070 ranFuncDb->numPendingSubsRsp++;
3072 #ifdef KPI_CALCULATION
3073 /* Send statistics request to other DU entities */
3074 BuildAndSendStatsReq(ricSubscriptionInfo);
3079 DU_FREE(ricSubscriptionInfo, sizeof(RicSubscription));
3083 memset(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp], 0, sizeof(PendingSubsRspInfo));
3086 /* Send RIC Subcription Failure */
3087 BuildAndSendRicSubscriptionFailure(ricReqId, ranFuncId, failureCause);
3093 /******************************************************************
3095 * @brief Free RIC Subscription Failure
3099 * Function : FreeRicSubscriptionFailure
3101 * Functionality: Free RIC Subscription Failure
3103 * @params[in] E2AP PDU
3106 * ****************************************************************/
3107 void FreeRicSubscriptionFailure(E2AP_PDU_t *e2apMsg)
3109 uint8_t elemIdx = 0;
3110 RICsubscriptionFailure_t *ricSubscriptionFailure = NULLP;
3114 if(e2apMsg->choice.unsuccessfulOutcome)
3116 ricSubscriptionFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure;
3117 if(ricSubscriptionFailure->protocolIEs.list.array)
3119 for(elemIdx = 0; elemIdx < ricSubscriptionFailure->protocolIEs.list.count; elemIdx++)
3121 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array[elemIdx], sizeof(RICsubscriptionFailure_IEs_t));
3123 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array, ricSubscriptionFailure->protocolIEs.list.size);
3125 DU_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3127 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3131 /******************************************************************
3133 * @brief Fill and Send RIC Subscription Failure to RIC
3137 * Function : BuildAndSendRicSubscriptionFailure
3139 * Functionality: Fill and Send RIC Subscription Failure to RIC
3141 * @params[in] RIC Request ID
3144 * @return ROK - success
3147 * ****************************************************************/
3148 uint8_t BuildAndSendRicSubscriptionFailure(RicRequestId ricReqId, uint16_t ranFuncId, E2FailureCause failureCause)
3150 uint8_t ret = RFAILED;
3151 uint8_t elementCnt = 0, elemIdx = 0;
3152 E2AP_PDU_t *e2apMsg = NULLP;
3153 asn_enc_rval_t encRetVal; /* Encoder return value */
3154 RICsubscriptionFailure_t *ricSubscriptionFailure = NULLP;
3155 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
3159 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Failure\n");
3161 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3162 if(e2apMsg == NULLP)
3164 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3168 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3169 DU_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3170 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3172 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3175 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
3176 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3177 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure;
3179 ricSubscriptionFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure;
3182 ricSubscriptionFailure->protocolIEs.list.count = elementCnt;
3183 ricSubscriptionFailure->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionFailure_IEs_t *);
3184 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array, ricSubscriptionFailure->protocolIEs.list.size);
3185 if(!ricSubscriptionFailure->protocolIEs.list.array)
3187 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3191 for(elemIdx = 0; elemIdx < elementCnt; elemIdx++)
3193 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array[elemIdx], sizeof(RICsubscriptionFailure_IEs_t));
3194 if(!ricSubscriptionFailure->protocolIEs.list.array[elemIdx])
3196 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d] for IE at index [%d]", \
3197 __func__, __LINE__, elemIdx);
3201 if(elemIdx < elementCnt)
3206 /* RIC Request ID */
3207 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3208 ricSubsFailIe->id = ProtocolIE_IDE2_id_RICrequestID;
3209 ricSubsFailIe->criticality = CriticalityE2_reject;
3210 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID;
3211 ricSubsFailIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3212 ricSubsFailIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3214 /* RAN Function ID */
3215 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3216 ricSubsFailIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3217 ricSubsFailIe->criticality = CriticalityE2_reject;
3218 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID;
3219 ricSubsFailIe->value.choice.RANfunctionID = ranFuncId;
3222 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3223 ricSubsFailIe->id = ProtocolIE_IDE2_id_CauseE2;
3224 ricSubsFailIe->criticality = CriticalityE2_reject;
3225 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_CauseE2;
3226 fillE2Cause(&ricSubsFailIe->value.choice.CauseE2, failureCause);
3228 /* Prints the Msg formed */
3229 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3230 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3232 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3233 if(encRetVal.encoded == ENCODE_FAIL)
3235 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Failure Message (at %s)\n",\
3236 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3241 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Failure Message \n");
3242 #ifdef DEBUG_ASN_PRINT
3243 for(int i=0; i< encBufSize; i++)
3245 printf("%x",encBuf[i]);
3250 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
3252 DU_LOG("\nINFO --> E2AP : Sending RIC Subscription Failure");
3258 FreeRicSubscriptionFailure(e2apMsg);
3262 /*******************************************************************
3264 * @brief Free the RicIndication Message
3268 * Function : FreeRicIndication
3270 * Functionality: Free the RicIndication Message
3275 ******************************************************************/
3276 void FreeRicIndication(E2AP_PDU_t *e2apMsg)
3279 RICindication_t *ricIndicationMsg= NULLP;
3281 if(e2apMsg != NULLP)
3283 if(e2apMsg->choice.initiatingMessage != NULLP)
3285 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
3286 if(ricIndicationMsg!= NULLP)
3288 if(ricIndicationMsg->protocolIEs.list.array != NULLP)
3290 for(idx=0; idx<ricIndicationMsg->protocolIEs.list.count; idx++)
3292 if(ricIndicationMsg->protocolIEs.list.array[idx] != NULLP)
3294 switch(ricIndicationMsg->protocolIEs.list.array[idx]->id)
3296 case ProtocolIE_IDE2_id_RICrequestID:
3297 case ProtocolIE_IDE2_id_RANfunctionID:
3298 case ProtocolIE_IDE2_id_RICactionID:
3299 case ProtocolIE_IDE2_id_RICindicationType:
3302 case ProtocolIE_IDE2_id_RICindicationHeader:
3304 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf,\
3305 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
3308 case ProtocolIE_IDE2_id_RICindicationMessage:
3310 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf,\
3311 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
3317 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx],sizeof(RICindication_IEs_t));
3320 DU_FREE(ricIndicationMsg->protocolIEs.list.array,ricIndicationMsg->protocolIEs.list.size);
3323 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
3325 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3329 /*******************************************************************
3331 * @brief Free measurement record
3335 * Function : freeMeasRecord
3337 * Functionality: Free all measurement recorded for a measurement
3338 * within an action in a RIC subscription
3340 * @param Measurement data to be freed
3343 ******************************************************************/
3344 void freeMeasData(MeasurementData_t *measData)
3346 uint8_t measIdx = 0, measRecIdx = 0;
3347 MeasurementRecord_t *measRecord = NULLP;
3349 if(measData->list.array)
3351 for(measIdx = 0; measIdx < measData->list.count; measIdx++)
3353 if(measData->list.array[measIdx])
3355 measRecord = &measData->list.array[measIdx]->measRecord;
3356 if(measRecord->list.array)
3358 for(measRecIdx = 0; measRecIdx < measRecord->list.count; measRecIdx++)
3360 DU_FREE(measRecord->list.array[measRecIdx], sizeof(MeasurementRecordItem_t));
3362 DU_FREE(measRecord->list.array, measRecord->list.size);
3364 DU_FREE(measData->list.array[measIdx], sizeof(MeasurementDataItem_t));
3367 DU_FREE(measData->list.array, measData->list.size);
3371 /*******************************************************************
3373 * @brief Fill measurement info list
3377 * Function : freeMeasInfoList
3379 * Functionality: Fills all measurement info within an action
3380 * in a RIC subscription
3382 * @param Measurement Info list to be freed
3385 ******************************************************************/
3386 void freeMeasInfoList(MeasurementInfoList_t *measInfoList)
3388 uint8_t measInfoIdx = 0;
3390 if(measInfoList->list.array)
3392 for(measInfoIdx = 0; measInfoIdx < measInfoList->list.count; measInfoIdx++)
3394 if(measInfoList->list.array[measInfoIdx])
3396 DU_FREE(measInfoList->list.array[measInfoIdx]->measType.choice.measName.buf, \
3397 measInfoList->list.array[measInfoIdx]->measType.choice.measName.size);
3399 DU_FREE(measInfoList->list.array[measInfoIdx], measInfoList->list.size);
3402 DU_FREE(measInfoList->list.array, measInfoList->list.size);
3406 /*******************************************************************
3408 * @brief Free E2SM-KPM Indication Message
3412 * Function : FreeE2smKpmIndicationMessage
3414 * Functionality: Free E2SM-KPM Indication Message
3416 * @param E2SM-KPM Indication message to be freed
3419 ******************************************************************/
3420 void FreeE2smKpmIndicationMessage(E2SM_KPM_IndicationMessage_t *e2smKpmIndMsg)
3422 E2SM_KPM_IndicationMessage_Format1_t *format1Msg = NULLP;
3424 switch(e2smKpmIndMsg->indicationMessage_formats.present)
3426 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format1:
3428 if(e2smKpmIndMsg->indicationMessage_formats.choice.indicationMessage_Format1)
3430 format1Msg = e2smKpmIndMsg->indicationMessage_formats.choice.indicationMessage_Format1;
3432 /* Measurement Data */
3433 freeMeasData(&format1Msg->measData);
3435 /* Measurement Info List */
3436 if(format1Msg->measInfoList)
3438 freeMeasInfoList(format1Msg->measInfoList);
3439 DU_FREE(format1Msg->measInfoList, sizeof(MeasurementInfoList_t));
3442 /* Granularity Period */
3443 DU_FREE(format1Msg->granulPeriod, sizeof(GranularityPeriod_t));
3445 DU_FREE(format1Msg, sizeof(E2SM_KPM_IndicationMessage_Format1_t));
3450 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_NOTHING:
3451 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format2:
3457 /*******************************************************************
3459 * @brief Fill measurement record
3463 * Function : fillMeasRecord
3465 * Functionality: Fills all measurement value for a measurement
3466 * within an action in a RIC subscription
3468 * @param Measurement record to be filled
3469 * Measurement database with measurement records
3470 * @return ROK - success
3473 ******************************************************************/
3474 uint8_t fillMeasRecord(MeasurementRecord_t *measRecord, MeasurementInfo *measInfoDb)
3476 uint8_t measRecIdx = 0;
3477 CmLList *measValNode = NULLP;
3480 measRecord->list.count = measInfoDb->measuredValue.count;
3481 measRecord->list.size = measRecord->list.count * sizeof(MeasurementRecordItem_t *);
3483 DU_ALLOC(measRecord->list.array, measRecord->list.size);
3484 if(!measRecord->list.array)
3486 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3490 for(measRecIdx = 0; measRecIdx < measRecord->list.count; measRecIdx++)
3492 DU_ALLOC(measRecord->list.array[measRecIdx], sizeof(MeasurementRecordItem_t));
3493 if(!measRecord->list.array[measRecIdx])
3495 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3501 CM_LLIST_FIRST_NODE(&measInfoDb->measuredValue, measValNode);
3504 measVal = *(double *)measValNode->node;
3505 if(measVal == (int)measVal)
3507 measRecord->list.array[measRecIdx]->present = MeasurementRecordItem_PR_integer;
3508 measRecord->list.array[measRecIdx]->choice.integer = (int)measVal;
3512 measRecord->list.array[measRecIdx]->present = MeasurementRecordItem_PR_real;
3513 measRecord->list.array[measRecIdx]->choice.real = measVal;
3516 measValNode= measValNode->next;
3517 /* Once the measurement record is added to the message, delete it from DB */
3520 deleteMeasuredValueList(&measInfoDb->measuredValue);
3524 /*******************************************************************
3526 * @brief Fills measuerement data
3530 * Function : fillMeasData
3532 * Functionality: Fill all measurement recorded for all measurements
3533 * in an action in a RIC subscription
3535 * @param Measurement data to be filled
3536 * Measurement info list from an action DB
3537 * @return ROK - success
3540 ******************************************************************/
3541 uint8_t fillMeasData(MeasurementData_t *measData, CmLListCp *measInfoListDb)
3543 uint8_t measIdx = 0;
3544 CmLList *measInfoNode = NULLP;
3545 MeasurementInfo *measInfoDb = NULLP;
3546 MeasurementRecord_t *measRecord = NULLP;
3548 measData->list.count = measInfoListDb->count;
3549 measData->list.size = measData->list.count * sizeof(MeasurementDataItem_t *);
3551 DU_ALLOC(measData->list.array, measData->list.size);
3552 if(!measData->list.array)
3554 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3559 CM_LLIST_FIRST_NODE(measInfoListDb, measInfoNode);
3562 measInfoDb = (MeasurementInfo *)measInfoNode->node;
3565 DU_ALLOC(measData->list.array[measIdx], sizeof(MeasurementDataItem_t));
3566 if(!measData->list.array[measIdx])
3568 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3572 measRecord = &measData->list.array[measIdx]->measRecord;
3573 if(fillMeasRecord(measRecord, measInfoDb) != ROK)
3575 DU_LOG("\nERROR --> E2AP : Failed to fill measurement record");
3580 measInfoNode = measInfoNode->next;
3586 /*******************************************************************
3588 * @brief Fill all measurement info
3592 * Function : fillMeasInfoList
3594 * Functionality: Fills all measurement info belonging to an action
3595 * in a RIC subscription
3597 * @param Measurement Info list to be filled
3598 * Measurement Info list from E2AP DB
3599 * @return ROK - success
3602 ******************************************************************/
3603 uint8_t fillMeasInfoList(MeasurementInfoList_t *measInfoList, CmLListCp *measInfoListDb)
3605 uint8_t measInfoIdx = 0;
3606 CmLList *measInfoNode = NULLP;
3607 MeasurementInfo *measInfoDb = NULLP;
3608 MeasurementInfoItem_t *measInfoItem = NULLP;
3610 measInfoList->list.count = measInfoListDb->count;
3611 measInfoList->list.size = measInfoList->list.count * sizeof(MeasurementInfoItem_t *);
3613 DU_ALLOC(measInfoList->list.array, measInfoList->list.size);
3614 if(!measInfoList->list.array)
3616 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3621 CM_LLIST_FIRST_NODE(measInfoListDb, measInfoNode);
3624 DU_ALLOC(measInfoList->list.array[measInfoIdx], sizeof(MeasurementInfoItem_t));
3625 if(!measInfoList->list.array[measInfoIdx])
3627 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3631 measInfoItem = measInfoList->list.array[measInfoIdx];
3632 measInfoDb = (MeasurementInfo *)measInfoNode->node;
3635 /* Measurement Type */
3636 measInfoItem->measType.present = MeasurementType_PR_measName;
3637 measInfoItem->measType.choice.measName.size = strlen(measInfoDb->measurementTypeName);
3639 DU_ALLOC(measInfoItem->measType.choice.measName.buf, measInfoItem->measType.choice.measName.size);
3640 if(!measInfoItem->measType.choice.measName.buf)
3642 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3646 memcpy(measInfoItem->measType.choice.measName.buf, measInfoDb->measurementTypeName,\
3647 measInfoItem->measType.choice.measName.size);
3651 measInfoNode = measInfoNode->next;
3658 /*******************************************************************
3660 * @brief Fill E2SM-KPM Indication Message Format 1
3664 * Function : fillE2smKpmIndMsgFormat1
3666 * Functionality: Fill E2SM-KPM Indication Message Format 1
3668 * @param Format 1 Message to be filled
3669 * Action Definition format 1 from E2AP DB
3670 * @return ROK - success
3673 ******************************************************************/
3674 uint8_t fillE2smKpmIndMsgFormat1(E2SM_KPM_IndicationMessage_Format1_t *format1Msg, ActionDefFormat1 *format1)
3676 /* Measurement Data */
3677 if(fillMeasData(&format1Msg->measData, &format1->measurementInfoList) != ROK)
3679 DU_LOG("\nERROR --> E2AP : Failed to fill measurement data");
3683 /* Measurement Information */
3684 DU_ALLOC(format1Msg->measInfoList, sizeof(MeasurementInfoList_t));
3685 if(!format1Msg->measInfoList)
3687 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3691 if(fillMeasInfoList(format1Msg->measInfoList, &format1->measurementInfoList) != ROK)
3693 DU_LOG("\nERROR --> E2AP : Failed to fill measurement information list");
3697 /* Granularity Period */
3698 DU_ALLOC(format1Msg->granulPeriod, sizeof(GranularityPeriod_t));
3699 if(!format1Msg->granulPeriod)
3701 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3704 *(format1Msg->granulPeriod) = format1->granularityPeriod;
3709 /*******************************************************************
3711 * @brief Fill RIC Indication Message buffer
3715 * Function : fillRicIndMsgBuf
3717 * Functionality: Fill E2SM-KPM Indication Message
3718 * Encode this message and copy to RIC Indication Message buffer
3720 * @param RIC Indication Message buffer to be filled
3721 * Source action info from E2AP DB
3722 * @return ROK - success
3725 ******************************************************************/
3726 uint8_t fillRicIndMsgBuf(RICindicationMessage_t *ricIndMsgBuf, ActionInfo *actionInfo)
3728 uint8_t ret = RFAILED;
3729 bool failedInFormat = false;
3730 E2SM_KPM_IndicationMessage_t e2smKpmIndMsg;
3731 asn_enc_rval_t encRetVal; /* Encoder return value */
3733 memset(&e2smKpmIndMsg, 0, sizeof(E2SM_KPM_IndicationMessage_t));
3737 /* E2SM-KPM Indication message format type */
3738 e2smKpmIndMsg.indicationMessage_formats.present = actionInfo->definition.formatType;
3739 switch(e2smKpmIndMsg.indicationMessage_formats.present)
3741 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format1:
3743 /* E2SM-KPM Indication message format 1 */
3744 DU_ALLOC(e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1, \
3745 sizeof(E2SM_KPM_IndicationMessage_Format1_t));
3746 if(!e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1)
3748 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3749 failedInFormat = true;
3753 if(fillE2smKpmIndMsgFormat1(e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1, \
3754 &actionInfo->definition.choice.format1) != ROK)
3756 DU_LOG("\nERROR --> E2AP : Failed to fill E2SM-KPM Indication message format 1");
3757 failedInFormat = true;
3763 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_NOTHING:
3764 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format2:
3767 DU_LOG("\nERROR --> E2AP : fillRicIndMsgBuf: Only Format 1 supported");
3768 failedInFormat = true;
3776 /* Encode E2SM-KPM Indication Message */
3777 xer_fprint(stdout, &asn_DEF_E2SM_KPM_IndicationMessage, &e2smKpmIndMsg);
3778 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3780 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_IndicationMessage, 0, &e2smKpmIndMsg, PrepFinalEncBuf, encBuf);
3781 if(encRetVal.encoded == ENCODE_FAIL)
3783 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM Indication Message (at %s)\n",\
3784 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3789 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SM-KPM Indication Message \n");
3790 #ifdef DEBUG_ASN_PRINT
3791 for(int i=0; i< encBufSize; i++)
3793 printf("%x",encBuf[i]);
3798 /* Copy encoded string to RIC Indication Message buffer */
3799 ricIndMsgBuf->size = encBufSize;
3800 DU_ALLOC(ricIndMsgBuf->buf, ricIndMsgBuf->size);
3801 if(!ricIndMsgBuf->buf)
3803 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3806 memset(ricIndMsgBuf->buf, 0, ricIndMsgBuf->size);
3807 memcpy(ricIndMsgBuf->buf, encBuf, encBufSize);
3813 /* Free E2SM-KPM Indication Message */
3814 FreeE2smKpmIndicationMessage(&e2smKpmIndMsg);
3819 /*******************************************************************
3821 * @brief Free E2SM-KPM Indication Header
3825 * Function : FreeE2smKpmIndicationHeader
3827 * Functionality: Free E2SM-KPM Indication Header
3829 * @param E2SM-KPM Indication Header to be free
3832 ******************************************************************/
3833 void FreeE2smKpmIndicationHeader(E2SM_KPM_IndicationHeader_t *e2smKpmIndHdr)
3835 E2SM_KPM_IndicationHeader_Format1_t *format1 = NULLP;
3839 switch(e2smKpmIndHdr->indicationHeader_formats.present)
3841 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_indicationHeader_Format1:
3843 if(e2smKpmIndHdr->indicationHeader_formats.choice.indicationHeader_Format1)
3845 format1 = e2smKpmIndHdr->indicationHeader_formats.choice.indicationHeader_Format1;
3847 DU_FREE(format1->colletStartTime.buf, format1->colletStartTime.size);
3848 DU_FREE(format1, sizeof(E2SM_KPM_IndicationHeader_Format1_t));
3852 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_NOTHING:
3859 /*******************************************************************
3861 * @brief Fill RIC Indication Header buffer
3865 * Function : fillRicIndHeader
3867 * Functionality: Fill E2SM-KPM Indication Header
3868 * Encode this message and copy to RIC Indication Header buffer
3870 * @param RIC Indication Header buffer to be filled
3871 * Source RIC subscription info from E2AP DB
3872 * @return ROK - success
3875 ******************************************************************/
3876 uint8_t fillRicIndHeader(RICindicationHeader_t *ricIndHdr, RicSubscription *ricSubsInfo)
3878 uint8_t ret = RFAILED;
3879 uint8_t secBufIdx = 0, milliSecBufIdx = 0;
3881 bool formatFailure = false;
3882 RanFunction *ranFunc = NULLP;
3883 ReportStartTime *startTime = NULLP;
3884 E2SM_KPM_IndicationHeader_t e2smKpmIndHdr;
3885 E2SM_KPM_IndicationHeader_Format1_t *format1 = NULLP;
3886 asn_enc_rval_t encRetVal; /* Encoder return value */
3890 ranFunc = fetchRanFuncFromRanFuncId(ricSubsInfo->ranFuncId);
3891 if(ranFunc == NULLP)
3893 DU_LOG("\nERROR --> E2AP : RAN Function ID [%d] not found", ricSubsInfo->ranFuncId);
3897 memset(&e2smKpmIndHdr, 0, sizeof(E2SM_KPM_IndicationHeader_t));
3899 e2smKpmIndHdr.indicationHeader_formats.present = ranFunc->ricIndicationHeaderFormat;
3900 switch(e2smKpmIndHdr.indicationHeader_formats.present)
3902 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_indicationHeader_Format1:
3904 DU_ALLOC(e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1, \
3905 sizeof(E2SM_KPM_IndicationHeader_Format1_t));
3906 if(!e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1)
3908 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3909 formatFailure = true;
3912 format1 = e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1;
3914 /* Fetch reporting period start time from DB */
3915 switch(ricSubsInfo->eventTriggerDefinition.formatType)
3919 startTime = &ricSubsInfo->eventTriggerDefinition.choice.format1.startTime;
3923 format1->colletStartTime.size = 8 * sizeof(uint8_t);
3924 DU_ALLOC(format1->colletStartTime.buf, format1->colletStartTime.size);
3925 if(!format1->colletStartTime.buf)
3927 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3928 formatFailure = true;
3932 /* As per O-RAN.WG3.E2SM-KPM-R003-v03.00, section 8.3.12 and
3933 * RFC 5905, section 6 :
3934 * Time stamp has a 64-bit format where first 32-bit is seconds
3935 * and next 32-bit is fraction in picosecond-level.
3936 * This fraction has been rounded in microseconds.
3939 * Storing 32-bit seconds at MSB 0-3 and
3940 * 32-bit milliseconds at next 4 bytes i.e. bytes 4-7
3944 for(byteIdx = 3; byteIdx >= 0; byteIdx--)
3946 format1->colletStartTime.buf[secBufIdx++] = startTime->timeInSec >> (8*byteIdx);
3947 format1->colletStartTime.buf[milliSecBufIdx++] = startTime->timeInMilliSec >> (8*byteIdx);
3952 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_NOTHING:
3955 DU_LOG("\nERROR --> E2AP : Only E2SM-KPM Indication Header Format 1 supported");
3956 formatFailure = true;
3964 /* Encode E2SM-KPM Indication Header */
3965 xer_fprint(stdout, &asn_DEF_E2SM_KPM_IndicationHeader, &e2smKpmIndHdr);
3966 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3968 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_IndicationHeader, 0, &e2smKpmIndHdr, PrepFinalEncBuf, encBuf);
3969 if(encRetVal.encoded == ENCODE_FAIL)
3971 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM Indication Header (at %s)\n",\
3972 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3977 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SM-KPM Indication Header \n");
3978 #ifdef DEBUG_ASN_PRINT
3979 for(int i=0; i< encBufSize; i++)
3981 printf("%x",encBuf[i]);
3986 /* Copy encoded string to RIC Indication Header buffer */
3987 ricIndHdr->size = encBufSize;
3988 DU_ALLOC(ricIndHdr->buf, ricIndHdr->size);
3991 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3994 memset(ricIndHdr->buf, 0, ricIndHdr->size);
3995 memcpy(ricIndHdr->buf, encBuf, encBufSize);
4000 /* Free E2SM-KPM Indication Header */
4001 FreeE2smKpmIndicationHeader(&e2smKpmIndHdr);
4006 /*******************************************************************
4008 * brief Fill the RIC Indication Message
4012 * Function : fillRicIndication
4014 * Functionality: Fills the RIC Indication Message
4016 * @param RIC Indication Message to be filled
4017 * RIC Subscription DB
4019 * @return ROK - success
4022 ******************************************************************/
4023 uint8_t fillRicIndication(RICindication_t *ricIndicationMsg, RicSubscription *ricSubscriptionInfo, ActionInfo *actionInfo)
4025 uint8_t elementCnt = 0, idx = 0;
4030 ricIndicationMsg->protocolIEs.list.count = elementCnt;
4031 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_IEs_t *);
4033 /* Initialize the Ric Indication members */
4034 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, ricIndicationMsg->protocolIEs.list.size);
4035 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
4037 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
4041 for(idx=0; idx<elementCnt; idx++)
4043 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx], sizeof(RICindication_IEs_t));
4044 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
4046 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
4051 /* RIC Request ID */
4053 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
4054 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4055 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICrequestID;
4056 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = \
4057 ricSubscriptionInfo->requestId.requestorId;
4058 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = \
4059 ricSubscriptionInfo->requestId.instanceId;
4061 /* RAN Function ID */
4063 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
4064 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4065 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RANfunctionID;
4066 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ricSubscriptionInfo->ranFuncId;
4070 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
4071 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4072 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICactionID;
4073 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID = actionInfo->actionId;
4075 /* RIC Indication Type */
4077 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
4078 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4079 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationType;
4080 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType = actionInfo->type;
4082 /* RIC Indication Header */
4084 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
4085 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4086 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationHeader;
4087 if(fillRicIndHeader(&ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader, \
4088 ricSubscriptionInfo) != ROK)
4090 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication header");
4094 /* RIC Indication Message */
4096 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
4097 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4098 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationMessage;
4099 if(fillRicIndMsgBuf(&ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage, \
4102 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication Message");
4109 /*******************************************************************
4111 * @brief Builds and Send the RicIndication Message
4115 * Function : BuildAndSendRicIndication
4117 * Functionality:Fills the RicIndication Message
4119 * @return ROK - success
4122 ******************************************************************/
4124 uint8_t BuildAndSendRicIndication(RicSubscription *ricSubscriptionInfo, ActionInfo *actionInfo)
4126 uint8_t ret = RFAILED;
4127 E2AP_PDU_t *e2apMsg = NULLP;
4128 RICindication_t *ricIndicationMsg = NULLP;
4129 asn_enc_rval_t encRetVal; /* Encoder return value */
4133 DU_LOG("\nINFO --> E2AP : Building RIC Indication Message\n");
4135 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4136 if(e2apMsg == NULLP)
4138 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4142 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4143 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4144 if(e2apMsg->choice.initiatingMessage == NULLP)
4146 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4149 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
4150 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4151 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
4153 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
4155 if(fillRicIndication(ricIndicationMsg, ricSubscriptionInfo, actionInfo) != ROK)
4157 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication message");
4161 /* Prints the Msg formed */
4162 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4163 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4165 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4167 if(encRetVal.encoded == ENCODE_FAIL)
4169 DU_LOG("\nERROR --> E2AP : Could not encode RIC Indication Message (at %s)\n",\
4170 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4175 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Indication Message \n");
4176 #ifdef DEBUG_ASN_PRINT
4177 for(int i=0; i< encBufSize; i++)
4179 printf("%x",encBuf[i]);
4184 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
4186 DU_LOG("\nINFO --> E2AP : Sending RIC Indication Message");
4192 FreeRicIndication(e2apMsg);
4196 /*******************************************************************
4198 * @brief free e2 node component configuration req and rsp
4202 * Function : freeE2NodeComponentConfiguration
4205 * - free e2 node component configuration req and rsp
4207 * @params[in] E2nodeComponentConfiguration_t *e2nodeComponentConfiguration
4208 * @return ROK - success
4211 * ****************************************************************/
4213 void freeE2NodeComponentConfiguration(E2nodeComponentConfiguration_t *e2nodeComponentConfiguration)
4215 /* Free E2 Node Component Request Part */
4216 DU_FREE(e2nodeComponentConfiguration->e2nodeComponentRequestPart.buf, e2nodeComponentConfiguration->e2nodeComponentRequestPart.size);
4218 /* Free E2 Node Component Response Part */
4219 DU_FREE(e2nodeComponentConfiguration->e2nodeComponentResponsePart.buf, e2nodeComponentConfiguration->e2nodeComponentResponsePart.size);
4223 /*******************************************************************
4225 * @brief free e2 node component component identifier
4229 * Function : freeE2NodeComponentIdentifier
4232 * - free e2 node component component identifier
4234 * @params[in] E2nodeComponentID_t *componentID
4235 * @return ROK - success
4238 * ****************************************************************/
4240 void freeE2NodeComponentIdentifier(E2nodeComponentID_t *componentID)
4242 if(componentID->choice.e2nodeComponentInterfaceTypeF1)
4244 DU_FREE(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
4245 DU_FREE(componentID->choice.e2nodeComponentInterfaceTypeF1, sizeof(E2nodeComponentInterfaceF1_t));
4250 /*******************************************************************
4252 * @brief Deallocate the memory allocated for E2nodeConfigurationUpdate msg
4256 * Function : FreeE2NodeConfigUpdate
4259 * - freeing the memory allocated for E2nodeConfigurationUpdate
4261 * @params[in] E2AP_PDU_t *e2apMsg
4262 * @return ROK - success
4265 * ****************************************************************/
4267 void FreeE2NodeConfigUpdate(E2AP_PDU_t *e2apMsg)
4269 uint8_t arrIdx =0, e2NodeUpdateListIdx=0, e2NodeRemovalListIdx=0, e2NodeAddListIdx=0;
4270 E2nodeConfigurationUpdate_t *e2NodeConfigUpdate =NULL;
4271 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList =NULL;
4272 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItem =NULL;
4273 E2nodeComponentConfigRemoval_List_t *e2NodeRemovalList =NULL;
4274 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItem =NULL;
4275 E2nodeComponentConfigAddition_List_t *e2NodeAddList =NULL;
4276 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem =NULL;
4278 if(e2apMsg != NULLP)
4280 if(e2apMsg->choice.initiatingMessage != NULLP)
4282 e2NodeConfigUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate;
4283 if(e2NodeConfigUpdate->protocolIEs.list.array != NULLP)
4285 for(arrIdx = 0; arrIdx < e2NodeConfigUpdate->protocolIEs.list.count; arrIdx++)
4287 if(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx])
4290 switch(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id)
4292 case ProtocolIE_IDE2_id_TransactionID:
4295 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
4297 e2NodeAddList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
4298 if(e2NodeAddList->list.array)
4300 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
4302 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[e2NodeAddListIdx];
4304 freeE2NodeComponentConfiguration(&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration);
4305 freeE2NodeComponentIdentifier(&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID);
4306 DU_FREE(e2NodeAddItem, sizeof(E2nodeComponentConfigAddition_ItemIEs_t));
4308 DU_FREE(e2NodeAddList->list.array, e2NodeAddList->list.size);
4312 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
4314 e2NodeUpdateList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdate_List;
4315 if(e2NodeUpdateList->list.array)
4317 for(e2NodeUpdateListIdx = 0; e2NodeUpdateListIdx< e2NodeUpdateList->list.count; e2NodeUpdateListIdx++)
4319 e2NodeUpdateItem = (E2nodeComponentConfigUpdate_ItemIEs_t *) e2NodeUpdateList->list.array[e2NodeUpdateListIdx];
4321 freeE2NodeComponentConfiguration(&e2NodeUpdateItem->value.choice.E2nodeComponentConfigUpdate_Item.e2nodeComponentConfiguration);
4322 freeE2NodeComponentIdentifier(&e2NodeUpdateItem->value.choice.E2nodeComponentConfigUpdate_Item.e2nodeComponentID);
4323 DU_FREE(e2NodeUpdateItem, sizeof(E2nodeComponentConfigUpdate_ItemIEs_t));
4325 DU_FREE(e2NodeUpdateList->list.array, e2NodeUpdateList->list.size);
4329 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
4331 e2NodeRemovalList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemoval_List;
4332 if(e2NodeRemovalList->list.array)
4334 for(e2NodeRemovalListIdx = 0; e2NodeRemovalListIdx< e2NodeRemovalList->list.count; e2NodeRemovalListIdx++)
4336 e2NodeRemovalItem = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemovalList->list.array[e2NodeRemovalListIdx];
4338 freeE2NodeComponentIdentifier(&e2NodeRemovalItem->value.choice.E2nodeComponentConfigRemoval_Item.e2nodeComponentID);
4339 DU_FREE(e2NodeRemovalItem, sizeof(E2nodeComponentConfigRemoval_ItemIEs_t));
4341 DU_FREE(e2NodeRemovalList->list.array, e2NodeRemovalList->list.size);
4349 DU_FREE(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdate_IEs_t));
4352 DU_FREE(e2NodeConfigUpdate->protocolIEs.list.array, e2NodeConfigUpdate->protocolIEs.list.size);
4354 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4356 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4360 /*******************************************************************
4362 * @brief Buld and send the E2 node config update msg
4366 * Function : BuildAndSendE2NodeConfigUpdate
4369 * - Buld and send the E2 node config update msg
4372 * @return ROK - success
4375 * ****************************************************************/
4377 uint8_t BuildAndSendE2NodeConfigUpdate(E2NodeConfigList *e2NodeList)
4379 uint8_t ret = RFAILED;
4380 uint8_t arrIdx = 0,elementCnt = 0, transId=0;
4381 E2AP_PDU_t *e2apMsg = NULLP;
4382 asn_enc_rval_t encRetVal; /* Encoder return value */
4383 E2nodeConfigurationUpdate_t *e2NodeConfigUpdate = NULLP;
4385 DU_LOG("\nINFO --> E2AP : Building E2 Node config update\n");
4388 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4389 if(e2apMsg == NULLP)
4391 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4395 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4396 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4397 if(e2apMsg->choice.initiatingMessage == NULLP)
4399 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4402 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4403 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
4404 e2apMsg->choice.initiatingMessage->value.present = \
4405 InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate;
4406 e2NodeConfigUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate;
4409 if(e2NodeList->addE2NodeCount)
4411 if(e2NodeList->updateE2NodeCount)
4413 if(e2NodeList->removeE2NodeCount)
4416 e2NodeConfigUpdate->protocolIEs.list.count = elementCnt;
4417 e2NodeConfigUpdate->protocolIEs.list.size = elementCnt * sizeof(E2nodeConfigurationUpdate_IEs_t*);
4418 DU_ALLOC(e2NodeConfigUpdate->protocolIEs.list.array, e2NodeConfigUpdate->protocolIEs.list.size);
4419 if(e2NodeConfigUpdate->protocolIEs.list.array == NULLP)
4421 DU_LOG("\nERROR --> E2AP : Memory allocation for e2NodeConfigUpdate failed");
4425 for(arrIdx =0; arrIdx<elementCnt; arrIdx++)
4427 DU_ALLOC(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdate_IEs_t));
4428 if(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx] == NULLP)
4431 DU_LOG("\nERROR --> E2AP : Memory allocation for e2NodeConfigUpdate failed");
4436 if(arrIdx<elementCnt)
4440 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4441 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4442 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_TransactionID;
4443 transId = assignTransactionId();
4444 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
4446 if(e2NodeList->addE2NodeCount)
4449 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition;
4450 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4451 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigAddition_List;
4452 if(BuildE2NodeConfigAddList(&(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List),\
4453 ProcedureCodeE2_id_E2nodeConfigurationUpdate, e2NodeList->addE2NodeCount, e2NodeList->addE2Node)!=ROK)
4455 DU_LOG("\nERROR --> E2AP : Failed to create E2 Node config list");
4460 if(e2NodeList->updateE2NodeCount)
4463 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate;
4464 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4465 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigUpdate_List;
4466 if(BuildE2NodeConfigUpdateList(&e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdate_List,\
4467 e2NodeList->updateE2NodeCount, e2NodeList->updateE2Node) != ROK)
4470 DU_LOG("\nERROR --> E2AP : Failed to update the E2 node configuration");
4475 if(e2NodeList->removeE2NodeCount)
4478 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval;
4479 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4480 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigRemoval_List;
4481 if(BuildE2NodeConfigRemoveList(&e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemoval_List,\
4482 e2NodeList->removeE2NodeCount, e2NodeList->removeE2Node) != ROK)
4485 DU_LOG("\nERROR --> E2AP : Failed to remove the E2 node configuration");
4490 /* Prints the Msg formed */
4491 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4493 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4495 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
4496 if(encRetVal.encoded == ENCODE_FAIL)
4498 DU_LOG("\nERROR --> E2AP : Could not encode E2nodeConfigurationUpdate structure (at %s)\n",\
4499 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4504 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2nodeConfigurationUpdate\n");
4505 #ifdef DEBUG_ASN_PRINT
4506 for(int i=0; i< encBufSize; i++)
4508 printf("%x",encBuf[i]);
4512 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize))
4514 DU_LOG("\nERROR --> E2AP : Sending E2 node config update failed");
4518 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
4519 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
4520 memcpy(&duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.configList, e2NodeList, sizeof(E2NodeConfigList));
4525 FreeE2NodeConfigUpdate(e2apMsg);
4529 /*******************************************************************
4531 * @brief Deallocate the memory allocated for E2ResetRequest msg
4535 * Function : FreeE2ResetRequest
4538 * - freeing the memory allocated for E2ResetRequest
4540 * @params[in] E2AP_PDU_t *e2apMsg
4541 * @return ROK - success
4544 * ****************************************************************/
4545 void FreeE2ResetRequest(E2AP_PDU_t *e2apMsg)
4548 ResetRequestE2_t *resetReq = NULLP;
4550 if(e2apMsg != NULLP)
4552 if(e2apMsg->choice.initiatingMessage != NULLP)
4554 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4555 if(resetReq->protocolIEs.list.array)
4557 for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4559 DU_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4561 DU_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4563 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4565 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4569 /*******************************************************************
4571 * @brief Build and send the E2 reset request msg
4575 * Function : BuildAndSendE2ResetRequest
4578 * - Buld and send the E2 reset request msg to RIC
4582 * @return ROK - success
4585 * ****************************************************************/
4586 uint8_t BuildAndSendE2ResetRequest(E2FailureCause resetCause)
4588 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
4589 uint8_t ret = RFAILED;
4590 E2AP_PDU_t *e2apMsg = NULLP;
4591 ResetRequestE2_t *resetReq = NULLP;
4592 asn_enc_rval_t encRetVal; /* Encoder return value */
4594 DU_LOG("\nINFO --> E2AP : Building E2 Reset Request\n");
4598 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4599 if(e2apMsg == NULLP)
4601 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation for E2AP-PDU failed");
4605 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4606 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4607 if(e2apMsg->choice.initiatingMessage == NULLP)
4609 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation for initiatingMessage");
4613 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
4614 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4615 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
4616 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4619 resetReq->protocolIEs.list.count = elementCnt;
4620 resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
4622 DU_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4623 if(!resetReq->protocolIEs.list.array)
4625 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation failed for \
4626 Reset Request IE array");
4630 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4632 DU_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4633 if(!resetReq->protocolIEs.list.array[ieIdx])
4635 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation failed for \
4636 Reset Request IE array element");
4641 /* In case of failure */
4642 if(ieIdx < elementCnt)
4646 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4647 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
4648 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
4649 transId = assignTransactionId();
4650 resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
4653 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4654 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
4655 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
4656 fillE2Cause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, resetCause);
4658 /* Prints the Msg formed */
4659 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4661 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4663 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4665 if(encRetVal.encoded == ENCODE_FAIL)
4667 DU_LOG("\nERROR --> E2AP : Could not encode reset request structure (at %s)\n",\
4668 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4673 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for reset request\n");
4674 #ifdef DEBUG_ASN_PRINT
4675 for(int i=0; i< encBufSize; i++)
4677 printf("%x",encBuf[i]);
4681 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
4683 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
4687 /* In case the message is sent successfully, store the transaction info to
4688 * be used when response is received */
4689 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
4690 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
4696 /* Free all memory */
4697 FreeE2ResetRequest(e2apMsg);
4701 /*******************************************************************
4703 * @brief Deallocate the memory allocated for Reset Response msg
4707 * Function : freeAperDecodingOfE2ResetRsp
4710 * - freeing the memory allocated for Reset response
4712 * @params[in] ResetResponseE2_t *resetResponse
4715 * ****************************************************************/
4716 void freeAperDecodingOfE2ResetRsp(ResetResponseE2_t *resetResponse)
4722 if(resetResponse->protocolIEs.list.array)
4724 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
4726 if(resetResponse->protocolIEs.list.array[ieIdx])
4728 switch(resetResponse->protocolIEs.list.array[ieIdx]->id)
4730 case ProtocolIE_IDE2_id_TransactionID:
4733 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4736 free(resetResponse->protocolIEs.list.array[ieIdx]);
4739 free(resetResponse->protocolIEs.list.array);
4744 /******************************************************************
4746 * @brief Processes E2 Reset Response sent by RIC
4750 * Function : procResetResponse
4752 * Functionality: Processes E2 Reset Response sent by RIC
4754 * @params[in] E2AP_PDU_t ASN decoded E2AP message
4757 * ****************************************************************/
4758 void procResetResponse(E2AP_PDU_t *e2apMsg)
4760 bool invalidTransId=false;
4761 uint8_t ieIdx =0, transId =0;
4762 uint16_t ranFuncIdx=0;
4763 ResetResponseE2_t *resetResponse =NULLP;
4765 DU_LOG("\nINFO --> E2AP : E2 Reset Response received");
4766 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;;
4768 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
4770 switch(resetResponse->protocolIEs.list.array[ieIdx]->id)
4772 case ProtocolIE_IDE2_id_TransactionID:
4774 transId = resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
4775 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) && \
4776 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
4778 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
4782 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
4783 invalidTransId = true;
4787 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4789 for(ranFuncIdx=0; ranFuncIdx<MAX_RAN_FUNCTION; ranFuncIdx++)
4791 if(duCb.e2apDb.ranFunction[ranFuncIdx].id >0)
4793 deleteRicSubscriptionList(&(duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList));
4794 memset(&(duCb.e2apDb.ranFunction[ranFuncIdx].pendingSubsRspInfo), 0, MAX_PENDING_SUBSCRIPTION_RSP*sizeof(PendingSubsRspInfo));
4801 DU_LOG("\nERROR --> E2AP : Invalid IE received in E2 Reset Response : %ld",
4802 resetResponse->protocolIEs.list.array[ieIdx]->id);
4807 if(invalidTransId == true)
4813 freeAperDecodingOfE2ResetRsp(resetResponse);
4816 /******************************************************************
4818 * @brief Deallocation of memory allocated by aper decoder for e2 setup Failure
4822 * Function : freeAperDecodingOfE2SetupFailure
4824 * Functionality: Deallocation of memory allocated by aper decoder for e2
4827 * @params[in] E2setupFailure_t *e2SetupFailure;
4830 * ****************************************************************/
4831 void freeAperDecodingOfE2SetupFailure(E2setupFailure_t *e2SetupFailure)
4837 if(e2SetupFailure->protocolIEs.list.array)
4839 for(arrIdx=0; arrIdx<e2SetupFailure->protocolIEs.list.count; arrIdx++)
4841 if(e2SetupFailure->protocolIEs.list.array[arrIdx])
4843 free(e2SetupFailure->protocolIEs.list.array[arrIdx]);
4846 free(e2SetupFailure->protocolIEs.list.array);
4850 /******************************************************************
4852 * @brief Processes E2 Setup Failure sent by RIC
4856 * Function : procE2SetupFailure
4858 * Functionality: Processes E2 Setup failure sent by RIC
4860 * @params[in] E2AP_PDU_t ASN decoded E2AP message
4861 * @return ROK - success
4864 * ****************************************************************/
4865 void procE2SetupFailure(E2AP_PDU_t *e2apMsg)
4867 uint8_t arrIdx =0, transId =0, timerValue=0;
4868 E2setupFailure_t *e2SetupFailure;
4870 DU_LOG("\nINFO --> E2AP : E2 Setup failure received");
4871 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
4873 for(arrIdx=0; arrIdx<e2SetupFailure->protocolIEs.list.count; arrIdx++)
4875 switch(e2SetupFailure->protocolIEs.list.array[arrIdx]->id)
4877 case ProtocolIE_IDE2_id_TransactionID:
4879 transId = e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
4880 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
4881 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
4883 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
4887 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
4892 case ProtocolIE_IDE2_id_TimeToWaitE2:
4894 timerValue = convertE2WaitTimerEnumToValue(e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
4895 if((duChkTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR)) == FALSE)
4897 duStartTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR, timerValue);
4901 DU_LOG("\nERROR --> E2AP : EVENT_E2_SETUP_TMR timer is already running");
4909 freeAperDecodingOfE2SetupFailure(e2SetupFailure);
4911 /******************************************************************
4913 * @brief Deallocation of memory allocated by aper decoder for RIC service Query
4917 * Function : freeAperDecodingOfRicServiceQuery
4919 * Functionality: Deallocation of memory allocated by aper decoder for RIC
4922 * @params[in] RICserviceQuery_t *ricServiceQuery;
4925 * ****************************************************************/
4927 void freeAperDecodingOfRicServiceQuery(RICserviceQuery_t *ricServiceQuery)
4929 uint8_t arrIdx,ranFuncIdx;
4930 RANfunctionsID_List_t *ranFuncAddedList;
4934 if(ricServiceQuery->protocolIEs.list.array)
4936 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
4938 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
4940 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
4942 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
4944 ranFuncAddedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
4945 if(ranFuncAddedList->list.array)
4947 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
4949 free(ranFuncAddedList->list.array[ranFuncIdx]);
4951 free(ranFuncAddedList->list.array);;
4958 free(ricServiceQuery->protocolIEs.list.array[arrIdx]);
4961 free(ricServiceQuery->protocolIEs.list.array);
4965 /*******************************************************************
4967 * @brief Build RanFunction Delete List
4971 * Function : BuildRanFunctionDeleteList
4973 * Functionality: Build RanFunction Delete List
4976 * RANfunctionsID List
4977 * Count of the RAN function
4978 * Received RAN function list
4980 * @return ROK - success
4983 ******************************************************************/
4985 uint8_t BuildRanFunctionDeleteList(RANfunctionsID_List_t *deleteList, uint8_t count, RanFuncInfo *recvdRanFunc)
4987 uint8_t ranFuncIdx=0;
4988 RANfunctionID_ItemIEs_t *delRanFuncItem;
4992 deleteList->list.count = count;
4993 deleteList->list.size = deleteList->list.count * sizeof(RANfunctionID_ItemIEs_t*);
4994 DU_ALLOC(deleteList->list.array, deleteList->list.size);
4995 if(deleteList->list.array == NULLP)
4997 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
5000 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
5002 DU_ALLOC(deleteList->list.array[ranFuncIdx], sizeof(RANfunctionID_ItemIEs_t));
5003 if(deleteList->list.array[ranFuncIdx] == NULLP)
5005 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
5008 delRanFuncItem= (RANfunctionID_ItemIEs_t *) deleteList->list.array[ranFuncIdx];
5009 delRanFuncItem->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
5010 delRanFuncItem->criticality = CriticalityE2_ignore;
5011 delRanFuncItem->value.choice.RANfunctionID_Item.ranFunctionID = recvdRanFunc[ranFuncIdx].id;
5012 delRanFuncItem->value.choice.RANfunctionID_Item.ranFunctionRevision = recvdRanFunc[ranFuncIdx].revisionCounter;
5018 /*******************************************************************
5020 * @brief De Allocate Ric Service Update message
5024 * Function : FreeRicServiceUpdate
5026 * Functionality: De-Allocating Ric Service Update message
5028 * @params[in] E2AP_PDU_t *e2apMsg
5032 * ****************************************************************/
5034 void FreeRicServiceUpdate(E2AP_PDU_t *e2apMsg)
5037 uint8_t ranFuncAddListIdx=0, ranFuncDelIdx=0;
5038 RICserviceUpdate_t *ricServiceUpdate;
5039 RANfunctions_List_t *ranFunctionsList;
5040 RANfunction_ItemIEs_t *ranFuncItemIe;
5041 RANfunction_Item_t *ranFunItem;
5042 RANfunctionsID_List_t *deleteList;
5044 /* De-allocating Memory */
5045 if(e2apMsg != NULLP)
5047 if(e2apMsg->choice.initiatingMessage != NULLP)
5049 ricServiceUpdate = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate;
5050 if(ricServiceUpdate->protocolIEs.list.array != NULLP)
5052 for(arrIdx = 0; arrIdx < ricServiceUpdate->protocolIEs.list.count; arrIdx++)
5054 if(ricServiceUpdate->protocolIEs.list.array[arrIdx] != NULLP)
5056 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
5058 case ProtocolIE_IDE2_id_TransactionID:
5061 case ProtocolIE_IDE2_id_RANfunctionsAdded:
5062 case ProtocolIE_IDE2_id_RANfunctionsModified:
5064 ranFunctionsList = &(ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List);
5065 if(ranFunctionsList->list.array)
5067 for(ranFuncAddListIdx= 0; ranFuncAddListIdx< ranFunctionsList->list.count; ranFuncAddListIdx++)
5069 if(ranFunctionsList->list.array[ranFuncAddListIdx])
5071 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncAddListIdx];
5072 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
5073 DU_FREE(ranFunItem->ranFunctionOID.buf, ranFunItem->ranFunctionOID.size);
5074 DU_FREE(ranFunItem->ranFunctionDefinition.buf, ranFunItem->ranFunctionDefinition.size);
5075 DU_FREE(ranFunctionsList->list.array[ranFuncAddListIdx], sizeof(RANfunction_ItemIEs_t));
5078 DU_FREE(ranFunctionsList->list.array, ranFunctionsList->list.size);
5082 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
5084 deleteList= &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
5085 if(deleteList->list.array)
5087 for(ranFuncDelIdx = 0; ranFuncDelIdx< deleteList->list.count; ranFuncDelIdx++)
5089 DU_FREE(deleteList->list.array[ranFuncDelIdx], sizeof(RANfunctionID_ItemIEs_t));
5091 DU_FREE(deleteList->list.array, deleteList->list.size);
5097 DU_LOG("\nERROR --> E2AP: Invalid event at ricServiceUpdate %ld ",\
5098 (ricServiceUpdate->protocolIEs.list.array[arrIdx]->id));
5101 DU_FREE(ricServiceUpdate->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdate_IEs_t));
5104 DU_FREE(ricServiceUpdate->protocolIEs.list.array, ricServiceUpdate->protocolIEs.list.size);
5106 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5108 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5112 /*******************************************************************
5114 * @brief Builds and Send the RicServiceUpdateuest
5118 * Function : BuildAndSendRicServiceUpdate
5120 * Functionality:Fills the RicServiceUpdateuest
5122 * @return ROK - success
5125 ******************************************************************/
5127 uint8_t BuildAndSendRicServiceUpdate(RicServiceUpdate serviceUpdate)
5129 uint8_t arrIdx = 0, elementCnt=0;
5130 uint8_t transId = 0, ret = RFAILED;
5131 bool memAllocFailed =false;
5132 E2AP_PDU_t *e2apMsg = NULLP;
5133 RICserviceUpdate_t *ricServiceUpdate = NULLP;
5134 asn_enc_rval_t encRetVal; /* Encoder return value */
5136 DU_LOG("\nINFO --> E2AP : Building Ric Service Update\n");
5139 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5140 if(e2apMsg == NULLP)
5142 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
5145 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5146 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5147 if(e2apMsg->choice.initiatingMessage == NULLP)
5149 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
5152 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5153 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
5154 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceUpdate;
5155 ricServiceUpdate = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate;
5157 /* For TransId IE, set elementCnt to 1.
5158 If there is any item in the RAN function add list, RAN function modification list, or RAN function delete list, increment the elementCnt.*/
5161 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5163 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeModified)
5165 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted)
5168 ricServiceUpdate->protocolIEs.list.count = elementCnt;
5169 ricServiceUpdate->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdate_IEs_t*);
5171 /* Initialize the E2Setup members */
5172 DU_ALLOC(ricServiceUpdate->protocolIEs.list.array, ricServiceUpdate->protocolIEs.list.size);
5173 if(ricServiceUpdate->protocolIEs.list.array == NULLP)
5175 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements");
5179 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
5181 DU_ALLOC(ricServiceUpdate->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdate_IEs_t));
5182 if(ricServiceUpdate->protocolIEs.list.array[arrIdx] == NULLP)
5184 memAllocFailed = true;
5185 DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayIdx [%d]", arrIdx);
5189 if(memAllocFailed == true)
5195 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
5196 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5197 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_TransactionID;
5198 if(serviceUpdate.dir == E2_NODE_INITIATED)
5199 transId = assignTransactionId();
5201 transId = serviceUpdate.transId;
5202 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
5204 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5207 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAdded;
5208 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5209 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctions_List;
5210 if(BuildRanFunctionAddList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List,\
5211 e2apMsg->choice.initiatingMessage->procedureCode, serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded, serviceUpdate.recvRanFuncList.ranFunToBeAdded) !=ROK)
5217 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeModified)
5220 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsModified;
5221 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5222 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctions_List;
5223 if(BuildRanFunctionAddList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List,
5224 e2apMsg->choice.initiatingMessage->procedureCode, serviceUpdate.recvRanFuncList.numOfRanFunToBeModified, serviceUpdate.recvRanFuncList.ranFunToBeModified) !=ROK)
5230 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted)
5233 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsDeleted;
5234 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5235 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctionsID_List;
5236 if(BuildRanFunctionDeleteList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List,\
5237 serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted, serviceUpdate.recvRanFuncList.ranFunToBeDeleted) != ROK)
5242 /* Prints the Msg formed */
5243 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5245 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5247 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
5248 if(encRetVal.encoded == ENCODE_FAIL)
5250 DU_LOG("\nERROR --> E2AP : Could not encode RicServiceUpdateuest structure (at %s)\n",\
5251 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5256 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicServiceUpdateuest\n");
5257 #ifdef DEBUG_ASN_PRINT
5258 for(int i=0; i< encBufSize; i++)
5260 printf("%x",encBuf[i]);
5264 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
5266 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
5275 if(serviceUpdate.dir == E2_NODE_INITIATED)
5277 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
5278 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
5282 duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].transactionId = transId;
5283 duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
5285 duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.dir = serviceUpdate.dir;
5286 duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.transId =transId;
5287 memcpy(&duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.recvRanFuncList, &serviceUpdate.recvRanFuncList, sizeof(E2TmpRanFunList));
5289 FreeRicServiceUpdate(e2apMsg);
5292 /******************************************************************
5294 * @brief Processes RIC service Query sent by RIC
5298 * Function : procRicServiceQuery
5300 * Functionality: Processes RIC service Query sent by RIC
5302 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5303 * @return ROK - success
5306 * ****************************************************************/
5308 void procRicServiceQuery(E2AP_PDU_t *e2apMsg)
5311 uint16_t arrIdx =0, ranFuncIdx=0,tmpIdx=0;
5312 uint16_t id,revisionCcounter;
5313 bool tmpArray[MAX_RAN_FUNCTION] = {false};
5314 RICserviceQuery_t *ricServiceQuery=NULL;
5315 RicServiceUpdate ricUpdate;
5316 RANfunctionID_ItemIEs_t *ranFuncAddedItemIe;
5317 RANfunctionsID_List_t *ranFuncAddedList;
5319 DU_LOG("\nINFO --> E2AP : RIC Service Query received");
5320 memset(&ricUpdate, 0, sizeof(RicServiceUpdate));
5321 ricUpdate.dir = RIC_INITIATED;
5322 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
5324 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
5326 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
5328 /* TODO completing in next patch/gerrit */
5329 case ProtocolIE_IDE2_id_TransactionID:
5331 ricUpdate.transId = ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
5335 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5337 ranFuncAddedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
5338 if(ranFuncAddedList->list.array)
5340 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
5342 if(ranFuncAddedList->list.array[ranFuncIdx])
5344 /* Using the RAN function Id, identify the RAN function to be modified or deleted. */
5346 ranFuncAddedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAddedList->list.array[ranFuncIdx];
5347 id = ranFuncAddedItemIe->value.choice.RANfunctionID_Item.ranFunctionID;
5348 revisionCcounter = ranFuncAddedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision;
5350 if((id != duCb.e2apDb.ranFunction[id-1].id))
5352 action = CONFIG_DEL;
5354 else if((id == duCb.e2apDb.ranFunction[id-1].id)&&(revisionCcounter!=duCb.e2apDb.ranFunction[id-1].revisionCounter))
5356 action = CONFIG_MOD;
5359 if(action == CONFIG_DEL)
5361 ricUpdate.recvRanFuncList.ranFunToBeDeleted[ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted].id = id;
5362 ricUpdate.recvRanFuncList.ranFunToBeDeleted[ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted].revisionCounter = revisionCcounter;
5363 ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted++;
5365 else if(action == CONFIG_MOD)
5367 ricUpdate.recvRanFuncList.ranFunToBeModified[ricUpdate.recvRanFuncList.numOfRanFunToBeModified].id = id;
5368 ricUpdate.recvRanFuncList.ranFunToBeModified[ricUpdate.recvRanFuncList.numOfRanFunToBeModified].revisionCounter = revisionCcounter;
5369 ricUpdate.recvRanFuncList.numOfRanFunToBeModified++;
5372 /* If any ID is set to true, it means that the ID has been used in either modification or deletion list.
5373 * Else we will add the IDs into the added list */
5374 tmpArray[id-1] = true;
5383 /* Traversing the whole RAN function list in ducb to check if any new Ran function ids have been added. */
5384 for(arrIdx =0; arrIdx<MAX_RAN_FUNCTION; arrIdx++)
5386 tmpIdx= ricUpdate.recvRanFuncList.numOfRanFunToBeAdded;
5387 if((duCb.e2apDb.ranFunction[arrIdx].id >0)&&(!tmpArray[arrIdx]))
5389 ricUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].id = duCb.e2apDb.ranFunction[arrIdx].id;
5390 ricUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].revisionCounter = duCb.e2apDb.ranFunction[arrIdx].revisionCounter;
5391 ricUpdate.recvRanFuncList.numOfRanFunToBeAdded++;
5395 if(BuildAndSendRicServiceUpdate(ricUpdate)!= ROK)
5397 DU_LOG("\nERROR --> E2AP : Failed to build and send ric service update message");
5400 freeAperDecodingOfRicServiceQuery(ricServiceQuery);
5403 /******************************************************************
5405 * @brief Deallocation of memory allocated by aper decoder for
5406 * RIC service update ack
5410 * Function : freeAperDecodingOfRicServiceUpdateAck
5412 * Functionality: Deallocation of memory allocated by aper decoder
5413 * for RIC service update ack
5415 * @params[in] RICserviceUpdateAck_t *ricServiceAck;
5418 * ****************************************************************/
5420 void freeAperDecodingOfRicServiceUpdateAck(RICserviceUpdateAcknowledge_t *ricServiceAck)
5422 uint8_t arrIdx=0,ranFuncIdx=0;
5423 RANfunctionsID_List_t *ranFuncAddedList=NULL;
5427 if(ricServiceAck->protocolIEs.list.array)
5429 for(arrIdx=0; arrIdx<ricServiceAck->protocolIEs.list.count; arrIdx++)
5431 if(ricServiceAck->protocolIEs.list.array[arrIdx])
5433 switch(ricServiceAck->protocolIEs.list.array[arrIdx]->id)
5435 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5437 ranFuncAddedList= &ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
5438 if(ranFuncAddedList->list.array)
5440 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
5442 free(ranFuncAddedList->list.array[ranFuncIdx]);
5444 free(ranFuncAddedList->list.array);
5451 free(ricServiceAck->protocolIEs.list.array[arrIdx]);
5454 free(ricServiceAck->protocolIEs.list.array);
5459 /******************************************************************
5461 * @brief Processes RIC service update ack sent by RIC
5465 * Function : procRicServiceUpdateAck
5467 * Functionality: Processes RIC service update ack sent by RIC
5469 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5470 * @return ROK - success
5473 * ****************************************************************/
5475 void procRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
5477 uint8_t arrIdx =0, transId =0;
5478 uint16_t id =0, tmpIdx=0, ranFuncIdx=0;
5479 RicServiceUpdate serviceUpdate;
5480 RANfunctionsIDcause_List_t *rejectedList=NULL;
5481 RICserviceUpdateAcknowledge_t *ricServiceAck=NULL;
5482 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
5484 DU_LOG("\nINFO --> E2AP : RIC service update ack received");
5485 memset(&serviceUpdate, 0, sizeof(RicServiceUpdate));
5486 ricServiceAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
5488 for(arrIdx=0; arrIdx<ricServiceAck->protocolIEs.list.count; arrIdx++)
5490 switch(ricServiceAck->protocolIEs.list.array[arrIdx]->id)
5492 case ProtocolIE_IDE2_id_TransactionID:
5494 transId = ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
5495 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
5496 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
5498 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
5500 else if((duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].transactionId == transId) &&\
5501 (duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
5503 memset(&duCb.e2apDb.e2TransInfo.ricInitTransaction[transId], 0, sizeof(E2TransInfo));
5507 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
5513 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5516 case ProtocolIE_IDE2_id_RANfunctionsRejected:
5518 rejectedList= &ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
5519 if(rejectedList->list.array)
5521 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
5523 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)rejectedList->list.array[ranFuncIdx];
5524 id = ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID;
5525 tmpIdx= serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded;
5526 serviceUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].id = duCb.e2apDb.ranFunction[id-1].id;
5527 serviceUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].revisionCounter = duCb.e2apDb.ranFunction[id-1].revisionCounter;
5528 serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded++;
5537 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5539 serviceUpdate.dir = E2_NODE_INITIATED;
5540 BuildAndSendRicServiceUpdate(serviceUpdate);
5542 freeAperDecodingOfRicServiceUpdateAck(ricServiceAck);
5545 /******************************************************************
5547 * @brief Deallocation of memory allocated by aper decoder for
5548 * RIC service update failure
5552 * Function : freeAperDecodingOfRicServiceUpdateFailure
5554 * Functionality: Deallocation of memory allocated by aper decoder
5555 * for RIC service update failure
5557 * @params[in] RICserviceUpdateFailure_t *ricServiceFailure;
5560 * ****************************************************************/
5562 void freeAperDecodingOfRicServiceUpdateFailure(RICserviceUpdateFailure_t *ricServiceFailure)
5566 if(ricServiceFailure)
5568 if(ricServiceFailure->protocolIEs.list.array)
5570 for(arrIdx=0; arrIdx<ricServiceFailure->protocolIEs.list.count; arrIdx++)
5572 if(ricServiceFailure->protocolIEs.list.array[arrIdx])
5574 free(ricServiceFailure->protocolIEs.list.array[arrIdx]);
5577 free(ricServiceFailure->protocolIEs.list.array);
5582 /******************************************************************
5584 * @brief Processes RIC service update failure sent by RIC
5588 * Function : procRicServiceUpdateFailure
5590 * Functionality: Processes RIC service update failure sent by RIC
5592 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5593 * @return ROK - success
5596 * ****************************************************************/
5598 void procRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
5600 uint8_t arrIdx =0, timerValue=0;
5601 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
5603 DU_LOG("\nINFO --> E2AP : RIC service update failure received");
5604 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
5606 for(arrIdx=0; arrIdx<ricServiceFailure->protocolIEs.list.count; arrIdx++)
5608 switch(ricServiceFailure->protocolIEs.list.array[arrIdx]->id)
5610 case ProtocolIE_IDE2_id_TransactionID:
5614 case ProtocolIE_IDE2_id_TimeToWaitE2:
5616 timerValue = convertE2WaitTimerEnumToValue(ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
5617 if((duChkTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer), EVENT_RIC_SERVICE_UPDATE_TMR)) == FALSE)
5619 duStartTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer), EVENT_RIC_SERVICE_UPDATE_TMR, timerValue);
5623 DU_LOG("\nERROR --> E2AP : EVENT_RIC_SERVICE_UPDATE_TMR timer is already running");
5628 case ProtocolIE_IDE2_id_CauseE2:
5635 freeAperDecodingOfRicServiceUpdateFailure(ricServiceFailure);
5638 /******************************************************************
5640 * @brief DU Send E2 Node Configuration Update
5644 * Function : duSendE2NodeConfigurationUpdate
5646 * Functionality: DU Send E2 Node Configuration Update
5648 * @return ROK - success
5651 * ****************************************************************/
5653 uint8_t duSendE2NodeConfigurationUpdate()
5655 E2NodeConfigList e2NodeList;
5656 CmLList *node =NULL;
5657 E2NodeComponent *e2NodeComponentInfo=NULL;
5659 memset(&e2NodeList, 0, sizeof(E2NodeConfigList));
5660 CM_LLIST_FIRST_NODE(&duCb.e2apDb.e2NodeComponentList, node);
5663 e2NodeComponentInfo = (E2NodeComponent*)node->node;
5665 if(e2NodeComponentInfo->addConfiguration)
5667 e2NodeList.addE2Node[e2NodeList.addE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5668 e2NodeList.addE2Node[e2NodeList.addE2NodeCount].componentId= e2NodeComponentInfo->componentId;
5669 e2NodeList.addE2NodeCount++;
5672 if(e2NodeComponentInfo->updateConfiguration)
5674 e2NodeList.updateE2Node[e2NodeList.updateE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5675 e2NodeList.updateE2Node[e2NodeList.updateE2NodeCount].componentId= e2NodeComponentInfo->componentId;
5676 e2NodeList.updateE2NodeCount++;
5679 if(e2NodeComponentInfo->deleteConfiguration == true)
5681 e2NodeList.removeE2Node[e2NodeList.removeE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5682 e2NodeList.removeE2Node[e2NodeList.removeE2NodeCount].componentId = e2NodeComponentInfo->componentId;
5683 e2NodeList.removeE2NodeCount++;
5689 if(BuildAndSendE2NodeConfigUpdate(&e2NodeList) !=ROK)
5691 DU_LOG("\nERROR --> E2AP : Failed to build and send e2 node config update message to RIC_stub");
5697 /*******************************************************************
5699 * @brief Free RIC Subscription Modification Required
5703 * Function : FreeRicSubsModRequired
5705 * Functionality: Freqq RIC Subscription Modification required
5707 * @param E2AP Message PDU to be freed
5710 ******************************************************************/
5711 void FreeRicSubsModRequired(E2AP_PDU_t *e2apMsg)
5713 uint8_t ieIdx = 0, arrIdx = 0;
5714 RICsubscriptionModificationRequired_t *ricSubsModReqd = NULLP;
5715 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
5716 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
5717 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
5721 if(e2apMsg->choice.initiatingMessage)
5723 ricSubsModReqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired;
5724 if(ricSubsModReqd->protocolIEs.list.array)
5726 for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
5728 if(ricSubsModReqd->protocolIEs.list.array[ieIdx])
5730 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5731 switch(ricSubsModReqdIe->id)
5733 case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
5735 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
5736 if(actionToBeModList->list.array)
5738 for(arrIdx = 0; arrIdx < actionToBeModList->list.count; arrIdx++)
5740 DU_FREE(actionToBeModList->list.array[arrIdx], \
5741 sizeof(RICaction_RequiredToBeModified_ItemIEs_t));
5743 DU_FREE(actionToBeModList->list.array, actionToBeModList->list.size);
5748 case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
5750 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
5751 if(actionToBeRmvList->list.array)
5753 for(arrIdx = 0; arrIdx < actionToBeRmvList->list.count; arrIdx++)
5755 DU_FREE(actionToBeRmvList->list.array[arrIdx], \
5756 sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t));
5758 DU_FREE(actionToBeRmvList->list.array, actionToBeRmvList->list.size);
5766 DU_FREE(ricSubsModReqd->protocolIEs.list.array[ieIdx], \
5767 sizeof(RICsubscriptionModificationRequired_IEs_t));
5770 DU_FREE(ricSubsModReqd->protocolIEs.list.array, ricSubsModReqd->protocolIEs.list.size);
5772 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5774 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5778 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
5779 * However, E2SM-KPM supports only RIC Report service.
5780 * Hence there is no subsequent action in RIC subscription that may require modification.
5781 * So commenting the action-modification IEs for the time being
5784 /*******************************************************************
5786 * @brief Fill Action required to be modified list
5790 * Function : FillActionReqdToBeModList
5792 * Functionality: Fill Action required to be modified list
5794 * @param RIC Actions Required To Be Modified List to be filled
5795 * Number of actions to be modified
5796 * RIC Subscription DB
5797 * @return ROK - success
5800 ******************************************************************/
5801 uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *actionToBeModList, uint8_t numActionsMod, \
5802 RicSubscription *ricSubscription)
5804 uint8_t arrIdx = 0, actionIdx = 0;
5805 RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULL;
5807 actionToBeModList->list.count = numActionsMod;
5808 actionToBeModList->list.size = numActionsMod * sizeof(RICaction_RequiredToBeModified_ItemIEs_t *);
5809 DU_ALLOC(actionToBeModList->list.array, actionToBeModList->list.size);
5810 if(!actionToBeModList->list.array)
5812 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
5817 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5819 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD)
5821 DU_ALLOC(actionToBeModList->list.array[arrIdx], sizeof(RICaction_RequiredToBeModified_ItemIEs_t));
5822 if(!actionToBeModList->list.array[arrIdx])
5824 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
5827 actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[arrIdx];
5829 actionToBeMod->id = ProtocolIE_IDE2_id_RICaction_RequiredToBeModified_Item;
5830 actionToBeMod->criticality = CriticalityE2_reject;
5831 actionToBeMod->value.present = \
5832 RICaction_RequiredToBeModified_ItemIEs__value_PR_RICaction_RequiredToBeModified_Item;
5833 actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID = \
5834 ricSubscription->actionSequence[actionIdx].actionId;
5835 actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricTimeToWait = RICtimeToWait_w5ms;
5845 /*******************************************************************
5847 * @brief Fill Action required to be removed list
5851 * Function : FillActionReqdToBeRmvList
5853 * Functionality: Fill Action required to be removed list
5855 * @param RIC Actions Required To Be Removed List to be filled
5856 * Number of actions to be removed
5857 * RIC Subscription DB
5858 * @return ROK - success
5861 ******************************************************************/
5862 uint8_t FillActionReqdToBeRmvList(RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList, uint8_t numActionsRmv, \
5863 RicSubscription *ricSubscription)
5865 uint8_t arrIdx = 0, actionIdx = 0;
5866 RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULL;
5868 actionToBeRmvList->list.count = numActionsRmv;
5869 actionToBeRmvList->list.size = numActionsRmv * sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t *);
5870 DU_ALLOC(actionToBeRmvList->list.array, actionToBeRmvList->list.size);
5871 if(!actionToBeRmvList->list.array)
5873 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5878 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5880 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL)
5882 DU_ALLOC(actionToBeRmvList->list.array[arrIdx], sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t));
5883 if(!actionToBeRmvList->list.array[arrIdx])
5885 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5888 actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[arrIdx];
5890 actionToBeRmv->id = ProtocolIE_IDE2_id_RICaction_RequiredToBeRemoved_Item;
5891 actionToBeRmv->criticality = CriticalityE2_reject;
5892 actionToBeRmv->value.present = \
5893 RICaction_RequiredToBeRemoved_ItemIEs__value_PR_RICaction_RequiredToBeRemoved_Item;
5894 actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID = \
5895 ricSubscription->actionSequence[actionIdx].actionId;
5896 fillE2Cause(&actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.cause, \
5897 ricSubscription->actionSequence[actionIdx].failureCause);
5906 /*******************************************************************
5908 * @brief Fill RIC Subscription Modification Required IEs
5912 * Function : FillRicSubsModRequired
5914 * Functionality: Fill RIC Subscription Modification Required IEs
5916 * @param RIC Subscription Modification Required IEs to be filled
5917 * RIC Subscription DB
5918 * @return ROK - success
5921 ******************************************************************/
5922 uint8_t FillRicSubsModRequired(RICsubscriptionModificationRequired_t *ricSubsModReqd, RicSubscription *ricSubscription)
5924 uint8_t ieIdx = 0, elementCnt=0, actionIdx = 0;
5925 uint8_t numActionsMod = 0, numActionsRmv = 0;
5926 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
5927 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
5929 /* Unused in case of E2SM-KPM */
5931 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
5934 /* Count number of Actions to be modified or deleted */
5935 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5937 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD)
5939 else if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL)
5943 /* Count number of IEs to be added to messages */
5950 ricSubsModReqd->protocolIEs.list.count = elementCnt;
5951 ricSubsModReqd->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRequired_IEs_t *);
5952 DU_ALLOC(ricSubsModReqd->protocolIEs.list.array, ricSubsModReqd->protocolIEs.list.size);
5953 if(!ricSubsModReqd->protocolIEs.list.array)
5955 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5959 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
5961 DU_ALLOC(ricSubsModReqd->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRequired_IEs_t));
5962 if(!ricSubsModReqd->protocolIEs.list.array[ieIdx])
5964 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5969 /* RIC Request ID */
5971 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5972 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICrequestID;
5973 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5974 ricSubsModReqdIe->value.present = RICsubscriptionModificationRequired_IEs__value_PR_RICrequestID;
5975 ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID = ricSubscription->requestId.requestorId;
5976 ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID = ricSubscription->requestId.instanceId;
5978 /* RAN Function ID */
5980 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5981 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RANfunctionID;
5982 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5983 ricSubsModReqdIe->value.present = RICsubscriptionModificationRequired_IEs__value_PR_RANfunctionID;
5984 ricSubsModReqdIe->value.choice.RANfunctionID = ricSubscription->ranFuncId;
5986 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
5987 * However, E2SM-KPM supports only RIC Report service.
5988 * Hence there is no subsequent action in RIC subscription that may require modification.
5989 * So commenting the action-modification IEs for the time being
5992 /* RIC Actions Required to be Modified */
5996 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5997 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List;
5998 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5999 ricSubsModReqdIe->value.present = \
6000 RICsubscriptionModificationRequired_IEs__value_PR_RICactions_RequiredToBeModified_List;
6001 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
6003 if(FillActionReqdToBeModList(actionToBeModList, numActionsMod, ricSubscription) != ROK)
6005 DU_LOG("\nERROR --> E2AP : %s: Failed to fill actions required to be modified list", __func__);
6011 /* RIC Actions Required to be removed */
6015 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
6016 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List;
6017 ricSubsModReqdIe->criticality = CriticalityE2_reject;
6018 ricSubsModReqdIe->value.present = \
6019 RICsubscriptionModificationRequired_IEs__value_PR_RICactions_RequiredToBeRemoved_List;
6020 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
6022 if(FillActionReqdToBeRmvList(actionToBeRmvList, numActionsRmv, ricSubscription) != ROK)
6024 DU_LOG("\nERROR --> E2AP : %s: Failed to fill actions required to be removed list", __func__);
6032 /*******************************************************************
6034 * @brief Builds and Send RIC Subscription Modification Required
6039 * Function : BuildAndSendRicSubsModRequired
6041 * Functionality: Builds and Send RIC Subscription Modification
6044 * @param RIC Subscription DB
6045 * @return ROK - success
6048 ******************************************************************/
6049 uint8_t BuildAndSendRicSubsModRequired(RicSubscription *ricSubscription)
6051 uint8_t ret = RFAILED;
6052 E2AP_PDU_t *e2apMsg = NULLP;
6053 RICsubscriptionModificationRequired_t *ricSubsModReqd = NULLP;
6054 asn_enc_rval_t encRetVal; /* Encoder return value */
6056 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Required \n");
6059 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6060 if(e2apMsg == NULLP)
6062 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
6066 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
6067 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
6068 if(e2apMsg->choice.initiatingMessage == NULLP)
6070 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
6073 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
6074 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
6075 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired;
6077 ricSubsModReqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired;
6079 if(FillRicSubsModRequired(ricSubsModReqd, ricSubscription) != ROK)
6081 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Subscription Modification Required IEs", __func__);
6086 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6088 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6090 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6091 if(encRetVal.encoded == ENCODE_FAIL)
6093 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Modifiction Required structure (at %s)\n",\
6094 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6099 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Modification Required \n");
6100 #ifdef DEBUG_ASN_PRINT
6101 for(int i=0; i< encBufSize; i++)
6103 printf("%x",encBuf[i]);
6107 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
6109 DU_LOG("\nERROR --> E2AP : Sending RIC Subscription Modification Required failed");
6116 /* Free RIC Subscription modification required */
6117 FreeRicSubsModRequired(e2apMsg);
6121 /*******************************************************************
6123 * @brief Free APER decoding of RIC Subscription Modification Confirm
6127 * Function : freeAperDecodingOfRicSubsModConfirm
6129 * Functionality: Free APER decoding of RIC Subscription
6130 * Modification Confirm
6132 * @param E2AP Message PDU
6135 ******************************************************************/
6136 void freeAperDecodingOfRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
6138 uint8_t ieIdx = 0, arrIdx=0;
6139 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
6140 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
6141 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
6142 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
6143 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
6144 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
6146 if(e2apMsg && e2apMsg->choice.successfulOutcome)
6148 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
6149 if(ricSubsModCfm->protocolIEs.list.array)
6151 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
6153 if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
6155 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
6156 switch(ricSubsModCfmIe->id)
6158 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
6160 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
6161 if(modCfmList->list.array)
6163 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
6165 if(modCfmList->list.array[arrIdx])
6166 free(modCfmList->list.array[arrIdx]);
6168 free(modCfmList->list.array);
6173 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
6175 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
6176 if(modRefusedList->list.array)
6178 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
6180 if(modRefusedList->list.array[arrIdx])
6181 free(modRefusedList->list.array[arrIdx]);
6183 free(modRefusedList->list.array);
6188 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
6190 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
6191 if(rmvCfmList->list.array)
6193 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
6195 if(rmvCfmList->list.array[arrIdx])
6196 free(rmvCfmList->list.array[arrIdx]);
6198 free(rmvCfmList->list.array);
6203 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
6205 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
6206 if(rmvFailList->list.array)
6208 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
6210 if(rmvFailList->list.array[arrIdx])
6211 free(rmvFailList->list.array[arrIdx]);
6213 free(rmvFailList->list.array);
6222 free(ricSubsModCfmIe);
6225 free(ricSubsModCfm->protocolIEs.list.array);
6230 /*******************************************************************
6232 * @brief Process RIC Subscription Modification Confirm Message
6236 * Function : procRicSubscriptionModificationConfirm
6238 * Functionality: Process RIC Subscription Modification Confirm
6239 * Message received from RIC.
6241 * @param E2AP Message PDU
6244 ******************************************************************/
6245 void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg)
6247 uint8_t actionId = 0, ieIdx = 0, arrIdx = 0;
6248 uint16_t ranFuncId = 0;
6249 bool procFailure = false;
6250 RicRequestId ricReqId;
6251 RanFunction *ranFuncDb = NULLP;
6252 CmLList *ricSubsNode = NULLP;
6253 RicSubscription *ricSubsDb = NULLP;
6254 ActionInfo *actionDb = NULLP;
6256 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
6257 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
6259 /* Not used in case of E2SM-KPM */
6261 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
6262 RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
6264 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
6265 RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
6268 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
6269 RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
6271 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
6272 RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
6274 DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Modification Confirm", __func__);
6279 DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__);
6283 if(!e2apMsg->choice.successfulOutcome)
6285 DU_LOG("\nERROR --> E2AP : %s: Successful Outcome in E2AP message is NULL", __func__);
6289 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
6290 if(!ricSubsModCfm->protocolIEs.list.array)
6292 DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__);
6296 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
6298 if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
6300 DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx);
6304 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
6305 switch(ricSubsModCfmIe->id)
6307 case ProtocolIE_IDE2_id_RICrequestID:
6309 memset(&ricReqId, 0, sizeof(RicRequestId));
6310 ricReqId.requestorId = ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID;
6311 ricReqId.instanceId = ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID;
6315 case ProtocolIE_IDE2_id_RANfunctionID:
6317 ranFuncId = ricSubsModCfmIe->value.choice.RANfunctionID;
6318 ranFuncDb = fetchRanFuncFromRanFuncId(ranFuncId);
6321 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%d] not found", __func__, ranFuncId);
6326 ricSubsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
6329 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%d] Instance_ID [%d]",\
6330 __func__, ricReqId.requestorId, ricReqId.instanceId);
6338 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
6339 * However, E2SM-KPM supports only RIC Report service.
6340 * Hence there is no subsequent action in RIC subscription that may require modification.
6341 * So commenting the action-modification IEs for the time being
6344 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
6346 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
6347 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
6349 modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
6350 actionId = modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID;
6352 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6355 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6359 actionDb->action = CONFIG_UNKNOWN;
6360 /* Further handling can be added here in future once the
6361 * use case of this procedure is identified */
6368 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
6370 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
6371 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
6373 modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
6374 actionId = modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID;
6375 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6378 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6382 /* Spec doesnt mention if in case of failure, DU should retry for modify action
6383 * Hence, chaging the action from CONFIG_MOD to CONFIG_UNKNOWN
6385 actionDb->action = CONFIG_UNKNOWN;
6393 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
6395 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
6396 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
6398 rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
6399 actionId = rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID;
6400 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6403 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6407 deleteActionSequence(actionDb);
6409 ricSubsDb->numOfActions--;
6410 /* Further handling can include :
6411 * Deletion of this action from all DU layers
6419 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
6421 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
6422 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
6424 rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
6425 actionId = rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID;
6426 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6429 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6433 actionDb->action = CONFIG_UNKNOWN;
6442 } /* End of switch for Protocol IE Id */
6446 } /* End of for loop for Protocol IE list */
6451 freeAperDecodingOfRicSubsModConfirm(e2apMsg);
6455 /******************************************************************
6456 * @brief Deallocate the memory allocated for E2 Reset Response
6460 * Function : FreeE2ResetResponse
6463 * - freeing the memory allocated for E2ResetResponse
6465 * @params[in] E2AP_PDU_t *e2apMsg
6466 * @return ROK - success
6469 * ****************************************************************/
6470 void FreeE2ResetResponse(E2AP_PDU_t *e2apMsg)
6473 ResetResponseE2_t *resetResponse;
6475 if(e2apMsg != NULLP)
6477 if(e2apMsg->choice.successfulOutcome != NULLP)
6479 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
6480 if(resetResponse->protocolIEs.list.array)
6482 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
6484 if(resetResponse->protocolIEs.list.array[ieIdx])
6486 DU_FREE(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
6489 DU_FREE(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
6492 DU_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6494 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6498 /*******************************************************************
6500 * @brief Buld and send the E2 Reset Response msg
6504 * Function : BuildAndSendE2ResetResponse
6507 * - Buld and send the E2 Reset Response Message
6509 * @params[in] Trans Id
6510 * @return ROK - success
6513 * ****************************************************************/
6514 uint8_t BuildAndSendResetResponse(uint8_t transId)
6516 uint8_t ieIdx = 0, elementCnt = 0;
6517 uint8_t ret = RFAILED;
6518 E2AP_PDU_t *e2apMsg = NULLP;
6519 ResetResponseE2_t *resetResponse;
6520 asn_enc_rval_t encRetVal; /* Encoder return value */
6522 DU_LOG("\nINFO --> E2AP : Building E2 Reset Response Message\n");
6525 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6526 if(e2apMsg == NULLP)
6528 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse(): Memory allocation for E2AP-PDU failed");
6531 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
6533 DU_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6534 if(e2apMsg->choice.successfulOutcome == NULLP)
6536 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
6540 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
6541 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
6542 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_ResetResponseE2;
6543 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
6546 resetResponse->protocolIEs.list.count = elementCnt;
6547 resetResponse->protocolIEs.list.size = elementCnt * sizeof(ResetResponseIEs_t *);
6548 DU_ALLOC(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
6549 if(!resetResponse->protocolIEs.list.array)
6551 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array");
6555 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6557 DU_ALLOC(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
6558 if(!resetResponse->protocolIEs.list.array[ieIdx])
6560 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array element");
6564 if(ieIdx < elementCnt)
6568 resetResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6569 resetResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6570 resetResponse->protocolIEs.list.array[ieIdx]->value.present = ResetResponseIEs__value_PR_TransactionID;
6571 resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
6573 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6575 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6577 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6578 if(encRetVal.encoded == ENCODE_FAIL)
6580 DU_LOG("\nERROR --> E2AP : Could not encode E2 reset response structure (at %s)\n",\
6581 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6586 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Reset Response \n");
6587 for(int i=0; i< encBufSize; i++)
6589 DU_LOG("%x",encBuf[i]);
6594 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
6596 DU_LOG("\nERROR --> E2AP : Failed to send E2 Reset Response");
6604 FreeE2ResetResponse(e2apMsg);
6608 /******************************************************************
6610 * @brief Deallocation of memory allocated by aper decoder for reset req
6614 * Function : freeAperDecodingOfE2ResetReq
6616 * Functionality: Deallocation of memory allocated by aper decoder for
6619 * @params[in] Pointer to resetReq
6622 * ****************************************************************/
6623 void freeAperDecodingOfE2ResetReq(ResetRequestE2_t *resetReq)
6629 if(resetReq->protocolIEs.list.array)
6631 for(arrIdx=0; arrIdx<resetReq->protocolIEs.list.count; arrIdx++)
6633 if(resetReq->protocolIEs.list.array[arrIdx])
6635 free(resetReq->protocolIEs.list.array[arrIdx]);
6638 free(resetReq->protocolIEs.list.array);
6643 /*******************************************************************
6645 * @brief Process reset req received from RIC
6649 * Function : procE2ResetRequest
6651 * Functionality: Process reset req received from RIC
6653 * @param E2AP_PDU_t *e2apMsg
6656 ******************************************************************/
6658 void procE2ResetRequest(E2AP_PDU_t *e2apMsg)
6660 uint16_t ranFuncIdx=0;
6661 uint8_t arrIdx =0, transId =0;
6662 ResetRequestE2_t *resetReq;
6664 DU_LOG("\nINFO --> E2AP : E2 Reset request received");
6665 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
6667 for(arrIdx=0; arrIdx<resetReq->protocolIEs.list.count; arrIdx++)
6669 switch(resetReq->protocolIEs.list.array[arrIdx]->id)
6671 case ProtocolIE_IDE2_id_TransactionID:
6673 transId = resetReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
6677 case ProtocolIE_IDE2_id_CauseE2:
6679 for(ranFuncIdx=0; ranFuncIdx<MAX_RAN_FUNCTION; ranFuncIdx++)
6681 if(duCb.e2apDb.ranFunction[ranFuncIdx].id >0)
6683 deleteRicSubscriptionList(&(duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList));
6684 memset(&(duCb.e2apDb.ranFunction[ranFuncIdx].pendingSubsRspInfo), 0, MAX_PENDING_SUBSCRIPTION_RSP*sizeof(PendingSubsRspInfo));
6691 if(BuildAndSendResetResponse(transId) != ROK)
6693 DU_LOG("\nERROR --> E2AP : Failed to build and send reset response");
6695 freeAperDecodingOfE2ResetReq(resetReq);
6698 /*******************************************************************
6700 * @brief Free APER decoding of RIC Subscription Modification Refuse
6704 * Function : freeAperDecodingOfRicSubsModRefuse
6706 * Functionality: Free APER decoding of RIC Subscription
6707 * Modification Refuse
6709 * @param E2AP Message PDU
6712 ******************************************************************/
6713 void freeAperDecodingOfRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
6716 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
6718 if(e2apMsg && e2apMsg->choice.unsuccessfulOutcome)
6720 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
6721 if(ricSubsModRefuse->protocolIEs.list.array)
6723 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
6725 if(ricSubsModRefuse->protocolIEs.list.array[ieIdx])
6726 free(ricSubsModRefuse->protocolIEs.list.array[ieIdx]);
6728 free(ricSubsModRefuse->protocolIEs.list.array);
6733 /*******************************************************************
6735 * @brief Process RIC Subscription Modification Refuse Message
6739 * Function : procRicSubscriptionModificationRefuse
6741 * Functionality: Process RIC Subscription Modification Refuse
6742 * Message received from RIC.
6744 * @param E2AP Message PDU
6747 ******************************************************************/
6748 void procRicSubscriptionModificationRefuse(E2AP_PDU_t *e2apMsg)
6751 uint16_t ranFuncId = 0;
6752 RicRequestId ricReqId;
6753 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
6754 RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
6755 CauseE2_t *cause = NULLP;
6757 DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Modification Refuse", __func__);
6762 DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__);
6766 if(!e2apMsg->choice.unsuccessfulOutcome)
6768 DU_LOG("\nERROR --> E2AP : %s: Unsuccessful Outcome in E2AP message is NULL", __func__);
6772 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
6773 if(!ricSubsModRefuse->protocolIEs.list.array)
6775 DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__);
6779 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
6781 if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
6783 DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx);
6787 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
6788 switch(ricSubsModRefuseIe->id)
6790 case ProtocolIE_IDE2_id_RICrequestID:
6792 memset(&ricReqId, 0, sizeof(RicRequestId));
6793 ricReqId.requestorId = ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID;
6794 ricReqId.instanceId = ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID;
6798 case ProtocolIE_IDE2_id_RANfunctionID:
6800 ranFuncId = ricSubsModRefuseIe->value.choice.RANfunctionID;
6804 case ProtocolIE_IDE2_id_CauseE2:
6806 DU_LOG("\nDEBUG --> E2AP : %s: RIC subscriptiom modification refused for RIC_Requestor_ID [%d] \
6807 RIC_Instance_ID [%d] RAN_Function_ID [%d] ", __func__, ricReqId.requestorId, \
6808 ricReqId.instanceId, ranFuncId);
6810 cause = &ricSubsModRefuseIe->value.choice.CauseE2;
6811 printE2ErrorCause(cause);
6816 } /* End of switch for Protocol IE Id */
6817 } /* End of for loop for Protocol IE list */
6822 freeAperDecodingOfRicSubsModRefuse(e2apMsg);
6826 /*******************************************************************
6828 * @brief Free RIC Subscription Delete Required Message
6832 * Function : FreeRicSubscriptionDeleteRequired
6834 * Functionality: Free RIC Subscription Delete Required
6836 * @param E2AP Message PDU
6839 ******************************************************************/
6840 void FreeRicSubscriptionDeleteRequired(E2AP_PDU_t *e2apMsg, CmLListCp *ricSubsToBeDelList)
6842 uint8_t ieIdx = 0, arrIdx = 0;
6843 RICsubscriptionDeleteRequired_t *ricSubsDelRqd = NULLP;
6844 RICsubscriptionDeleteRequired_IEs_t *ricSubsDelRqdIe = NULLP;
6845 RICsubscription_List_withCause_t *ricSubsList = NULLP;
6846 CmLList *subsNode = NULLP;
6850 if(e2apMsg->choice.initiatingMessage)
6852 ricSubsDelRqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequired;
6853 if(ricSubsDelRqd->protocolIEs.list.array)
6855 for(ieIdx = 0; ieIdx < ricSubsDelRqd->protocolIEs.list.count; ieIdx++)
6857 if(ricSubsDelRqd->protocolIEs.list.array[ieIdx])
6859 ricSubsDelRqdIe = ricSubsDelRqd->protocolIEs.list.array[ieIdx];
6860 switch(ricSubsDelRqdIe->id)
6862 case ProtocolIE_IDE2_id_RICsubscriptionToBeRemoved:
6864 ricSubsList = &ricSubsDelRqdIe->value.choice.RICsubscription_List_withCause;
6865 if(ricSubsList->list.array)
6867 for(arrIdx = 0; arrIdx < ricSubsList->list.count; arrIdx++)
6869 DU_FREE(ricSubsList->list.array[ieIdx], sizeof(RICsubscription_withCause_ItemIEs_t));
6871 DU_FREE(ricSubsList->list.array, ricSubsList->list.size);
6876 DU_FREE(ricSubsDelRqd->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequired_IEs_t));
6879 DU_FREE(ricSubsDelRqd->protocolIEs.list.array, ricSubsDelRqd->protocolIEs.list.size);
6881 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
6883 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));;
6886 if(ricSubsToBeDelList)
6888 CM_LLIST_FIRST_NODE(ricSubsToBeDelList, subsNode);
6891 cmLListDelFrm(ricSubsToBeDelList, subsNode);
6892 DU_FREE(subsNode, sizeof(CmLList));
6893 CM_LLIST_FIRST_NODE(ricSubsToBeDelList, subsNode);
6898 /*******************************************************************
6900 * @brief Fill list of RIC subscriptions required to be deleted
6901 * with the cause of deletion
6905 * Function : fillRicSubsListWithCause
6907 * Functionality: Fill list of RIC subscriptions required to be
6908 * deleted with the cause of deletion
6910 * @param E2AP Message PDU
6913 ******************************************************************/
6914 uint8_t fillRicSubsListWithCause(RICsubscription_List_withCause_t *ricSubsList, CmLListCp ricSubsToBeDelList)
6917 CmLList *subsNode = NULLP;
6918 RicSubscription *subsInfo = NULLP;
6919 RICsubscription_withCause_ItemIEs_t *subsItemIe = NULLP;
6920 RICsubscription_withCause_Item_t *subsItem = NULLP;
6922 ricSubsList->list.count = ricSubsToBeDelList.count;
6923 ricSubsList->list.size = ricSubsList->list.count * sizeof(RICsubscription_withCause_ItemIEs_t *);
6924 DU_ALLOC(ricSubsList->list.array, ricSubsList->list.size);
6925 if(!ricSubsList->list.array)
6927 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
6931 CM_LLIST_FIRST_NODE(&ricSubsToBeDelList, subsNode);
6932 while(subsNode && (ieIdx < ricSubsList->list.count))
6934 subsInfo = (RicSubscription *)subsNode->node;
6935 DU_ALLOC(ricSubsList->list.array[ieIdx], sizeof(RICsubscription_withCause_ItemIEs_t));
6936 if(!ricSubsList->list.array[ieIdx])
6938 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
6942 subsItemIe = (RICsubscription_withCause_ItemIEs_t *)ricSubsList->list.array[ieIdx];
6943 subsItemIe->id = ProtocolIE_IDE2_id_RICsubscription_withCause_Item;
6944 subsItemIe->criticality = CriticalityE2_ignore;
6945 subsItemIe->value.present = RICsubscription_withCause_ItemIEs__value_PR_RICsubscription_withCause_Item;
6947 subsItem = & subsItemIe->value.choice.RICsubscription_withCause_Item;
6948 subsItem->ricRequestID.ricRequestorID = subsInfo->requestId.requestorId;
6949 subsItem->ricRequestID.ricInstanceID = subsInfo->requestId.instanceId;
6950 subsItem->ranFunctionID = subsInfo->ranFuncId;
6951 fillE2Cause(&subsItem->cause, subsInfo->failureCause);
6954 subsNode = subsNode->next;
6960 /*******************************************************************
6962 * @brief Builds and Send RIC Subscription delete required
6966 * Function : BuildAndSendRicSubscriptionDeleteRequired
6968 * Functionality: Build and send RIC subscription delete required.
6969 * There can be 2 approaches to trigger following. One of these
6970 * approaches may/may not be implemented in future:
6971 * 1. It can be triggerred immediately when a RIC subscription's
6972 * End Time has expired. In this case, only this subscription's
6973 * info will be sent in this message.
6974 * Since we have not yet added support to execute RIC
6975 * Subscription based on Start Time and End Timer, this message is
6976 * not triggered anywhere from DU APP yet.
6977 * 2. Another approach is to have a periodic timer to check subscription
6978 * status running in background.
6979 * When RIC Subscription End Time expires, this subscription is
6980 * marked to be deleted. Later when this background timer expires,
6981 * a RIC Subscription delete required is sent with all the
6982 * subscription's info which is marked to be deleted.
6983 * The following function is implemented keeping in mind the second
6987 * @return ROK - success
6990 ******************************************************************/
6991 uint8_t BuildAndSendRicSubscriptionDeleteRequired()
6993 uint8_t elementCnt = 0, ieIdx = 0, ret = RFAILED;
6994 E2AP_PDU_t *e2apMsg = NULLP;
6995 RICsubscriptionDeleteRequired_t *ricSubsDelRqd = NULLP;
6996 RICsubscriptionDeleteRequired_IEs_t *ricSubsDelRqdIe = NULLP;
6997 asn_enc_rval_t encRetVal; /* Encoder return value */
6998 CmLListCp ricSubsToBeDelList;
7002 /* Check if there are any RIC subscriptions to be deleted */
7003 cmLListInit(&ricSubsToBeDelList);
7004 fetchRicSubsToBeDeleted(&ricSubsToBeDelList);
7005 if(ricSubsToBeDelList.count == 0)
7007 DU_LOG("\nDEBUG --> E2AP : %s: No RIC subscriptions are required to be deleted", __func__);
7011 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Delete Required Message\n");
7013 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
7014 if(e2apMsg == NULLP)
7016 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
7020 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
7021 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
7022 if(e2apMsg->choice.initiatingMessage == NULLP)
7024 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
7027 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionDeleteRequired;
7028 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
7029 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequired;
7031 ricSubsDelRqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequired;
7034 ricSubsDelRqd->protocolIEs.list.count = elementCnt;
7035 ricSubsDelRqd->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionDeleteRequired_IEs_t *);
7037 DU_ALLOC(ricSubsDelRqd->protocolIEs.list.array, ricSubsDelRqd->protocolIEs.list.size);
7038 if(ricSubsDelRqd->protocolIEs.list.array == NULLP)
7040 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for array elements at line %d",__func__, __LINE__);
7044 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
7046 DU_ALLOC(ricSubsDelRqd->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequired_IEs_t));
7047 if(ricSubsDelRqd->protocolIEs.list.array[ieIdx] == NULLP)
7049 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for index [%d] at line %d", \
7050 __func__, ieIdx, __LINE__);
7054 if(ieIdx < elementCnt)
7058 ricSubsDelRqdIe = ricSubsDelRqd->protocolIEs.list.array[ieIdx];
7059 ricSubsDelRqdIe->id = ProtocolIE_IDE2_id_RICsubscriptionToBeRemoved;
7060 ricSubsDelRqdIe->criticality = CriticalityE2_ignore;
7061 ricSubsDelRqdIe->value.present = RICsubscriptionDeleteRequired_IEs__value_PR_RICsubscription_List_withCause;
7062 if(fillRicSubsListWithCause(&ricSubsDelRqdIe->value.choice.RICsubscription_List_withCause, ricSubsToBeDelList)\
7065 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Subscription list with cause", __func__);
7069 /* Prints the Msg formed */
7070 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
7071 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7073 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
7074 if(encRetVal.encoded == ENCODE_FAIL)
7076 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Delete Required Message (at %s)\n",\
7077 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7082 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Delete Required Message \n");
7083 #ifdef DEBUG_ASN_PRINT
7084 for(int i=0; i< encBufSize; i++)
7086 printf("%x",encBuf[i]);
7091 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
7093 DU_LOG("\nERROR --> E2AP : Failed to send RIC Susbcription Delete Required Message");
7100 FreeRicSubscriptionDeleteRequired(e2apMsg, &ricSubsToBeDelList);
7104 /*******************************************************************
7106 * @brief Free RIC Subscription Delete Request Message
7110 * Function : freeAperDecodingOfRicSubsDeleteReq
7112 * Functionality: Free RIC Subscription Delete Request
7114 * @param E2AP Message PDU
7117 ******************************************************************/
7118 void freeAperDecodingOfRicSubsDeleteReq(E2AP_PDU_t *e2apMsg)
7121 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
7125 if(e2apMsg->choice.initiatingMessage)
7127 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
7128 if(ricSubsDelReq->protocolIEs.list.array)
7130 for(ieIdx = 0; ieIdx < ricSubsDelReq->protocolIEs.list.count; ieIdx++)
7132 if(ricSubsDelReq->protocolIEs.list.array[ieIdx])
7134 free(ricSubsDelReq->protocolIEs.list.array[ieIdx]);
7137 free(ricSubsDelReq->protocolIEs.list.array);
7143 /*******************************************************************
7145 * @brief Process RIC Subscription delete request
7149 * Function : procRicSubscriptionDeleteRequest
7151 * Functionality: Process RIC subscription delete request.
7152 * Fetch RAN Function and RIC subscription to be deleted.
7153 * Send statistics delete request to MAC for all action sequence
7154 * within this RIC subscription.
7156 * @params[in] E2AP PDU
7159 ******************************************************************/
7160 void procRicSubscriptionDeleteRequest(E2AP_PDU_t *e2apMsg)
7163 uint16_t ranFuncId = 0;
7164 bool procFailure = false;
7165 RicRequestId ricReqId;
7166 RanFunction *ranFuncDb = NULLP;
7167 CmLList *ricSubsNode = NULLP;
7168 RicSubscription *ricSubsDb = NULLP;
7169 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
7170 RICsubscriptionDeleteRequest_IEs_t *ricSubsDelReqIe = NULLP;
7172 DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Delete Request", __func__);
7177 DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__);
7181 if(!e2apMsg->choice.initiatingMessage)
7183 DU_LOG("\nERROR --> E2AP : %s: Initiating Message in E2AP PDU is NULL", __func__);
7187 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
7188 if(!ricSubsDelReq->protocolIEs.list.array)
7190 DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__);
7194 for(ieIdx = 0; ieIdx < ricSubsDelReq->protocolIEs.list.count; ieIdx++)
7196 if(!ricSubsDelReq->protocolIEs.list.array[ieIdx])
7198 DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx);
7202 ricSubsDelReqIe = ricSubsDelReq->protocolIEs.list.array[ieIdx];
7203 switch(ricSubsDelReqIe->id)
7205 case ProtocolIE_IDE2_id_RICrequestID:
7207 memset(&ricReqId, 0, sizeof(RicRequestId));
7208 ricReqId.requestorId = ricSubsDelReqIe->value.choice.RICrequestID.ricRequestorID;
7209 ricReqId.instanceId = ricSubsDelReqIe->value.choice.RICrequestID.ricInstanceID;
7213 case ProtocolIE_IDE2_id_RANfunctionID:
7215 ranFuncId = ricSubsDelReqIe->value.choice.RANfunctionID;
7216 ranFuncDb = fetchRanFuncFromRanFuncId(ranFuncId);
7219 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%d] not found", __func__, ranFuncId);
7224 ricSubsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
7227 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%d] Instance_ID [%d]",\
7228 __func__, ricReqId.requestorId, ricReqId.instanceId);
7233 //TODO : Send statistics delete request to MAC
7239 } /* End of switch for Protocol IE Id */
7243 } /* End of for loop for Protocol IE list */
7248 freeAperDecodingOfRicSubsDeleteReq(e2apMsg);
7252 /*******************************************************************
7254 * @brief Deallocate the memory allocated for E2 node configuration
7255 * update ack msg by aper decoder
7259 * Function : freeAperDecodingOfE2NodeConfigUpdateAck
7262 * - Deallocate the memory allocated for E2 node configuration
7263 * update ack msg by aper decoder
7265 * @params[in] E2AP_PDU_t *e2apMsg
7266 * @return ROK - success
7269 * ****************************************************************/
7271 void freeAperDecodingOfE2NodeConfigUpdateAck(E2nodeConfigurationUpdateAcknowledge_t *updateAckMsg)
7273 uint8_t arrIdx =0, e2NodeConfigIdx=0;
7274 E2nodeComponentConfigUpdateAck_ItemIEs_t *updateAckItemIe=NULL;
7275 E2nodeComponentConfigUpdateAck_List_t *updateAckList=NULL;
7276 E2nodeComponentConfigRemovalAck_ItemIEs_t *removalAckItemIe=NULL;
7277 E2nodeComponentConfigRemovalAck_List_t *removalAckList=NULL;
7278 E2nodeComponentConfigAdditionAck_ItemIEs_t *additionAckItemIte=NULL;
7279 E2nodeComponentConfigAdditionAck_List_t *additionAckList=NULL;
7281 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULLP;
7282 if(updateAckMsg->protocolIEs.list.array != NULLP)
7284 for(arrIdx = 0; arrIdx < updateAckMsg->protocolIEs.list.count; arrIdx++)
7286 if(updateAckMsg->protocolIEs.list.array[arrIdx])
7288 switch(updateAckMsg->protocolIEs.list.array[arrIdx]->id)
7290 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
7292 additionAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
7293 if(additionAckList->list.array)
7295 for(e2NodeConfigIdx=0; e2NodeConfigIdx<additionAckList->list.count; e2NodeConfigIdx++)
7297 additionAckItemIte = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) additionAckList->list.array[e2NodeConfigIdx];
7298 if(additionAckItemIte)
7300 switch(additionAckItemIte->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.present)
7302 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
7304 f1InterfaceInfo = additionAckItemIte->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
7305 free(f1InterfaceInfo->gNB_DU_ID.buf);
7306 free(f1InterfaceInfo);
7312 free(additionAckItemIte);
7314 free(additionAckList->list.array);
7319 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
7321 updateAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdateAck_List;
7322 if(updateAckList->list.array)
7324 for(e2NodeConfigIdx=0; e2NodeConfigIdx<updateAckList->list.count; e2NodeConfigIdx++)
7326 updateAckItemIe = (E2nodeComponentConfigUpdateAck_ItemIEs_t*) updateAckList->list.array[e2NodeConfigIdx];
7329 switch(updateAckItemIe->value.choice.E2nodeComponentConfigUpdateAck_Item.e2nodeComponentID.present)
7331 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
7333 f1InterfaceInfo = updateAckItemIe->value.choice.E2nodeComponentConfigUpdateAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
7334 free(f1InterfaceInfo->gNB_DU_ID.buf);
7335 free(f1InterfaceInfo);
7341 free(updateAckItemIe);
7344 free(updateAckList->list.array);
7348 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
7350 removalAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemovalAck_List;
7351 if(removalAckList->list.array)
7353 for(e2NodeConfigIdx=0; e2NodeConfigIdx<removalAckList->list.count; e2NodeConfigIdx++)
7355 removalAckItemIe = (E2nodeComponentConfigRemovalAck_ItemIEs_t*) removalAckList->list.array[e2NodeConfigIdx];
7356 if(removalAckItemIe)
7358 switch(removalAckItemIe->value.choice.E2nodeComponentConfigRemovalAck_Item.e2nodeComponentID.present)
7360 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
7362 f1InterfaceInfo = removalAckItemIe->value.choice.E2nodeComponentConfigRemovalAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
7363 free(f1InterfaceInfo->gNB_DU_ID.buf);
7364 free(f1InterfaceInfo);
7370 free(removalAckItemIe);
7373 free(removalAckList->list.array);
7378 free(updateAckMsg->protocolIEs.list.array[arrIdx]);
7381 free(updateAckMsg->protocolIEs.list.array);
7385 /******************************************************************
7387 * @brief Processes the E2 node config update ack msg
7391 * Function :procE2NodeConfigUpdateAck
7393 * Functionality: Processes the E2 node config update ack msg
7395 * @params[in] E2AP_PDU_t ASN decoded E2AP message
7396 * @return ROK - success
7399 * ****************************************************************/
7401 void procE2NodeConfigUpdateAck(E2AP_PDU_t *e2apMsg)
7404 uint16_t e2CfgIdx =0;
7405 E2nodeConfigurationUpdateAcknowledge_t *e2NodeConfigUpdateAck =NULLP;
7406 E2nodeComponentConfigUpdateAck_List_t *e2NodeConfigUpdateAckList=NULLP;
7407 E2nodeComponentConfigUpdateAck_ItemIEs_t *e2NodeUpdateAckItem=NULLP;
7408 E2nodeComponentConfigRemovalAck_List_t *e2NodeConfigRemovalAckList=NULLP;
7409 E2nodeComponentConfigRemovalAck_ItemIEs_t *e2NodeRemovalAckItem=NULLP;
7410 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList=NULLP;
7411 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAdditionAckItem=NULLP;
7413 e2NodeConfigUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.E2nodeConfigurationUpdateAcknowledge;
7415 if(e2NodeConfigUpdateAck->protocolIEs.list.array)
7417 for(arrIdx =0; arrIdx<e2NodeConfigUpdateAck->protocolIEs.list.count; arrIdx++)
7419 switch(e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id)
7421 case ProtocolIE_IDE2_id_TransactionID:
7425 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
7427 e2NodeConfigAdditionAckList = &e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
7428 if(e2NodeConfigAdditionAckList->list.array)
7430 for(e2CfgIdx = 0; e2CfgIdx< e2NodeConfigAdditionAckList->list.count; e2CfgIdx++)
7432 e2NodeAdditionAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[e2CfgIdx];
7433 handleE2NodeConfigUpdateAckIes((PTR)&e2NodeAdditionAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item,\
7434 ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck);
7439 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
7441 e2NodeConfigUpdateAckList = &e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdateAck_List;
7442 if(e2NodeConfigUpdateAckList->list.array)
7444 for(e2CfgIdx = 0; e2CfgIdx< e2NodeConfigUpdateAckList->list.count; e2CfgIdx++)
7446 e2NodeUpdateAckItem = (E2nodeComponentConfigUpdateAck_ItemIEs_t*) e2NodeConfigUpdateAckList->list.array[e2CfgIdx];
7447 handleE2NodeConfigUpdateAckIes((PTR)&e2NodeUpdateAckItem->value.choice.E2nodeComponentConfigUpdateAck_Item,\
7448 ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck);
7453 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
7455 e2NodeConfigRemovalAckList = &e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemovalAck_List;
7456 if(e2NodeConfigRemovalAckList->list.array)
7458 for(e2CfgIdx = 0; e2CfgIdx< e2NodeConfigRemovalAckList->list.count; e2CfgIdx++)
7460 e2NodeRemovalAckItem = (E2nodeComponentConfigRemovalAck_ItemIEs_t*) e2NodeConfigRemovalAckList->list.array[e2CfgIdx];
7461 handleE2NodeConfigUpdateAckIes((PTR)&e2NodeRemovalAckItem->value.choice.E2nodeComponentConfigRemovalAck_Item,\
7462 ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck);
7471 freeAperDecodingOfE2NodeConfigUpdateAck(e2NodeConfigUpdateAck);
7474 /*******************************************************************
7476 * @brief Handles received E2AP message and sends back response
7480 * Function : E2APMsgHdlr
7483 * - Decodes received E2AP control message
7484 * - Prepares response message, encodes and sends to SCTP
7487 * @return ROK - success
7490 * ****************************************************************/
7491 void E2APMsgHdlr(Buffer *mBuf)
7494 char *recvBuf = NULLP;
7496 MsgLen recvBufLen =0;
7497 E2AP_PDU_t *e2apMsg = NULLP;
7498 asn_dec_rval_t rval ={0}; /* Decoder return value */
7499 E2AP_PDU_t e2apasnmsg={0} ;
7501 DU_LOG("\nDEBUG --> E2AP : Received E2AP message buffer");
7502 ODU_PRINT_MSG(mBuf, 0,0);
7504 /* Copy mBuf into char array to decode it */
7505 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7506 DU_ALLOC(recvBuf, (Size)recvBufLen);
7508 if(recvBuf == NULLP)
7510 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
7513 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7515 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
7519 #ifdef DEBUG_ASN_PRINT
7520 printf("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
7521 for(i=0; i< recvBufLen; i++)
7523 printf("%x",recvBuf[i]);
7527 /* Decoding flat buffer into E2AP messsage */
7528 e2apMsg = &e2apasnmsg;
7529 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
7531 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
7532 DU_FREE(recvBuf, (Size)recvBufLen);
7534 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7536 DU_LOG("\nERROR --> E2AP : ASN decode failed");
7540 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
7542 switch(e2apMsg->present)
7544 case E2AP_PDU_PR_unsuccessfulOutcome:
7546 switch(e2apMsg->choice.unsuccessfulOutcome->value.present)
7548 case UnsuccessfulOutcomeE2__value_PR_E2setupFailure:
7550 procE2SetupFailure(e2apMsg);
7553 case UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure:
7555 procE2NodeConfigUpdateFailure(e2apMsg);
7558 case UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure:
7560 procRicServiceUpdateFailure(e2apMsg);
7563 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse:
7565 procRicSubscriptionModificationRefuse(e2apMsg);
7570 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_unsuccessfulOutcome [%d]",\
7571 e2apMsg->choice.unsuccessfulOutcome->value.present);
7575 free(e2apMsg->choice.unsuccessfulOutcome);
7578 case E2AP_PDU_PR_successfulOutcome:
7580 switch(e2apMsg->choice.successfulOutcome->value.present)
7582 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
7586 procE2SetupRsp(e2apMsg);
7590 case SuccessfulOutcomeE2__value_PR_ResetResponseE2:
7592 procResetResponse(e2apMsg);
7595 case SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge:
7597 procRicServiceUpdateAck(e2apMsg);
7600 case SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm:
7602 procRicSubscriptionModificationConfirm(e2apMsg);
7605 case SuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateAcknowledge:
7607 procE2NodeConfigUpdateAck(e2apMsg);
7612 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_successfulOutcome [%d]",\
7613 e2apMsg->choice.successfulOutcome->value.present);
7616 }/* End of switch(successfulOutcome) */
7617 free(e2apMsg->choice.successfulOutcome);
7621 case E2AP_PDU_PR_initiatingMessage:
7623 switch(e2apMsg->choice.initiatingMessage->value.present)
7625 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
7627 procRicSubscriptionRequest(e2apMsg);
7630 case InitiatingMessageE2__value_PR_RICserviceQuery:
7632 procRicServiceQuery(e2apMsg);
7635 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
7637 DU_LOG("\nINFO --> E2AP : Error indication received");
7640 case InitiatingMessageE2__value_PR_ResetRequestE2:
7642 DU_LOG("\nINFO --> E2AP : Error indication received");
7643 procE2ResetRequest(e2apMsg);
7646 case InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequest:
7648 DU_LOG("\nINFO --> E2AP : RIC Subscription Delete Request received");
7649 procRicSubscriptionDeleteRequest(e2apMsg);
7654 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_initiatingMessage [%d]",\
7655 e2apMsg->choice.initiatingMessage->value.present);
7658 }/* End of switch(initiatingMessage) */
7659 free(e2apMsg->choice.initiatingMessage);
7664 DU_LOG("\nERROR --> E2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
7669 }/* End of switch(e2apMsg->present) */
7671 } /* End of E2APMsgHdlr */
7673 /**********************************************************************
7675 **********************************************************************/