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 *******************************************************************************/
19 /* This file contains E2AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ric_stub_sctp.h"
26 #include "ric_e2ap_msg_hdl.h"
27 #include "GlobalE2node-gNB-ID.h"
28 #include "ProtocolIE-FieldE2.h"
29 #include "InitiatingMessageE2.h"
30 #include "SuccessfulOutcomeE2.h"
31 #include "UnsuccessfulOutcomeE2.h"
34 #include "E2nodeComponentInterfaceF1.h"
35 #include "E2SM-KPM-RANfunction-Description.h"
36 #include "RANfunction-Name.h"
37 #include "RIC-EventTriggerStyle-Item.h"
38 #include "RIC-ReportStyle-Item.h"
39 #include "MeasurementInfo-Action-Item.h"
40 #include "MeasurementInfoItem.h"
41 #include "E2SM-KPM-ActionDefinition-Format1.h"
42 #include "E2SM-KPM-ActionDefinition.h"
43 #include "E2SM-KPM-EventTriggerDefinition-Format1.h"
44 #include "E2SM-KPM-EventTriggerDefinition.h"
46 /*******************************************************************
48 * @brief fill E2 failure cause
52 * Function : fillE2FailureCause
54 * Functionality: fill E2 failure cause
55 * @return ROK - success
58 ******************************************************************/
60 void fillE2FailureCause(CauseE2_t *cause, CauseE2_PR causePresent, uint8_t reason)
62 cause->present = causePresent;
64 switch(cause->present)
66 case CauseE2_PR_ricRequest:
67 cause->choice.ricRequest = reason;
69 case CauseE2_PR_ricService:
70 cause->choice.ricService = reason;
72 case CauseE2_PR_e2Node:
73 cause->choice.e2Node = reason;
75 case CauseE2_PR_transport:
76 cause->choice.transport = reason;
78 case CauseE2_PR_protocol:
79 cause->choice.protocol = reason;
82 cause->choice.misc = reason;
85 cause->choice.misc = CauseE2Misc_unspecified;
90 /*******************************************************************
92 * @brief Assigns new transaction id to RIC initiated procedure
96 * Function : assignTransactionId
98 * Functionality: Assigns new transaction id to a RIC initiated
101 * @params[in] Region region
103 * @return ROK - success
106 * ****************************************************************/
108 uint8_t assignTransactionId(DuDb *duDb)
110 uint8_t currTransId = duDb->ricTransIdCounter;
112 /* Update to next valid value */
113 duDb->ricTransIdCounter++;
114 if(duDb->ricTransIdCounter == MAX_NUM_TRANSACTION)
115 duDb->ricTransIdCounter = 0;
120 /*******************************************************************
122 * @brief Sends E2 msg over SCTP
126 * Function : SendE2APMsg
128 * Functionality: Sends E2 msg over SCTP
130 * @params[in] Region region
132 * @return ROK - success
135 * ****************************************************************/
137 uint8_t SendE2APMsg(Region region, Pool pool, uint32_t duId)
141 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
143 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
145 ODU_PRINT_MSG(mBuf, 0,0);
147 if(sctpSend(duId, mBuf) != ROK)
149 DU_LOG("\nERROR --> E2AP : SCTP Send for E2 failed");
150 ODU_PUT_MSG_BUF(mBuf);
156 DU_LOG("\nERROR --> E2AP : ODU_ADD_POST_MSG_MULT failed");
157 ODU_PUT_MSG_BUF(mBuf);
160 ODU_PUT_MSG_BUF(mBuf);
164 DU_LOG("\nERROR --> E2AP : Failed to allocate memory");
171 /*******************************************************************
173 * @brief Fetches RAN Function DB
177 * Function : fetchRanFuncFromRanFuncId
179 * Functionality: Fetches RAN function DB from E2AP DB using
182 * @params[in] RAN Function ID
183 * @return RAN Function DB
184 * NULL, in case of failure
186 * ****************************************************************/
187 RanFunction *fetchRanFuncFromRanFuncId(DuDb *duDb, uint16_t ranFuncId)
189 RanFunction *ranFuncDb = NULLP;
191 /* Fetch RAN Function DB */
192 if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
194 ranFuncDb = &duDb->ranFunction[ranFuncId-1];
198 DU_LOG("\nERROR --> DU_APP : fetchRanFuncFromRanFuncId: Invalid RAN Function ID[%d]", ranFuncId);
204 /*******************************************************************
206 * @brief Fetch subscripton DB
210 * Function : fetchSubsInfoFromRicReqId
212 * Functionality: Fetches subscription DB from RAN Function DB
213 * using RIC Request ID
215 * @params[in] RIC Request ID
217 * Pointer to RIC Subscription node to be searched
218 * @return RIC Subscription from RAN Function's subcription list
219 * NULL, in case of failure
221 * ****************************************************************/
222 RicSubscription *fetchSubsInfoFromRicReqId(RicRequestId ricReqId, RanFunction *ranFuncDb, CmLList **ricSubscriptionNode)
224 RicSubscription *ricSubscriptionInfo = NULLP;
226 /* Fetch subscription detail in RAN Function DB */
227 CM_LLIST_FIRST_NODE(&ranFuncDb->subscriptionList, *ricSubscriptionNode);
228 while(*ricSubscriptionNode)
230 ricSubscriptionInfo = (RicSubscription *)((*ricSubscriptionNode)->node);
231 if(ricSubscriptionInfo && (ricSubscriptionInfo->requestId.requestorId == ricReqId.requestorId) &&
232 (ricSubscriptionInfo->requestId.instanceId == ricReqId.instanceId))
236 *ricSubscriptionNode = (*ricSubscriptionNode)->next;
237 ricSubscriptionInfo = NULLP;
240 if(!ricSubscriptionInfo)
242 DU_LOG("\nERROR --> E2AP : fetchSubsInfoFromRicReqId: Subscription not found for Requestor ID [%d] \
243 Instance ID [%d] in RAN Function ID [%d]", ricReqId.requestorId, ricReqId.instanceId, ranFuncDb->id);
246 return ricSubscriptionInfo;
249 /*******************************************************************
251 * @brief Fetch Action details
255 * Function : fetchActionInfoFromActionId
257 * Functionality: Fetch action details from RIC subscription DB
260 * @params[in] Action ID
261 * RIC Subscription DB
262 * @return Action Info DB
263 * NULL, in case of failure
265 * ****************************************************************/
266 ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo)
268 ActionInfo *actionInfoDb = NULLP;
269 if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId)
271 actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId];
275 DU_LOG("\nERROR --> E2AP : fetchActionInfoFromActionId: Action Id [%d] not found in \
276 subscription info [Requestor id : %d] [Instance Id : %d]", actionId,\
277 ricSubscriptionInfo->requestId.requestorId, ricSubscriptionInfo->requestId.instanceId);
283 /******************************************************************
285 * @brief Search E2 node component with the help of interface type
290 * Function : fetchE2NodeComponentInfo
292 * Functionality: Search E2 node component
297 * Pointer to E2 component node to be searched
300 * ****************************************************************/
302 E2NodeComponent *fetchE2NodeComponentInfo(DuDb *duDb, InterfaceType interfaceType,CmLList **e2ComponentNode)
304 E2NodeComponent *e2NodeComponentInfo=NULLP;
306 if(duDb->e2NodeComponent.count)
308 CM_LLIST_FIRST_NODE(&duDb->e2NodeComponent, *e2ComponentNode);
309 while(*e2ComponentNode)
311 e2NodeComponentInfo = (E2NodeComponent*)((*e2ComponentNode)->node);
312 if((e2NodeComponentInfo->interfaceType == interfaceType))
317 *e2ComponentNode = (*e2ComponentNode)->next;
318 e2NodeComponentInfo = NULLP;
321 return e2NodeComponentInfo;
324 /*******************************************************************
326 * @brief update E2 node config list
330 * Function : updateE2NodeConfigList
333 * - update E2 node config list
337 * Configuration which need to update in Database
339 * @return ROK - success
342 * ****************************************************************/
343 uint8_t updateE2NodeConfigList(DuDb **duDb, uint8_t protocolId, E2NodeConfigItem *tmpCfg)
346 E2NodeComponent * e2NodeComponentInfo;
347 bool configFound= false;
351 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
353 /* Adding the new e2 node component in DB*/
354 RIC_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent));
355 e2NodeComponentInfo->interfaceType = tmpCfg->componentInfo.interfaceType;
356 e2NodeComponentInfo->componentId =tmpCfg->componentInfo.componentId;
357 RIC_ALLOC(node, sizeof(CmLList));
360 node->node = (PTR) e2NodeComponentInfo;
361 cmLListAdd2Tail(&(*duDb)->e2NodeComponent, node);
366 DU_LOG("\nERROR --> E2AP : Memory allocation failed for e2NodeComponentList node");
367 RIC_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
372 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
374 /* searching for information in a database */
375 e2NodeComponentInfo = fetchE2NodeComponentInfo((*duDb),tmpCfg->componentInfo.interfaceType, &node);
376 if(!e2NodeComponentInfo)
378 DU_LOG("\nERROR --> E2AP : Failed to find the e2 component node");
381 /* If the node is present then update the value */
382 e2NodeComponentInfo->componentId =tmpCfg->componentInfo.componentId;
386 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
388 /* searching for information in a database */
389 e2NodeComponentInfo = fetchE2NodeComponentInfo((*duDb),tmpCfg->componentInfo.interfaceType, &node);
390 if(!e2NodeComponentInfo)
392 DU_LOG("\nERROR --> E2AP : Failed to find the e2 component node");
395 /* Delete the node from the list */
396 e2NodeComponentInfo->componentId = tmpCfg->componentInfo.componentId;
397 cmLListDelFrm(&(*duDb)->e2NodeComponent, node);
398 RIC_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
404 /* If the configuration update was successful, then mark the isSuccessful as
405 * true; otherwise, mark it as false. */
406 if(configFound == true)
407 tmpCfg->isSuccessful = true;
409 tmpCfg->isSuccessful = false;
414 /*******************************************************************
416 * @brief Handling the E2 node configuration depending on the add,
417 * update, or remove configuration type
421 * Function : handleE2NodeComponentAction
424 * - Handling the E2 node configuration depending on the add,
425 * update, or remove configuration type
428 * Pointer to e2NodeCfg which has info
430 * E2NodeConfigItem to be filled
432 * @return ROK - success
435 * ****************************************************************/
437 uint8_t handleE2NodeComponentAction(DuDb *duDb, PTR e2NodeCfg, uint8_t protocolId, E2NodeConfigItem *storeCfg)
439 uint8_t configFound = ROK;
440 E2NodeConfigItem tmpCfg;
441 E2nodeComponentID_t componentId;
442 E2nodeComponentInterfaceType_t interface;
443 E2nodeComponentConfigAddition_Item_t *addCfg=NULL;
444 E2nodeComponentConfigUpdate_Item_t *updateCfg=NULL;
445 E2nodeComponentConfigRemoval_Item_t *removeCfg=NULL;
447 /* fetching the interface and component id information from the e2NodeCfg */
448 memset(storeCfg, 0, sizeof(E2NodeConfigItem));
449 storeCfg->isSuccessful=false;
450 memset(&tmpCfg, 0, sizeof(E2NodeConfigItem));
454 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
456 addCfg = (E2nodeComponentConfigAddition_Item_t *)e2NodeCfg;
457 interface = addCfg->e2nodeComponentInterfaceType;
458 componentId = addCfg->e2nodeComponentID;
461 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
463 updateCfg = (E2nodeComponentConfigUpdate_Item_t *)e2NodeCfg;
464 interface = updateCfg->e2nodeComponentInterfaceType;
465 componentId = updateCfg->e2nodeComponentID;
468 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
470 removeCfg = (E2nodeComponentConfigRemoval_Item_t*)e2NodeCfg;
471 interface = removeCfg->e2nodeComponentInterfaceType;
472 componentId = removeCfg->e2nodeComponentID;
477 /* Storing the information in temporary structure */
478 tmpCfg.componentInfo.interfaceType = interface;
480 switch(componentId.present)
482 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
484 if(componentId.choice.e2nodeComponentInterfaceTypeF1)
486 tmpCfg.componentInfo.componentId = componentId.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0];
496 /* Updating the database configuration */
497 configFound = updateE2NodeConfigList(&duDb, protocolId, &tmpCfg);
499 memcpy(storeCfg, &tmpCfg,sizeof(E2NodeConfigItem));
504 /*******************************************************************
506 * @brief deallocate memory allocated in E2 Node Config Update Failure
510 * Function : FreeE2ConfigUpdateFail
512 * Functionality: deallocate memory allocated in E2 Node Config Update Failure
514 * @params[in] E2AP_PDU_t *e2apMsg
517 * ****************************************************************/
519 void FreeE2ConfigUpdateFail(E2AP_PDU_t *e2apMsg)
522 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail=NULL;
526 if(e2apMsg->choice.unsuccessfulOutcome)
528 e2NodeCfgUpdFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
529 if(e2NodeCfgUpdFail->protocolIEs.list.array)
531 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
533 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateFailure_IEs_t));
535 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array, e2NodeCfgUpdFail->protocolIEs.list.size);
537 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
539 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
543 /*******************************************************************
545 * @brief Buld and send the E2 Node Config Update failure
549 * Function : BuildAndSendE2NodeConfigUpdateFailure
552 * - Buld and send the E2 Node Config Update failure
553 * @return ROK - success
556 * ****************************************************************/
558 uint8_t BuildAndSendE2NodeConfigUpdateFailure(uint32_t duId, uint8_t transId, uint8_t causeInfo, uint8_t causeReason)
560 E2AP_PDU_t *e2apMsg = NULL;
561 asn_enc_rval_t encRetVal;
563 uint8_t elementCnt=0;
564 bool memAllocFailed = false;
565 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdateFail=NULL;
567 DU_LOG("\nINFO --> E2AP : Building E2 Node Config Update failure\n");
570 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
573 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
576 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
577 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
578 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
580 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
584 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
585 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
586 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure;
587 e2NodeCfgUpdateFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
590 e2NodeCfgUpdateFail->protocolIEs.list.count = elementCnt;
591 e2NodeCfgUpdateFail->protocolIEs.list.size = elementCnt * sizeof(struct E2nodeConfigurationUpdateFailure_IEs *);
593 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array, e2NodeCfgUpdateFail->protocolIEs.list.size);
594 if(e2NodeCfgUpdateFail->protocolIEs.list.array == NULLP)
596 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure array failed");
600 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
602 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx], sizeof(struct E2nodeConfigurationUpdateFailure_IEs));
603 if(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx] == NULLP)
605 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure IEs failed");
606 memAllocFailed = true;
611 if(memAllocFailed == true)
618 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
619 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
620 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
621 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
624 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
625 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
626 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
627 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = causeInfo;
628 if(causeInfo == CauseE2_PR_e2Node)
629 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.e2Node = causeReason;
631 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.misc = causeReason;
634 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
635 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
636 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
637 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
639 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
640 memset(encBuf, 0, ENC_BUF_MAX_LEN);
642 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
644 /* Check encode results */
645 if(encRetVal.encoded == ENCODE_FAIL)
647 DU_LOG("\nERROR --> E2AP : Could not encode E2 Node Config Update failure structure (at %s)\n",\
648 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
653 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Node Config Update Failure\n");
654 for(int i=0; i< encBufSize; i++)
656 DU_LOG("%x",encBuf[i]);
660 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
662 DU_LOG("\nERROR --> E2AP : Sending E2 Node Config Update Failure failed");
668 FreeE2ConfigUpdateFail(e2apMsg);
672 /*******************************************************************
674 * @brief process the E2 node configuration update
678 * Function : ProcE2NodeConfigUpdate
680 * Functionality: Process E2 node configuration update
684 * Pointer to E2nodeConfigurationUpdate
687 ******************************************************************/
689 void ProcE2NodeConfigUpdate(uint32_t duId, E2nodeConfigurationUpdate_t *e2NodeConfigUpdate)
692 E2NodeConfigList tmpE2NodeList;
694 uint8_t ieIdx = 0, duIdx = 0, elementCnt=0, transId = 0;
695 E2nodeComponentConfigAddition_List_t *e2NodeAddList=NULL;
696 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItemIe=NULL;
697 E2nodeComponentConfigAddition_Item_t *e2NodeAddItem=NULL;
698 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList=NULLP;
699 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe=NULLP;
700 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULLP;
701 E2nodeComponentConfigRemoval_List_t *e2NodeRemoveList=NULL;
702 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItemIe=NULL;
703 E2nodeComponentConfigRemoval_Item_t *e2NodeRemovalItem=NULL;
705 SEARCH_DU_DB(duIdx, duId, duDb);
708 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
712 memset(&tmpE2NodeList, 0, sizeof(E2NodeConfigList));
713 if(!e2NodeConfigUpdate)
715 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate pointer is null");
718 if(!e2NodeConfigUpdate->protocolIEs.list.array)
720 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate array pointer is null");
724 elementCnt = e2NodeConfigUpdate->protocolIEs.list.count;
725 for(ieIdx=0; ieIdx < e2NodeConfigUpdate->protocolIEs.list.count; ieIdx++)
727 if(!e2NodeConfigUpdate->protocolIEs.list.array[ieIdx])
729 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate array idx %d pointer is null",arrIdx);
733 switch(e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->id)
735 case ProtocolIE_IDE2_id_TransactionID:
737 transId = e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
738 if(transId < 0 || transId > 255)
740 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
746 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
748 e2NodeAddList =&e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigAddition_List;
749 if(e2NodeAddList->list.array)
751 for(arrIdx = 0; arrIdx< e2NodeAddList->list.count; arrIdx++)
753 e2NodeAddItemIe = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[arrIdx];
754 e2NodeAddItem = &e2NodeAddItemIe->value.choice.E2nodeComponentConfigAddition_Item;
755 /* Storing the E2 node information in DB */
756 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeAddItem, ProtocolIE_IDE2_id_E2nodeComponentConfigAddition,\
757 &tmpE2NodeList.addedE2Node[tmpE2NodeList.addedE2NodeCount++]) != ROK)
759 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
766 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
768 e2NodeUpdateList =&e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigUpdate_List;
769 if(e2NodeUpdateList->list.array)
771 for(arrIdx = 0; arrIdx< e2NodeUpdateList->list.count; arrIdx++)
773 e2NodeUpdateItemIe = (E2nodeComponentConfigUpdate_ItemIEs_t*) e2NodeUpdateList->list.array[arrIdx];
774 e2NodeUpdateItem = &e2NodeUpdateItemIe->value.choice.E2nodeComponentConfigUpdate_Item;
776 /* Updating the E2 node information in DB */
777 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeUpdateItem, ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate,\
778 &tmpE2NodeList.updatedE2Node[tmpE2NodeList.updatedE2NodeCount++]) != ROK)
780 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
787 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
789 e2NodeRemoveList = &e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigRemoval_List;
790 if(e2NodeRemoveList->list.array)
792 for(arrIdx = 0; arrIdx< e2NodeRemoveList->list.count; arrIdx++)
794 e2NodeRemovalItemIe = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemoveList->list.array[arrIdx];
795 e2NodeRemovalItem = &e2NodeRemovalItemIe->value.choice.E2nodeComponentConfigRemoval_Item;
797 /* Removing the E2 node information in DB */
798 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeRemovalItem, ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval,\
799 &tmpE2NodeList.removedE2Node[tmpE2NodeList.removedE2NodeCount++]) != ROK)
801 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
814 /* If all of the IEs are processed successfully, we will send an e2 node
815 * config update ack message.
816 * else we will be sendinf e2 node config update failure */
817 if(elementCnt == ieIdx)
819 /* TODO - Raising review next gerrit
820 if(BuildAndSendE2NodeConfigUpdateAck(duDb, transId, &tmpE2NodeList) !=ROK)
822 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 node config ack");
829 if(BuildAndSendE2NodeConfigUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
831 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 node config Failure");
836 /*******************************************************************
838 * @brief Builds Global RIC Id Params
842 * Function : BuildGlobalRicId
844 * Functionality: Building the Plmn and ric id
846 * @params[in] GlobalRIC_ID_t *ricId
847 * @return ROK - success
850 * ****************************************************************/
852 uint8_t BuildGlobalRicId(GlobalRIC_ID_t *ricId)
855 uint8_t byteSize = 3;
859 ricId->pLMN_Identity.size = byteSize * sizeof(uint8_t);
860 RIC_ALLOC(ricId->pLMN_Identity.buf, ricId->pLMN_Identity.size);
861 buildPlmnId(ricCb.ricCfgParams.plmn , ricId->pLMN_Identity.buf);
863 ricId->ric_ID.size = byteSize * sizeof(uint8_t);
864 RIC_ALLOC(ricId->ric_ID.buf, ricId->ric_ID.size);
865 fillBitString(&ricId->ric_ID, unused, byteSize, ricVal);
870 /*******************************************************************
872 * @brief deallocate the memory allocated in E2SetupResponse
876 * Function : FreeE2SetupRsp
878 * Functionality: deallocate the memory allocated in E2SetupResponse
880 * @params[in] E2AP_PDU_t *e2apMsg
883 * ****************************************************************/
884 void FreeE2SetupRsp(E2AP_PDU_t *e2apMsg)
886 uint8_t arrIdx = 0, e2NodeConfigIdx=0, ranFuncIdx=0;
887 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
888 E2setupResponse_t *e2SetupRsp=NULL;
889 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULL;
890 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList=NULL;
891 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULL;
895 if(e2apMsg->choice.successfulOutcome)
897 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
898 if(e2SetupRsp->protocolIEs.list.array)
900 for(arrIdx=0; arrIdx<e2SetupRsp->protocolIEs.list.count; arrIdx++)
902 switch(e2SetupRsp->protocolIEs.list.array[arrIdx]->id)
904 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
906 ranFuncAcceptedList= &e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
907 if(ranFuncAcceptedList->list.array)
909 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
911 if(ranFuncAcceptedList->list.array[ranFuncIdx])
913 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
916 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
920 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
922 e2NodeConfigAdditionAckList =&e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
923 if(e2NodeConfigAdditionAckList->list.count)
925 for(e2NodeConfigIdx=0; e2NodeConfigIdx<e2NodeConfigAdditionAckList->list.count; e2NodeConfigIdx++)
927 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[e2NodeConfigIdx];
928 if(e2NodeAddAckItemIe)
930 f1InterfaceInfo = e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
933 RIC_FREE(f1InterfaceInfo->gNB_DU_ID.buf, f1InterfaceInfo->gNB_DU_ID.size);
934 RIC_FREE(f1InterfaceInfo, sizeof(E2nodeComponentInterfaceF1_t));
936 RIC_FREE(e2NodeAddAckItemIe, sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
939 RIC_FREE(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
944 RIC_FREE(e2SetupRsp->protocolIEs.list.array[arrIdx], sizeof(E2setupResponseIEs_t));
946 RIC_FREE(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
948 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
950 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
954 /*******************************************************************
956 * @brief fill e2 node configuration for ack msg
960 * Function : fillE2NodeConfigAck
963 * - fill e2 node configuration for ack msg
966 * Pointer to e2NodeCfg to be filled
968 * E2 Node Component information
969 * Is successful or failure response
970 * @return ROK - success
973 * ****************************************************************/
975 uint8_t fillE2NodeConfigAck(PTR e2NodeCfg, uint8_t procedureCode, E2NodeComponent *componentInfo, bool isSuccessful)
977 E2nodeComponentID_t *e2nodeComponentID=NULLP;
978 E2nodeComponentInterfaceType_t *e2nodeComponentInterfaceType=NULLP;
979 E2nodeComponentConfigurationAck_t *e2nodeComponentConfigurationAck=NULLP;
980 E2nodeComponentConfigRemovalAck_Item_t *removalAckItem=NULLP;
981 E2nodeComponentConfigUpdateAck_Item_t *updateAckItem=NULLP;
982 E2nodeComponentConfigAdditionAck_Item_t *additionAckItem=NULLP;
984 /* filling the interface type, component id, configuration ack based on the
985 * e2 node configuration add, update, delete type */
986 switch(procedureCode)
988 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
990 additionAckItem = (E2nodeComponentConfigAdditionAck_Item_t *)e2NodeCfg;
991 e2nodeComponentInterfaceType = &((E2nodeComponentConfigAdditionAck_Item_t *)e2NodeCfg)->e2nodeComponentInterfaceType;
992 e2nodeComponentID = &additionAckItem->e2nodeComponentID;
993 e2nodeComponentConfigurationAck = &additionAckItem->e2nodeComponentConfigurationAck;
996 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
998 updateAckItem = (E2nodeComponentConfigUpdateAck_Item_t*) e2NodeCfg;
999 e2nodeComponentInterfaceType = &updateAckItem->e2nodeComponentInterfaceType;
1000 e2nodeComponentID = &updateAckItem->e2nodeComponentID;
1001 e2nodeComponentConfigurationAck = &updateAckItem->e2nodeComponentConfigurationAck;
1004 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
1006 removalAckItem= (E2nodeComponentConfigRemovalAck_Item_t*)e2NodeCfg;
1007 e2nodeComponentInterfaceType = &removalAckItem->e2nodeComponentInterfaceType;
1008 e2nodeComponentID = &removalAckItem->e2nodeComponentID;
1009 e2nodeComponentConfigurationAck = &removalAckItem->e2nodeComponentConfigurationAck;
1014 /* >E2 Node Component interface type */
1015 if(componentInfo->interfaceType>= 0 && componentInfo->interfaceType<=6)
1017 *e2nodeComponentInterfaceType = componentInfo->interfaceType;
1021 DU_LOG("\nERROR --> E2AP: Received an invalid interface value %d",componentInfo->interfaceType);
1025 if(*e2nodeComponentInterfaceType == E2nodeComponentInterfaceType_f1)
1027 /* >E2 Node Component ID */
1028 e2nodeComponentID->present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1;
1029 RIC_ALLOC(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1, sizeof(E2nodeComponentInterfaceF1_t));
1030 if(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1 == NULLP)
1032 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1035 e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t);
1036 RIC_ALLOC(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
1038 if(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP)
1040 DU_LOG("\nERROR -->list. E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1043 e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0] = componentInfo->componentId;
1048 /* >E2 Node Component Configuration Acknowledge*/
1049 e2nodeComponentConfigurationAck->updateOutcome = E2nodeComponentConfigurationAck__updateOutcome_success;
1053 /* >E2 Node Component Configuration Acknowledge*/
1054 e2nodeComponentConfigurationAck->updateOutcome = E2nodeComponentConfigurationAck__updateOutcome_failure;
1055 RIC_ALLOC(e2nodeComponentConfigurationAck->failureCauseE2, sizeof(struct CauseE2));
1056 if(e2nodeComponentConfigurationAck->failureCauseE2)
1058 fillE2FailureCause(e2nodeComponentConfigurationAck->failureCauseE2, CauseE2_PR_e2Node, CauseE2node_e2node_component_unknown);
1062 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1069 /*******************************************************************
1071 * @brief Build E2node Component config addition ack list
1075 * Function : BuildE2nodeComponentConfigAdditionAck
1077 * Functionality: Build E2node Component config addition ack list
1080 * E2nodeComponentConfigAdditionAck_List to be filled
1081 * Count of e2 node to be added
1082 * list of e2 node cfg to be added
1084 * @return ROK - success
1086 * ****************************************************************/
1088 uint8_t BuildE2nodeComponentConfigAdditionAck(E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList, \
1089 uint16_t addedE2NodeCount, E2NodeConfigItem *addedE2Node)
1091 E2NodeComponent *e2NodeComponentInfo=NULLP;
1092 CmLList *node=NULLP;
1093 uint16_t arrIdx = 0;
1094 E2nodeComponentConfigAdditionAck_Item_t *e2NodeAddAckItem=NULLP;
1095 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULLP;
1097 e2NodeConfigAdditionAckList->list.count = addedE2NodeCount;
1099 e2NodeConfigAdditionAckList->list.size = e2NodeConfigAdditionAckList->list.count * sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t*);
1100 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
1101 if(e2NodeConfigAdditionAckList->list.array == NULLP)
1103 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
1107 for(arrIdx = 0; arrIdx< e2NodeConfigAdditionAckList->list.count; arrIdx++)
1109 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
1110 if(e2NodeConfigAdditionAckList->list.array[arrIdx] == NULLP)
1112 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
1115 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[arrIdx];
1116 e2NodeAddAckItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck_Item;
1117 e2NodeAddAckItemIe->criticality = CriticalityE2_reject;
1118 e2NodeAddAckItemIe->value.present = E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_E2nodeComponentConfigAdditionAck_Item;
1119 e2NodeAddAckItem = &e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item;
1121 /* Filling the e2 node config addition ack item */
1122 fillE2NodeConfigAck((PTR)&e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item, ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck,\
1123 &addedE2Node[arrIdx].componentInfo, addedE2Node[arrIdx].isSuccessful);
1128 /*******************************************************************
1130 * @brief Build RAN function accepted list
1134 * Function : BuildRanFunctionAcceptedList
1136 * Functionality: Build RAN function accepted list
1137 * ->For ProcedureCodeE2_id_E2setup or ProcedureCodeE2_id_RICserviceQuery
1138 * we add all the RAN Function list which is present in RIC database.
1139 * ->For any other procedures, we just fill the RAN functions whose ID
1140 * is present in the recvList
1144 * Count of ran functions to be accepted in the list
1145 * Received list of RAN functions
1149 * @return ROK - success
1151 * ****************************************************************/
1153 uint8_t BuildRanFunctionAcceptedList(DuDb *duDb, uint8_t count, RanFunction *ranFunAcceptedList, RANfunctionsID_List_t *ranFuncAcceptedList, uint8_t procedureCode)
1155 uint16_t ranFuncIdx = 0;
1156 RANfunctionID_ItemIEs_t *ranFuncAcceptedItemIe=NULL;
1158 /* For ProcedureCodeE2_id_E2setup and ProcedureCodeE2_id_RICserviceQuery,
1159 * the number of RAN function list items is equal to the number of
1160 * ran function entries stored in the database.
1161 * For any other procedure, the RAN function list count is equal
1162 * to the count of ran functions obtained from the function's caller */
1164 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
1165 ranFuncAcceptedList->list.count = duDb->numOfRanFunction;
1167 ranFuncAcceptedList->list.count = count;
1169 ranFuncAcceptedList->list.size = ranFuncAcceptedList->list.count*sizeof(RANfunctionID_ItemIEs_t*);
1170 RIC_ALLOC(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
1171 if(ranFuncAcceptedList->list.array)
1173 for(ranFuncIdx = 0; ranFuncIdx< ranFuncAcceptedList->list.count; ranFuncIdx++)
1175 RIC_ALLOC(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
1176 if(ranFuncAcceptedList->list.array[ranFuncIdx] == NULLP)
1178 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array item");
1181 ranFuncAcceptedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAcceptedList->list.array[ranFuncIdx];
1182 ranFuncAcceptedItemIe->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
1183 ranFuncAcceptedItemIe->criticality= CriticalityE2_ignore;
1184 ranFuncAcceptedItemIe->value.present = RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item;
1185 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
1187 /* filling the RAN function information with the help of DuDb */
1188 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = duDb->ranFunction[ranFuncIdx].id;
1189 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= duDb->ranFunction[ranFuncIdx].revisionCounter;
1193 /* filling the the RAN function information with the help received list of RAN functions */
1194 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = ranFunAcceptedList[ranFuncIdx].id;
1195 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= ranFunAcceptedList[ranFuncIdx].revisionCounter;
1201 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array");
1207 /*******************************************************************
1209 * @brief Builds and sends the E2SetupResponse
1213 * Function : BuildAndSendE2SetupRsp
1215 * Functionality: Builds and sends the E2SetupResponse
1220 * List of E2node cofniguration which needs to be send
1222 * @return ROK - success
1225 * ****************************************************************/
1227 uint8_t BuildAndSendE2SetupRsp(DuDb *duDb, uint8_t transId, E2NodeConfigList e2NodeList)
1229 E2AP_PDU_t *e2apMsg = NULL;
1230 E2setupResponse_t *e2SetupRsp;
1231 asn_enc_rval_t encRetVal;
1234 bool memAllocFailed = false;
1236 DU_LOG("\nINFO --> E2AP : Building E2 Setup Response\n");
1239 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1240 if(e2apMsg == NULLP)
1242 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1245 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
1246 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1247 if(e2apMsg->choice.successfulOutcome == NULLP)
1249 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1253 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
1254 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
1255 e2apMsg->choice.successfulOutcome->value.present = \
1256 SuccessfulOutcomeE2__value_PR_E2setupResponse;
1257 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
1260 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
1261 if(duDb->numOfRanFunction)
1264 e2SetupRsp->protocolIEs.list.count = elementCnt;
1265 e2SetupRsp->protocolIEs.list.size = elementCnt * sizeof(E2setupResponseIEs_t*);
1267 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
1268 if(e2SetupRsp->protocolIEs.list.array == NULLP)
1270 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1274 for(idx=0; idx<elementCnt; idx++)
1276 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array[idx], sizeof(E2setupResponseIEs_t));
1277 if(e2SetupRsp->protocolIEs.list.array[idx] == NULLP)
1279 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1280 memAllocFailed = true;
1285 if(memAllocFailed == true)
1287 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1292 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_TransactionID;
1293 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1294 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_TransactionID;
1295 e2SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID = transId;
1299 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalRIC_ID;
1300 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1301 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_GlobalRIC_ID;
1303 if(BuildGlobalRicId(&(e2SetupRsp->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID))!=ROK)
1305 DU_LOG("\nERROR --> E2AP : Failed to build Global Ric Id");
1309 if(duDb->numOfRanFunction)
1311 /* Accepted RAN function Id */
1313 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
1314 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1315 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_RANfunctionsID_List;
1316 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &e2SetupRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_E2setup)!=ROK)
1318 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
1323 /* E2 Node Component Configuration Addition Acknowledge List*/
1325 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck;
1326 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1327 e2SetupRsp->protocolIEs.list.array[idx]->value.present = \
1328 E2setupResponseIEs__value_PR_E2nodeComponentConfigAdditionAck_List;
1329 if(BuildE2nodeComponentConfigAdditionAck(&e2SetupRsp->protocolIEs.list.array[idx]->\
1330 value.choice.E2nodeComponentConfigAdditionAck_List, e2NodeList.addedE2NodeCount, e2NodeList.addedE2Node) != ROK)
1332 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list");
1336 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1337 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1339 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
1341 /* Check encode results */
1342 if(encRetVal.encoded == ENCODE_FAIL)
1344 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupResponse structure (at %s)\n",\
1345 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1350 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupResponse\n");
1351 for(int i=0; i< encBufSize; i++)
1353 DU_LOG("%x",encBuf[i]);
1357 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
1359 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Response failed");
1365 FreeE2SetupRsp(e2apMsg);
1366 BuildAndSendRicSubscriptionReq(duDb);
1370 /*******************************************************************
1372 * @brief Free RIC Subscription Details
1376 * Function : FreeRicSubsDetails
1378 * Functionality: Free the RIC Subscription Details
1380 * @params[in] RICsubscriptionDetails_t *subsDetails
1383 * ****************************************************************/
1384 void FreeRicSubsDetails(RICsubscriptionDetails_t *subsDetails)
1386 uint8_t elementIdx = 0;
1387 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
1389 RIC_FREE(subsDetails->ricEventTriggerDefinition.buf, subsDetails->ricEventTriggerDefinition.size);
1391 if(subsDetails->ricAction_ToBeSetup_List.list.array)
1393 for(elementIdx = 0; elementIdx < subsDetails->ricAction_ToBeSetup_List.list.count; elementIdx++)
1395 if(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
1397 actionItem = (RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx];
1398 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1400 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf, \
1401 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size);
1402 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1404 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t))
1407 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
1411 /*******************************************************************
1413 * @brief Free RIC Subscription Request
1417 * Function : FreeRicSubscriptionReq
1419 * Functionality : Free RIC Subscription Request
1421 * @return ROK - success
1424 ******************************************************************/
1425 void FreeRicSubscriptionReq(E2AP_PDU_t *e2apRicMsg)
1428 RICsubscriptionRequest_t *ricSubscriptionReq;
1432 if(e2apRicMsg->choice.initiatingMessage)
1434 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
1435 if(ricSubscriptionReq->protocolIEs.list.array)
1437 for(idx=0; idx < ricSubscriptionReq->protocolIEs.list.count; idx++)
1439 switch(ricSubscriptionReq->protocolIEs.list.array[idx]->id)
1441 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
1443 FreeRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails));
1447 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
1449 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
1451 RIC_FREE(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1453 RIC_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
1457 /*******************************************************************
1459 * @brief Builds Ric Request Id
1463 * Function : BuildNewRicRequestId
1465 * Functionality: Assign new Ric Request ID
1467 * @params[in] RIC request ID to be sent
1468 * RIC request ID stored in DB
1469 * @return ROK - success
1472 * ****************************************************************/
1474 uint8_t BuildNewRicRequestId(RICrequestID_t *ricReqId, RicRequestId *reqIdDb)
1476 static uint16_t requestorId = 0;
1477 static uint16_t instanceId = 0;
1479 if(ricReqId != NULLP)
1481 ricReqId->ricRequestorID = ++requestorId;
1482 ricReqId->ricInstanceID = ++instanceId;
1484 reqIdDb->requestorId = ricReqId->ricRequestorID;
1485 reqIdDb->instanceId = ricReqId->ricInstanceID;
1490 /*******************************************************************
1492 * @brief Free RIC Action Definition
1496 * Function : FreeRicActionDefinition
1498 * Functionality: Free RIC Action Definition
1500 * @params[in] E2SM-KPM Action definition
1503 * ****************************************************************/
1504 void FreeRicActionDefinition(E2SM_KPM_ActionDefinition_t actionDef)
1506 uint8_t elementIdx = 0;
1507 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1508 MeasurementInfoItem_t *measItem = NULLP;
1510 switch(actionDef.actionDefinition_formats.present)
1512 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
1514 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1)
1516 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1517 if(actionFormat1->measInfoList.list.array)
1519 for(elementIdx = 0; elementIdx < actionFormat1->measInfoList.list.count; elementIdx++)
1521 if(actionFormat1->measInfoList.list.array[elementIdx])
1523 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1524 switch(measItem->measType.present)
1526 case MeasurementType_PR_NOTHING:
1527 case MeasurementType_PR_measID:
1529 case MeasurementType_PR_measName:
1531 RIC_FREE(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size)
1535 RIC_FREE(measItem, sizeof(MeasurementInfoItem_t));
1538 RIC_FREE(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1540 RIC_FREE(actionFormat1, sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1545 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2:
1546 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3:
1547 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format4:
1548 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format5:
1549 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_NOTHING:
1554 /*******************************************************************
1556 * @brief Fill RIC Action Definition
1560 * Function : fillRicActionDef
1562 * Functionality: Fill RIC Action Definition
1564 * @params[in] RIC Action definition
1568 * ****************************************************************/
1569 uint8_t fillRicActionDef(RICactionDefinition_t *ricActionDef)
1571 uint8_t ret = RFAILED;
1572 asn_enc_rval_t encRetVal;
1573 uint8_t elementCnt = 0, elementIdx = 0;
1574 char *measurementTypeName[] = {"RRU.PrbTotDl", "RRU.PrbTotUl"};
1575 E2SM_KPM_ActionDefinition_t actionDef;
1576 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1577 MeasurementInfoItem_t *measItem = NULLP;
1581 /* Fill E2SM-KPM Action Definition Format 1 */
1583 /* RIC Stype Type */
1584 actionDef.ric_Style_Type = RIC_STYLE_TYPE;
1586 /* RIC Action Definition Format 1 */
1587 actionDef.actionDefinition_formats.present = \
1588 E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1;
1590 RIC_ALLOC(actionDef.actionDefinition_formats.choice.actionDefinition_Format1, \
1591 sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1592 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1 == NULLP)
1594 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1597 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1599 /* Measurement Info List */
1601 actionFormat1->measInfoList.list.count = elementCnt;
1602 actionFormat1->measInfoList.list.size = elementCnt * sizeof(MeasurementInfoItem_t *);
1603 RIC_ALLOC(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1604 if(actionFormat1->measInfoList.list.array == NULL)
1606 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1610 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1612 RIC_ALLOC(actionFormat1->measInfoList.list.array[elementIdx], sizeof(MeasurementInfoItem_t));
1613 if(actionFormat1->measInfoList.list.array[elementIdx] == NULLP)
1615 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1619 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1620 measItem->measType.present = MeasurementType_PR_measName;
1622 measItem->measType.choice.measName.size = strlen(measurementTypeName[elementIdx]);
1623 RIC_ALLOC(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size);
1624 if(measItem->measType.choice.measName.buf == NULLP)
1626 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1629 memcpy(measItem->measType.choice.measName.buf, measurementTypeName[elementIdx], measItem->measType.choice.measName.size);
1631 if(elementIdx < elementCnt)
1634 /* Granularity Period */
1635 actionFormat1->granulPeriod = RIC_ACTION_GRANULARITY_PERIOD; /* In ms */
1637 /* Prints the Msg formed */
1638 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, &actionDef);
1640 /* Encode E2SM-KPM RIC Action Definition */
1641 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1643 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_ActionDefinition, 0, &actionDef, PrepFinalEncBuf, encBuf);
1644 if(encRetVal.encoded == ENCODE_FAIL)
1646 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM action definition structure (at %s)\n",\
1647 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1651 /* Copty encoded E2SM-KPM RIC action definition to E2AP octet string buffer */
1652 ricActionDef->size = encBufSize;
1653 RIC_ALLOC(ricActionDef->buf, encBufSize);
1654 if(ricActionDef->buf == NULLP)
1656 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1659 memcpy(ricActionDef->buf, encBuf, encBufSize);
1665 FreeRicActionDefinition(actionDef);
1669 /*******************************************************************
1671 * @brief Fills RIC Action To Be Setup Item
1675 * Function : fillActionToBeSetup
1677 * Functionality: Fill the RIC Action To Be Setup Ite,
1678 * RIC subscription DB
1680 * @params[in] RICaction_ToBeSetup_ItemIEs_t *items
1681 * @return ROK - success
1684 * ****************************************************************/
1685 uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscription *ricSubsDb)
1687 static uint8_t ricActionId = 0;
1689 if(actionItem == NULLP)
1691 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1697 actionItem->id = ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item;
1698 actionItem->criticality = CriticalityE2_ignore;
1699 actionItem->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
1702 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ricActionId;
1703 ricSubsDb->actionSequence[ricActionId].actionId = \
1704 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
1707 /* RIC Action Type */
1708 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
1710 /* RIC Action Definition */
1711 RIC_ALLOC(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1712 if(!actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1714 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1717 if(fillRicActionDef(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition) != ROK)
1719 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1723 ricSubsDb->numOfActions++;
1727 memset(&ricSubsDb->actionSequence[ricActionId], 0, sizeof(ActionInfo));
1728 ricSubsDb->actionSequence[ricActionId].actionId = -1;
1732 /*******************************************************************
1734 * @brief Free Event Trigger Definition
1738 * Function : FreeEventTriggerDef
1740 * Functionality: Free Event Trigger Definition
1742 * @params[in] E2SM-KPM Event Trigger Definition
1745 * ****************************************************************/
1746 void FreeEventTriggerDef(E2SM_KPM_EventTriggerDefinition_t *eventTiggerDef)
1750 switch(eventTiggerDef->eventDefinition_formats.present)
1752 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING:
1754 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1:
1755 RIC_FREE(eventTiggerDef->eventDefinition_formats.choice.eventDefinition_Format1, \
1756 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
1762 /*******************************************************************
1764 * @brief Fill Event Trigger Definition
1768 * Function : fillEventTriggerDef
1770 * Functionality: Fill Event Trigger Definition
1772 * @params[in] RIC Event Trigger Definition
1776 * ****************************************************************/
1777 uint8_t fillEventTriggerDef(RICeventTriggerDefinition_t *ricEventTriggerDef)
1779 uint8_t ret = RFAILED;
1780 asn_enc_rval_t encRetVal;
1781 E2SM_KPM_EventTriggerDefinition_t eventTiggerDef;
1785 /* Fill E2SM-KPM Event Trigger Definition Format 1 */
1786 eventTiggerDef.eventDefinition_formats.present = \
1787 E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1;
1789 RIC_ALLOC(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1, \
1790 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
1791 if(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1 == NULLP)
1793 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1797 eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1->reportingPeriod = 1000; /* In ms */
1799 /* Prints the Msg formed */
1800 xer_fprint(stdout, &asn_DEF_E2SM_KPM_EventTriggerDefinition, &eventTiggerDef);
1802 /* Encode E2SM-KPM Event Trigger Definition */
1803 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1805 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_EventTriggerDefinition, 0, &eventTiggerDef, PrepFinalEncBuf, encBuf);
1806 if(encRetVal.encoded == ENCODE_FAIL)
1808 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM event trigger definition structure (at %s)\n",\
1809 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1813 /* Copy encoded E2SM-KPM event trigger definition to E2AP octet string buffer */
1814 ricEventTriggerDef->size = encBufSize;
1815 RIC_ALLOC(ricEventTriggerDef->buf, encBufSize);
1816 if(ricEventTriggerDef->buf == NULLP)
1818 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1821 memcpy(ricEventTriggerDef->buf, encBuf, encBufSize);
1827 FreeEventTriggerDef(&eventTiggerDef);
1831 /*******************************************************************
1833 * @brief builds RIC Subscription Details
1837 * Function : BuildsRicSubsDetails
1839 * Functionality: Builds the RIC Subscription Details
1841 * @params[in] RIC Subscription details to be filled
1842 * RIC subscriotion DB
1843 * @return ROK - success
1846 * ****************************************************************/
1848 uint8_t BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails, RicSubscription *ricSubsInfo)
1850 uint8_t elementCnt = 0;
1851 uint8_t elementIdx = 0;
1853 if(subsDetails == NULLP)
1855 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1861 /* RIC Event Trigger Definition */
1862 if(fillEventTriggerDef(&subsDetails->ricEventTriggerDefinition) != ROK)
1864 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1868 /* RIC Actions To Be Setup List */
1870 subsDetails->ricAction_ToBeSetup_List.list.count = elementCnt;
1871 subsDetails->ricAction_ToBeSetup_List.list.size = elementCnt * sizeof(RICaction_ToBeSetup_ItemIEs_t *);
1872 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
1873 if(subsDetails->ricAction_ToBeSetup_List.list.array == NULLP)
1875 DU_LOG("\nERROR --> E2AP : Memory allocation for RICactionToBeSetup Items failed");
1879 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1881 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t));
1882 if(!subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
1884 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1888 if(elementIdx < elementCnt)
1893 if(fillActionToBeSetup((RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], \
1894 ricSubsInfo) != ROK)
1896 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1905 /*******************************************************************
1907 * @brief Builds and Send the RicSubscriptionReq
1911 * Function : BuildAndSendRicSubscriptionReq
1913 * Functionality:Fills the RicSubscriptionReq
1915 * @return ROK - success
1918 ******************************************************************/
1919 uint8_t BuildAndSendRicSubscriptionReq(DuDb *duDb)
1921 uint8_t ret = RFAILED;
1922 uint8_t elementCnt = 0;
1924 uint8_t actionIdx = 0;
1925 asn_enc_rval_t encRetVal; /* Encoder return value */
1926 E2AP_PDU_t *e2apRicMsg = NULL;
1927 RICsubscriptionRequest_t *ricSubscriptionReq;
1928 RanFunction *ranFuncDb = &duDb->ranFunction[0];
1929 CmLList *ricSubsNode = NULLP;
1930 RicSubscription *ricSubsInfo = NULLP;
1932 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n");
1934 /* Allocate memory to store RIC subscription info in RIC DB */
1935 RIC_ALLOC(ricSubsInfo, sizeof(RicSubscription));
1938 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1941 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
1943 ricSubsInfo->actionSequence[actionIdx].actionId = -1;
1948 RIC_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
1949 if(e2apRicMsg == NULLP)
1951 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1955 e2apRicMsg->present = E2AP_PDU_PR_initiatingMessage;
1956 RIC_ALLOC(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1957 if(e2apRicMsg->choice.initiatingMessage == NULLP)
1959 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1962 e2apRicMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscription;
1963 e2apRicMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1964 e2apRicMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionRequest;
1966 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
1969 ricSubscriptionReq->protocolIEs.list.count = elementCnt;
1970 ricSubscriptionReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionRequest_IEs_t);
1972 /* Initialize the subscription members */
1973 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
1974 if(ricSubscriptionReq->protocolIEs.list.array == NULLP)
1976 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1980 for(idx=0; idx<elementCnt; idx++)
1982 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
1983 if(ricSubscriptionReq->protocolIEs.list.array[idx] == NULLP)
1985 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1989 if(idx < elementCnt)
1992 /* Filling RIC Request Id */
1994 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
1995 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1996 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
1997 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
1998 if(BuildNewRicRequestId(&ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICrequestID, \
1999 &ricSubsInfo->requestId) != ROK)
2001 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
2006 /* Filling RAN Function Id */
2008 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
2009 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2010 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2011 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
2012 ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ranFuncDb->id;
2013 ricSubsInfo->ranFuncId = ranFuncDb->id;
2015 /* Filling RIC Subscription Details */
2017 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICsubscriptionDetails;
2018 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2019 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2020 RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
2021 if(BuildRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails),\
2022 ricSubsInfo) != ROK)
2024 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
2028 /* Prints the Msg formed */
2029 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
2031 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2033 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
2034 if(encRetVal.encoded == ENCODE_FAIL)
2036 DU_LOG("\nERROR --> E2AP : Could not encode RicSubscriptionRequest structure (at %s)\n",\
2037 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2042 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicSubscriptionRequest\n");
2043 for(int i=0; i< encBufSize; i++)
2045 DU_LOG("%x",encBuf[i]);
2050 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2052 DU_LOG("\nERROR --> E2AP : Sending RIC subscription Request failed");
2056 /* Add RIC Subscription Info to RAN Function's RIC Subscription List */
2057 RIC_ALLOC(ricSubsNode , sizeof(CmLList));
2060 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2063 ricSubsNode->node = (PTR)ricSubsInfo;
2064 cmLListAdd2Tail(&ranFuncDb->subscriptionList, ricSubsNode);
2072 RIC_FREE(ricSubsInfo, sizeof(RicSubscription));
2073 RIC_FREE(ricSubsNode , sizeof(CmLList));
2076 FreeRicSubscriptionReq(e2apRicMsg);
2080 /*******************************************************************
2082 * @brief Process RicSubscriptionResponse
2086 * Function : ProcRicSubscriptionRsp
2088 * Functionality: Processes RicSubscriptionRsp
2090 * @return ROK - void
2092 ******************************************************************/
2094 void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricSubscriptionRsp)
2096 uint8_t duIdx = 0, ieIdx = 0, notAdmitIdx = 0;
2097 uint8_t ranFuncId = 0, actionId = 0;
2099 bool ricReqIdDecoded = false;
2100 RicRequestId ricReqId;
2101 RanFunction *ranFuncDb = NULLP;
2102 RicSubscription *ricSubs = NULLP;
2103 CmLList *ricSubsNode = NULLP;
2104 ActionInfo *action = NULLP;
2105 RICsubscriptionResponse_IEs_t *ricSubsRspIe = NULLP;
2106 RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
2108 DU_LOG("\nINFO --> E2AP : RIC Subscription Response received");
2111 SEARCH_DU_DB(duIdx, duId, duDb);
2114 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
2118 memset(&ricReqId, 0, sizeof(RicRequestId));
2119 if(ricSubscriptionRsp)
2121 if(ricSubscriptionRsp->protocolIEs.list.array)
2123 for(ieIdx=0; ieIdx<ricSubscriptionRsp->protocolIEs.list.count; ieIdx++)
2125 if(ricSubscriptionRsp->protocolIEs.list.array[ieIdx])
2127 ricSubsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
2128 switch(ricSubscriptionRsp->protocolIEs.list.array[ieIdx]->id)
2130 case ProtocolIE_IDE2_id_RICrequestID:
2132 ricReqId.requestorId = ricSubsRspIe->value.choice.RICrequestID.ricRequestorID;
2133 ricReqId.instanceId = ricSubsRspIe->value.choice.RICrequestID.ricInstanceID;
2134 ricReqIdDecoded = true;
2137 case ProtocolIE_IDE2_id_RANfunctionID:
2139 ranFuncId = ricSubsRspIe->value.choice.RANfunctionID;
2140 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
2143 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionResponse: RAN Function ID [%d] not found", ranFuncId);
2148 case ProtocolIE_IDE2_id_RICactions_Admitted:
2152 case ProtocolIE_IDE2_id_RICactions_NotAdmitted:
2154 if(!(ranFuncDb && ricReqIdDecoded))
2157 notAdmitList = &ricSubsRspIe->value.choice.RICaction_NotAdmitted_List;
2158 for(notAdmitIdx = 0; notAdmitIdx < notAdmitList->list.count; notAdmitIdx++)
2160 actionId = ((RICaction_NotAdmitted_ItemIEs_t *)(notAdmitList->list.array[notAdmitIdx]))->\
2161 value.choice.RICaction_NotAdmitted_Item.ricActionID;
2163 /* Remove action from RAN Function's subscription list */
2164 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
2167 action = fetchActionInfoFromActionId(actionId, ricSubs);
2170 memset(action, 0, sizeof(ActionInfo));
2171 ricSubs->actionSequence[actionId].actionId = -1;
2172 ricSubs->numOfActions--;
2185 /*******************************************************************
2187 * @brief deallocate the memory allocated in E2SetupFailure
2191 * Function : FreeE2SetupFailure
2193 * Functionality: deallocate the memory allocated in E2SetupFailure
2195 * @params[in] E2AP_PDU_t *e2apMsg
2198 * ****************************************************************/
2199 void FreeE2SetupFailure(E2AP_PDU_t *e2apMsg)
2202 E2setupFailure_t *e2SetupFail;
2206 if(e2apMsg->choice.unsuccessfulOutcome)
2208 e2SetupFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
2209 if(e2SetupFail->protocolIEs.list.array)
2211 for(arrIdx=0; arrIdx<e2SetupFail->protocolIEs.list.count; arrIdx++)
2213 RIC_FREE(e2SetupFail->protocolIEs.list.array[arrIdx], sizeof(E2setupFailureIEs_t));
2215 RIC_FREE(e2SetupFail->protocolIEs.list.array, e2SetupFail->protocolIEs.list.size);
2217 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
2219 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2223 /*******************************************************************
2225 * @brief Buld and send the E2 Setup failure
2229 * Function : BuildAndSendE2SetupFailure
2232 * - Buld and send the E2 Setup failure
2233 * @return ROK - success
2236 * ****************************************************************/
2238 uint8_t BuildAndSendE2SetupFailure(uint32_t duId, uint8_t transId)
2240 uint8_t ret = RFAILED;
2241 E2AP_PDU_t *e2apMsg = NULL;
2242 E2setupFailure_t *e2SetupFailure;
2243 asn_enc_rval_t encRetVal;
2246 bool memAllocFailed = false;
2248 DU_LOG("\nINFO --> E2AP : Building E2 Setup failure\n");
2251 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2252 if(e2apMsg == NULLP)
2254 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2257 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
2258 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
2259 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
2261 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2265 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
2266 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
2267 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2setupFailure;
2268 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
2271 e2SetupFailure->protocolIEs.list.count = elementCnt;
2272 e2SetupFailure->protocolIEs.list.size = elementCnt * sizeof(struct E2setupFailureIEs *);
2274 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array, e2SetupFailure->protocolIEs.list.size);
2275 if(e2SetupFailure->protocolIEs.list.array == NULLP)
2277 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2281 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2283 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array[arrIdx], sizeof(struct E2setupFailureIEs));
2284 if(e2SetupFailure->protocolIEs.list.array[arrIdx] == NULLP)
2286 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2287 memAllocFailed = true;
2292 if(memAllocFailed == true)
2294 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2300 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2301 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2302 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
2303 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2306 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
2307 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2308 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
2309 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = CauseE2_PR_protocol;
2310 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.protocol = CauseE2Protocol_unspecified;
2313 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
2314 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
2315 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
2316 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
2318 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2319 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2321 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2323 /* Check encode results */
2324 if(encRetVal.encoded == ENCODE_FAIL)
2326 DU_LOG("\nERROR --> E2AP : Could not encode E2 Setup failure structure (at %s)\n",\
2327 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2332 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Setup Failure\n");
2333 for(int i=0; i< encBufSize; i++)
2335 DU_LOG("%x",encBuf[i]);
2339 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2341 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Failure failed");
2349 FreeE2SetupFailure(e2apMsg);
2353 /*******************************************************************
2355 * @brief process the e2setup request
2359 * Function : ProcE2SetupReq
2361 * Functionality: process the e2setup request
2365 ******************************************************************/
2367 void ProcE2SetupReq(uint32_t *duId, E2setupRequest_t *e2SetupReq)
2369 uint8_t arrIdx = 0, duIdx = 0, transId =0;
2370 uint16_t ranFuncIdx=0, e2NodeAddListIdx =0;
2371 E2NodeConfigList tmpE2NodeList;
2373 bool ieProcessingFailed = false;
2374 E2nodeComponentConfigAddition_List_t *e2NodeAddList=NULLP;
2375 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem=NULLP;
2376 RANfunction_ItemIEs_t *ranFuncItemIe=NULLP;
2377 RANfunction_Item_t *ranFunItem=NULLP;
2378 RANfunctions_List_t *ranFunctionsList=NULLP;
2380 memset(&tmpE2NodeList, 0, sizeof(E2NodeConfigList));
2383 DU_LOG("\nERROR --> E2AP : e2SetupReq pointer is null");
2386 if(!e2SetupReq->protocolIEs.list.array)
2388 DU_LOG("\nERROR --> E2AP : e2SetupReq array pointer is null");
2392 for(arrIdx=0; arrIdx<e2SetupReq->protocolIEs.list.count; arrIdx++)
2394 if(e2SetupReq->protocolIEs.list.array[arrIdx])
2396 switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id)
2398 case ProtocolIE_IDE2_id_TransactionID:
2400 transId = e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
2403 case ProtocolIE_IDE2_id_GlobalE2node_ID:
2405 if(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID)
2407 *duId =e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID->buf[0];
2409 SEARCH_DU_DB(duIdx, *duId, duDb);
2412 duDb = &ricCb.duInfo[ricCb.numDu];
2415 memset(duDb, 0, sizeof(DuDb));
2420 case ProtocolIE_IDE2_id_RANfunctionsAdded:
2422 ranFunctionsList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
2424 if(ranFunctionsList->list.array)
2426 for(ranFuncIdx=0;ranFuncIdx<ranFunctionsList->list.count; ranFuncIdx++)
2428 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
2429 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
2430 duDb->ranFunction[ranFunItem->ranFunctionID-1].id = ranFunItem->ranFunctionID;
2431 duDb->ranFunction[ranFunItem->ranFunctionID-1].revisionCounter = ranFunItem->ranFunctionRevision;
2432 cmLListInit(&duDb->ranFunction[ranFunItem->ranFunctionID-1].subscriptionList);
2433 duDb->numOfRanFunction++;
2438 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
2440 e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
2441 if(e2NodeAddList->list.array)
2443 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
2445 if(e2NodeAddList->list.array[e2NodeAddListIdx])
2447 /* Storing the E2 node information in DB */
2448 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *)e2NodeAddList->list.array[e2NodeAddListIdx];
2449 if(handleE2NodeComponentAction(duDb, (PTR)&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item,\
2450 ProtocolIE_IDE2_id_E2nodeComponentConfigAddition, &tmpE2NodeList.addedE2Node[tmpE2NodeList.addedE2NodeCount++]) != ROK)
2452 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",e2NodeAddListIdx);
2466 if(BuildAndSendE2SetupRsp(duDb, transId, tmpE2NodeList) !=ROK)
2468 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 setup response");
2471 /*******************************************************************
2473 * @brief Deallocate the memory allocated for E2 Reset Response
2477 * Function : FreeE2ResetResponse
2480 * - freeing the memory allocated for E2ResetResponse
2482 * @params[in] E2AP_PDU_t *e2apMsg
2483 * @return ROK - success
2486 * ****************************************************************/
2487 void FreeE2ResetResponse(E2AP_PDU_t *e2apMsg)
2490 ResetResponseE2_t *resetResponse =NULLP;
2492 if(e2apMsg != NULLP)
2494 if(e2apMsg->choice.successfulOutcome != NULLP)
2496 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2497 if(resetResponse->protocolIEs.list.array)
2499 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
2501 if(resetResponse->protocolIEs.list.array[ieIdx])
2503 RIC_FREE(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2506 RIC_FREE(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2508 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2510 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2514 /*******************************************************************
2516 * @brief Buld and send the Reset Response msg
2520 * Function : BuildAndSendResetResponse
2523 * - Buld and send the Reset Response Message
2528 * @return ROK - success
2531 * ****************************************************************/
2532 uint8_t BuildAndSendResetResponse(uint32_t duId, uint8_t transId)
2534 uint8_t ieIdx = 0, elementCnt = 0;
2535 uint8_t ret = RFAILED;
2536 E2AP_PDU_t *e2apMsg = NULLP;
2537 ResetResponseE2_t *resetResponse=NULL;
2538 asn_enc_rval_t encRetVal; /* Encoder return value */
2540 DU_LOG("\nINFO --> E2AP : Building E2 Reset Response Message\n");
2543 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2544 if(e2apMsg == NULLP)
2546 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse(): Memory allocation for E2AP-PDU failed");
2549 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
2551 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2552 if(e2apMsg->choice.successfulOutcome == NULLP)
2554 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
2558 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
2559 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2560 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_ResetResponseE2;
2561 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2564 resetResponse->protocolIEs.list.count = elementCnt;
2565 resetResponse->protocolIEs.list.size = elementCnt * sizeof(ResetResponseIEs_t *);
2566 RIC_ALLOC(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2567 if(!resetResponse->protocolIEs.list.array)
2569 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array");
2573 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
2575 RIC_ALLOC(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2576 if(!resetResponse->protocolIEs.list.array[ieIdx])
2578 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array element");
2582 if(ieIdx < elementCnt)
2586 resetResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2587 resetResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
2588 resetResponse->protocolIEs.list.array[ieIdx]->value.present = ResetResponseIEs__value_PR_TransactionID;
2589 resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
2591 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2593 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2595 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2596 if(encRetVal.encoded == ENCODE_FAIL)
2598 DU_LOG("\nERROR --> E2AP : Could not encode E2 reset response structure (at %s)\n",\
2599 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2604 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Reset Response \n");
2605 for(int i=0; i< encBufSize; i++)
2607 DU_LOG("%x",encBuf[i]);
2612 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2614 DU_LOG("\nERROR --> E2AP : Failed to send E2 Reset Response");
2622 FreeE2ResetResponse(e2apMsg);
2626 /*******************************************************************
2628 * @brief deallocate the memory allocated in building the
2629 * Service Query message
2633 * Function : FreeRicServiceQuery
2635 * Functionality: deallocate the memory allocated in building
2636 * Ric Service Query message
2638 * @params[in] E2AP_PDU_t *e2apMsg
2641 * ****************************************************************/
2643 void FreeRicServiceQuery(E2AP_PDU_t *e2apMsg)
2645 uint8_t arrIdx = 0, ranFuncIdx=0;
2646 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
2647 RICserviceQuery_t *ricServiceQuery=NULL;
2651 if(e2apMsg->choice.initiatingMessage)
2653 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2654 if(ricServiceQuery->protocolIEs.list.array)
2656 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
2658 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
2660 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
2662 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
2664 ranFuncAcceptedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2665 if(ranFuncAcceptedList->list.array)
2667 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
2669 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
2671 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
2675 case RICserviceQuery_IEs__value_PR_TransactionID:
2680 RIC_FREE(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2683 RIC_FREE(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2685 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
2687 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2691 /*******************************************************************
2693 * @brief build and send the ric service Query
2697 * Function : BuildAndSendRicServiceQuery
2699 * Functionality: build and send the ric service Query
2700 * @return ROK - success
2701 * RFAILED - Acknowledge
2703 ******************************************************************/
2705 uint8_t BuildAndSendRicServiceQuery(DuDb *duDb)
2709 uint8_t ret = RFAILED;
2710 bool memAllocFailed = false;
2711 E2AP_PDU_t *e2apMsg = NULL;
2712 asn_enc_rval_t encRetVal;
2713 RICserviceQuery_t *ricServiceQuery;
2715 DU_LOG("\nINFO --> E2AP : Building Ric service Query\n");
2718 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2719 if(e2apMsg == NULLP)
2721 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2724 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
2725 RIC_ALLOC(e2apMsg->choice.initiatingMessage , sizeof(struct InitiatingMessageE2));
2726 if(e2apMsg->choice.initiatingMessage == NULLP)
2728 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2732 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceQuery;
2733 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
2734 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceQuery;
2735 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2738 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
2739 if(duDb->numOfRanFunction)
2742 ricServiceQuery->protocolIEs.list.count = elementCnt;
2743 ricServiceQuery->protocolIEs.list.size = elementCnt * sizeof(RICserviceQuery_IEs_t*);
2745 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2746 if(ricServiceQuery->protocolIEs.list.array == NULLP)
2748 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2752 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2754 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2755 if(ricServiceQuery->protocolIEs.list.array[arrIdx] == NULLP)
2757 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2758 memAllocFailed = true;
2762 if(memAllocFailed == true)
2764 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2770 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2771 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2772 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_TransactionID;
2773 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = assignTransactionId(duDb);
2775 if(duDb->numOfRanFunction)
2777 /* Accepted RAN function Id */
2779 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
2780 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2781 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_RANfunctionsID_List;
2782 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceQuery)!=ROK)
2784 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
2789 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2790 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2792 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2794 /* Check encode results */
2795 if(encRetVal.encoded == ENCODE_FAIL)
2797 DU_LOG("\nERROR --> E2AP : Could not encode RIC service Query structure (at %s)\n",\
2798 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2803 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service Query\n");
2804 for(int i=0; i< encBufSize; i++)
2806 DU_LOG("%x",encBuf[i]);
2810 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2812 DU_LOG("\nERROR --> E2AP : Sending of RIC service Query failed");
2819 FreeRicServiceQuery(e2apMsg);
2823 /*******************************************************************
2825 * @brief deallocate the memory allocated in RicServiceUpdateFailure
2829 * Function : FreeRicServiceUpdateFailure
2831 * Functionality: deallocate the memory allocated in RicServiceUpdatefailure
2833 * @params[in] E2AP_PDU_t *e2apMsg
2836 * ****************************************************************/
2838 void FreeRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
2841 RICserviceUpdateFailure_t *ricServiceUpdateFailure=NULL;
2845 if(e2apMsg->choice.unsuccessfulOutcome)
2847 ricServiceUpdateFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
2848 if(ricServiceUpdateFailure->protocolIEs.list.array)
2850 for(arrIdx=0; arrIdx<ricServiceUpdateFailure->protocolIEs.list.count; arrIdx++)
2852 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
2854 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array, ricServiceUpdateFailure->protocolIEs.list.size);
2856 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
2858 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2862 /*******************************************************************
2864 * @brief build and send the ric service update failure
2868 * Function : BuildAndSendRicServiceUpdateFailure
2870 * Functionality: build and send the ric service update failure
2871 * @return ROK - success
2874 ******************************************************************/
2876 uint8_t BuildAndSendRicServiceUpdateFailure(uint32_t duId, int8_t transId, CauseE2_PR causePresent, uint8_t reason)
2879 E2AP_PDU_t *e2apMsg = NULL;
2880 asn_enc_rval_t encRetVal;
2881 uint8_t ret = RFAILED;
2883 uint8_t elementCnt=0;
2884 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
2886 DU_LOG("\nINFO --> E2AP : Building Ric service update failure\n");
2889 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2890 if(e2apMsg == NULLP)
2892 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2895 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
2896 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
2897 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
2899 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2903 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
2904 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
2905 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure;
2906 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
2909 ricServiceFailure->protocolIEs.list.count = elementCnt;
2910 ricServiceFailure->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateFailure_IEs_t *);
2912 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array, ricServiceFailure->protocolIEs.list.size);
2913 if(ricServiceFailure->protocolIEs.list.array == NULLP)
2915 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2919 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2921 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
2922 if(ricServiceFailure->protocolIEs.list.array[arrIdx] == NULLP)
2924 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2928 if(arrIdx<elementCnt)
2930 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2936 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2937 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2938 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TransactionID;
2939 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2942 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
2943 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2944 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_CauseE2;
2945 fillE2FailureCause(&ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, causePresent, reason);
2948 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
2949 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
2950 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TimeToWaitE2;
2951 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
2953 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2954 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2956 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2958 /* Check encode results */
2959 if(encRetVal.encoded == ENCODE_FAIL)
2961 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update failure structure (at %s)\n",\
2962 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2967 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Failure\n");
2968 for(int i=0; i< encBufSize; i++)
2970 DU_LOG("%x",encBuf[i]);
2974 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2976 DU_LOG("\nERROR --> E2AP : Sending RIC service update failed");
2983 FreeRicServiceUpdateFailure(e2apMsg);
2988 /*******************************************************************
2990 * @brief deallocate the memory allocated in RicServiceUpdateAck(
2994 * Function : FreeRicServiceUpdateAck
2996 * Functionality: deallocate the memory allocated in RicServiceUpdateAck
2998 * @params[in] E2AP_PDU_t *e2apMsg
3001 * ****************************************************************/
3003 void FreeRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
3005 uint8_t arrIdx = 0, ranFuncIdx=0;
3006 RANfunctionsID_List_t *acceptedList=NULL;
3007 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
3008 RANfunctionsIDcause_List_t *rejectedList=NULL;
3012 if(e2apMsg->choice.successfulOutcome)
3014 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
3015 if(ricServiceUpdateAck->protocolIEs.list.array)
3017 for(arrIdx=0; arrIdx<ricServiceUpdateAck->protocolIEs.list.count; arrIdx++)
3019 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx])
3021 switch(ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id)
3023 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
3025 acceptedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
3026 if(acceptedList->list.array)
3028 for(ranFuncIdx=0;ranFuncIdx<acceptedList->list.count; ranFuncIdx++)
3030 RIC_FREE(acceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
3032 RIC_FREE(acceptedList->list.array, acceptedList->list.size);
3037 case ProtocolIE_IDE2_id_RANfunctionsRejected:
3039 rejectedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
3040 if(rejectedList->list.array)
3042 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
3044 RIC_FREE(rejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
3046 RIC_FREE(rejectedList->list.array, rejectedList->list.size);
3051 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
3054 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
3056 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
3058 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3062 /*******************************************************************
3064 * @brief Build RAN function rejected list
3068 * Function : BuildRanFunctionRejectedList
3070 * Functionality: Build RAN function rejected list
3073 * Count of ran functions to be rejected in the list
3074 * Received list of RAN functions
3076 * @return ROK - success
3078 * ****************************************************************/
3080 uint8_t BuildRanFunctionRejectedList(uint8_t count, RanFunction *ranFunRejectedList, RANfunctionsIDcause_List_t *ranFuncRejectedList)
3082 uint8_t ranFuncIdx = 0;
3083 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
3085 ranFuncRejectedList->list.count = count;
3087 ranFuncRejectedList->list.size = ranFuncRejectedList->list.count*sizeof(RANfunctionIDcause_ItemIEs_t*);
3088 RIC_ALLOC(ranFuncRejectedList->list.array, ranFuncRejectedList->list.size);
3089 if(ranFuncRejectedList->list.array == NULLP)
3091 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array");
3095 for(ranFuncIdx = 0; ranFuncIdx< ranFuncRejectedList->list.count; ranFuncIdx++)
3097 RIC_ALLOC(ranFuncRejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
3098 if(ranFuncRejectedList->list.array[ranFuncIdx] == NULLP)
3100 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array item");
3103 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)ranFuncRejectedList->list.array[ranFuncIdx];
3104 ranFuncRejectedItemIe->id = ProtocolIE_IDE2_id_RANfunctionIEcause_Item;
3105 ranFuncRejectedItemIe->criticality= CriticalityE2_ignore;
3106 ranFuncRejectedItemIe->value.present = RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item;
3107 ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID = ranFunRejectedList[ranFuncIdx].id;
3108 fillE2FailureCause(&ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.cause, CauseE2_PR_ricService,\
3109 CauseE2RICservice_ran_function_not_supported);
3115 /*******************************************************************
3117 * @brief build and send the ric service update Acknowledge
3121 * Function : BuildAndSendRicServiceUpdateAcknowledge
3123 * Functionality: build and send the ric service update Acknowledge
3124 * @return ROK - success
3125 * RFAILED - Acknowledge
3127 ******************************************************************/
3129 uint8_t BuildAndSendRicServiceUpdateAcknowledge(DuDb *duDb, int8_t transId, RicTmpRanFunList ricRanFuncList)
3131 E2AP_PDU_t *e2apMsg = NULL;
3132 asn_enc_rval_t encRetVal;
3133 uint8_t arrIdx=0, elementCnt=0, ret=RFAILED;;
3134 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
3136 DU_LOG("\nINFO --> E2AP : Building Ric service update Acknowledge\n");
3139 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3140 if(e2apMsg == NULLP)
3142 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3145 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
3146 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(struct SuccessfulOutcomeE2));
3147 if(e2apMsg->choice.successfulOutcome == NULLP)
3149 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3153 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
3154 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
3155 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge;
3156 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
3159 if(ricRanFuncList.numOfRanFunAccepted)
3161 if(ricRanFuncList.numOfRanFuneRejected)
3165 ricServiceUpdateAck->protocolIEs.list.count = elementCnt;
3166 ricServiceUpdateAck->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateAcknowledge_IEs_t*);
3168 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
3169 if(ricServiceUpdateAck->protocolIEs.list.array == NULLP)
3171 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3175 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
3177 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
3178 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx] == NULLP)
3180 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3184 if(arrIdx<elementCnt)
3186 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3192 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
3193 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3194 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_TransactionID;
3195 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
3197 if(ricRanFuncList.numOfRanFunAccepted)
3199 /* Accepted RAN function List */
3201 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
3202 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3203 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List;
3204 if(BuildRanFunctionAcceptedList(duDb, ricRanFuncList.numOfRanFunAccepted, ricRanFuncList.ranFunAcceptedList,\
3205 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceUpdate)!=ROK)
3207 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
3212 if(ricRanFuncList.numOfRanFuneRejected)
3214 /* RAN Functions Rejected List */
3216 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsRejected;
3217 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3218 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List;
3219 if(BuildRanFunctionRejectedList(ricRanFuncList.numOfRanFuneRejected, ricRanFuncList.ranFunRejectedList, \
3220 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List)!=ROK)
3222 DU_LOG("\nERROR --> E2AP : Failed to build Ran function rejected list");
3228 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3229 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3231 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3233 /* Check encode results */
3234 if(encRetVal.encoded == ENCODE_FAIL)
3236 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update Acknowledge structure (at %s)\n",\
3237 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3242 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Acknowledge\n");
3243 for(int i=0; i< encBufSize; i++)
3245 DU_LOG("%x",encBuf[i]);
3249 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
3251 DU_LOG("\nERROR --> E2AP : Sending RIC service update ack failed");
3257 FreeRicServiceUpdateAck(e2apMsg);
3261 /*******************************************************************
3263 * @brief process the RIC service update
3267 * Function : ProcRicserviceUpdate
3269 * Functionality: process the RIC service update
3271 * @return ROK - success
3274 ******************************************************************/
3276 void ProcRicServiceUpdate(uint32_t duId, RICserviceUpdate_t *ricServiceUpdate)
3278 RicTmpRanFunList ricRanFuncList;
3281 uint8_t duIdx = 0, elementCnt =0, arrIdx = 0;
3282 uint16_t ranFuncIdx = 0, failedRanFuncCount=0, recvdRanFuncCount=0;
3283 RanFunction *ranFuncDb = NULLP;
3284 RANfunction_ItemIEs_t *ranFuncItemIe =NULL;
3285 RANfunction_Item_t *ranFuncItem =NULL;
3286 RANfunctionID_Item_t *ranFuncIdItem=NULL;
3287 RANfunctions_List_t *ranFuncList=NULL;
3288 RANfunctionsID_List_t *deleteList=NULL;
3289 RANfunctionID_ItemIEs_t *delRanFuncItem=NULL;
3291 SEARCH_DU_DB(duIdx, duId, duDb);
3294 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3297 memset(&ricRanFuncList, 0, sizeof(RicTmpRanFunList));
3299 if(!ricServiceUpdate)
3301 DU_LOG("\nERROR --> E2AP : ricServiceUpdate pointer is null");
3305 if(!ricServiceUpdate->protocolIEs.list.array)
3307 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array pointer is null");
3310 elementCnt = ricServiceUpdate->protocolIEs.list.count;
3311 for(arrIdx=0; arrIdx<ricServiceUpdate->protocolIEs.list.count; arrIdx++)
3313 if(!ricServiceUpdate->protocolIEs.list.array[arrIdx])
3315 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array idx %d pointer is null",arrIdx);
3319 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
3321 case ProtocolIE_IDE2_id_TransactionID:
3323 transId = ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
3325 if(transId < 0 || transId > 255)
3327 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
3333 case ProtocolIE_IDE2_id_RANfunctionsAdded:
3335 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
3337 if(ranFuncList->list.array)
3339 for(ranFuncIdx=0;ranFuncIdx<ranFuncList->list.count; ranFuncIdx++)
3341 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
3342 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
3344 /* Adding the ran function in temporary list */
3345 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
3346 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
3347 ricRanFuncList.numOfRanFunAccepted++;
3349 /* Adding the new ran function in DB*/
3350 duDb->ranFunction[ranFuncItem->ranFunctionID-1].id = ranFuncItem->ranFunctionID;
3351 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
3352 duDb->numOfRanFunction++;
3354 /* Calculating total number of ran fuctions which are received for addition */
3355 recvdRanFuncCount++;
3361 case ProtocolIE_IDE2_id_RANfunctionsModified:
3364 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
3365 if(ranFuncList->list.array)
3367 for(ranFuncIdx = 0; ranFuncIdx< ranFuncList->list.count; ranFuncIdx++)
3369 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
3370 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
3371 if(fetchRanFuncFromRanFuncId(duDb, ranFuncItem->ranFunctionID) == NULLP)
3373 /* Calculating total number of ran fuctions which are not present */
3374 failedRanFuncCount++;
3376 /* Adding the ran function in temporary list */
3377 ricRanFuncList.ranFunRejectedList[ricRanFuncList.numOfRanFuneRejected].id = ranFuncItem->ranFunctionID;
3378 ricRanFuncList.numOfRanFuneRejected++;
3383 /* Adding the ran function in temporary list */
3384 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
3385 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
3386 ricRanFuncList.numOfRanFunAccepted++;
3388 /* Updating the new ran function in DB*/
3389 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
3391 /* Calculating total number of ran fuctions which are received for modification */
3392 recvdRanFuncCount++;
3397 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
3400 deleteList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
3401 if(deleteList->list.array)
3403 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
3405 delRanFuncItem = (RANfunctionID_ItemIEs_t*) deleteList->list.array[ranFuncIdx];
3406 ranFuncIdItem = &delRanFuncItem->value.choice.RANfunctionID_Item;
3407 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncIdItem->ranFunctionID);
3410 memset(ranFuncDb, 0, sizeof(RanFunction));
3411 duDb->numOfRanFunction--;
3414 /* Calculating total number of ran fuctions which are received for deletion */
3415 recvdRanFuncCount++;
3423 DU_LOG("\nERROR --> E2AP : IE [%ld] is not supported",ricServiceUpdate->protocolIEs.list.array[arrIdx]->id);
3429 /* Sending RIC Service Update Failed if all RAN Functions received fail or if any IE processing fails
3430 * Else sending RIC Service Update Acknowledge */
3431 if((elementCnt > arrIdx) ||((recvdRanFuncCount > 0) && (recvdRanFuncCount == failedRanFuncCount)))
3433 if(BuildAndSendRicServiceUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
3435 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update Failure");
3441 if(BuildAndSendRicServiceUpdateAcknowledge(duDb, transId, ricRanFuncList) != ROK)
3443 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update acknowledge");
3449 /*******************************************************************
3451 * @brief Processing RIC subscription failure from DU
3455 * Function : ProcRicSubscriptionFailure
3457 * Functionality: Processing RIC subscription failure from DU
3459 * @param ID of DU from which message was sent
3460 * RIC Subscription failure message
3461 * @return ROK - success
3464 ******************************************************************/
3465 uint8_t ProcRicSubscriptionFailure(uint32_t duId, RICsubscriptionFailure_t *ricSubscriptionFailure)
3467 uint8_t ieIdx = 0, duIdx = 0;
3468 uint8_t ranFuncId = 0;
3470 RanFunction *ranFuncDb = NULLP;
3471 RicSubscription *ricSubs = NULLP;
3472 CmLList *ricSubsNode = NULLP;
3473 RicRequestId ricReqId;
3474 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
3476 DU_LOG("\nINFO --> E2AP : Received RIC subscription failure");
3478 SEARCH_DU_DB(duIdx, duId, duDb);
3481 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3485 memset(&ricReqId, 0, sizeof(RicRequestId));
3486 if(ricSubscriptionFailure)
3488 if(ricSubscriptionFailure->protocolIEs.list.array)
3490 for(ieIdx=0; ieIdx<ricSubscriptionFailure->protocolIEs.list.count; ieIdx++)
3492 if(ricSubscriptionFailure->protocolIEs.list.array[ieIdx])
3494 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[ieIdx];
3495 switch(ricSubscriptionFailure->protocolIEs.list.array[ieIdx]->id)
3497 case ProtocolIE_IDE2_id_RICrequestID:
3499 ricReqId.requestorId = ricSubsFailIe->value.choice.RICrequestID.ricRequestorID;
3500 ricReqId.instanceId = ricSubsFailIe->value.choice.RICrequestID.ricInstanceID;
3503 case ProtocolIE_IDE2_id_RANfunctionID:
3505 ranFuncId = ricSubsFailIe->value.choice.RANfunctionID;
3506 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
3509 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionFailure : RAN Function Id [%d] not found", ranFuncId);
3514 /* Remove subscription entry from RAN Function */
3515 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
3518 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
3519 deleteRicSubscriptionNode(ricSubsNode);
3524 case ProtocolIE_IDE2_id_CauseE2:
3526 /* No handling required as of now since this is a stub */
3536 /*******************************************************************
3538 * @brief Free RIC Subscription Modification Refuse
3542 * Function : FreeRicSubsModRefuse
3544 * Functionality: Free RIC Subscription Modification Refuse
3546 * @param E2AP Message PDU to be freed
3549 ******************************************************************/
3550 void FreeRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
3553 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3557 if(e2apMsg->choice.unsuccessfulOutcome)
3559 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3560 if(ricSubsModRefuse->protocolIEs.list.array)
3562 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
3564 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3566 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3568 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3570 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3574 /*******************************************************************
3576 * @brief Build And Send RIC Subscription Modification Refuse
3580 * Function : BuildAndSendRicSubsModRefuse
3582 * Functionality: Build And Send RIC Subscription Modification Refuse
3585 * RIC Request ID of subscription
3589 * @return ROK - success
3592 ******************************************************************/
3593 uint8_t BuildAndSendRicSubsModRefuse(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, CauseE2_PR causeType, \
3596 uint8_t ieIdx = 0, elementCnt = 0;
3597 uint8_t ret = RFAILED;
3598 E2AP_PDU_t *e2apMsg = NULL;
3599 asn_enc_rval_t encRetVal;
3600 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3601 RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
3603 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Refuse\n");
3606 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3607 if(e2apMsg == NULLP)
3609 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3612 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3613 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3614 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3616 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3620 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
3621 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3622 e2apMsg->choice.unsuccessfulOutcome->value.present = \
3623 UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse;
3624 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3627 ricSubsModRefuse->protocolIEs.list.count = elementCnt;
3628 ricSubsModRefuse->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRefuse_IEs_t *);
3629 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3630 if(!ricSubsModRefuse->protocolIEs.list.array)
3632 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3636 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
3638 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3639 if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
3641 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3646 /* RIC Request ID */
3648 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3649 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RICrequestID;
3650 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3651 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RICrequestID;
3652 ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3653 ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3655 /* RAN Function ID */
3657 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3658 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3659 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3660 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RANfunctionID;
3661 ricSubsModRefuseIe->value.choice.RANfunctionID = ranFuncId;
3665 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3666 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_CauseE2;
3667 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3668 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_CauseE2;
3669 fillE2FailureCause(&ricSubsModRefuseIe->value.choice.CauseE2, causeType, cause);
3671 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3672 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3674 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3676 /* Check encode results */
3677 if(encRetVal.encoded == ENCODE_FAIL)
3679 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification refuse (at %s)\n",\
3680 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3685 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification refuse\n");
3686 for(int i=0; i< encBufSize; i++)
3688 DU_LOG("%x",encBuf[i]);
3692 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
3694 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Refused");
3701 FreeRicSubsModRefuse(e2apMsg);
3705 /*******************************************************************
3707 * @brief Free memory for RIC Subscription Modification Confirm
3711 * Function : FreeRicSubsModConfirm
3713 * Functionality: Free memory for RIC subscription modification
3716 * @param E2AP Message PDU to be freed
3719 ******************************************************************/
3720 void FreeRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
3722 uint8_t ieIdx = 0, arrIdx=0;
3723 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
3724 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
3725 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
3726 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
3727 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
3728 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
3732 if(e2apMsg->choice.successfulOutcome)
3734 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
3735 if(ricSubsModCfm->protocolIEs.list.array)
3737 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
3739 if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
3741 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3742 switch(ricSubsModCfmIe->id)
3744 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
3746 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
3747 if(modCfmList->list.array)
3749 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
3751 RIC_FREE(modCfmList->list.array[arrIdx], \
3752 sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
3754 RIC_FREE(modCfmList->list.array, modCfmList->list.size);
3759 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
3761 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
3762 if(modRefusedList->list.array)
3764 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
3766 RIC_FREE(modRefusedList->list.array[arrIdx], \
3767 sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
3769 RIC_FREE(modRefusedList->list.array, modRefusedList->list.size);
3774 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
3776 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
3777 if(rmvCfmList->list.array)
3779 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
3781 RIC_FREE(rmvCfmList->list.array[arrIdx], \
3782 sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
3784 RIC_FREE(rmvCfmList->list.array, rmvCfmList->list.size);
3789 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
3791 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
3792 if(rmvFailList->list.array)
3794 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
3796 RIC_ALLOC(rmvFailList->list.array[arrIdx], \
3797 sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
3799 RIC_FREE(rmvFailList->list.array, rmvFailList->list.size);
3808 RIC_FREE(ricSubsModCfmIe, sizeof(RICsubscriptionModificationConfirm_IEs_t));
3811 RIC_FREE(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
3813 RIC_FREE(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
3815 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3819 /*******************************************************************
3821 * @brief Fill the list of actions confirmed for modification
3825 * Function : fillActionModConfirmedList
3827 * Functionality: Fill the list of actions confirmed for modification
3829 * @param List to be filled
3831 * Source list of actions
3832 * @return ROK - success
3835 ******************************************************************/
3836 uint8_t fillActionModConfirmedList(RICactions_ConfirmedForModification_List_t *modCfmList, uint8_t numActions, \
3837 uint8_t *actionModifiedList)
3840 RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
3842 modCfmList->list.count = numActions;
3843 modCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForModification_ItemIEs_t *);
3844 RIC_ALLOC(modCfmList->list.array, modCfmList->list.size);
3845 if(!modCfmList->list.array)
3847 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3851 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
3853 RIC_ALLOC(modCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
3854 if(!modCfmList->list.array[arrIdx])
3856 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3860 modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
3861 modCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForModification_Item;
3862 modCfmListItem->criticality = CriticalityE2_ignore;
3863 modCfmListItem->value.present = \
3864 RICaction_ConfirmedForModification_ItemIEs__value_PR_RICaction_ConfirmedForModification_Item;
3865 modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID = actionModifiedList[arrIdx];
3871 /*******************************************************************
3873 * @brief Fill the list of actions refused to be modified
3877 * Function : fillActionModRefusedList
3879 * Functionality: Fill the list of actions refused to be modified
3881 * @param List to be filled
3883 * Source list of actions refused tobe modified
3884 * @return ROK - success
3887 ******************************************************************/
3888 uint8_t fillActionModRefusedList(RICactions_RefusedToBeModified_List_t *modRefusedList, uint8_t numActions, \
3889 ActionFailed *actionModFailedList)
3892 RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
3894 modRefusedList->list.count = numActions;
3895 modRefusedList->list.size = numActions * sizeof(RICaction_RefusedToBeModified_ItemIEs_t *);
3896 RIC_ALLOC(modRefusedList->list.array, modRefusedList->list.size);
3897 if(!modRefusedList->list.array)
3899 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3903 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
3905 RIC_ALLOC(modRefusedList->list.array[arrIdx], sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
3906 if(!modRefusedList->list.array[arrIdx])
3908 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3912 modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
3913 modRefusedListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeModified_Item;
3914 modRefusedListItem->criticality = CriticalityE2_ignore;
3915 modRefusedListItem->value.present = \
3916 RICaction_RefusedToBeModified_ItemIEs__value_PR_RICaction_RefusedToBeModified_Item;
3917 modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID = \
3918 actionModFailedList[arrIdx].actionId;
3919 fillE2FailureCause(&modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.cause, \
3920 actionModFailedList[arrIdx].failureType, actionModFailedList[arrIdx].cause);
3926 /*******************************************************************
3928 * @brief Fill the list of action confirmed for removal
3932 * Function : fillActionRemovalConfirmedList
3934 * Functionality: Fill the list of action confirmed for removal
3936 * @param List to be filled
3938 * Source list of actions removed
3939 * @return ROK - success
3942 ******************************************************************/
3943 uint8_t fillActionRemovalConfirmedList(RICactions_ConfirmedForRemoval_List_t *rmvCfmList, uint8_t numActions, \
3944 uint8_t *actionRemovedList)
3947 RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
3949 rmvCfmList->list.count = numActions;
3950 rmvCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t *);
3951 RIC_ALLOC(rmvCfmList->list.array, rmvCfmList->list.size);
3952 if(!rmvCfmList->list.array)
3954 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3958 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
3960 RIC_ALLOC(rmvCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
3961 if(!rmvCfmList->list.array[arrIdx])
3963 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3967 rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
3968 rmvCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForRemoval_Item;
3969 rmvCfmListItem->criticality = CriticalityE2_ignore;
3970 rmvCfmListItem->value.present = \
3971 RICaction_ConfirmedForRemoval_ItemIEs__value_PR_RICaction_ConfirmedForRemoval_Item;
3972 rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID = actionRemovedList[arrIdx];
3978 /*******************************************************************
3980 * @brief Fill the list of actions refused to be removed
3984 * Function : fillActionRemovalRefusedList
3986 * Functionality: Fill the list of actions refused to be removed
3988 * @param List to be filled
3990 * Source list of actions refused to be removed
3991 * @return ROK - success
3994 ******************************************************************/
3995 uint8_t fillActionRemovalRefusedList(RICactions_RefusedToBeRemoved_List_t *rmvFailList, \
3996 uint8_t numActions, ActionFailed *actionRmvlFailList)
3999 RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
4001 rmvFailList->list.count = numActions;
4002 rmvFailList->list.size = numActions * sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t *);
4003 RIC_ALLOC(rmvFailList->list.array, rmvFailList->list.size);
4004 if(!rmvFailList->list.array)
4006 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4010 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
4012 RIC_ALLOC(rmvFailList->list.array[arrIdx], sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
4013 if(!rmvFailList->list.array[arrIdx])
4015 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4019 rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
4020 rmvFailListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeRemoved_Item;
4021 rmvFailListItem->criticality = CriticalityE2_ignore;
4022 rmvFailListItem->value.present = \
4023 RICaction_RefusedToBeRemoved_ItemIEs__value_PR_RICaction_RefusedToBeRemoved_Item;
4024 rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID = actionRmvlFailList[arrIdx].actionId;
4025 fillE2FailureCause(&rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.cause, \
4026 actionRmvlFailList[arrIdx].failureType, actionRmvlFailList[arrIdx].cause);
4033 /*******************************************************************
4035 * @brief Build And Send RIC Subscription Modification Confirm
4039 * Function : BuildAndSendRicSubsModConfirm
4041 * Functionality: Build And Send RIC Subscription Modification Confirm
4044 * RIC Request ID of subscription
4046 * Temporary source action list
4047 * @return ROK - success
4050 ******************************************************************/
4051 uint8_t BuildAndSendRicSubsModConfirm(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, RicTmpActionList tmpActionList)
4053 uint8_t ieIdx = 0, elementCnt = 0;
4054 uint8_t ret = RFAILED;
4055 E2AP_PDU_t *e2apMsg = NULLP;
4056 asn_enc_rval_t encRetVal;
4057 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
4058 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
4060 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Confirm\n");
4063 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4064 if(e2apMsg == NULLP)
4066 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4070 /* Successful Outcome */
4071 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
4072 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
4073 if(e2apMsg->choice.successfulOutcome == NULLP)
4075 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4079 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
4080 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
4081 e2apMsg->choice.successfulOutcome->value.present = \
4082 SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm;
4083 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
4086 if(tmpActionList.numActionModified)
4088 if(tmpActionList.numActionModFailed)
4090 if(tmpActionList.numActionRemoved)
4092 if(tmpActionList.numActionRemovalFailed)
4095 ricSubsModCfm->protocolIEs.list.count = elementCnt;
4096 ricSubsModCfm->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationConfirm_IEs_t *);
4097 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
4098 if(!ricSubsModCfm->protocolIEs.list.array)
4100 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4104 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4106 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationConfirm_IEs_t));
4107 if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
4109 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4114 /* RIC Request ID */
4116 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4117 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICrequestID;
4118 ricSubsModCfmIe->criticality = CriticalityE2_reject;
4119 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RICrequestID;
4120 ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
4121 ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
4123 /* RAN Function ID */
4125 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4126 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RANfunctionID;
4127 ricSubsModCfmIe->criticality = CriticalityE2_reject;
4128 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RANfunctionID;
4129 ricSubsModCfmIe->value.choice.RANfunctionID = ranFuncId;
4131 /* RIC Actions List confirmed for modification */
4132 if(tmpActionList.numActionModified)
4135 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4136 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List;
4137 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4138 ricSubsModCfmIe->value.present = \
4139 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForModification_List;
4140 if(fillActionModConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List, \
4141 tmpActionList.numActionModified, tmpActionList.actionModifiedList) != ROK)
4143 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Modification List", __func__);
4148 /* RIC Actions List refured to be modified */
4149 if(tmpActionList.numActionModFailed)
4152 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4153 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List;
4154 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4155 ricSubsModCfmIe->value.present = \
4156 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeModified_List;
4157 if(fillActionModRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List, \
4158 tmpActionList.numActionModFailed, tmpActionList.actionModFailedList) != ROK)
4160 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Refused to be Modified List", __func__);
4165 /* RIC Actions List confirmed for removal */
4166 if(tmpActionList.numActionRemoved)
4169 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4170 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List;
4171 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4172 ricSubsModCfmIe->value.present = \
4173 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForRemoval_List;
4174 if(fillActionRemovalConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List, \
4175 tmpActionList.numActionRemoved, tmpActionList.actionRemovedList) != ROK)
4177 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Removal List", __func__);
4182 /* RIC Actions List Refused to be removed */
4183 if(tmpActionList.numActionRemovalFailed)
4186 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4187 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List;
4188 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4189 ricSubsModCfmIe->value.present = \
4190 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeRemoved_List;
4191 if(fillActionRemovalRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List, \
4192 tmpActionList.numActionRemovalFailed, tmpActionList.actionRemovalFailedList) != ROK)
4194 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Failed to be Removed List", __func__);
4199 /* Print and encode E2AP Message PDU */
4200 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4201 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4203 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
4205 /* Check encode results */
4206 if(encRetVal.encoded == ENCODE_FAIL)
4208 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification confirm (at %s)\n",\
4209 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4214 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification confirm\n");
4215 for(int i=0; i< encBufSize; i++)
4217 DU_LOG("%x",encBuf[i]);
4221 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
4223 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Confirm");
4231 FreeRicSubsModConfirm(e2apMsg);
4235 /*******************************************************************
4237 * @brief Processing of RIC Subscription Modification Required
4241 * Function : ProcRicSubsModReqd
4243 * Functionality: Processing of RIC Subscription Modification Required
4244 * As of now, we do not identify any scenario where this message
4245 * shall be sent by DU. Hence, bare minimum handling has been
4249 * RIC Subscription Modification Required IEs
4250 * @return ROK-success
4253 ******************************************************************/
4254 uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t *ricSubsModReqd)
4256 uint8_t ieIdx = 0, actionIdx = 0, duIdx = 0;
4260 RicRequestId ricReqId;
4261 RanFunction *ranFuncDb = NULLP;
4262 RicSubscription *ricSubs = NULLP;
4263 CmLList *ricSubsNode = NULLP;
4264 ActionInfo *action = NULLP;
4265 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
4266 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
4267 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
4268 RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULLP;
4269 RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULLP;
4270 RicTmpActionList tmpActionList;
4272 memset(&ricReqId, 0, sizeof(RicRequestId));
4273 memset(&tmpActionList, 0, sizeof(RicTmpActionList));
4275 SEARCH_DU_DB(duIdx, duId, duDb);
4278 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4282 for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
4284 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
4285 switch(ricSubsModReqdIe->id)
4287 case ProtocolIE_IDE2_id_RICrequestID:
4289 ricReqId.requestorId = ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID;
4290 ricReqId.instanceId = ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID;
4293 case ProtocolIE_IDE2_id_RANfunctionID:
4295 ranFuncId = ricSubsModReqdIe->value.choice.RANfunctionID;
4296 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
4299 /* If RIC Subscription not found, send RIC Subscription modification refuse to DU */
4300 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RIC Subscription not found");
4301 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
4302 CauseE2RICrequest_ran_function_id_invalid);
4306 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
4309 /* If RAN Function not found, send RIC Subscription modification refuse to DU */
4310 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RAN Function ID [%d] not found",ranFuncId);
4311 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, \
4312 CauseE2_PR_ricRequest, CauseE2RICrequest_request_id_unknown);
4317 case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
4319 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
4320 for(actionIdx = 0; actionIdx < actionToBeModList->list.count; actionIdx++)
4322 actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[actionIdx];
4323 actionId = actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID;
4324 action = fetchActionInfoFromActionId(actionId, ricSubs);
4327 /* No modification required as of now, hence directly adding to the list */
4328 tmpActionList.actionModifiedList[tmpActionList.numActionModified++] = actionId;
4332 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].actionId = actionId;
4333 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].failureType = \
4334 CauseE2_PR_ricRequest;
4335 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].cause = \
4336 CauseE2RICrequest_action_not_supported;
4337 tmpActionList.numActionModFailed++;
4342 case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
4344 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
4345 for(actionIdx = 0; actionIdx < actionToBeRmvList->list.count; actionIdx++)
4347 actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[actionIdx];
4348 actionId = actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID;
4349 action = fetchActionInfoFromActionId(actionId, ricSubs);
4352 tmpActionList.actionRemovedList[tmpActionList.numActionRemoved++] = actionId;
4353 memset(action, 0, sizeof(ActionInfo));
4354 action->actionId = -1;
4355 ricSubs->numOfActions--;
4365 /* If none of the action modification/removal is supported,
4366 * send RIC Subscription Modification Refuse
4368 * send RIC Subscription Modification Confirm
4370 if(tmpActionList.numActionModified || tmpActionList.numActionRemoved)
4372 BuildAndSendRicSubsModConfirm(duId, ricReqId, ranFuncId, tmpActionList);
4376 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
4377 CauseE2RICrequest_action_not_supported);
4383 /*******************************************************************
4385 * @brief Free the ErrorIndication Message
4389 * Function : FreeRicIndication
4391 * Functionality: Free the ErrorIndication Message
4396 ******************************************************************/
4397 void FreeErrorIndication(E2AP_PDU_t *e2apMsg)
4400 ErrorIndicationE2_t *errorIndicationMsg= NULLP;
4402 if(e2apMsg != NULLP)
4404 if(e2apMsg->choice.initiatingMessage != NULLP)
4406 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
4407 if(errorIndicationMsg!= NULLP)
4409 if(errorIndicationMsg->protocolIEs.list.array != NULLP)
4411 for(arrIdx=0; arrIdx<errorIndicationMsg->protocolIEs.list.count; arrIdx++)
4413 RIC_FREE(errorIndicationMsg->protocolIEs.list.array[arrIdx],sizeof(ErrorIndicationE2_t));
4415 RIC_FREE(errorIndicationMsg->protocolIEs.list.array,errorIndicationMsg->protocolIEs.list.size);
4418 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4420 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4425 /*******************************************************************
4427 * @brief Builds and Send the ErrorIndication Message
4431 * Function : BuildAndSendErrorIndication
4433 * Functionality:Fills the ErrorIndication Message
4441 * @return ROK - success
4444 ******************************************************************/
4446 uint8_t BuildAndSendErrorIndication(uint32_t duId, int8_t transId, RicRequestId requestId, uint16_t ranFuncId, uint8_t reason)
4448 uint8_t elementCnt =0, arrIdx=0, ret = RFAILED;
4449 E2AP_PDU_t *e2apMsg = NULLP;
4450 ErrorIndicationE2_t *errorIndicationMsg=NULLP;
4451 asn_enc_rval_t encRetVal; /* Encoder return value */
4455 DU_LOG("\nINFO --> E2AP : Building Error Indication Message\n");
4457 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4458 if(e2apMsg == NULLP)
4460 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4464 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4465 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4466 if(e2apMsg->choice.initiatingMessage == NULLP)
4468 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4471 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_ErrorIndicationE2;
4472 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4473 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ErrorIndicationE2;
4475 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
4477 /* Element count is 2 for TransactionID/RICrequestID and Cause.
4478 * If the RAN function id is present, the count will be increased.*/
4483 errorIndicationMsg->protocolIEs.list.count = elementCnt;
4484 errorIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(ErrorIndicationE2_IEs_t*);
4486 /* Initialize the E2Setup members */
4487 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array, errorIndicationMsg->protocolIEs.list.size);
4488 if(errorIndicationMsg->protocolIEs.list.array == NULLP)
4490 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements in %s at line %d",__func__, __LINE__);
4493 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
4495 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array[arrIdx], sizeof(ErrorIndicationE2_IEs_t));
4496 if(errorIndicationMsg->protocolIEs.list.array[arrIdx] == NULLP)
4498 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array Idx %d in %s at line %d",arrIdx,__func__, __LINE__);
4502 if(arrIdx < elementCnt)
4507 if(transId >=0 && transId<=255)
4510 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4511 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4512 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_TransactionID;
4513 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
4518 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RICrequestID;
4519 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4520 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RICrequestID;
4521 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricRequestorID = requestId.requestorId;
4522 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricInstanceID = requestId.instanceId;
4527 /* RAN Function ID */
4529 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionID;
4530 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4531 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RANfunctionID;
4532 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionID = ranFuncId;
4537 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4538 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
4539 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
4540 fillE2FailureCause(&errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, CauseE2_PR_misc, reason);
4543 /* Prints the Msg formed */
4544 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4545 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4547 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4549 if(encRetVal.encoded == ENCODE_FAIL)
4551 DU_LOG("\nERROR --> E2AP : Could not encode Error Indication Message (at %s)\n",\
4552 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4557 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for Error Indication Message \n");
4558 #ifdef DEBUG_ASN_PRINT
4559 for(int i=0; i< encBufSize; i++)
4561 printf("%x",encBuf[i]);
4566 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
4568 DU_LOG("\nINFO --> E2AP : Sending Error Indication Message");
4574 FreeErrorIndication(e2apMsg);
4578 /*******************************************************************
4580 * @brief Deallocate the memory allocated for ResetRequest msg
4584 * Function : FreeResetRequest
4587 * - freeing the memory allocated for ResetRequest
4589 * @params[in] E2AP_PDU_t *e2apMsg
4590 * @return ROK - success
4593 * ****************************************************************/
4594 void FreeResetRequest(E2AP_PDU_t *e2apMsg)
4597 ResetRequestE2_t *resetReq = NULLP;
4599 if(e2apMsg != NULLP)
4601 if(e2apMsg->choice.initiatingMessage != NULLP)
4603 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4604 if(resetReq->protocolIEs.list.array)
4606 for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4608 RIC_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4610 RIC_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4612 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4614 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4618 /*******************************************************************
4620 * @brief Build and send the reset request msg
4624 * Function : BuildAndSendResetRequest
4627 * - Buld and send the reset request msg to E2 node
4633 * @return ROK - success
4636 * ****************************************************************/
4637 uint8_t BuildAndSendResetRequest(DuDb *duDb, CauseE2_PR causePresent, uint8_t reason)
4639 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
4640 uint8_t ret = RFAILED;
4641 E2AP_PDU_t *e2apMsg = NULLP;
4642 ResetRequestE2_t *resetReq = NULLP;
4643 asn_enc_rval_t encRetVal; /* Encoder return value */
4645 DU_LOG("\nINFO --> E2AP : Building Reset Request\n");
4649 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4650 if(e2apMsg == NULLP)
4652 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for E2AP-PDU failed");
4656 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4657 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4658 if(e2apMsg->choice.initiatingMessage == NULLP)
4660 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for initiatingMessage");
4664 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
4665 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4666 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
4667 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4670 resetReq->protocolIEs.list.count = elementCnt;
4671 resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
4673 RIC_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4674 if(!resetReq->protocolIEs.list.array)
4676 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4677 Reset Request IE array");
4681 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4683 RIC_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4684 if(!resetReq->protocolIEs.list.array[ieIdx])
4686 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4687 Reset Request IE array element");
4692 /* In case of failure */
4693 if(ieIdx < elementCnt)
4697 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4698 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
4699 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
4700 transId = assignTransactionId(duDb);
4701 resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
4704 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4705 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
4706 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
4707 fillE2FailureCause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, causePresent, reason);
4709 /* Prints the Msg formed */
4710 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4712 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4714 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4716 if(encRetVal.encoded == ENCODE_FAIL)
4718 DU_LOG("\nERROR --> E2AP : Could not encode reset request structure (at %s)\n",\
4719 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4724 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for reset request\n");
4725 #ifdef DEBUG_ASN_PRINT
4726 for(int i=0; i< encBufSize; i++)
4728 printf("%x",encBuf[i]);
4732 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
4734 DU_LOG("\nERROR --> E2AP : Sending reset request failed");
4743 /* Free all memory */
4744 FreeResetRequest(e2apMsg);
4748 /******************************************************************
4750 * @brief Delete Ric subscription node
4754 * Function : deleteRicSubscriptionNode
4756 * Functionality: Delete Ric subscription node
4758 * @params[in] Ric subscription info
4762 * ****************************************************************/
4763 void deleteRicSubscriptionNode(CmLList *subscriptionNode)
4765 uint8_t actionIdx=0;
4766 RicSubscription *ricSubscriptionInfo = NULLP;
4768 ricSubscriptionInfo = (RicSubscription*)subscriptionNode->node;
4770 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
4772 if(ricSubscriptionInfo->actionSequence[actionIdx].actionId > -1)
4774 memset(&ricSubscriptionInfo->actionSequence[actionIdx], 0, sizeof(ActionInfo));
4777 memset(ricSubscriptionInfo, 0, sizeof(RicSubscription));
4778 RIC_FREE(subscriptionNode->node, sizeof(RicSubscription));
4779 RIC_FREE(subscriptionNode, sizeof(CmLList));
4782 /*******************************************************************
4784 * @brief Delete RIC subscription List
4788 * Function : deleteRicSubscriptionList
4790 * Functionality: Delete RIC subscription list
4792 * @params[in] RIC Subscription list
4796 ******************************************************************/
4797 void deleteRicSubscriptionList(CmLListCp *subscriptionList)
4799 CmLList *subscriptionNode = NULLP;
4801 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
4802 while(subscriptionNode)
4804 cmLListDelFrm(subscriptionList, subscriptionNode);
4805 deleteRicSubscriptionNode(subscriptionNode);
4806 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
4810 /*******************************************************************
4812 * @brief process the E2 Reset Response
4816 * Function : ProcResetResponse
4818 * Functionality: Process E2 Reset Response
4822 * Pointer to reset response
4825 ******************************************************************/
4827 void ProcResetResponse(uint32_t duId, ResetResponseE2_t *resetRsp)
4829 uint8_t ieIdx = 0, duIdx =0;
4831 RanFunction *ranFuncDb = NULLP;
4832 uint16_t ranFuncIdx = 0;
4834 SEARCH_DU_DB(duIdx, duId, duDb);
4837 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4843 DU_LOG("\nERROR --> E2AP : resetRsp pointer is null");
4847 if(!resetRsp->protocolIEs.list.array)
4849 DU_LOG("\nERROR --> E2AP : resetRsp array pointer is null");
4853 for(ieIdx=0; ieIdx < resetRsp->protocolIEs.list.count; ieIdx++)
4855 if(resetRsp->protocolIEs.list.array[ieIdx])
4857 switch(resetRsp->protocolIEs.list.array[ieIdx]->id)
4859 case ProtocolIE_IDE2_id_TransactionID:
4861 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
4863 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
4864 if(ranFuncDb->id > 0)
4866 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
4871 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4881 /*******************************************************************
4883 * @brief process the E2 Reset Request
4887 * Function : ProcResetRequest
4889 * Functionality: Process E2 Reset Request
4893 * Pointer to reset response
4896 ******************************************************************/
4898 void ProcResetRequest(uint32_t duId, ResetRequestE2_t *resetReq)
4900 uint8_t ieIdx = 0, duIdx =0, transId=0;
4902 RanFunction *ranFuncDb = NULLP;
4903 uint16_t ranFuncIdx = 0;
4905 SEARCH_DU_DB(duIdx, duId, duDb);
4908 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4914 DU_LOG("\nERROR --> E2AP : resetReq pointer is null");
4918 if(!resetReq->protocolIEs.list.array)
4920 DU_LOG("\nERROR --> E2AP : resetReq array pointer is null");
4924 for(ieIdx=0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4926 if(resetReq->protocolIEs.list.array[ieIdx])
4928 switch(resetReq->protocolIEs.list.array[ieIdx]->id)
4930 case ProtocolIE_IDE2_id_TransactionID:
4932 transId = resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
4935 case ProtocolIE_IDE2_id_CauseE2:
4937 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
4939 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
4940 if(ranFuncDb->id > 0)
4942 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
4951 if(BuildAndSendResetResponse(duId, transId) !=ROK)
4953 DU_LOG("\nERROR --> E2AP : Failed to build and send reset response");
4957 /*******************************************************************
4959 * @brief Free RIC Subscription Delete Request Message
4963 * Function : FreeRicSubscriptionDeleteRequest
4965 * Functionality: Free RIC Subscription Delete Request
4967 * @param E2AP Message PDU
4970 ******************************************************************/
4971 void FreeRicSubscriptionDeleteRequest(E2AP_PDU_t *e2apMsg)
4973 uint8_t ieIdx = 0, arrIdx = 0;
4974 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
4978 if(e2apMsg->choice.initiatingMessage)
4980 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
4981 if(ricSubsDelReq->protocolIEs.list.array)
4983 for(ieIdx = 0; ieIdx < ricSubsDelReq->protocolIEs.list.count; ieIdx++)
4985 RIC_FREE(ricSubsDelReq->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequired_IEs_t));
4987 RIC_FREE(ricSubsDelReq->protocolIEs.list.array, ricSubsDelReq->protocolIEs.list.size);
4989 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4991 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));;
4995 /*******************************************************************
4997 * @brief Builds and Send RIC Subscription delete request
5001 * Function : BuildAndSendRicSubscriptionDeleteRequest
5003 * Functionality: Build and send RIC subscription delete request.
5006 * RIC subscription info to be deleted
5007 * @return ROK - success
5010 ******************************************************************/
5011 uint8_t BuildAndSendRicSubscriptionDeleteRequest(uint32_t duId, RicSubscription *ricSubsDb)
5013 uint8_t elementCnt = 0, ieIdx = 0, ret = RFAILED;
5014 E2AP_PDU_t *e2apMsg = NULLP;
5015 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
5016 RICsubscriptionDeleteRequest_IEs_t *ricSubsDelReqIe = NULLP;
5017 asn_enc_rval_t encRetVal; /* Encoder return value */
5021 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Delete Request Message\n");
5023 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5024 if(e2apMsg == NULLP)
5026 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
5030 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5031 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5032 if(e2apMsg->choice.initiatingMessage == NULLP)
5034 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
5037 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionDelete;
5038 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5039 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequest;
5041 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
5044 ricSubsDelReq->protocolIEs.list.count = elementCnt;
5045 ricSubsDelReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionDeleteRequest_IEs_t *);
5047 RIC_ALLOC(ricSubsDelReq->protocolIEs.list.array, ricSubsDelReq->protocolIEs.list.size);
5048 if(ricSubsDelReq->protocolIEs.list.array == NULLP)
5050 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for array elements at line %d",__func__, __LINE__);
5054 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
5056 RIC_ALLOC(ricSubsDelReq->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequest_IEs_t));
5057 if(ricSubsDelReq->protocolIEs.list.array[ieIdx] == NULLP)
5059 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for index [%d] at line %d", \
5060 __func__, ieIdx, __LINE__);
5064 if(ieIdx < elementCnt)
5067 /* RIC Request ID */
5069 ricSubsDelReqIe = ricSubsDelReq->protocolIEs.list.array[ieIdx];
5070 ricSubsDelReqIe->id = ProtocolIE_IDE2_id_RICrequestID;
5071 ricSubsDelReqIe->criticality = CriticalityE2_reject;
5072 ricSubsDelReqIe->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
5073 ricSubsDelReqIe->value.choice.RICrequestID.ricRequestorID = ricSubsDb->requestId.requestorId;
5074 ricSubsDelReqIe->value.choice.RICrequestID.ricInstanceID = ricSubsDb->requestId.instanceId;
5076 /* RAN Function ID */
5078 ricSubsDelReqIe = ricSubsDelReq->protocolIEs.list.array[ieIdx];
5079 ricSubsDelReqIe->id = ProtocolIE_IDE2_id_RANfunctionID;
5080 ricSubsDelReqIe->criticality = CriticalityE2_reject;
5081 ricSubsDelReqIe->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
5082 ricSubsDelReqIe->value.choice.RANfunctionID = ricSubsDb->ranFuncId;
5084 /* Prints the Msg formed */
5085 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5086 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5088 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
5089 if(encRetVal.encoded == ENCODE_FAIL)
5091 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Delete Request Message (at %s)\n",\
5092 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5097 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Delete Request Message \n");
5098 #ifdef DEBUG_ASN_PRINT
5099 for(int i=0; i< encBufSize; i++)
5101 printf("%x",encBuf[i]);
5106 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
5108 DU_LOG("\nERROR --> E2AP : Failed to send RIC Susbcription Delete Request Message");
5116 FreeRicSubscriptionDeleteRequest(e2apMsg);
5120 /*******************************************************************
5122 * @brief Processing of RIC Subscription Delete Required
5126 * Function : ProcRicSubsDeleteReqd
5128 * Functionality: Processing of RIC Subscription Delete Required
5129 * When received, RIC stub will initiate the RIC subscription
5130 * deletion procedure towards DU
5133 * RIC Subscription Delete Required IEs
5134 * @return ROK-success
5137 ******************************************************************/
5138 uint8_t ProcRicSubsDeleteReqd(uint32_t duId, RICsubscriptionDeleteRequired_t *ricSubsDelRqd)
5140 uint8_t ieIdx = 0, duIdx = 0;
5141 uint16_t arrIdx = 0;
5143 RicRequestId ricReqId;
5144 RanFunction *ranFuncDb = NULLP;
5145 RicSubscription *subsDb = NULLP;
5146 CmLList *ricSubsNode = NULLP;
5148 RICsubscriptionDeleteRequired_IEs_t *ricSubsDelRqdIe = NULLP;
5149 RICsubscription_List_withCause_t *ricSubsList = NULLP;
5150 RICsubscription_withCause_Item_t *subsItem = NULLP;
5152 memset(&ricReqId, 0, sizeof(RicRequestId));
5156 DU_LOG("\nERROR --> E2AP : %s: Received NULL message", __func__);
5160 SEARCH_DU_DB(duIdx, duId, duDb);
5163 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
5167 for(ieIdx = 0; ieIdx < ricSubsDelRqd->protocolIEs.list.count; ieIdx++)
5169 ricSubsDelRqdIe = ricSubsDelRqd->protocolIEs.list.array[ieIdx];
5170 switch(ricSubsDelRqdIe->id)
5172 case ProtocolIE_IDE2_id_RICsubscriptionToBeRemoved:
5174 ricSubsList = &ricSubsDelRqdIe->value.choice.RICsubscription_List_withCause;
5175 for(arrIdx = 0; arrIdx < ricSubsList->list.count; arrIdx++)
5177 subsItem = &(((RICsubscription_withCause_ItemIEs_t *)ricSubsList->list.array[arrIdx])->\
5178 value.choice.RICsubscription_withCause_Item);
5179 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, subsItem->ranFunctionID);
5182 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%ld] not found", __func__, subsItem->ranFunctionID);
5186 ricReqId.requestorId = subsItem->ricRequestID.ricRequestorID;
5187 ricReqId.instanceId = subsItem->ricRequestID.ricInstanceID;
5188 subsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
5191 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%ld] Instance_ID [%ld]", \
5192 __func__, subsItem->ricRequestID.ricRequestorID, subsItem->ricRequestID.ricInstanceID);
5196 /* Delete RIC Subcription from RAN Function */
5197 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
5199 /* Send RIC Subscription delete request and then free any memory
5200 * allocated to store subscription info at RIC */
5201 BuildAndSendRicSubscriptionDeleteRequest(duId, (RicSubscription *)ricSubsNode->node);
5202 deleteRicSubscriptionNode(ricSubsNode);
5215 /*******************************************************************
5217 * @brief Handles received E2AP message and sends back response
5221 * Function : E2APMsgHdlr
5224 * - Decodes received E2AP control message
5225 * - Prepares response message, encodes and sends to SCTP
5228 * @return ROK - success
5231 * ****************************************************************/
5232 void E2APMsgHdlr(uint32_t *duId, Buffer *mBuf)
5238 E2AP_PDU_t *e2apMsg;
5239 asn_dec_rval_t rval; /* Decoder return value */
5240 E2AP_PDU_t e2apasnmsg ;
5242 DU_LOG("\nINFO --> E2AP : Received E2AP message buffer");
5243 ODU_PRINT_MSG(mBuf, 0,0);
5245 /* Copy mBuf into char array to decode it */
5246 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
5247 RIC_ALLOC(recvBuf, (Size)recvBufLen);
5249 if(recvBuf == NULLP)
5251 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
5254 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
5256 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
5260 DU_LOG("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
5261 for(i=0; i< recvBufLen; i++)
5263 DU_LOG("%x",recvBuf[i]);
5266 /* Decoding flat buffer into E2AP messsage */
5267 e2apMsg = &e2apasnmsg;
5268 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
5270 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
5271 RIC_FREE(recvBuf, (Size)recvBufLen);
5273 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
5275 DU_LOG("\nERROR --> E2AP : ASN decode failed");
5279 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5281 switch(e2apMsg->present)
5283 case E2AP_PDU_PR_initiatingMessage:
5285 switch(e2apMsg->choice.initiatingMessage->value.present)
5287 case InitiatingMessageE2__value_PR_E2setupRequest:
5289 DU_LOG("\nINFO --> E2AP : E2 setup request received");
5290 ProcE2SetupReq(duId, &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest);
5293 case InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate:
5295 DU_LOG("\nINFO --> E2AP : E2 node config update received");
5296 ProcE2NodeConfigUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate);
5299 case InitiatingMessageE2__value_PR_ResetRequestE2:
5301 DU_LOG("\nINFO --> E2AP : E2 Reset Request received");
5302 ProcResetRequest(*duId, &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2);
5305 case InitiatingMessageE2__value_PR_RICindication:
5307 DU_LOG("\nINFO --> E2AP : RIC Indication received");
5310 case InitiatingMessageE2__value_PR_RICserviceUpdate:
5312 DU_LOG("\nINFO --> E2AP : RIC Service update received");
5313 ProcRicServiceUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate);
5316 case InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired:
5318 DU_LOG("\nINFO --> E2AP : RIC Subscription Modification Required");
5319 ProcRicSubsModReqd(*duId, \
5320 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired);
5323 case InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequired:
5325 DU_LOG("\nINFO --> E2AP : RIC Subscription Delete Required");
5326 ProcRicSubsDeleteReqd(*duId, \
5327 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequired);
5331 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
5333 DU_LOG("\nINFO --> E2AP : Error indication received");
5338 DU_LOG("\nERROR --> E2AP : Invalid type of intiating message [%d]", \
5339 e2apMsg->choice.initiatingMessage->value.present);
5342 }/* End of switch(initiatingMessage) */
5345 case E2AP_PDU_PR_successfulOutcome:
5347 switch(e2apMsg->choice.successfulOutcome->value.present)
5349 case SuccessfulOutcomeE2__value_PR_ResetResponseE2:
5351 DU_LOG("\nINFO --> E2AP : Reset response received");
5352 ProcResetResponse(*duId, &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2);
5355 case SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse:
5357 ProcRicSubscriptionResponse(*duId, \
5358 &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse);
5363 DU_LOG("\nERROR --> E2AP : Invalid type of successfulOutcome message [%d]", \
5364 e2apMsg->choice.successfulOutcome->value.present);
5371 case E2AP_PDU_PR_unsuccessfulOutcome:
5373 switch(e2apMsg->choice.successfulOutcome->value.present)
5375 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure:
5377 ProcRicSubscriptionFailure(*duId, \
5378 &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure);
5383 DU_LOG("\nERROR --> E2AP : Invalid type of unsuccessfulOutcome message [%d]", \
5384 e2apMsg->choice.unsuccessfulOutcome->value.present);
5392 DU_LOG("\nERROR --> E2AP : Invalid type message type ");
5396 }/* End of switch(e2apMsg->present) */
5397 } /* End of E2APMsgHdlr */
5400 /**********************************************************************
5402 **********************************************************************/