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 Sends E2 msg over SCTP
184 * Function : SendE2APMsg
186 * Functionality: Sends E2 msg over SCTP
188 * @params[in] Region region
190 * @return ROK - success
193 * ****************************************************************/
195 uint8_t SendE2APMsg(Region region, Pool pool, uint32_t duId)
199 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
201 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
203 ODU_PRINT_MSG(mBuf, 0,0);
205 if(sctpSend(duId, mBuf) != ROK)
207 DU_LOG("\nERROR --> E2AP : SCTP Send for E2 failed");
208 ODU_PUT_MSG_BUF(mBuf);
214 DU_LOG("\nERROR --> E2AP : ODU_ADD_POST_MSG_MULT failed");
215 ODU_PUT_MSG_BUF(mBuf);
218 ODU_PUT_MSG_BUF(mBuf);
222 DU_LOG("\nERROR --> E2AP : Failed to allocate memory");
229 /*******************************************************************
231 * @brief Deallocate the memory allocated for RemovalRequest msg
235 * Function : FreeRemovalRequest
238 * - freeing the memory allocated for RemovalRequest
240 * @params[in] E2AP_PDU_t *e2apMsg
241 * @return ROK - success
244 * ****************************************************************/
245 void FreeRemovalRequest(E2AP_PDU_t *e2apMsg)
248 E2RemovalRequest_t *removalReq = NULLP;
252 if(e2apMsg->choice.initiatingMessage != NULLP)
254 removalReq = &e2apMsg->choice.initiatingMessage->value.choice.E2RemovalRequest;
255 if(removalReq->protocolIEs.list.array)
257 for(ieIdx = 0; ieIdx < removalReq->protocolIEs.list.count; ieIdx++)
259 RIC_FREE(removalReq->protocolIEs.list.array[ieIdx], sizeof(E2RemovalRequestIEs_t));
261 RIC_FREE(removalReq->protocolIEs.list.array, removalReq->protocolIEs.list.size);
263 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
265 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
269 /*******************************************************************
271 * @brief Build and send the removal request msg
275 * Function : BuildAndSendRemovalRequest
278 * - Buld and send the removal request msg to E2 node
284 * @return ROK - success
287 * ****************************************************************/
288 uint8_t BuildAndSendRemovalRequest(DuDb *duDb)
290 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
291 uint8_t ret = RFAILED;
292 E2AP_PDU_t *e2apMsg = NULLP;
293 E2RemovalRequest_t *removalReq = NULLP;
294 asn_enc_rval_t encRetVal; /* Encoder return value */
296 DU_LOG("\nINFO --> E2AP : Building Removal Request\n");
300 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
303 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
307 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
308 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
309 if(e2apMsg->choice.initiatingMessage == NULLP)
311 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
315 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2removal;
316 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
317 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2RemovalRequest;
318 removalReq = &e2apMsg->choice.initiatingMessage->value.choice.E2RemovalRequest;
321 removalReq->protocolIEs.list.count = elementCnt;
322 removalReq->protocolIEs.list.size = elementCnt * sizeof(E2RemovalRequestIEs_t *);
324 RIC_ALLOC(removalReq->protocolIEs.list.array, removalReq->protocolIEs.list.size);
325 if(!removalReq->protocolIEs.list.array)
327 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
331 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
333 RIC_ALLOC(removalReq->protocolIEs.list.array[ieIdx], sizeof(E2RemovalRequestIEs_t));
334 if(!removalReq->protocolIEs.list.array[ieIdx])
336 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
341 /* In case of failure */
342 if(ieIdx < elementCnt)
346 removalReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
347 removalReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
348 removalReq->protocolIEs.list.array[ieIdx]->value.present = E2RemovalRequestIEs__value_PR_TransactionID;
349 transId = assignTransactionId(duDb);
350 removalReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
352 /* Prints the Msg formed */
353 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
355 memset(encBuf, 0, ENC_BUF_MAX_LEN);
357 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
359 if(encRetVal.encoded == ENCODE_FAIL)
361 DU_LOG("\nERROR --> E2AP : Could not encode removal request structure (at %s)\n",\
362 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
367 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for removal request\n");
368 #ifdef DEBUG_ASN_PRINT
369 for(int i=0; i< encBufSize; i++)
371 printf("%x",encBuf[i]);
375 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
377 DU_LOG("\nERROR --> E2AP : Sending removal request failed");
386 /* Free all memory */
387 FreeRemovalRequest(e2apMsg);
391 /*******************************************************************
393 * @brief Fetches RAN Function DB
397 * Function : fetchRanFuncFromRanFuncId
399 * Functionality: Fetches RAN function DB from E2AP DB using
402 * @params[in] RAN Function ID
403 * @return RAN Function DB
404 * NULL, in case of failure
406 * ****************************************************************/
407 RanFunction *fetchRanFuncFromRanFuncId(DuDb *duDb, uint16_t ranFuncId)
409 RanFunction *ranFuncDb = NULLP;
411 /* Fetch RAN Function DB */
412 if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
414 ranFuncDb = &duDb->ranFunction[ranFuncId-1];
418 DU_LOG("\nERROR --> DU_APP : fetchRanFuncFromRanFuncId: Invalid RAN Function ID[%d]", ranFuncId);
424 /*******************************************************************
426 * @brief Fetch subscripton DB
430 * Function : fetchSubsInfoFromRicReqId
432 * Functionality: Fetches subscription DB from RAN Function DB
433 * using RIC Request ID
435 * @params[in] RIC Request ID
437 * Pointer to RIC Subscription node to be searched
438 * @return RIC Subscription from RAN Function's subcription list
439 * NULL, in case of failure
441 * ****************************************************************/
442 RicSubscription *fetchSubsInfoFromRicReqId(RicRequestId ricReqId, RanFunction *ranFuncDb, CmLList **ricSubscriptionNode)
444 RicSubscription *ricSubscriptionInfo = NULLP;
446 /* Fetch subscription detail in RAN Function DB */
447 CM_LLIST_FIRST_NODE(&ranFuncDb->subscriptionList, *ricSubscriptionNode);
448 while(*ricSubscriptionNode)
450 ricSubscriptionInfo = (RicSubscription *)((*ricSubscriptionNode)->node);
451 if(ricSubscriptionInfo && (ricSubscriptionInfo->requestId.requestorId == ricReqId.requestorId) &&
452 (ricSubscriptionInfo->requestId.instanceId == ricReqId.instanceId))
456 *ricSubscriptionNode = (*ricSubscriptionNode)->next;
457 ricSubscriptionInfo = NULLP;
460 if(!ricSubscriptionInfo)
462 DU_LOG("\nERROR --> E2AP : fetchSubsInfoFromRicReqId: Subscription not found for Requestor ID [%d] \
463 Instance ID [%d] in RAN Function ID [%d]", ricReqId.requestorId, ricReqId.instanceId, ranFuncDb->id);
466 return ricSubscriptionInfo;
469 /*******************************************************************
471 * @brief Fetch Action details
475 * Function : fetchActionInfoFromActionId
477 * Functionality: Fetch action details from RIC subscription DB
480 * @params[in] Action ID
481 * RIC Subscription DB
482 * @return Action Info DB
483 * NULL, in case of failure
485 * ****************************************************************/
486 ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo)
488 ActionInfo *actionInfoDb = NULLP;
489 if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId)
491 actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId];
495 DU_LOG("\nERROR --> E2AP : fetchActionInfoFromActionId: Action Id [%d] not found in \
496 subscription info [Requestor id : %d] [Instance Id : %d]", actionId,\
497 ricSubscriptionInfo->requestId.requestorId, ricSubscriptionInfo->requestId.instanceId);
503 /******************************************************************
505 * @brief Search E2 node component with the help of interface type
510 * Function : fetchE2NodeComponentInfo
512 * Functionality: Search E2 node component
517 * Pointer to E2 component node to be searched
520 * ****************************************************************/
522 E2NodeComponent *fetchE2NodeComponentInfo(DuDb *duDb, InterfaceType interfaceType,CmLList **e2ComponentNode)
524 E2NodeComponent *e2NodeComponentInfo=NULLP;
526 if(duDb->e2NodeComponent.count)
528 CM_LLIST_FIRST_NODE(&duDb->e2NodeComponent, *e2ComponentNode);
529 while(*e2ComponentNode)
531 e2NodeComponentInfo = (E2NodeComponent*)((*e2ComponentNode)->node);
532 if((e2NodeComponentInfo->interfaceType == interfaceType))
537 *e2ComponentNode = (*e2ComponentNode)->next;
538 e2NodeComponentInfo = NULLP;
541 return e2NodeComponentInfo;
544 /*******************************************************************
546 * @brief update E2 node config list
550 * Function : updateE2NodeConfigList
553 * - update E2 node config list
557 * Configuration which need to update in Database
559 * @return ROK - success
562 * ****************************************************************/
563 uint8_t updateE2NodeConfigList(DuDb **duDb, uint8_t protocolId, E2NodeConfigItem *tmpCfg)
566 E2NodeComponent * e2NodeComponentInfo;
567 bool configFound= false;
571 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
573 /* Adding the new e2 node component in DB*/
574 RIC_ALLOC(e2NodeComponentInfo, sizeof(E2NodeComponent));
575 e2NodeComponentInfo->interfaceType = tmpCfg->componentInfo.interfaceType;
576 e2NodeComponentInfo->componentId =tmpCfg->componentInfo.componentId;
577 RIC_ALLOC(node, sizeof(CmLList));
580 node->node = (PTR) e2NodeComponentInfo;
581 cmLListAdd2Tail(&(*duDb)->e2NodeComponent, node);
586 DU_LOG("\nERROR --> E2AP : Memory allocation failed for e2NodeComponentList node");
587 RIC_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
592 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
594 /* searching for information in a database */
595 e2NodeComponentInfo = fetchE2NodeComponentInfo((*duDb),tmpCfg->componentInfo.interfaceType, &node);
596 if(!e2NodeComponentInfo)
598 DU_LOG("\nERROR --> E2AP : Failed to find the e2 component node");
601 /* If the node is present then update the value */
602 e2NodeComponentInfo->componentId =tmpCfg->componentInfo.componentId;
606 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
608 /* searching for information in a database */
609 e2NodeComponentInfo = fetchE2NodeComponentInfo((*duDb),tmpCfg->componentInfo.interfaceType, &node);
610 if(!e2NodeComponentInfo)
612 DU_LOG("\nERROR --> E2AP : Failed to find the e2 component node");
615 /* Delete the node from the list */
616 e2NodeComponentInfo->componentId = tmpCfg->componentInfo.componentId;
617 cmLListDelFrm(&(*duDb)->e2NodeComponent, node);
618 RIC_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
624 /* If the configuration update was successful, then mark the isSuccessful as
625 * true; otherwise, mark it as false. */
626 if(configFound == true)
627 tmpCfg->isSuccessful = true;
629 tmpCfg->isSuccessful = false;
634 /*******************************************************************
636 * @brief Handling the E2 node configuration depending on the add,
637 * update, or remove configuration type
641 * Function : handleE2NodeComponentAction
644 * - Handling the E2 node configuration depending on the add,
645 * update, or remove configuration type
648 * Pointer to e2NodeCfg which has info
650 * E2NodeConfigItem to be filled
652 * @return ROK - success
655 * ****************************************************************/
657 uint8_t handleE2NodeComponentAction(DuDb *duDb, PTR e2NodeCfg, uint8_t protocolId, E2NodeConfigItem *storeCfg)
659 uint8_t configFound = ROK;
660 E2NodeConfigItem tmpCfg;
661 E2nodeComponentID_t componentId;
662 E2nodeComponentInterfaceType_t interface;
663 E2nodeComponentConfigAddition_Item_t *addCfg=NULL;
664 E2nodeComponentConfigUpdate_Item_t *updateCfg=NULL;
665 E2nodeComponentConfigRemoval_Item_t *removeCfg=NULL;
667 /* fetching the interface and component id information from the e2NodeCfg */
668 memset(storeCfg, 0, sizeof(E2NodeConfigItem));
669 storeCfg->isSuccessful=false;
670 memset(&tmpCfg, 0, sizeof(E2NodeConfigItem));
674 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
676 addCfg = (E2nodeComponentConfigAddition_Item_t *)e2NodeCfg;
677 interface = addCfg->e2nodeComponentInterfaceType;
678 componentId = addCfg->e2nodeComponentID;
681 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
683 updateCfg = (E2nodeComponentConfigUpdate_Item_t *)e2NodeCfg;
684 interface = updateCfg->e2nodeComponentInterfaceType;
685 componentId = updateCfg->e2nodeComponentID;
688 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
690 removeCfg = (E2nodeComponentConfigRemoval_Item_t*)e2NodeCfg;
691 interface = removeCfg->e2nodeComponentInterfaceType;
692 componentId = removeCfg->e2nodeComponentID;
697 /* Storing the information in temporary structure */
698 tmpCfg.componentInfo.interfaceType = interface;
700 switch(componentId.present)
702 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
704 if(componentId.choice.e2nodeComponentInterfaceTypeF1)
706 tmpCfg.componentInfo.componentId = componentId.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0];
716 /* Updating the database configuration */
717 configFound = updateE2NodeConfigList(&duDb, protocolId, &tmpCfg);
719 memcpy(storeCfg, &tmpCfg,sizeof(E2NodeConfigItem));
724 /*******************************************************************
726 * @brief deallocate memory allocated in E2 Node Config Update Failure
730 * Function : FreeE2ConfigUpdateFail
732 * Functionality: deallocate memory allocated in E2 Node Config Update Failure
734 * @params[in] E2AP_PDU_t *e2apMsg
737 * ****************************************************************/
739 void FreeE2ConfigUpdateFail(E2AP_PDU_t *e2apMsg)
742 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail=NULL;
746 if(e2apMsg->choice.unsuccessfulOutcome)
748 e2NodeCfgUpdFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
749 if(e2NodeCfgUpdFail->protocolIEs.list.array)
751 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
753 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateFailure_IEs_t));
755 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array, e2NodeCfgUpdFail->protocolIEs.list.size);
757 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
759 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
763 /*******************************************************************
765 * @brief Buld and send the E2 Node Config Update failure
769 * Function : BuildAndSendE2NodeConfigUpdateFailure
772 * - Buld and send the E2 Node Config Update failure
773 * @return ROK - success
776 * ****************************************************************/
778 uint8_t BuildAndSendE2NodeConfigUpdateFailure(uint32_t duId, uint8_t transId, uint8_t causeInfo, uint8_t causeReason)
780 E2AP_PDU_t *e2apMsg = NULL;
781 asn_enc_rval_t encRetVal;
783 uint8_t elementCnt=0;
784 bool memAllocFailed = false;
785 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdateFail=NULL;
787 DU_LOG("\nINFO --> E2AP : Building E2 Node Config Update failure\n");
790 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
793 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
796 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
797 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
798 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
800 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
804 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
805 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
806 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure;
807 e2NodeCfgUpdateFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
810 e2NodeCfgUpdateFail->protocolIEs.list.count = elementCnt;
811 e2NodeCfgUpdateFail->protocolIEs.list.size = elementCnt * sizeof(struct E2nodeConfigurationUpdateFailure_IEs *);
813 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array, e2NodeCfgUpdateFail->protocolIEs.list.size);
814 if(e2NodeCfgUpdateFail->protocolIEs.list.array == NULLP)
816 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure array failed");
820 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
822 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx], sizeof(struct E2nodeConfigurationUpdateFailure_IEs));
823 if(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx] == NULLP)
825 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure IEs failed");
826 memAllocFailed = true;
831 if(memAllocFailed == true)
838 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
839 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
840 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
841 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
844 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
845 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
846 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
847 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = causeInfo;
848 if(causeInfo == CauseE2_PR_e2Node)
849 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.e2Node = causeReason;
851 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.misc = causeReason;
854 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
855 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
856 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
857 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
859 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
860 memset(encBuf, 0, ENC_BUF_MAX_LEN);
862 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
864 /* Check encode results */
865 if(encRetVal.encoded == ENCODE_FAIL)
867 DU_LOG("\nERROR --> E2AP : Could not encode E2 Node Config Update failure structure (at %s)\n",\
868 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
873 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Node Config Update Failure\n");
874 for(int i=0; i< encBufSize; i++)
876 DU_LOG("%x",encBuf[i]);
880 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
882 DU_LOG("\nERROR --> E2AP : Sending E2 Node Config Update Failure failed");
888 FreeE2ConfigUpdateFail(e2apMsg);
892 /*******************************************************************
894 * @brief process the E2 node configuration update
898 * Function : ProcE2NodeConfigUpdate
900 * Functionality: Process E2 node configuration update
904 * Pointer to E2nodeConfigurationUpdate
907 ******************************************************************/
909 void ProcE2NodeConfigUpdate(uint32_t duId, E2nodeConfigurationUpdate_t *e2NodeConfigUpdate)
912 E2NodeConfigList tmpE2NodeList;
914 uint8_t ieIdx = 0, duIdx = 0, elementCnt=0, transId = 0;
915 E2nodeComponentConfigAddition_List_t *e2NodeAddList=NULL;
916 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItemIe=NULL;
917 E2nodeComponentConfigAddition_Item_t *e2NodeAddItem=NULL;
918 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList=NULLP;
919 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe=NULLP;
920 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULLP;
921 E2nodeComponentConfigRemoval_List_t *e2NodeRemoveList=NULL;
922 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItemIe=NULL;
923 E2nodeComponentConfigRemoval_Item_t *e2NodeRemovalItem=NULL;
925 SEARCH_DU_DB(duIdx, duId, duDb);
928 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
932 memset(&tmpE2NodeList, 0, sizeof(E2NodeConfigList));
933 if(!e2NodeConfigUpdate)
935 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate pointer is null");
938 if(!e2NodeConfigUpdate->protocolIEs.list.array)
940 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate array pointer is null");
944 elementCnt = e2NodeConfigUpdate->protocolIEs.list.count;
945 for(ieIdx=0; ieIdx < e2NodeConfigUpdate->protocolIEs.list.count; ieIdx++)
947 if(!e2NodeConfigUpdate->protocolIEs.list.array[ieIdx])
949 DU_LOG("\nERROR --> E2AP : e2NodeConfigUpdate array idx %d pointer is null",arrIdx);
953 switch(e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->id)
955 case ProtocolIE_IDE2_id_TransactionID:
957 transId = e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
958 if(transId < 0 || transId > 255)
960 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
966 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
968 e2NodeAddList =&e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigAddition_List;
969 if(e2NodeAddList->list.array)
971 for(arrIdx = 0; arrIdx< e2NodeAddList->list.count; arrIdx++)
973 e2NodeAddItemIe = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[arrIdx];
974 e2NodeAddItem = &e2NodeAddItemIe->value.choice.E2nodeComponentConfigAddition_Item;
975 /* Storing the E2 node information in DB */
976 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeAddItem, ProtocolIE_IDE2_id_E2nodeComponentConfigAddition,\
977 &tmpE2NodeList.addedE2Node[tmpE2NodeList.addedE2NodeCount++]) != ROK)
979 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
986 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
988 e2NodeUpdateList =&e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigUpdate_List;
989 if(e2NodeUpdateList->list.array)
991 for(arrIdx = 0; arrIdx< e2NodeUpdateList->list.count; arrIdx++)
993 e2NodeUpdateItemIe = (E2nodeComponentConfigUpdate_ItemIEs_t*) e2NodeUpdateList->list.array[arrIdx];
994 e2NodeUpdateItem = &e2NodeUpdateItemIe->value.choice.E2nodeComponentConfigUpdate_Item;
996 /* Updating the E2 node information in DB */
997 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeUpdateItem, ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate,\
998 &tmpE2NodeList.updatedE2Node[tmpE2NodeList.updatedE2NodeCount++]) != ROK)
1000 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
1007 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
1009 e2NodeRemoveList = &e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2nodeComponentConfigRemoval_List;
1010 if(e2NodeRemoveList->list.array)
1012 for(arrIdx = 0; arrIdx< e2NodeRemoveList->list.count; arrIdx++)
1014 e2NodeRemovalItemIe = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemoveList->list.array[arrIdx];
1015 e2NodeRemovalItem = &e2NodeRemovalItemIe->value.choice.E2nodeComponentConfigRemoval_Item;
1017 /* Removing the E2 node information in DB */
1018 if(handleE2NodeComponentAction(duDb, (PTR)e2NodeRemovalItem, ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval,\
1019 &tmpE2NodeList.removedE2Node[tmpE2NodeList.removedE2NodeCount++]) != ROK)
1021 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",arrIdx);
1034 /* If all of the IEs are processed successfully, we will send an e2 node
1035 * config update ack message.
1036 * else we will be sendinf e2 node config update failure */
1037 if(elementCnt == ieIdx)
1039 if(BuildAndSendE2NodeConfigUpdateAck(duDb, transId, &tmpE2NodeList) !=ROK)
1041 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 node config ack");
1047 if(BuildAndSendE2NodeConfigUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
1049 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 node config Failure");
1054 /*******************************************************************
1056 * @brief Builds Global RIC Id Params
1060 * Function : BuildGlobalRicId
1062 * Functionality: Building the Plmn and ric id
1064 * @params[in] GlobalRIC_ID_t *ricId
1065 * @return ROK - success
1068 * ****************************************************************/
1070 uint8_t BuildGlobalRicId(GlobalRIC_ID_t *ricId)
1073 uint8_t byteSize = 3;
1077 ricId->pLMN_Identity.size = byteSize * sizeof(uint8_t);
1078 RIC_ALLOC(ricId->pLMN_Identity.buf, ricId->pLMN_Identity.size);
1079 buildPlmnId(ricCb.ricCfgParams.plmn , ricId->pLMN_Identity.buf);
1081 ricId->ric_ID.size = byteSize * sizeof(uint8_t);
1082 RIC_ALLOC(ricId->ric_ID.buf, ricId->ric_ID.size);
1083 fillBitString(&ricId->ric_ID, unused, byteSize, ricVal);
1088 /*******************************************************************
1090 * @brief deallocate the memory allocated in E2SetupResponse
1094 * Function : FreeE2SetupRsp
1096 * Functionality: deallocate the memory allocated in E2SetupResponse
1098 * @params[in] E2AP_PDU_t *e2apMsg
1101 * ****************************************************************/
1102 void FreeE2SetupRsp(E2AP_PDU_t *e2apMsg)
1104 uint8_t arrIdx = 0, e2NodeConfigIdx=0, ranFuncIdx=0;
1105 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
1106 E2setupResponse_t *e2SetupRsp=NULL;
1107 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULL;
1108 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList=NULL;
1109 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULL;
1113 if(e2apMsg->choice.successfulOutcome)
1115 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
1116 if(e2SetupRsp->protocolIEs.list.array)
1118 for(arrIdx=0; arrIdx<e2SetupRsp->protocolIEs.list.count; arrIdx++)
1120 switch(e2SetupRsp->protocolIEs.list.array[arrIdx]->id)
1122 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
1124 ranFuncAcceptedList= &e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
1125 if(ranFuncAcceptedList->list.array)
1127 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
1129 if(ranFuncAcceptedList->list.array[ranFuncIdx])
1131 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
1134 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
1138 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
1140 e2NodeConfigAdditionAckList =&e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
1141 if(e2NodeConfigAdditionAckList->list.count)
1143 for(e2NodeConfigIdx=0; e2NodeConfigIdx<e2NodeConfigAdditionAckList->list.count; e2NodeConfigIdx++)
1145 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[e2NodeConfigIdx];
1146 if(e2NodeAddAckItemIe)
1148 f1InterfaceInfo = e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
1151 RIC_FREE(f1InterfaceInfo->gNB_DU_ID.buf, f1InterfaceInfo->gNB_DU_ID.size);
1152 RIC_FREE(f1InterfaceInfo, sizeof(E2nodeComponentInterfaceF1_t));
1154 RIC_FREE(e2NodeAddAckItemIe, sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
1157 RIC_FREE(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
1162 RIC_FREE(e2SetupRsp->protocolIEs.list.array[arrIdx], sizeof(E2setupResponseIEs_t));
1164 RIC_FREE(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
1166 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1168 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1172 /*******************************************************************
1174 * @brief fill e2 node configuration for ack msg
1178 * Function : fillE2NodeConfigAck
1181 * - fill e2 node configuration for ack msg
1184 * Pointer to e2NodeCfg to be filled
1186 * E2 Node Component information
1187 * Is successful or failure response
1188 * @return ROK - success
1191 * ****************************************************************/
1193 uint8_t fillE2NodeConfigAck(PTR e2NodeCfg, uint8_t procedureCode, E2NodeComponent *componentInfo, bool isSuccessful)
1195 E2nodeComponentID_t *e2nodeComponentID=NULLP;
1196 E2nodeComponentInterfaceType_t *e2nodeComponentInterfaceType=NULLP;
1197 E2nodeComponentConfigurationAck_t *e2nodeComponentConfigurationAck=NULLP;
1198 E2nodeComponentConfigRemovalAck_Item_t *removalAckItem=NULLP;
1199 E2nodeComponentConfigUpdateAck_Item_t *updateAckItem=NULLP;
1200 E2nodeComponentConfigAdditionAck_Item_t *additionAckItem=NULLP;
1202 /* filling the interface type, component id, configuration ack based on the
1203 * e2 node configuration add, update, delete type */
1204 switch(procedureCode)
1206 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
1208 additionAckItem = (E2nodeComponentConfigAdditionAck_Item_t *)e2NodeCfg;
1209 e2nodeComponentInterfaceType = &((E2nodeComponentConfigAdditionAck_Item_t *)e2NodeCfg)->e2nodeComponentInterfaceType;
1210 e2nodeComponentID = &additionAckItem->e2nodeComponentID;
1211 e2nodeComponentConfigurationAck = &additionAckItem->e2nodeComponentConfigurationAck;
1214 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
1216 updateAckItem = (E2nodeComponentConfigUpdateAck_Item_t*) e2NodeCfg;
1217 e2nodeComponentInterfaceType = &updateAckItem->e2nodeComponentInterfaceType;
1218 e2nodeComponentID = &updateAckItem->e2nodeComponentID;
1219 e2nodeComponentConfigurationAck = &updateAckItem->e2nodeComponentConfigurationAck;
1222 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
1224 removalAckItem= (E2nodeComponentConfigRemovalAck_Item_t*)e2NodeCfg;
1225 e2nodeComponentInterfaceType = &removalAckItem->e2nodeComponentInterfaceType;
1226 e2nodeComponentID = &removalAckItem->e2nodeComponentID;
1227 e2nodeComponentConfigurationAck = &removalAckItem->e2nodeComponentConfigurationAck;
1232 /* >E2 Node Component interface type */
1233 if(componentInfo->interfaceType>=NG && componentInfo->interfaceType<=X2)
1235 *e2nodeComponentInterfaceType = componentInfo->interfaceType;
1239 DU_LOG("\nERROR --> E2AP: Received an invalid interface value %d",componentInfo->interfaceType);
1243 if(*e2nodeComponentInterfaceType == E2nodeComponentInterfaceType_f1)
1245 /* >E2 Node Component ID */
1246 e2nodeComponentID->present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1;
1247 RIC_ALLOC(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1, sizeof(E2nodeComponentInterfaceF1_t));
1248 if(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1 == NULLP)
1250 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1253 e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t);
1254 RIC_ALLOC(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
1256 if(e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP)
1258 DU_LOG("\nERROR -->list. E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1261 e2nodeComponentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0] = componentInfo->componentId;
1266 /* >E2 Node Component Configuration Acknowledge*/
1267 e2nodeComponentConfigurationAck->updateOutcome = E2nodeComponentConfigurationAck__updateOutcome_success;
1271 /* >E2 Node Component Configuration Acknowledge*/
1272 e2nodeComponentConfigurationAck->updateOutcome = E2nodeComponentConfigurationAck__updateOutcome_failure;
1273 RIC_ALLOC(e2nodeComponentConfigurationAck->failureCauseE2, sizeof(struct CauseE2));
1274 if(e2nodeComponentConfigurationAck->failureCauseE2)
1276 fillE2FailureCause(e2nodeComponentConfigurationAck->failureCauseE2, CauseE2_PR_e2Node, CauseE2node_e2node_component_unknown);
1280 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
1287 /*******************************************************************
1289 * @brief Build E2node Component config addition ack list
1293 * Function : BuildE2nodeComponentConfigAdditionAck
1295 * Functionality: Build E2node Component config addition ack list
1298 * E2nodeComponentConfigAdditionAck_List to be filled
1299 * Count of e2 node to be added
1300 * list of e2 node cfg to be added
1302 * @return ROK - success
1304 * ****************************************************************/
1306 uint8_t BuildE2nodeComponentConfigAdditionAck(E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList, \
1307 uint16_t addedE2NodeCount, E2NodeConfigItem *addedE2Node)
1309 E2NodeComponent *e2NodeComponentInfo=NULLP;
1310 CmLList *node=NULLP;
1311 uint16_t arrIdx = 0;
1312 E2nodeComponentConfigAdditionAck_Item_t *e2NodeAddAckItem=NULLP;
1313 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULLP;
1315 e2NodeConfigAdditionAckList->list.count = addedE2NodeCount;
1317 e2NodeConfigAdditionAckList->list.size = e2NodeConfigAdditionAckList->list.count * sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t*);
1318 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
1319 if(e2NodeConfigAdditionAckList->list.array == NULLP)
1321 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
1325 for(arrIdx = 0; arrIdx< e2NodeConfigAdditionAckList->list.count; arrIdx++)
1327 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
1328 if(e2NodeConfigAdditionAckList->list.array[arrIdx] == NULLP)
1330 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
1333 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[arrIdx];
1334 e2NodeAddAckItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck_Item;
1335 e2NodeAddAckItemIe->criticality = CriticalityE2_reject;
1336 e2NodeAddAckItemIe->value.present = E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_E2nodeComponentConfigAdditionAck_Item;
1337 e2NodeAddAckItem = &e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item;
1339 /* Filling the e2 node config addition ack item */
1340 fillE2NodeConfigAck((PTR)&e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item, ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck,\
1341 &addedE2Node[arrIdx].componentInfo, addedE2Node[arrIdx].isSuccessful);
1346 /*******************************************************************
1348 * @brief Build RAN function accepted list
1352 * Function : BuildRanFunctionAcceptedList
1354 * Functionality: Build RAN function accepted list
1355 * ->For ProcedureCodeE2_id_E2setup or ProcedureCodeE2_id_RICserviceQuery
1356 * we add all the RAN Function list which is present in RIC database.
1357 * ->For any other procedures, we just fill the RAN functions whose ID
1358 * is present in the recvList
1362 * Count of ran functions to be accepted in the list
1363 * Received list of RAN functions
1367 * @return ROK - success
1369 * ****************************************************************/
1371 uint8_t BuildRanFunctionAcceptedList(DuDb *duDb, uint8_t count, RanFunction *ranFunAcceptedList, RANfunctionsID_List_t *ranFuncAcceptedList, uint8_t procedureCode)
1373 uint16_t ranFuncIdx = 0;
1374 RANfunctionID_ItemIEs_t *ranFuncAcceptedItemIe=NULL;
1376 /* For ProcedureCodeE2_id_E2setup and ProcedureCodeE2_id_RICserviceQuery,
1377 * the number of RAN function list items is equal to the number of
1378 * ran function entries stored in the database.
1379 * For any other procedure, the RAN function list count is equal
1380 * to the count of ran functions obtained from the function's caller */
1382 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
1383 ranFuncAcceptedList->list.count = duDb->numOfRanFunction;
1385 ranFuncAcceptedList->list.count = count;
1387 ranFuncAcceptedList->list.size = ranFuncAcceptedList->list.count*sizeof(RANfunctionID_ItemIEs_t*);
1388 RIC_ALLOC(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
1389 if(ranFuncAcceptedList->list.array)
1391 for(ranFuncIdx = 0; ranFuncIdx< ranFuncAcceptedList->list.count; ranFuncIdx++)
1393 RIC_ALLOC(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
1394 if(ranFuncAcceptedList->list.array[ranFuncIdx] == NULLP)
1396 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array item");
1399 ranFuncAcceptedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAcceptedList->list.array[ranFuncIdx];
1400 ranFuncAcceptedItemIe->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
1401 ranFuncAcceptedItemIe->criticality= CriticalityE2_ignore;
1402 ranFuncAcceptedItemIe->value.present = RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item;
1403 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
1405 /* filling the RAN function information with the help of DuDb */
1406 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = duDb->ranFunction[ranFuncIdx].id;
1407 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= duDb->ranFunction[ranFuncIdx].revisionCounter;
1411 /* filling the the RAN function information with the help received list of RAN functions */
1412 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = ranFunAcceptedList[ranFuncIdx].id;
1413 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= ranFunAcceptedList[ranFuncIdx].revisionCounter;
1419 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array");
1425 /*******************************************************************
1427 * @brief Builds and sends the E2SetupResponse
1431 * Function : BuildAndSendE2SetupRsp
1433 * Functionality: Builds and sends the E2SetupResponse
1438 * List of E2node cofniguration which needs to be send
1440 * @return ROK - success
1443 * ****************************************************************/
1445 uint8_t BuildAndSendE2SetupRsp(DuDb *duDb, uint8_t transId, E2NodeConfigList e2NodeList)
1447 E2AP_PDU_t *e2apMsg = NULL;
1448 E2setupResponse_t *e2SetupRsp;
1449 asn_enc_rval_t encRetVal;
1452 bool memAllocFailed = false;
1454 DU_LOG("\nINFO --> E2AP : Building E2 Setup Response\n");
1457 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1458 if(e2apMsg == NULLP)
1460 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1463 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
1464 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1465 if(e2apMsg->choice.successfulOutcome == NULLP)
1467 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1471 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
1472 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
1473 e2apMsg->choice.successfulOutcome->value.present = \
1474 SuccessfulOutcomeE2__value_PR_E2setupResponse;
1475 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
1478 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
1479 if(duDb->numOfRanFunction)
1482 e2SetupRsp->protocolIEs.list.count = elementCnt;
1483 e2SetupRsp->protocolIEs.list.size = elementCnt * sizeof(E2setupResponseIEs_t*);
1485 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
1486 if(e2SetupRsp->protocolIEs.list.array == NULLP)
1488 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1492 for(idx=0; idx<elementCnt; idx++)
1494 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array[idx], sizeof(E2setupResponseIEs_t));
1495 if(e2SetupRsp->protocolIEs.list.array[idx] == NULLP)
1497 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1498 memAllocFailed = true;
1503 if(memAllocFailed == true)
1505 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
1510 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_TransactionID;
1511 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1512 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_TransactionID;
1513 e2SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID = transId;
1517 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalRIC_ID;
1518 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1519 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_GlobalRIC_ID;
1521 if(BuildGlobalRicId(&(e2SetupRsp->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID))!=ROK)
1523 DU_LOG("\nERROR --> E2AP : Failed to build Global Ric Id");
1527 if(duDb->numOfRanFunction)
1529 /* Accepted RAN function Id */
1531 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
1532 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1533 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_RANfunctionsID_List;
1534 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &e2SetupRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_E2setup)!=ROK)
1536 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
1541 /* E2 Node Component Configuration Addition Acknowledge List*/
1543 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck;
1544 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1545 e2SetupRsp->protocolIEs.list.array[idx]->value.present = \
1546 E2setupResponseIEs__value_PR_E2nodeComponentConfigAdditionAck_List;
1547 if(BuildE2nodeComponentConfigAdditionAck(&e2SetupRsp->protocolIEs.list.array[idx]->\
1548 value.choice.E2nodeComponentConfigAdditionAck_List, e2NodeList.addedE2NodeCount, e2NodeList.addedE2Node) != ROK)
1550 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list");
1554 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1555 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1557 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
1559 /* Check encode results */
1560 if(encRetVal.encoded == ENCODE_FAIL)
1562 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupResponse structure (at %s)\n",\
1563 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1568 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupResponse\n");
1569 for(int i=0; i< encBufSize; i++)
1571 DU_LOG("%x",encBuf[i]);
1575 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
1577 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Response failed");
1583 FreeE2SetupRsp(e2apMsg);
1584 BuildAndSendRicSubscriptionReq(duDb);
1588 /*******************************************************************
1590 * @brief Free RIC Subscription Details
1594 * Function : FreeRicSubsDetails
1596 * Functionality: Free the RIC Subscription Details
1598 * @params[in] RICsubscriptionDetails_t *subsDetails
1601 * ****************************************************************/
1602 void FreeRicSubsDetails(RICsubscriptionDetails_t *subsDetails)
1604 uint8_t elementIdx = 0;
1605 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
1607 RIC_FREE(subsDetails->ricEventTriggerDefinition.buf, subsDetails->ricEventTriggerDefinition.size);
1609 if(subsDetails->ricAction_ToBeSetup_List.list.array)
1611 for(elementIdx = 0; elementIdx < subsDetails->ricAction_ToBeSetup_List.list.count; elementIdx++)
1613 if(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
1615 actionItem = (RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx];
1616 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1618 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf, \
1619 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size);
1620 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1622 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t))
1625 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
1629 /*******************************************************************
1631 * @brief Free RIC Subscription Request
1635 * Function : FreeRicSubscriptionReq
1637 * Functionality : Free RIC Subscription Request
1639 * @return ROK - success
1642 ******************************************************************/
1643 void FreeRicSubscriptionReq(E2AP_PDU_t *e2apRicMsg)
1646 RICsubscriptionRequest_t *ricSubscriptionReq;
1650 if(e2apRicMsg->choice.initiatingMessage)
1652 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
1653 if(ricSubscriptionReq->protocolIEs.list.array)
1655 for(idx=0; idx < ricSubscriptionReq->protocolIEs.list.count; idx++)
1657 switch(ricSubscriptionReq->protocolIEs.list.array[idx]->id)
1659 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
1661 FreeRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails));
1665 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
1667 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
1669 RIC_FREE(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1671 RIC_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
1675 /*******************************************************************
1677 * @brief Builds Ric Request Id
1681 * Function : BuildNewRicRequestId
1683 * Functionality: Assign new Ric Request ID
1685 * @params[in] RIC request ID to be sent
1686 * RIC request ID stored in DB
1687 * @return ROK - success
1690 * ****************************************************************/
1692 uint8_t BuildNewRicRequestId(RICrequestID_t *ricReqId, RicRequestId *reqIdDb)
1694 static uint16_t requestorId = 0;
1695 static uint16_t instanceId = 0;
1697 if(ricReqId != NULLP)
1699 ricReqId->ricRequestorID = ++requestorId;
1700 ricReqId->ricInstanceID = ++instanceId;
1702 reqIdDb->requestorId = ricReqId->ricRequestorID;
1703 reqIdDb->instanceId = ricReqId->ricInstanceID;
1708 /*******************************************************************
1710 * @brief Free RIC Action Definition
1714 * Function : FreeRicActionDefinition
1716 * Functionality: Free RIC Action Definition
1718 * @params[in] E2SM-KPM Action definition
1721 * ****************************************************************/
1722 void FreeRicActionDefinition(E2SM_KPM_ActionDefinition_t actionDef)
1724 uint8_t elementIdx = 0;
1725 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1726 MeasurementInfoItem_t *measItem = NULLP;
1728 switch(actionDef.actionDefinition_formats.present)
1730 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
1732 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1)
1734 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1735 if(actionFormat1->measInfoList.list.array)
1737 for(elementIdx = 0; elementIdx < actionFormat1->measInfoList.list.count; elementIdx++)
1739 if(actionFormat1->measInfoList.list.array[elementIdx])
1741 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1742 switch(measItem->measType.present)
1744 case MeasurementType_PR_NOTHING:
1745 case MeasurementType_PR_measID:
1747 case MeasurementType_PR_measName:
1749 RIC_FREE(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size)
1753 RIC_FREE(measItem, sizeof(MeasurementInfoItem_t));
1756 RIC_FREE(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1758 RIC_FREE(actionFormat1, sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1763 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2:
1764 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3:
1765 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format4:
1766 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format5:
1767 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_NOTHING:
1772 /*******************************************************************
1774 * @brief Fill RIC Action Definition
1778 * Function : fillRicActionDef
1780 * Functionality: Fill RIC Action Definition
1782 * @params[in] RIC Action definition
1786 * ****************************************************************/
1787 uint8_t fillRicActionDef(RICactionDefinition_t *ricActionDef, uint8_t ricActionId, ConfigType configType)
1789 uint8_t ret = RFAILED;
1790 asn_enc_rval_t encRetVal;
1791 uint8_t elementCnt = 0, elementIdx = 0;
1792 char *measurementTypeName[] = {"RRU.PrbTotDl", "RRU.PrbTotUl"};
1793 E2SM_KPM_ActionDefinition_t actionDef;
1794 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1795 MeasurementInfoItem_t *measItem = NULLP;
1799 /* Fill E2SM-KPM Action Definition Format 1 */
1801 /* RIC Stype Type */
1802 actionDef.ric_Style_Type = RIC_STYLE_TYPE;
1804 /* RIC Action Definition Format 1 */
1805 actionDef.actionDefinition_formats.present = \
1806 E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1;
1808 RIC_ALLOC(actionDef.actionDefinition_formats.choice.actionDefinition_Format1, \
1809 sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1810 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1 == NULLP)
1812 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1815 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1817 /* Measurement Info List */
1819 actionFormat1->measInfoList.list.count = elementCnt;
1820 actionFormat1->measInfoList.list.size = elementCnt * sizeof(MeasurementInfoItem_t *);
1821 RIC_ALLOC(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1822 if(actionFormat1->measInfoList.list.array == NULL)
1824 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1828 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1830 RIC_ALLOC(actionFormat1->measInfoList.list.array[elementIdx], sizeof(MeasurementInfoItem_t));
1831 if(actionFormat1->measInfoList.list.array[elementIdx] == NULLP)
1833 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1837 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1838 measItem->measType.present = MeasurementType_PR_measName;
1840 measItem->measType.choice.measName.size = strlen(measurementTypeName[elementIdx]);
1841 RIC_ALLOC(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size);
1842 if(measItem->measType.choice.measName.buf == NULLP)
1844 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1847 memcpy(measItem->measType.choice.measName.buf, measurementTypeName[elementIdx], measItem->measType.choice.measName.size);
1849 if(elementIdx < elementCnt)
1852 /* Granularity Period */
1853 actionFormat1->granulPeriod = RIC_ACTION_GRANULARITY_PERIOD(configType, ricActionId); /* In ms */
1854 DU_LOG("\nPBORLA configType %d ricActionId %d, actionFormat1->granulPeriod %d", configType, ricActionId, actionFormat1->granulPeriod );
1856 /* Prints the Msg formed */
1857 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, &actionDef);
1859 /* Encode E2SM-KPM RIC Action Definition */
1860 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1862 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_ActionDefinition, 0, &actionDef, PrepFinalEncBuf, encBuf);
1863 if(encRetVal.encoded == ENCODE_FAIL)
1865 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM action definition structure (at %s)\n",\
1866 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1870 /* Copty encoded E2SM-KPM RIC action definition to E2AP octet string buffer */
1871 ricActionDef->size = encBufSize;
1872 RIC_ALLOC(ricActionDef->buf, encBufSize);
1873 if(ricActionDef->buf == NULLP)
1875 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1878 memcpy(ricActionDef->buf, encBuf, encBufSize);
1884 FreeRicActionDefinition(actionDef);
1888 /*******************************************************************
1890 * @brief Fills RIC Action To Be Setup Item
1894 * Function : fillActionToBeSetup
1896 * Functionality: Fill the RIC Action To Be Setup Ite,
1897 * RIC subscription DB
1899 * @params[in] RICaction_ToBeSetup_ItemIEs_t *items
1900 * @return ROK - success
1903 * ****************************************************************/
1904 uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscription *ricSubsDb)
1906 static uint8_t ricActionId = 0;
1908 if(actionItem == NULLP)
1910 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1916 actionItem->id = ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item;
1917 actionItem->criticality = CriticalityE2_ignore;
1918 actionItem->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
1921 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ricActionId;
1922 ricSubsDb->actionSequence[ricActionId].actionId = \
1923 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
1926 /* RIC Action Type */
1927 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
1929 /* RIC Action Definition */
1930 RIC_ALLOC(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1931 if(!actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1933 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1936 if(fillRicActionDef(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, ricActionId, CONFIG_ADD) != ROK)
1938 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1942 ricSubsDb->numOfActions++;
1946 memset(&ricSubsDb->actionSequence[ricActionId], 0, sizeof(ActionInfo));
1947 ricSubsDb->actionSequence[ricActionId].actionId = -1;
1951 /*******************************************************************
1953 * @brief Free Event Trigger Definition
1957 * Function : FreeEventTriggerDef
1959 * Functionality: Free Event Trigger Definition
1961 * @params[in] E2SM-KPM Event Trigger Definition
1964 * ****************************************************************/
1965 void FreeEventTriggerDef(E2SM_KPM_EventTriggerDefinition_t *eventTiggerDef)
1969 switch(eventTiggerDef->eventDefinition_formats.present)
1971 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING:
1973 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1:
1974 RIC_FREE(eventTiggerDef->eventDefinition_formats.choice.eventDefinition_Format1, \
1975 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
1981 /*******************************************************************
1983 * @brief Fill Event Trigger Definition
1987 * Function : fillEventTriggerDef
1989 * Functionality: Fill Event Trigger Definition
1991 * @params[in] RIC Event Trigger Definition
1995 * ****************************************************************/
1996 uint8_t fillEventTriggerDef(RICeventTriggerDefinition_t *ricEventTriggerDef)
1998 uint8_t ret = RFAILED;
1999 asn_enc_rval_t encRetVal;
2000 E2SM_KPM_EventTriggerDefinition_t eventTiggerDef;
2004 /* Fill E2SM-KPM Event Trigger Definition Format 1 */
2005 eventTiggerDef.eventDefinition_formats.present = \
2006 E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1;
2008 RIC_ALLOC(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1, \
2009 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
2010 if(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1 == NULLP)
2012 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2016 eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1->reportingPeriod = 1000; /* In ms */
2018 /* Prints the Msg formed */
2019 xer_fprint(stdout, &asn_DEF_E2SM_KPM_EventTriggerDefinition, &eventTiggerDef);
2021 /* Encode E2SM-KPM Event Trigger Definition */
2022 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2024 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_EventTriggerDefinition, 0, &eventTiggerDef, PrepFinalEncBuf, encBuf);
2025 if(encRetVal.encoded == ENCODE_FAIL)
2027 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM event trigger definition structure (at %s)\n",\
2028 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2032 /* Copy encoded E2SM-KPM event trigger definition to E2AP octet string buffer */
2033 ricEventTriggerDef->size = encBufSize;
2034 RIC_ALLOC(ricEventTriggerDef->buf, encBufSize);
2035 if(ricEventTriggerDef->buf == NULLP)
2037 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2040 memcpy(ricEventTriggerDef->buf, encBuf, encBufSize);
2046 FreeEventTriggerDef(&eventTiggerDef);
2050 /*******************************************************************
2052 * @brief builds RIC Subscription Details
2056 * Function : BuildsRicSubsDetails
2058 * Functionality: Builds the RIC Subscription Details
2060 * @params[in] RIC Subscription details to be filled
2061 * RIC subscriotion DB
2062 * @return ROK - success
2065 * ****************************************************************/
2067 uint8_t BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails, RicSubscription *ricSubsInfo)
2069 uint8_t elementCnt = 0;
2070 uint8_t elementIdx = 0;
2072 if(subsDetails == NULLP)
2074 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
2080 /* RIC Event Trigger Definition */
2081 if(fillEventTriggerDef(&subsDetails->ricEventTriggerDefinition) != ROK)
2083 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
2087 /* RIC Actions To Be Setup List */
2089 subsDetails->ricAction_ToBeSetup_List.list.count = elementCnt;
2090 subsDetails->ricAction_ToBeSetup_List.list.size = elementCnt * sizeof(RICaction_ToBeSetup_ItemIEs_t *);
2091 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
2092 if(subsDetails->ricAction_ToBeSetup_List.list.array == NULLP)
2094 DU_LOG("\nERROR --> E2AP : Memory allocation for RICactionToBeSetup Items failed");
2098 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
2100 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t));
2101 if(!subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
2103 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2107 if(elementIdx < elementCnt)
2112 if(fillActionToBeSetup((RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], \
2113 ricSubsInfo) != ROK)
2115 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
2124 /*******************************************************************
2126 * @brief Builds and Send the RicSubscriptionReq
2130 * Function : BuildAndSendRicSubscriptionReq
2132 * Functionality:Fills the RicSubscriptionReq
2134 * @return ROK - success
2137 ******************************************************************/
2138 uint8_t BuildAndSendRicSubscriptionReq(DuDb *duDb)
2140 uint8_t ret = RFAILED;
2141 uint8_t elementCnt = 0;
2143 uint8_t actionIdx = 0;
2144 asn_enc_rval_t encRetVal; /* Encoder return value */
2145 E2AP_PDU_t *e2apRicMsg = NULL;
2146 RICsubscriptionRequest_t *ricSubscriptionReq;
2147 RanFunction *ranFuncDb = &duDb->ranFunction[0];
2148 CmLList *ricSubsNode = NULLP;
2149 RicSubscription *ricSubsInfo = NULLP;
2151 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n");
2153 /* Allocate memory to store RIC subscription info in RIC DB */
2154 RIC_ALLOC(ricSubsInfo, sizeof(RicSubscription));
2157 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2160 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
2162 ricSubsInfo->actionSequence[actionIdx].actionId = -1;
2167 RIC_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
2168 if(e2apRicMsg == NULLP)
2170 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2174 e2apRicMsg->present = E2AP_PDU_PR_initiatingMessage;
2175 RIC_ALLOC(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
2176 if(e2apRicMsg->choice.initiatingMessage == NULLP)
2178 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2181 e2apRicMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscription;
2182 e2apRicMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
2183 e2apRicMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionRequest;
2185 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
2188 ricSubscriptionReq->protocolIEs.list.count = elementCnt;
2189 ricSubscriptionReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionRequest_IEs_t);
2191 /* Initialize the subscription members */
2192 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
2193 if(ricSubscriptionReq->protocolIEs.list.array == NULLP)
2195 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2199 for(idx=0; idx<elementCnt; idx++)
2201 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
2202 if(ricSubscriptionReq->protocolIEs.list.array[idx] == NULLP)
2204 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2208 if(idx < elementCnt)
2211 /* Filling RIC Request Id */
2213 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
2214 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2215 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2216 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
2217 if(BuildNewRicRequestId(&ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICrequestID, \
2218 &ricSubsInfo->requestId) != ROK)
2220 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
2225 /* Filling RAN Function Id */
2227 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
2228 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2229 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2230 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
2231 ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ranFuncDb->id;
2232 ricSubsInfo->ranFuncId = ranFuncDb->id;
2234 /* Filling RIC Subscription Details */
2236 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICsubscriptionDetails;
2237 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
2238 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
2239 RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
2240 if(BuildRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails),\
2241 ricSubsInfo) != ROK)
2243 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
2247 /* Prints the Msg formed */
2248 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
2250 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2252 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
2253 if(encRetVal.encoded == ENCODE_FAIL)
2255 DU_LOG("\nERROR --> E2AP : Could not encode RicSubscriptionRequest structure (at %s)\n",\
2256 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2261 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicSubscriptionRequest\n");
2262 for(int i=0; i< encBufSize; i++)
2264 DU_LOG("%x",encBuf[i]);
2269 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2271 DU_LOG("\nERROR --> E2AP : Sending RIC subscription Request failed");
2275 /* Add RIC Subscription Info to RAN Function's RIC Subscription List */
2276 RIC_ALLOC(ricSubsNode , sizeof(CmLList));
2279 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
2282 ricSubsNode->node = (PTR)ricSubsInfo;
2283 cmLListAdd2Tail(&ranFuncDb->subscriptionList, ricSubsNode);
2291 RIC_FREE(ricSubsInfo, sizeof(RicSubscription));
2292 RIC_FREE(ricSubsNode , sizeof(CmLList));
2295 FreeRicSubscriptionReq(e2apRicMsg);
2299 /*******************************************************************
2301 * @brief Process RicSubscriptionResponse
2305 * Function : ProcRicSubscriptionRsp
2307 * Functionality: Processes RicSubscriptionRsp
2309 * @return ROK - void
2311 ******************************************************************/
2313 void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricSubscriptionRsp)
2315 uint8_t duIdx = 0, ieIdx = 0, notAdmitIdx = 0;
2316 uint8_t ranFuncId = 0, actionId = 0;
2318 bool ricReqIdDecoded = false;
2319 RicRequestId ricReqId;
2320 RanFunction *ranFuncDb = NULLP;
2321 RicSubscription *ricSubs = NULLP;
2322 CmLList *ricSubsNode = NULLP;
2323 ActionInfo *action = NULLP;
2324 RICsubscriptionResponse_IEs_t *ricSubsRspIe = NULLP;
2325 RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
2327 DU_LOG("\nINFO --> E2AP : RIC Subscription Response received");
2330 SEARCH_DU_DB(duIdx, duId, duDb);
2333 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
2337 memset(&ricReqId, 0, sizeof(RicRequestId));
2338 if(ricSubscriptionRsp)
2340 if(ricSubscriptionRsp->protocolIEs.list.array)
2342 for(ieIdx=0; ieIdx<ricSubscriptionRsp->protocolIEs.list.count; ieIdx++)
2344 if(ricSubscriptionRsp->protocolIEs.list.array[ieIdx])
2346 ricSubsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
2347 switch(ricSubscriptionRsp->protocolIEs.list.array[ieIdx]->id)
2349 case ProtocolIE_IDE2_id_RICrequestID:
2351 ricReqId.requestorId = ricSubsRspIe->value.choice.RICrequestID.ricRequestorID;
2352 ricReqId.instanceId = ricSubsRspIe->value.choice.RICrequestID.ricInstanceID;
2353 ricReqIdDecoded = true;
2356 case ProtocolIE_IDE2_id_RANfunctionID:
2358 ranFuncId = ricSubsRspIe->value.choice.RANfunctionID;
2359 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
2362 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionResponse: RAN Function ID [%d] not found", ranFuncId);
2367 case ProtocolIE_IDE2_id_RICactions_Admitted:
2371 case ProtocolIE_IDE2_id_RICactions_NotAdmitted:
2373 if(!(ranFuncDb && ricReqIdDecoded))
2376 notAdmitList = &ricSubsRspIe->value.choice.RICaction_NotAdmitted_List;
2377 for(notAdmitIdx = 0; notAdmitIdx < notAdmitList->list.count; notAdmitIdx++)
2379 actionId = ((RICaction_NotAdmitted_ItemIEs_t *)(notAdmitList->list.array[notAdmitIdx]))->\
2380 value.choice.RICaction_NotAdmitted_Item.ricActionID;
2382 /* Remove action from RAN Function's subscription list */
2383 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
2386 action = fetchActionInfoFromActionId(actionId, ricSubs);
2389 memset(action, 0, sizeof(ActionInfo));
2390 ricSubs->actionSequence[actionId].actionId = -1;
2391 ricSubs->numOfActions--;
2404 /*******************************************************************
2406 * @brief deallocate the memory allocated in E2SetupFailure
2410 * Function : FreeE2SetupFailure
2412 * Functionality: deallocate the memory allocated in E2SetupFailure
2414 * @params[in] E2AP_PDU_t *e2apMsg
2417 * ****************************************************************/
2418 void FreeE2SetupFailure(E2AP_PDU_t *e2apMsg)
2421 E2setupFailure_t *e2SetupFail;
2425 if(e2apMsg->choice.unsuccessfulOutcome)
2427 e2SetupFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
2428 if(e2SetupFail->protocolIEs.list.array)
2430 for(arrIdx=0; arrIdx<e2SetupFail->protocolIEs.list.count; arrIdx++)
2432 RIC_FREE(e2SetupFail->protocolIEs.list.array[arrIdx], sizeof(E2setupFailureIEs_t));
2434 RIC_FREE(e2SetupFail->protocolIEs.list.array, e2SetupFail->protocolIEs.list.size);
2436 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
2438 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2442 /*******************************************************************
2444 * @brief Buld and send the E2 Setup failure
2448 * Function : BuildAndSendE2SetupFailure
2451 * - Buld and send the E2 Setup failure
2452 * @return ROK - success
2455 * ****************************************************************/
2457 uint8_t BuildAndSendE2SetupFailure(uint32_t duId, uint8_t transId)
2459 uint8_t ret = RFAILED;
2460 E2AP_PDU_t *e2apMsg = NULL;
2461 E2setupFailure_t *e2SetupFailure;
2462 asn_enc_rval_t encRetVal;
2465 bool memAllocFailed = false;
2467 DU_LOG("\nINFO --> E2AP : Building E2 Setup failure\n");
2470 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2471 if(e2apMsg == NULLP)
2473 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2476 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
2477 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
2478 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
2480 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2484 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
2485 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
2486 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2setupFailure;
2487 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
2490 e2SetupFailure->protocolIEs.list.count = elementCnt;
2491 e2SetupFailure->protocolIEs.list.size = elementCnt * sizeof(struct E2setupFailureIEs *);
2493 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array, e2SetupFailure->protocolIEs.list.size);
2494 if(e2SetupFailure->protocolIEs.list.array == NULLP)
2496 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2500 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2502 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array[arrIdx], sizeof(struct E2setupFailureIEs));
2503 if(e2SetupFailure->protocolIEs.list.array[arrIdx] == NULLP)
2505 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2506 memAllocFailed = true;
2511 if(memAllocFailed == true)
2513 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
2519 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2520 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2521 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
2522 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2525 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
2526 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2527 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
2528 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = CauseE2_PR_protocol;
2529 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.protocol = CauseE2Protocol_unspecified;
2532 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
2533 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
2534 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
2535 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
2537 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2538 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2540 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2542 /* Check encode results */
2543 if(encRetVal.encoded == ENCODE_FAIL)
2545 DU_LOG("\nERROR --> E2AP : Could not encode E2 Setup failure structure (at %s)\n",\
2546 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2551 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Setup Failure\n");
2552 for(int i=0; i< encBufSize; i++)
2554 DU_LOG("%x",encBuf[i]);
2558 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2560 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Failure failed");
2568 FreeE2SetupFailure(e2apMsg);
2572 /*******************************************************************
2574 * @brief process the e2setup request
2578 * Function : ProcE2SetupReq
2580 * Functionality: process the e2setup request
2584 ******************************************************************/
2586 void ProcE2SetupReq(uint32_t *duId, E2setupRequest_t *e2SetupReq)
2588 uint8_t arrIdx = 0, duIdx = 0, transId =0;
2589 uint16_t ranFuncIdx=0, e2NodeAddListIdx =0;
2590 E2NodeConfigList tmpE2NodeList;
2592 bool ieProcessingFailed = false;
2593 E2nodeComponentConfigAddition_List_t *e2NodeAddList=NULLP;
2594 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem=NULLP;
2595 RANfunction_ItemIEs_t *ranFuncItemIe=NULLP;
2596 RANfunction_Item_t *ranFunItem=NULLP;
2597 RANfunctions_List_t *ranFunctionsList=NULLP;
2599 memset(&tmpE2NodeList, 0, sizeof(E2NodeConfigList));
2602 DU_LOG("\nERROR --> E2AP : e2SetupReq pointer is null");
2605 if(!e2SetupReq->protocolIEs.list.array)
2607 DU_LOG("\nERROR --> E2AP : e2SetupReq array pointer is null");
2611 for(arrIdx=0; arrIdx<e2SetupReq->protocolIEs.list.count; arrIdx++)
2613 if(e2SetupReq->protocolIEs.list.array[arrIdx])
2615 switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id)
2617 case ProtocolIE_IDE2_id_TransactionID:
2619 transId = e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
2622 case ProtocolIE_IDE2_id_GlobalE2node_ID:
2624 if(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID)
2626 *duId =e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID->buf[0];
2628 SEARCH_DU_DB(duIdx, *duId, duDb);
2631 duDb = &ricCb.duInfo[ricCb.numDu];
2634 memset(duDb, 0, sizeof(DuDb));
2639 case ProtocolIE_IDE2_id_RANfunctionsAdded:
2641 ranFunctionsList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
2643 if(ranFunctionsList->list.array)
2645 for(ranFuncIdx=0;ranFuncIdx<ranFunctionsList->list.count; ranFuncIdx++)
2647 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
2648 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
2649 duDb->ranFunction[ranFunItem->ranFunctionID-1].id = ranFunItem->ranFunctionID;
2650 duDb->ranFunction[ranFunItem->ranFunctionID-1].revisionCounter = ranFunItem->ranFunctionRevision;
2651 cmLListInit(&duDb->ranFunction[ranFunItem->ranFunctionID-1].subscriptionList);
2652 duDb->numOfRanFunction++;
2657 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
2659 e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
2660 if(e2NodeAddList->list.array)
2662 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
2664 if(e2NodeAddList->list.array[e2NodeAddListIdx])
2666 /* Storing the E2 node information in DB */
2667 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *)e2NodeAddList->list.array[e2NodeAddListIdx];
2668 if(handleE2NodeComponentAction(duDb, (PTR)&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item,\
2669 ProtocolIE_IDE2_id_E2nodeComponentConfigAddition, &tmpE2NodeList.addedE2Node[tmpE2NodeList.addedE2NodeCount++]) != ROK)
2671 DU_LOG("\nERROR --> E2AP : Processing of E2 node component idx %d failed",e2NodeAddListIdx);
2685 if(BuildAndSendE2SetupRsp(duDb, transId, tmpE2NodeList) !=ROK)
2687 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 setup response");
2690 /*******************************************************************
2692 * @brief Deallocate the memory allocated for E2 Reset Response
2696 * Function : FreeE2ResetResponse
2699 * - freeing the memory allocated for E2ResetResponse
2701 * @params[in] E2AP_PDU_t *e2apMsg
2702 * @return ROK - success
2705 * ****************************************************************/
2706 void FreeE2ResetResponse(E2AP_PDU_t *e2apMsg)
2709 ResetResponseE2_t *resetResponse =NULLP;
2711 if(e2apMsg != NULLP)
2713 if(e2apMsg->choice.successfulOutcome != NULLP)
2715 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2716 if(resetResponse->protocolIEs.list.array)
2718 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
2720 if(resetResponse->protocolIEs.list.array[ieIdx])
2722 RIC_FREE(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2725 RIC_FREE(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2727 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2729 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2733 /*******************************************************************
2735 * @brief Buld and send the Reset Response msg
2739 * Function : BuildAndSendResetResponse
2742 * - Buld and send the Reset Response Message
2747 * @return ROK - success
2750 * ****************************************************************/
2751 uint8_t BuildAndSendResetResponse(uint32_t duId, uint8_t transId)
2753 uint8_t ieIdx = 0, elementCnt = 0;
2754 uint8_t ret = RFAILED;
2755 E2AP_PDU_t *e2apMsg = NULLP;
2756 ResetResponseE2_t *resetResponse=NULL;
2757 asn_enc_rval_t encRetVal; /* Encoder return value */
2759 DU_LOG("\nINFO --> E2AP : Building E2 Reset Response Message\n");
2762 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2763 if(e2apMsg == NULLP)
2765 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse(): Memory allocation for E2AP-PDU failed");
2768 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
2770 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2771 if(e2apMsg->choice.successfulOutcome == NULLP)
2773 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
2777 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
2778 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2779 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_ResetResponseE2;
2780 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2783 resetResponse->protocolIEs.list.count = elementCnt;
2784 resetResponse->protocolIEs.list.size = elementCnt * sizeof(ResetResponseIEs_t *);
2785 RIC_ALLOC(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2786 if(!resetResponse->protocolIEs.list.array)
2788 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array");
2792 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
2794 RIC_ALLOC(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2795 if(!resetResponse->protocolIEs.list.array[ieIdx])
2797 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array element");
2801 if(ieIdx < elementCnt)
2805 resetResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2806 resetResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
2807 resetResponse->protocolIEs.list.array[ieIdx]->value.present = ResetResponseIEs__value_PR_TransactionID;
2808 resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
2810 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2812 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2814 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2815 if(encRetVal.encoded == ENCODE_FAIL)
2817 DU_LOG("\nERROR --> E2AP : Could not encode E2 reset response structure (at %s)\n",\
2818 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2823 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Reset Response \n");
2824 for(int i=0; i< encBufSize; i++)
2826 DU_LOG("%x",encBuf[i]);
2831 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2833 DU_LOG("\nERROR --> E2AP : Failed to send E2 Reset Response");
2841 FreeE2ResetResponse(e2apMsg);
2845 /*******************************************************************
2847 * @brief deallocate the memory allocated in building the
2848 * Service Query message
2852 * Function : FreeRicServiceQuery
2854 * Functionality: deallocate the memory allocated in building
2855 * Ric Service Query message
2857 * @params[in] E2AP_PDU_t *e2apMsg
2860 * ****************************************************************/
2862 void FreeRicServiceQuery(E2AP_PDU_t *e2apMsg)
2864 uint8_t arrIdx = 0, ranFuncIdx=0;
2865 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
2866 RICserviceQuery_t *ricServiceQuery=NULL;
2870 if(e2apMsg->choice.initiatingMessage)
2872 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2873 if(ricServiceQuery->protocolIEs.list.array)
2875 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
2877 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
2879 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
2881 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
2883 ranFuncAcceptedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2884 if(ranFuncAcceptedList->list.array)
2886 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
2888 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
2890 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
2894 case RICserviceQuery_IEs__value_PR_TransactionID:
2899 RIC_FREE(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2902 RIC_FREE(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2904 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
2906 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2910 /*******************************************************************
2912 * @brief build and send the ric service Query
2916 * Function : BuildAndSendRicServiceQuery
2918 * Functionality: build and send the ric service Query
2919 * @return ROK - success
2920 * RFAILED - Acknowledge
2922 ******************************************************************/
2924 uint8_t BuildAndSendRicServiceQuery(DuDb *duDb)
2928 uint8_t ret = RFAILED;
2929 bool memAllocFailed = false;
2930 E2AP_PDU_t *e2apMsg = NULL;
2931 asn_enc_rval_t encRetVal;
2932 RICserviceQuery_t *ricServiceQuery;
2934 DU_LOG("\nINFO --> E2AP : Building Ric service Query\n");
2937 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2938 if(e2apMsg == NULLP)
2940 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2943 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
2944 RIC_ALLOC(e2apMsg->choice.initiatingMessage , sizeof(struct InitiatingMessageE2));
2945 if(e2apMsg->choice.initiatingMessage == NULLP)
2947 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2951 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceQuery;
2952 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
2953 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceQuery;
2954 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2957 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
2958 if(duDb->numOfRanFunction)
2961 ricServiceQuery->protocolIEs.list.count = elementCnt;
2962 ricServiceQuery->protocolIEs.list.size = elementCnt * sizeof(RICserviceQuery_IEs_t*);
2964 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2965 if(ricServiceQuery->protocolIEs.list.array == NULLP)
2967 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2971 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2973 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2974 if(ricServiceQuery->protocolIEs.list.array[arrIdx] == NULLP)
2976 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2977 memAllocFailed = true;
2981 if(memAllocFailed == true)
2983 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2989 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2990 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2991 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_TransactionID;
2992 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = assignTransactionId(duDb);
2994 if(duDb->numOfRanFunction)
2996 /* Accepted RAN function Id */
2998 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
2999 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3000 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_RANfunctionsID_List;
3001 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceQuery)!=ROK)
3003 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
3008 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3009 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3011 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3013 /* Check encode results */
3014 if(encRetVal.encoded == ENCODE_FAIL)
3016 DU_LOG("\nERROR --> E2AP : Could not encode RIC service Query structure (at %s)\n",\
3017 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3022 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service Query\n");
3023 for(int i=0; i< encBufSize; i++)
3025 DU_LOG("%x",encBuf[i]);
3029 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
3031 DU_LOG("\nERROR --> E2AP : Sending of RIC service Query failed");
3038 FreeRicServiceQuery(e2apMsg);
3042 /*******************************************************************
3044 * @brief deallocate the memory allocated in RicServiceUpdateFailure
3048 * Function : FreeRicServiceUpdateFailure
3050 * Functionality: deallocate the memory allocated in RicServiceUpdatefailure
3052 * @params[in] E2AP_PDU_t *e2apMsg
3055 * ****************************************************************/
3057 void FreeRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
3060 RICserviceUpdateFailure_t *ricServiceUpdateFailure=NULL;
3064 if(e2apMsg->choice.unsuccessfulOutcome)
3066 ricServiceUpdateFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
3067 if(ricServiceUpdateFailure->protocolIEs.list.array)
3069 for(arrIdx=0; arrIdx<ricServiceUpdateFailure->protocolIEs.list.count; arrIdx++)
3071 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
3073 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array, ricServiceUpdateFailure->protocolIEs.list.size);
3075 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3077 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3081 /*******************************************************************
3083 * @brief build and send the ric service update failure
3087 * Function : BuildAndSendRicServiceUpdateFailure
3089 * Functionality: build and send the ric service update failure
3090 * @return ROK - success
3093 ******************************************************************/
3095 uint8_t BuildAndSendRicServiceUpdateFailure(uint32_t duId, int8_t transId, CauseE2_PR causePresent, uint8_t reason)
3098 E2AP_PDU_t *e2apMsg = NULL;
3099 asn_enc_rval_t encRetVal;
3100 uint8_t ret = RFAILED;
3102 uint8_t elementCnt=0;
3103 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
3105 DU_LOG("\nINFO --> E2AP : Building Ric service update failure\n");
3108 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3109 if(e2apMsg == NULLP)
3111 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3114 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3115 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
3116 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3118 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3122 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
3123 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3124 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure;
3125 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
3128 ricServiceFailure->protocolIEs.list.count = elementCnt;
3129 ricServiceFailure->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateFailure_IEs_t *);
3131 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array, ricServiceFailure->protocolIEs.list.size);
3132 if(ricServiceFailure->protocolIEs.list.array == NULLP)
3134 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
3138 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
3140 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
3141 if(ricServiceFailure->protocolIEs.list.array[arrIdx] == NULLP)
3143 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
3147 if(arrIdx<elementCnt)
3149 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
3155 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
3156 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3157 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TransactionID;
3158 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
3161 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
3162 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3163 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_CauseE2;
3164 fillE2FailureCause(&ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, causePresent, reason);
3167 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
3168 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
3169 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TimeToWaitE2;
3170 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
3172 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3173 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3175 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3177 /* Check encode results */
3178 if(encRetVal.encoded == ENCODE_FAIL)
3180 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update failure structure (at %s)\n",\
3181 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3186 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Failure\n");
3187 for(int i=0; i< encBufSize; i++)
3189 DU_LOG("%x",encBuf[i]);
3193 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
3195 DU_LOG("\nERROR --> E2AP : Sending RIC service update failed");
3202 FreeRicServiceUpdateFailure(e2apMsg);
3207 /*******************************************************************
3209 * @brief deallocate the memory allocated in RicServiceUpdateAck(
3213 * Function : FreeRicServiceUpdateAck
3215 * Functionality: deallocate the memory allocated in RicServiceUpdateAck
3217 * @params[in] E2AP_PDU_t *e2apMsg
3220 * ****************************************************************/
3222 void FreeRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
3224 uint8_t arrIdx = 0, ranFuncIdx=0;
3225 RANfunctionsID_List_t *acceptedList=NULL;
3226 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
3227 RANfunctionsIDcause_List_t *rejectedList=NULL;
3231 if(e2apMsg->choice.successfulOutcome)
3233 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
3234 if(ricServiceUpdateAck->protocolIEs.list.array)
3236 for(arrIdx=0; arrIdx<ricServiceUpdateAck->protocolIEs.list.count; arrIdx++)
3238 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx])
3240 switch(ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id)
3242 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
3244 acceptedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
3245 if(acceptedList->list.array)
3247 for(ranFuncIdx=0;ranFuncIdx<acceptedList->list.count; ranFuncIdx++)
3249 RIC_FREE(acceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
3251 RIC_FREE(acceptedList->list.array, acceptedList->list.size);
3256 case ProtocolIE_IDE2_id_RANfunctionsRejected:
3258 rejectedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
3259 if(rejectedList->list.array)
3261 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
3263 RIC_FREE(rejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
3265 RIC_FREE(rejectedList->list.array, rejectedList->list.size);
3270 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
3273 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
3275 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
3277 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3281 /*******************************************************************
3283 * @brief Build RAN function rejected list
3287 * Function : BuildRanFunctionRejectedList
3289 * Functionality: Build RAN function rejected list
3292 * Count of ran functions to be rejected in the list
3293 * Received list of RAN functions
3295 * @return ROK - success
3297 * ****************************************************************/
3299 uint8_t BuildRanFunctionRejectedList(uint8_t count, RanFunction *ranFunRejectedList, RANfunctionsIDcause_List_t *ranFuncRejectedList)
3301 uint8_t ranFuncIdx = 0;
3302 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
3304 ranFuncRejectedList->list.count = count;
3306 ranFuncRejectedList->list.size = ranFuncRejectedList->list.count*sizeof(RANfunctionIDcause_ItemIEs_t*);
3307 RIC_ALLOC(ranFuncRejectedList->list.array, ranFuncRejectedList->list.size);
3308 if(ranFuncRejectedList->list.array == NULLP)
3310 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array");
3314 for(ranFuncIdx = 0; ranFuncIdx< ranFuncRejectedList->list.count; ranFuncIdx++)
3316 RIC_ALLOC(ranFuncRejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
3317 if(ranFuncRejectedList->list.array[ranFuncIdx] == NULLP)
3319 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array item");
3322 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)ranFuncRejectedList->list.array[ranFuncIdx];
3323 ranFuncRejectedItemIe->id = ProtocolIE_IDE2_id_RANfunctionIEcause_Item;
3324 ranFuncRejectedItemIe->criticality= CriticalityE2_ignore;
3325 ranFuncRejectedItemIe->value.present = RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item;
3326 ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID = ranFunRejectedList[ranFuncIdx].id;
3327 fillE2FailureCause(&ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.cause, CauseE2_PR_ricService,\
3328 CauseE2RICservice_ran_function_not_supported);
3334 /*******************************************************************
3336 * @brief build and send the ric service update Acknowledge
3340 * Function : BuildAndSendRicServiceUpdateAcknowledge
3342 * Functionality: build and send the ric service update Acknowledge
3343 * @return ROK - success
3344 * RFAILED - Acknowledge
3346 ******************************************************************/
3348 uint8_t BuildAndSendRicServiceUpdateAcknowledge(DuDb *duDb, int8_t transId, RicTmpRanFunList ricRanFuncList)
3350 E2AP_PDU_t *e2apMsg = NULL;
3351 asn_enc_rval_t encRetVal;
3352 uint8_t arrIdx=0, elementCnt=0, ret=RFAILED;;
3353 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
3355 DU_LOG("\nINFO --> E2AP : Building Ric service update Acknowledge\n");
3358 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3359 if(e2apMsg == NULLP)
3361 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3364 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
3365 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(struct SuccessfulOutcomeE2));
3366 if(e2apMsg->choice.successfulOutcome == NULLP)
3368 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
3372 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
3373 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
3374 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge;
3375 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
3378 if(ricRanFuncList.numOfRanFunAccepted)
3380 if(ricRanFuncList.numOfRanFuneRejected)
3384 ricServiceUpdateAck->protocolIEs.list.count = elementCnt;
3385 ricServiceUpdateAck->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateAcknowledge_IEs_t*);
3387 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
3388 if(ricServiceUpdateAck->protocolIEs.list.array == NULLP)
3390 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3394 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
3396 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
3397 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx] == NULLP)
3399 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3403 if(arrIdx<elementCnt)
3405 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
3411 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
3412 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3413 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_TransactionID;
3414 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
3416 if(ricRanFuncList.numOfRanFunAccepted)
3418 /* Accepted RAN function List */
3420 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
3421 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3422 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List;
3423 if(BuildRanFunctionAcceptedList(duDb, ricRanFuncList.numOfRanFunAccepted, ricRanFuncList.ranFunAcceptedList,\
3424 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceUpdate)!=ROK)
3426 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
3431 if(ricRanFuncList.numOfRanFuneRejected)
3433 /* RAN Functions Rejected List */
3435 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsRejected;
3436 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
3437 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List;
3438 if(BuildRanFunctionRejectedList(ricRanFuncList.numOfRanFuneRejected, ricRanFuncList.ranFunRejectedList, \
3439 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List)!=ROK)
3441 DU_LOG("\nERROR --> E2AP : Failed to build Ran function rejected list");
3447 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3448 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3450 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3452 /* Check encode results */
3453 if(encRetVal.encoded == ENCODE_FAIL)
3455 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update Acknowledge structure (at %s)\n",\
3456 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3461 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Acknowledge\n");
3462 for(int i=0; i< encBufSize; i++)
3464 DU_LOG("%x",encBuf[i]);
3468 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
3470 DU_LOG("\nERROR --> E2AP : Sending RIC service update ack failed");
3476 FreeRicServiceUpdateAck(e2apMsg);
3480 /*******************************************************************
3482 * @brief process the RIC service update
3486 * Function : ProcRicserviceUpdate
3488 * Functionality: process the RIC service update
3490 * @return ROK - success
3493 ******************************************************************/
3495 void ProcRicServiceUpdate(uint32_t duId, RICserviceUpdate_t *ricServiceUpdate)
3497 RicTmpRanFunList ricRanFuncList;
3500 uint8_t duIdx = 0, elementCnt =0, arrIdx = 0;
3501 uint16_t ranFuncIdx = 0, failedRanFuncCount=0, recvdRanFuncCount=0;
3502 RanFunction *ranFuncDb = NULLP;
3503 RANfunction_ItemIEs_t *ranFuncItemIe =NULL;
3504 RANfunction_Item_t *ranFuncItem =NULL;
3505 RANfunctionID_Item_t *ranFuncIdItem=NULL;
3506 RANfunctions_List_t *ranFuncList=NULL;
3507 RANfunctionsID_List_t *deleteList=NULL;
3508 RANfunctionID_ItemIEs_t *delRanFuncItem=NULL;
3510 SEARCH_DU_DB(duIdx, duId, duDb);
3513 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3516 memset(&ricRanFuncList, 0, sizeof(RicTmpRanFunList));
3518 if(!ricServiceUpdate)
3520 DU_LOG("\nERROR --> E2AP : ricServiceUpdate pointer is null");
3524 if(!ricServiceUpdate->protocolIEs.list.array)
3526 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array pointer is null");
3529 elementCnt = ricServiceUpdate->protocolIEs.list.count;
3530 for(arrIdx=0; arrIdx<ricServiceUpdate->protocolIEs.list.count; arrIdx++)
3532 if(!ricServiceUpdate->protocolIEs.list.array[arrIdx])
3534 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array idx %d pointer is null",arrIdx);
3538 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
3540 case ProtocolIE_IDE2_id_TransactionID:
3542 transId = ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
3544 if(transId < 0 || transId > 255)
3546 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
3552 case ProtocolIE_IDE2_id_RANfunctionsAdded:
3554 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
3556 if(ranFuncList->list.array)
3558 for(ranFuncIdx=0;ranFuncIdx<ranFuncList->list.count; ranFuncIdx++)
3560 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
3561 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
3563 /* Adding the ran function in temporary list */
3564 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
3565 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
3566 ricRanFuncList.numOfRanFunAccepted++;
3568 /* Adding the new ran function in DB*/
3569 duDb->ranFunction[ranFuncItem->ranFunctionID-1].id = ranFuncItem->ranFunctionID;
3570 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
3571 duDb->numOfRanFunction++;
3573 /* Calculating total number of ran fuctions which are received for addition */
3574 recvdRanFuncCount++;
3580 case ProtocolIE_IDE2_id_RANfunctionsModified:
3583 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
3584 if(ranFuncList->list.array)
3586 for(ranFuncIdx = 0; ranFuncIdx< ranFuncList->list.count; ranFuncIdx++)
3588 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
3589 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
3590 if(fetchRanFuncFromRanFuncId(duDb, ranFuncItem->ranFunctionID) == NULLP)
3592 /* Calculating total number of ran fuctions which are not present */
3593 failedRanFuncCount++;
3595 /* Adding the ran function in temporary list */
3596 ricRanFuncList.ranFunRejectedList[ricRanFuncList.numOfRanFuneRejected].id = ranFuncItem->ranFunctionID;
3597 ricRanFuncList.numOfRanFuneRejected++;
3602 /* Adding the ran function in temporary list */
3603 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
3604 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
3605 ricRanFuncList.numOfRanFunAccepted++;
3607 /* Updating the new ran function in DB*/
3608 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
3610 /* Calculating total number of ran fuctions which are received for modification */
3611 recvdRanFuncCount++;
3616 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
3619 deleteList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
3620 if(deleteList->list.array)
3622 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
3624 delRanFuncItem = (RANfunctionID_ItemIEs_t*) deleteList->list.array[ranFuncIdx];
3625 ranFuncIdItem = &delRanFuncItem->value.choice.RANfunctionID_Item;
3626 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncIdItem->ranFunctionID);
3629 memset(ranFuncDb, 0, sizeof(RanFunction));
3630 duDb->numOfRanFunction--;
3633 /* Calculating total number of ran fuctions which are received for deletion */
3634 recvdRanFuncCount++;
3642 DU_LOG("\nERROR --> E2AP : IE [%ld] is not supported",ricServiceUpdate->protocolIEs.list.array[arrIdx]->id);
3648 /* Sending RIC Service Update Failed if all RAN Functions received fail or if any IE processing fails
3649 * Else sending RIC Service Update Acknowledge */
3650 if((elementCnt > arrIdx) ||((recvdRanFuncCount > 0) && (recvdRanFuncCount == failedRanFuncCount)))
3652 if(BuildAndSendRicServiceUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
3654 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update Failure");
3660 if(BuildAndSendRicServiceUpdateAcknowledge(duDb, transId, ricRanFuncList) != ROK)
3662 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update acknowledge");
3668 /*******************************************************************
3670 * @brief Processing RIC subscription failure from DU
3674 * Function : ProcRicSubscriptionFailure
3676 * Functionality: Processing RIC subscription failure from DU
3678 * @param ID of DU from which message was sent
3679 * RIC Subscription failure message
3680 * @return ROK - success
3683 ******************************************************************/
3684 uint8_t ProcRicSubscriptionFailure(uint32_t duId, RICsubscriptionFailure_t *ricSubscriptionFailure)
3686 uint8_t ieIdx = 0, duIdx = 0;
3687 uint8_t ranFuncId = 0;
3689 RanFunction *ranFuncDb = NULLP;
3690 RicSubscription *ricSubs = NULLP;
3691 CmLList *ricSubsNode = NULLP;
3692 RicRequestId ricReqId;
3693 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
3695 DU_LOG("\nINFO --> E2AP : Received RIC subscription failure");
3697 SEARCH_DU_DB(duIdx, duId, duDb);
3700 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3704 memset(&ricReqId, 0, sizeof(RicRequestId));
3705 if(ricSubscriptionFailure)
3707 if(ricSubscriptionFailure->protocolIEs.list.array)
3709 for(ieIdx=0; ieIdx<ricSubscriptionFailure->protocolIEs.list.count; ieIdx++)
3711 if(ricSubscriptionFailure->protocolIEs.list.array[ieIdx])
3713 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[ieIdx];
3714 switch(ricSubscriptionFailure->protocolIEs.list.array[ieIdx]->id)
3716 case ProtocolIE_IDE2_id_RICrequestID:
3718 ricReqId.requestorId = ricSubsFailIe->value.choice.RICrequestID.ricRequestorID;
3719 ricReqId.instanceId = ricSubsFailIe->value.choice.RICrequestID.ricInstanceID;
3722 case ProtocolIE_IDE2_id_RANfunctionID:
3724 ranFuncId = ricSubsFailIe->value.choice.RANfunctionID;
3725 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
3728 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionFailure : RAN Function Id [%d] not found", ranFuncId);
3733 /* Remove subscription entry from RAN Function */
3734 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
3737 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
3738 deleteRicSubscriptionNode(ricSubsNode);
3743 case ProtocolIE_IDE2_id_CauseE2:
3745 /* No handling required as of now since this is a stub */
3755 /*******************************************************************
3757 * @brief Free RIC Subscription Modification Refuse
3761 * Function : FreeRicSubsModRefuse
3763 * Functionality: Free RIC Subscription Modification Refuse
3765 * @param E2AP Message PDU to be freed
3768 ******************************************************************/
3769 void FreeRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
3772 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3776 if(e2apMsg->choice.unsuccessfulOutcome)
3778 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3779 if(ricSubsModRefuse->protocolIEs.list.array)
3781 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
3783 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3785 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3787 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3789 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3793 /*******************************************************************
3795 * @brief Build And Send RIC Subscription Modification Refuse
3799 * Function : BuildAndSendRicSubsModRefuse
3801 * Functionality: Build And Send RIC Subscription Modification Refuse
3804 * RIC Request ID of subscription
3808 * @return ROK - success
3811 ******************************************************************/
3812 uint8_t BuildAndSendRicSubsModRefuse(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, CauseE2_PR causeType, \
3815 uint8_t ieIdx = 0, elementCnt = 0;
3816 uint8_t ret = RFAILED;
3817 E2AP_PDU_t *e2apMsg = NULL;
3818 asn_enc_rval_t encRetVal;
3819 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3820 RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
3822 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Refuse\n");
3825 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3826 if(e2apMsg == NULLP)
3828 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3831 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3832 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3833 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3835 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3839 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
3840 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3841 e2apMsg->choice.unsuccessfulOutcome->value.present = \
3842 UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse;
3843 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3846 ricSubsModRefuse->protocolIEs.list.count = elementCnt;
3847 ricSubsModRefuse->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRefuse_IEs_t *);
3848 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3849 if(!ricSubsModRefuse->protocolIEs.list.array)
3851 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3855 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
3857 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3858 if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
3860 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3865 /* RIC Request ID */
3867 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3868 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RICrequestID;
3869 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3870 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RICrequestID;
3871 ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3872 ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3874 /* RAN Function ID */
3876 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3877 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3878 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3879 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RANfunctionID;
3880 ricSubsModRefuseIe->value.choice.RANfunctionID = ranFuncId;
3884 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3885 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_CauseE2;
3886 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3887 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_CauseE2;
3888 fillE2FailureCause(&ricSubsModRefuseIe->value.choice.CauseE2, causeType, cause);
3890 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3891 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3893 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3895 /* Check encode results */
3896 if(encRetVal.encoded == ENCODE_FAIL)
3898 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification refuse (at %s)\n",\
3899 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3904 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification refuse\n");
3905 for(int i=0; i< encBufSize; i++)
3907 DU_LOG("%x",encBuf[i]);
3911 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
3913 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Refused");
3920 FreeRicSubsModRefuse(e2apMsg);
3924 /*******************************************************************
3926 * @brief Free memory for RIC Subscription Modification Confirm
3930 * Function : FreeRicSubsModConfirm
3932 * Functionality: Free memory for RIC subscription modification
3935 * @param E2AP Message PDU to be freed
3938 ******************************************************************/
3939 void FreeRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
3941 uint8_t ieIdx = 0, arrIdx=0;
3942 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
3943 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
3944 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
3945 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
3946 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
3947 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
3951 if(e2apMsg->choice.successfulOutcome)
3953 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
3954 if(ricSubsModCfm->protocolIEs.list.array)
3956 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
3958 if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
3960 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3961 switch(ricSubsModCfmIe->id)
3963 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
3965 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
3966 if(modCfmList->list.array)
3968 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
3970 RIC_FREE(modCfmList->list.array[arrIdx], \
3971 sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
3973 RIC_FREE(modCfmList->list.array, modCfmList->list.size);
3978 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
3980 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
3981 if(modRefusedList->list.array)
3983 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
3985 RIC_FREE(modRefusedList->list.array[arrIdx], \
3986 sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
3988 RIC_FREE(modRefusedList->list.array, modRefusedList->list.size);
3993 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
3995 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
3996 if(rmvCfmList->list.array)
3998 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
4000 RIC_FREE(rmvCfmList->list.array[arrIdx], \
4001 sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
4003 RIC_FREE(rmvCfmList->list.array, rmvCfmList->list.size);
4008 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
4010 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
4011 if(rmvFailList->list.array)
4013 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
4015 RIC_ALLOC(rmvFailList->list.array[arrIdx], \
4016 sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
4018 RIC_FREE(rmvFailList->list.array, rmvFailList->list.size);
4027 RIC_FREE(ricSubsModCfmIe, sizeof(RICsubscriptionModificationConfirm_IEs_t));
4030 RIC_FREE(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
4032 RIC_FREE(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
4034 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4038 /*******************************************************************
4040 * @brief Fill the list of actions confirmed for modification
4044 * Function : fillActionModConfirmedList
4046 * Functionality: Fill the list of actions confirmed for modification
4048 * @param List to be filled
4050 * Source list of actions
4051 * @return ROK - success
4054 ******************************************************************/
4055 uint8_t fillActionModConfirmedList(RICactions_ConfirmedForModification_List_t *modCfmList, uint8_t numActions, \
4056 uint8_t *actionModifiedList)
4059 RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
4061 modCfmList->list.count = numActions;
4062 modCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForModification_ItemIEs_t *);
4063 RIC_ALLOC(modCfmList->list.array, modCfmList->list.size);
4064 if(!modCfmList->list.array)
4066 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4070 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
4072 RIC_ALLOC(modCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
4073 if(!modCfmList->list.array[arrIdx])
4075 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4079 modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
4080 modCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForModification_Item;
4081 modCfmListItem->criticality = CriticalityE2_ignore;
4082 modCfmListItem->value.present = \
4083 RICaction_ConfirmedForModification_ItemIEs__value_PR_RICaction_ConfirmedForModification_Item;
4084 modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID = actionModifiedList[arrIdx];
4090 /*******************************************************************
4092 * @brief Fill the list of actions refused to be modified
4096 * Function : fillActionModRefusedList
4098 * Functionality: Fill the list of actions refused to be modified
4100 * @param List to be filled
4102 * Source list of actions refused tobe modified
4103 * @return ROK - success
4106 ******************************************************************/
4107 uint8_t fillActionModRefusedList(RICactions_RefusedToBeModified_List_t *modRefusedList, uint8_t numActions, \
4108 ActionFailed *actionModFailedList)
4111 RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
4113 modRefusedList->list.count = numActions;
4114 modRefusedList->list.size = numActions * sizeof(RICaction_RefusedToBeModified_ItemIEs_t *);
4115 RIC_ALLOC(modRefusedList->list.array, modRefusedList->list.size);
4116 if(!modRefusedList->list.array)
4118 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4122 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
4124 RIC_ALLOC(modRefusedList->list.array[arrIdx], sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
4125 if(!modRefusedList->list.array[arrIdx])
4127 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4131 modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
4132 modRefusedListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeModified_Item;
4133 modRefusedListItem->criticality = CriticalityE2_ignore;
4134 modRefusedListItem->value.present = \
4135 RICaction_RefusedToBeModified_ItemIEs__value_PR_RICaction_RefusedToBeModified_Item;
4136 modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID = \
4137 actionModFailedList[arrIdx].actionId;
4138 fillE2FailureCause(&modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.cause, \
4139 actionModFailedList[arrIdx].failureType, actionModFailedList[arrIdx].cause);
4145 /*******************************************************************
4147 * @brief Fill the list of action confirmed for removal
4151 * Function : fillActionRemovalConfirmedList
4153 * Functionality: Fill the list of action confirmed for removal
4155 * @param List to be filled
4157 * Source list of actions removed
4158 * @return ROK - success
4161 ******************************************************************/
4162 uint8_t fillActionRemovalConfirmedList(RICactions_ConfirmedForRemoval_List_t *rmvCfmList, uint8_t numActions, \
4163 uint8_t *actionRemovedList)
4166 RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
4168 rmvCfmList->list.count = numActions;
4169 rmvCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t *);
4170 RIC_ALLOC(rmvCfmList->list.array, rmvCfmList->list.size);
4171 if(!rmvCfmList->list.array)
4173 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4177 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
4179 RIC_ALLOC(rmvCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
4180 if(!rmvCfmList->list.array[arrIdx])
4182 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4186 rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
4187 rmvCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForRemoval_Item;
4188 rmvCfmListItem->criticality = CriticalityE2_ignore;
4189 rmvCfmListItem->value.present = \
4190 RICaction_ConfirmedForRemoval_ItemIEs__value_PR_RICaction_ConfirmedForRemoval_Item;
4191 rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID = actionRemovedList[arrIdx];
4197 /*******************************************************************
4199 * @brief Fill the list of actions refused to be removed
4203 * Function : fillActionRemovalRefusedList
4205 * Functionality: Fill the list of actions refused to be removed
4207 * @param List to be filled
4209 * Source list of actions refused to be removed
4210 * @return ROK - success
4213 ******************************************************************/
4214 uint8_t fillActionRemovalRefusedList(RICactions_RefusedToBeRemoved_List_t *rmvFailList, \
4215 uint8_t numActions, ActionFailed *actionRmvlFailList)
4218 RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
4220 rmvFailList->list.count = numActions;
4221 rmvFailList->list.size = numActions * sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t *);
4222 RIC_ALLOC(rmvFailList->list.array, rmvFailList->list.size);
4223 if(!rmvFailList->list.array)
4225 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4229 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
4231 RIC_ALLOC(rmvFailList->list.array[arrIdx], sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
4232 if(!rmvFailList->list.array[arrIdx])
4234 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4238 rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
4239 rmvFailListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeRemoved_Item;
4240 rmvFailListItem->criticality = CriticalityE2_ignore;
4241 rmvFailListItem->value.present = \
4242 RICaction_RefusedToBeRemoved_ItemIEs__value_PR_RICaction_RefusedToBeRemoved_Item;
4243 rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID = actionRmvlFailList[arrIdx].actionId;
4244 fillE2FailureCause(&rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.cause, \
4245 actionRmvlFailList[arrIdx].failureType, actionRmvlFailList[arrIdx].cause);
4252 /*******************************************************************
4254 * @brief Build And Send RIC Subscription Modification Confirm
4258 * Function : BuildAndSendRicSubsModConfirm
4260 * Functionality: Build And Send RIC Subscription Modification Confirm
4263 * RIC Request ID of subscription
4265 * Temporary source action list
4266 * @return ROK - success
4269 ******************************************************************/
4270 uint8_t BuildAndSendRicSubsModConfirm(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, RicTmpActionList tmpActionList)
4272 uint8_t ieIdx = 0, elementCnt = 0;
4273 uint8_t ret = RFAILED;
4274 E2AP_PDU_t *e2apMsg = NULLP;
4275 asn_enc_rval_t encRetVal;
4276 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
4277 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
4279 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Confirm\n");
4282 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4283 if(e2apMsg == NULLP)
4285 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4289 /* Successful Outcome */
4290 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
4291 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
4292 if(e2apMsg->choice.successfulOutcome == NULLP)
4294 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4298 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
4299 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
4300 e2apMsg->choice.successfulOutcome->value.present = \
4301 SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm;
4302 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
4305 if(tmpActionList.numActionModified)
4307 if(tmpActionList.numActionModFailed)
4309 if(tmpActionList.numActionRemoved)
4311 if(tmpActionList.numActionRemovalFailed)
4314 ricSubsModCfm->protocolIEs.list.count = elementCnt;
4315 ricSubsModCfm->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationConfirm_IEs_t *);
4316 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
4317 if(!ricSubsModCfm->protocolIEs.list.array)
4319 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4323 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4325 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationConfirm_IEs_t));
4326 if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
4328 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
4333 /* RIC Request ID */
4335 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4336 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICrequestID;
4337 ricSubsModCfmIe->criticality = CriticalityE2_reject;
4338 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RICrequestID;
4339 ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
4340 ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
4342 /* RAN Function ID */
4344 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4345 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RANfunctionID;
4346 ricSubsModCfmIe->criticality = CriticalityE2_reject;
4347 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RANfunctionID;
4348 ricSubsModCfmIe->value.choice.RANfunctionID = ranFuncId;
4350 /* RIC Actions List confirmed for modification */
4351 if(tmpActionList.numActionModified)
4354 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4355 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List;
4356 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4357 ricSubsModCfmIe->value.present = \
4358 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForModification_List;
4359 if(fillActionModConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List, \
4360 tmpActionList.numActionModified, tmpActionList.actionModifiedList) != ROK)
4362 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Modification List", __func__);
4367 /* RIC Actions List refured to be modified */
4368 if(tmpActionList.numActionModFailed)
4371 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4372 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List;
4373 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4374 ricSubsModCfmIe->value.present = \
4375 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeModified_List;
4376 if(fillActionModRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List, \
4377 tmpActionList.numActionModFailed, tmpActionList.actionModFailedList) != ROK)
4379 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Refused to be Modified List", __func__);
4384 /* RIC Actions List confirmed for removal */
4385 if(tmpActionList.numActionRemoved)
4388 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4389 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List;
4390 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4391 ricSubsModCfmIe->value.present = \
4392 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForRemoval_List;
4393 if(fillActionRemovalConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List, \
4394 tmpActionList.numActionRemoved, tmpActionList.actionRemovedList) != ROK)
4396 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Removal List", __func__);
4401 /* RIC Actions List Refused to be removed */
4402 if(tmpActionList.numActionRemovalFailed)
4405 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
4406 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List;
4407 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
4408 ricSubsModCfmIe->value.present = \
4409 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeRemoved_List;
4410 if(fillActionRemovalRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List, \
4411 tmpActionList.numActionRemovalFailed, tmpActionList.actionRemovalFailedList) != ROK)
4413 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Failed to be Removed List", __func__);
4418 /* Print and encode E2AP Message PDU */
4419 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4420 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4422 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
4424 /* Check encode results */
4425 if(encRetVal.encoded == ENCODE_FAIL)
4427 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification confirm (at %s)\n",\
4428 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4433 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification confirm\n");
4434 for(int i=0; i< encBufSize; i++)
4436 DU_LOG("%x",encBuf[i]);
4440 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
4442 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Confirm");
4450 FreeRicSubsModConfirm(e2apMsg);
4454 /*******************************************************************
4456 * @brief Processing of RIC Subscription Modification Required
4460 * Function : ProcRicSubsModReqd
4462 * Functionality: Processing of RIC Subscription Modification Required
4463 * As of now, we do not identify any scenario where this message
4464 * shall be sent by DU. Hence, bare minimum handling has been
4468 * RIC Subscription Modification Required IEs
4469 * @return ROK-success
4472 ******************************************************************/
4473 uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t *ricSubsModReqd)
4475 uint8_t ieIdx = 0, actionIdx = 0, duIdx = 0;
4479 RicRequestId ricReqId;
4480 RanFunction *ranFuncDb = NULLP;
4481 RicSubscription *ricSubs = NULLP;
4482 CmLList *ricSubsNode = NULLP;
4483 ActionInfo *action = NULLP;
4484 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
4485 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
4486 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
4487 RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULLP;
4488 RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULLP;
4489 RicTmpActionList tmpActionList;
4491 memset(&ricReqId, 0, sizeof(RicRequestId));
4492 memset(&tmpActionList, 0, sizeof(RicTmpActionList));
4494 SEARCH_DU_DB(duIdx, duId, duDb);
4497 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4501 for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
4503 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
4504 switch(ricSubsModReqdIe->id)
4506 case ProtocolIE_IDE2_id_RICrequestID:
4508 ricReqId.requestorId = ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID;
4509 ricReqId.instanceId = ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID;
4512 case ProtocolIE_IDE2_id_RANfunctionID:
4514 ranFuncId = ricSubsModReqdIe->value.choice.RANfunctionID;
4515 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
4518 /* If RIC Subscription not found, send RIC Subscription modification refuse to DU */
4519 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RIC Subscription not found");
4520 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
4521 CauseE2RICrequest_ran_function_id_invalid);
4525 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
4528 /* If RAN Function not found, send RIC Subscription modification refuse to DU */
4529 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RAN Function ID [%d] not found",ranFuncId);
4530 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, \
4531 CauseE2_PR_ricRequest, CauseE2RICrequest_request_id_unknown);
4536 case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
4538 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
4539 for(actionIdx = 0; actionIdx < actionToBeModList->list.count; actionIdx++)
4541 actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[actionIdx];
4542 actionId = actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID;
4543 action = fetchActionInfoFromActionId(actionId, ricSubs);
4546 /* No modification required as of now, hence directly adding to the list */
4547 tmpActionList.actionModifiedList[tmpActionList.numActionModified++] = actionId;
4551 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].actionId = actionId;
4552 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].failureType = \
4553 CauseE2_PR_ricRequest;
4554 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].cause = \
4555 CauseE2RICrequest_action_not_supported;
4556 tmpActionList.numActionModFailed++;
4561 case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
4563 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
4564 for(actionIdx = 0; actionIdx < actionToBeRmvList->list.count; actionIdx++)
4566 actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[actionIdx];
4567 actionId = actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID;
4568 action = fetchActionInfoFromActionId(actionId, ricSubs);
4571 tmpActionList.actionRemovedList[tmpActionList.numActionRemoved++] = actionId;
4572 memset(action, 0, sizeof(ActionInfo));
4573 action->actionId = -1;
4574 ricSubs->numOfActions--;
4584 /* If none of the action modification/removal is supported,
4585 * send RIC Subscription Modification Refuse
4587 * send RIC Subscription Modification Confirm
4589 if(tmpActionList.numActionModified || tmpActionList.numActionRemoved)
4591 BuildAndSendRicSubsModConfirm(duId, ricReqId, ranFuncId, tmpActionList);
4595 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
4596 CauseE2RICrequest_action_not_supported);
4602 /*******************************************************************
4604 * @brief Free the ErrorIndication Message
4608 * Function : FreeRicIndication
4610 * Functionality: Free the ErrorIndication Message
4615 ******************************************************************/
4616 void FreeErrorIndication(E2AP_PDU_t *e2apMsg)
4619 ErrorIndicationE2_t *errorIndicationMsg= NULLP;
4621 if(e2apMsg != NULLP)
4623 if(e2apMsg->choice.initiatingMessage != NULLP)
4625 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
4626 if(errorIndicationMsg!= NULLP)
4628 if(errorIndicationMsg->protocolIEs.list.array != NULLP)
4630 for(arrIdx=0; arrIdx<errorIndicationMsg->protocolIEs.list.count; arrIdx++)
4632 RIC_FREE(errorIndicationMsg->protocolIEs.list.array[arrIdx],sizeof(ErrorIndicationE2_t));
4634 RIC_FREE(errorIndicationMsg->protocolIEs.list.array,errorIndicationMsg->protocolIEs.list.size);
4637 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4639 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4644 /*******************************************************************
4646 * @brief Builds and Send the ErrorIndication Message
4650 * Function : BuildAndSendErrorIndication
4652 * Functionality:Fills the ErrorIndication Message
4660 * @return ROK - success
4663 ******************************************************************/
4665 uint8_t BuildAndSendErrorIndication(uint32_t duId, int8_t transId, RicRequestId requestId, uint16_t ranFuncId, uint8_t reason)
4667 uint8_t elementCnt =0, arrIdx=0, ret = RFAILED;
4668 E2AP_PDU_t *e2apMsg = NULLP;
4669 ErrorIndicationE2_t *errorIndicationMsg=NULLP;
4670 asn_enc_rval_t encRetVal; /* Encoder return value */
4674 DU_LOG("\nINFO --> E2AP : Building Error Indication Message\n");
4676 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4677 if(e2apMsg == NULLP)
4679 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4683 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4684 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4685 if(e2apMsg->choice.initiatingMessage == NULLP)
4687 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4690 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_ErrorIndicationE2;
4691 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4692 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ErrorIndicationE2;
4694 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
4696 /* Element count is 2 for TransactionID/RICrequestID and Cause.
4697 * If the RAN function id is present, the count will be increased.*/
4702 errorIndicationMsg->protocolIEs.list.count = elementCnt;
4703 errorIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(ErrorIndicationE2_IEs_t*);
4705 /* Initialize the E2Setup members */
4706 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array, errorIndicationMsg->protocolIEs.list.size);
4707 if(errorIndicationMsg->protocolIEs.list.array == NULLP)
4709 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements in %s at line %d",__func__, __LINE__);
4712 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
4714 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array[arrIdx], sizeof(ErrorIndicationE2_IEs_t));
4715 if(errorIndicationMsg->protocolIEs.list.array[arrIdx] == NULLP)
4717 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array Idx %d in %s at line %d",arrIdx,__func__, __LINE__);
4721 if(arrIdx < elementCnt)
4726 if(transId >=0 && transId<=255)
4729 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4730 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4731 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_TransactionID;
4732 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
4737 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RICrequestID;
4738 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4739 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RICrequestID;
4740 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricRequestorID = requestId.requestorId;
4741 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricInstanceID = requestId.instanceId;
4746 /* RAN Function ID */
4748 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionID;
4749 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4750 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RANfunctionID;
4751 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionID = ranFuncId;
4756 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4757 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
4758 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
4759 fillE2FailureCause(&errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, CauseE2_PR_misc, reason);
4762 /* Prints the Msg formed */
4763 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4764 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4766 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4768 if(encRetVal.encoded == ENCODE_FAIL)
4770 DU_LOG("\nERROR --> E2AP : Could not encode Error Indication Message (at %s)\n",\
4771 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4776 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for Error Indication Message \n");
4777 #ifdef DEBUG_ASN_PRINT
4778 for(int i=0; i< encBufSize; i++)
4780 printf("%x",encBuf[i]);
4785 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
4787 DU_LOG("\nINFO --> E2AP : Sending Error Indication Message");
4793 FreeErrorIndication(e2apMsg);
4797 /*******************************************************************
4799 * @brief Deallocate the memory allocated for ResetRequest msg
4803 * Function : FreeResetRequest
4806 * - freeing the memory allocated for ResetRequest
4808 * @params[in] E2AP_PDU_t *e2apMsg
4809 * @return ROK - success
4812 * ****************************************************************/
4813 void FreeResetRequest(E2AP_PDU_t *e2apMsg)
4816 ResetRequestE2_t *resetReq = NULLP;
4818 if(e2apMsg != NULLP)
4820 if(e2apMsg->choice.initiatingMessage != NULLP)
4822 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4823 if(resetReq->protocolIEs.list.array)
4825 for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4827 RIC_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4829 RIC_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4831 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4833 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4837 /*******************************************************************
4839 * @brief Build and send the reset request msg
4843 * Function : BuildAndSendResetRequest
4846 * - Buld and send the reset request msg to E2 node
4852 * @return ROK - success
4855 * ****************************************************************/
4856 uint8_t BuildAndSendResetRequest(DuDb *duDb, CauseE2_PR causePresent, uint8_t reason)
4858 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
4859 uint8_t ret = RFAILED;
4860 E2AP_PDU_t *e2apMsg = NULLP;
4861 ResetRequestE2_t *resetReq = NULLP;
4862 asn_enc_rval_t encRetVal; /* Encoder return value */
4864 DU_LOG("\nINFO --> E2AP : Building Reset Request\n");
4868 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4869 if(e2apMsg == NULLP)
4871 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for E2AP-PDU failed");
4875 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4876 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4877 if(e2apMsg->choice.initiatingMessage == NULLP)
4879 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for initiatingMessage");
4883 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
4884 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4885 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
4886 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4889 resetReq->protocolIEs.list.count = elementCnt;
4890 resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
4892 RIC_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4893 if(!resetReq->protocolIEs.list.array)
4895 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4896 Reset Request IE array");
4900 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4902 RIC_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4903 if(!resetReq->protocolIEs.list.array[ieIdx])
4905 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4906 Reset Request IE array element");
4911 /* In case of failure */
4912 if(ieIdx < elementCnt)
4916 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4917 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
4918 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
4919 transId = assignTransactionId(duDb);
4920 resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
4923 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4924 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
4925 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
4926 fillE2FailureCause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, causePresent, reason);
4928 /* Prints the Msg formed */
4929 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4931 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4933 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4935 if(encRetVal.encoded == ENCODE_FAIL)
4937 DU_LOG("\nERROR --> E2AP : Could not encode reset request structure (at %s)\n",\
4938 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4943 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for reset request\n");
4944 #ifdef DEBUG_ASN_PRINT
4945 for(int i=0; i< encBufSize; i++)
4947 printf("%x",encBuf[i]);
4951 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
4953 DU_LOG("\nERROR --> E2AP : Sending reset request failed");
4962 /* Free all memory */
4963 FreeResetRequest(e2apMsg);
4967 /******************************************************************
4969 * @brief Delete Ric subscription node
4973 * Function : deleteRicSubscriptionNode
4975 * Functionality: Delete Ric subscription node
4977 * @params[in] Ric subscription info
4981 * ****************************************************************/
4982 void deleteRicSubscriptionNode(CmLList *subscriptionNode)
4984 uint8_t actionIdx=0;
4985 RicSubscription *ricSubscriptionInfo = NULLP;
4987 ricSubscriptionInfo = (RicSubscription*)subscriptionNode->node;
4989 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
4991 if(ricSubscriptionInfo->actionSequence[actionIdx].actionId > -1)
4993 memset(&ricSubscriptionInfo->actionSequence[actionIdx], 0, sizeof(ActionInfo));
4996 memset(ricSubscriptionInfo, 0, sizeof(RicSubscription));
4997 RIC_FREE(subscriptionNode->node, sizeof(RicSubscription));
4998 RIC_FREE(subscriptionNode, sizeof(CmLList));
5001 /*******************************************************************
5003 * @brief Delete RIC subscription List
5007 * Function : deleteRicSubscriptionList
5009 * Functionality: Delete RIC subscription list
5011 * @params[in] RIC Subscription list
5015 ******************************************************************/
5016 void deleteRicSubscriptionList(CmLListCp *subscriptionList)
5018 CmLList *subscriptionNode = NULLP;
5020 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
5021 while(subscriptionNode)
5023 cmLListDelFrm(subscriptionList, subscriptionNode);
5024 deleteRicSubscriptionNode(subscriptionNode);
5025 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
5029 /*******************************************************************
5031 * @brief process the E2 Reset Response
5035 * Function : ProcResetResponse
5037 * Functionality: Process E2 Reset Response
5041 * Pointer to reset response
5044 ******************************************************************/
5046 void ProcResetResponse(uint32_t duId, ResetResponseE2_t *resetRsp)
5048 uint8_t ieIdx = 0, duIdx =0;
5050 RanFunction *ranFuncDb = NULLP;
5051 uint16_t ranFuncIdx = 0;
5053 SEARCH_DU_DB(duIdx, duId, duDb);
5056 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
5062 DU_LOG("\nERROR --> E2AP : resetRsp pointer is null");
5066 if(!resetRsp->protocolIEs.list.array)
5068 DU_LOG("\nERROR --> E2AP : resetRsp array pointer is null");
5072 for(ieIdx=0; ieIdx < resetRsp->protocolIEs.list.count; ieIdx++)
5074 if(resetRsp->protocolIEs.list.array[ieIdx])
5076 switch(resetRsp->protocolIEs.list.array[ieIdx]->id)
5078 case ProtocolIE_IDE2_id_TransactionID:
5080 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
5082 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
5083 if(ranFuncDb->id > 0)
5085 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
5090 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
5100 /*******************************************************************
5102 * @brief process the E2 Reset Request
5106 * Function : ProcResetRequest
5108 * Functionality: Process E2 Reset Request
5112 * Pointer to reset response
5115 ******************************************************************/
5117 void ProcResetRequest(uint32_t duId, ResetRequestE2_t *resetReq)
5119 uint8_t ieIdx = 0, duIdx =0, transId=0;
5121 RanFunction *ranFuncDb = NULLP;
5122 uint16_t ranFuncIdx = 0;
5124 SEARCH_DU_DB(duIdx, duId, duDb);
5127 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
5133 DU_LOG("\nERROR --> E2AP : resetReq pointer is null");
5137 if(!resetReq->protocolIEs.list.array)
5139 DU_LOG("\nERROR --> E2AP : resetReq array pointer is null");
5143 for(ieIdx=0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
5145 if(resetReq->protocolIEs.list.array[ieIdx])
5147 switch(resetReq->protocolIEs.list.array[ieIdx]->id)
5149 case ProtocolIE_IDE2_id_TransactionID:
5151 transId = resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
5154 case ProtocolIE_IDE2_id_CauseE2:
5156 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
5158 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
5159 if(ranFuncDb->id > 0)
5161 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
5170 if(BuildAndSendResetResponse(duId, transId) !=ROK)
5172 DU_LOG("\nERROR --> E2AP : Failed to build and send reset response");
5176 /*******************************************************************
5178 * @brief Free RIC Subscription Delete Request Message
5182 * Function : FreeRicSubscriptionDeleteRequest
5184 * Functionality: Free RIC Subscription Delete Request
5186 * @param E2AP Message PDU
5189 ******************************************************************/
5190 void FreeRicSubscriptionDeleteRequest(E2AP_PDU_t *e2apMsg)
5192 uint8_t ieIdx = 0, arrIdx = 0;
5193 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
5197 if(e2apMsg->choice.initiatingMessage)
5199 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
5200 if(ricSubsDelReq->protocolIEs.list.array)
5202 for(ieIdx = 0; ieIdx < ricSubsDelReq->protocolIEs.list.count; ieIdx++)
5204 RIC_FREE(ricSubsDelReq->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequired_IEs_t));
5206 RIC_FREE(ricSubsDelReq->protocolIEs.list.array, ricSubsDelReq->protocolIEs.list.size);
5208 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5210 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));;
5214 /*******************************************************************
5216 * @brief Builds and Send RIC Subscription delete request
5220 * Function : BuildAndSendRicSubscriptionDeleteRequest
5222 * Functionality: Build and send RIC subscription delete request.
5225 * RIC subscription info to be deleted
5226 * @return ROK - success
5229 ******************************************************************/
5230 uint8_t BuildAndSendRicSubscriptionDeleteRequest(uint32_t duId, RicSubscription *ricSubsDb)
5232 uint8_t elementCnt = 0, ieIdx = 0, ret = RFAILED;
5233 E2AP_PDU_t *e2apMsg = NULLP;
5234 RICsubscriptionDeleteRequest_t *ricSubsDelReq = NULLP;
5235 RICsubscriptionDeleteRequest_IEs_t *ricSubsDelReqIe = NULLP;
5236 asn_enc_rval_t encRetVal; /* Encoder return value */
5240 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Delete Request Message\n");
5242 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5243 if(e2apMsg == NULLP)
5245 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
5249 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5250 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5251 if(e2apMsg->choice.initiatingMessage == NULLP)
5253 DU_LOG("\nERROR --> E2AP : %s: Memory allocation for E2AP-PDU failed at line %d",__func__, __LINE__);
5256 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionDelete;
5257 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5258 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequest;
5260 ricSubsDelReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
5263 ricSubsDelReq->protocolIEs.list.count = elementCnt;
5264 ricSubsDelReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionDeleteRequest_IEs_t *);
5266 RIC_ALLOC(ricSubsDelReq->protocolIEs.list.array, ricSubsDelReq->protocolIEs.list.size);
5267 if(ricSubsDelReq->protocolIEs.list.array == NULLP)
5269 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for array elements at line %d",__func__, __LINE__);
5273 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
5275 RIC_ALLOC(ricSubsDelReq->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionDeleteRequest_IEs_t));
5276 if(ricSubsDelReq->protocolIEs.list.array[ieIdx] == NULLP)
5278 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed for index [%d] at line %d", \
5279 __func__, ieIdx, __LINE__);
5283 if(ieIdx < elementCnt)
5286 /* RIC Request ID */
5288 ricSubsDelReqIe = ricSubsDelReq->protocolIEs.list.array[ieIdx];
5289 ricSubsDelReqIe->id = ProtocolIE_IDE2_id_RICrequestID;
5290 ricSubsDelReqIe->criticality = CriticalityE2_reject;
5291 ricSubsDelReqIe->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
5292 ricSubsDelReqIe->value.choice.RICrequestID.ricRequestorID = ricSubsDb->requestId.requestorId;
5293 ricSubsDelReqIe->value.choice.RICrequestID.ricInstanceID = ricSubsDb->requestId.instanceId;
5295 /* RAN Function ID */
5297 ricSubsDelReqIe = ricSubsDelReq->protocolIEs.list.array[ieIdx];
5298 ricSubsDelReqIe->id = ProtocolIE_IDE2_id_RANfunctionID;
5299 ricSubsDelReqIe->criticality = CriticalityE2_reject;
5300 ricSubsDelReqIe->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
5301 ricSubsDelReqIe->value.choice.RANfunctionID = ricSubsDb->ranFuncId;
5303 /* Prints the Msg formed */
5304 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5305 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5307 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
5308 if(encRetVal.encoded == ENCODE_FAIL)
5310 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Delete Request Message (at %s)\n",\
5311 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5316 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Delete Request Message \n");
5317 #ifdef DEBUG_ASN_PRINT
5318 for(int i=0; i< encBufSize; i++)
5320 printf("%x",encBuf[i]);
5325 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
5327 DU_LOG("\nERROR --> E2AP : Failed to send RIC Susbcription Delete Request Message");
5335 FreeRicSubscriptionDeleteRequest(e2apMsg);
5339 /*******************************************************************
5341 * @brief Processing of RIC Subscription Delete Required
5345 * Function : ProcRicSubsDeleteReqd
5347 * Functionality: Processing of RIC Subscription Delete Required
5348 * When received, RIC stub will initiate the RIC subscription
5349 * deletion procedure towards DU
5352 * RIC Subscription Delete Required IEs
5353 * @return ROK-success
5356 ******************************************************************/
5357 uint8_t ProcRicSubsDeleteReqd(uint32_t duId, RICsubscriptionDeleteRequired_t *ricSubsDelRqd)
5359 uint8_t ieIdx = 0, duIdx = 0;
5360 uint16_t arrIdx = 0;
5362 RicRequestId ricReqId;
5363 RanFunction *ranFuncDb = NULLP;
5364 RicSubscription *subsDb = NULLP;
5365 CmLList *ricSubsNode = NULLP;
5367 RICsubscriptionDeleteRequired_IEs_t *ricSubsDelRqdIe = NULLP;
5368 RICsubscription_List_withCause_t *ricSubsList = NULLP;
5369 RICsubscription_withCause_Item_t *subsItem = NULLP;
5371 memset(&ricReqId, 0, sizeof(RicRequestId));
5375 DU_LOG("\nERROR --> E2AP : %s: Received NULL message", __func__);
5379 SEARCH_DU_DB(duIdx, duId, duDb);
5382 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
5386 for(ieIdx = 0; ieIdx < ricSubsDelRqd->protocolIEs.list.count; ieIdx++)
5388 ricSubsDelRqdIe = ricSubsDelRqd->protocolIEs.list.array[ieIdx];
5389 switch(ricSubsDelRqdIe->id)
5391 case ProtocolIE_IDE2_id_RICsubscriptionToBeRemoved:
5393 ricSubsList = &ricSubsDelRqdIe->value.choice.RICsubscription_List_withCause;
5394 for(arrIdx = 0; arrIdx < ricSubsList->list.count; arrIdx++)
5396 subsItem = &(((RICsubscription_withCause_ItemIEs_t *)ricSubsList->list.array[arrIdx])->\
5397 value.choice.RICsubscription_withCause_Item);
5398 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, subsItem->ranFunctionID);
5401 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%ld] not found", __func__, subsItem->ranFunctionID);
5405 ricReqId.requestorId = subsItem->ricRequestID.ricRequestorID;
5406 ricReqId.instanceId = subsItem->ricRequestID.ricInstanceID;
5407 subsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
5410 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%ld] Instance_ID [%ld]", \
5411 __func__, subsItem->ricRequestID.ricRequestorID, subsItem->ricRequestID.ricInstanceID);
5415 /* Delete RIC Subcription from RAN Function */
5416 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
5418 /* Send RIC Subscription delete request and then free any memory
5419 * allocated to store subscription info at RIC */
5420 BuildAndSendRicSubscriptionDeleteRequest(duId, (RicSubscription *)ricSubsNode->node);
5421 deleteRicSubscriptionNode(ricSubsNode);
5434 /*******************************************************************
5436 * @brief Deallocate memory allocated for E2nodeConfigurationUpdate
5440 * Function : freeE2NodeConfigItem
5443 * - freeing the memory allocated for E2nodeConfigurationUpdate
5446 * uint8_t protocolIe
5447 * PTR to e2NodeCfg which is to be freed
5448 * @return ROK - success
5451 * ****************************************************************/
5453 void freeE2NodeConfigItem(uint8_t protocolIe, PTR e2NodeCfg)
5455 E2nodeComponentConfigurationAck_t *cfgAck =NULLP;
5456 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULLP;
5457 E2nodeComponentConfigAdditionAck_Item_t *e2NodeAdditionAckItemIe=NULLP;
5458 E2nodeComponentConfigRemovalAck_Item_t *e2NodeRemovalAckItemIe=NULLP;
5459 E2nodeComponentConfigUpdateAck_Item_t *e2NodeUpdateAckItemIe=NULLP;
5461 /* Extracting the component interface and configuration ack information from
5462 * e2NodeCfg based on the protocol id */
5465 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
5467 e2NodeAdditionAckItemIe= (E2nodeComponentConfigAdditionAck_Item_t*)e2NodeCfg;
5468 switch(e2NodeAdditionAckItemIe->e2nodeComponentInterfaceType)
5470 case E2nodeComponentInterfaceType_f1:
5472 f1InterfaceInfo = e2NodeAdditionAckItemIe->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
5481 cfgAck = &e2NodeAdditionAckItemIe->e2nodeComponentConfigurationAck;
5484 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
5486 e2NodeUpdateAckItemIe = (E2nodeComponentConfigUpdateAck_Item_t*)e2NodeCfg;
5487 switch(e2NodeUpdateAckItemIe->e2nodeComponentInterfaceType)
5489 case E2nodeComponentInterfaceType_f1:
5491 f1InterfaceInfo = e2NodeUpdateAckItemIe->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
5499 cfgAck = &e2NodeUpdateAckItemIe->e2nodeComponentConfigurationAck;
5502 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
5504 e2NodeRemovalAckItemIe= (E2nodeComponentConfigRemovalAck_Item_t*)e2NodeCfg;
5505 switch(e2NodeRemovalAckItemIe->e2nodeComponentInterfaceType)
5507 case E2nodeComponentInterfaceType_f1:
5509 f1InterfaceInfo = e2NodeRemovalAckItemIe->e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
5517 cfgAck = &e2NodeRemovalAckItemIe->e2nodeComponentConfigurationAck;
5521 /* Freeing the memory allocated to component interface and configuration ack */
5524 RIC_FREE(f1InterfaceInfo->gNB_DU_ID.buf, f1InterfaceInfo->gNB_DU_ID.size);
5525 RIC_FREE(f1InterfaceInfo, sizeof(E2nodeComponentInterfaceF1_t));
5528 switch(cfgAck->updateOutcome)
5530 case E2nodeComponentConfigurationAck__updateOutcome_success:
5532 case E2nodeComponentConfigurationAck__updateOutcome_failure:
5534 RIC_FREE(cfgAck->failureCauseE2, sizeof(CauseE2_t));
5541 /*******************************************************************
5543 * @brief Deallocate the memory allocated for E2nodeConfigurationUpdate msg
5547 * Function : FreeE2NodeConfigUpdate
5550 * - freeing the memory allocated for E2nodeConfigurationUpdate
5552 * @params[in] E2AP_PDU_t *e2apMsg
5553 * @return ROK - success
5556 * ****************************************************************/
5558 void FreeE2NodeConfigUpdateAck(E2AP_PDU_t *e2apMsg)
5560 uint8_t arrIdx =0, e2NodeConfigIdx=0;
5561 E2nodeConfigurationUpdateAcknowledge_t *updateAckMsg=NULL;
5562 E2nodeComponentConfigUpdateAck_ItemIEs_t *updateAckItemIe=NULL;
5563 E2nodeComponentConfigUpdateAck_List_t *updateAckList=NULL;
5564 E2nodeComponentConfigRemovalAck_ItemIEs_t *removalAckItemIe=NULL;
5565 E2nodeComponentConfigRemovalAck_List_t *removalAckList=NULL;
5566 E2nodeComponentConfigAdditionAck_ItemIEs_t *additionAckItemIte=NULL;
5567 E2nodeComponentConfigAdditionAck_List_t *additionAckList=NULL;
5569 if(e2apMsg != NULLP)
5571 if(e2apMsg->choice.successfulOutcome != NULLP)
5573 updateAckMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2nodeConfigurationUpdateAcknowledge;
5574 if(updateAckMsg->protocolIEs.list.array != NULLP)
5576 for(arrIdx = 0; arrIdx < updateAckMsg->protocolIEs.list.count; arrIdx++)
5578 if(updateAckMsg->protocolIEs.list.array[arrIdx])
5580 switch(updateAckMsg->protocolIEs.list.array[arrIdx]->id)
5582 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
5584 additionAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
5585 if(additionAckList->list.array)
5587 for(e2NodeConfigIdx=0; e2NodeConfigIdx<additionAckList->list.count; e2NodeConfigIdx++)
5589 additionAckItemIte = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) additionAckList->list.array[e2NodeConfigIdx];
5590 if(additionAckItemIte)
5592 freeE2NodeConfigItem(ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck,\
5593 (PTR)&additionAckItemIte->value.choice.E2nodeComponentConfigAdditionAck_Item);
5594 RIC_FREE(additionAckItemIte, sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
5597 RIC_FREE(additionAckList->list.array, additionAckList->list.size);
5601 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck:
5603 updateAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdateAck_List;
5604 if(updateAckList->list.array)
5606 for(e2NodeConfigIdx=0; e2NodeConfigIdx<updateAckList->list.count; e2NodeConfigIdx++)
5608 updateAckItemIe = (E2nodeComponentConfigUpdateAck_ItemIEs_t*) updateAckList->list.array[e2NodeConfigIdx];
5611 freeE2NodeConfigItem(ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck,\
5612 (PTR)&updateAckItemIe->value.choice.E2nodeComponentConfigUpdateAck_Item);
5613 RIC_FREE(updateAckItemIe, sizeof(E2nodeComponentConfigUpdateAck_ItemIEs_t));
5616 RIC_FREE(updateAckList->list.array, updateAckList->list.size);
5620 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck:
5622 removalAckList =&updateAckMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemovalAck_List;
5623 if(removalAckList->list.array)
5625 for(e2NodeConfigIdx=0; e2NodeConfigIdx<removalAckList->list.count; e2NodeConfigIdx++)
5627 removalAckItemIe = (E2nodeComponentConfigRemovalAck_ItemIEs_t*) removalAckList->list.array[e2NodeConfigIdx];
5628 if(removalAckItemIe)
5630 freeE2NodeConfigItem(ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck,\
5631 (PTR)&removalAckItemIe->value.choice.E2nodeComponentConfigRemovalAck_Item);
5632 RIC_FREE(removalAckItemIe, sizeof(E2nodeComponentConfigRemovalAck_ItemIEs_t));
5635 RIC_FREE(removalAckList->list.array, removalAckList->list.size);
5640 RIC_FREE(updateAckMsg->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateAcknowledge_IEs_t));
5643 RIC_FREE(updateAckMsg->protocolIEs.list.array, updateAckMsg->protocolIEs.list.size);
5645 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
5647 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5651 /*******************************************************************
5653 * @brief Build E2node Component config Removal ack list
5657 * Function : BuildE2nodeComponentConfigRemovalAck
5659 * Functionality: Build the e2 node remove ack
5662 * E2nodeComponentConfigRemovalAck_List_t to be filled
5663 * Count of e2 node to be removed
5664 * list of e2 node cfg to be removed
5666 * @return ROK - success
5668 * ****************************************************************/
5670 uint8_t BuildE2nodeComponentConfigRemovalAck(E2nodeComponentConfigRemovalAck_List_t *e2NodeConfigRemovalAckList,\
5671 uint16_t removalE2NodeCount, E2NodeConfigItem *removaldE2Node)
5674 E2nodeComponentConfigRemovalAck_ItemIEs_t *e2NodeRemovalAckItem=NULL;
5676 /* Filling the e2 node config removal ack list */
5677 e2NodeConfigRemovalAckList->list.count = removalE2NodeCount;
5678 e2NodeConfigRemovalAckList->list.size = e2NodeConfigRemovalAckList->list.count * sizeof(E2nodeComponentConfigRemovalAck_ItemIEs_t*);
5679 RIC_ALLOC(e2NodeConfigRemovalAckList->list.array, e2NodeConfigRemovalAckList->list.size);
5680 if(e2NodeConfigRemovalAckList->list.array == NULLP)
5682 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigRemovalAck %d",__LINE__);
5686 for(arrIdx = 0; arrIdx< e2NodeConfigRemovalAckList->list.count; arrIdx++)
5688 RIC_ALLOC(e2NodeConfigRemovalAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigRemovalAck_ItemIEs_t));
5689 if(e2NodeConfigRemovalAckList->list.array[arrIdx] == NULLP)
5691 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigRemovalAck %d",__LINE__);
5694 e2NodeRemovalAckItem = (E2nodeComponentConfigRemovalAck_ItemIEs_t*) e2NodeConfigRemovalAckList->list.array[arrIdx];
5695 e2NodeRemovalAckItem->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck_Item;
5696 e2NodeRemovalAckItem->criticality = CriticalityE2_reject;
5697 e2NodeRemovalAckItem->value.present = E2nodeComponentConfigRemovalAck_ItemIEs__value_PR_E2nodeComponentConfigRemovalAck_Item;
5699 /* Filling the e2 node config removal ack item */
5700 fillE2NodeConfigAck((PTR)&e2NodeRemovalAckItem->value.choice.E2nodeComponentConfigRemovalAck_Item, ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck,\
5701 &removaldE2Node[arrIdx].componentInfo, removaldE2Node[arrIdx].isSuccessful);
5706 /*******************************************************************
5708 * @brief Build E2node Component config update ack list
5712 * Function : BuildE2nodeComponentConfigUpdateAck
5714 * Functionality: Build E2node Component config update ack list
5717 * E2nodeComponentConfigUpdateAck_List to be filled
5718 * Count of e2 node to be update
5719 * list of e2 node cfg to be update
5721 * @return ROK - success
5723 * ****************************************************************/
5725 uint8_t BuildE2nodeComponentConfigUpdateAck(E2nodeComponentConfigUpdateAck_List_t *e2NodeConfigUpdateAckList,\
5726 uint16_t updatedE2NodeCount, E2NodeConfigItem *updatedE2Node)
5729 E2nodeComponentConfigUpdateAck_ItemIEs_t *e2NodeUpdateAckItem=NULL;
5731 /* Filling the e2 node config update ack list */
5732 e2NodeConfigUpdateAckList->list.count = updatedE2NodeCount;
5733 e2NodeConfigUpdateAckList->list.size = e2NodeConfigUpdateAckList->list.count * sizeof(E2nodeComponentConfigUpdateAck_ItemIEs_t*);
5734 RIC_ALLOC(e2NodeConfigUpdateAckList->list.array, e2NodeConfigUpdateAckList->list.size);
5735 if(e2NodeConfigUpdateAckList->list.array == NULLP)
5737 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
5741 for(arrIdx = 0; arrIdx< e2NodeConfigUpdateAckList->list.count; arrIdx++)
5743 RIC_ALLOC(e2NodeConfigUpdateAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigUpdateAck_ItemIEs_t));
5744 if(e2NodeConfigUpdateAckList->list.array[arrIdx] == NULLP)
5746 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigUpdateAck %d",__LINE__);
5749 e2NodeUpdateAckItem = (E2nodeComponentConfigUpdateAck_ItemIEs_t*) e2NodeConfigUpdateAckList->list.array[arrIdx];
5750 e2NodeUpdateAckItem->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck_Item;
5751 e2NodeUpdateAckItem->criticality = CriticalityE2_reject;
5752 e2NodeUpdateAckItem->value.present = E2nodeComponentConfigUpdateAck_ItemIEs__value_PR_E2nodeComponentConfigUpdateAck_Item;
5754 /* Filling the e2 node config update ack item */
5755 fillE2NodeConfigAck((PTR)&e2NodeUpdateAckItem->value.choice.E2nodeComponentConfigUpdateAck_Item, ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck,\
5756 &updatedE2Node[arrIdx].componentInfo, updatedE2Node[arrIdx].isSuccessful);
5762 /*******************************************************************
5764 * @brief Buld and send the E2 node config update ack msg
5768 * Function : BuildAndSendE2NodeConfigUpdateAck
5771 * - Buld and send the E2 node config update ack msg
5775 * list of E2 node cfg which needs to fill in IEs
5776 * @return ROK - success
5779 * ****************************************************************/
5781 uint8_t BuildAndSendE2NodeConfigUpdateAck(DuDb *duDb, uint8_t transId, E2NodeConfigList *e2NodeList)
5783 uint8_t ret = RFAILED;
5784 uint8_t arrIdx = 0,elementCnt = 0;
5785 E2AP_PDU_t *e2apMsg = NULLP;
5786 asn_enc_rval_t encRetVal;
5787 E2nodeConfigurationUpdateAcknowledge_t *e2NodeConfigUpdateAck = NULLP;
5789 DU_LOG("\nINFO --> E2AP : Building E2 Node config update Ack Message\n");
5792 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5793 if(e2apMsg == NULLP)
5795 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5798 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
5799 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
5800 if(e2apMsg->choice.successfulOutcome == NULLP)
5802 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5806 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
5807 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
5808 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateAcknowledge;
5809 e2NodeConfigUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.E2nodeConfigurationUpdateAcknowledge;
5812 if(e2NodeList->addedE2NodeCount)
5814 if(e2NodeList->updatedE2NodeCount)
5816 if(e2NodeList->removedE2NodeCount)
5819 e2NodeConfigUpdateAck->protocolIEs.list.count = elementCnt;
5820 e2NodeConfigUpdateAck->protocolIEs.list.size = elementCnt * sizeof(E2nodeConfigurationUpdateAcknowledge_IEs_t*);
5821 RIC_ALLOC(e2NodeConfigUpdateAck->protocolIEs.list.array, e2NodeConfigUpdateAck->protocolIEs.list.size);
5822 if(e2NodeConfigUpdateAck->protocolIEs.list.array == NULLP)
5824 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5828 for(arrIdx =0; arrIdx<elementCnt; arrIdx++)
5830 RIC_ALLOC(e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateAcknowledge_IEs_t));
5831 if(e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx] == NULLP)
5834 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__,__LINE__);
5839 if(arrIdx<elementCnt)
5843 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
5844 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5845 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_TransactionID;
5846 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
5848 if(e2NodeList->addedE2NodeCount)
5851 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck;
5852 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5853 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigAdditionAck_List;
5854 if(BuildE2nodeComponentConfigAdditionAck(&e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List,\
5855 e2NodeList->addedE2NodeCount, e2NodeList->addedE2Node)!=ROK)
5858 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list");
5862 if(e2NodeList->updatedE2NodeCount)
5865 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdateAck;
5866 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5867 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigUpdateAck_List;
5868 if(BuildE2nodeComponentConfigUpdateAck(&e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdateAck_List,\
5869 e2NodeList->updatedE2NodeCount, e2NodeList->updatedE2Node)!=ROK)
5872 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config update ack list");
5876 if(e2NodeList->removedE2NodeCount)
5879 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemovalAck;
5880 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5881 e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdateAcknowledge_IEs__value_PR_E2nodeComponentConfigRemovalAck_List;
5882 if(BuildE2nodeComponentConfigRemovalAck(&e2NodeConfigUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemovalAck_List,\
5883 e2NodeList->removedE2NodeCount, e2NodeList->removedE2Node)!=ROK)
5886 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config removal ack list");
5890 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5892 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5894 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
5896 if(encRetVal.encoded == ENCODE_FAIL)
5898 DU_LOG("\nERROR --> E2AP : Could not encode E2 Node config update ack structure (at %s)\n",\
5899 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5904 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Node config update ack \n");
5905 for(int i=0; i< encBufSize; i++)
5907 DU_LOG("%x",encBuf[i]);
5913 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
5915 DU_LOG("\nERROR --> E2AP : Failed to send E2 Node config update ack ");
5922 FreeE2NodeConfigUpdateAck(e2apMsg);
5927 /******************************************************************
5929 * @brief Processes the E2 removal failure msg
5933 * Function : procE2RemovalFailure
5935 * Functionality: Processes the E2 removal failure msg
5938 * E2 Removal Failure information
5942 * ****************************************************************/
5943 void ProcE2RemovalFailure(E2RemovalFailure_t *e2RemovalFailure)
5945 uint8_t ieIdx = 0, transId=0;
5946 CauseE2_t *cause = NULLP;
5948 if(!e2RemovalFailure)
5950 DU_LOG("\nERROR --> E2AP : e2RemovalFailure pointer is null");
5954 if(!e2RemovalFailure->protocolIEs.list.array)
5956 DU_LOG("\nERROR --> E2AP : e2RemovalFailure array pointer is null");
5960 for(ieIdx=0; ieIdx < e2RemovalFailure->protocolIEs.list.count; ieIdx++)
5962 if(e2RemovalFailure->protocolIEs.list.array[ieIdx])
5964 switch(e2RemovalFailure->protocolIEs.list.array[ieIdx]->id)
5966 case ProtocolIE_IDE2_id_TransactionID:
5968 transId = e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
5969 DU_LOG("\nERROR --> E2AP : Received transID %d", transId);
5972 case ProtocolIE_IDE2_id_CauseE2:
5974 cause = &e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
5975 printE2ErrorCause(cause);
5980 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%d]", e2RemovalFailure->protocolIEs.list.array[ieIdx]->id);
5987 /*******************************************************************
5989 * @brief Delete E2 component node list
5993 * Function : deleteE2ComponentNodeList
5995 * Functionality: Delete E2 component node list
5997 * @params[in] E2 component node list
6001 ******************************************************************/
6003 void deleteE2ComponentNodeList(CmLListCp *componentList)
6005 E2NodeComponent *cfgInfo = NULLP;
6006 CmLList *e2ComponentNode = NULLP;
6008 CM_LLIST_FIRST_NODE(componentList, e2ComponentNode);
6009 while(e2ComponentNode)
6011 cfgInfo = (E2NodeComponent*)e2ComponentNode->node;
6012 cmLListDelFrm(componentList, e2ComponentNode);
6013 memset(cfgInfo, 0, sizeof(E2NodeComponent));
6014 CM_LLIST_FIRST_NODE(componentList, e2ComponentNode);
6018 /*******************************************************************
6020 * @brief process the E2 node information from ric db
6024 * Function : deleteE2NodeInfo
6026 * Functionality: process the E2 node information from ric db
6033 ******************************************************************/
6034 void deleteE2NodeInfo(DuDb *duDb)
6036 uint16_t ranFuncIdx =0;
6037 RanFunction *ranFuncDb=NULLP;
6039 DU_LOG("\nINFO --> E2AP : Removing all the E2 node information");
6040 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
6042 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
6043 if(ranFuncDb->id > 0)
6045 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
6048 deleteE2ComponentNodeList(&duDb->e2NodeComponent);
6051 /*******************************************************************
6053 * @brief process the E2 Removal Response
6057 * Function : ProcE2RemovalResponse
6059 * Functionality: Process E2 Removal Response
6063 * Pointer to removal response
6066 ******************************************************************/
6068 void ProcE2RemovalResponse(uint32_t duId, E2RemovalResponse_t *removalRsp)
6070 uint8_t ieIdx = 0, duIdx =0;
6073 SEARCH_DU_DB(duIdx, duId, duDb);
6076 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
6082 DU_LOG("\nERROR --> E2AP : removalRsp pointer is null");
6086 if(!removalRsp->protocolIEs.list.array)
6088 DU_LOG("\nERROR --> E2AP : removalRsp array pointer is null");
6092 for(ieIdx=0; ieIdx < removalRsp->protocolIEs.list.count; ieIdx++)
6094 if(removalRsp->protocolIEs.list.array[ieIdx])
6096 switch(removalRsp->protocolIEs.list.array[ieIdx]->id)
6098 case ProtocolIE_IDE2_id_TransactionID:
6100 DU_LOG("\nINFO --> E2AP : Sending request to close the sctp connection");
6101 cmInetClose(&sctpCb.e2LstnSockFd);
6102 deleteE2NodeInfo(duDb);
6107 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", removalRsp->protocolIEs.list.array[ieIdx]->id);
6114 /*******************************************************************
6116 * @brief Deallocate the memory allocated for E2 Removal Failure
6120 * Function : FreeE2RemovalFailure
6123 * - freeing the memory allocated for E2RemovalFailure
6125 * @params[in] E2AP_PDU_t *e2apMsg
6128 * ****************************************************************/
6129 void FreeE2RemovalFailure(E2AP_PDU_t *e2apMsg)
6132 E2RemovalFailure_t *e2RemovalFailure=NULLP;
6134 if(e2apMsg != NULLP)
6136 if(e2apMsg->choice.unsuccessfulOutcome != NULLP)
6138 e2RemovalFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2RemovalFailure;
6139 if(e2RemovalFailure->protocolIEs.list.array)
6141 for(ieIdx=0; ieIdx < e2RemovalFailure->protocolIEs.list.count; ieIdx++)
6143 if(e2RemovalFailure->protocolIEs.list.array[ieIdx])
6145 RIC_FREE(e2RemovalFailure->protocolIEs.list.array[ieIdx], sizeof(E2RemovalFailureIEs_t));
6148 RIC_FREE(e2RemovalFailure->protocolIEs.list.array, e2RemovalFailure->protocolIEs.list.size);
6150 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
6152 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6156 /*******************************************************************
6158 * @brief Buld and send the E2 Removal Failure msg
6162 * Function : BuildAndSendE2RemovalFailure
6165 * - Buld and send the E2 Removal Failure Message
6171 * @return ROK - success
6174 * ****************************************************************/
6176 uint8_t BuildAndSendRemovalFailure(uint32_t duId, uint16_t transId, CauseE2_PR causePresent, uint8_t reason)
6178 uint8_t ieIdx = 0, elementCnt = 0;
6179 uint8_t ret = RFAILED;
6180 E2AP_PDU_t *e2apMsg = NULLP;
6181 E2RemovalFailure_t *e2RemovalFailure=NULLP;
6182 asn_enc_rval_t encRetVal; /* Encoder return value */
6184 DU_LOG("\nINFO --> E2AP : Building E2 Removal Failure Message\n");
6187 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6188 if(e2apMsg == NULLP)
6190 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6193 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
6195 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
6196 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
6198 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6202 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2removal;
6203 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
6204 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2RemovalFailure;
6205 e2RemovalFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2RemovalFailure;
6208 e2RemovalFailure->protocolIEs.list.count = elementCnt;
6209 e2RemovalFailure->protocolIEs.list.size = elementCnt * sizeof(E2RemovalFailureIEs_t *);
6210 RIC_ALLOC(e2RemovalFailure->protocolIEs.list.array, e2RemovalFailure->protocolIEs.list.size);
6211 if(!e2RemovalFailure->protocolIEs.list.array)
6213 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6217 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6219 RIC_ALLOC(e2RemovalFailure->protocolIEs.list.array[ieIdx], sizeof(E2RemovalFailureIEs_t));
6220 if(!e2RemovalFailure->protocolIEs.list.array[ieIdx])
6222 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6226 if(ieIdx < elementCnt)
6230 e2RemovalFailure->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6231 e2RemovalFailure->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6232 e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.present = E2RemovalFailureIEs__value_PR_TransactionID;
6233 e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
6237 e2RemovalFailure->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
6238 e2RemovalFailure->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
6239 e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
6240 fillE2FailureCause(&e2RemovalFailure->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, causePresent, reason);
6242 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6244 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6246 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6247 if(encRetVal.encoded == ENCODE_FAIL)
6249 DU_LOG("\nERROR --> E2AP : Could not encode E2 removal failure structure (at %s)\n",\
6250 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6255 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Removal Failure \n");
6256 for(int i=0; i< encBufSize; i++)
6258 DU_LOG("%x",encBuf[i]);
6263 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
6265 DU_LOG("\nERROR --> E2AP : Failed to send E2 Removal Failure");
6273 FreeE2RemovalFailure(e2apMsg);
6277 /*******************************************************************
6279 * @brief Deallocate the memory allocated for E2 Removal Response
6283 * Function : FreeE2RemovalResponse
6286 * - freeing the memory allocated for E2RemovalResponse
6288 * @params[in] E2AP_PDU_t *e2apMsg
6289 * @return ROK - success
6292 * ****************************************************************/
6293 void FreeE2RemovalResponse(E2AP_PDU_t *e2apMsg)
6296 E2RemovalResponse_t *e2RemovalResponse=NULLP;
6298 if(e2apMsg != NULLP)
6300 if(e2apMsg->choice.successfulOutcome != NULLP)
6302 e2RemovalResponse = &e2apMsg->choice.successfulOutcome->value.choice.E2RemovalResponse;
6303 if(e2RemovalResponse->protocolIEs.list.array)
6305 for(ieIdx=0; ieIdx < e2RemovalResponse->protocolIEs.list.count; ieIdx++)
6307 if(e2RemovalResponse->protocolIEs.list.array[ieIdx])
6309 RIC_FREE(e2RemovalResponse->protocolIEs.list.array[ieIdx], sizeof(E2RemovalResponseIEs_t));
6312 RIC_FREE(e2RemovalResponse->protocolIEs.list.array, e2RemovalResponse->protocolIEs.list.size);
6314 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6316 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6320 /*******************************************************************
6322 * @brief Buld and send the E2 Removal Response msg
6326 * Function : BuildAndSendE2RemovalResponse
6329 * - Buld and send the E2 Removal Response Message
6333 * @return ROK - success
6336 * ****************************************************************/
6337 uint8_t BuildAndSendRemovalResponse(uint32_t duId, uint16_t transId)
6339 uint8_t ieIdx = 0, elementCnt = 0;
6340 uint8_t ret = RFAILED, duIdx =0;
6341 E2AP_PDU_t *e2apMsg = NULLP;
6343 E2RemovalResponse_t *e2RemovalResponse=NULLP;
6344 asn_enc_rval_t encRetVal; /* Encoder return value */
6346 DU_LOG("\nINFO --> E2AP : Building E2 Removal Response Message\n");
6349 SEARCH_DU_DB(duIdx, duId, duDb);
6352 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
6356 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6357 if(e2apMsg == NULLP)
6359 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6362 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
6364 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6365 if(e2apMsg->choice.successfulOutcome == NULLP)
6367 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6371 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2removal;
6372 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
6373 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_E2RemovalResponse;
6374 e2RemovalResponse = &e2apMsg->choice.successfulOutcome->value.choice.E2RemovalResponse;
6377 e2RemovalResponse->protocolIEs.list.count = elementCnt;
6378 e2RemovalResponse->protocolIEs.list.size = elementCnt * sizeof(E2RemovalResponseIEs_t *);
6379 RIC_ALLOC(e2RemovalResponse->protocolIEs.list.array, e2RemovalResponse->protocolIEs.list.size);
6380 if(!e2RemovalResponse->protocolIEs.list.array)
6382 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6386 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6388 RIC_ALLOC(e2RemovalResponse->protocolIEs.list.array[ieIdx], sizeof(E2RemovalResponseIEs_t));
6389 if(!e2RemovalResponse->protocolIEs.list.array[ieIdx])
6391 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6395 if(ieIdx < elementCnt)
6399 e2RemovalResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6400 e2RemovalResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6401 e2RemovalResponse->protocolIEs.list.array[ieIdx]->value.present = E2RemovalResponseIEs__value_PR_TransactionID;
6402 e2RemovalResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
6404 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6406 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6408 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6409 if(encRetVal.encoded == ENCODE_FAIL)
6411 DU_LOG("\nERROR --> E2AP : Could not encode E2 removal response structure (at %s)\n",\
6412 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6417 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Removal Response \n");
6418 for(int i=0; i< encBufSize; i++)
6420 DU_LOG("%x",encBuf[i]);
6425 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
6427 DU_LOG("\nERROR --> E2AP : Failed to send E2 Removal Response");
6435 FreeE2RemovalResponse(e2apMsg);
6439 /*******************************************************************
6441 * @brief Process Removal req received from RIC
6445 * Function : procE2RemovalRequest
6447 * Functionality: Process Removal req received from RIC
6451 * E2 Removal Request
6454 ******************************************************************/
6456 void procE2RemovalRequest(uint32_t duId, E2RemovalRequest_t *removalReq)
6459 uint16_t transId =0;
6461 DU_LOG("\nINFO --> E2AP : E2 Removal request received");
6463 for(arrIdx=0; arrIdx<removalReq->protocolIEs.list.count; arrIdx++)
6465 switch(removalReq->protocolIEs.list.array[arrIdx]->id)
6467 case ProtocolIE_IDE2_id_TransactionID:
6469 transId = removalReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
6474 DU_LOG("\nERROR --> E2AP : Invalid IE recevied [%d]", transId);
6480 if(transId>=0 && transId<=255)
6482 if(BuildAndSendRemovalResponse(duId, transId) != ROK)
6484 DU_LOG("\nERROR --> E2AP : Failed to build and send Removal response");
6489 if(BuildAndSendRemovalFailure(duId, transId, CauseE2_PR_protocol, CauseE2Protocol_abstract_syntax_error_falsely_constructed_message) != ROK)
6491 DU_LOG("\nERROR --> E2AP : Failed to build and send Removal response");
6496 /*******************************************************************
6498 * @brief fill E2 connection update item
6502 * Function : fillE2connectionUpdateItem
6504 * Functionality: fill E2 connection update item
6507 * E2connectionUpdate Item to be filled
6509 * @return ROK - success
6511 * ****************************************************************/
6513 uint8_t fillE2connectionUpdateItem(PTR connectionInfo, uint8_t protocolId)
6515 E2connectionUpdateRemove_Item_t *connectionRemoveITem=NULLP;
6516 E2connectionUpdate_Item_t *connectionModifyItem=NULLP;
6517 TNLinformation_t *tnlInformation = NULLP;
6518 TNLusage_t *tnlUsage=NULLP;
6522 case ProtocolIE_IDE2_id_E2connectionUpdate_Item:
6524 connectionModifyItem = (E2connectionUpdate_Item_t*)connectionInfo;
6525 tnlInformation = &connectionModifyItem->tnlInformation;
6526 tnlUsage = &connectionModifyItem->tnlUsage;
6530 case ProtocolIE_IDE2_id_E2connectionUpdateRemove_Item:
6532 connectionRemoveITem = (E2connectionUpdateRemove_Item_t*)connectionInfo;
6533 tnlInformation= &connectionRemoveITem->tnlInformation;
6538 tnlInformation->tnlAddress.size = 4*sizeof(uint8_t);
6539 RIC_ALLOC(tnlInformation->tnlAddress.buf, tnlInformation->tnlAddress.size);
6540 if(!tnlInformation->tnlAddress.buf)
6542 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6546 tnlInformation->tnlAddress.buf[3] = ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr & 0xFF;
6547 tnlInformation->tnlAddress.buf[2] = (ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr>> 8) & 0xFF;
6548 tnlInformation->tnlAddress.buf[1] = (ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr>> 16) & 0xFF;
6549 tnlInformation->tnlAddress.buf[0] = (ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr>> 24) & 0xFF;
6550 tnlInformation->tnlAddress.bits_unused = 0;
6551 if(protocolId == ProtocolIE_IDE2_id_E2connectionUpdate_Item)
6553 *tnlUsage = TNLusage_support_function;
6558 /*******************************************************************
6560 * @brief Build E2 connection modification list
6564 * Function : BuildE2ConnectionModifyList
6566 * Functionality: Build E2 connection modification list
6569 * E2 connection modification list to be filled
6571 * @return ROK - success
6573 * ****************************************************************/
6575 uint8_t BuildE2ConnectionModifyList(E2connectionUpdate_List_t *connectionToBeModifyList)
6578 E2connectionUpdate_ItemIEs_t *connectionModify=NULL;
6580 connectionToBeModifyList->list.count = 1;
6582 connectionToBeModifyList->list.size = connectionToBeModifyList->list.count*sizeof(E2connectionUpdate_ItemIEs_t*);
6583 RIC_ALLOC(connectionToBeModifyList->list.array, connectionToBeModifyList->list.size);
6584 if(connectionToBeModifyList->list.array)
6586 for(arrIdx = 0; arrIdx< connectionToBeModifyList->list.count; arrIdx++)
6588 RIC_ALLOC(connectionToBeModifyList->list.array[arrIdx], sizeof(E2connectionUpdate_ItemIEs_t));
6589 if(connectionToBeModifyList->list.array[arrIdx] == NULLP)
6591 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6594 connectionModify = (E2connectionUpdate_ItemIEs_t*)connectionToBeModifyList->list.array[arrIdx];
6595 connectionModify->id = ProtocolIE_IDE2_id_E2connectionUpdate_Item;
6596 connectionModify->criticality= CriticalityE2_ignore;
6597 connectionModify->value.present = E2connectionUpdate_ItemIEs__value_PR_E2connectionUpdate_Item;
6598 if(fillE2connectionUpdateItem((PTR)&connectionModify->value.choice.E2connectionUpdate_Item, ProtocolIE_IDE2_id_E2connectionUpdate_Item) != ROK)
6600 DU_LOG("\nERROR --> E2AP : Failed to fill E2 connection update item");
6608 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6614 /*******************************************************************
6616 * @brief Build E2 connection remove list
6620 * Function : BuildE2ConnectionRemoveList
6622 * Functionality: Build E2 connection remove list
6625 * E2 connection remove list to be filled
6627 * @return ROK - success
6629 * ****************************************************************/
6631 uint8_t BuildE2ConnectionRemoveList(E2connectionUpdateRemove_List_t *connectionToBeRemoveList)
6634 E2connectionUpdateRemove_ItemIEs_t *connectionRemove=NULL;
6636 connectionToBeRemoveList->list.count = 1;
6638 connectionToBeRemoveList->list.size = connectionToBeRemoveList->list.count*sizeof(E2connectionUpdateRemove_ItemIEs_t*);
6639 RIC_ALLOC(connectionToBeRemoveList->list.array, connectionToBeRemoveList->list.size);
6640 if(connectionToBeRemoveList->list.array)
6642 for(arrIdx = 0; arrIdx< connectionToBeRemoveList->list.count; arrIdx++)
6644 RIC_ALLOC(connectionToBeRemoveList->list.array[arrIdx], sizeof(E2connectionUpdateRemove_ItemIEs_t));
6645 if(connectionToBeRemoveList->list.array[arrIdx] == NULLP)
6647 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6650 connectionRemove = (E2connectionUpdateRemove_ItemIEs_t*)connectionToBeRemoveList->list.array[arrIdx];
6651 connectionRemove->id = ProtocolIE_IDE2_id_E2connectionUpdateRemove_Item;
6652 connectionRemove->criticality= CriticalityE2_ignore;
6653 connectionRemove->value.present = E2connectionUpdateRemove_ItemIEs__value_PR_E2connectionUpdateRemove_Item;
6654 if(fillE2connectionUpdateItem((PTR)&connectionRemove->value.choice.E2connectionUpdateRemove_Item, ProtocolIE_IDE2_id_E2connectionUpdateRemove_Item) != ROK)
6656 DU_LOG("\nERROR --> E2AP : Failed to fill E2 connection update item");
6664 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6670 /*******************************************************************
6672 * @brief Deallocate the memory allocated for E2ConnectionUpdate msg
6676 * Function : FreeE2ConnectionUpdate
6679 * - freeing the memory allocated for E2ConnectionUpdate
6681 * @params[in] E2AP_PDU_t *e2apMsg
6682 * @return ROK - success
6685 * ****************************************************************/
6686 void FreeE2ConnectionUpdate(E2AP_PDU_t *e2apMsg)
6688 uint8_t ieIdx =0, arrIdx=0;
6689 E2connectionUpdate_t *connectionUpdate = NULLP;
6690 E2connectionUpdate_List_t *connectionToBeModifyList = NULLP;
6691 E2connectionUpdateRemove_List_t *connectionToBeRemoveList = NULLP;
6693 if(e2apMsg != NULLP)
6695 if(e2apMsg->choice.initiatingMessage != NULLP)
6697 connectionUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2connectionUpdate;
6698 if(connectionUpdate->protocolIEs.list.array)
6700 for(ieIdx = 0; ieIdx < connectionUpdate->protocolIEs.list.count; ieIdx++)
6702 if(connectionUpdate->protocolIEs.list.array[ieIdx])
6704 switch(connectionUpdate->protocolIEs.list.array[ieIdx]->id)
6706 case ProtocolIE_IDE2_id_TransactionID:
6709 case ProtocolIE_IDE2_id_E2connectionUpdateModify:
6711 connectionToBeModifyList = &connectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdate_List;
6712 if(connectionToBeModifyList->list.array)
6714 for(arrIdx = 0; arrIdx < connectionToBeModifyList->list.count; arrIdx++)
6716 RIC_FREE(connectionToBeModifyList->list.array[arrIdx], sizeof(E2connectionUpdate_ItemIEs_t));
6718 RIC_FREE(connectionToBeModifyList->list.array, connectionToBeModifyList->list.size);
6723 case ProtocolIE_IDE2_id_E2connectionUpdateRemove:
6725 connectionToBeRemoveList = &connectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdateRemove_List;
6726 if(connectionToBeRemoveList->list.array)
6728 for(arrIdx = 0; arrIdx < connectionToBeRemoveList->list.count; arrIdx++)
6730 RIC_FREE(connectionToBeRemoveList->list.array[arrIdx], sizeof(E2connectionUpdateRemove_ItemIEs_t));
6732 RIC_FREE(connectionToBeRemoveList->list.array, connectionToBeRemoveList->list.size);
6737 RIC_FREE(connectionUpdate->protocolIEs.list.array[ieIdx], sizeof(E2connectionUpdate_IEs_t));
6740 RIC_FREE(connectionUpdate->protocolIEs.list.array, connectionUpdate->protocolIEs.list.size);
6742 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
6744 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6748 /*******************************************************************
6750 * @brief Buld and send the E2 Connection Update msg
6754 * Function : BuildAndSendE2ConnectionUpdate
6757 * - Buld and send the E2 Connection Update Message
6760 * E2 connection to be modify or delete
6761 * @return ROK - success
6764 * ****************************************************************/
6766 uint8_t BuildAndSendE2ConnectionUpdate(uint32_t duId, E2Connection connectionInfo)
6768 uint8_t ieIdx = 0, elementCnt = 0;
6769 uint8_t ret = RFAILED, duIdx =0;
6771 E2AP_PDU_t *e2apMsg = NULLP;
6772 E2connectionUpdate_t *e2ConnectionUpdate=NULLP;
6773 asn_enc_rval_t encRetVal; /* Encoder return value */
6775 DU_LOG("\nINFO --> E2AP : Building E2 Connection Update Message\n");
6778 SEARCH_DU_DB(duIdx, duId, duDb);
6781 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
6785 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6786 if(e2apMsg == NULLP)
6788 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6791 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
6793 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
6794 if(e2apMsg->choice.initiatingMessage == NULLP)
6796 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6800 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2connectionUpdate;
6801 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
6802 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2connectionUpdate;
6803 e2ConnectionUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2connectionUpdate;
6806 if(connectionInfo == MODIFY_CONNECTION)
6808 if(connectionInfo == REMOVE_CONNECTION)
6811 e2ConnectionUpdate->protocolIEs.list.count = elementCnt;
6812 e2ConnectionUpdate->protocolIEs.list.size = elementCnt * sizeof(E2connectionUpdate_IEs_t*);
6813 RIC_ALLOC(e2ConnectionUpdate->protocolIEs.list.array, e2ConnectionUpdate->protocolIEs.list.size);
6814 if(!e2ConnectionUpdate->protocolIEs.list.array)
6816 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6820 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6822 RIC_ALLOC(e2ConnectionUpdate->protocolIEs.list.array[ieIdx], sizeof(E2connectionUpdate_IEs_t));
6823 if(!e2ConnectionUpdate->protocolIEs.list.array[ieIdx])
6825 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
6829 if(ieIdx < elementCnt)
6833 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6834 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6835 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.present = E2connectionUpdate_IEs__value_PR_TransactionID;
6836 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = assignTransactionId(duDb);
6838 if(connectionInfo == MODIFY_CONNECTION)
6841 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_E2connectionUpdateModify;
6842 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6843 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.present = E2connectionUpdate_IEs__value_PR_E2connectionUpdate_List;
6844 if(BuildE2ConnectionModifyList(&e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdate_List) != ROK)
6846 DU_LOG("\nERROR --> E2AP : Failed to build the connection update modify list");
6851 if(connectionInfo == REMOVE_CONNECTION)
6854 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_E2connectionUpdateRemove;
6855 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6856 e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.present = E2connectionUpdate_IEs__value_PR_E2connectionUpdateRemove_List;
6857 if(BuildE2ConnectionRemoveList(&e2ConnectionUpdate->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdateRemove_List) != ROK)
6859 DU_LOG("\nERROR --> E2AP : Failed to build the connection update modify list");
6864 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6866 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6868 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6869 if(encRetVal.encoded == ENCODE_FAIL)
6871 DU_LOG("\nERROR --> E2AP : Could not encode E2 connection update structure (at %s)\n",\
6872 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6877 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Connection Update \n");
6878 for(int i=0; i< encBufSize; i++)
6880 DU_LOG("%x",encBuf[i]);
6885 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
6887 DU_LOG("\nERROR --> E2AP : Failed to send E2 Connection Update");
6895 FreeE2ConnectionUpdate(e2apMsg);
6899 /******************************************************************
6901 * @brief Processes the E2 connection update failure msg
6905 * Function : procE2connectionUpdateFailure
6907 * Functionality: Processes the E2 connection update failure msg
6910 * E2 connection update failure information
6914 * ****************************************************************/
6915 void ProcE2connectionUpdateFailure(E2connectionUpdateFailure_t *updateFailure)
6919 CauseE2_t *cause = NULLP;
6923 DU_LOG("\nERROR --> E2AP : updateFailure pointer is null");
6927 if(!updateFailure->protocolIEs.list.array)
6929 DU_LOG("\nERROR --> E2AP : updateFailure array pointer is null");
6933 for(ieIdx=0; ieIdx < updateFailure->protocolIEs.list.count; ieIdx++)
6935 if(updateFailure->protocolIEs.list.array[ieIdx])
6937 switch(updateFailure->protocolIEs.list.array[ieIdx]->id)
6939 case ProtocolIE_IDE2_id_TransactionID:
6941 transId = updateFailure->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
6942 DU_LOG("\nERROR --> E2AP : Received transID %d", transId);
6945 case ProtocolIE_IDE2_id_CauseE2:
6947 cause = &updateFailure->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
6948 printE2ErrorCause(cause);
6953 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%d]", updateFailure->protocolIEs.list.array[ieIdx]->id);
6961 /*******************************************************************
6963 * @brief process the E2 Connection update ack
6967 * Function : ProcE2ConnectionUpdateAck
6969 * Functionality: Process E2 Connection update ack
6973 * Pointer to Connection update ack
6976 ******************************************************************/
6978 void ProcE2ConnectionUpdateAck(uint32_t duId, E2connectionUpdateAcknowledge_t *connectionUpdateAck)
6980 uint16_t transId =0;
6981 uint32_t ipAddress=0;
6983 uint8_t ieIdx = 0, duIdx =0, arrIdx=0;
6984 E2connectionUpdate_Item_t *connectionSetupItem=NULLP;
6985 E2connectionUpdate_ItemIEs_t *connectionSetupItemIe=NULLP;
6986 E2connectionUpdate_List_t *connectionSetupList=NULLP;
6987 E2connectionSetupFailed_Item_t *setupFailedItem =NULLP;
6988 E2connectionSetupFailed_List_t *setupFailedList=NULLP;
6989 E2connectionSetupFailed_ItemIEs_t *setupFailedItemIe =NULLP;
6991 SEARCH_DU_DB(duIdx, duId, duDb);
6994 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
6998 if(!connectionUpdateAck)
7000 DU_LOG("\nERROR --> E2AP : connectionUpdateAck pointer is null");
7004 if(!connectionUpdateAck->protocolIEs.list.array)
7006 DU_LOG("\nERROR --> E2AP : connectionUpdateAck array pointer is null");
7010 for(ieIdx=0; ieIdx < connectionUpdateAck->protocolIEs.list.count; ieIdx++)
7012 if(connectionUpdateAck->protocolIEs.list.array[ieIdx])
7014 switch(connectionUpdateAck->protocolIEs.list.array[ieIdx]->id)
7016 case ProtocolIE_IDE2_id_TransactionID:
7018 transId = connectionUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
7021 DU_LOG("\nERROR --> E2AP : Received invalid trans id %d ",transId);
7026 case ProtocolIE_IDE2_id_E2connectionSetup:
7028 connectionSetupList=&connectionUpdateAck->protocolIEs.list.array[ieIdx]->value.choice.E2connectionUpdate_List;
7029 if(connectionSetupList->list.array)
7031 for(arrIdx = 0; arrIdx< connectionSetupList->list.count; arrIdx++)
7033 connectionSetupItemIe = (E2connectionUpdate_ItemIEs_t*)connectionSetupList->list.array[arrIdx];
7034 connectionSetupItem = &connectionSetupItemIe->value.choice.E2connectionUpdate_Item;
7035 bitStringToInt(&connectionSetupItem->tnlInformation.tnlAddress, &ipAddress);
7036 if(ricCb.ricCfgParams.sctpParams.localIpAddr.ipV4Addr == ipAddress)
7038 ricCb.ricCfgParams.sctpParams.usage = connectionSetupItem->tnlUsage;
7045 case ProtocolIE_IDE2_id_E2connectionSetupFailed:
7047 setupFailedList=&connectionUpdateAck->protocolIEs.list.array[ieIdx]->value.choice.E2connectionSetupFailed_List;
7048 if(setupFailedList->list.array)
7050 for(arrIdx = 0; arrIdx< setupFailedList->list.count; arrIdx++)
7052 setupFailedItemIe = (E2connectionSetupFailed_ItemIEs_t*)setupFailedList->list.array[arrIdx];
7053 setupFailedItem = &setupFailedItemIe->value.choice.E2connectionSetupFailed_Item;
7054 printE2ErrorCause(&setupFailedItem->cause);
7061 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", connectionUpdateAck->protocolIEs.list.array[ieIdx]->id);
7069 /******************************************************************
7071 * @brief Processes the Ric Subs delete failure msg
7075 * Function : procRicSubsDeleteFailure
7077 * Functionality: Processes the Ric Subs delete failure msg
7080 * Ric Subs delete failure information
7084 * ****************************************************************/
7085 void ProcRicSubsDeleteFailure(RICsubscriptionDeleteFailure_t *ricSubsDeleteFail)
7088 uint16_t ranFuncId=0;
7089 CauseE2_t *cause = NULLP;
7090 RICrequestID_t ricRequestID;
7092 if(!ricSubsDeleteFail)
7094 DU_LOG("\nERROR --> E2AP : ricSubsDeleteFail pointer is null");
7098 if(!ricSubsDeleteFail->protocolIEs.list.array)
7100 DU_LOG("\nERROR --> E2AP : ricSubsDeleteFail array pointer is null");
7104 for(ieIdx=0; ieIdx < ricSubsDeleteFail->protocolIEs.list.count; ieIdx++)
7106 if(ricSubsDeleteFail->protocolIEs.list.array[ieIdx])
7108 switch(ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->id)
7110 case ProtocolIE_IDE2_id_RICrequestID:
7112 memcpy(&ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID, &ricRequestID, sizeof(RICrequestID_t));
7113 DU_LOG("\nERROR --> E2AP : Received RicReqId %ld and InstanceId %ld", ricRequestID.ricRequestorID, ricRequestID.ricInstanceID);
7116 case ProtocolIE_IDE2_id_RANfunctionID:
7118 ranFuncId = ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->value.choice.RANfunctionID;
7119 DU_LOG("\nERROR --> E2AP : Received ranfuncId %d", ranFuncId);
7122 case ProtocolIE_IDE2_id_CauseE2:
7124 cause = &ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->value.choice.CauseE2;
7125 printE2ErrorCause(cause);
7130 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", ricSubsDeleteFail->protocolIEs.list.array[ieIdx]->id);
7139 /******************************************************************
7141 * @brief Processes the Ric Subs delete rsp msg
7145 * Function : ProcRicSubsDeleteRsp
7147 * Functionality: Processes the Ric Subs delete rsp msg
7150 * Ric Subs delete rsp information
7154 * ****************************************************************/
7155 void ProcRicSubsDeleteRsp(uint32_t duId, RICsubscriptionDeleteResponse_t *ricSubsDeleteRsp)
7159 uint16_t ranFuncId=0;
7160 RanFunction *ranFuncDb = NULLP;
7161 RicRequestId ricReqId;
7163 RicSubscription *ricSubs = NULLP;
7164 CmLList *ricSubsNode = NULLP;
7166 SEARCH_DU_DB(duIdx, duId, duDb);
7169 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
7173 if(!ricSubsDeleteRsp)
7175 DU_LOG("\nERROR --> E2AP : ricSubsDeleteRsp pointer is null");
7179 if(!ricSubsDeleteRsp->protocolIEs.list.array)
7181 DU_LOG("\nERROR --> E2AP : ricSubsDeleteRsp array pointer is null");
7184 for(ieIdx=0; ieIdx < ricSubsDeleteRsp->protocolIEs.list.count; ieIdx++)
7186 if(ricSubsDeleteRsp->protocolIEs.list.array[ieIdx])
7188 switch(ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->id)
7190 case ProtocolIE_IDE2_id_RICrequestID:
7192 ricReqId.requestorId = ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID.ricRequestorID;
7193 ricReqId.instanceId = ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->value.choice.RICrequestID.ricInstanceID;
7196 case ProtocolIE_IDE2_id_RANfunctionID:
7198 ranFuncId = ricSubsDeleteRsp->protocolIEs.list.array[ieIdx]->value.choice.RANfunctionID;
7199 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
7202 DU_LOG("\nERROR --> E2AP : Invalid Ran Function id %d received",ranFuncId);
7206 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
7209 deleteRicSubscriptionNode(ricSubsNode);
7210 DU_LOG("\nINFO --> E2AP : Ric subscription node deleted successfully");
7214 DU_LOG("\nERROR --> E2AP : Ric subscription node is not present ");
7224 /*******************************************************************
7226 * @brief Free RIC Subscription action to be added list
7230 * Function : FreeRicSubsActionToBeAdded
7232 * Functionality: Free the RIC Subscription action to be added list
7234 * @params[in] RICactions_ToBeAddedForModification_List_t *subsDetails
7237 * ****************************************************************/
7238 void FreeRicSubsActionToBeAdded(RICactions_ToBeAddedForModification_List_t *subsDetails)
7240 uint8_t elementIdx = 0;
7241 RICaction_ToBeAddedForModification_ItemIEs_t *addedActionItemIe=NULLP;
7243 if(subsDetails->list.array)
7245 for(elementIdx = 0; elementIdx < subsDetails->list.count; elementIdx++)
7247 if(subsDetails->list.array[elementIdx])
7249 addedActionItemIe = (RICaction_ToBeAddedForModification_ItemIEs_t*)subsDetails->list.array[elementIdx];
7250 RIC_FREE(addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionDefinition.buf, \
7251 addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionDefinition.size);
7252 RIC_FREE(subsDetails->list.array[elementIdx], sizeof(RICaction_ToBeAddedForModification_ItemIEs_t));
7255 RIC_FREE(subsDetails->list.array, subsDetails->list.size);
7259 /*******************************************************************
7261 * @brief Free RIC Subscription action to be removed list
7265 * Function : FreeRicSubsActionToBeRemoved
7267 * Functionality: Free the RIC Subscription action to be removed list
7269 * @params[in] RICactions_ToBeRemovedForModification_List_t *subsDetails
7272 * ****************************************************************/
7273 void FreeRicSubsActionToBeRemoved(RICactions_ToBeRemovedForModification_List_t *subsDetails)
7275 uint8_t elementIdx = 0;
7277 if(subsDetails->list.array)
7279 for(elementIdx = 0; elementIdx < subsDetails->list.count; elementIdx++)
7281 RIC_FREE(subsDetails->list.array[elementIdx], sizeof(RICaction_ToBeRemovedForModification_ItemIEs_t));
7283 RIC_FREE(subsDetails->list.array, subsDetails->list.size);
7287 /*******************************************************************
7289 * @brief Free RIC Subscription action to be modify
7293 * Function : FreeRicSubsActionToBeModified
7295 * Functionality: Free the RIC Subscription action to be modify
7297 * @params[in] RICactions_ToBeModifiedForModification_List_t List
7300 * ****************************************************************/
7301 void FreeRicSubsActionToBeModified(RICactions_ToBeModifiedForModification_List_t *subsDetails)
7303 uint8_t elementIdx = 0;
7304 RICaction_ToBeModifiedForModification_ItemIEs_t *actionItem = NULLP;
7306 if(subsDetails->list.array)
7308 for(elementIdx = 0; elementIdx < subsDetails->list.count; elementIdx++)
7310 if(subsDetails->list.array[elementIdx])
7312 actionItem = (RICaction_ToBeModifiedForModification_ItemIEs_t *)subsDetails->list.array[elementIdx];
7313 if(actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition)
7315 RIC_FREE(actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition->buf, \
7316 actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition->size);
7317 RIC_FREE(actionItem->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
7319 RIC_FREE(subsDetails->list.array[elementIdx], sizeof(RICaction_ToBeModifiedForModification_ItemIEs_t))
7322 RIC_FREE(subsDetails->list.array, subsDetails->list.size);
7326 /*******************************************************************
7328 * @brief Free RIC Subscription modification Request
7332 * Function :FreeRicSubscriptionModReq
7334 * Functionality : Free RIC Subscription modification Request
7336 * @params[in] E2AP_PDU
7339 ******************************************************************/
7340 void FreeRicSubscriptionModReq(E2AP_PDU_t *e2apRicMsg)
7343 RICsubscriptionModificationRequest_t *ricSubscriptionModReq =NULLP;
7344 RICsubscriptionModificationRequest_IEs_t *ricSubscriptionModReqIe=NULLP;
7348 if(e2apRicMsg->choice.initiatingMessage)
7350 ricSubscriptionModReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequest;
7351 if(ricSubscriptionModReq->protocolIEs.list.array)
7353 for(idx=0; idx < ricSubscriptionModReq->protocolIEs.list.count; idx++)
7355 if(ricSubscriptionModReq->protocolIEs.list.array[idx])
7357 ricSubscriptionModReqIe = ricSubscriptionModReq->protocolIEs.list.array[idx];
7358 switch(ricSubscriptionModReq->protocolIEs.list.array[idx]->id)
7360 case ProtocolIE_IDE2_id_RICrequestID:
7362 case ProtocolIE_IDE2_id_RANfunctionID:
7364 case ProtocolIE_IDE2_id_RICactionsToBeRemovedForModification_List:
7366 FreeRicSubsActionToBeRemoved(&(ricSubscriptionModReqIe->value.choice.RICactions_ToBeRemovedForModification_List));
7369 case ProtocolIE_IDE2_id_RICactionsToBeModifiedForModification_List:
7371 FreeRicSubsActionToBeModified(&(ricSubscriptionModReqIe->value.choice.RICactions_ToBeModifiedForModification_List));
7374 case ProtocolIE_IDE2_id_RICactionsToBeAddedForModification_List:
7376 FreeRicSubsActionToBeAdded(&(ricSubscriptionModReqIe->value.choice.RICactions_ToBeAddedForModification_List));
7381 DU_LOG("\nERROR --> E2AP : Received Invalid Ie [%ld]", ricSubscriptionModReq->protocolIEs.list.array[idx]->id);
7387 RIC_FREE(ricSubscriptionModReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionModificationRequest_IEs_t));
7390 RIC_FREE(ricSubscriptionModReq->protocolIEs.list.array, ricSubscriptionModReq->protocolIEs.list.size);
7392 RIC_FREE(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
7394 RIC_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
7398 /*******************************************************************
7400 * @brief Build Ric subscription action to be modify list
7404 * Function : BuildRicSubsActionToBeModify
7406 * Functionality: Build Ric subscription action to be modify list
7409 * RICactions_ToBeModifiedForModification_List_t to be filled
7410 * Num of action to be modify
7411 * List of action to be modify
7413 * @return ROK - success
7416 ******************************************************************/
7418 uint8_t BuildRicSubsActionToBeModify(RICactions_ToBeModifiedForModification_List_t *modifyActionList, uint8_t numOfActionToBeModify, ActionInfo *actionToBeModify)
7421 RICaction_ToBeModifiedForModification_ItemIEs_t *modifiedActionItemIe=NULLP;
7423 modifyActionList->list.count = numOfActionToBeModify;
7424 modifyActionList->list.size = modifyActionList->list.count * sizeof(RICaction_ToBeModifiedForModification_ItemIEs_t*);
7425 RIC_ALLOC(modifyActionList->list.array, modifyActionList->list.size);
7426 if(!modifyActionList->list.array)
7428 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7432 for(arrIdx = 0; arrIdx< modifyActionList->list.count; arrIdx++)
7434 RIC_ALLOC(modifyActionList->list.array[arrIdx], sizeof(RICaction_ToBeModifiedForModification_ItemIEs_t));
7435 if(!modifyActionList->list.array[arrIdx])
7437 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7440 modifiedActionItemIe = (RICaction_ToBeModifiedForModification_ItemIEs_t*)modifyActionList->list.array[arrIdx];
7441 modifiedActionItemIe->id = ProtocolIE_IDE2_id_RICaction_ToBeModifiedForModification_Item;
7442 modifiedActionItemIe->criticality = CriticalityE2_ignore;
7443 modifiedActionItemIe->value.present = RICaction_ToBeModifiedForModification_ItemIEs__value_PR_RICaction_ToBeModifiedForModification_Item;
7444 modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionID = actionToBeModify[arrIdx].actionId;
7446 /* RIC Action Definition */
7447 RIC_ALLOC(modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
7448 if(!modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition)
7450 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7454 if(fillRicActionDef(modifiedActionItemIe->value.choice.RICaction_ToBeModifiedForModification_Item.ricActionDefinition,\
7455 actionToBeModify[arrIdx].actionId, CONFIG_MOD) != ROK)
7457 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7465 /*******************************************************************
7467 * @brief Build Ric subscription action to be removed list
7471 * Function : BuildRicSubsActionToBeRemoved
7473 * Functionality: Build Ric subscription action to be removed list
7476 * RICactions_ToBeRemovedForModification_List_t to be filled
7477 * Num Of Action To Be Remove
7478 * Action remove list
7480 * @return ROK - success
7483 ******************************************************************/
7485 uint8_t BuildRicSubsActionToBeRemoved(RICactions_ToBeRemovedForModification_List_t *removeActionList, uint8_t numOfActionToBeRemove, ActionInfo *actionToBeRemove)
7488 RICaction_ToBeRemovedForModification_ItemIEs_t *removeActionItemIe=NULLP;
7490 removeActionList->list.count = numOfActionToBeRemove;
7491 removeActionList->list.size = removeActionList->list.count * sizeof(RICaction_ToBeRemovedForModification_ItemIEs_t*);
7492 RIC_ALLOC(removeActionList->list.array, removeActionList->list.size);
7493 if(!removeActionList->list.array)
7495 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7499 for(arrIdx = 0; arrIdx< removeActionList->list.count; arrIdx++)
7501 RIC_ALLOC(removeActionList->list.array[arrIdx], sizeof(RICaction_ToBeRemovedForModification_ItemIEs_t));
7502 if(!removeActionList->list.array[arrIdx])
7504 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7507 removeActionItemIe = (RICaction_ToBeRemovedForModification_ItemIEs_t*)removeActionList->list.array[arrIdx];
7508 removeActionItemIe->id = ProtocolIE_IDE2_id_RICaction_ToBeRemovedForModification_Item;
7509 removeActionItemIe->criticality = CriticalityE2_ignore;
7510 removeActionItemIe->value.present = RICaction_ToBeRemovedForModification_ItemIEs__value_PR_RICaction_ToBeRemovedForModification_Item;
7511 removeActionItemIe->value.choice.RICaction_ToBeRemovedForModification_Item.ricActionID = actionToBeRemove[arrIdx].actionId;
7516 /*******************************************************************
7518 * @brief Build Ric subscription action to be added list
7522 * Function : BuildRicSubsActionToBeAdded
7524 * Functionality: Build Ric subscription action to be added list
7527 * RICactions_ToBeAddedForModification_List_t to be filled
7528 * Num Of Action To Be added
7531 * @return ROK - success
7534 ******************************************************************/
7536 uint8_t BuildRicSubsActionToBeAdded(RICactions_ToBeAddedForModification_List_t *addedActionList, RicSubscription **ricSubsInfo, uint8_t numOfActionToBeAdded, ActionInfo *actionToBeAdded)
7539 RICaction_ToBeAddedForModification_ItemIEs_t *addedActionItemIe;
7541 addedActionList->list.count = numOfActionToBeAdded;
7542 addedActionList->list.size = addedActionList->list.count * sizeof(RICaction_ToBeAddedForModification_ItemIEs_t*);
7543 RIC_ALLOC(addedActionList->list.array, addedActionList->list.size);
7544 if(!addedActionList->list.array)
7546 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7550 for(arrIdx = 0; arrIdx< addedActionList->list.count; arrIdx++)
7552 RIC_ALLOC(addedActionList->list.array[arrIdx], sizeof(RICaction_ToBeAddedForModification_ItemIEs_t));
7553 if(!addedActionList->list.array[arrIdx])
7555 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7558 addedActionItemIe = (RICaction_ToBeAddedForModification_ItemIEs_t*)addedActionList->list.array[arrIdx];
7559 addedActionItemIe->id = ProtocolIE_IDE2_id_RICaction_ToBeAddedForModification_Item;
7560 addedActionItemIe->criticality = CriticalityE2_ignore;
7561 addedActionItemIe->value.present = RICaction_ToBeAddedForModification_ItemIEs__value_PR_RICaction_ToBeAddedForModification_Item;
7562 addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionID = actionToBeAdded[arrIdx].actionId;
7564 addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionType = RICactionType_report;
7566 if(fillRicActionDef(&addedActionItemIe->value.choice.RICaction_ToBeAddedForModification_Item.ricActionDefinition, \
7567 actionToBeAdded[arrIdx].actionId, CONFIG_ADD) != ROK)
7569 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7572 (*ricSubsInfo)->actionSequence[(*ricSubsInfo)->numOfActions].actionId = (*ricSubsInfo)->numOfActions;
7573 (*ricSubsInfo)->numOfActions++;
7578 /*******************************************************************
7580 * @brief Builds and Send the RicSubscriptionModReq
7584 * Function : BuildAndSendRicSubscriptionModReq
7586 * Functionality:Builds and Send the RicSubscriptionModReq
7590 * Ric subs information
7591 * List of ric subs action which needs to modify/add/remove
7592 * @return ROK - success
7595 ******************************************************************/
7597 uint8_t BuildAndSendRicSubscriptionModReq(DuDb *duDb, RicSubscription **ricSubsInfo, RicSubsModReq ricSubsModReq)
7599 uint8_t ret = RFAILED;
7600 uint8_t elementCnt = 0;
7601 uint8_t idx = 0, cfgIdx=0;
7602 asn_enc_rval_t encRetVal; /* Encoder return value */
7603 E2AP_PDU_t *e2apRicMsg = NULL;
7604 RICsubscriptionModificationRequest_t *ricSubscriptionModReq;
7605 RanFunction *ranFuncDb = &duDb->ranFunction[0];
7606 CmLList *subscriptionNode = NULLP;
7608 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n");
7612 RIC_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
7613 if(e2apRicMsg == NULLP)
7615 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7619 e2apRicMsg->present = E2AP_PDU_PR_initiatingMessage;
7620 RIC_ALLOC(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
7621 if(e2apRicMsg->choice.initiatingMessage == NULLP)
7623 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7626 e2apRicMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionModification;
7627 e2apRicMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
7628 e2apRicMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionModificationRequest;
7630 ricSubscriptionModReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequest;
7632 /* Increasing the elment count based on the number of configured action to be add, mod, delete */
7634 if(ricSubsModReq.numOfActionToBeAdded)
7636 if(ricSubsModReq.numOfActionToBeModify)
7638 if(ricSubsModReq.numOfActionToBeRemove)
7641 ricSubscriptionModReq->protocolIEs.list.count = elementCnt;
7642 ricSubscriptionModReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRequest_IEs_t);
7644 /* Initialize the subscription members */
7645 RIC_ALLOC(ricSubscriptionModReq->protocolIEs.list.array, ricSubscriptionModReq->protocolIEs.list.size);
7646 if(ricSubscriptionModReq->protocolIEs.list.array == NULLP)
7648 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7652 for(idx=0; idx<elementCnt; idx++)
7654 RIC_ALLOC(ricSubscriptionModReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionModificationRequest_IEs_t));
7655 if(ricSubscriptionModReq->protocolIEs.list.array[idx] == NULLP)
7657 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
7661 if(idx < elementCnt)
7664 /* Filling RIC Request Id */
7666 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
7667 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
7668 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present =\
7669 RICsubscriptionModificationRequest_IEs__value_PR_RICrequestID;
7670 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = (*ricSubsInfo)->requestId.requestorId;
7671 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = (*ricSubsInfo)->requestId.instanceId;
7673 /* Filling RAN Function Id */
7675 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
7676 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
7677 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present =\
7678 RICsubscriptionModificationRequest_IEs__value_PR_RANfunctionID;
7679 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID = (*ricSubsInfo)->ranFuncId;
7681 if(ricSubsModReq.numOfActionToBeRemove)
7683 /* Filling RIC Subscription action to be removed */
7685 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionsToBeRemovedForModification_List;
7686 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_ignore;
7687 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present = RICsubscriptionModificationRequest_IEs__value_PR_RICactions_ToBeRemovedForModification_List;
7688 if(BuildRicSubsActionToBeRemoved(&ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICactions_ToBeRemovedForModification_List,\
7689 ricSubsModReq.numOfActionToBeRemove, ricSubsModReq.actionToBeRemove) != ROK)
7691 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7695 if(ricSubsModReq.numOfActionToBeModify)
7697 /* Filling RIC Subscription action to be modified */
7699 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionsToBeModifiedForModification_List;
7700 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_ignore;
7701 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present = RICsubscriptionModificationRequest_IEs__value_PR_RICactions_ToBeModifiedForModification_List;
7702 if(BuildRicSubsActionToBeModify(&ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICactions_ToBeModifiedForModification_List,\
7703 ricSubsModReq.numOfActionToBeModify, ricSubsModReq.actionToBeModify) != ROK)
7705 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7710 if(ricSubsModReq.numOfActionToBeAdded)
7712 /* Filling RIC Subscription action to be added */
7714 ricSubscriptionModReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionsToBeAddedForModification_List;
7715 ricSubscriptionModReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_ignore;
7716 ricSubscriptionModReq->protocolIEs.list.array[idx]->value.present = RICsubscriptionModificationRequest_IEs__value_PR_RICactions_ToBeAddedForModification_List;
7717 if(BuildRicSubsActionToBeAdded(&ricSubscriptionModReq->protocolIEs.list.array[idx]->value.choice.RICactions_ToBeAddedForModification_List,\
7718 ricSubsInfo, ricSubsModReq.numOfActionToBeAdded, ricSubsModReq.actionToBeAdded) != ROK)
7720 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
7725 /* Prints the Msg formed */
7726 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
7728 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7730 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
7731 if(encRetVal.encoded == ENCODE_FAIL)
7733 DU_LOG("\nERROR --> E2AP : Could not encode RicSubscriptionModRequest structure (at %s)\n",\
7734 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7739 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicSubscriptionModRequest\n");
7740 for(int i=0; i< encBufSize; i++)
7742 DU_LOG("%x",encBuf[i]);
7747 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
7749 DU_LOG("\nERROR --> E2AP : Sending RIC subscription Request failed");
7757 FreeRicSubscriptionModReq(e2apRicMsg);
7761 /*******************************************************************
7763 * @brief Builds RicSubscriptionModReq
7767 * Function : BuildRicSubscriptionModReq
7769 * Functionality:Builds the RicSubscriptionModReq
7775 * ****************************************************************/
7777 void BuildRicSubsModificationReq(DuDb *duDb, RicSubscription *ricSubsInfo)
7779 uint8_t actionToBeAdded =0;
7780 uint8_t actionIdx =0, tmpActionIdx=0;
7781 RicSubsModReq ricSubsModReq;
7785 memset(&ricSubsModReq, 0, sizeof(RicSubsModReq));
7786 for(actionIdx=0; actionIdx<ricSubsInfo->numOfActions; actionIdx++)
7788 /* Change the condition based on the action required to be modiified or removed */
7789 if(actionIdx%2 == 0)
7791 tmpActionIdx = ricSubsModReq.numOfActionToBeModify;
7792 ricSubsModReq.actionToBeModify[tmpActionIdx].actionId = ricSubsInfo->actionSequence[actionIdx].actionId;
7793 ricSubsModReq.numOfActionToBeModify++;
7797 tmpActionIdx = ricSubsModReq.numOfActionToBeRemove;
7798 ricSubsModReq.actionToBeRemove[tmpActionIdx].actionId = ricSubsInfo->actionSequence[actionIdx].actionId;
7799 ricSubsModReq.numOfActionToBeRemove++;
7802 /* Change the value of actionToBeAdded based on the number of action required to be added */
7804 tmpActionIdx = ricSubsInfo->numOfActions;
7805 for(actionIdx=0; actionIdx<actionToBeAdded; actionIdx++)
7807 ricSubsModReq.actionToBeAdded[actionIdx].actionId = tmpActionIdx;
7808 ricSubsModReq.numOfActionToBeAdded++;
7812 if(BuildAndSendRicSubscriptionModReq(duDb, &ricSubsInfo, ricSubsModReq) != ROK)
7814 DU_LOG("\nERROR --> E2AP : failed to build and send RIC Subscription Modification");
7820 /*******************************************************************
7822 * @brief Handles received E2AP message and sends back response
7826 * Function : E2APMsgHdlr
7829 * - Decodes received E2AP control message
7830 * - Prepares response message, encodes and sends to SCTP
7833 * @return ROK - success
7836 * ****************************************************************/
7837 void E2APMsgHdlr(uint32_t *duId, Buffer *mBuf)
7843 E2AP_PDU_t *e2apMsg;
7844 asn_dec_rval_t rval; /* Decoder return value */
7845 E2AP_PDU_t e2apasnmsg ;
7847 DU_LOG("\nINFO --> E2AP : Received E2AP message buffer");
7848 ODU_PRINT_MSG(mBuf, 0,0);
7850 /* Copy mBuf into char array to decode it */
7851 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
7852 RIC_ALLOC(recvBuf, (Size)recvBufLen);
7854 if(recvBuf == NULLP)
7856 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
7859 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
7861 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
7865 DU_LOG("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
7866 for(i=0; i< recvBufLen; i++)
7868 DU_LOG("%x",recvBuf[i]);
7871 /* Decoding flat buffer into E2AP messsage */
7872 e2apMsg = &e2apasnmsg;
7873 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
7875 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
7876 RIC_FREE(recvBuf, (Size)recvBufLen);
7878 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7880 DU_LOG("\nERROR --> E2AP : ASN decode failed");
7884 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
7886 switch(e2apMsg->present)
7888 case E2AP_PDU_PR_initiatingMessage:
7890 switch(e2apMsg->choice.initiatingMessage->value.present)
7892 case InitiatingMessageE2__value_PR_E2setupRequest:
7894 DU_LOG("\nINFO --> E2AP : E2 setup request received");
7895 ProcE2SetupReq(duId, &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest);
7898 case InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate:
7900 DU_LOG("\nINFO --> E2AP : E2 node config update received");
7901 ProcE2NodeConfigUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate);
7904 case InitiatingMessageE2__value_PR_ResetRequestE2:
7906 DU_LOG("\nINFO --> E2AP : E2 Reset Request received");
7907 ProcResetRequest(*duId, &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2);
7910 case InitiatingMessageE2__value_PR_RICindication:
7912 DU_LOG("\nINFO --> E2AP : RIC Indication received");
7915 case InitiatingMessageE2__value_PR_RICserviceUpdate:
7917 DU_LOG("\nINFO --> E2AP : RIC Service update received");
7918 ProcRicServiceUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate);
7921 case InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired:
7923 DU_LOG("\nINFO --> E2AP : RIC Subscription Modification Required");
7924 ProcRicSubsModReqd(*duId, \
7925 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired);
7928 case InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequired:
7930 DU_LOG("\nINFO --> E2AP : RIC Subscription Delete Required");
7931 ProcRicSubsDeleteReqd(*duId, \
7932 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequired);
7936 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
7938 DU_LOG("\nINFO --> E2AP : Error indication received");
7941 case InitiatingMessageE2__value_PR_E2RemovalRequest:
7943 DU_LOG("\nINFO --> E2AP : E2 Removal request received");
7944 procE2RemovalRequest(*duId,\
7945 &e2apMsg->choice.initiatingMessage->value.choice.E2RemovalRequest);
7950 DU_LOG("\nERROR --> E2AP : Invalid type of intiating message [%d]", \
7951 e2apMsg->choice.initiatingMessage->value.present);
7954 }/* End of switch(initiatingMessage) */
7957 case E2AP_PDU_PR_successfulOutcome:
7959 switch(e2apMsg->choice.successfulOutcome->value.present)
7961 case SuccessfulOutcomeE2__value_PR_ResetResponseE2:
7963 DU_LOG("\nINFO --> E2AP : Reset response received");
7964 ProcResetResponse(*duId, &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2);
7967 case SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse:
7969 ProcRicSubscriptionResponse(*duId, \
7970 &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse);
7973 case SuccessfulOutcomeE2__value_PR_E2RemovalResponse:
7975 ProcE2RemovalResponse(*duId, &e2apMsg->choice.successfulOutcome->value.choice.E2RemovalResponse);
7978 case SuccessfulOutcomeE2__value_PR_E2connectionUpdateAcknowledge:
7980 ProcE2ConnectionUpdateAck(*duId, &e2apMsg->choice.successfulOutcome->value.choice.E2connectionUpdateAcknowledge);
7983 case SuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteResponse:
7985 ProcRicSubsDeleteRsp(*duId, &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionDeleteResponse);
7990 DU_LOG("\nERROR --> E2AP : Invalid type of successfulOutcome message [%d]", \
7991 e2apMsg->choice.successfulOutcome->value.present);
7998 case E2AP_PDU_PR_unsuccessfulOutcome:
8000 switch(e2apMsg->choice.successfulOutcome->value.present)
8002 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure:
8004 ProcRicSubscriptionFailure(*duId, \
8005 &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure);
8008 case UnsuccessfulOutcomeE2__value_PR_E2RemovalFailure:
8010 ProcE2RemovalFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.E2RemovalFailure);
8013 case UnsuccessfulOutcomeE2__value_PR_E2connectionUpdateFailure:
8015 ProcE2connectionUpdateFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.E2connectionUpdateFailure);
8018 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteFailure:
8020 ProcRicSubsDeleteFailure(&e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionDeleteFailure);
8025 DU_LOG("\nERROR --> E2AP : Invalid type of unsuccessfulOutcome message [%d]", \
8026 e2apMsg->choice.unsuccessfulOutcome->value.present);
8034 DU_LOG("\nERROR --> E2AP : Invalid type message type ");
8038 }/* End of switch(e2apMsg->present) */
8039 } /* End of E2APMsgHdlr */
8042 /**********************************************************************
8044 **********************************************************************/