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"
45 #include "E2connectionUpdate-Item.h"
47 /*******************************************************************
49 * @brief Printing Type and Cause of failure
53 * Function : printE2ErrorCause
55 * Functionality: Printing Type and Cause of failure
57 * @params[in] E2 Cause
60 ******************************************************************/
62 void printE2ErrorCause(CauseE2_t *cause)
64 switch(cause->present)
66 case CauseE2_PR_ricRequest:
68 DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Request", cause->choice.ricRequest);
71 case CauseE2_PR_ricService:
73 DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Service", cause->choice.ricService);
76 case CauseE2_PR_e2Node:
78 DU_LOG("Failure_Type [%s] Cause [%ld]", "E2_Node", cause->choice.e2Node);
81 case CauseE2_PR_transport:
83 DU_LOG("Failure_Type [%s] Cause [%ld]", "Transport", cause->choice.transport);
86 case CauseE2_PR_protocol:
88 DU_LOG("Failure_Type [%s] Cause [%ld]", "Protocol", cause->choice.protocol);
93 DU_LOG("Failure_Type [%s] Cause [%ld]", "Miscellaneous", cause->choice.misc);
98 DU_LOG("Failure_Type and Cause unknown");
104 /*******************************************************************
106 * @brief fill E2 failure cause
110 * Function : fillE2FailureCause
112 * Functionality: fill E2 failure cause
113 * @return ROK - success
116 ******************************************************************/
118 void fillE2FailureCause(CauseE2_t *cause, CauseE2_PR causePresent, uint8_t reason)
120 cause->present = causePresent;
122 switch(cause->present)
124 case CauseE2_PR_ricRequest:
125 cause->choice.ricRequest = reason;
127 case CauseE2_PR_ricService:
128 cause->choice.ricService = reason;
130 case CauseE2_PR_e2Node:
131 cause->choice.e2Node = reason;
133 case CauseE2_PR_transport:
134 cause->choice.transport = reason;
136 case CauseE2_PR_protocol:
137 cause->choice.protocol = reason;
139 case CauseE2_PR_misc:
140 cause->choice.misc = reason;
143 cause->choice.misc = CauseE2Misc_unspecified;
148 /*******************************************************************
150 * @brief Assigns new transaction id to RIC initiated procedure
154 * Function : assignTransactionId
156 * Functionality: Assigns new transaction id to a RIC initiated
159 * @params[in] Region region
161 * @return ROK - success
164 * ****************************************************************/
166 uint8_t assignTransactionId(DuDb *duDb)
168 uint8_t currTransId = duDb->ricTransIdCounter;
170 /* Update to next valid value */
171 duDb->ricTransIdCounter++;
172 if(duDb->ricTransIdCounter == MAX_NUM_TRANSACTION)
173 duDb->ricTransIdCounter = 0;
178 /*******************************************************************
180 * @brief add RIC Subs action info
184 * Function : addRicSubsAction
186 * Functionality: add Ric Subs action info
191 * @return ROK - success
194 ******************************************************************/
195 CmLList *addRicSubsAction(uint8_t ricActionID, CmLListCp *actionSequence)
197 ActionInfo *actionDb = NULLP;
198 CmLList *actionNode=NULLP;
200 RIC_ALLOC(actionDb, sizeof(ActionInfo));
203 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
207 actionDb->actionId = ricActionID;
208 RIC_ALLOC(actionNode, sizeof(CmLList));
211 actionNode->node = (PTR) actionDb;
212 cmLListAdd2Tail(actionSequence, actionNode);
216 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at %d",__func__,__LINE__);
217 RIC_FREE(actionDb, sizeof(ActionInfo));
224 /*******************************************************************
226 * @brief Sends E2 msg over SCTP
230 * Function : SendE2APMsg
232 * Functionality: Sends E2 msg over SCTP
234 * @params[in] Region region
236 * @return ROK - success
239 * ****************************************************************/
241 uint8_t SendE2APMsg(Region region, Pool pool, uint32_t duId)
245 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
247 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
249 ODU_PRINT_MSG(mBuf, 0,0);
251 if(sctpSend(duId, mBuf) != ROK)
253 DU_LOG("\nERROR --> E2AP : SCTP Send for E2 failed");
254 ODU_PUT_MSG_BUF(mBuf);
260 DU_LOG("\nERROR --> E2AP : ODU_ADD_POST_MSG_MULT failed");
261 ODU_PUT_MSG_BUF(mBuf);
264 ODU_PUT_MSG_BUF(mBuf);
268 DU_LOG("\nERROR --> E2AP : Failed to allocate memory");
275 /*******************************************************************
277 * @brief Deallocate the memory allocated for RemovalRequest msg
281 * Function : FreeRemovalRequest
284 * - freeing the memory allocated for RemovalRequest
286 * @params[in] E2AP_PDU_t *e2apMsg
287 * @return ROK - success
290 * ****************************************************************/
291 void FreeRemovalRequest(E2AP_PDU_t *e2apMsg)
294 E2RemovalRequest_t *removalReq = NULLP;
298 if(e2apMsg->choice.initiatingMessage != NULLP)
300 removalReq = &e2apMsg->choice.initiatingMessage->value.choice.E2RemovalRequest;
301 if(removalReq->protocolIEs.list.array)
303 for(ieIdx = 0; ieIdx < removalReq->protocolIEs.list.count; ieIdx++)
305 RIC_FREE(removalReq->protocolIEs.list.array[ieIdx], sizeof(E2RemovalRequestIEs_t));
307 RIC_FREE(removalReq->protocolIEs.list.array, removalReq->protocolIEs.list.size);
309 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
311 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
315 /*******************************************************************
317 * @brief Build and send the removal request msg
321 * Function : BuildAndSendRemovalRequest
324 * - Buld and send the removal request msg to E2 node
330 * @return ROK - success
333 * ****************************************************************/
334 uint8_t BuildAndSendRemovalRequest(DuDb *duDb)
336 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
337 uint8_t ret = RFAILED;
338 E2AP_PDU_t *e2apMsg = NULLP;
339 E2RemovalRequest_t *removalReq = NULLP;
340 asn_enc_rval_t encRetVal; /* Encoder return value */
342 DU_LOG("\nINFO --> E2AP : Building Removal Request\n");
346 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
349 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
353 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
354 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
355 if(e2apMsg->choice.initiatingMessage == NULLP)
357 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
361 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2removal;
362 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
363 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2RemovalRequest;
364 removalReq = &e2apMsg->choice.initiatingMessage->value.choice.E2RemovalRequest;
367 removalReq->protocolIEs.list.count = elementCnt;
368 removalReq->protocolIEs.list.size = elementCnt * sizeof(E2RemovalRequestIEs_t *);
370 RIC_ALLOC(removalReq->protocolIEs.list.array, removalReq->protocolIEs.list.size);
371 if(!removalReq->protocolIEs.list.array)
373 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
377 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
379 RIC_ALLOC(removalReq->protocolIEs.list.array[ieIdx], sizeof(E2RemovalRequestIEs_t));
380 if(!removalReq->protocolIEs.list.array[ieIdx])
382 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
387 /* In case of failure */
388 if(ieIdx < elementCnt)
392 removalReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
393 removalReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
394 removalReq->protocolIEs.list.array[ieIdx]->value.present = E2RemovalRequestIEs__value_PR_TransactionID;
395 transId = assignTransactionId(duDb);
396 removalReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
398 /* Prints the Msg formed */
399 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
401 memset(encBuf, 0, ENC_BUF_MAX_LEN);
403 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
405 if(encRetVal.encoded == ENCODE_FAIL)
407 DU_LOG("\nERROR --> E2AP : Could not encode removal request structure (at %s)\n",\
408 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
413 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for removal request\n");
414 #ifdef DEBUG_ASN_PRINT
415 for(int i=0; i< encBufSize; i++)
417 printf("%x",encBuf[i]);
421 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
423 DU_LOG("\nERROR --> E2AP : Sending removal request failed");
432 /* Free all memory */
433 FreeRemovalRequest(e2apMsg);
437 /*******************************************************************
439 * @brief Fetches RAN Function DB
443 * Function : fetchRanFuncFromRanFuncId
445 * Functionality: Fetches RAN function DB from E2AP DB using
448 * @params[in] RAN Function ID
449 * @return RAN Function DB
450 * NULL, in case of failure
452 * ****************************************************************/
453 RanFunction *fetchRanFuncFromRanFuncId(DuDb *duDb, uint16_t ranFuncId)
455 RanFunction *ranFuncDb = NULLP;
457 /* Fetch RAN Function DB */
458 if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
460 ranFuncDb = &duDb->ranFunction[ranFuncId-1];
464 DU_LOG("\nERROR --> DU_APP : fetchRanFuncFromRanFuncId: Invalid RAN Function ID[%d]", ranFuncId);
470 /*******************************************************************
472 * @brief Fetch subscripton DB
476 * Function : fetchSubsInfoFromRicReqId
478 * Functionality: Fetches subscription DB from RAN Function DB
479 * using RIC Request ID
481 * @params[in] RIC Request ID
483 * Pointer to RIC Subscription node to be searched
484 * @return RIC Subscription from RAN Function's subcription list
485 * NULL, in case of failure
487 * ****************************************************************/
488 RicSubscription *fetchSubsInfoFromRicReqId(RicRequestId ricReqId, RanFunction *ranFuncDb, CmLList **ricSubscriptionNode)
490 RicSubscription *ricSubscriptionInfo = NULLP;
492 /* Fetch subscription detail in RAN Function DB */
493 CM_LLIST_FIRST_NODE(&ranFuncDb->subscriptionList, *ricSubscriptionNode);
494 while(*ricSubscriptionNode)
496 ricSubscriptionInfo = (RicSubscription *)((*ricSubscriptionNode)->node);
497 if(ricSubscriptionInfo && (ricSubscriptionInfo->requestId.requestorId == ricReqId.requestorId) &&
498 (ricSubscriptionInfo->requestId.instanceId == ricReqId.instanceId))
502 *ricSubscriptionNode = (*ricSubscriptionNode)->next;
503 ricSubscriptionInfo = NULLP;
506 if(!ricSubscriptionInfo)
508 DU_LOG("\nERROR --> E2AP : fetchSubsInfoFromRicReqId: Subscription not found for Requestor ID [%d] \
509 Instance ID [%d] in RAN Function ID [%d]", ricReqId.requestorId, ricReqId.instanceId, ranFuncDb->id);
512 return ricSubscriptionInfo;
515 /*******************************************************************
517 * @brief Fetch Action details
521 * Function : fetchActionInfoFromActionId
523 * Functionality: Fetch action details from RIC subscription DB
526 * @params[in] Action ID
527 * RIC Subscription DB
529 * @return Action Info DB
530 * NULL, in case of failure
532 * ****************************************************************/
533 ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo, CmLList ** actionNode)
535 ActionInfo *actionInfoDb = NULLP;
537 CM_LLIST_FIRST_NODE(&ricSubscriptionInfo->actionSequence, *actionNode);
540 actionInfoDb = (ActionInfo*)((*actionNode)->node);
541 if(actionInfoDb->actionId == actionId)
545 *actionNode= (*actionNode)->next;
547 if(actionInfoDb==NULLP)
549 DU_LOG("\nERROR --> E2AP : fetchActionInfoFromActionId: Action Id [%d] not found in \
550 subscription info [Requestor id : %d] [Instance Id : %d]", actionId,\
551 ricSubscriptionInfo->requestId.requestorId, ricSubscriptionInfo->requestId.instanceId);
557 /******************************************************************
559 * @brief Search E2 node component with the help of interface type
564 * Function : fetchE2NodeComponentInfo
566 * Functionality: Search E2 node component
571 * Pointer to E2 component node to be searched
574 * ****************************************************************/
576 E2NodeComponent *fetchE2NodeComponentInfo(DuDb *duDb, InterfaceType interfaceType,CmLList **e2ComponentNode)
578 E2NodeComponent *e2NodeComponentInfo=NULLP;
580 if(duDb->e2NodeComponent.count)
582 CM_LLIST_FIRST_NODE(&duDb->e2NodeComponent, *e2ComponentNode);
583 while(*e2ComponentNode)
585 e2NodeComponentInfo = (E2NodeComponent*)((*e2ComponentNode)->node);
586 if((e2NodeComponentInfo->interfaceType == interfaceType))
591 *e2ComponentNode = (*e2ComponentNode)->next;
592 e2NodeComponentInfo = NULLP;
595 return e2NodeComponentInfo;
598 /*******************************************************************
600 * @brief update E2 node config list
604 * Function : updateE2NodeConfigList
607 * - update E2 node config list
611 * Configuration which need to update in Database
613 * @return ROK - success
616 * ****************************************************************/
617 uint8_t updateE2NodeConfigList(DuDb **duDb, uint8_t protocolId, E2NodeConfigItem *tmpCfg)
620 E2NodeComponent * e2NodeComponentInfo;
621 bool configFound= false;
625 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
627 /* Adding the new e2 node component in DB*/
628 RIC_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent));
629 e2NodeComponentInfo->interfaceType = tmpCfg->componentInfo.interfaceType;
630 e2NodeComponentInfo->componentId =tmpCfg->componentInfo.componentId;
631 RIC_ALLOC(node, sizeof(CmLList));
634 node->node = (PTR) e2NodeComponentInfo;
635 cmLListAdd2Tail(&(*duDb)->e2NodeComponent, node);
640 DU_LOG("\nERROR --> E2AP : Memory allocation failed for e2NodeComponentList node");
641 RIC_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
646 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
648 /* searching for information in a database */
649 e2NodeComponentInfo = fetchE2NodeComponentInfo((*duDb),tmpCfg->componentInfo.interfaceType, &node);
650 if(!e2NodeComponentInfo)
652 DU_LOG("\nERROR --> E2AP : Failed to find the e2 component node");
655 /* If the node is present then update the value */
656 e2NodeComponentInfo->componentId =tmpCfg->componentInfo.componentId;
660 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
662 /* searching for information in a database */
663 e2NodeComponentInfo = fetchE2NodeComponentInfo((*duDb),tmpCfg->componentInfo.interfaceType, &node);
664 if(!e2NodeComponentInfo)
666 DU_LOG("\nERROR --> E2AP : Failed to find the e2 component node");
669 /* Delete the node from the list */
670 e2NodeComponentInfo->componentId = tmpCfg->componentInfo.componentId;
671 cmLListDelFrm(&(*duDb)->e2NodeComponent, node);
672 RIC_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
678 /* If the configuration update was successful, then mark the isSuccessful as
679 * true; otherwise, mark it as false. */
680 if(configFound == true)
681 tmpCfg->isSuccessful = true;
683 tmpCfg->isSuccessful = false;
688 /*******************************************************************
690 * @brief Handling the E2 node configuration depending on the add,
691 * update, or remove configuration type
695 * Function : handleE2NodeComponentAction
698 * - Handling the E2 node configuration depending on the add,
699 * update, or remove configuration type
702 * Pointer to e2NodeCfg which has info
704 * E2NodeConfigItem to be filled
706 * @return ROK - success
709 * ****************************************************************/
711 uint8_t handleE2NodeComponentAction(DuDb *duDb, PTR e2NodeCfg, uint8_t protocolId, E2NodeConfigItem *storeCfg)
713 uint8_t configFound = ROK;
714 E2NodeConfigItem tmpCfg;
715 E2nodeComponentID_t componentId;
716 E2nodeComponentInterfaceType_t interface;
717 E2nodeComponentConfigAddition_Item_t *addCfg=NULL;
718 E2nodeComponentConfigUpdate_Item_t *updateCfg=NULL;
719 E2nodeComponentConfigRemoval_Item_t *removeCfg=NULL;
721 /* fetching the interface and component id information from the e2NodeCfg */
722 memset(storeCfg, 0, sizeof(E2NodeConfigItem));
723 storeCfg->isSuccessful=false;
724 memset(&tmpCfg, 0, sizeof(E2NodeConfigItem));
728 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
730 addCfg = (E2nodeComponentConfigAddition_Item_t *)e2NodeCfg;
731 interface = addCfg->e2nodeComponentInterfaceType;
732 componentId = addCfg->e2nodeComponentID;
735 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
737 updateCfg = (E2nodeComponentConfigUpdate_Item_t *)e2NodeCfg;
738 interface = updateCfg->e2nodeComponentInterfaceType;
739 componentId = updateCfg->e2nodeComponentID;
742 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
744 removeCfg = (E2nodeComponentConfigRemoval_Item_t*)e2NodeCfg;
745 interface = removeCfg->e2nodeComponentInterfaceType;
746 componentId = removeCfg->e2nodeComponentID;
751 /* Storing the information in temporary structure */
752 tmpCfg.componentInfo.interfaceType = interface;
754 switch(componentId.present)
756 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
758 if(componentId.choice.e2nodeComponentInterfaceTypeF1)
760 tmpCfg.componentInfo.componentId = componentId.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0];
770 /* Updating the database configuration */
771 configFound = updateE2NodeConfigList(&duDb, protocolId, &tmpCfg);
773 memcpy(storeCfg, &tmpCfg,sizeof(E2NodeConfigItem));
778 /*******************************************************************
780 * @brief deallocate memory allocated in E2 Node Config Update Failure
784 * Function : FreeE2ConfigUpdateFail
786 * Functionality: deallocate memory allocated in E2 Node Config Update Failure
788 * @params[in] E2AP_PDU_t *e2apMsg
791 * ****************************************************************/
793 void FreeE2ConfigUpdateFail(E2AP_PDU_t *e2apMsg)
796 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail=NULL;
800 if(e2apMsg->choice.unsuccessfulOutcome)
802 e2NodeCfgUpdFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
803 if(e2NodeCfgUpdFail->protocolIEs.list.array)
805 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
807 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateFailure_IEs_t));
809 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array, e2NodeCfgUpdFail->protocolIEs.list.size);
811 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
813 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
817 /*******************************************************************
819 * @brief Buld and send the E2 Node Config Update failure
823 * Function : BuildAndSendE2NodeConfigUpdateFailure
826 * - Buld and send the E2 Node Config Update failure
827 * @return ROK - success
830 * ****************************************************************/
832 uint8_t BuildAndSendE2NodeConfigUpdateFailure(uint32_t duId, uint8_t transId, uint8_t causeInfo, uint8_t causeReason)
834 E2AP_PDU_t *e2apMsg = NULL;
835 asn_enc_rval_t encRetVal;
837 uint8_t elementCnt=0;
838 bool memAllocFailed = false;
839 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdateFail=NULL;
841 DU_LOG("\nINFO --> E2AP : Building E2 Node Config Update failure\n");
844 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
847 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
850 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
851 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
852 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
854 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
858 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
859 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
860 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure;
861 e2NodeCfgUpdateFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
864 e2NodeCfgUpdateFail->protocolIEs.list.count = elementCnt;
865 e2NodeCfgUpdateFail->protocolIEs.list.size = elementCnt * sizeof(struct E2nodeConfigurationUpdateFailure_IEs *);
867 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array, e2NodeCfgUpdateFail->protocolIEs.list.size);
868 if(e2NodeCfgUpdateFail->protocolIEs.list.array == NULLP)
870 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure array failed");
874 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
876 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx], sizeof(struct E2nodeConfigurationUpdateFailure_IEs));
877 if(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx] == NULLP)
879 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure IEs failed");
880 memAllocFailed = true;
885 if(memAllocFailed == true)
892 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
893 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
894 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
895 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
898 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
899 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
900 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
901 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = causeInfo;
902 if(causeInfo == CauseE2_PR_e2Node)
903 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.e2Node = causeReason;
905 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.misc = causeReason;
908 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
909 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
910 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
911 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
913 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
914 memset(encBuf, 0, ENC_BUF_MAX_LEN);
916 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
918 /* Check encode results */
919 if(encRetVal.encoded == ENCODE_FAIL)
921 DU_LOG("\nERROR --> E2AP : Could not encode E2 Node Config Update failure structure (at %s)\n",\
922 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
927 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Node Config Update Failure\n");
928 for(int i=0; i< encBufSize; i++)
930 DU_LOG("%x",encBuf[i]);
934 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
936 DU_LOG("\nERROR --> E2AP : Sending E2 Node Config Update Failure failed");
942 FreeE2ConfigUpdateFail(e2apMsg);
946 /*******************************************************************
948 * @brief process the E2 node configuration update
952 * Function : ProcE2NodeConfigUpdate
954 * Functionality: Process E2 node configuration update
958 * Pointer to E2nodeConfigurationUpdate
961 ******************************************************************/
963 void ProcE2NodeConfigUpdate(uint32_t duId, E2nodeConfigurationUpdate_t *e2NodeConfigUpdate)
966 E2NodeConfigList tmpE2NodeList;
968 uint8_t ieIdx = 0, duIdx = 0, elementCnt=0, transId = 0;
969 E2nodeComponentConfigAddition_List_t *e2NodeAddList=NULL;
970 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItemIe=NULL;
971 E2nodeComponentConfigAddition_Item_t *e2NodeAddItem=NULL;
972 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList=NULLP;
973 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe=NULLP;
974 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULLP;
975 E2nodeComponentConfigRemoval_List_t *e2NodeRemoveList=NULL;
976 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItemIe=NULL;
977 E2nodeComponentConfigRemoval_Item_t *e2NodeRemovalItem=NULL;
979 SEARCH_DU_DB(duIdx, duId, duDb);
982 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
986 memset(&tmpE2NodeList, 0, sizeof(E2NodeConfigList));
987 if(!e2NodeConfigUpdate)
989 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate pointer is null");
992 if(!e2NodeConfigUpdate->protocolIEs.list.array)
994 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate array pointer is null");
998 elementCnt = e2NodeConfigUpdate->protocolIEs.list.count;
999 for(ieIdx=0; ieIdx < e2NodeConfigUpdate->protocolIEs.list.count; ieIdx++)
1001 if(!e2NodeConfigUpdate->protocolIEs.list.array[ieIdx])
1003 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate array idx %d pointer is null",arrIdx);
1007 switch(e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->id)
1009 case ProtocolIE_IDE2_id_TransactionID:
1011 transId = e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
1012 if(transId < 0 || transId > 255)
1014 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
1020 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
1022 e2NodeAddList =&e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigAddition_List;
1023 if(e2NodeAddList->list.array)
1025 for(arrIdx = 0; arrIdx< e2NodeAddList->list.count; arrIdx++)
1027 e2NodeAddItemIe = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[arrIdx];
1028 e2NodeAddItem = &e2NodeAddItemIe->value.choice.E2nodeComponentConfigAddition_Item;
1029 /* Storing the E2 node information in DB */
1030 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeAddItem, ProtocolIE_IDE2_id_E2nodeComponentConfigAddition,\
1031 &tmpE2NodeList.addedE2Node[tmpE2NodeList.addedE2NodeCount++]) != ROK)
1033 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
1040 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
1042 e2NodeUpdateList =&e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigUpdate_List;
1043 if(e2NodeUpdateList->list.array)
1045 for(arrIdx = 0; arrIdx< e2NodeUpdateList->list.count; arrIdx++)
1047 e2NodeUpdateItemIe = (E2nodeComponentConfigUpdate_ItemIEs_t*) e2NodeUpdateList->list.array[arrIdx];
1048 e2NodeUpdateItem = &e2NodeUpdateItemIe->value.choice.E2nodeComponentConfigUpdate_Item;
1050 /* Updating the E2 node information in DB */
1051 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeUpdateItem, ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate,\
1052 &tmpE2NodeList.updatedE2Node[tmpE2NodeList.updatedE2NodeCount++]) != ROK)
1054 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
1061 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
1063 e2NodeRemoveList = &e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigRemoval_List;
1064 if(e2NodeRemoveList->list.array)
1066 for(arrIdx = 0; arrIdx< e2NodeRemoveList->list.count; arrIdx++)
1068 e2NodeRemovalItemIe = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemoveList->list.array[arrIdx];
1069 e2NodeRemovalItem = &e2NodeRemovalItemIe->value.choice.E2nodeComponentConfigRemoval_Item;
1071 /* Removing the E2 node information in DB */
1072 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeRemovalItem, ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval,\
1073 &tmpE2NodeList.removedE2Node[tmpE2NodeList.removedE2NodeCount++]) != ROK)
1075 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
1088 /* If all of the IEs are processed successfully, we will send an e2 node
1089 * config update ack message.
1090 * else we will be sendinf e2 node config update failure */
1091 if(elementCnt == ieIdx)
1093 if(BuildAndSendE2NodeConfigUpdateAck(duDb, transId, &tmpE2NodeList) !=ROK)
1095 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 node config ack");
1101 if(BuildAndSendE2NodeConfigUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
1103 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 node config Failure");
1108 /*******************************************************************
1110 * @brief Builds Global RIC Id Params
1114 * Function : BuildGlobalRicId
1116 * Functionality: Building the Plmn and ric id
1118 * @params[in] GlobalRIC_ID_t *ricId
1119 * @return ROK - success
1122 * ****************************************************************/
1124 uint8_t BuildGlobalRicId(GlobalRIC_ID_t *ricId)
1127 uint8_t byteSize = 3;
1131 ricId->pLMN_Identity.size = byteSize * sizeof(uint8_t);
1132 RIC_ALLOC(ricId->pLMN_Identity.buf, ricId->pLMN_Identity.size);
1133 buildPlmnId(ricCb.ricCfgParams.plmn , ricId->pLMN_Identity.buf);
1135 ricId->ric_ID.size = byteSize * sizeof(uint8_t);
1136 RIC_ALLOC(ricId->ric_ID.buf, ricId->ric_ID.size);
1137 fillBitString(&ricId->ric_ID, unused, byteSize, ricVal);
1142 /*******************************************************************
1144 * @brief deallocate the memory allocated in E2SetupResponse
1148 * Function : FreeE2SetupRsp
1150 * Functionality: deallocate the memory allocated in E2SetupResponse
1152 * @params[in] E2AP_PDU_t *e2apMsg
1155 * ****************************************************************/
1156 void FreeE2SetupRsp(E2AP_PDU_t *e2apMsg)
1158 uint8_t arrIdx = 0, e2NodeConfigIdx=0, ranFuncIdx=0;
1159 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
1160 E2setupResponse_t *e2SetupRsp=NULL;
1161 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULL;
1162 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList=NULL;
1163 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULL;
1167 if(e2apMsg->choice.successfulOutcome)
1169 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
1170 if(e2SetupRsp->protocolIEs.list.array)
1172 for(arrIdx=0; arrIdx<e2SetupRsp->protocolIEs.list.count; arrIdx++)
1174 switch(e2SetupRsp->protocolIEs.list.array[arrIdx]->id)
1176 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
1178 ranFuncAcceptedList= &e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
1179 if(ranFuncAcceptedList->list.array)
1181 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
1183 if(ranFuncAcceptedList->list.array[ranFuncIdx])
1185 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
1188 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
1192 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
1194 e2NodeConfigAdditionAckList =&e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
1195 if(e2NodeConfigAdditionAckList->list.count)
1197 for(e2NodeConfigIdx=0; e2NodeConfigIdx<e2NodeConfigAdditionAckList->list.count; e2NodeConfigIdx++)
1199 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[e2NodeConfigIdx];
1200 if(e2NodeAddAckItemIe)
1202 f1InterfaceInfo = e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
1205 RIC_FREE(f1InterfaceInfo->gNB_DU_ID.buf, f1InterfaceInfo->gNB_DU_ID.size);
1206 RIC_FREE(f1InterfaceInfo, sizeof(E2nodeComponentInterfaceF1_t));
1208 RIC_FREE(e2NodeAddAckItemIe, sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
1211 RIC_FREE(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
1216 RIC_FREE(e2SetupRsp->protocolIEs.list.array[arrIdx], sizeof(E2setupResponseIEs_t));
1218 RIC_FREE(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
1220 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1222 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1226 /*******************************************************************
1228 * @brief fill e2 node configuration for ack msg
1232 * Function : fillE2NodeConfigAck
1235 * - fill e2 node configuration for ack msg
1238 * Pointer to e2NodeCfg to be filled
1240 * E2 Node Component information
1241 * Is successful or failure response
1242 * @return ROK - success
1245 * ****************************************************************/
1247 uint8_t fillE2NodeConfigAck(PTR e2NodeCfg, uint8_t procedureCode, E2NodeComponent *componentInfo, bool isSuccessful)
1249 E2nodeComponentID_t *e2nodeComponentID=NULLP;
1250 E2nodeComponentInterfaceType_t *e2nodeComponentInterfaceType=NULLP;
1251 E2nodeComponentConfigurationAck_t *e2nodeComponentConfigurationAck=NULLP;
1252 E2nodeComponentConfigRemovalAck_Item_t *removalAckItem=NULLP;
1253 E2nodeComponentConfigUpdateAck_Item_t *updateAckItem=NULLP;
1254 E2nodeComponentConfigAdditionAck_Item_t *additionAckItem=NULLP;
1256 /* filling the interface type, component id, configuration ack based on the
1257 * e2 node configuration add, update, delete type */
1258 switch(procedureCode)
1260 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
1262 additionAckItem = (E2nodeComponentConfigAdditionAck_Item_t *)e2NodeCfg;
1263 e2nodeComponentInterfaceType = &((E2nodeComponentConfigAdditionAck_Item_t *)e2NodeCfg)->e2nodeComponentInterfaceType;
1264 e2nodeComponentID = &additionAckItem->e2nodeComponentID;
1265 e2nodeComponentConfigurationAck = &additionAckItem->e2nodeComponentConfigurationAck;
1268 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
1270 updateAckItem = (E2nodeComponentConfigUpdateAck_Item_t*) e2NodeCfg;
1271 e2nodeComponentInterfaceType = &updateAckItem->e2nodeComponentInterfaceType;
1272 e2nodeComponentID = &updateAckItem->e2nodeComponentID;
1273 e2nodeComponentConfigurationAck = &updateAckItem->e2nodeComponentConfigurationAck;
1276 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
1278 removalAckItem= (E2nodeComponentConfigRemovalAck_Item_t*)e2NodeCfg;
1279 e2nodeComponentInterfaceType = &removalAckItem->e2nodeComponentInterfaceType;
1280 e2nodeComponentID = &removalAckItem->e2nodeComponentID;
1281 e2nodeComponentConfigurationAck = &removalAckItem->e2nodeComponentConfigurationAck;
1286 /* >E2 Node Component interface type */
1287 if(componentInfo->interfaceType>=NG && componentInfo->interfaceType<=X2)
1289 *e2nodeComponentInterfaceType = componentInfo->interfaceType;
1293 DU_LOG("\nERROR --> E2AP: Received an invalid interface value %d",componentInfo->interfaceType);
1297 if(*e2nodeComponentInterfaceType == E2nodeComponentInterfaceType_f1)
1299 /* >E2 Node Component ID */
1300 e2nodeComponentID->present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1;
1301 RIC_ALLOC(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1, sizeof(E2nodeComponentInterfaceF1_t));
1302 if(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1 == NULLP)
1304 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1307 e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t);
1308 RIC_ALLOC(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
1310 if(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP)
1312 DU_LOG("\nERROR -->list. E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1315 e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0] = componentInfo->componentId;
1320 /* >E2 Node Component Configuration Acknowledge*/
1321 e2nodeComponentConfigurationAck->updateOutcome = E2nodeComponentConfigurationAck__updateOutcome_success;
1325 /* >E2 Node Component Configuration Acknowledge*/
1326 e2nodeComponentConfigurationAck->updateOutcome = E2nodeComponentConfigurationAck__updateOutcome_failure;
1327 RIC_ALLOC(e2nodeComponentConfigurationAck->failureCauseE2, sizeof(struct CauseE2));
1328 if(e2nodeComponentConfigurationAck->failureCauseE2)
1330 fillE2FailureCause(e2nodeComponentConfigurationAck->failureCauseE2, CauseE2_PR_e2Node, CauseE2node_e2node_component_unknown);
1334 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1341 /*******************************************************************
1343 * @brief Build E2node Component config addition ack list
1347 * Function : BuildE2nodeComponentConfigAdditionAck
1349 * Functionality: Build E2node Component config addition ack list
1352 * E2nodeComponentConfigAdditionAck_List to be filled
1353 * Count of e2 node to be added
1354 * list of e2 node cfg to be added
1356 * @return ROK - success
1358 * ****************************************************************/
1360 uint8_t BuildE2nodeComponentConfigAdditionAck(E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList, \
1361 uint16_t addedE2NodeCount, E2NodeConfigItem *addedE2Node)
1363 E2NodeComponent *e2NodeComponentInfo=NULLP;
1364 CmLList *node=NULLP;
1365 uint16_t arrIdx = 0;
1366 E2nodeComponentConfigAdditionAck_Item_t *e2NodeAddAckItem=NULLP;
1367 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULLP;
1369 e2NodeConfigAdditionAckList->list.count = addedE2NodeCount;
1371 e2NodeConfigAdditionAckList->list.size = e2NodeConfigAdditionAckList->list.count * sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t*);
1372 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
1373 if(e2NodeConfigAdditionAckList->list.array == NULLP)
1375 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
1379 for(arrIdx = 0; arrIdx< e2NodeConfigAdditionAckList->list.count; arrIdx++)
1381 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
1382 if(e2NodeConfigAdditionAckList->list.array[arrIdx] == NULLP)
1384 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
1387 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[arrIdx];
1388 e2NodeAddAckItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck_Item;
1389 e2NodeAddAckItemIe->criticality = CriticalityE2_reject;
1390 e2NodeAddAckItemIe->value.present = E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_E2nodeComponentConfigAdditionAck_Item;
1391 e2NodeAddAckItem = &e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item;
1393 /* Filling the e2 node config addition ack item */
1394 fillE2NodeConfigAck((PTR)&e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item, ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck,\
1395 &addedE2Node[arrIdx].componentInfo, addedE2Node[arrIdx].isSuccessful);
1400 /*******************************************************************
1402 * @brief Build RAN function accepted list
1406 * Function : BuildRanFunctionAcceptedList
1408 * Functionality: Build RAN function accepted list
1409 * ->For ProcedureCodeE2_id_E2setup or ProcedureCodeE2_id_RICserviceQuery
1410 * we add all the RAN Function list which is present in RIC database.
1411 * ->For any other procedures, we just fill the RAN functions whose ID
1412 * is present in the recvList
1416 * Count of ran functions to be accepted in the list
1417 * Received list of RAN functions
1421 * @return ROK - success
1423 * ****************************************************************/
1425 uint8_t BuildRanFunctionAcceptedList(DuDb *duDb, uint8_t count, RanFunction *ranFunAcceptedList, RANfunctionsID_List_t *ranFuncAcceptedList, uint8_t procedureCode)
1427 uint16_t ranFuncIdx = 0;
1428 RANfunctionID_ItemIEs_t *ranFuncAcceptedItemIe=NULL;
1430 /* For ProcedureCodeE2_id_E2setup and ProcedureCodeE2_id_RICserviceQuery,
1431 * the number of RAN function list items is equal to the number of
1432 * ran function entries stored in the database.
1433 * For any other procedure, the RAN function list count is equal
1434 * to the count of ran functions obtained from the function's caller */
1436 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
1437 ranFuncAcceptedList->list.count = duDb->numOfRanFunction;
1439 ranFuncAcceptedList->list.count = count;
1441 ranFuncAcceptedList->list.size = ranFuncAcceptedList->list.count*sizeof(RANfunctionID_ItemIEs_t*);
1442 RIC_ALLOC(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
1443 if(ranFuncAcceptedList->list.array)
1445 for(ranFuncIdx = 0; ranFuncIdx< ranFuncAcceptedList->list.count; ranFuncIdx++)
1447 RIC_ALLOC(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
1448 if(ranFuncAcceptedList->list.array[ranFuncIdx] == NULLP)
1450 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array item");
1453 ranFuncAcceptedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAcceptedList->list.array[ranFuncIdx];
1454 ranFuncAcceptedItemIe->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
1455 ranFuncAcceptedItemIe->criticality= CriticalityE2_ignore;
1456 ranFuncAcceptedItemIe->value.present = RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item;
1457 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
1459 /* filling the RAN function information with the help of DuDb */
1460 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = duDb->ranFunction[ranFuncIdx].id;
1461 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= duDb->ranFunction[ranFuncIdx].revisionCounter;
1465 /* filling the the RAN function information with the help received list of RAN functions */
1466 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = ranFunAcceptedList[ranFuncIdx].id;
1467 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= ranFunAcceptedList[ranFuncIdx].revisionCounter;
1473 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array");
1479 /*******************************************************************
1481 * @brief Builds and sends the E2SetupResponse
1485 * Function : BuildAndSendE2SetupRsp
1487 * Functionality: Builds and sends the E2SetupResponse
1492 * List of E2node cofniguration which needs to be send
1494 * @return ROK - success
1497 * ****************************************************************/
1499 uint8_t BuildAndSendE2SetupRsp(DuDb *duDb, uint8_t transId, E2NodeConfigList e2NodeList)
1501 E2AP_PDU_t *e2apMsg = NULL;
1502 E2setupResponse_t *e2SetupRsp;
1503 asn_enc_rval_t encRetVal;
1506 bool memAllocFailed = false;
1508 DU_LOG("\nINFO --> E2AP : Building E2 Setup Response\n");
1511 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1512 if(e2apMsg == NULLP)
1514 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1517 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
1518 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1519 if(e2apMsg->choice.successfulOutcome == NULLP)
1521 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1525 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
1526 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
1527 e2apMsg->choice.successfulOutcome->value.present = \
1528 SuccessfulOutcomeE2__value_PR_E2setupResponse;
1529 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
1532 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
1533 if(duDb->numOfRanFunction)
1536 e2SetupRsp->protocolIEs.list.count = elementCnt;
1537 e2SetupRsp->protocolIEs.list.size = elementCnt * sizeof(E2setupResponseIEs_t*);
1539 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
1540 if(e2SetupRsp->protocolIEs.list.array == NULLP)
1542 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1546 for(idx=0; idx<elementCnt; idx++)
1548 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array[idx], sizeof(E2setupResponseIEs_t));
1549 if(e2SetupRsp->protocolIEs.list.array[idx] == NULLP)
1551 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1552 memAllocFailed = true;
1557 if(memAllocFailed == true)
1559 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1564 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_TransactionID;
1565 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1566 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_TransactionID;
1567 e2SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID = transId;
1571 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalRIC_ID;
1572 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1573 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_GlobalRIC_ID;
1575 if(BuildGlobalRicId(&(e2SetupRsp->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID))!=ROK)
1577 DU_LOG("\nERROR --> E2AP : Failed to build Global Ric Id");
1581 if(duDb->numOfRanFunction)
1583 /* Accepted RAN function Id */
1585 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
1586 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1587 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_RANfunctionsID_List;
1588 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &e2SetupRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_E2setup)!=ROK)
1590 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
1595 /* E2 Node Component Configuration Addition Acknowledge List*/
1597 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck;
1598 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1599 e2SetupRsp->protocolIEs.list.array[idx]->value.present = \
1600 E2setupResponseIEs__value_PR_E2nodeComponentConfigAdditionAck_List;
1601 if(BuildE2nodeComponentConfigAdditionAck(&e2SetupRsp->protocolIEs.list.array[idx]->\
1602 value.choice.E2nodeComponentConfigAdditionAck_List, e2NodeList.addedE2NodeCount, e2NodeList.addedE2Node) != ROK)
1604 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list");
1608 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1609 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1611 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
1613 /* Check encode results */
1614 if(encRetVal.encoded == ENCODE_FAIL)
1616 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupResponse structure (at %s)\n",\
1617 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1622 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupResponse\n");
1623 for(int i=0; i< encBufSize; i++)
1625 DU_LOG("%x",encBuf[i]);
1629 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
1631 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Response failed");
1637 FreeE2SetupRsp(e2apMsg);
1638 BuildAndSendRicSubscriptionReq(duDb);
1642 /*******************************************************************
1644 * @brief Free RIC Subscription Details
1648 * Function : FreeRicSubsDetails
1650 * Functionality: Free the RIC Subscription Details
1652 * @params[in] RICsubscriptionDetails_t *subsDetails
1655 * ****************************************************************/
1656 void FreeRicSubsDetails(RICsubscriptionDetails_t *subsDetails)
1658 uint8_t elementIdx = 0;
1659 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
1661 RIC_FREE(subsDetails->ricEventTriggerDefinition.buf, subsDetails->ricEventTriggerDefinition.size);
1663 if(subsDetails->ricAction_ToBeSetup_List.list.array)
1665 for(elementIdx = 0; elementIdx < subsDetails->ricAction_ToBeSetup_List.list.count; elementIdx++)
1667 if(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
1669 actionItem = (RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx];
1670 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1672 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf, \
1673 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size);
1674 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1676 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t))
1679 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
1683 /*******************************************************************
1685 * @brief Free RIC Subscription Request
1689 * Function : FreeRicSubscriptionReq
1691 * Functionality : Free RIC Subscription Request
1693 * @return ROK - success
1696 ******************************************************************/
1697 void FreeRicSubscriptionReq(E2AP_PDU_t *e2apRicMsg)
1700 RICsubscriptionRequest_t *ricSubscriptionReq;
1704 if(e2apRicMsg->choice.initiatingMessage)
1706 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
1707 if(ricSubscriptionReq->protocolIEs.list.array)
1709 for(idx=0; idx < ricSubscriptionReq->protocolIEs.list.count; idx++)
1711 switch(ricSubscriptionReq->protocolIEs.list.array[idx]->id)
1713 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
1715 FreeRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails));
1719 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
1721 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
1723 RIC_FREE(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1725 RIC_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
1729 /*******************************************************************
1731 * @brief Builds Ric Request Id
1735 * Function : BuildNewRicRequestId
1737 * Functionality: Assign new Ric Request ID
1739 * @params[in] RIC request ID to be sent
1740 * RIC request ID stored in DB
1741 * @return ROK - success
1744 * ****************************************************************/
1746 uint8_t BuildNewRicRequestId(RICrequestID_t *ricReqId, RicRequestId *reqIdDb)
1748 static uint16_t requestorId = 0;
1749 static uint16_t instanceId = 0;
1751 if(ricReqId != NULLP)
1753 ricReqId->ricRequestorID = ++requestorId;
1754 ricReqId->ricInstanceID = ++instanceId;
1756 reqIdDb->requestorId = ricReqId->ricRequestorID;
1757 reqIdDb->instanceId = ricReqId->ricInstanceID;
1762 /*******************************************************************
1764 * @brief Free RIC Action Definition
1768 * Function : FreeRicActionDefinition
1770 * Functionality: Free RIC Action Definition
1772 * @params[in] E2SM-KPM Action definition
1775 * ****************************************************************/
1776 void FreeRicActionDefinition(E2SM_KPM_ActionDefinition_t actionDef)
1778 uint8_t elementIdx = 0;
1779 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1780 MeasurementInfoItem_t *measItem = NULLP;
1782 switch(actionDef.actionDefinition_formats.present)
1784 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
1786 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1)
1788 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1789 if(actionFormat1->measInfoList.list.array)
1791 for(elementIdx = 0; elementIdx < actionFormat1->measInfoList.list.count; elementIdx++)
1793 if(actionFormat1->measInfoList.list.array[elementIdx])
1795 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1796 switch(measItem->measType.present)
1798 case MeasurementType_PR_NOTHING:
1799 case MeasurementType_PR_measID:
1801 case MeasurementType_PR_measName:
1803 RIC_FREE(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size)
1807 RIC_FREE(measItem, sizeof(MeasurementInfoItem_t));
1810 RIC_FREE(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1812 RIC_FREE(actionFormat1, sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1817 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2:
1818 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3:
1819 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format4:
1820 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format5:
1821 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_NOTHING:
1826 /*******************************************************************
1828 * @brief Fill RIC Action Definition
1832 * Function : fillRicActionDef
1834 * Functionality: Fill RIC Action Definition
1836 * @params[in] RIC Action definition
1840 * ****************************************************************/
1841 uint8_t fillRicActionDef(RICactionDefinition_t *ricActionDef, uint8_t ricActionId, ConfigType configType)
1843 uint8_t ret = RFAILED;
1844 asn_enc_rval_t encRetVal;
1845 uint8_t elementCnt = 0, elementIdx = 0;
1846 char *measurementTypeName[] = {"RRU.PrbTotDl", "RRU.PrbTotUl"};
1847 E2SM_KPM_ActionDefinition_t actionDef;
1848 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1849 MeasurementInfoItem_t *measItem = NULLP;
1853 /* Fill E2SM-KPM Action Definition Format 1 */
1855 /* RIC Stype Type */
1856 actionDef.ric_Style_Type = RIC_STYLE_TYPE;
1858 /* RIC Action Definition Format 1 */
1859 actionDef.actionDefinition_formats.present = \
1860 E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1;
1862 RIC_ALLOC(actionDef.actionDefinition_formats.choice.actionDefinition_Format1, \
1863 sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1864 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1 == NULLP)
1866 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1869 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1871 /* Measurement Info List */
1873 actionFormat1->measInfoList.list.count = elementCnt;
1874 actionFormat1->measInfoList.list.size = elementCnt * sizeof(MeasurementInfoItem_t *);
1875 RIC_ALLOC(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1876 if(actionFormat1->measInfoList.list.array == NULL)
1878 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1882 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1884 RIC_ALLOC(actionFormat1->measInfoList.list.array[elementIdx], sizeof(MeasurementInfoItem_t));
1885 if(actionFormat1->measInfoList.list.array[elementIdx] == NULLP)
1887 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1891 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1892 measItem->measType.present = MeasurementType_PR_measName;
1894 measItem->measType.choice.measName.size = strlen(measurementTypeName[elementIdx]);
1895 RIC_ALLOC(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size);
1896 if(measItem->measType.choice.measName.buf == NULLP)
1898 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1901 memcpy(measItem->measType.choice.measName.buf, measurementTypeName[elementIdx], measItem->measType.choice.measName.size);
1903 if(elementIdx < elementCnt)
1906 /* Granularity Period */
1907 actionFormat1->granulPeriod = RIC_ACTION_GRANULARITY_PERIOD(configType, ricActionId); /* In ms */
1909 /* Prints the Msg formed */
1910 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, &actionDef);
1912 /* Encode E2SM-KPM RIC Action Definition */
1913 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1915 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_ActionDefinition, 0, &actionDef, PrepFinalEncBuf, encBuf);
1916 if(encRetVal.encoded == ENCODE_FAIL)
1918 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM action definition structure (at %s)\n",\
1919 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1923 /* Copty encoded E2SM-KPM RIC action definition to E2AP octet string buffer */
1924 ricActionDef->size = encBufSize;
1925 RIC_ALLOC(ricActionDef->buf, encBufSize);
1926 if(ricActionDef->buf == NULLP)
1928 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1931 memcpy(ricActionDef->buf, encBuf, encBufSize);
1937 FreeRicActionDefinition(actionDef);
1941 /*******************************************************************
1943 * @brief Fills RIC Action To Be Setup Item
1947 * Function : fillActionToBeSetup
1949 * Functionality: Fill the RIC Action To Be Setup Ite,
1950 * RIC subscription DB
1952 * @params[in] RICaction_ToBeSetup_ItemIEs_t *items
1953 * @return ROK - success
1956 * ****************************************************************/
1957 uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscription *ricSubsDb)
1959 static uint8_t ricActionId = 0;
1960 CmLList *actionNode=NULLP;
1961 if(actionItem == NULLP)
1963 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1969 actionItem->id = ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item;
1970 actionItem->criticality = CriticalityE2_ignore;
1971 actionItem->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
1974 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ricActionId;
1975 actionNode = addRicSubsAction(ricActionId, &ricSubsDb->actionSequence);
1978 /* RIC Action Type */
1979 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
1981 /* RIC Action Definition */
1982 RIC_ALLOC(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1983 if(!actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1985 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1988 if(fillRicActionDef(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, ricActionId, CONFIG_ADD) != ROK)
1990 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1999 cmLListDelFrm(&ricSubsDb->actionSequence, actionNode);
2000 deleteActionSequence(actionNode);
2005 /*******************************************************************
2007 * @brief Free Event Trigger Definition
2011 * Function : FreeEventTriggerDef
2013 * Functionality: Free Event Trigger Definition
2015 * @params[in] E2SM-KPM Event Trigger Definition
2018 * ****************************************************************/
2019 void FreeEventTriggerDef(E2SM_KPM_EventTriggerDefinition_t *eventTiggerDef)
2023 switch(eventTiggerDef->eventDefinition_formats.present)
2025 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING:
2027 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1:
2028 RIC_FREE(eventTiggerDef->eventDefinition_formats.choice.eventDefinition_Format1, \
2029 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
2035 /*******************************************************************
2037 * @brief Fill Event Trigger Definition
2041 * Function : fillEventTriggerDef
2043 * Functionality: Fill Event Trigger Definition
2045 * @params[in] RIC Event Trigger Definition
2049 * ****************************************************************/
2050 uint8_t fillEventTriggerDef(RICeventTriggerDefinition_t *ricEventTriggerDef)
2052 uint8_t ret = RFAILED;
2053 asn_enc_rval_t encRetVal;
2054 E2SM_KPM_EventTriggerDefinition_t eventTiggerDef;
2058 /* Fill E2SM-KPM Event Trigger Definition Format 1 */
2059 eventTiggerDef.eventDefinition_formats.present = \
2060 E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1;
2062 RIC_ALLOC(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1, \
2063 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
2064 if(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1 == NULLP)
2066 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2070 eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1->reportingPeriod = 1000; /* In ms */
2072 /* Prints the Msg formed */
2073 xer_fprint(stdout, &asn_DEF_E2SM_KPM_EventTriggerDefinition, &eventTiggerDef);
2075 /* Encode E2SM-KPM Event Trigger Definition */
2076 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2078 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_EventTriggerDefinition, 0, &eventTiggerDef, PrepFinalEncBuf, encBuf);
2079 if(encRetVal.encoded == ENCODE_FAIL)
2081 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM event trigger definition structure (at %s)\n",\
2082 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2086 /* Copy encoded E2SM-KPM event trigger definition to E2AP octet string buffer */
2087 ricEventTriggerDef->size = encBufSize;
2088 RIC_ALLOC(ricEventTriggerDef->buf, encBufSize);
2089 if(ricEventTriggerDef->buf == NULLP)
2091 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2094 memcpy(ricEventTriggerDef->buf, encBuf, encBufSize);
2100 FreeEventTriggerDef(&eventTiggerDef);
2104 /*******************************************************************
2106 * @brief builds RIC Subscription Details
2110 * Function : BuildsRicSubsDetails
2112 * Functionality: Builds the RIC Subscription Details
2114 * @params[in] RIC Subscription details to be filled
2115 * RIC subscriotion DB
2116 * @return ROK - success
2119 * ****************************************************************/
2121 uint8_t BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails, RicSubscription *ricSubsInfo)
2123 uint8_t elementCnt = 0;
2124 uint8_t elementIdx = 0;
2126 if(subsDetails == NULLP)
2128 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
2134 /* RIC Event Trigger Definition */
2135 if(fillEventTriggerDef(&subsDetails->ricEventTriggerDefinition) != ROK)
2137 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
2141 /* RIC Actions To Be Setup List */
2143 subsDetails->ricAction_ToBeSetup_List.list.count = elementCnt;
2144 subsDetails->ricAction_ToBeSetup_List.list.size = elementCnt * sizeof(RICaction_ToBeSetup_ItemIEs_t *);
2145 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
2146 if(subsDetails->ricAction_ToBeSetup_List.list.array == NULLP)
2148 DU_LOG("\nERROR --> E2AP : Memory allocation for RICactionToBeSetup Items failed");
2152 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
2154 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t));
2155 if(!subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
2157 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2161 if(elementIdx < elementCnt)
2166 if(fillActionToBeSetup((RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], \
2167 ricSubsInfo) != ROK)
2169 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
2178 /*******************************************************************
2180 * @brief Builds and Send the RicSubscriptionReq
2184 * Function : BuildAndSendRicSubscriptionReq
2186 * Functionality:Fills the RicSubscriptionReq
2188 * @return ROK - success
2191 ******************************************************************/
2192 uint8_t BuildAndSendRicSubscriptionReq(DuDb *duDb)
2194 uint8_t ret = RFAILED;
2195 uint8_t elementCnt = 0;
2197 uint8_t actionIdx = 0;
2198 asn_enc_rval_t encRetVal; /* Encoder return value */
2199 E2AP_PDU_t *e2apRicMsg = NULL;
2200 RICsubscriptionRequest_t *ricSubscriptionReq;
2201 RanFunction *ranFuncDb = &duDb->ranFunction[0];
2202 CmLList *ricSubsNode = NULLP;
2203 RicSubscription *ricSubsInfo = NULLP;
2205 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n");
2207 /* Allocate memory to store RIC subscription info in RIC DB */
2208 RIC_ALLOC(ricSubsInfo, sizeof(RicSubscription));
2211 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2217 RIC_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
2218 if(e2apRicMsg == NULLP)
2220 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2224 e2apRicMsg->present = E2AP_PDU_PR_initiatingMessage;
2225 RIC_ALLOC(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
2226 if(e2apRicMsg->choice.initiatingMessage == NULLP)
2228 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2231 e2apRicMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscription;
2232 e2apRicMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
2233 e2apRicMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionRequest;
2235 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
2238 ricSubscriptionReq->protocolIEs.list.count = elementCnt;
2239 ricSubscriptionReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionRequest_IEs_t);
2241 /* Initialize the subscription members */
2242 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
2243 if(ricSubscriptionReq->protocolIEs.list.array == NULLP)
2245 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2249 for(idx=0; idx<elementCnt; idx++)
2251 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
2252 if(ricSubscriptionReq->protocolIEs.list.array[idx] == NULLP)
2254 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2258 if(idx < elementCnt)
2261 /* Filling RIC Request Id */
2263 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
2264 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2265 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2266 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
2267 if(BuildNewRicRequestId(&ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICrequestID, \
2268 &ricSubsInfo->requestId) != ROK)
2270 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
2275 /* Filling RAN Function Id */
2277 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
2278 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2279 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2280 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
2281 ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ranFuncDb->id;
2282 ricSubsInfo->ranFuncId = ranFuncDb->id;
2284 /* Filling RIC Subscription Details */
2286 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICsubscriptionDetails;
2287 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2288 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2289 RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
2290 if(BuildRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails),\
2291 ricSubsInfo) != ROK)
2293 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
2297 /* Prints the Msg formed */
2298 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
2300 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2302 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
2303 if(encRetVal.encoded == ENCODE_FAIL)
2305 DU_LOG("\nERROR --> E2AP : Could not encode RicSubscriptionRequest structure (at %s)\n",\
2306 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2311 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicSubscriptionRequest\n");
2312 for(int i=0; i< encBufSize; i++)
2314 DU_LOG("%x",encBuf[i]);
2319 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2321 DU_LOG("\nERROR --> E2AP : Sending RIC subscription Request failed");
2325 /* Add RIC Subscription Info to RAN Function's RIC Subscription List */
2326 RIC_ALLOC(ricSubsNode , sizeof(CmLList));
2329 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2332 ricSubsNode->node = (PTR)ricSubsInfo;
2333 cmLListAdd2Tail(&ranFuncDb->subscriptionList, ricSubsNode);
2341 RIC_FREE(ricSubsInfo, sizeof(RicSubscription));
2342 RIC_FREE(ricSubsNode , sizeof(CmLList));
2345 FreeRicSubscriptionReq(e2apRicMsg);
2349 /*******************************************************************
2351 * @brief Process RicSubscriptionResponse
2355 * Function : ProcRicSubscriptionRsp
2357 * Functionality: Processes RicSubscriptionRsp
2359 * @return ROK - void
2361 ******************************************************************/
2363 void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricSubscriptionRsp)
2365 uint8_t duIdx = 0, ieIdx = 0, notAdmitIdx = 0;
2366 uint8_t ranFuncId = 0, actionId = 0;
2368 bool ricReqIdDecoded = false;
2369 RicRequestId ricReqId;
2370 RanFunction *ranFuncDb = NULLP;
2371 RicSubscription *ricSubs = NULLP;
2372 CmLList *ricSubsNode = NULLP;
2373 CmLList *actionNode = NULLP;
2374 ActionInfo *action = NULLP;
2375 RICsubscriptionResponse_IEs_t *ricSubsRspIe = NULLP;
2376 RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
2378 DU_LOG("\nINFO --> E2AP : RIC Subscription Response received");
2381 SEARCH_DU_DB(duIdx, duId, duDb);
2384 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
2388 memset(&ricReqId, 0, sizeof(RicRequestId));
2389 if(ricSubscriptionRsp)
2391 if(ricSubscriptionRsp->protocolIEs.list.array)
2393 for(ieIdx=0; ieIdx<ricSubscriptionRsp->protocolIEs.list.count; ieIdx++)
2395 if(ricSubscriptionRsp->protocolIEs.list.array[ieIdx])
2397 ricSubsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
2398 switch(ricSubscriptionRsp->protocolIEs.list.array[ieIdx]->id)
2400 case ProtocolIE_IDE2_id_RICrequestID:
2402 ricReqId.requestorId = ricSubsRspIe->value.choice.RICrequestID.ricRequestorID;
2403 ricReqId.instanceId = ricSubsRspIe->value.choice.RICrequestID.ricInstanceID;
2404 ricReqIdDecoded = true;
2407 case ProtocolIE_IDE2_id_RANfunctionID:
2409 ranFuncId = ricSubsRspIe->value.choice.RANfunctionID;
2410 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
2413 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionResponse: RAN Function ID [%d] not found", ranFuncId);
2418 case ProtocolIE_IDE2_id_RICactions_Admitted:
2422 case ProtocolIE_IDE2_id_RICactions_NotAdmitted:
2424 if(!(ranFuncDb && ricReqIdDecoded))
2427 notAdmitList = &ricSubsRspIe->value.choice.RICaction_NotAdmitted_List;
2428 for(notAdmitIdx = 0; notAdmitIdx < notAdmitList->list.count; notAdmitIdx++)
2431 actionId = ((RICaction_NotAdmitted_ItemIEs_t *)(notAdmitList->list.array[notAdmitIdx]))->\
2432 value.choice.RICaction_NotAdmitted_Item.ricActionID;
2434 /* Remove action from RAN Function's subscription list */
2435 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
2438 action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode);
2441 cmLListDelFrm(&ricSubs->actionSequence, actionNode);
2442 deleteActionSequence(actionNode);
2455 /*******************************************************************
2457 * @brief deallocate the memory allocated in E2SetupFailure
2461 * Function : FreeE2SetupFailure
2463 * Functionality: deallocate the memory allocated in E2SetupFailure
2465 * @params[in] E2AP_PDU_t *e2apMsg
2468 * ****************************************************************/
2469 void FreeE2SetupFailure(E2AP_PDU_t *e2apMsg)
2472 E2setupFailure_t *e2SetupFail;
2476 if(e2apMsg->choice.unsuccessfulOutcome)
2478 e2SetupFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
2479 if(e2SetupFail->protocolIEs.list.array)
2481 for(arrIdx=0; arrIdx<e2SetupFail->protocolIEs.list.count; arrIdx++)
2483 RIC_FREE(e2SetupFail->protocolIEs.list.array[arrIdx], sizeof(E2setupFailureIEs_t));
2485 RIC_FREE(e2SetupFail->protocolIEs.list.array, e2SetupFail->protocolIEs.list.size);
2487 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
2489 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2493 /*******************************************************************
2495 * @brief Buld and send the E2 Setup failure
2499 * Function : BuildAndSendE2SetupFailure
2502 * - Buld and send the E2 Setup failure
2503 * @return ROK - success
2506 * ****************************************************************/
2508 uint8_t BuildAndSendE2SetupFailure(uint32_t duId, uint8_t transId)
2510 uint8_t ret = RFAILED;
2511 E2AP_PDU_t *e2apMsg = NULL;
2512 E2setupFailure_t *e2SetupFailure;
2513 asn_enc_rval_t encRetVal;
2516 bool memAllocFailed = false;
2518 DU_LOG("\nINFO --> E2AP : Building E2 Setup failure\n");
2521 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2522 if(e2apMsg == NULLP)
2524 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2527 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
2528 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
2529 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
2531 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2535 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
2536 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
2537 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2setupFailure;
2538 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
2541 e2SetupFailure->protocolIEs.list.count = elementCnt;
2542 e2SetupFailure->protocolIEs.list.size = elementCnt * sizeof(struct E2setupFailureIEs *);
2544 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array, e2SetupFailure->protocolIEs.list.size);
2545 if(e2SetupFailure->protocolIEs.list.array == NULLP)
2547 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2551 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2553 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array[arrIdx], sizeof(struct E2setupFailureIEs));
2554 if(e2SetupFailure->protocolIEs.list.array[arrIdx] == NULLP)
2556 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2557 memAllocFailed = true;
2562 if(memAllocFailed == true)
2564 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2570 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2571 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2572 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
2573 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2576 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
2577 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2578 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
2579 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = CauseE2_PR_protocol;
2580 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.protocol = CauseE2Protocol_unspecified;
2583 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
2584 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
2585 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
2586 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
2588 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2589 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2591 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2593 /* Check encode results */
2594 if(encRetVal.encoded == ENCODE_FAIL)
2596 DU_LOG("\nERROR --> E2AP : Could not encode E2 Setup failure structure (at %s)\n",\
2597 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2602 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Setup Failure\n");
2603 for(int i=0; i< encBufSize; i++)
2605 DU_LOG("%x",encBuf[i]);
2609 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2611 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Failure failed");
2619 FreeE2SetupFailure(e2apMsg);
2623 /*******************************************************************
2625 * @brief process the e2setup request
2629 * Function : ProcE2SetupReq
2631 * Functionality: process the e2setup request
2635 ******************************************************************/
2637 void ProcE2SetupReq(uint32_t *duId, E2setupRequest_t *e2SetupReq)
2639 uint8_t arrIdx = 0, duIdx = 0, transId =0;
2640 uint16_t ranFuncIdx=0, e2NodeAddListIdx =0;
2641 E2NodeConfigList tmpE2NodeList;
2643 bool ieProcessingFailed = false;
2644 E2nodeComponentConfigAddition_List_t *e2NodeAddList=NULLP;
2645 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem=NULLP;
2646 RANfunction_ItemIEs_t *ranFuncItemIe=NULLP;
2647 RANfunction_Item_t *ranFunItem=NULLP;
2648 RANfunctions_List_t *ranFunctionsList=NULLP;
2650 memset(&tmpE2NodeList, 0, sizeof(E2NodeConfigList));
2653 DU_LOG("\nERROR --> E2AP : e2SetupReq pointer is null");
2656 if(!e2SetupReq->protocolIEs.list.array)
2658 DU_LOG("\nERROR --> E2AP : e2SetupReq array pointer is null");
2662 for(arrIdx=0; arrIdx<e2SetupReq->protocolIEs.list.count; arrIdx++)
2664 if(e2SetupReq->protocolIEs.list.array[arrIdx])
2666 switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id)
2668 case ProtocolIE_IDE2_id_TransactionID:
2670 transId = e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
2673 case ProtocolIE_IDE2_id_GlobalE2node_ID:
2675 if(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID)
2677 *duId =e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID->buf[0];
2679 SEARCH_DU_DB(duIdx, *duId, duDb);
2682 duDb = &ricCb.duInfo[ricCb.numDu];
2685 memset(duDb, 0, sizeof(DuDb));
2690 case ProtocolIE_IDE2_id_RANfunctionsAdded:
2692 ranFunctionsList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
2694 if(ranFunctionsList->list.array)
2696 for(ranFuncIdx=0;ranFuncIdx<ranFunctionsList->list.count; ranFuncIdx++)
2698 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
2699 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
2700 duDb->ranFunction[ranFunItem->ranFunctionID-1].id = ranFunItem->ranFunctionID;
2701 duDb->ranFunction[ranFunItem->ranFunctionID-1].revisionCounter = ranFunItem->ranFunctionRevision;
2702 cmLListInit(&duDb->ranFunction[ranFunItem->ranFunctionID-1].subscriptionList);
2703 duDb->numOfRanFunction++;
2708 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
2710 e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
2711 if(e2NodeAddList->list.array)
2713 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
2715 if(e2NodeAddList->list.array[e2NodeAddListIdx])
2717 /* Storing the E2 node information in DB */
2718 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *)e2NodeAddList->list.array[e2NodeAddListIdx];
2719 if(handleE2NodeComponentAction(duDb, (PTR)&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item,\
2720 ProtocolIE_IDE2_id_E2nodeComponentConfigAddition, &tmpE2NodeList.addedE2Node[tmpE2NodeList.addedE2NodeCount++]) != ROK)
2722 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",e2NodeAddListIdx);
2736 if(BuildAndSendE2SetupRsp(duDb, transId, tmpE2NodeList) !=ROK)
2738 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 setup response");
2741 /*******************************************************************
2743 * @brief Deallocate the memory allocated for E2 Reset Response
2747 * Function : FreeE2ResetResponse
2750 * - freeing the memory allocated for E2ResetResponse
2752 * @params[in] E2AP_PDU_t *e2apMsg
2753 * @return ROK - success
2756 * ****************************************************************/
2757 void FreeE2ResetResponse(E2AP_PDU_t *e2apMsg)
2760 ResetResponseE2_t *resetResponse =NULLP;
2762 if(e2apMsg != NULLP)
2764 if(e2apMsg->choice.successfulOutcome != NULLP)
2766 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2767 if(resetResponse->protocolIEs.list.array)
2769 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
2771 if(resetResponse->protocolIEs.list.array[ieIdx])
2773 RIC_FREE(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2776 RIC_FREE(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2778 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2780 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2784 /*******************************************************************
2786 * @brief Buld and send the Reset Response msg
2790 * Function : BuildAndSendResetResponse
2793 * - Buld and send the Reset Response Message
2798 * @return ROK - success
2801 * ****************************************************************/
2802 uint8_t BuildAndSendResetResponse(uint32_t duId, uint8_t transId)
2804 uint8_t ieIdx = 0, elementCnt = 0;
2805 uint8_t ret = RFAILED;
2806 E2AP_PDU_t *e2apMsg = NULLP;
2807 ResetResponseE2_t *resetResponse=NULL;
2808 asn_enc_rval_t encRetVal; /* Encoder return value */
2810 DU_LOG("\nINFO --> E2AP : Building E2 Reset Response Message\n");
2813 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2814 if(e2apMsg == NULLP)
2816 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse(): Memory allocation for E2AP-PDU failed");
2819 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
2821 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2822 if(e2apMsg->choice.successfulOutcome == NULLP)
2824 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
2828 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
2829 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2830 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_ResetResponseE2;
2831 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2834 resetResponse->protocolIEs.list.count = elementCnt;
2835 resetResponse->protocolIEs.list.size = elementCnt * sizeof(ResetResponseIEs_t *);
2836 RIC_ALLOC(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2837 if(!resetResponse->protocolIEs.list.array)
2839 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array");
2843 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
2845 RIC_ALLOC(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2846 if(!resetResponse->protocolIEs.list.array[ieIdx])
2848 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array element");
2852 if(ieIdx < elementCnt)
2856 resetResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2857 resetResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
2858 resetResponse->protocolIEs.list.array[ieIdx]->value.present = ResetResponseIEs__value_PR_TransactionID;
2859 resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
2861 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2863 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2865 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2866 if(encRetVal.encoded == ENCODE_FAIL)
2868 DU_LOG("\nERROR --> E2AP : Could not encode E2 reset response structure (at %s)\n",\
2869 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2874 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Reset Response \n");
2875 for(int i=0; i< encBufSize; i++)
2877 DU_LOG("%x",encBuf[i]);
2882 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2884 DU_LOG("\nERROR --> E2AP : Failed to send E2 Reset Response");
2892 FreeE2ResetResponse(e2apMsg);
2896 /*******************************************************************
2898 * @brief deallocate the memory allocated in building the
2899 * Service Query message
2903 * Function : FreeRicServiceQuery
2905 * Functionality: deallocate the memory allocated in building
2906 * Ric Service Query message
2908 * @params[in] E2AP_PDU_t *e2apMsg
2911 * ****************************************************************/
2913 void FreeRicServiceQuery(E2AP_PDU_t *e2apMsg)
2915 uint8_t arrIdx = 0, ranFuncIdx=0;
2916 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
2917 RICserviceQuery_t *ricServiceQuery=NULL;
2921 if(e2apMsg->choice.initiatingMessage)
2923 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2924 if(ricServiceQuery->protocolIEs.list.array)
2926 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
2928 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
2930 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
2932 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
2934 ranFuncAcceptedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2935 if(ranFuncAcceptedList->list.array)
2937 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
2939 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
2941 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
2945 case RICserviceQuery_IEs__value_PR_TransactionID:
2950 RIC_FREE(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2953 RIC_FREE(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2955 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
2957 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2961 /*******************************************************************
2963 * @brief build and send the ric service Query
2967 * Function : BuildAndSendRicServiceQuery
2969 * Functionality: build and send the ric service Query
2970 * @return ROK - success
2971 * RFAILED - Acknowledge
2973 ******************************************************************/
2975 uint8_t BuildAndSendRicServiceQuery(DuDb *duDb)
2979 uint8_t ret = RFAILED;
2980 bool memAllocFailed = false;
2981 E2AP_PDU_t *e2apMsg = NULL;
2982 asn_enc_rval_t encRetVal;
2983 RICserviceQuery_t *ricServiceQuery;
2985 DU_LOG("\nINFO --> E2AP : Building Ric service Query\n");
2988 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2989 if(e2apMsg == NULLP)
2991 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2994 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
2995 RIC_ALLOC(e2apMsg->choice.initiatingMessage , sizeof(struct InitiatingMessageE2));
2996 if(e2apMsg->choice.initiatingMessage == NULLP)
2998 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3002 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceQuery;
3003 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
3004 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceQuery;
3005 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
3008 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
3009 if(duDb->numOfRanFunction)
3012 ricServiceQuery->protocolIEs.list.count = elementCnt;
3013 ricServiceQuery->protocolIEs.list.size = elementCnt * sizeof(RICserviceQuery_IEs_t*);
3015 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
3016 if(ricServiceQuery->protocolIEs.list.array == NULLP)
3018 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
3022 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
3024 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
3025 if(ricServiceQuery->protocolIEs.list.array[arrIdx] == NULLP)
3027 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
3028 memAllocFailed = true;
3032 if(memAllocFailed == true)
3034 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
3040 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
3041 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3042 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_TransactionID;
3043 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = assignTransactionId(duDb);
3045 if(duDb->numOfRanFunction)
3047 /* Accepted RAN function Id */
3049 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
3050 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3051 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_RANfunctionsID_List;
3052 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceQuery)!=ROK)
3054 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
3059 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3060 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3062 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3064 /* Check encode results */
3065 if(encRetVal.encoded == ENCODE_FAIL)
3067 DU_LOG("\nERROR --> E2AP : Could not encode RIC service Query structure (at %s)\n",\
3068 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3073 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service Query\n");
3074 for(int i=0; i< encBufSize; i++)
3076 DU_LOG("%x",encBuf[i]);
3080 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
3082 DU_LOG("\nERROR --> E2AP : Sending of RIC service Query failed");
3089 FreeRicServiceQuery(e2apMsg);
3093 /*******************************************************************
3095 * @brief deallocate the memory allocated in RicServiceUpdateFailure
3099 * Function : FreeRicServiceUpdateFailure
3101 * Functionality: deallocate the memory allocated in RicServiceUpdatefailure
3103 * @params[in] E2AP_PDU_t *e2apMsg
3106 * ****************************************************************/
3108 void FreeRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
3111 RICserviceUpdateFailure_t *ricServiceUpdateFailure=NULL;
3115 if(e2apMsg->choice.unsuccessfulOutcome)
3117 ricServiceUpdateFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
3118 if(ricServiceUpdateFailure->protocolIEs.list.array)
3120 for(arrIdx=0; arrIdx<ricServiceUpdateFailure->protocolIEs.list.count; arrIdx++)
3122 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
3124 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array, ricServiceUpdateFailure->protocolIEs.list.size);
3126 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3128 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3132 /*******************************************************************
3134 * @brief build and send the ric service update failure
3138 * Function : BuildAndSendRicServiceUpdateFailure
3140 * Functionality: build and send the ric service update failure
3141 * @return ROK - success
3144 ******************************************************************/
3146 uint8_t BuildAndSendRicServiceUpdateFailure(uint32_t duId, int8_t transId, CauseE2_PR causePresent, uint8_t reason)
3149 E2AP_PDU_t *e2apMsg = NULL;
3150 asn_enc_rval_t encRetVal;
3151 uint8_t ret = RFAILED;
3153 uint8_t elementCnt=0;
3154 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
3156 DU_LOG("\nINFO --> E2AP : Building Ric service update failure\n");
3159 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3160 if(e2apMsg == NULLP)
3162 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3165 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3166 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
3167 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3169 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3173 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
3174 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3175 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure;
3176 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
3179 ricServiceFailure->protocolIEs.list.count = elementCnt;
3180 ricServiceFailure->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateFailure_IEs_t *);
3182 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array, ricServiceFailure->protocolIEs.list.size);
3183 if(ricServiceFailure->protocolIEs.list.array == NULLP)
3185 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
3189 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
3191 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
3192 if(ricServiceFailure->protocolIEs.list.array[arrIdx] == NULLP)
3194 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
3198 if(arrIdx<elementCnt)
3200 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
3206 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
3207 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3208 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TransactionID;
3209 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
3212 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
3213 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3214 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_CauseE2;
3215 fillE2FailureCause(&ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, causePresent, reason);
3218 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
3219 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
3220 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TimeToWaitE2;
3221 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
3223 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3224 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3226 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3228 /* Check encode results */
3229 if(encRetVal.encoded == ENCODE_FAIL)
3231 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update failure structure (at %s)\n",\
3232 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3237 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Failure\n");
3238 for(int i=0; i< encBufSize; i++)
3240 DU_LOG("%x",encBuf[i]);
3244 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
3246 DU_LOG("\nERROR --> E2AP : Sending RIC service update failed");
3253 FreeRicServiceUpdateFailure(e2apMsg);
3258 /*******************************************************************
3260 * @brief deallocate the memory allocated in RicServiceUpdateAck(
3264 * Function : FreeRicServiceUpdateAck
3266 * Functionality: deallocate the memory allocated in RicServiceUpdateAck
3268 * @params[in] E2AP_PDU_t *e2apMsg
3271 * ****************************************************************/
3273 void FreeRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
3275 uint8_t arrIdx = 0, ranFuncIdx=0;
3276 RANfunctionsID_List_t *acceptedList=NULL;
3277 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
3278 RANfunctionsIDcause_List_t *rejectedList=NULL;
3282 if(e2apMsg->choice.successfulOutcome)
3284 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
3285 if(ricServiceUpdateAck->protocolIEs.list.array)
3287 for(arrIdx=0; arrIdx<ricServiceUpdateAck->protocolIEs.list.count; arrIdx++)
3289 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx])
3291 switch(ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id)
3293 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
3295 acceptedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
3296 if(acceptedList->list.array)
3298 for(ranFuncIdx=0;ranFuncIdx<acceptedList->list.count; ranFuncIdx++)
3300 RIC_FREE(acceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
3302 RIC_FREE(acceptedList->list.array, acceptedList->list.size);
3307 case ProtocolIE_IDE2_id_RANfunctionsRejected:
3309 rejectedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
3310 if(rejectedList->list.array)
3312 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
3314 RIC_FREE(rejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
3316 RIC_FREE(rejectedList->list.array, rejectedList->list.size);
3321 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
3324 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
3326 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
3328 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3332 /*******************************************************************
3334 * @brief Build RAN function rejected list
3338 * Function : BuildRanFunctionRejectedList
3340 * Functionality: Build RAN function rejected list
3343 * Count of ran functions to be rejected in the list
3344 * Received list of RAN functions
3346 * @return ROK - success
3348 * ****************************************************************/
3350 uint8_t BuildRanFunctionRejectedList(uint8_t count, RanFunction *ranFunRejectedList, RANfunctionsIDcause_List_t *ranFuncRejectedList)
3352 uint8_t ranFuncIdx = 0;
3353 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
3355 ranFuncRejectedList->list.count = count;
3357 ranFuncRejectedList->list.size = ranFuncRejectedList->list.count*sizeof(RANfunctionIDcause_ItemIEs_t*);
3358 RIC_ALLOC(ranFuncRejectedList->list.array, ranFuncRejectedList->list.size);
3359 if(ranFuncRejectedList->list.array == NULLP)
3361 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array");
3365 for(ranFuncIdx = 0; ranFuncIdx< ranFuncRejectedList->list.count; ranFuncIdx++)
3367 RIC_ALLOC(ranFuncRejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
3368 if(ranFuncRejectedList->list.array[ranFuncIdx] == NULLP)
3370 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array item");
3373 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)ranFuncRejectedList->list.array[ranFuncIdx];
3374 ranFuncRejectedItemIe->id = ProtocolIE_IDE2_id_RANfunctionIEcause_Item;
3375 ranFuncRejectedItemIe->criticality= CriticalityE2_ignore;
3376 ranFuncRejectedItemIe->value.present = RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item;
3377 ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID = ranFunRejectedList[ranFuncIdx].id;
3378 fillE2FailureCause(&ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.cause, CauseE2_PR_ricService,\
3379 CauseE2RICservice_ran_function_not_supported);
3385 /*******************************************************************
3387 * @brief build and send the ric service update Acknowledge
3391 * Function : BuildAndSendRicServiceUpdateAcknowledge
3393 * Functionality: build and send the ric service update Acknowledge
3394 * @return ROK - success
3395 * RFAILED - Acknowledge
3397 ******************************************************************/
3399 uint8_t BuildAndSendRicServiceUpdateAcknowledge(DuDb *duDb, int8_t transId, RicTmpRanFunList ricRanFuncList)
3401 E2AP_PDU_t *e2apMsg = NULL;
3402 asn_enc_rval_t encRetVal;
3403 uint8_t arrIdx=0, elementCnt=0, ret=RFAILED;;
3404 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
3406 DU_LOG("\nINFO --> E2AP : Building Ric service update Acknowledge\n");
3409 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3410 if(e2apMsg == NULLP)
3412 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3415 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
3416 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(struct SuccessfulOutcomeE2));
3417 if(e2apMsg->choice.successfulOutcome == NULLP)
3419 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3423 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
3424 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
3425 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge;
3426 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
3429 if(ricRanFuncList.numOfRanFunAccepted)
3431 if(ricRanFuncList.numOfRanFuneRejected)
3435 ricServiceUpdateAck->protocolIEs.list.count = elementCnt;
3436 ricServiceUpdateAck->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateAcknowledge_IEs_t*);
3438 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
3439 if(ricServiceUpdateAck->protocolIEs.list.array == NULLP)
3441 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3445 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
3447 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
3448 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx] == NULLP)
3450 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3454 if(arrIdx<elementCnt)
3456 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3462 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
3463 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3464 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_TransactionID;
3465 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
3467 if(ricRanFuncList.numOfRanFunAccepted)
3469 /* Accepted RAN function List */
3471 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
3472 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3473 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List;
3474 if(BuildRanFunctionAcceptedList(duDb, ricRanFuncList.numOfRanFunAccepted, ricRanFuncList.ranFunAcceptedList,\
3475 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceUpdate)!=ROK)
3477 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
3482 if(ricRanFuncList.numOfRanFuneRejected)
3484 /* RAN Functions Rejected List */
3486 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsRejected;
3487 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3488 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List;
3489 if(BuildRanFunctionRejectedList(ricRanFuncList.numOfRanFuneRejected, ricRanFuncList.ranFunRejectedList, \
3490 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List)!=ROK)
3492 DU_LOG("\nERROR --> E2AP : Failed to build Ran function rejected list");
3498 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3499 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3501 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3503 /* Check encode results */
3504 if(encRetVal.encoded == ENCODE_FAIL)
3506 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update Acknowledge structure (at %s)\n",\
3507 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3512 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Acknowledge\n");
3513 for(int i=0; i< encBufSize; i++)
3515 DU_LOG("%x",encBuf[i]);
3519 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
3521 DU_LOG("\nERROR --> E2AP : Sending RIC service update ack failed");
3527 FreeRicServiceUpdateAck(e2apMsg);
3531 /*******************************************************************
3533 * @brief process the RIC service update
3537 * Function : ProcRicserviceUpdate
3539 * Functionality: process the RIC service update
3541 * @return ROK - success
3544 ******************************************************************/
3546 void ProcRicServiceUpdate(uint32_t duId, RICserviceUpdate_t *ricServiceUpdate)
3548 RicTmpRanFunList ricRanFuncList;
3551 uint8_t duIdx = 0, elementCnt =0, arrIdx = 0;
3552 uint16_t ranFuncIdx = 0, failedRanFuncCount=0, recvdRanFuncCount=0;
3553 RanFunction *ranFuncDb = NULLP;
3554 RANfunction_ItemIEs_t *ranFuncItemIe =NULL;
3555 RANfunction_Item_t *ranFuncItem =NULL;
3556 RANfunctionID_Item_t *ranFuncIdItem=NULL;
3557 RANfunctions_List_t *ranFuncList=NULL;
3558 RANfunctionsID_List_t *deleteList=NULL;
3559 RANfunctionID_ItemIEs_t *delRanFuncItem=NULL;
3561 SEARCH_DU_DB(duIdx, duId, duDb);
3564 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3567 memset(&ricRanFuncList, 0, sizeof(RicTmpRanFunList));
3569 if(!ricServiceUpdate)
3571 DU_LOG("\nERROR --> E2AP : ricServiceUpdate pointer is null");
3575 if(!ricServiceUpdate->protocolIEs.list.array)
3577 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array pointer is null");
3580 elementCnt = ricServiceUpdate->protocolIEs.list.count;
3581 for(arrIdx=0; arrIdx<ricServiceUpdate->protocolIEs.list.count; arrIdx++)
3583 if(!ricServiceUpdate->protocolIEs.list.array[arrIdx])
3585 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array idx %d pointer is null",arrIdx);
3589 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
3591 case ProtocolIE_IDE2_id_TransactionID:
3593 transId = ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
3595 if(transId < 0 || transId > 255)
3597 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
3603 case ProtocolIE_IDE2_id_RANfunctionsAdded:
3605 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
3607 if(ranFuncList->list.array)
3609 for(ranFuncIdx=0;ranFuncIdx<ranFuncList->list.count; ranFuncIdx++)
3611 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
3612 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
3614 /* Adding the ran function in temporary list */
3615 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
3616 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
3617 ricRanFuncList.numOfRanFunAccepted++;
3619 /* Adding the new ran function in DB*/
3620 duDb->ranFunction[ranFuncItem->ranFunctionID-1].id = ranFuncItem->ranFunctionID;
3621 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
3622 duDb->numOfRanFunction++;
3624 /* Calculating total number of ran fuctions which are received for addition */
3625 recvdRanFuncCount++;
3631 case ProtocolIE_IDE2_id_RANfunctionsModified:
3634 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
3635 if(ranFuncList->list.array)
3637 for(ranFuncIdx = 0; ranFuncIdx< ranFuncList->list.count; ranFuncIdx++)
3639 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
3640 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
3641 if(fetchRanFuncFromRanFuncId(duDb, ranFuncItem->ranFunctionID) == NULLP)
3643 /* Calculating total number of ran fuctions which are not present */
3644 failedRanFuncCount++;
3646 /* Adding the ran function in temporary list */
3647 ricRanFuncList.ranFunRejectedList[ricRanFuncList.numOfRanFuneRejected].id = ranFuncItem->ranFunctionID;
3648 ricRanFuncList.numOfRanFuneRejected++;
3653 /* Adding the ran function in temporary list */
3654 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
3655 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
3656 ricRanFuncList.numOfRanFunAccepted++;
3658 /* Updating the new ran function in DB*/
3659 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
3661 /* Calculating total number of ran fuctions which are received for modification */
3662 recvdRanFuncCount++;
3667 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
3670 deleteList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
3671 if(deleteList->list.array)
3673 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
3675 delRanFuncItem = (RANfunctionID_ItemIEs_t*) deleteList->list.array[ranFuncIdx];
3676 ranFuncIdItem = &delRanFuncItem->value.choice.RANfunctionID_Item;
3677 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncIdItem->ranFunctionID);
3680 memset(ranFuncDb, 0, sizeof(RanFunction));
3681 duDb->numOfRanFunction--;
3684 /* Calculating total number of ran fuctions which are received for deletion */
3685 recvdRanFuncCount++;
3693 DU_LOG("\nERROR --> E2AP : IE [%ld] is not supported",ricServiceUpdate->protocolIEs.list.array[arrIdx]->id);
3699 /* Sending RIC Service Update Failed if all RAN Functions received fail or if any IE processing fails
3700 * Else sending RIC Service Update Acknowledge */
3701 if((elementCnt > arrIdx) ||((recvdRanFuncCount > 0) && (recvdRanFuncCount == failedRanFuncCount)))
3703 if(BuildAndSendRicServiceUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
3705 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update Failure");
3711 if(BuildAndSendRicServiceUpdateAcknowledge(duDb, transId, ricRanFuncList) != ROK)
3713 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update acknowledge");
3719 /*******************************************************************
3721 * @brief Processing RIC subscription failure from DU
3725 * Function : ProcRicSubscriptionFailure
3727 * Functionality: Processing RIC subscription failure from DU
3729 * @param ID of DU from which message was sent
3730 * RIC Subscription failure message
3731 * @return ROK - success
3734 ******************************************************************/
3735 uint8_t ProcRicSubscriptionFailure(uint32_t duId, RICsubscriptionFailure_t *ricSubscriptionFailure)
3737 uint8_t ieIdx = 0, duIdx = 0;
3738 uint8_t ranFuncId = 0;
3740 RanFunction *ranFuncDb = NULLP;
3741 RicSubscription *ricSubs = NULLP;
3742 CmLList *ricSubsNode = NULLP;
3743 RicRequestId ricReqId;
3744 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
3746 DU_LOG("\nINFO --> E2AP : Received RIC subscription failure");
3748 SEARCH_DU_DB(duIdx, duId, duDb);
3751 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3755 memset(&ricReqId, 0, sizeof(RicRequestId));
3756 if(ricSubscriptionFailure)
3758 if(ricSubscriptionFailure->protocolIEs.list.array)
3760 for(ieIdx=0; ieIdx<ricSubscriptionFailure->protocolIEs.list.count; ieIdx++)
3762 if(ricSubscriptionFailure->protocolIEs.list.array[ieIdx])
3764 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[ieIdx];
3765 switch(ricSubscriptionFailure->protocolIEs.list.array[ieIdx]->id)
3767 case ProtocolIE_IDE2_id_RICrequestID:
3769 ricReqId.requestorId = ricSubsFailIe->value.choice.RICrequestID.ricRequestorID;
3770 ricReqId.instanceId = ricSubsFailIe->value.choice.RICrequestID.ricInstanceID;
3773 case ProtocolIE_IDE2_id_RANfunctionID:
3775 ranFuncId = ricSubsFailIe->value.choice.RANfunctionID;
3776 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
3779 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionFailure : RAN Function Id [%d] not found", ranFuncId);
3784 /* Remove subscription entry from RAN Function */
3785 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
3788 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
3789 deleteRicSubscriptionNode(ricSubsNode);
3794 case ProtocolIE_IDE2_id_CauseE2:
3796 /* No handling required as of now since this is a stub */
3806 /*******************************************************************
3808 * @brief Free RIC Subscription Modification Refuse
3812 * Function : FreeRicSubsModRefuse
3814 * Functionality: Free RIC Subscription Modification Refuse
3816 * @param E2AP Message PDU to be freed
3819 ******************************************************************/
3820 void FreeRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
3823 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3827 if(e2apMsg->choice.unsuccessfulOutcome)
3829 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3830 if(ricSubsModRefuse->protocolIEs.list.array)
3832 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
3834 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3836 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3838 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3840 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3844 /*******************************************************************
3846 * @brief Build And Send RIC Subscription Modification Refuse
3850 * Function : BuildAndSendRicSubsModRefuse
3852 * Functionality: Build And Send RIC Subscription Modification Refuse
3855 * RIC Request ID of subscription
3859 * @return ROK - success
3862 ******************************************************************/
3863 uint8_t BuildAndSendRicSubsModRefuse(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, CauseE2_PR causeType, \
3866 uint8_t ieIdx = 0, elementCnt = 0;
3867 uint8_t ret = RFAILED;
3868 E2AP_PDU_t *e2apMsg = NULL;
3869 asn_enc_rval_t encRetVal;
3870 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3871 RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
3873 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Refuse\n");
3876 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3877 if(e2apMsg == NULLP)
3879 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3882 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3883 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3884 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3886 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3890 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
3891 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3892 e2apMsg->choice.unsuccessfulOutcome->value.present = \
3893 UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse;
3894 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3897 ricSubsModRefuse->protocolIEs.list.count = elementCnt;
3898 ricSubsModRefuse->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRefuse_IEs_t *);
3899 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3900 if(!ricSubsModRefuse->protocolIEs.list.array)
3902 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3906 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
3908 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3909 if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
3911 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3916 /* RIC Request ID */
3918 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3919 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RICrequestID;
3920 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3921 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RICrequestID;
3922 ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3923 ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3925 /* RAN Function ID */
3927 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3928 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3929 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3930 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RANfunctionID;
3931 ricSubsModRefuseIe->value.choice.RANfunctionID = ranFuncId;
3935 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3936 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_CauseE2;
3937 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3938 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_CauseE2;
3939 fillE2FailureCause(&ricSubsModRefuseIe->value.choice.CauseE2, causeType, cause);
3941 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3942 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3944 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3946 /* Check encode results */
3947 if(encRetVal.encoded == ENCODE_FAIL)
3949 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification refuse (at %s)\n",\
3950 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3955 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification refuse\n");
3956 for(int i=0; i< encBufSize; i++)
3958 DU_LOG("%x",encBuf[i]);
3962 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
3964 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Refused");
3971 FreeRicSubsModRefuse(e2apMsg);
3975 /*******************************************************************
3977 * @brief Free memory for RIC Subscription Modification Confirm
3981 * Function : FreeRicSubsModConfirm
3983 * Functionality: Free memory for RIC subscription modification
3986 * @param E2AP Message PDU to be freed
3989 ******************************************************************/
3990 void FreeRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
3992 uint8_t ieIdx = 0, arrIdx=0;
3993 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
3994 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
3995 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
3996 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
3997 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
3998 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
4002 if(e2apMsg->choice.successfulOutcome)
4004 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
4005 if(ricSubsModCfm->protocolIEs.list.array)
4007 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
4009 if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
4011 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4012 switch(ricSubsModCfmIe->id)
4014 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
4016 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
4017 if(modCfmList->list.array)
4019 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
4021 RIC_FREE(modCfmList->list.array[arrIdx], \
4022 sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
4024 RIC_FREE(modCfmList->list.array, modCfmList->list.size);
4029 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
4031 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
4032 if(modRefusedList->list.array)
4034 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
4036 RIC_FREE(modRefusedList->list.array[arrIdx], \
4037 sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
4039 RIC_FREE(modRefusedList->list.array, modRefusedList->list.size);
4044 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
4046 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
4047 if(rmvCfmList->list.array)
4049 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
4051 RIC_FREE(rmvCfmList->list.array[arrIdx], \
4052 sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
4054 RIC_FREE(rmvCfmList->list.array, rmvCfmList->list.size);
4059 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
4061 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
4062 if(rmvFailList->list.array)
4064 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
4066 RIC_ALLOC(rmvFailList->list.array[arrIdx], \
4067 sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
4069 RIC_FREE(rmvFailList->list.array, rmvFailList->list.size);
4078 RIC_FREE(ricSubsModCfmIe, sizeof(RICsubscriptionModificationConfirm_IEs_t));
4081 RIC_FREE(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
4083 RIC_FREE(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
4085 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4089 /*******************************************************************
4091 * @brief Fill the list of actions confirmed for modification
4095 * Function : fillActionModConfirmedList
4097 * Functionality: Fill the list of actions confirmed for modification
4099 * @param List to be filled
4101 * Source list of actions
4102 * @return ROK - success
4105 ******************************************************************/
4106 uint8_t fillActionModConfirmedList(RICactions_ConfirmedForModification_List_t *modCfmList, uint8_t numActions, \
4107 uint8_t *actionModifiedList)
4110 RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
4112 modCfmList->list.count = numActions;
4113 modCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForModification_ItemIEs_t *);
4114 RIC_ALLOC(modCfmList->list.array, modCfmList->list.size);
4115 if(!modCfmList->list.array)
4117 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4121 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
4123 RIC_ALLOC(modCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
4124 if(!modCfmList->list.array[arrIdx])
4126 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4130 modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
4131 modCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForModification_Item;
4132 modCfmListItem->criticality = CriticalityE2_ignore;
4133 modCfmListItem->value.present = \
4134 RICaction_ConfirmedForModification_ItemIEs__value_PR_RICaction_ConfirmedForModification_Item;
4135 modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID = actionModifiedList[arrIdx];
4141 /*******************************************************************
4143 * @brief Fill the list of actions refused to be modified
4147 * Function : fillActionModRefusedList
4149 * Functionality: Fill the list of actions refused to be modified
4151 * @param List to be filled
4153 * Source list of actions refused tobe modified
4154 * @return ROK - success
4157 ******************************************************************/
4158 uint8_t fillActionModRefusedList(RICactions_RefusedToBeModified_List_t *modRefusedList, uint8_t numActions, \
4159 ActionFailed *actionModFailedList)
4162 RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
4164 modRefusedList->list.count = numActions;
4165 modRefusedList->list.size = numActions * sizeof(RICaction_RefusedToBeModified_ItemIEs_t *);
4166 RIC_ALLOC(modRefusedList->list.array, modRefusedList->list.size);
4167 if(!modRefusedList->list.array)
4169 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4173 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
4175 RIC_ALLOC(modRefusedList->list.array[arrIdx], sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
4176 if(!modRefusedList->list.array[arrIdx])
4178 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4182 modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
4183 modRefusedListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeModified_Item;
4184 modRefusedListItem->criticality = CriticalityE2_ignore;
4185 modRefusedListItem->value.present = \
4186 RICaction_RefusedToBeModified_ItemIEs__value_PR_RICaction_RefusedToBeModified_Item;
4187 modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID = \
4188 actionModFailedList[arrIdx].actionId;
4189 fillE2FailureCause(&modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.cause, \
4190 actionModFailedList[arrIdx].failureType, actionModFailedList[arrIdx].cause);
4196 /*******************************************************************
4198 * @brief Fill the list of action confirmed for removal
4202 * Function : fillActionRemovalConfirmedList
4204 * Functionality: Fill the list of action confirmed for removal
4206 * @param List to be filled
4208 * Source list of actions removed
4209 * @return ROK - success
4212 ******************************************************************/
4213 uint8_t fillActionRemovalConfirmedList(RICactions_ConfirmedForRemoval_List_t *rmvCfmList, uint8_t numActions, \
4214 uint8_t *actionRemovedList)
4217 RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
4219 rmvCfmList->list.count = numActions;
4220 rmvCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t *);
4221 RIC_ALLOC(rmvCfmList->list.array, rmvCfmList->list.size);
4222 if(!rmvCfmList->list.array)
4224 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4228 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
4230 RIC_ALLOC(rmvCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
4231 if(!rmvCfmList->list.array[arrIdx])
4233 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4237 rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
4238 rmvCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForRemoval_Item;
4239 rmvCfmListItem->criticality = CriticalityE2_ignore;
4240 rmvCfmListItem->value.present = \
4241 RICaction_ConfirmedForRemoval_ItemIEs__value_PR_RICaction_ConfirmedForRemoval_Item;
4242 rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID = actionRemovedList[arrIdx];
4248 /*******************************************************************
4250 * @brief Fill the list of actions refused to be removed
4254 * Function : fillActionRemovalRefusedList
4256 * Functionality: Fill the list of actions refused to be removed
4258 * @param List to be filled
4260 * Source list of actions refused to be removed
4261 * @return ROK - success
4264 ******************************************************************/
4265 uint8_t fillActionRemovalRefusedList(RICactions_RefusedToBeRemoved_List_t *rmvFailList, \
4266 uint8_t numActions, ActionFailed *actionRmvlFailList)
4269 RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
4271 rmvFailList->list.count = numActions;
4272 rmvFailList->list.size = numActions * sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t *);
4273 RIC_ALLOC(rmvFailList->list.array, rmvFailList->list.size);
4274 if(!rmvFailList->list.array)
4276 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4280 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
4282 RIC_ALLOC(rmvFailList->list.array[arrIdx], sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
4283 if(!rmvFailList->list.array[arrIdx])
4285 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4289 rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
4290 rmvFailListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeRemoved_Item;
4291 rmvFailListItem->criticality = CriticalityE2_ignore;
4292 rmvFailListItem->value.present = \
4293 RICaction_RefusedToBeRemoved_ItemIEs__value_PR_RICaction_RefusedToBeRemoved_Item;
4294 rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID = actionRmvlFailList[arrIdx].actionId;
4295 fillE2FailureCause(&rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.cause, \
4296 actionRmvlFailList[arrIdx].failureType, actionRmvlFailList[arrIdx].cause);
4303 /*******************************************************************
4305 * @brief Build And Send RIC Subscription Modification Confirm
4309 * Function : BuildAndSendRicSubsModConfirm
4311 * Functionality: Build And Send RIC Subscription Modification Confirm
4314 * RIC Request ID of subscription
4316 * Temporary source action list
4317 * @return ROK - success
4320 ******************************************************************/
4321 uint8_t BuildAndSendRicSubsModConfirm(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, RicTmpActionList tmpActionList)
4323 uint8_t ieIdx = 0, elementCnt = 0;
4324 uint8_t ret = RFAILED;
4325 E2AP_PDU_t *e2apMsg = NULLP;
4326 asn_enc_rval_t encRetVal;
4327 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
4328 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
4330 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Confirm\n");
4333 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4334 if(e2apMsg == NULLP)
4336 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4340 /* Successful Outcome */
4341 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
4342 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
4343 if(e2apMsg->choice.successfulOutcome == NULLP)
4345 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4349 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
4350 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
4351 e2apMsg->choice.successfulOutcome->value.present = \
4352 SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm;
4353 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
4356 if(tmpActionList.numActionModified)
4358 if(tmpActionList.numActionModFailed)
4360 if(tmpActionList.numActionRemoved)
4362 if(tmpActionList.numActionRemovalFailed)
4365 ricSubsModCfm->protocolIEs.list.count = elementCnt;
4366 ricSubsModCfm->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationConfirm_IEs_t *);
4367 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
4368 if(!ricSubsModCfm->protocolIEs.list.array)
4370 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4374 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4376 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationConfirm_IEs_t));
4377 if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
4379 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4384 /* RIC Request ID */
4386 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4387 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICrequestID;
4388 ricSubsModCfmIe->criticality = CriticalityE2_reject;
4389 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RICrequestID;
4390 ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
4391 ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
4393 /* RAN Function ID */
4395 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4396 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RANfunctionID;
4397 ricSubsModCfmIe->criticality = CriticalityE2_reject;
4398 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RANfunctionID;
4399 ricSubsModCfmIe->value.choice.RANfunctionID = ranFuncId;
4401 /* RIC Actions List confirmed for modification */
4402 if(tmpActionList.numActionModified)
4405 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4406 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List;
4407 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4408 ricSubsModCfmIe->value.present = \
4409 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForModification_List;
4410 if(fillActionModConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List, \
4411 tmpActionList.numActionModified, tmpActionList.actionModifiedList) != ROK)
4413 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Modification List", __func__);
4418 /* RIC Actions List refured to be modified */
4419 if(tmpActionList.numActionModFailed)
4422 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4423 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List;
4424 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4425 ricSubsModCfmIe->value.present = \
4426 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeModified_List;
4427 if(fillActionModRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List, \
4428 tmpActionList.numActionModFailed, tmpActionList.actionModFailedList) != ROK)
4430 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Refused to be Modified List", __func__);
4435 /* RIC Actions List confirmed for removal */
4436 if(tmpActionList.numActionRemoved)
4439 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4440 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List;
4441 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4442 ricSubsModCfmIe->value.present = \
4443 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForRemoval_List;
4444 if(fillActionRemovalConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List, \
4445 tmpActionList.numActionRemoved, tmpActionList.actionRemovedList) != ROK)
4447 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Removal List", __func__);
4452 /* RIC Actions List Refused to be removed */
4453 if(tmpActionList.numActionRemovalFailed)
4456 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4457 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List;
4458 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4459 ricSubsModCfmIe->value.present = \
4460 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeRemoved_List;
4461 if(fillActionRemovalRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List, \
4462 tmpActionList.numActionRemovalFailed, tmpActionList.actionRemovalFailedList) != ROK)
4464 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Failed to be Removed List", __func__);
4469 /* Print and encode E2AP Message PDU */
4470 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4471 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4473 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
4475 /* Check encode results */
4476 if(encRetVal.encoded == ENCODE_FAIL)
4478 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification confirm (at %s)\n",\
4479 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4484 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification confirm\n");
4485 for(int i=0; i< encBufSize; i++)
4487 DU_LOG("%x",encBuf[i]);
4491 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
4493 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Confirm");
4501 FreeRicSubsModConfirm(e2apMsg);
4505 /*******************************************************************
4507 * @brief Processing of RIC Subscription Modification Required
4511 * Function : ProcRicSubsModReqd
4513 * Functionality: Processing of RIC Subscription Modification Required
4514 * As of now, we do not identify any scenario where this message
4515 * shall be sent by DU. Hence, bare minimum handling has been
4519 * RIC Subscription Modification Required IEs
4520 * @return ROK-success
4523 ******************************************************************/
4524 uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t *ricSubsModReqd)
4526 uint8_t ieIdx = 0, actionIdx = 0, duIdx = 0;
4530 RicRequestId ricReqId;
4531 RanFunction *ranFuncDb = NULLP;
4532 RicSubscription *ricSubs = NULLP;
4533 CmLList *ricSubsNode = NULLP;
4534 CmLList *actionNode = NULLP;
4535 ActionInfo *action = NULLP;
4536 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
4537 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
4538 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
4539 RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULLP;
4540 RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULLP;
4541 RicTmpActionList tmpActionList;
4543 memset(&ricReqId, 0, sizeof(RicRequestId));
4544 memset(&tmpActionList, 0, sizeof(RicTmpActionList));
4546 SEARCH_DU_DB(duIdx, duId, duDb);
4549 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4553 for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
4555 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
4556 switch(ricSubsModReqdIe->id)
4558 case ProtocolIE_IDE2_id_RICrequestID:
4560 ricReqId.requestorId = ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID;
4561 ricReqId.instanceId = ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID;
4564 case ProtocolIE_IDE2_id_RANfunctionID:
4566 ranFuncId = ricSubsModReqdIe->value.choice.RANfunctionID;
4567 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
4570 /* If RIC Subscription not found, send RIC Subscription modification refuse to DU */
4571 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RIC Subscription not found");
4572 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
4573 CauseE2RICrequest_ran_function_id_invalid);
4577 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
4580 /* If RAN Function not found, send RIC Subscription modification refuse to DU */
4581 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RAN Function ID [%d] not found",ranFuncId);
4582 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, \
4583 CauseE2_PR_ricRequest, CauseE2RICrequest_request_id_unknown);
4588 case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
4590 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
4591 for(actionIdx = 0; actionIdx < actionToBeModList->list.count; actionIdx++)
4594 actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[actionIdx];
4595 actionId = actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID;
4596 action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode);
4599 /* No modification required as of now, hence directly adding to the list */
4600 tmpActionList.actionModifiedList[tmpActionList.numActionModified++] = actionId;
4604 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].actionId = actionId;
4605 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].failureType = \
4606 CauseE2_PR_ricRequest;
4607 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].cause = \
4608 CauseE2RICrequest_action_not_supported;
4609 tmpActionList.numActionModFailed++;
4614 case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
4616 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
4617 for(actionIdx = 0; actionIdx < actionToBeRmvList->list.count; actionIdx++)
4620 actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[actionIdx];
4621 actionId = actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID;
4622 action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode);
4625 tmpActionList.actionRemovedList[tmpActionList.numActionRemoved++] = actionId;
4626 cmLListDelFrm(&ricSubs->actionSequence, actionNode);
4627 deleteActionSequence(actionNode);
4637 /* If none of the action modification/removal is supported,
4638 * send RIC Subscription Modification Refuse
4640 * send RIC Subscription Modification Confirm
4642 if(tmpActionList.numActionModified || tmpActionList.numActionRemoved)
4644 BuildAndSendRicSubsModConfirm(duId, ricReqId, ranFuncId, tmpActionList);
4648 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
4649 CauseE2RICrequest_action_not_supported);
4655 /*******************************************************************
4657 * @brief Free the ErrorIndication Message
4661 * Function : FreeRicIndication
4663 * Functionality: Free the ErrorIndication Message
4668 ******************************************************************/
4669 void FreeErrorIndication(E2AP_PDU_t *e2apMsg)
4672 ErrorIndicationE2_t *errorIndicationMsg= NULLP;
4674 if(e2apMsg != NULLP)
4676 if(e2apMsg->choice.initiatingMessage != NULLP)
4678 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
4679 if(errorIndicationMsg!= NULLP)
4681 if(errorIndicationMsg->protocolIEs.list.array != NULLP)
4683 for(arrIdx=0; arrIdx<errorIndicationMsg->protocolIEs.list.count; arrIdx++)
4685 RIC_FREE(errorIndicationMsg->protocolIEs.list.array[arrIdx],sizeof(ErrorIndicationE2_t));
4687 RIC_FREE(errorIndicationMsg->protocolIEs.list.array,errorIndicationMsg->protocolIEs.list.size);
4690 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4692 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4697 /*******************************************************************
4699 * @brief Builds and Send the ErrorIndication Message
4703 * Function : BuildAndSendErrorIndication
4705 * Functionality:Fills the ErrorIndication Message
4713 * @return ROK - success
4716 ******************************************************************/
4718 uint8_t BuildAndSendErrorIndication(uint32_t duId, int8_t transId, RicRequestId requestId, uint16_t ranFuncId, uint8_t reason)
4720 uint8_t elementCnt =0, arrIdx=0, ret = RFAILED;
4721 E2AP_PDU_t *e2apMsg = NULLP;
4722 ErrorIndicationE2_t *errorIndicationMsg=NULLP;
4723 asn_enc_rval_t encRetVal; /* Encoder return value */
4727 DU_LOG("\nINFO --> E2AP : Building Error Indication Message\n");
4729 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4730 if(e2apMsg == NULLP)
4732 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4736 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4737 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4738 if(e2apMsg->choice.initiatingMessage == NULLP)
4740 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4743 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_ErrorIndicationE2;
4744 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4745 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ErrorIndicationE2;
4747 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
4749 /* Element count is 2 for TransactionID/RICrequestID and Cause.
4750 * If the RAN function id is present, the count will be increased.*/
4755 errorIndicationMsg->protocolIEs.list.count = elementCnt;
4756 errorIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(ErrorIndicationE2_IEs_t*);
4758 /* Initialize the E2Setup members */
4759 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array, errorIndicationMsg->protocolIEs.list.size);
4760 if(errorIndicationMsg->protocolIEs.list.array == NULLP)
4762 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements in %s at line %d",__func__, __LINE__);
4765 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
4767 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array[arrIdx], sizeof(ErrorIndicationE2_IEs_t));
4768 if(errorIndicationMsg->protocolIEs.list.array[arrIdx] == NULLP)
4770 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array Idx %d in %s at line %d",arrIdx,__func__, __LINE__);
4774 if(arrIdx < elementCnt)
4779 if(transId >=0 && transId<=255)
4782 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4783 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4784 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_TransactionID;
4785 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
4790 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RICrequestID;
4791 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4792 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RICrequestID;
4793 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricRequestorID = requestId.requestorId;
4794 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricInstanceID = requestId.instanceId;
4799 /* RAN Function ID */
4801 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionID;
4802 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4803 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RANfunctionID;
4804 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionID = ranFuncId;
4809 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4810 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
4811 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
4812 fillE2FailureCause(&errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, CauseE2_PR_misc, reason);
4815 /* Prints the Msg formed */
4816 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4817 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4819 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4821 if(encRetVal.encoded == ENCODE_FAIL)
4823 DU_LOG("\nERROR --> E2AP : Could not encode Error Indication Message (at %s)\n",\
4824 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4829 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for Error Indication Message \n");
4830 #ifdef DEBUG_ASN_PRINT
4831 for(int i=0; i< encBufSize; i++)
4833 printf("%x",encBuf[i]);
4838 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
4840 DU_LOG("\nINFO --> E2AP : Sending Error Indication Message");
4846 FreeErrorIndication(e2apMsg);
4850 /*******************************************************************
4852 * @brief Deallocate the memory allocated for ResetRequest msg
4856 * Function : FreeResetRequest
4859 * - freeing the memory allocated for ResetRequest
4861 * @params[in] E2AP_PDU_t *e2apMsg
4862 * @return ROK - success
4865 * ****************************************************************/
4866 void FreeResetRequest(E2AP_PDU_t *e2apMsg)
4869 ResetRequestE2_t *resetReq = NULLP;
4871 if(e2apMsg != NULLP)
4873 if(e2apMsg->choice.initiatingMessage != NULLP)
4875 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4876 if(resetReq->protocolIEs.list.array)
4878 for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4880 RIC_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4882 RIC_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4884 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4886 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4890 /*******************************************************************
4892 * @brief Build and send the reset request msg
4896 * Function : BuildAndSendResetRequest
4899 * - Buld and send the reset request msg to E2 node
4905 * @return ROK - success
4908 * ****************************************************************/
4909 uint8_t BuildAndSendResetRequest(DuDb *duDb, CauseE2_PR causePresent, uint8_t reason)
4911 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
4912 uint8_t ret = RFAILED;
4913 E2AP_PDU_t *e2apMsg = NULLP;
4914 ResetRequestE2_t *resetReq = NULLP;
4915 asn_enc_rval_t encRetVal; /* Encoder return value */
4917 DU_LOG("\nINFO --> E2AP : Building Reset Request\n");
4921 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4922 if(e2apMsg == NULLP)
4924 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for E2AP-PDU failed");
4928 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4929 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4930 if(e2apMsg->choice.initiatingMessage == NULLP)
4932 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for initiatingMessage");
4936 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
4937 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4938 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
4939 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4942 resetReq->protocolIEs.list.count = elementCnt;
4943 resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
4945 RIC_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4946 if(!resetReq->protocolIEs.list.array)
4948 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4949 Reset Request IE array");
4953 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4955 RIC_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4956 if(!resetReq->protocolIEs.list.array[ieIdx])
4958 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4959 Reset Request IE array element");
4964 /* In case of failure */
4965 if(ieIdx < elementCnt)
4969 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4970 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
4971 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
4972 transId = assignTransactionId(duDb);
4973 resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
4976 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4977 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
4978 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
4979 fillE2FailureCause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, causePresent, reason);
4981 /* Prints the Msg formed */
4982 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4984 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4986 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4988 if(encRetVal.encoded == ENCODE_FAIL)
4990 DU_LOG("\nERROR --> E2AP : Could not encode reset request structure (at %s)\n",\
4991 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4996 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for reset request\n");
4997 #ifdef DEBUG_ASN_PRINT
4998 for(int i=0; i< encBufSize; i++)
5000 printf("%x",encBuf[i]);
5004 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
5006 DU_LOG("\nERROR --> E2AP : Sending reset request failed");
5015 /* Free all memory */
5016 FreeResetRequest(e2apMsg);
5020 /******************************************************************
5022 * @brief Delete Ric subscription action
5026 * Function : deleteActionSequence
5028 * Functionality: Delete Ric subscription action
5030 * @params[in] Action info
5034 * ****************************************************************/
5035 void deleteActionSequence(CmLList *actionNode)
5037 ActionInfo *action = NULLP;
5041 action = (ActionInfo*)actionNode->node;
5042 memset(action, 0, sizeof(ActionInfo));
5043 RIC_FREE(actionNode->node, sizeof(ActionInfo));
5044 RIC_FREE(actionNode, sizeof(CmLList));
5048 /******************************************************************
5050 * @brief Delete Ric subscription action list
5054 * Function : deleteActionSequenceList
5056 * Functionality: Delete Ric subscription action list
5058 * @params[in] Action info list
5062 * ****************************************************************/
5063 void deleteActionSequenceList(CmLListCp *actionList)
5065 CmLList *actionNode=NULLP;
5067 CM_LLIST_FIRST_NODE(actionList, actionNode);
5070 cmLListDelFrm(actionList, actionNode);
5071 deleteActionSequence(actionNode);
5072 CM_LLIST_FIRST_NODE(actionList, actionNode);
5077 /******************************************************************
5079 * @brief Delete Ric subscription node
5083 * Function : deleteRicSubscriptionNode
5085 * Functionality: Delete Ric subscription node
5087 * @params[in] Ric subscription info
5091 * ****************************************************************/
5092 void deleteRicSubscriptionNode(CmLList *subscriptionNode)
5094 uint8_t actionIdx=0;
5095 RicSubscription *ricSubscriptionInfo = NULLP;
5097 ricSubscriptionInfo = (RicSubscription*)subscriptionNode->node;
5099 deleteActionSequenceList(&ricSubscriptionInfo->actionSequence);
5101 memset(ricSubscriptionInfo, 0, sizeof(RicSubscription));
5102 RIC_FREE(subscriptionNode->node, sizeof(RicSubscription));
5103 RIC_FREE(subscriptionNode, sizeof(CmLList));
5106 /*******************************************************************
5108 * @brief Delete RIC subscription List
5112 * Function : deleteRicSubscriptionList
5114 * Functionality: Delete RIC subscription list
5116 * @params[in] RIC Subscription list
5120 ******************************************************************/
5121 void deleteRicSubscriptionList(CmLListCp *subscriptionList)
5123 CmLList *subscriptionNode = NULLP;
5125 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
5126 while(subscriptionNode)
5128 cmLListDelFrm(subscriptionList, subscriptionNode);
5129 deleteRicSubscriptionNode(subscriptionNode);
5130 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
5134 /*******************************************************************
5136 * @brief process the E2 Reset Response
5140 * Function : ProcResetResponse
5142 * Functionality: Process E2 Reset Response
5146 * Pointer to reset response
5149 ******************************************************************/
5151 void ProcResetResponse(uint32_t duId, ResetResponseE2_t *resetRsp)
5153 uint8_t ieIdx = 0, duIdx =0;
5155 RanFunction *ranFuncDb = NULLP;
5156 uint16_t ranFuncIdx = 0;
5158 SEARCH_DU_DB(duIdx, duId, duDb);
5161 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
5167 DU_LOG("\nERROR --> E2AP : resetRsp pointer is null");
5171 if(!resetRsp->protocolIEs.list.array)
5173 DU_LOG("\nERROR --> E2AP : resetRsp array pointer is null");
5177 for(ieIdx=0; ieIdx < resetRsp->protocolIEs.list.count; ieIdx++)
5179 if(resetRsp->protocolIEs.list.array[ieIdx])
5181 switch(resetRsp->protocolIEs.list.array[ieIdx]->id)
5183 case ProtocolIE_IDE2_id_TransactionID:
5185 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
5187 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
5188 if(ranFuncDb->id > 0)
5190 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
5195 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
5205 /*******************************************************************
5207 * @brief process the E2 Reset Request
5211 * Function : ProcResetRequest
5213 * Functionality: Process E2 Reset Request
5217 * Pointer to reset response
5220 ******************************************************************/
5222 void ProcResetRequest(uint32_t duId, ResetRequestE2_t *resetReq)
5224 uint8_t ieIdx = 0, duIdx =0, transId=0;
5226 RanFunction *ranFuncDb = NULLP;
5227 uint16_t ranFuncIdx = 0;
5229 SEARCH_DU_DB(duIdx, duId, duDb);
5232 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
5238 DU_LOG("\nERROR --> E2AP : resetReq pointer is null");
5242 if(!resetReq->protocolIEs.list.array)
5244 DU_LOG("\nERROR --> E2AP : resetReq array pointer is null");
5248 for(ieIdx=0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
5250 if(resetReq->protocolIEs.list.array[ieIdx])
5252 switch(resetReq->protocolIEs.list.array[ieIdx]->id)
5254 case ProtocolIE_IDE2_id_TransactionID:
5256 transId = resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
5259 case ProtocolIE_IDE2_id_CauseE2:
5261 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
5263 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
5264 if(ranFuncDb->id > 0)
5266 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
5275 if(BuildAndSendResetResponse(duId, transId) !=ROK)
5277 DU_LOG("\nERROR --> E2AP : Failed to build and send reset response");
5281 /*******************************************************************
5283 * @brief Free RIC Subscription Delete Request Message
5287 * Function : FreeRicSubscriptionDeleteRequest
5289 * Functionality: Free RIC Subscription Delete Request
5291 * @param E2AP Message PDU
5294 ******************************************************************/
5295 void FreeRicSubscriptionDeleteRequest(E2AP_PDU_t *e2apMsg)
5297 uint8_t ieIdx = 0, arrIdx = 0;
5298 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
5302 if(e2apMsg->choice.initiatingMessage)
5304 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
5305 if(ricSubsDelReq->protocolIEs.list.array)
5307 for(ieIdx = 0; ieIdx < ricSubsDelReq->protocolIEs.list.count; ieIdx++)
5309 RIC_FREE(ricSubsDelReq->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequired_IEs_t));
5311 RIC_FREE(ricSubsDelReq->protocolIEs.list.array, ricSubsDelReq->protocolIEs.list.size);
5313 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5315 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));;
5319 /*******************************************************************
5321 * @brief Builds and Send RIC Subscription delete request
5325 * Function : BuildAndSendRicSubscriptionDeleteRequest
5327 * Functionality: Build and send RIC subscription delete request.
5330 * RIC subscription info to be deleted
5331 * @return ROK - success
5334 ******************************************************************/
5335 uint8_t BuildAndSendRicSubscriptionDeleteRequest(uint32_t duId, RicSubscription *ricSubsDb)
5337 uint8_t elementCnt = 0, ieIdx = 0, ret = RFAILED;
5338 E2AP_PDU_t *e2apMsg = NULLP;
5339 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
5340 RICsubscriptionDeleteRequest_IEs_t *ricSubsDelReqIe = NULLP;
5341 asn_enc_rval_t encRetVal; /* Encoder return value */
5345 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Delete Request Message\n");
5347 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5348 if(e2apMsg == NULLP)
5350 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
5354 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5355 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5356 if(e2apMsg->choice.initiatingMessage == NULLP)
5358 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
5361 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionDelete;
5362 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5363 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequest;
5365 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
5368 ricSubsDelReq->protocolIEs.list.count = elementCnt;
5369 ricSubsDelReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionDeleteRequest_IEs_t *);
5371 RIC_ALLOC(ricSubsDelReq->protocolIEs.list.array, ricSubsDelReq->protocolIEs.list.size);
5372 if(ricSubsDelReq->protocolIEs.list.array == NULLP)
5374 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for array elements at line %d",__func__, __LINE__);
5378 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
5380 RIC_ALLOC(ricSubsDelReq->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequest_IEs_t));
5381 if(ricSubsDelReq->protocolIEs.list.array[ieIdx] == NULLP)
5383 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for index [%d] at line %d", \
5384 __func__, ieIdx, __LINE__);
5388 if(ieIdx < elementCnt)
5391 /* RIC Request ID */
5393 ricSubsDelReqIe = ricSubsDelReq->protocolIEs.list.array[ieIdx];
5394 ricSubsDelReqIe->id = ProtocolIE_IDE2_id_RICrequestID;
5395 ricSubsDelReqIe->criticality = CriticalityE2_reject;
5396 ricSubsDelReqIe->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
5397 ricSubsDelReqIe->value.choice.RICrequestID.ricRequestorID = ricSubsDb->requestId.requestorId;
5398 ricSubsDelReqIe->value.choice.RICrequestID.ricInstanceID = ricSubsDb->requestId.instanceId;
5400 /* RAN Function ID */
5402 ricSubsDelReqIe = ricSubsDelReq->protocolIEs.list.array[ieIdx];
5403 ricSubsDelReqIe->id = ProtocolIE_IDE2_id_RANfunctionID;
5404 ricSubsDelReqIe->criticality = CriticalityE2_reject;
5405 ricSubsDelReqIe->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
5406 ricSubsDelReqIe->value.choice.RANfunctionID = ricSubsDb->ranFuncId;
5408 /* Prints the Msg formed */
5409 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5410 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5412 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
5413 if(encRetVal.encoded == ENCODE_FAIL)
5415 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Delete Request Message (at %s)\n",\
5416 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5421 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Delete Request Message \n");
5422 #ifdef DEBUG_ASN_PRINT
5423 for(int i=0; i< encBufSize; i++)
5425 printf("%x",encBuf[i]);
5430 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
5432 DU_LOG("\nERROR --> E2AP : Failed to send RIC Susbcription Delete Request Message");
5440 FreeRicSubscriptionDeleteRequest(e2apMsg);
5444 /*******************************************************************
5446 * @brief Processing of RIC Subscription Delete Required
5450 * Function : ProcRicSubsDeleteReqd
5452 * Functionality: Processing of RIC Subscription Delete Required
5453 * When received, RIC stub will initiate the RIC subscription
5454 * deletion procedure towards DU
5457 * RIC Subscription Delete Required IEs
5458 * @return ROK-success
5461 ******************************************************************/
5462 uint8_t ProcRicSubsDeleteReqd(uint32_t duId, RICsubscriptionDeleteRequired_t *ricSubsDelRqd)
5464 uint8_t ieIdx = 0, duIdx = 0;
5465 uint16_t arrIdx = 0;
5467 RicRequestId ricReqId;
5468 RanFunction *ranFuncDb = NULLP;
5469 RicSubscription *subsDb = NULLP;
5470 CmLList *ricSubsNode = NULLP;
5472 RICsubscriptionDeleteRequired_IEs_t *ricSubsDelRqdIe = NULLP;
5473 RICsubscription_List_withCause_t *ricSubsList = NULLP;
5474 RICsubscription_withCause_Item_t *subsItem = NULLP;
5476 memset(&ricReqId, 0, sizeof(RicRequestId));
5480 DU_LOG("\nERROR --> E2AP : %s: Received NULL message", __func__);
5484 SEARCH_DU_DB(duIdx, duId, duDb);
5487 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
5491 for(ieIdx = 0; ieIdx < ricSubsDelRqd->protocolIEs.list.count; ieIdx++)
5493 ricSubsDelRqdIe = ricSubsDelRqd->protocolIEs.list.array[ieIdx];
5494 switch(ricSubsDelRqdIe->id)
5496 case ProtocolIE_IDE2_id_RICsubscriptionToBeRemoved:
5498 ricSubsList = &ricSubsDelRqdIe->value.choice.RICsubscription_List_withCause;
5499 for(arrIdx = 0; arrIdx < ricSubsList->list.count; arrIdx++)
5501 subsItem = &(((RICsubscription_withCause_ItemIEs_t *)ricSubsList->list.array[arrIdx])->\
5502 value.choice.RICsubscription_withCause_Item);
5503 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, subsItem->ranFunctionID);
5506 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%ld] not found", __func__, subsItem->ranFunctionID);
5510 ricReqId.requestorId = subsItem->ricRequestID.ricRequestorID;
5511 ricReqId.instanceId = subsItem->ricRequestID.ricInstanceID;
5512 subsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
5515 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%ld] Instance_ID [%ld]", \
5516 __func__, subsItem->ricRequestID.ricRequestorID, subsItem->ricRequestID.ricInstanceID);
5520 /* Delete RIC Subcription from RAN Function */
5521 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
5523 /* Send RIC Subscription delete request and then free any memory
5524 * allocated to store subscription info at RIC */
5525 BuildAndSendRicSubscriptionDeleteRequest(duId, (RicSubscription *)ricSubsNode->node);
5526 deleteRicSubscriptionNode(ricSubsNode);
5539 /*******************************************************************
5541 * @brief Deallocate memory allocated for E2nodeConfigurationUpdate
5545 * Function : freeE2NodeConfigItem
5548 * - freeing the memory allocated for E2nodeConfigurationUpdate
5551 * uint8_t protocolIe
5552 * PTR to e2NodeCfg which is to be freed
5553 * @return ROK - success
5556 * ****************************************************************/
5558 void freeE2NodeConfigItem(uint8_t protocolIe, PTR e2NodeCfg)
5560 E2nodeComponentConfigurationAck_t *cfgAck =NULLP;
5561 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULLP;
5562 E2nodeComponentConfigAdditionAck_Item_t *e2NodeAdditionAckItemIe=NULLP;
5563 E2nodeComponentConfigRemovalAck_Item_t *e2NodeRemovalAckItemIe=NULLP;
5564 E2nodeComponentConfigUpdateAck_Item_t *e2NodeUpdateAckItemIe=NULLP;
5566 /* Extracting the component interface and configuration ack information from
5567 * e2NodeCfg based on the protocol id */
5570 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
5572 e2NodeAdditionAckItemIe= (E2nodeComponentConfigAdditionAck_Item_t*)e2NodeCfg;
5573 switch(e2NodeAdditionAckItemIe->e2nodeComponentInterfaceType)
5575 case E2nodeComponentInterfaceType_f1:
5577 f1InterfaceInfo = e2NodeAdditionAckItemIe->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
5586 cfgAck = &e2NodeAdditionAckItemIe->e2nodeComponentConfigurationAck;
5589 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
5591 e2NodeUpdateAckItemIe = (E2nodeComponentConfigUpdateAck_Item_t*)e2NodeCfg;
5592 switch(e2NodeUpdateAckItemIe->e2nodeComponentInterfaceType)
5594 case E2nodeComponentInterfaceType_f1:
5596 f1InterfaceInfo = e2NodeUpdateAckItemIe->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
5604 cfgAck = &e2NodeUpdateAckItemIe->e2nodeComponentConfigurationAck;
5607 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
5609 e2NodeRemovalAckItemIe= (E2nodeComponentConfigRemovalAck_Item_t*)e2NodeCfg;
5610 switch(e2NodeRemovalAckItemIe->e2nodeComponentInterfaceType)
5612 case E2nodeComponentInterfaceType_f1:
5614 f1InterfaceInfo = e2NodeRemovalAckItemIe->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
5622 cfgAck = &e2NodeRemovalAckItemIe->e2nodeComponentConfigurationAck;
5626 /* Freeing the memory allocated to component interface and configuration ack */
5629 RIC_FREE(f1InterfaceInfo->gNB_DU_ID.buf, f1InterfaceInfo->gNB_DU_ID.size);
5630 RIC_FREE(f1InterfaceInfo, sizeof(E2nodeComponentInterfaceF1_t));
5633 switch(cfgAck->updateOutcome)
5635 case E2nodeComponentConfigurationAck__updateOutcome_success:
5637 case E2nodeComponentConfigurationAck__updateOutcome_failure:
5639 RIC_FREE(cfgAck->failureCauseE2, sizeof(CauseE2_t));
5646 /*******************************************************************
5648 * @brief Deallocate the memory allocated for E2nodeConfigurationUpdate msg
5652 * Function : FreeE2NodeConfigUpdate
5655 * - freeing the memory allocated for E2nodeConfigurationUpdate
5657 * @params[in] E2AP_PDU_t *e2apMsg
5658 * @return ROK - success
5661 * ****************************************************************/
5663 void FreeE2NodeConfigUpdateAck(E2AP_PDU_t *e2apMsg)
5665 uint8_t arrIdx =0, e2NodeConfigIdx=0;
5666 E2nodeConfigurationUpdateAcknowledge_t *updateAckMsg=NULL;
5667 E2nodeComponentConfigUpdateAck_ItemIEs_t *updateAckItemIe=NULL;
5668 E2nodeComponentConfigUpdateAck_List_t *updateAckList=NULL;
5669 E2nodeComponentConfigRemovalAck_ItemIEs_t *removalAckItemIe=NULL;
5670 E2nodeComponentConfigRemovalAck_List_t *removalAckList=NULL;
5671 E2nodeComponentConfigAdditionAck_ItemIEs_t *additionAckItemIte=NULL;
5672 E2nodeComponentConfigAdditionAck_List_t *additionAckList=NULL;
5674 if(e2apMsg != NULLP)
5676 if(e2apMsg->choice.successfulOutcome != NULLP)
5678 updateAckMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2nodeConfigurationUpdateAcknowledge;
5679 if(updateAckMsg->protocolIEs.list.array != NULLP)
5681 for(arrIdx = 0; arrIdx < updateAckMsg->protocolIEs.list.count; arrIdx++)
5683 if(updateAckMsg->protocolIEs.list.array[arrIdx])
5685 switch(updateAckMsg->protocolIEs.list.array[arrIdx]->id)
5687 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
5689 additionAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
5690 if(additionAckList->list.array)
5692 for(e2NodeConfigIdx=0; e2NodeConfigIdx<additionAckList->list.count; e2NodeConfigIdx++)
5694 additionAckItemIte = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) additionAckList->list.array[e2NodeConfigIdx];
5695 if(additionAckItemIte)
5697 freeE2NodeConfigItem(ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck,\
5698 (PTR)&additionAckItemIte->value.choice.E2nodeComponentConfigAdditionAck_Item);
5699 RIC_FREE(additionAckItemIte, sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
5702 RIC_FREE(additionAckList->list.array, additionAckList->list.size);
5706 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
5708 updateAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdateAck_List;
5709 if(updateAckList->list.array)
5711 for(e2NodeConfigIdx=0; e2NodeConfigIdx<updateAckList->list.count; e2NodeConfigIdx++)
5713 updateAckItemIe = (E2nodeComponentConfigUpdateAck_ItemIEs_t*) updateAckList->list.array[e2NodeConfigIdx];
5716 freeE2NodeConfigItem(ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck,\
5717 (PTR)&updateAckItemIe->value.choice.E2nodeComponentConfigUpdateAck_Item);
5718 RIC_FREE(updateAckItemIe, sizeof(E2nodeComponentConfigUpdateAck_ItemIEs_t));
5721 RIC_FREE(updateAckList->list.array, updateAckList->list.size);
5725 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
5727 removalAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemovalAck_List;
5728 if(removalAckList->list.array)
5730 for(e2NodeConfigIdx=0; e2NodeConfigIdx<removalAckList->list.count; e2NodeConfigIdx++)
5732 removalAckItemIe = (E2nodeComponentConfigRemovalAck_ItemIEs_t*) removalAckList->list.array[e2NodeConfigIdx];
5733 if(removalAckItemIe)
5735 freeE2NodeConfigItem(ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck,\
5736 (PTR)&removalAckItemIe->value.choice.E2nodeComponentConfigRemovalAck_Item);
5737 RIC_FREE(removalAckItemIe, sizeof(E2nodeComponentConfigRemovalAck_ItemIEs_t));
5740 RIC_FREE(removalAckList->list.array, removalAckList->list.size);
5745 RIC_FREE(updateAckMsg->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateAcknowledge_IEs_t));
5748 RIC_FREE(updateAckMsg->protocolIEs.list.array, updateAckMsg->protocolIEs.list.size);
5750 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
5752 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5756 /*******************************************************************
5758 * @brief Build E2node Component config Removal ack list
5762 * Function : BuildE2nodeComponentConfigRemovalAck
5764 * Functionality: Build the e2 node remove ack
5767 * E2nodeComponentConfigRemovalAck_List_t to be filled
5768 * Count of e2 node to be removed
5769 * list of e2 node cfg to be removed
5771 * @return ROK - success
5773 * ****************************************************************/
5775 uint8_t BuildE2nodeComponentConfigRemovalAck(E2nodeComponentConfigRemovalAck_List_t *e2NodeConfigRemovalAckList,\
5776 uint16_t removalE2NodeCount, E2NodeConfigItem *removaldE2Node)
5779 E2nodeComponentConfigRemovalAck_ItemIEs_t *e2NodeRemovalAckItem=NULL;
5781 /* Filling the e2 node config removal ack list */
5782 e2NodeConfigRemovalAckList->list.count = removalE2NodeCount;
5783 e2NodeConfigRemovalAckList->list.size = e2NodeConfigRemovalAckList->list.count * sizeof(E2nodeComponentConfigRemovalAck_ItemIEs_t*);
5784 RIC_ALLOC(e2NodeConfigRemovalAckList->list.array, e2NodeConfigRemovalAckList->list.size);
5785 if(e2NodeConfigRemovalAckList->list.array == NULLP)
5787 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigRemovalAck %d",__LINE__);
5791 for(arrIdx = 0; arrIdx< e2NodeConfigRemovalAckList->list.count; arrIdx++)
5793 RIC_ALLOC(e2NodeConfigRemovalAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigRemovalAck_ItemIEs_t));
5794 if(e2NodeConfigRemovalAckList->list.array[arrIdx] == NULLP)
5796 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigRemovalAck %d",__LINE__);
5799 e2NodeRemovalAckItem = (E2nodeComponentConfigRemovalAck_ItemIEs_t*) e2NodeConfigRemovalAckList->list.array[arrIdx];
5800 e2NodeRemovalAckItem->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck_Item;
5801 e2NodeRemovalAckItem->criticality = CriticalityE2_reject;
5802 e2NodeRemovalAckItem->value.present = E2nodeComponentConfigRemovalAck_ItemIEs__value_PR_E2nodeComponentConfigRemovalAck_Item;
5804 /* Filling the e2 node config removal ack item */
5805 fillE2NodeConfigAck((PTR)&e2NodeRemovalAckItem->value.choice.E2nodeComponentConfigRemovalAck_Item, ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck,\
5806 &removaldE2Node[arrIdx].componentInfo, removaldE2Node[arrIdx].isSuccessful);
5811 /*******************************************************************
5813 * @brief Build E2node Component config update ack list
5817 * Function : BuildE2nodeComponentConfigUpdateAck
5819 * Functionality: Build E2node Component config update ack list
5822 * E2nodeComponentConfigUpdateAck_List to be filled
5823 * Count of e2 node to be update
5824 * list of e2 node cfg to be update
5826 * @return ROK - success
5828 * ****************************************************************/
5830 uint8_t BuildE2nodeComponentConfigUpdateAck(E2nodeComponentConfigUpdateAck_List_t *e2NodeConfigUpdateAckList,\
5831 uint16_t updatedE2NodeCount, E2NodeConfigItem *updatedE2Node)
5834 E2nodeComponentConfigUpdateAck_ItemIEs_t *e2NodeUpdateAckItem=NULL;
5836 /* Filling the e2 node config update ack list */
5837 e2NodeConfigUpdateAckList->list.count = updatedE2NodeCount;
5838 e2NodeConfigUpdateAckList->list.size = e2NodeConfigUpdateAckList->list.count * sizeof(E2nodeComponentConfigUpdateAck_ItemIEs_t*);
5839 RIC_ALLOC(e2NodeConfigUpdateAckList->list.array, e2NodeConfigUpdateAckList->list.size);
5840 if(e2NodeConfigUpdateAckList->list.array == NULLP)
5842 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
5846 for(arrIdx = 0; arrIdx< e2NodeConfigUpdateAckList->list.count; arrIdx++)
5848 RIC_ALLOC(e2NodeConfigUpdateAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigUpdateAck_ItemIEs_t));
5849 if(e2NodeConfigUpdateAckList->list.array[arrIdx] == NULLP)
5851 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
5854 e2NodeUpdateAckItem = (E2nodeComponentConfigUpdateAck_ItemIEs_t*) e2NodeConfigUpdateAckList->list.array[arrIdx];
5855 e2NodeUpdateAckItem->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck_Item;
5856 e2NodeUpdateAckItem->criticality = CriticalityE2_reject;
5857 e2NodeUpdateAckItem->value.present = E2nodeComponentConfigUpdateAck_ItemIEs__value_PR_E2nodeComponentConfigUpdateAck_Item;
5859 /* Filling the e2 node config update ack item */
5860 fillE2NodeConfigAck((PTR)&e2NodeUpdateAckItem->value.choice.E2nodeComponentConfigUpdateAck_Item, ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck,\
5861 &updatedE2Node[arrIdx].componentInfo, updatedE2Node[arrIdx].isSuccessful);
5867 /*******************************************************************
5869 * @brief Buld and send the E2 node config update ack msg
5873 * Function : BuildAndSendE2NodeConfigUpdateAck
5876 * - Buld and send the E2 node config update ack msg
5880 * list of E2 node cfg which needs to fill in IEs
5881 * @return ROK - success
5884 * ****************************************************************/
5886 uint8_t BuildAndSendE2NodeConfigUpdateAck(DuDb *duDb, uint8_t transId, E2NodeConfigList *e2NodeList)
5888 uint8_t ret = RFAILED;
5889 uint8_t arrIdx = 0,elementCnt = 0;
5890 E2AP_PDU_t *e2apMsg = NULLP;
5891 asn_enc_rval_t encRetVal;
5892 E2nodeConfigurationUpdateAcknowledge_t *e2NodeConfigUpdateAck = NULLP;
5894 DU_LOG("\nINFO --> E2AP : Building E2 Node config update Ack Message\n");
5897 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5898 if(e2apMsg == NULLP)
5900 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5903 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
5904 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
5905 if(e2apMsg->choice.successfulOutcome == NULLP)
5907 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5911 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
5912 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
5913 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateAcknowledge;
5914 e2NodeConfigUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.E2nodeConfigurationUpdateAcknowledge;
5917 if(e2NodeList->addedE2NodeCount)
5919 if(e2NodeList->updatedE2NodeCount)
5921 if(e2NodeList->removedE2NodeCount)
5924 e2NodeConfigUpdateAck->protocolIEs.list.count = elementCnt;
5925 e2NodeConfigUpdateAck->protocolIEs.list.size = elementCnt * sizeof(E2nodeConfigurationUpdateAcknowledge_IEs_t*);
5926 RIC_ALLOC(e2NodeConfigUpdateAck->protocolIEs.list.array, e2NodeConfigUpdateAck->protocolIEs.list.size);
5927 if(e2NodeConfigUpdateAck->protocolIEs.list.array == NULLP)
5929 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5933 for(arrIdx =0; arrIdx<elementCnt; arrIdx++)
5935 RIC_ALLOC(e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateAcknowledge_IEs_t));
5936 if(e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx] == NULLP)
5939 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5944 if(arrIdx<elementCnt)
5948 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
5949 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5950 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_TransactionID;
5951 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
5953 if(e2NodeList->addedE2NodeCount)
5956 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck;
5957 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5958 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigAdditionAck_List;
5959 if(BuildE2nodeComponentConfigAdditionAck(&e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List,\
5960 e2NodeList->addedE2NodeCount, e2NodeList->addedE2Node)!=ROK)
5963 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list");
5967 if(e2NodeList->updatedE2NodeCount)
5970 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck;
5971 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5972 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigUpdateAck_List;
5973 if(BuildE2nodeComponentConfigUpdateAck(&e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdateAck_List,\
5974 e2NodeList->updatedE2NodeCount, e2NodeList->updatedE2Node)!=ROK)
5977 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config update ack list");
5981 if(e2NodeList->removedE2NodeCount)
5984 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck;
5985 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5986 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigRemovalAck_List;
5987 if(BuildE2nodeComponentConfigRemovalAck(&e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemovalAck_List,\
5988 e2NodeList->removedE2NodeCount, e2NodeList->removedE2Node)!=ROK)
5991 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config removal ack list");
5995 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5997 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5999 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
6001 if(encRetVal.encoded == ENCODE_FAIL)
6003 DU_LOG("\nERROR --> E2AP : Could not encode E2 Node config update ack structure (at %s)\n",\
6004 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6009 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Node config update ack \n");
6010 for(int i=0; i< encBufSize; i++)
6012 DU_LOG("%x",encBuf[i]);
6018 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
6020 DU_LOG("\nERROR --> E2AP : Failed to send E2 Node config update ack ");
6027 FreeE2NodeConfigUpdateAck(e2apMsg);
6032 /******************************************************************
6034 * @brief Processes the E2 removal failure msg
6038 * Function : procE2RemovalFailure
6040 * Functionality: Processes the E2 removal failure msg
6043 * E2 Removal Failure information
6047 * ****************************************************************/
6048 void ProcE2RemovalFailure(E2RemovalFailure_t *e2RemovalFailure)
6050 uint8_t ieIdx = 0, transId=0;
6051 CauseE2_t *cause = NULLP;
6053 if(!e2RemovalFailure)
6055 DU_LOG("\nERROR --> E2AP : e2RemovalFailure pointer is null");
6059 if(!e2RemovalFailure->protocolIEs.list.array)
6061 DU_LOG("\nERROR --> E2AP : e2RemovalFailure array pointer is null");
6065 for(ieIdx=0; ieIdx < e2RemovalFailure->protocolIEs.list.count; ieIdx++)
6067 if(e2RemovalFailure->protocolIEs.list.array[ieIdx])
6069 switch(e2RemovalFailure->protocolIEs.list.array[ieIdx]->id)
6071 case ProtocolIE_IDE2_id_TransactionID:
6073 transId = e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
6074 DU_LOG("\nERROR --> E2AP : Received transID %d", transId);
6077 case ProtocolIE_IDE2_id_CauseE2:
6079 cause = &e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
6080 printE2ErrorCause(cause);
6085 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%d]", e2RemovalFailure->protocolIEs.list.array[ieIdx]->id);
6092 /*******************************************************************
6094 * @brief Delete E2 component node list
6098 * Function : deleteE2ComponentNodeList
6100 * Functionality: Delete E2 component node list
6102 * @params[in] E2 component node list
6106 ******************************************************************/
6108 void deleteE2ComponentNodeList(CmLListCp *componentList)
6110 E2NodeComponent *cfgInfo = NULLP;
6111 CmLList *e2ComponentNode = NULLP;
6113 CM_LLIST_FIRST_NODE(componentList, e2ComponentNode);
6114 while(e2ComponentNode)
6116 cfgInfo = (E2NodeComponent*)e2ComponentNode->node;
6117 cmLListDelFrm(componentList, e2ComponentNode);
6118 memset(cfgInfo, 0, sizeof(E2NodeComponent));
6119 CM_LLIST_FIRST_NODE(componentList, e2ComponentNode);
6123 /*******************************************************************
6125 * @brief process the E2 node information from ric db
6129 * Function : deleteE2NodeInfo
6131 * Functionality: process the E2 node information from ric db
6138 ******************************************************************/
6139 void deleteE2NodeInfo(DuDb *duDb)
6141 uint16_t ranFuncIdx =0;
6142 RanFunction *ranFuncDb=NULLP;
6144 DU_LOG("\nINFO --> E2AP : Removing all the E2 node information");
6145 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
6147 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
6148 if(ranFuncDb->id > 0)
6150 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
6153 deleteE2ComponentNodeList(&duDb->e2NodeComponent);
6156 /*******************************************************************
6158 * @brief process the E2 Removal Response
6162 * Function : ProcE2RemovalResponse
6164 * Functionality: Process E2 Removal Response
6168 * Pointer to removal response
6171 ******************************************************************/
6173 void ProcE2RemovalResponse(uint32_t duId, E2RemovalResponse_t *removalRsp)
6175 uint8_t ieIdx = 0, duIdx =0;
6178 SEARCH_DU_DB(duIdx, duId, duDb);
6181 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
6187 DU_LOG("\nERROR --> E2AP : removalRsp pointer is null");
6191 if(!removalRsp->protocolIEs.list.array)
6193 DU_LOG("\nERROR --> E2AP : removalRsp array pointer is null");
6197 for(ieIdx=0; ieIdx < removalRsp->protocolIEs.list.count; ieIdx++)
6199 if(removalRsp->protocolIEs.list.array[ieIdx])
6201 switch(removalRsp->protocolIEs.list.array[ieIdx]->id)
6203 case ProtocolIE_IDE2_id_TransactionID:
6205 DU_LOG("\nINFO --> E2AP : Sending request to close the sctp connection");
6206 cmInetClose(&sctpCb.e2LstnSockFd);
6207 deleteE2NodeInfo(duDb);
6212 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", removalRsp->protocolIEs.list.array[ieIdx]->id);
6219 /*******************************************************************
6221 * @brief Deallocate the memory allocated for E2 Removal Failure
6225 * Function : FreeE2RemovalFailure
6228 * - freeing the memory allocated for E2RemovalFailure
6230 * @params[in] E2AP_PDU_t *e2apMsg
6233 * ****************************************************************/
6234 void FreeE2RemovalFailure(E2AP_PDU_t *e2apMsg)
6237 E2RemovalFailure_t *e2RemovalFailure=NULLP;
6239 if(e2apMsg != NULLP)
6241 if(e2apMsg->choice.unsuccessfulOutcome != NULLP)
6243 e2RemovalFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2RemovalFailure;
6244 if(e2RemovalFailure->protocolIEs.list.array)
6246 for(ieIdx=0; ieIdx < e2RemovalFailure->protocolIEs.list.count; ieIdx++)
6248 if(e2RemovalFailure->protocolIEs.list.array[ieIdx])
6250 RIC_FREE(e2RemovalFailure->protocolIEs.list.array[ieIdx], sizeof(E2RemovalFailureIEs_t));
6253 RIC_FREE(e2RemovalFailure->protocolIEs.list.array, e2RemovalFailure->protocolIEs.list.size);
6255 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
6257 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6261 /*******************************************************************
6263 * @brief Buld and send the E2 Removal Failure msg
6267 * Function : BuildAndSendE2RemovalFailure
6270 * - Buld and send the E2 Removal Failure Message
6276 * @return ROK - success
6279 * ****************************************************************/
6281 uint8_t BuildAndSendRemovalFailure(uint32_t duId, uint16_t transId, CauseE2_PR causePresent, uint8_t reason)
6283 uint8_t ieIdx = 0, elementCnt = 0;
6284 uint8_t ret = RFAILED;
6285 E2AP_PDU_t *e2apMsg = NULLP;
6286 E2RemovalFailure_t *e2RemovalFailure=NULLP;
6287 asn_enc_rval_t encRetVal; /* Encoder return value */
6289 DU_LOG("\nINFO --> E2AP : Building E2 Removal Failure Message\n");
6292 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6293 if(e2apMsg == NULLP)
6295 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6298 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
6300 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
6301 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
6303 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6307 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2removal;
6308 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
6309 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2RemovalFailure;
6310 e2RemovalFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2RemovalFailure;
6313 e2RemovalFailure->protocolIEs.list.count = elementCnt;
6314 e2RemovalFailure->protocolIEs.list.size = elementCnt * sizeof(E2RemovalFailureIEs_t *);
6315 RIC_ALLOC(e2RemovalFailure->protocolIEs.list.array, e2RemovalFailure->protocolIEs.list.size);
6316 if(!e2RemovalFailure->protocolIEs.list.array)
6318 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6322 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6324 RIC_ALLOC(e2RemovalFailure->protocolIEs.list.array[ieIdx], sizeof(E2RemovalFailureIEs_t));
6325 if(!e2RemovalFailure->protocolIEs.list.array[ieIdx])
6327 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6331 if(ieIdx < elementCnt)
6335 e2RemovalFailure->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6336 e2RemovalFailure->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6337 e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.present = E2RemovalFailureIEs__value_PR_TransactionID;
6338 e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
6342 e2RemovalFailure->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
6343 e2RemovalFailure->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
6344 e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
6345 fillE2FailureCause(&e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, causePresent, reason);
6347 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6349 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6351 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6352 if(encRetVal.encoded == ENCODE_FAIL)
6354 DU_LOG("\nERROR --> E2AP : Could not encode E2 removal failure structure (at %s)\n",\
6355 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6360 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Removal Failure \n");
6361 for(int i=0; i< encBufSize; i++)
6363 DU_LOG("%x",encBuf[i]);
6368 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
6370 DU_LOG("\nERROR --> E2AP : Failed to send E2 Removal Failure");
6378 FreeE2RemovalFailure(e2apMsg);
6382 /*******************************************************************
6384 * @brief Deallocate the memory allocated for E2 Removal Response
6388 * Function : FreeE2RemovalResponse
6391 * - freeing the memory allocated for E2RemovalResponse
6393 * @params[in] E2AP_PDU_t *e2apMsg
6394 * @return ROK - success
6397 * ****************************************************************/
6398 void FreeE2RemovalResponse(E2AP_PDU_t *e2apMsg)
6401 E2RemovalResponse_t *e2RemovalResponse=NULLP;
6403 if(e2apMsg != NULLP)
6405 if(e2apMsg->choice.successfulOutcome != NULLP)
6407 e2RemovalResponse = &e2apMsg->choice.successfulOutcome->value.choice.E2RemovalResponse;
6408 if(e2RemovalResponse->protocolIEs.list.array)
6410 for(ieIdx=0; ieIdx < e2RemovalResponse->protocolIEs.list.count; ieIdx++)
6412 if(e2RemovalResponse->protocolIEs.list.array[ieIdx])
6414 RIC_FREE(e2RemovalResponse->protocolIEs.list.array[ieIdx], sizeof(E2RemovalResponseIEs_t));
6417 RIC_FREE(e2RemovalResponse->protocolIEs.list.array, e2RemovalResponse->protocolIEs.list.size);
6419 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6421 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6425 /*******************************************************************
6427 * @brief Buld and send the E2 Removal Response msg
6431 * Function : BuildAndSendE2RemovalResponse
6434 * - Buld and send the E2 Removal Response Message
6438 * @return ROK - success
6441 * ****************************************************************/
6442 uint8_t BuildAndSendRemovalResponse(uint32_t duId, uint16_t transId)
6444 uint8_t ieIdx = 0, elementCnt = 0;
6445 uint8_t ret = RFAILED, duIdx =0;
6446 E2AP_PDU_t *e2apMsg = NULLP;
6448 E2RemovalResponse_t *e2RemovalResponse=NULLP;
6449 asn_enc_rval_t encRetVal; /* Encoder return value */
6451 DU_LOG("\nINFO --> E2AP : Building E2 Removal Response Message\n");
6454 SEARCH_DU_DB(duIdx, duId, duDb);
6457 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
6461 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6462 if(e2apMsg == NULLP)
6464 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6467 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
6469 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6470 if(e2apMsg->choice.successfulOutcome == NULLP)
6472 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6476 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2removal;
6477 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
6478 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_E2RemovalResponse;
6479 e2RemovalResponse = &e2apMsg->choice.successfulOutcome->value.choice.E2RemovalResponse;
6482 e2RemovalResponse->protocolIEs.list.count = elementCnt;
6483 e2RemovalResponse->protocolIEs.list.size = elementCnt * sizeof(E2RemovalResponseIEs_t *);
6484 RIC_ALLOC(e2RemovalResponse->protocolIEs.list.array, e2RemovalResponse->protocolIEs.list.size);
6485 if(!e2RemovalResponse->protocolIEs.list.array)
6487 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6491 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6493 RIC_ALLOC(e2RemovalResponse->protocolIEs.list.array[ieIdx], sizeof(E2RemovalResponseIEs_t));
6494 if(!e2RemovalResponse->protocolIEs.list.array[ieIdx])
6496 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6500 if(ieIdx < elementCnt)
6504 e2RemovalResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6505 e2RemovalResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6506 e2RemovalResponse->protocolIEs.list.array[ieIdx]->value.present = E2RemovalResponseIEs__value_PR_TransactionID;
6507 e2RemovalResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
6509 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6511 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6513 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6514 if(encRetVal.encoded == ENCODE_FAIL)
6516 DU_LOG("\nERROR --> E2AP : Could not encode E2 removal response structure (at %s)\n",\
6517 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6522 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Removal Response \n");
6523 for(int i=0; i< encBufSize; i++)
6525 DU_LOG("%x",encBuf[i]);
6530 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
6532 DU_LOG("\nERROR --> E2AP : Failed to send E2 Removal Response");
6540 FreeE2RemovalResponse(e2apMsg);
6544 /*******************************************************************
6546 * @brief Process Removal req received from RIC
6550 * Function : procE2RemovalRequest
6552 * Functionality: Process Removal req received from RIC
6556 * E2 Removal Request
6559 ******************************************************************/
6561 void procE2RemovalRequest(uint32_t duId, E2RemovalRequest_t *removalReq)
6564 uint16_t transId =0;
6566 DU_LOG("\nINFO --> E2AP : E2 Removal request received");
6568 for(arrIdx=0; arrIdx<removalReq->protocolIEs.list.count; arrIdx++)
6570 switch(removalReq->protocolIEs.list.array[arrIdx]->id)
6572 case ProtocolIE_IDE2_id_TransactionID:
6574 transId = removalReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
6579 DU_LOG("\nERROR --> E2AP : Invalid IE recevied [%d]", transId);
6585 if(transId>=0 && transId<=255)
6587 if(BuildAndSendRemovalResponse(duId, transId) != ROK)
6589 DU_LOG("\nERROR --> E2AP : Failed to build and send Removal response");
6594 if(BuildAndSendRemovalFailure(duId, transId, CauseE2_PR_protocol, CauseE2Protocol_abstract_syntax_error_falsely_constructed_message) != ROK)
6596 DU_LOG("\nERROR --> E2AP : Failed to build and send Removal response");
6601 /*******************************************************************
6603 * @brief fill E2 connection update item
6607 * Function : fillE2connectionUpdateItem
6609 * Functionality: fill E2 connection update item
6612 * E2connectionUpdate Item to be filled
6614 * @return ROK - success
6616 * ****************************************************************/
6618 uint8_t fillE2connectionUpdateItem(PTR connectionInfo, uint8_t protocolId)
6620 E2connectionUpdateRemove_Item_t *connectionRemoveITem=NULLP;
6621 E2connectionUpdate_Item_t *connectionModifyItem=NULLP;
6622 TNLinformation_t *tnlInformation = NULLP;
6623 TNLusage_t *tnlUsage=NULLP;
6627 case ProtocolIE_IDE2_id_E2connectionUpdate_Item:
6629 connectionModifyItem = (E2connectionUpdate_Item_t*)connectionInfo;
6630 tnlInformation = &connectionModifyItem->tnlInformation;
6631 tnlUsage = &connectionModifyItem->tnlUsage;
6635 case ProtocolIE_IDE2_id_E2connectionUpdateRemove_Item:
6637 connectionRemoveITem = (E2connectionUpdateRemove_Item_t*)connectionInfo;
6638 tnlInformation= &connectionRemoveITem->tnlInformation;
6643 tnlInformation->tnlAddress.size = 4*sizeof(uint8_t);
6644 RIC_ALLOC(tnlInformation->tnlAddress.buf, tnlInformation->tnlAddress.size);
6645 if(!tnlInformation->tnlAddress.buf)
6647 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6651 tnlInformation->tnlAddress.buf[3] = ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr & 0xFF;
6652 tnlInformation->tnlAddress.buf[2] = (ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr>> 8) & 0xFF;
6653 tnlInformation->tnlAddress.buf[1] = (ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr>> 16) & 0xFF;
6654 tnlInformation->tnlAddress.buf[0] = (ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr>> 24) & 0xFF;
6655 tnlInformation->tnlAddress.bits_unused = 0;
6656 if(protocolId == ProtocolIE_IDE2_id_E2connectionUpdate_Item)
6658 *tnlUsage = TNLusage_support_function;
6663 /*******************************************************************
6665 * @brief Build E2 connection modification list
6669 * Function : BuildE2ConnectionModifyList
6671 * Functionality: Build E2 connection modification list
6674 * E2 connection modification list to be filled
6676 * @return ROK - success
6678 * ****************************************************************/
6680 uint8_t BuildE2ConnectionModifyList(E2connectionUpdate_List_t *connectionToBeModifyList)
6683 E2connectionUpdate_ItemIEs_t *connectionModify=NULL;
6685 connectionToBeModifyList->list.count = 1;
6687 connectionToBeModifyList->list.size = connectionToBeModifyList->list.count*sizeof(E2connectionUpdate_ItemIEs_t*);
6688 RIC_ALLOC(connectionToBeModifyList->list.array, connectionToBeModifyList->list.size);
6689 if(connectionToBeModifyList->list.array)
6691 for(arrIdx = 0; arrIdx< connectionToBeModifyList->list.count; arrIdx++)
6693 RIC_ALLOC(connectionToBeModifyList->list.array[arrIdx], sizeof(E2connectionUpdate_ItemIEs_t));
6694 if(connectionToBeModifyList->list.array[arrIdx] == NULLP)
6696 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6699 connectionModify = (E2connectionUpdate_ItemIEs_t*)connectionToBeModifyList->list.array[arrIdx];
6700 connectionModify->id = ProtocolIE_IDE2_id_E2connectionUpdate_Item;
6701 connectionModify->criticality= CriticalityE2_ignore;
6702 connectionModify->value.present = E2connectionUpdate_ItemIEs__value_PR_E2connectionUpdate_Item;
6703 if(fillE2connectionUpdateItem((PTR)&connectionModify->value.choice.E2connectionUpdate_Item, ProtocolIE_IDE2_id_E2connectionUpdate_Item) != ROK)
6705 DU_LOG("\nERROR --> E2AP : Failed to fill E2 connection update item");
6713 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6719 /*******************************************************************
6721 * @brief Build E2 connection remove list
6725 * Function : BuildE2ConnectionRemoveList
6727 * Functionality: Build E2 connection remove list
6730 * E2 connection remove list to be filled
6732 * @return ROK - success
6734 * ****************************************************************/
6736 uint8_t BuildE2ConnectionRemoveList(E2connectionUpdateRemove_List_t *connectionToBeRemoveList)
6739 E2connectionUpdateRemove_ItemIEs_t *connectionRemove=NULL;
6741 connectionToBeRemoveList->list.count = 1;
6743 connectionToBeRemoveList->list.size = connectionToBeRemoveList->list.count*sizeof(E2connectionUpdateRemove_ItemIEs_t*);
6744 RIC_ALLOC(connectionToBeRemoveList->list.array, connectionToBeRemoveList->list.size);
6745 if(connectionToBeRemoveList->list.array)
6747 for(arrIdx = 0; arrIdx< connectionToBeRemoveList->list.count; arrIdx++)
6749 RIC_ALLOC(connectionToBeRemoveList->list.array[arrIdx], sizeof(E2connectionUpdateRemove_ItemIEs_t));
6750 if(connectionToBeRemoveList->list.array[arrIdx] == NULLP)
6752 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6755 connectionRemove = (E2connectionUpdateRemove_ItemIEs_t*)connectionToBeRemoveList->list.array[arrIdx];
6756 connectionRemove->id = ProtocolIE_IDE2_id_E2connectionUpdateRemove_Item;
6757 connectionRemove->criticality= CriticalityE2_ignore;
6758 connectionRemove->value.present = E2connectionUpdateRemove_ItemIEs__value_PR_E2connectionUpdateRemove_Item;
6759 if(fillE2connectionUpdateItem((PTR)&connectionRemove->value.choice.E2connectionUpdateRemove_Item, ProtocolIE_IDE2_id_E2connectionUpdateRemove_Item) != ROK)
6761 DU_LOG("\nERROR --> E2AP : Failed to fill E2 connection update item");
6769 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6775 /*******************************************************************
6777 * @brief Deallocate the memory allocated for E2ConnectionUpdate msg
6781 * Function : FreeE2ConnectionUpdate
6784 * - freeing the memory allocated for E2ConnectionUpdate
6786 * @params[in] E2AP_PDU_t *e2apMsg
6787 * @return ROK - success
6790 * ****************************************************************/
6791 void FreeE2ConnectionUpdate(E2AP_PDU_t *e2apMsg)
6793 uint8_t ieIdx =0, arrIdx=0;
6794 E2connectionUpdate_t *connectionUpdate = NULLP;
6795 E2connectionUpdate_List_t *connectionToBeModifyList = NULLP;
6796 E2connectionUpdateRemove_List_t *connectionToBeRemoveList = NULLP;
6798 if(e2apMsg != NULLP)
6800 if(e2apMsg->choice.initiatingMessage != NULLP)
6802 connectionUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2connectionUpdate;
6803 if(connectionUpdate->protocolIEs.list.array)
6805 for(ieIdx = 0; ieIdx < connectionUpdate->protocolIEs.list.count; ieIdx++)
6807 if(connectionUpdate->protocolIEs.list.array[ieIdx])
6809 switch(connectionUpdate->protocolIEs.list.array[ieIdx]->id)
6811 case ProtocolIE_IDE2_id_TransactionID:
6814 case ProtocolIE_IDE2_id_E2connectionUpdateModify:
6816 connectionToBeModifyList = &connectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdate_List;
6817 if(connectionToBeModifyList->list.array)
6819 for(arrIdx = 0; arrIdx < connectionToBeModifyList->list.count; arrIdx++)
6821 RIC_FREE(connectionToBeModifyList->list.array[arrIdx], sizeof(E2connectionUpdate_ItemIEs_t));
6823 RIC_FREE(connectionToBeModifyList->list.array, connectionToBeModifyList->list.size);
6828 case ProtocolIE_IDE2_id_E2connectionUpdateRemove:
6830 connectionToBeRemoveList = &connectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdateRemove_List;
6831 if(connectionToBeRemoveList->list.array)
6833 for(arrIdx = 0; arrIdx < connectionToBeRemoveList->list.count; arrIdx++)
6835 RIC_FREE(connectionToBeRemoveList->list.array[arrIdx], sizeof(E2connectionUpdateRemove_ItemIEs_t));
6837 RIC_FREE(connectionToBeRemoveList->list.array, connectionToBeRemoveList->list.size);
6842 RIC_FREE(connectionUpdate->protocolIEs.list.array[ieIdx], sizeof(E2connectionUpdate_IEs_t));
6845 RIC_FREE(connectionUpdate->protocolIEs.list.array, connectionUpdate->protocolIEs.list.size);
6847 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
6849 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6853 /*******************************************************************
6855 * @brief Buld and send the E2 Connection Update msg
6859 * Function : BuildAndSendE2ConnectionUpdate
6862 * - Buld and send the E2 Connection Update Message
6865 * E2 connection to be modify or delete
6866 * @return ROK - success
6869 * ****************************************************************/
6871 uint8_t BuildAndSendE2ConnectionUpdate(uint32_t duId, E2Connection connectionInfo)
6873 uint8_t ieIdx = 0, elementCnt = 0;
6874 uint8_t ret = RFAILED, duIdx =0;
6876 E2AP_PDU_t *e2apMsg = NULLP;
6877 E2connectionUpdate_t *e2ConnectionUpdate=NULLP;
6878 asn_enc_rval_t encRetVal; /* Encoder return value */
6880 DU_LOG("\nINFO --> E2AP : Building E2 Connection Update Message\n");
6883 SEARCH_DU_DB(duIdx, duId, duDb);
6886 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
6890 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6891 if(e2apMsg == NULLP)
6893 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6896 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
6898 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
6899 if(e2apMsg->choice.initiatingMessage == NULLP)
6901 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6905 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2connectionUpdate;
6906 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
6907 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2connectionUpdate;
6908 e2ConnectionUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2connectionUpdate;
6911 if(connectionInfo == MODIFY_CONNECTION)
6913 if(connectionInfo == REMOVE_CONNECTION)
6916 e2ConnectionUpdate->protocolIEs.list.count = elementCnt;
6917 e2ConnectionUpdate->protocolIEs.list.size = elementCnt * sizeof(E2connectionUpdate_IEs_t*);
6918 RIC_ALLOC(e2ConnectionUpdate->protocolIEs.list.array, e2ConnectionUpdate->protocolIEs.list.size);
6919 if(!e2ConnectionUpdate->protocolIEs.list.array)
6921 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6925 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6927 RIC_ALLOC(e2ConnectionUpdate->protocolIEs.list.array[ieIdx], sizeof(E2connectionUpdate_IEs_t));
6928 if(!e2ConnectionUpdate->protocolIEs.list.array[ieIdx])
6930 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6934 if(ieIdx < elementCnt)
6938 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6939 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6940 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.present = E2connectionUpdate_IEs__value_PR_TransactionID;
6941 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = assignTransactionId(duDb);
6943 if(connectionInfo == MODIFY_CONNECTION)
6946 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_E2connectionUpdateModify;
6947 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6948 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.present = E2connectionUpdate_IEs__value_PR_E2connectionUpdate_List;
6949 if(BuildE2ConnectionModifyList(&e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdate_List) != ROK)
6951 DU_LOG("\nERROR --> E2AP : Failed to build the connection update modify list");
6956 if(connectionInfo == REMOVE_CONNECTION)
6959 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_E2connectionUpdateRemove;
6960 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6961 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.present = E2connectionUpdate_IEs__value_PR_E2connectionUpdateRemove_List;
6962 if(BuildE2ConnectionRemoveList(&e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdateRemove_List) != ROK)
6964 DU_LOG("\nERROR --> E2AP : Failed to build the connection update modify list");
6969 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6971 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6973 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6974 if(encRetVal.encoded == ENCODE_FAIL)
6976 DU_LOG("\nERROR --> E2AP : Could not encode E2 connection update structure (at %s)\n",\
6977 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6982 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Connection Update \n");
6983 for(int i=0; i< encBufSize; i++)
6985 DU_LOG("%x",encBuf[i]);
6990 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
6992 DU_LOG("\nERROR --> E2AP : Failed to send E2 Connection Update");
7000 FreeE2ConnectionUpdate(e2apMsg);
7004 /******************************************************************
7006 * @brief Processes the E2 connection update failure msg
7010 * Function : procE2connectionUpdateFailure
7012 * Functionality: Processes the E2 connection update failure msg
7015 * E2 connection update failure information
7019 * ****************************************************************/
7020 void ProcE2connectionUpdateFailure(E2connectionUpdateFailure_t *updateFailure)
7024 CauseE2_t *cause = NULLP;
7028 DU_LOG("\nERROR --> E2AP : updateFailure pointer is null");
7032 if(!updateFailure->protocolIEs.list.array)
7034 DU_LOG("\nERROR --> E2AP : updateFailure array pointer is null");
7038 for(ieIdx=0; ieIdx < updateFailure->protocolIEs.list.count; ieIdx++)
7040 if(updateFailure->protocolIEs.list.array[ieIdx])
7042 switch(updateFailure->protocolIEs.list.array[ieIdx]->id)
7044 case ProtocolIE_IDE2_id_TransactionID:
7046 transId = updateFailure->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
7047 DU_LOG("\nERROR --> E2AP : Received transID %d", transId);
7050 case ProtocolIE_IDE2_id_CauseE2:
7052 cause = &updateFailure->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
7053 printE2ErrorCause(cause);
7058 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%d]", updateFailure->protocolIEs.list.array[ieIdx]->id);
7066 /*******************************************************************
7068 * @brief process the E2 Connection update ack
7072 * Function : ProcE2ConnectionUpdateAck
7074 * Functionality: Process E2 Connection update ack
7078 * Pointer to Connection update ack
7081 ******************************************************************/
7083 void ProcE2ConnectionUpdateAck(uint32_t duId, E2connectionUpdateAcknowledge_t *connectionUpdateAck)
7085 uint16_t transId =0;
7086 uint32_t ipAddress=0;
7088 uint8_t ieIdx = 0, duIdx =0, arrIdx=0;
7089 E2connectionUpdate_Item_t *connectionSetupItem=NULLP;
7090 E2connectionUpdate_ItemIEs_t *connectionSetupItemIe=NULLP;
7091 E2connectionUpdate_List_t *connectionSetupList=NULLP;
7092 E2connectionSetupFailed_Item_t *setupFailedItem =NULLP;
7093 E2connectionSetupFailed_List_t *setupFailedList=NULLP;
7094 E2connectionSetupFailed_ItemIEs_t *setupFailedItemIe =NULLP;
7096 SEARCH_DU_DB(duIdx, duId, duDb);
7099 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
7103 if(!connectionUpdateAck)
7105 DU_LOG("\nERROR --> E2AP : connectionUpdateAck pointer is null");
7109 if(!connectionUpdateAck->protocolIEs.list.array)
7111 DU_LOG("\nERROR --> E2AP : connectionUpdateAck array pointer is null");
7115 for(ieIdx=0; ieIdx < connectionUpdateAck->protocolIEs.list.count; ieIdx++)
7117 if(connectionUpdateAck->protocolIEs.list.array[ieIdx])
7119 switch(connectionUpdateAck->protocolIEs.list.array[ieIdx]->id)
7121 case ProtocolIE_IDE2_id_TransactionID:
7123 transId = connectionUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
7126 DU_LOG("\nERROR --> E2AP : Received invalid trans id %d ",transId);
7131 case ProtocolIE_IDE2_id_E2connectionSetup:
7133 connectionSetupList=&connectionUpdateAck->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdate_List;
7134 if(connectionSetupList->list.array)
7136 for(arrIdx = 0; arrIdx< connectionSetupList->list.count; arrIdx++)
7138 connectionSetupItemIe = (E2connectionUpdate_ItemIEs_t*)connectionSetupList->list.array[arrIdx];
7139 connectionSetupItem = &connectionSetupItemIe->value.choice.E2connectionUpdate_Item;
7140 bitStringToInt(&connectionSetupItem->tnlInformation.tnlAddress, &ipAddress);
7141 if(ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr == ipAddress)
7143 ricCb.ricCfgParams.sctpParams.usage = connectionSetupItem->tnlUsage;
7150 case ProtocolIE_IDE2_id_E2connectionSetupFailed:
7152 setupFailedList=&connectionUpdateAck->protocolIEs.list.array[ieIdx]->value.choice.E2connectionSetupFailed_List;
7153 if(setupFailedList->list.array)
7155 for(arrIdx = 0; arrIdx< setupFailedList->list.count; arrIdx++)
7157 setupFailedItemIe = (E2connectionSetupFailed_ItemIEs_t*)setupFailedList->list.array[arrIdx];
7158 setupFailedItem = &setupFailedItemIe->value.choice.E2connectionSetupFailed_Item;
7159 printE2ErrorCause(&setupFailedItem->cause);
7166 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", connectionUpdateAck->protocolIEs.list.array[ieIdx]->id);
7174 /******************************************************************
7176 * @brief Processes the Ric Subs delete failure msg
7180 * Function : procRicSubsDeleteFailure
7182 * Functionality: Processes the Ric Subs delete failure msg
7185 * Ric Subs delete failure information
7189 * ****************************************************************/
7190 void ProcRicSubsDeleteFailure(RICsubscriptionDeleteFailure_t *ricSubsDeleteFail)
7193 uint16_t ranFuncId=0;
7194 CauseE2_t *cause = NULLP;
7195 RICrequestID_t ricRequestID;
7197 if(!ricSubsDeleteFail)
7199 DU_LOG("\nERROR --> E2AP : ricSubsDeleteFail pointer is null");
7203 if(!ricSubsDeleteFail->protocolIEs.list.array)
7205 DU_LOG("\nERROR --> E2AP : ricSubsDeleteFail array pointer is null");
7209 for(ieIdx=0; ieIdx < ricSubsDeleteFail->protocolIEs.list.count; ieIdx++)
7211 if(ricSubsDeleteFail->protocolIEs.list.array[ieIdx])
7213 switch(ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->id)
7215 case ProtocolIE_IDE2_id_RICrequestID:
7217 memcpy(&ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID, &ricRequestID, sizeof(RICrequestID_t));
7218 DU_LOG("\nERROR --> E2AP : Received RicReqId %ld and InstanceId %ld", ricRequestID.ricRequestorID, ricRequestID.ricInstanceID);
7221 case ProtocolIE_IDE2_id_RANfunctionID:
7223 ranFuncId = ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->value.choice.RANfunctionID;
7224 DU_LOG("\nERROR --> E2AP : Received ranfuncId %d", ranFuncId);
7227 case ProtocolIE_IDE2_id_CauseE2:
7229 cause = &ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
7230 printE2ErrorCause(cause);
7235 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->id);
7244 /******************************************************************
7246 * @brief Processes the Ric Subs delete rsp msg
7250 * Function : ProcRicSubsDeleteRsp
7252 * Functionality: Processes the Ric Subs delete rsp msg
7255 * Ric Subs delete rsp information
7259 * ****************************************************************/
7260 void ProcRicSubsDeleteRsp(uint32_t duId, RICsubscriptionDeleteResponse_t *ricSubsDeleteRsp)
7264 uint16_t ranFuncId=0;
7265 RanFunction *ranFuncDb = NULLP;
7266 RicRequestId ricReqId;
7268 RicSubscription *ricSubs = NULLP;
7269 CmLList *ricSubsNode = NULLP;
7271 SEARCH_DU_DB(duIdx, duId, duDb);
7274 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
7278 if(!ricSubsDeleteRsp)
7280 DU_LOG("\nERROR --> E2AP : ricSubsDeleteRsp pointer is null");
7284 if(!ricSubsDeleteRsp->protocolIEs.list.array)
7286 DU_LOG("\nERROR --> E2AP : ricSubsDeleteRsp array pointer is null");
7289 for(ieIdx=0; ieIdx < ricSubsDeleteRsp->protocolIEs.list.count; ieIdx++)
7291 if(ricSubsDeleteRsp->protocolIEs.list.array[ieIdx])
7293 switch(ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->id)
7295 case ProtocolIE_IDE2_id_RICrequestID:
7297 ricReqId.requestorId = ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID.ricRequestorID;
7298 ricReqId.instanceId = ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID.ricInstanceID;
7301 case ProtocolIE_IDE2_id_RANfunctionID:
7303 ranFuncId = ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->value.choice.RANfunctionID;
7304 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
7307 DU_LOG("\nERROR --> E2AP : Invalid Ran Function id %d received",ranFuncId);
7311 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
7314 deleteRicSubscriptionNode(ricSubsNode);
7315 DU_LOG("\nINFO --> E2AP : Ric subscription node deleted successfully");
7319 DU_LOG("\nERROR --> E2AP : Ric subscription node is not present ");
7330 /******************************************************************
7332 * @brief Processes the Ric Subs modification failure msg
7336 * Function : procRicSubsModificationFailure
7338 * Functionality: Processes the Ric Subs modification failure msg
7341 * Ric Subs modification failure information
7345 * ****************************************************************/
7346 void ProcRicSubsModificationFailure(RICsubscriptionModificationFailure_t *ricSubsModificationFail)
7349 uint16_t ranFuncId=0;
7350 CauseE2_t *cause = NULLP;
7351 RICrequestID_t ricRequestID;
7353 DU_LOG("\nINFO --> E2AP : Ric subscription modification failure received");
7355 if(!ricSubsModificationFail)
7357 DU_LOG("\nERROR --> E2AP : ricSubsModificationFail pointer is null");
7361 if(!ricSubsModificationFail->protocolIEs.list.array)
7363 DU_LOG("\nERROR --> E2AP : ricSubsModificationFail array pointer is null");
7367 for(ieIdx=0; ieIdx < ricSubsModificationFail->protocolIEs.list.count; ieIdx++)
7369 if(ricSubsModificationFail->protocolIEs.list.array[ieIdx])
7371 switch(ricSubsModificationFail->protocolIEs.list.array[ieIdx]->id)
7373 case ProtocolIE_IDE2_id_RICrequestID:
7375 memcpy(&ricSubsModificationFail->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID, &ricRequestID, sizeof(RICrequestID_t));
7376 DU_LOG("\nERROR --> E2AP : Received RicReqId %ld and InstanceId %ld", ricRequestID.ricRequestorID, ricRequestID.ricInstanceID);
7379 case ProtocolIE_IDE2_id_RANfunctionID:
7381 ranFuncId = ricSubsModificationFail->protocolIEs.list.array[ieIdx]->value.choice.RANfunctionID;
7382 DU_LOG("\nERROR --> E2AP : Received ranfuncId %d", ranFuncId);
7385 case ProtocolIE_IDE2_id_CauseE2:
7387 cause = &ricSubsModificationFail->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
7388 printE2ErrorCause(cause);
7393 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", ricSubsModificationFail->protocolIEs.list.array[ieIdx]->id);
7401 /*******************************************************************
7403 * @brief Free RIC Subscription action to be added list
7407 * Function : FreeRicSubsActionToBeAdded
7409 * Functionality: Free the RIC Subscription action to be added list
7411 * @params[in] RICactions_ToBeAddedForModification_List_t *subsDetails
7414 * ****************************************************************/
7415 void FreeRicSubsActionToBeAdded(RICactions_ToBeAddedForModification_List_t *subsDetails)
7417 uint8_t elementIdx = 0;
7418 RICaction_ToBeAddedForModification_ItemIEs_t *addedActionItemIe=NULLP;
7420 if(subsDetails->list.array)
7422 for(elementIdx = 0; elementIdx < subsDetails->list.count; elementIdx++)
7424 if(subsDetails->list.array[elementIdx])
7426 addedActionItemIe = (RICaction_ToBeAddedForModification_ItemIEs_t*)subsDetails->list.array[elementIdx];
7427 RIC_FREE(addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionDefinition.buf, \
7428 addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionDefinition.size);
7429 RIC_FREE(subsDetails->list.array[elementIdx], sizeof(RICaction_ToBeAddedForModification_ItemIEs_t));
7432 RIC_FREE(subsDetails->list.array, subsDetails->list.size);
7436 /*******************************************************************
7438 * @brief Free RIC Subscription action to be removed list
7442 * Function : FreeRicSubsActionToBeRemoved
7444 * Functionality: Free the RIC Subscription action to be removed list
7446 * @params[in] RICactions_ToBeRemovedForModification_List_t *subsDetails
7449 * ****************************************************************/
7450 void FreeRicSubsActionToBeRemoved(RICactions_ToBeRemovedForModification_List_t *subsDetails)
7452 uint8_t elementIdx = 0;
7454 if(subsDetails->list.array)
7456 for(elementIdx = 0; elementIdx < subsDetails->list.count; elementIdx++)
7458 RIC_FREE(subsDetails->list.array[elementIdx], sizeof(RICaction_ToBeRemovedForModification_ItemIEs_t));
7460 RIC_FREE(subsDetails->list.array, subsDetails->list.size);
7464 /*******************************************************************
7466 * @brief Free RIC Subscription action to be modify
7470 * Function : FreeRicSubsActionToBeModified
7472 * Functionality: Free the RIC Subscription action to be modify
7474 * @params[in] RICactions_ToBeModifiedForModification_List_t List
7477 * ****************************************************************/
7478 void FreeRicSubsActionToBeModified(RICactions_ToBeModifiedForModification_List_t *subsDetails)
7480 uint8_t elementIdx = 0;
7481 RICaction_ToBeModifiedForModification_ItemIEs_t *actionItem = NULLP;
7483 if(subsDetails->list.array)
7485 for(elementIdx = 0; elementIdx < subsDetails->list.count; elementIdx++)
7487 if(subsDetails->list.array[elementIdx])
7489 actionItem = (RICaction_ToBeModifiedForModification_ItemIEs_t *)subsDetails->list.array[elementIdx];
7490 if(actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition)
7492 RIC_FREE(actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition->buf, \
7493 actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition->size);
7494 RIC_FREE(actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
7496 RIC_FREE(subsDetails->list.array[elementIdx], sizeof(RICaction_ToBeModifiedForModification_ItemIEs_t))
7499 RIC_FREE(subsDetails->list.array, subsDetails->list.size);
7503 /*******************************************************************
7505 * @brief Free RIC Subscription modification Request
7509 * Function :FreeRicSubscriptionModReq
7511 * Functionality : Free RIC Subscription modification Request
7513 * @params[in] E2AP_PDU
7516 ******************************************************************/
7517 void FreeRicSubscriptionModReq(E2AP_PDU_t *e2apRicMsg)
7520 RICsubscriptionModificationRequest_t *ricSubscriptionModReq =NULLP;
7521 RICsubscriptionModificationRequest_IEs_t *ricSubscriptionModReqIe=NULLP;
7525 if(e2apRicMsg->choice.initiatingMessage)
7527 ricSubscriptionModReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequest;
7528 if(ricSubscriptionModReq->protocolIEs.list.array)
7530 for(idx=0; idx < ricSubscriptionModReq->protocolIEs.list.count; idx++)
7532 if(ricSubscriptionModReq->protocolIEs.list.array[idx])
7534 ricSubscriptionModReqIe = ricSubscriptionModReq->protocolIEs.list.array[idx];
7535 switch(ricSubscriptionModReq->protocolIEs.list.array[idx]->id)
7537 case ProtocolIE_IDE2_id_RICrequestID:
7539 case ProtocolIE_IDE2_id_RANfunctionID:
7541 case ProtocolIE_IDE2_id_RICactionsToBeRemovedForModification_List:
7543 FreeRicSubsActionToBeRemoved(&(ricSubscriptionModReqIe->value.choice.RICactions_ToBeRemovedForModification_List));
7546 case ProtocolIE_IDE2_id_RICactionsToBeModifiedForModification_List:
7548 FreeRicSubsActionToBeModified(&(ricSubscriptionModReqIe->value.choice.RICactions_ToBeModifiedForModification_List));
7551 case ProtocolIE_IDE2_id_RICactionsToBeAddedForModification_List:
7553 FreeRicSubsActionToBeAdded(&(ricSubscriptionModReqIe->value.choice.RICactions_ToBeAddedForModification_List));
7558 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", ricSubscriptionModReq->protocolIEs.list.array[idx]->id);
7564 RIC_FREE(ricSubscriptionModReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionModificationRequest_IEs_t));
7567 RIC_FREE(ricSubscriptionModReq->protocolIEs.list.array, ricSubscriptionModReq->protocolIEs.list.size);
7569 RIC_FREE(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
7571 RIC_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
7575 /*******************************************************************
7577 * @brief Build Ric subscription action to be modify list
7581 * Function : BuildRicSubsActionToBeModify
7583 * Functionality: Build Ric subscription action to be modify list
7586 * RICactions_ToBeModifiedForModification_List_t to be filled
7587 * Num of action to be modify
7588 * List of action to be modify
7590 * @return ROK - success
7593 ******************************************************************/
7595 uint8_t BuildRicSubsActionToBeModify(RICactions_ToBeModifiedForModification_List_t *modifyActionList, uint8_t numOfActionToBeModify, ActionInfo *actionToBeModify)
7598 RICaction_ToBeModifiedForModification_ItemIEs_t *modifiedActionItemIe=NULLP;
7600 modifyActionList->list.count = numOfActionToBeModify;
7601 modifyActionList->list.size = modifyActionList->list.count * sizeof(RICaction_ToBeModifiedForModification_ItemIEs_t*);
7602 RIC_ALLOC(modifyActionList->list.array, modifyActionList->list.size);
7603 if(!modifyActionList->list.array)
7605 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7609 for(arrIdx = 0; arrIdx< modifyActionList->list.count; arrIdx++)
7611 RIC_ALLOC(modifyActionList->list.array[arrIdx], sizeof(RICaction_ToBeModifiedForModification_ItemIEs_t));
7612 if(!modifyActionList->list.array[arrIdx])
7614 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7617 modifiedActionItemIe = (RICaction_ToBeModifiedForModification_ItemIEs_t*)modifyActionList->list.array[arrIdx];
7618 modifiedActionItemIe->id = ProtocolIE_IDE2_id_RICaction_ToBeModifiedForModification_Item;
7619 modifiedActionItemIe->criticality = CriticalityE2_ignore;
7620 modifiedActionItemIe->value.present = RICaction_ToBeModifiedForModification_ItemIEs__value_PR_RICaction_ToBeModifiedForModification_Item;
7621 modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionID = actionToBeModify[arrIdx].actionId;
7623 /* RIC Action Definition */
7624 RIC_ALLOC(modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
7625 if(!modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition)
7627 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7631 if(fillRicActionDef(modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition,\
7632 actionToBeModify[arrIdx].actionId, CONFIG_MOD) != ROK)
7634 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7642 /*******************************************************************
7644 * @brief Build Ric subscription action to be removed list
7648 * Function : BuildRicSubsActionToBeRemoved
7650 * Functionality: Build Ric subscription action to be removed list
7653 * RICactions_ToBeRemovedForModification_List_t to be filled
7654 * Num Of Action To Be Remove
7655 * Action remove list
7657 * @return ROK - success
7660 ******************************************************************/
7662 uint8_t BuildRicSubsActionToBeRemoved(RICactions_ToBeRemovedForModification_List_t *removeActionList, uint8_t numOfActionToBeRemove, ActionInfo *actionToBeRemove)
7665 RICaction_ToBeRemovedForModification_ItemIEs_t *removeActionItemIe=NULLP;
7667 removeActionList->list.count = numOfActionToBeRemove;
7668 removeActionList->list.size = removeActionList->list.count * sizeof(RICaction_ToBeRemovedForModification_ItemIEs_t*);
7669 RIC_ALLOC(removeActionList->list.array, removeActionList->list.size);
7670 if(!removeActionList->list.array)
7672 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7676 for(arrIdx = 0; arrIdx< removeActionList->list.count; arrIdx++)
7678 RIC_ALLOC(removeActionList->list.array[arrIdx], sizeof(RICaction_ToBeRemovedForModification_ItemIEs_t));
7679 if(!removeActionList->list.array[arrIdx])
7681 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7684 removeActionItemIe = (RICaction_ToBeRemovedForModification_ItemIEs_t*)removeActionList->list.array[arrIdx];
7685 removeActionItemIe->id = ProtocolIE_IDE2_id_RICaction_ToBeRemovedForModification_Item;
7686 removeActionItemIe->criticality = CriticalityE2_ignore;
7687 removeActionItemIe->value.present = RICaction_ToBeRemovedForModification_ItemIEs__value_PR_RICaction_ToBeRemovedForModification_Item;
7688 removeActionItemIe->value.choice.RICaction_ToBeRemovedForModification_Item.ricActionID = actionToBeRemove[arrIdx].actionId;
7693 /*******************************************************************
7695 * @brief Build Ric subscription action to be added list
7699 * Function : BuildRicSubsActionToBeAdded
7701 * Functionality: Build Ric subscription action to be added list
7704 * RICactions_ToBeAddedForModification_List_t to be filled
7705 * Num Of Action To Be added
7708 * @return ROK - success
7711 ******************************************************************/
7713 uint8_t BuildRicSubsActionToBeAdded(RICactions_ToBeAddedForModification_List_t *addedActionList, RicSubscription **ricSubsInfo, uint8_t numOfActionToBeAdded, ActionInfo *actionToBeAdded)
7716 CmLList *actionNode=NULLP;
7717 RICaction_ToBeAddedForModification_ItemIEs_t *addedActionItemIe;
7719 addedActionList->list.count = numOfActionToBeAdded;
7720 addedActionList->list.size = addedActionList->list.count * sizeof(RICaction_ToBeAddedForModification_ItemIEs_t*);
7721 RIC_ALLOC(addedActionList->list.array, addedActionList->list.size);
7722 if(!addedActionList->list.array)
7724 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7728 for(arrIdx = 0; arrIdx< addedActionList->list.count; arrIdx++)
7730 RIC_ALLOC(addedActionList->list.array[arrIdx], sizeof(RICaction_ToBeAddedForModification_ItemIEs_t));
7731 if(!addedActionList->list.array[arrIdx])
7733 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7736 addedActionItemIe = (RICaction_ToBeAddedForModification_ItemIEs_t*)addedActionList->list.array[arrIdx];
7737 addedActionItemIe->id = ProtocolIE_IDE2_id_RICaction_ToBeAddedForModification_Item;
7738 addedActionItemIe->criticality = CriticalityE2_ignore;
7739 addedActionItemIe->value.present = RICaction_ToBeAddedForModification_ItemIEs__value_PR_RICaction_ToBeAddedForModification_Item;
7740 addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionID = actionToBeAdded[arrIdx].actionId;
7742 addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionType = RICactionType_report;
7744 if(fillRicActionDef(&addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionDefinition, \
7745 actionToBeAdded[arrIdx].actionId, CONFIG_ADD) != ROK)
7747 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7751 actionNode = addRicSubsAction((*ricSubsInfo)->actionSequence.count, &(*ricSubsInfo)->actionSequence);
7752 if(actionNode == NULLP)
7754 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7761 /*******************************************************************
7763 * @brief Builds and Send the RicSubscriptionModReq
7767 * Function : BuildAndSendRicSubscriptionModReq
7769 * Functionality:Builds and Send the RicSubscriptionModReq
7773 * Ric subs information
7774 * List of ric subs action which needs to modify/add/remove
7775 * @return ROK - success
7778 ******************************************************************/
7780 uint8_t BuildAndSendRicSubscriptionModReq(DuDb *duDb, RicSubscription **ricSubsInfo, RicSubsModReq ricSubsModReq)
7782 uint8_t ret = RFAILED;
7783 uint8_t elementCnt = 0;
7784 uint8_t idx = 0, cfgIdx=0;
7785 asn_enc_rval_t encRetVal; /* Encoder return value */
7786 E2AP_PDU_t *e2apRicMsg = NULL;
7787 RICsubscriptionModificationRequest_t *ricSubscriptionModReq;
7788 RanFunction *ranFuncDb = &duDb->ranFunction[0];
7789 CmLList *subscriptionNode = NULLP;
7791 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n");
7795 RIC_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
7796 if(e2apRicMsg == NULLP)
7798 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7802 e2apRicMsg->present = E2AP_PDU_PR_initiatingMessage;
7803 RIC_ALLOC(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
7804 if(e2apRicMsg->choice.initiatingMessage == NULLP)
7806 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7809 e2apRicMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionModification;
7810 e2apRicMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
7811 e2apRicMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionModificationRequest;
7813 ricSubscriptionModReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequest;
7815 /* Increasing the elment count based on the number of configured action to be add, mod, delete */
7817 if(ricSubsModReq.numOfActionToBeAdded)
7819 if(ricSubsModReq.numOfActionToBeModify)
7821 if(ricSubsModReq.numOfActionToBeRemove)
7824 ricSubscriptionModReq->protocolIEs.list.count = elementCnt;
7825 ricSubscriptionModReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRequest_IEs_t);
7827 /* Initialize the subscription members */
7828 RIC_ALLOC(ricSubscriptionModReq->protocolIEs.list.array, ricSubscriptionModReq->protocolIEs.list.size);
7829 if(ricSubscriptionModReq->protocolIEs.list.array == NULLP)
7831 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7835 for(idx=0; idx<elementCnt; idx++)
7837 RIC_ALLOC(ricSubscriptionModReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionModificationRequest_IEs_t));
7838 if(ricSubscriptionModReq->protocolIEs.list.array[idx] == NULLP)
7840 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7844 if(idx < elementCnt)
7847 /* Filling RIC Request Id */
7849 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
7850 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
7851 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present =\
7852 RICsubscriptionModificationRequest_IEs__value_PR_RICrequestID;
7853 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = (*ricSubsInfo)->requestId.requestorId;
7854 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = (*ricSubsInfo)->requestId.instanceId;
7856 /* Filling RAN Function Id */
7858 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
7859 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
7860 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present =\
7861 RICsubscriptionModificationRequest_IEs__value_PR_RANfunctionID;
7862 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID = (*ricSubsInfo)->ranFuncId;
7864 if(ricSubsModReq.numOfActionToBeRemove)
7866 /* Filling RIC Subscription action to be removed */
7868 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionsToBeRemovedForModification_List;
7869 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_ignore;
7870 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present = RICsubscriptionModificationRequest_IEs__value_PR_RICactions_ToBeRemovedForModification_List;
7871 if(BuildRicSubsActionToBeRemoved(&ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICactions_ToBeRemovedForModification_List,\
7872 ricSubsModReq.numOfActionToBeRemove, ricSubsModReq.actionToBeRemove) != ROK)
7874 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7878 if(ricSubsModReq.numOfActionToBeModify)
7880 /* Filling RIC Subscription action to be modified */
7882 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionsToBeModifiedForModification_List;
7883 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_ignore;
7884 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present = RICsubscriptionModificationRequest_IEs__value_PR_RICactions_ToBeModifiedForModification_List;
7885 if(BuildRicSubsActionToBeModify(&ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICactions_ToBeModifiedForModification_List,\
7886 ricSubsModReq.numOfActionToBeModify, ricSubsModReq.actionToBeModify) != ROK)
7888 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7893 if(ricSubsModReq.numOfActionToBeAdded)
7895 /* Filling RIC Subscription action to be added */
7897 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionsToBeAddedForModification_List;
7898 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_ignore;
7899 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present = RICsubscriptionModificationRequest_IEs__value_PR_RICactions_ToBeAddedForModification_List;
7900 if(BuildRicSubsActionToBeAdded(&ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICactions_ToBeAddedForModification_List,\
7901 ricSubsInfo, ricSubsModReq.numOfActionToBeAdded, ricSubsModReq.actionToBeAdded) != ROK)
7903 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7908 /* Prints the Msg formed */
7909 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
7911 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7913 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
7914 if(encRetVal.encoded == ENCODE_FAIL)
7916 DU_LOG("\nERROR --> E2AP : Could not encode RicSubscriptionModRequest structure (at %s)\n",\
7917 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7922 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicSubscriptionModRequest\n");
7923 for(int i=0; i< encBufSize; i++)
7925 DU_LOG("%x",encBuf[i]);
7930 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
7932 DU_LOG("\nERROR --> E2AP : Sending RIC subscription Request failed");
7940 FreeRicSubscriptionModReq(e2apRicMsg);
7944 /*******************************************************************
7946 * @brief Builds RicSubscriptionModReq
7950 * Function : BuildRicSubscriptionModReq
7952 * Functionality:Builds the RicSubscriptionModReq
7958 * ****************************************************************/
7960 void BuildRicSubsModificationReq(DuDb *duDb, RicSubscription *ricSubsInfo)
7962 CmLList *actionNode=NULLP;
7963 uint8_t actionToBeAdded =0;
7964 uint8_t actionIdx =0, tmpActionIdx=0;
7965 ActionInfo *actionInfoDb = NULLP;
7966 RicSubsModReq ricSubsModReq;
7970 memset(&ricSubsModReq, 0, sizeof(RicSubsModReq));
7973 CM_LLIST_FIRST_NODE(&ricSubsInfo->actionSequence, actionNode);
7976 actionInfoDb = (ActionInfo*)(actionNode->node);
7977 /* Change the condition based on the action required to be modiified or removed */
7978 if(((actionInfoDb->actionId+1)%2) == 0)
7980 tmpActionIdx = ricSubsModReq.numOfActionToBeModify;
7981 ricSubsModReq.actionToBeModify[tmpActionIdx].actionId = actionInfoDb->actionId;
7982 ricSubsModReq.numOfActionToBeModify++;
7986 tmpActionIdx = ricSubsModReq.numOfActionToBeRemove;
7987 ricSubsModReq.actionToBeRemove[tmpActionIdx].actionId = actionInfoDb->actionId;
7988 ricSubsModReq.numOfActionToBeRemove++;
7990 actionNode= actionNode->next;
7992 /* Change the value of actionToBeAdded based on the number of action required to be added */
7994 tmpActionIdx = ricSubsInfo->actionSequence.count;
7995 for(actionIdx=0; actionIdx<actionToBeAdded; actionIdx++)
7997 ricSubsModReq.actionToBeAdded[actionIdx].actionId = tmpActionIdx;
7998 ricSubsModReq.numOfActionToBeAdded++;
8002 if(BuildAndSendRicSubscriptionModReq(duDb, &ricSubsInfo, ricSubsModReq) != ROK)
8004 DU_LOG("\nERROR --> E2AP : failed to build and send RIC Subscription Modification");
8010 /****************************************************************
8012 * @brief Processing RIC Subscription action modified list
8016 * Function :ProcessingRicSubsActionModified
8018 * Functionality: Processing the RIC Subscription action modified list
8020 * @params[in] RICactions_AddedForModification_List_t
8023 * ****************************************************************/
8024 void ProcessingRicSubsActionModified(RICactions_ModifiedForModification_List_t *actionModifiedList)
8027 uint8_t elementIdx = 0;
8028 ActionInfo *action=NULLP;
8029 CmLList *actionNode =NULLP;
8030 RICaction_ModifiedForModification_ItemIEs_t *modifiedActionItemIe =NULLP;
8032 if(actionModifiedList->list.array)
8034 for(elementIdx = 0; elementIdx < actionModifiedList->list.count; elementIdx++)
8036 if(actionModifiedList->list.array[elementIdx])
8038 modifiedActionItemIe=(RICaction_ModifiedForModification_ItemIEs_t*)actionModifiedList->list.array[elementIdx];
8039 actionId = modifiedActionItemIe->value.choice.RICaction_ModifiedForModification_Item.ricActionID;
8040 DU_LOG("\nInfo --> E2AP : Action id %d modified successfully", actionId);
8048 /****************************************************************
8050 * @brief Processing RIC Subscription action added list
8054 * Function : ProcessingRicSubsActionAdded
8056 * Functionality: Processing RIC Subscription action added list
8058 * @params[in] RICactions_AddedForModification_List_t
8061 * ****************************************************************/
8062 void ProcessingRicSubsActionAdded(RICactions_AddedForModification_List_t *actionAddedList)
8065 uint8_t elementIdx = 0;
8066 ActionInfo *action=NULLP;
8067 CmLList *actionNode =NULLP;
8068 RICaction_AddedForModification_ItemIEs_t *addedActionItemIe =NULLP;
8070 if(actionAddedList->list.array)
8072 for(elementIdx = 0; elementIdx < actionAddedList->list.count; elementIdx++)
8074 if(actionAddedList->list.array[elementIdx])
8076 addedActionItemIe=(RICaction_AddedForModification_ItemIEs_t*)actionAddedList->list.array[elementIdx];
8077 actionId = addedActionItemIe->value.choice.RICaction_AddedForModification_Item.ricActionID;
8078 DU_LOG("\nInfo --> E2AP : Action id %d added successfully", actionId);
8086 /****************************************************************
8088 * @brief Processing RIC Subscription action deleted list
8092 * Function : ProcessingRicSubsActionRemoved
8094 * Functionality: Processing RIC Subscription action deleted list
8096 * @params[in] RICactions_RemovedForModification_List_t
8097 * Ric Subscription info
8100 * ****************************************************************/
8101 void ProcessingRicSubsActionRemoved(RICactions_RemovedForModification_List_t *actionRemovedList, RicSubscription *ricSubs)
8104 uint8_t elementIdx = 0;
8105 ActionInfo *action=NULLP;
8106 CmLList *actionNode =NULLP;
8107 RICaction_RemovedForModification_ItemIEs_t *removedActionItemIe =NULLP;
8109 if(actionRemovedList->list.array)
8111 for(elementIdx = 0; elementIdx < actionRemovedList->list.count; elementIdx++)
8113 if(actionRemovedList->list.array[elementIdx])
8115 removedActionItemIe=(RICaction_RemovedForModification_ItemIEs_t*)actionRemovedList->list.array[elementIdx];
8116 actionId = removedActionItemIe->value.choice.RICaction_RemovedForModification_Item.ricActionID;
8117 action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode);
8120 cmLListDelFrm(&ricSubs->actionSequence, actionNode);
8121 deleteActionSequence(actionNode);
8122 DU_LOG("\nInfo --> E2AP : Action id %d removed successfully", actionId);
8131 /*******************************************************************
8133 * @brief Processing RIC Subscription action failed to be
8138 * Function : ProcessingRicSubsActionFailedToBeRemoved
8140 * Functionality: Processing the RIC Subscription action failed
8141 * to be removed list
8143 * @params[in] RICactions_FailedToBeRemovedForModification_List_t
8146 * ****************************************************************/
8147 void ProcessingRicSubsActionFailedToBeRemoved(RICactions_FailedToBeRemovedForModification_List_t *actionFailedToBeRemoved)
8150 uint8_t elementIdx = 0;
8151 RICaction_FailedToBeRemovedForModification_ItemIEs_t *failedToBeRemovedActionItemIe =NULLP;
8153 if(actionFailedToBeRemoved->list.array)
8155 for(elementIdx = 0; elementIdx < actionFailedToBeRemoved->list.count; elementIdx++)
8157 if(actionFailedToBeRemoved->list.array[elementIdx])
8159 failedToBeRemovedActionItemIe=(RICaction_FailedToBeRemovedForModification_ItemIEs_t*)actionFailedToBeRemoved->list.array[elementIdx];
8160 actionId = failedToBeRemovedActionItemIe->value.choice.RICaction_FailedToBeRemovedForModification_Item.ricActionID;
8161 DU_LOG("\nERROR --> E2AP : Failed to remove action id %d in %s", actionId, __func__);
8162 printE2ErrorCause(&failedToBeRemovedActionItemIe->value.choice.RICaction_FailedToBeRemovedForModification_Item.cause);
8170 /****************************************************************
8172 * @brief Processing RIC Subscription action failed to be
8177 * Function : ProcessingRicSubsActionFailedToBeAdded
8179 * Functionality: Processing the RIC Subscription action failed
8182 * @params[in] RICactions_FailedToBeAddedForModification_List_t
8185 * ****************************************************************/
8186 void ProcessingRicSubsActionFailedToBeAdded(RICactions_FailedToBeAddedForModification_List_t *actionfailedToBeAddedList, RicSubscription *ricSubs)
8189 uint8_t elementIdx = 0;
8190 ActionInfo *action=NULLP;
8191 CmLList *actionNode =NULLP;
8192 RICaction_FailedToBeAddedForModification_ItemIEs_t *failedToBeAddedActionItemIe =NULLP;
8194 if(actionfailedToBeAddedList->list.array)
8196 for(elementIdx = 0; elementIdx < actionfailedToBeAddedList->list.count; elementIdx++)
8198 if(actionfailedToBeAddedList->list.array[elementIdx])
8200 failedToBeAddedActionItemIe=(RICaction_FailedToBeAddedForModification_ItemIEs_t*)actionfailedToBeAddedList->list.array[elementIdx];
8201 actionId = failedToBeAddedActionItemIe->value.choice.RICaction_FailedToBeAddedForModification_Item.ricActionID;
8202 action = fetchActionInfoFromActionId(actionId, ricSubs, &actionNode);
8205 cmLListDelFrm(&ricSubs->actionSequence, actionNode);
8206 deleteActionSequence(actionNode);
8208 DU_LOG("\nERROR --> E2AP : Failed to remove action id %d in %s", actionId,__func__);
8209 printE2ErrorCause(&failedToBeAddedActionItemIe->value.choice.RICaction_FailedToBeAddedForModification_Item.cause);
8217 /*******************************************************************
8219 * @brief Processing RIC Subscription action failed to be
8224 * Function :ProcessingRicSubsActionFailedToBeModified
8226 * Functionality: Processing the RIC Subscription action failed
8227 * to be modified list
8229 * @params[in] RICactions_FailedToBeModifiedForModification_List_t
8232 * ****************************************************************/
8233 void ProcessingRicSubsActionFailedToBeModified(RICactions_FailedToBeModifiedForModification_List_t *actionFailedToBeModifiedList)
8236 uint8_t elementIdx = 0;
8237 RICaction_FailedToBeModifiedForModification_ItemIEs_t *failedToBeModifiedActionItemIe =NULLP;
8239 if(actionFailedToBeModifiedList->list.array)
8241 for(elementIdx = 0; elementIdx < actionFailedToBeModifiedList->list.count; elementIdx++)
8243 if(actionFailedToBeModifiedList->list.array[elementIdx])
8245 failedToBeModifiedActionItemIe=(RICaction_FailedToBeModifiedForModification_ItemIEs_t*)actionFailedToBeModifiedList->list.array[elementIdx];
8246 actionId = failedToBeModifiedActionItemIe->value.choice.RICaction_FailedToBeModifiedForModification_Item.ricActionID;
8247 DU_LOG("\nERROR --> E2AP : Failed to remove action id %d in %s", actionId,__func__);
8248 printE2ErrorCause(&failedToBeModifiedActionItemIe->value.choice.RICaction_FailedToBeModifiedForModification_Item.cause);
8256 /******************************************************************
8258 * @brief Processes the Ric Subs modification rsp msg
8262 * Function : ProcRicSubsModificationRsp
8264 * Functionality: Processes the Ric Subs modification rsp msg
8267 * Ric Subs modification rsp information
8271 * ****************************************************************/
8272 void ProcRicSubsModificationRsp(uint32_t duId, RICsubscriptionModificationResponse_t *ricSubsModificationRsp)
8276 uint16_t ranFuncId=0;
8277 RanFunction *ranFuncDb = NULLP;
8278 RicRequestId ricReqId;
8280 RicSubscription *ricSubs = NULLP;
8281 CmLList *ricSubsNode = NULLP;
8283 SEARCH_DU_DB(duIdx, duId, duDb);
8286 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
8290 if(!ricSubsModificationRsp)
8292 DU_LOG("\nERROR --> E2AP : ricSubsModificationRsp pointer is null");
8296 if(!ricSubsModificationRsp->protocolIEs.list.array)
8298 DU_LOG("\nERROR --> E2AP : ricSubsModificationRsp array pointer is null");
8302 for(ieIdx=0; ieIdx < ricSubsModificationRsp->protocolIEs.list.count; ieIdx++)
8304 if(ricSubsModificationRsp->protocolIEs.list.array[ieIdx])
8306 switch(ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->id)
8308 case ProtocolIE_IDE2_id_RICrequestID:
8310 ricReqId.requestorId = ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID.ricRequestorID;
8311 ricReqId.instanceId = ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID.ricInstanceID;
8314 case ProtocolIE_IDE2_id_RANfunctionID:
8316 ranFuncId = ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RANfunctionID;
8317 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
8320 DU_LOG("\nERROR --> E2AP : Invalid Ran Function id %d received",ranFuncId);
8324 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
8327 DU_LOG("\nERROR --> E2AP : Ric subscription node is not present ");
8332 case ProtocolIE_IDE2_id_RICactionsRemovedForModification_List:
8334 ProcessingRicSubsActionRemoved(&ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICactions_RemovedForModification_List, ricSubs);
8337 case ProtocolIE_IDE2_id_RICactionsFailedToBeRemovedForModification_List:
8339 ProcessingRicSubsActionFailedToBeRemoved(&ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICactions_FailedToBeRemovedForModification_List);
8342 case ProtocolIE_IDE2_id_RICactionsModifiedForModification_List:
8344 ProcessingRicSubsActionModified(&ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICactions_ModifiedForModification_List);
8347 case ProtocolIE_IDE2_id_RICactionsFailedToBeModifiedForModification_List:
8349 ProcessingRicSubsActionFailedToBeModified(&ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICactions_FailedToBeModifiedForModification_List);
8352 case ProtocolIE_IDE2_id_RICactionsAddedForModification_List:
8354 ProcessingRicSubsActionAdded(&ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICactions_AddedForModification_List);
8357 case ProtocolIE_IDE2_id_RICactionsFailedToBeAddedForModification_List:
8359 ProcessingRicSubsActionFailedToBeAdded(&ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->value.choice.RICactions_FailedToBeAddedForModification_List, ricSubs);
8364 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", ricSubsModificationRsp->protocolIEs.list.array[ieIdx]->id);
8372 /*******************************************************************
8374 * @brief Handles received E2AP message and sends back response
8378 * Function : E2APMsgHdlr
8381 * - Decodes received E2AP control message
8382 * - Prepares response message, encodes and sends to SCTP
8385 * @return ROK - success
8388 * ****************************************************************/
8389 void E2APMsgHdlr(uint32_t *duId, Buffer *mBuf)
8395 E2AP_PDU_t *e2apMsg;
8396 asn_dec_rval_t rval; /* Decoder return value */
8397 E2AP_PDU_t e2apasnmsg ;
8399 DU_LOG("\nINFO --> E2AP : Received E2AP message buffer");
8400 ODU_PRINT_MSG(mBuf, 0,0);
8402 /* Copy mBuf into char array to decode it */
8403 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8404 RIC_ALLOC(recvBuf, (Size)recvBufLen);
8406 if(recvBuf == NULLP)
8408 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
8411 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8413 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
8417 DU_LOG("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
8418 for(i=0; i< recvBufLen; i++)
8420 DU_LOG("%x",recvBuf[i]);
8423 /* Decoding flat buffer into E2AP messsage */
8424 e2apMsg = &e2apasnmsg;
8425 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
8427 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
8428 RIC_FREE(recvBuf, (Size)recvBufLen);
8430 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8432 DU_LOG("\nERROR --> E2AP : ASN decode failed");
8436 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
8438 switch(e2apMsg->present)
8440 case E2AP_PDU_PR_initiatingMessage:
8442 switch(e2apMsg->choice.initiatingMessage->value.present)
8444 case InitiatingMessageE2__value_PR_E2setupRequest:
8446 DU_LOG("\nINFO --> E2AP : E2 setup request received");
8447 ProcE2SetupReq(duId, &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest);
8450 case InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate:
8452 DU_LOG("\nINFO --> E2AP : E2 node config update received");
8453 ProcE2NodeConfigUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate);
8456 case InitiatingMessageE2__value_PR_ResetRequestE2:
8458 DU_LOG("\nINFO --> E2AP : E2 Reset Request received");
8459 ProcResetRequest(*duId, &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2);
8462 case InitiatingMessageE2__value_PR_RICindication:
8464 DU_LOG("\nINFO --> E2AP : RIC Indication received");
8467 case InitiatingMessageE2__value_PR_RICserviceUpdate:
8469 DU_LOG("\nINFO --> E2AP : RIC Service update received");
8470 ProcRicServiceUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate);
8473 case InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired:
8475 DU_LOG("\nINFO --> E2AP : RIC Subscription Modification Required");
8476 ProcRicSubsModReqd(*duId, \
8477 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired);
8480 case InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequired:
8482 DU_LOG("\nINFO --> E2AP : RIC Subscription Delete Required");
8483 ProcRicSubsDeleteReqd(*duId, \
8484 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequired);
8488 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
8490 DU_LOG("\nINFO --> E2AP : Error indication received");
8493 case InitiatingMessageE2__value_PR_E2RemovalRequest:
8495 DU_LOG("\nINFO --> E2AP : E2 Removal request received");
8496 procE2RemovalRequest(*duId,\
8497 &e2apMsg->choice.initiatingMessage->value.choice.E2RemovalRequest);
8502 DU_LOG("\nERROR --> E2AP : Invalid type of intiating message [%d]", \
8503 e2apMsg->choice.initiatingMessage->value.present);
8506 }/* End of switch(initiatingMessage) */
8509 case E2AP_PDU_PR_successfulOutcome:
8511 switch(e2apMsg->choice.successfulOutcome->value.present)
8513 case SuccessfulOutcomeE2__value_PR_ResetResponseE2:
8515 DU_LOG("\nINFO --> E2AP : Reset response received");
8516 ProcResetResponse(*duId, &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2);
8519 case SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse:
8521 ProcRicSubscriptionResponse(*duId, \
8522 &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse);
8525 case SuccessfulOutcomeE2__value_PR_E2RemovalResponse:
8527 ProcE2RemovalResponse(*duId, &e2apMsg->choice.successfulOutcome->value.choice.E2RemovalResponse);
8530 case SuccessfulOutcomeE2__value_PR_E2connectionUpdateAcknowledge:
8532 ProcE2ConnectionUpdateAck(*duId, &e2apMsg->choice.successfulOutcome->value.choice.E2connectionUpdateAcknowledge);
8535 case SuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteResponse:
8537 ProcRicSubsDeleteRsp(*duId, &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionDeleteResponse);
8540 case SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationResponse:
8542 ProcRicSubsModificationRsp(*duId, &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationResponse);
8547 DU_LOG("\nERROR --> E2AP : Invalid type of successfulOutcome message [%d]", \
8548 e2apMsg->choice.successfulOutcome->value.present);
8555 case E2AP_PDU_PR_unsuccessfulOutcome:
8557 switch(e2apMsg->choice.successfulOutcome->value.present)
8559 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure:
8561 ProcRicSubscriptionFailure(*duId, \
8562 &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure);
8565 case UnsuccessfulOutcomeE2__value_PR_E2RemovalFailure:
8567 ProcE2RemovalFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.E2RemovalFailure);
8570 case UnsuccessfulOutcomeE2__value_PR_E2connectionUpdateFailure:
8572 ProcE2connectionUpdateFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.E2connectionUpdateFailure);
8575 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteFailure:
8577 ProcRicSubsDeleteFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionDeleteFailure);
8580 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationFailure:
8582 ProcRicSubsModificationFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationFailure);
8587 DU_LOG("\nERROR --> E2AP : Invalid type of unsuccessfulOutcome message [%d]", \
8588 e2apMsg->choice.unsuccessfulOutcome->value.present);
8596 DU_LOG("\nERROR --> E2AP : Invalid type message type ");
8600 }/* End of switch(e2apMsg->present) */
8601 } /* End of E2APMsgHdlr */
8604 /**********************************************************************
8606 **********************************************************************/