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"
47 /*******************************************************************
49 * @brief Assigns new transaction id to RIC initiated procedure
53 * Function : assignTransactionId
55 * Functionality: Assigns new transaction id to a RIC initiated
58 * @params[in] Region region
60 * @return ROK - success
63 * ****************************************************************/
65 uint8_t assignTransactionId(DuDb *duDb)
67 uint8_t currTransId = duDb->ricTransIdCounter;
69 /* Update to next valid value */
70 duDb->ricTransIdCounter++;
71 if(duDb->ricTransIdCounter == MAX_NUM_TRANSACTION)
72 duDb->ricTransIdCounter = 0;
77 /*******************************************************************
79 * @brief Sends E2 msg over SCTP
83 * Function : SendE2APMsg
85 * Functionality: Sends E2 msg over SCTP
87 * @params[in] Region region
89 * @return ROK - success
92 * ****************************************************************/
94 uint8_t SendE2APMsg(Region region, Pool pool, uint32_t duId)
98 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
100 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
102 ODU_PRINT_MSG(mBuf, 0,0);
104 if(sctpSend(duId, mBuf) != ROK)
106 DU_LOG("\nERROR --> E2AP : SCTP Send for E2 failed");
107 ODU_PUT_MSG_BUF(mBuf);
113 DU_LOG("\nERROR --> E2AP : ODU_ADD_POST_MSG_MULT failed");
114 ODU_PUT_MSG_BUF(mBuf);
117 ODU_PUT_MSG_BUF(mBuf);
121 DU_LOG("\nERROR --> E2AP : Failed to allocate memory");
128 /*******************************************************************
130 * @brief Fetches RAN Function DB
134 * Function : fetchRanFuncFromRanFuncId
136 * Functionality: Fetches RAN function DB from E2AP DB using
139 * @params[in] RAN Function ID
140 * @return RAN Function DB
141 * NULL, in case of failure
143 * ****************************************************************/
144 RanFunction *fetchRanFuncFromRanFuncId(DuDb *duDb, uint16_t ranFuncId)
146 RanFunction *ranFuncDb = NULLP;
148 /* Fetch RAN Function DB */
149 if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
151 ranFuncDb = &duDb->ranFunction[ranFuncId-1];
155 DU_LOG("\nERROR --> DU_APP : fetchRanFuncFromRanFuncId: Invalid RAN Function ID[%d]", ranFuncId);
161 /*******************************************************************
163 * @brief Fetch subscripton DB
167 * Function : fetchSubsInfoFromRicReqId
169 * Functionality: Fetches subscription DB from RAN Function DB
170 * using RIC Request ID
172 * @params[in] RIC Request ID
174 * Pointer to RIC Subscription node to be searched
175 * @return RIC Subscription from RAN Function's subcription list
176 * NULL, in case of failure
178 * ****************************************************************/
179 RicSubscription *fetchSubsInfoFromRicReqId(RicRequestId ricReqId, RanFunction *ranFuncDb, CmLList **ricSubscriptionNode)
181 RicSubscription *ricSubscriptionInfo = NULLP;
183 /* Fetch subscription detail in RAN Function DB */
184 CM_LLIST_FIRST_NODE(&ranFuncDb->subscriptionList, *ricSubscriptionNode);
185 while(*ricSubscriptionNode)
187 ricSubscriptionInfo = (RicSubscription *)((*ricSubscriptionNode)->node);
188 if(ricSubscriptionInfo && (ricSubscriptionInfo->requestId.requestorId == ricReqId.requestorId) &&
189 (ricSubscriptionInfo->requestId.instanceId == ricReqId.instanceId))
193 *ricSubscriptionNode = (*ricSubscriptionNode)->next;
194 ricSubscriptionInfo = NULLP;
197 if(!ricSubscriptionInfo)
199 DU_LOG("\nERROR --> E2AP : fetchSubsInfoFromRicReqId: Subscription not found for Requestor ID [%d] \
200 Instance ID [%d] in RAN Function ID [%d]", ricReqId.requestorId, ricReqId.instanceId, ranFuncDb->id);
203 return ricSubscriptionInfo;
206 /*******************************************************************
208 * @brief Fetch Action details
212 * Function : fetchActionInfoFromActionId
214 * Functionality: Fetch action details from RIC subscription DB
217 * @params[in] Action ID
218 * RIC Subscription DB
219 * @return Action Info DB
220 * NULL, in case of failure
222 * ****************************************************************/
223 ActionInfo *fetchActionInfoFromActionId(uint8_t actionId, RicSubscription *ricSubscriptionInfo)
225 ActionInfo *actionInfoDb = NULLP;
226 if(ricSubscriptionInfo->actionSequence[actionId].actionId == actionId)
228 actionInfoDb = &ricSubscriptionInfo->actionSequence[actionId];
232 DU_LOG("\nERROR --> E2AP : fetchActionInfoFromActionId: Action Id [%d] not found in \
233 subscription info [Requestor id : %d] [Instance Id : %d]", actionId,\
234 ricSubscriptionInfo->requestId.requestorId, ricSubscriptionInfo->requestId.instanceId);
240 /*******************************************************************
242 * @brief deallocate memory allocated in E2 Node Config Update Failure
246 * Function : FreeE2ConfigUpdateFail
248 * Functionality: deallocate memory allocated in E2 Node Config Update Failure
250 * @params[in] E2AP_PDU_t *e2apMsg
253 * ****************************************************************/
255 void FreeE2ConfigUpdateFail(E2AP_PDU_t *e2apMsg)
258 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail=NULL;
262 if(e2apMsg->choice.unsuccessfulOutcome)
264 e2NodeCfgUpdFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
265 if(e2NodeCfgUpdFail->protocolIEs.list.array)
267 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
269 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateFailure_IEs_t));
271 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array, e2NodeCfgUpdFail->protocolIEs.list.size);
273 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
275 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
279 /*******************************************************************
281 * @brief Buld and send the E2 Node Config Update failure
285 * Function : BuildAndSendE2NodeConfigUpdateFailure
288 * - Buld and send the E2 Node Config Update failure
289 * @return ROK - success
292 * ****************************************************************/
294 uint8_t BuildAndSendE2NodeConfigUpdateFailure(uint32_t duId, uint8_t transId, uint8_t causeInfo, uint8_t causeReason)
296 E2AP_PDU_t *e2apMsg = NULL;
297 asn_enc_rval_t encRetVal;
299 uint8_t elementCnt=0;
300 bool memAllocFailed = false;
301 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdateFail=NULL;
303 DU_LOG("\nINFO --> E2AP : Building E2 Node Config Update failure\n");
306 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
309 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
312 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
313 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
314 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
316 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
320 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
321 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
322 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure;
323 e2NodeCfgUpdateFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
326 e2NodeCfgUpdateFail->protocolIEs.list.count = elementCnt;
327 e2NodeCfgUpdateFail->protocolIEs.list.size = elementCnt * sizeof(struct E2nodeConfigurationUpdateFailure_IEs *);
329 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array, e2NodeCfgUpdateFail->protocolIEs.list.size);
330 if(e2NodeCfgUpdateFail->protocolIEs.list.array == NULLP)
332 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure array failed");
336 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
338 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx], sizeof(struct E2nodeConfigurationUpdateFailure_IEs));
339 if(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx] == NULLP)
341 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure IEs failed");
342 memAllocFailed = true;
347 if(memAllocFailed == true)
354 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
355 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
356 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
357 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
360 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
361 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
362 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
363 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = causeInfo;
364 if(causeInfo == CauseE2_PR_e2Node)
365 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.e2Node = causeReason;
367 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.misc = causeReason;
370 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
371 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
372 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
373 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
375 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
376 memset(encBuf, 0, ENC_BUF_MAX_LEN);
378 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
380 /* Check encode results */
381 if(encRetVal.encoded == ENCODE_FAIL)
383 DU_LOG("\nERROR --> E2AP : Could not encode E2 Node Config Update failure structure (at %s)\n",\
384 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
389 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Node Config Update Failure\n");
390 for(int i=0; i< encBufSize; i++)
392 DU_LOG("%x",encBuf[i]);
396 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
398 DU_LOG("\nERROR --> E2AP : Sending E2 Node Config Update Failure failed");
404 FreeE2ConfigUpdateFail(e2apMsg);
408 /*******************************************************************
410 * @brief process the E2 node configuration update
414 * Function : ProcE2NodeConfigUpdate
416 * Functionality: Process E2 node configuration update
418 * @return ROK - success
421 ******************************************************************/
423 void ProcE2NodeConfigUpdate(uint32_t duId, E2nodeConfigurationUpdate_t *e2NodeConfigUpdate)
426 uint8_t transId = 0, e2NodeUpdateListIdx=0;
427 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList=NULLP;
428 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe=NULLP;
429 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULLP;
431 if(e2NodeConfigUpdate)
433 if(e2NodeConfigUpdate->protocolIEs.list.array)
435 for(ieIdx=0; ieIdx < e2NodeConfigUpdate->protocolIEs.list.count; ieIdx++)
437 if(e2NodeConfigUpdate->protocolIEs.list.array[ieIdx])
439 switch(e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->id)
441 case ProtocolIE_IDE2_id_TransactionID:
442 transId = e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
447 /*TODO - Other IEs will be handling in next gerrit*/
457 /*******************************************************************
459 * @brief Builds Global RIC Id Params
463 * Function : BuildGlobalRicId
465 * Functionality: Building the Plmn and ric id
467 * @params[in] GlobalRIC_ID_t *ricId
468 * @return ROK - success
471 * ****************************************************************/
473 uint8_t BuildGlobalRicId(GlobalRIC_ID_t *ricId)
476 uint8_t byteSize = 3;
480 ricId->pLMN_Identity.size = byteSize * sizeof(uint8_t);
481 RIC_ALLOC(ricId->pLMN_Identity.buf, ricId->pLMN_Identity.size);
482 buildPlmnId(ricCb.ricCfgParams.plmn , ricId->pLMN_Identity.buf);
484 ricId->ric_ID.size = byteSize * sizeof(uint8_t);
485 RIC_ALLOC(ricId->ric_ID.buf, ricId->ric_ID.size);
486 fillBitString(&ricId->ric_ID, unused, byteSize, ricVal);
491 /*******************************************************************
493 * @brief deallocate the memory allocated in E2SetupResponse
497 * Function : FreeE2SetupRsp
499 * Functionality: deallocate the memory allocated in E2SetupResponse
501 * @params[in] E2AP_PDU_t *e2apMsg
504 * ****************************************************************/
505 void FreeE2SetupRsp(E2AP_PDU_t *e2apMsg)
507 uint8_t arrIdx = 0, e2NodeConfigIdx=0, ranFuncIdx=0;
508 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
509 E2setupResponse_t *e2SetupRsp=NULL;
510 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULL;
511 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList=NULL;
512 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULL;
516 if(e2apMsg->choice.successfulOutcome)
518 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
519 if(e2SetupRsp->protocolIEs.list.array)
521 for(arrIdx=0; arrIdx<e2SetupRsp->protocolIEs.list.count; arrIdx++)
523 switch(e2SetupRsp->protocolIEs.list.array[arrIdx]->id)
525 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
527 ranFuncAcceptedList= &e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
528 if(ranFuncAcceptedList->list.array)
530 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
532 if(ranFuncAcceptedList->list.array[ranFuncIdx])
534 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
537 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
541 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
543 e2NodeConfigAdditionAckList =&e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
544 if(e2NodeConfigAdditionAckList->list.count)
546 for(e2NodeConfigIdx=0; e2NodeConfigIdx<e2NodeConfigAdditionAckList->list.count; e2NodeConfigIdx++)
548 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[e2NodeConfigIdx];
549 if(e2NodeAddAckItemIe)
551 f1InterfaceInfo = e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
554 RIC_FREE(f1InterfaceInfo->gNB_DU_ID.buf, f1InterfaceInfo->gNB_DU_ID.size);
555 RIC_FREE(f1InterfaceInfo, sizeof(E2nodeComponentInterfaceF1_t));
557 RIC_FREE(e2NodeAddAckItemIe, sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
560 RIC_FREE(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
565 RIC_FREE(e2SetupRsp->protocolIEs.list.array[arrIdx], sizeof(E2setupResponseIEs_t));
567 RIC_FREE(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
569 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
571 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
575 /*******************************************************************
577 * @brief Build E2node Component config addition ack list
581 * Function : BuildE2nodeComponentConfigAdditionAck
583 * Functionality: deallocate the memory allocated in E2SetupResponse
585 * @params[in] E2nodeComponentConfigAdditionAck_List_t
586 * *e2NodeConfigAdditionAckList
588 * @return ROK - success
590 * ****************************************************************/
592 uint8_t BuildE2nodeComponentConfigAdditionAck(E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList, DuDb *duDb)
595 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem;
597 e2NodeConfigAdditionAckList->list.count = 1;
598 e2NodeConfigAdditionAckList->list.size = e2NodeConfigAdditionAckList->list.count * sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t*);
599 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
600 if(e2NodeConfigAdditionAckList->list.array == NULLP)
602 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
606 for(arrIdx = 0; arrIdx< e2NodeConfigAdditionAckList->list.count; arrIdx++)
608 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
609 if(e2NodeConfigAdditionAckList->list.array[arrIdx] == NULLP)
611 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
615 e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[0];
616 e2NodeAddAckItem->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck_Item;
617 e2NodeAddAckItem->criticality = CriticalityE2_reject;
618 e2NodeAddAckItem->value.present = E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_E2nodeComponentConfigAdditionAck_Item;
619 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentInterfaceType = duDb->e2NodeComponent.interfaceType;
621 /* >E2 Node Component ID */
622 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1;
623 RIC_ALLOC(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1,\
624 sizeof(E2nodeComponentInterfaceF1_t));
625 if(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1 == NULLP)
627 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
630 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t);
631 RIC_ALLOC(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\
632 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
634 if(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP)
636 DU_LOG("\nERROR -->list. E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
639 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0] = duDb->e2NodeComponent.componentId;
641 /* >E2 Node Component Configuration Acknowledge*/
642 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentConfigurationAck.updateOutcome = \
643 E2nodeComponentConfigurationAck__updateOutcome_success;
648 /*******************************************************************
650 * @brief Build RAN function accepted list
654 * Function : BuildRanFunctionAcceptedList
656 * Functionality: Build RAN function accepted list
657 * ->For ProcedureCodeE2_id_E2setup or ProcedureCodeE2_id_RICserviceQuery
658 * we add all the RAN Function list which is present in RIC database.
659 * ->For any other procedures, we just fill the RAN functions whose ID
660 * is present in the recvList
664 * Count of ran functions to be accepted in the list
665 * Received list of RAN functions
669 * @return ROK - success
671 * ****************************************************************/
673 uint8_t BuildRanFunctionAcceptedList(DuDb *duDb, uint8_t count, RanFunction *ranFunAcceptedList, RANfunctionsID_List_t *ranFuncAcceptedList, uint8_t procedureCode)
675 uint8_t ranFuncIdx = 0;
676 RANfunctionID_ItemIEs_t *ranFuncAcceptedItemIe=NULL;
678 /* For ProcedureCodeE2_id_E2setup and ProcedureCodeE2_id_RICserviceQuery,
679 * the number of RAN function list items is equal to the number of
680 * ran function entries stored in the database.
681 * For any other procedure, the RAN function list count is equal
682 * to the count of ran functions obtained from the function's caller */
684 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
685 ranFuncAcceptedList->list.count = duDb->numOfRanFunction;
687 ranFuncAcceptedList->list.count = count;
689 ranFuncAcceptedList->list.size = ranFuncAcceptedList->list.count*sizeof(RANfunctionID_ItemIEs_t*);
690 RIC_ALLOC(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
691 if(ranFuncAcceptedList->list.array)
693 for(ranFuncIdx = 0; ranFuncIdx< ranFuncAcceptedList->list.count; ranFuncIdx++)
695 RIC_ALLOC(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
696 if(ranFuncAcceptedList->list.array[ranFuncIdx] == NULLP)
698 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array item");
701 ranFuncAcceptedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAcceptedList->list.array[ranFuncIdx];
702 ranFuncAcceptedItemIe->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
703 ranFuncAcceptedItemIe->criticality= CriticalityE2_ignore;
704 ranFuncAcceptedItemIe->value.present = RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item;
705 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
707 /* filling the RAN function information with the help of DuDb */
708 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = duDb->ranFunction[ranFuncIdx].id;
709 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= duDb->ranFunction[ranFuncIdx].revisionCounter;
713 /* filling the the RAN function information with the help received list of RAN functions */
714 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = ranFunAcceptedList[ranFuncIdx].id;
715 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= ranFunAcceptedList[ranFuncIdx].revisionCounter;
721 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array");
727 /*******************************************************************
729 * @brief Builds and sends the E2SetupResponse
733 * Function : BuildAndSendE2SetupRsp
735 * Functionality: Constructs the F1SetupResponse message and sends
736 * it back to the DU through SCTP.
738 * @params[in] void **buf,Buffer to which encoded pattern is written into
739 * @params[in] int *size,size of buffer
741 * @return ROK - success
744 * ****************************************************************/
746 uint8_t BuildAndSendE2SetupRsp(DuDb *duDb, uint8_t transId)
748 E2AP_PDU_t *e2apMsg = NULL;
749 E2setupResponse_t *e2SetupRsp;
750 asn_enc_rval_t encRetVal;
753 bool memAllocFailed = false;
755 DU_LOG("\nINFO --> E2AP : Building E2 Setup Response\n");
758 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
761 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
764 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
765 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
766 if(e2apMsg->choice.successfulOutcome == NULLP)
768 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
772 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
773 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
774 e2apMsg->choice.successfulOutcome->value.present = \
775 SuccessfulOutcomeE2__value_PR_E2setupResponse;
776 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
779 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
780 if(duDb->numOfRanFunction)
783 e2SetupRsp->protocolIEs.list.count = elementCnt;
784 e2SetupRsp->protocolIEs.list.size = elementCnt * sizeof(E2setupResponseIEs_t*);
786 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
787 if(e2SetupRsp->protocolIEs.list.array == NULLP)
789 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
793 for(idx=0; idx<elementCnt; idx++)
795 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array[idx], sizeof(E2setupResponseIEs_t));
796 if(e2SetupRsp->protocolIEs.list.array[idx] == NULLP)
798 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
799 memAllocFailed = true;
804 if(memAllocFailed == true)
806 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
811 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_TransactionID;
812 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
813 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_TransactionID;
814 e2SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID = transId;
818 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalRIC_ID;
819 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
820 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_GlobalRIC_ID;
822 if(BuildGlobalRicId(&(e2SetupRsp->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID))!=ROK)
824 DU_LOG("\nERROR --> E2AP : Failed to build Global Ric Id");
828 if(duDb->numOfRanFunction)
830 /* Accepted RAN function Id */
832 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
833 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
834 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_RANfunctionsID_List;
835 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &e2SetupRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_E2setup)!=ROK)
837 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
842 /* E2 Node Component Configuration Addition Acknowledge List*/
844 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck;
845 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
846 e2SetupRsp->protocolIEs.list.array[idx]->value.present = \
847 E2setupResponseIEs__value_PR_E2nodeComponentConfigAdditionAck_List;
848 if(BuildE2nodeComponentConfigAdditionAck(&e2SetupRsp->protocolIEs.list.array[idx]->\
849 value.choice.E2nodeComponentConfigAdditionAck_List, duDb) != ROK)
851 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list");
855 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
856 memset(encBuf, 0, ENC_BUF_MAX_LEN);
858 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
860 /* Check encode results */
861 if(encRetVal.encoded == ENCODE_FAIL)
863 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupResponse structure (at %s)\n",\
864 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
869 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupResponse\n");
870 for(int i=0; i< encBufSize; i++)
872 DU_LOG("%x",encBuf[i]);
876 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
878 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Response failed");
884 FreeE2SetupRsp(e2apMsg);
885 BuildAndSendRicSubscriptionReq(duDb);
889 /*******************************************************************
891 * @brief Free RIC Subscription Details
895 * Function : FreeRicSubsDetails
897 * Functionality: Free the RIC Subscription Details
899 * @params[in] RICsubscriptionDetails_t *subsDetails
902 * ****************************************************************/
903 void FreeRicSubsDetails(RICsubscriptionDetails_t *subsDetails)
905 uint8_t elementIdx = 0;
906 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
908 RIC_FREE(subsDetails->ricEventTriggerDefinition.buf, subsDetails->ricEventTriggerDefinition.size);
910 if(subsDetails->ricAction_ToBeSetup_List.list.array)
912 for(elementIdx = 0; elementIdx < subsDetails->ricAction_ToBeSetup_List.list.count; elementIdx++)
914 if(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
916 actionItem = (RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx];
917 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
919 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf, \
920 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size);
921 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
923 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t))
926 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
930 /*******************************************************************
932 * @brief Free RIC Subscription Request
936 * Function : FreeRicSubscriptionReq
938 * Functionality : Free RIC Subscription Request
940 * @return ROK - success
943 ******************************************************************/
944 void FreeRicSubscriptionReq(E2AP_PDU_t *e2apRicMsg)
947 RICsubscriptionRequest_t *ricSubscriptionReq;
951 if(e2apRicMsg->choice.initiatingMessage)
953 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
954 if(ricSubscriptionReq->protocolIEs.list.array)
956 for(idx=0; idx < ricSubscriptionReq->protocolIEs.list.count; idx++)
958 switch(ricSubscriptionReq->protocolIEs.list.array[idx]->id)
960 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
962 FreeRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails));
966 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
968 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
970 RIC_FREE(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
972 RIC_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
976 /*******************************************************************
978 * @brief Builds Ric Request Id
982 * Function : BuildNewRicRequestId
984 * Functionality: Assign new Ric Request ID
986 * @params[in] RIC request ID to be sent
987 * RIC request ID stored in DB
988 * @return ROK - success
991 * ****************************************************************/
993 uint8_t BuildNewRicRequestId(RICrequestID_t *ricReqId, RicRequestId *reqIdDb)
995 static uint16_t requestorId = 0;
996 static uint16_t instanceId = 0;
998 if(ricReqId != NULLP)
1000 ricReqId->ricRequestorID = ++requestorId;
1001 ricReqId->ricInstanceID = ++instanceId;
1003 reqIdDb->requestorId = ricReqId->ricRequestorID;
1004 reqIdDb->instanceId = ricReqId->ricInstanceID;
1009 /*******************************************************************
1011 * @brief Free RIC Action Definition
1015 * Function : FreeRicActionDefinition
1017 * Functionality: Free RIC Action Definition
1019 * @params[in] E2SM-KPM Action definition
1022 * ****************************************************************/
1023 void FreeRicActionDefinition(E2SM_KPM_ActionDefinition_t actionDef)
1025 uint8_t elementIdx = 0;
1026 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1027 MeasurementInfoItem_t *measItem = NULLP;
1029 switch(actionDef.actionDefinition_formats.present)
1031 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
1033 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1)
1035 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1036 if(actionFormat1->measInfoList.list.array)
1038 for(elementIdx = 0; elementIdx < actionFormat1->measInfoList.list.count; elementIdx++)
1040 if(actionFormat1->measInfoList.list.array[elementIdx])
1042 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1043 switch(measItem->measType.present)
1045 case MeasurementType_PR_NOTHING:
1046 case MeasurementType_PR_measID:
1048 case MeasurementType_PR_measName:
1050 RIC_FREE(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size)
1054 RIC_FREE(measItem, sizeof(MeasurementInfoItem_t));
1057 RIC_FREE(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1059 RIC_FREE(actionFormat1, sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1064 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2:
1065 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3:
1066 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format4:
1067 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format5:
1068 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_NOTHING:
1073 /*******************************************************************
1075 * @brief Fill RIC Action Definition
1079 * Function : fillRicActionDef
1081 * Functionality: Fill RIC Action Definition
1083 * @params[in] RIC Action definition
1087 * ****************************************************************/
1088 uint8_t fillRicActionDef(RICactionDefinition_t *ricActionDef)
1090 uint8_t ret = RFAILED;
1091 asn_enc_rval_t encRetVal;
1092 uint8_t elementCnt = 0, elementIdx = 0;
1093 char *measurementTypeName[] = {"RRU.PrbTotDl", "RRU.PrbTotUl"};
1094 E2SM_KPM_ActionDefinition_t actionDef;
1095 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
1096 MeasurementInfoItem_t *measItem = NULLP;
1100 /* Fill E2SM-KPM Action Definition Format 1 */
1102 /* RIC Stype Type */
1103 actionDef.ric_Style_Type = RIC_STYLE_TYPE;
1105 /* RIC Action Definition Format 1 */
1106 actionDef.actionDefinition_formats.present = \
1107 E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1;
1109 RIC_ALLOC(actionDef.actionDefinition_formats.choice.actionDefinition_Format1, \
1110 sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1111 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1 == NULLP)
1113 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1116 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1118 /* Measurement Info List */
1120 actionFormat1->measInfoList.list.count = elementCnt;
1121 actionFormat1->measInfoList.list.size = elementCnt * sizeof(MeasurementInfoItem_t *);
1122 RIC_ALLOC(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1123 if(actionFormat1->measInfoList.list.array == NULL)
1125 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1129 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1131 RIC_ALLOC(actionFormat1->measInfoList.list.array[elementIdx], sizeof(MeasurementInfoItem_t));
1132 if(actionFormat1->measInfoList.list.array[elementIdx] == NULLP)
1134 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1138 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1139 measItem->measType.present = MeasurementType_PR_measName;
1141 measItem->measType.choice.measName.size = strlen(measurementTypeName[elementIdx]);
1142 RIC_ALLOC(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size);
1143 if(measItem->measType.choice.measName.buf == NULLP)
1145 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1148 memcpy(measItem->measType.choice.measName.buf, measurementTypeName[elementIdx], measItem->measType.choice.measName.size);
1150 if(elementIdx < elementCnt)
1153 /* Granularity Period */
1154 actionFormat1->granulPeriod = RIC_ACTION_GRANULARITY_PERIOD; /* In ms */
1156 /* Prints the Msg formed */
1157 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, &actionDef);
1159 /* Encode E2SM-KPM RIC Action Definition */
1160 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1162 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_ActionDefinition, 0, &actionDef, PrepFinalEncBuf, encBuf);
1163 if(encRetVal.encoded == ENCODE_FAIL)
1165 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM action definition structure (at %s)\n",\
1166 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1170 /* Copty encoded E2SM-KPM RIC action definition to E2AP octet string buffer */
1171 ricActionDef->size = encBufSize;
1172 RIC_ALLOC(ricActionDef->buf, encBufSize);
1173 if(ricActionDef->buf == NULLP)
1175 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1178 memcpy(ricActionDef->buf, encBuf, encBufSize);
1184 FreeRicActionDefinition(actionDef);
1188 /*******************************************************************
1190 * @brief Fills RIC Action To Be Setup Item
1194 * Function : fillActionToBeSetup
1196 * Functionality: Fill the RIC Action To Be Setup Ite,
1197 * RIC subscription DB
1199 * @params[in] RICaction_ToBeSetup_ItemIEs_t *items
1200 * @return ROK - success
1203 * ****************************************************************/
1204 uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscription *ricSubsDb)
1206 static uint8_t ricActionId = 0;
1208 if(actionItem == NULLP)
1210 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1216 actionItem->id = ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item;
1217 actionItem->criticality = CriticalityE2_ignore;
1218 actionItem->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
1221 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ricActionId;
1222 ricSubsDb->actionSequence[ricActionId].actionId = \
1223 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
1226 /* RIC Action Type */
1227 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
1229 /* RIC Action Definition */
1230 RIC_ALLOC(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1231 if(!actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1233 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1236 if(fillRicActionDef(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition) != ROK)
1238 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1242 ricSubsDb->numOfActions++;
1246 memset(&ricSubsDb->actionSequence[ricActionId], 0, sizeof(ActionInfo));
1247 ricSubsDb->actionSequence[ricActionId].actionId = -1;
1251 /*******************************************************************
1253 * @brief Free Event Trigger Definition
1257 * Function : FreeEventTriggerDef
1259 * Functionality: Free Event Trigger Definition
1261 * @params[in] E2SM-KPM Event Trigger Definition
1264 * ****************************************************************/
1265 void FreeEventTriggerDef(E2SM_KPM_EventTriggerDefinition_t *eventTiggerDef)
1269 switch(eventTiggerDef->eventDefinition_formats.present)
1271 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING:
1273 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1:
1274 RIC_FREE(eventTiggerDef->eventDefinition_formats.choice.eventDefinition_Format1, \
1275 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
1281 /*******************************************************************
1283 * @brief Fill Event Trigger Definition
1287 * Function : fillEventTriggerDef
1289 * Functionality: Fill Event Trigger Definition
1291 * @params[in] RIC Event Trigger Definition
1295 * ****************************************************************/
1296 uint8_t fillEventTriggerDef(RICeventTriggerDefinition_t *ricEventTriggerDef)
1298 uint8_t ret = RFAILED;
1299 asn_enc_rval_t encRetVal;
1300 E2SM_KPM_EventTriggerDefinition_t eventTiggerDef;
1304 /* Fill E2SM-KPM Event Trigger Definition Format 1 */
1305 eventTiggerDef.eventDefinition_formats.present = \
1306 E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1;
1308 RIC_ALLOC(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1, \
1309 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
1310 if(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1 == NULLP)
1312 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1316 eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1->reportingPeriod = 1000; /* In ms */
1318 /* Prints the Msg formed */
1319 xer_fprint(stdout, &asn_DEF_E2SM_KPM_EventTriggerDefinition, &eventTiggerDef);
1321 /* Encode E2SM-KPM Event Trigger Definition */
1322 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1324 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_EventTriggerDefinition, 0, &eventTiggerDef, PrepFinalEncBuf, encBuf);
1325 if(encRetVal.encoded == ENCODE_FAIL)
1327 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM event trigger definition structure (at %s)\n",\
1328 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1332 /* Copy encoded E2SM-KPM event trigger definition to E2AP octet string buffer */
1333 ricEventTriggerDef->size = encBufSize;
1334 RIC_ALLOC(ricEventTriggerDef->buf, encBufSize);
1335 if(ricEventTriggerDef->buf == NULLP)
1337 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1340 memcpy(ricEventTriggerDef->buf, encBuf, encBufSize);
1346 FreeEventTriggerDef(&eventTiggerDef);
1350 /*******************************************************************
1352 * @brief builds RIC Subscription Details
1356 * Function : BuildsRicSubsDetails
1358 * Functionality: Builds the RIC Subscription Details
1360 * @params[in] RIC Subscription details to be filled
1361 * RIC subscriotion DB
1362 * @return ROK - success
1365 * ****************************************************************/
1367 uint8_t BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails, RicSubscription *ricSubsInfo)
1369 uint8_t elementCnt = 0;
1370 uint8_t elementIdx = 0;
1372 if(subsDetails == NULLP)
1374 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1380 /* RIC Event Trigger Definition */
1381 if(fillEventTriggerDef(&subsDetails->ricEventTriggerDefinition) != ROK)
1383 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1387 /* RIC Actions To Be Setup List */
1389 subsDetails->ricAction_ToBeSetup_List.list.count = elementCnt;
1390 subsDetails->ricAction_ToBeSetup_List.list.size = elementCnt * sizeof(RICaction_ToBeSetup_ItemIEs_t *);
1391 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
1392 if(subsDetails->ricAction_ToBeSetup_List.list.array == NULLP)
1394 DU_LOG("\nERROR --> E2AP : Memory allocation for RICactionToBeSetup Items failed");
1398 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1400 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t));
1401 if(!subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
1403 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1407 if(elementIdx < elementCnt)
1412 if(fillActionToBeSetup((RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], \
1413 ricSubsInfo) != ROK)
1415 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1424 /*******************************************************************
1426 * @brief Builds and Send the RicSubscriptionReq
1430 * Function : BuildAndSendRicSubscriptionReq
1432 * Functionality:Fills the RicSubscriptionReq
1434 * @return ROK - success
1437 ******************************************************************/
1438 uint8_t BuildAndSendRicSubscriptionReq(DuDb *duDb)
1440 uint8_t ret = RFAILED;
1441 uint8_t elementCnt = 0;
1443 uint8_t actionIdx = 0;
1444 asn_enc_rval_t encRetVal; /* Encoder return value */
1445 E2AP_PDU_t *e2apRicMsg = NULL;
1446 RICsubscriptionRequest_t *ricSubscriptionReq;
1447 RanFunction *ranFuncDb = &duDb->ranFunction[0];
1448 CmLList *ricSubsNode = NULLP;
1449 RicSubscription *ricSubsInfo = NULLP;
1451 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n");
1453 /* Allocate memory to store RIC subscription info in RIC DB */
1454 RIC_ALLOC(ricSubsInfo, sizeof(RicSubscription));
1457 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1460 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
1462 ricSubsInfo->actionSequence[actionIdx].actionId = -1;
1467 RIC_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
1468 if(e2apRicMsg == NULLP)
1470 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1474 e2apRicMsg->present = E2AP_PDU_PR_initiatingMessage;
1475 RIC_ALLOC(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1476 if(e2apRicMsg->choice.initiatingMessage == NULLP)
1478 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1481 e2apRicMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscription;
1482 e2apRicMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1483 e2apRicMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionRequest;
1485 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
1488 ricSubscriptionReq->protocolIEs.list.count = elementCnt;
1489 ricSubscriptionReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionRequest_IEs_t);
1491 /* Initialize the subscription members */
1492 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
1493 if(ricSubscriptionReq->protocolIEs.list.array == NULLP)
1495 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1499 for(idx=0; idx<elementCnt; idx++)
1501 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
1502 if(ricSubscriptionReq->protocolIEs.list.array[idx] == NULLP)
1504 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1508 if(idx < elementCnt)
1511 /* Filling RIC Request Id */
1513 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
1514 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1515 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
1516 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
1517 if(BuildNewRicRequestId(&ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICrequestID, \
1518 &ricSubsInfo->requestId) != ROK)
1520 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
1525 /* Filling RAN Function Id */
1527 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
1528 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1529 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
1530 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
1531 ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ranFuncDb->id;
1533 /* Filling RIC Subscription Details */
1535 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICsubscriptionDetails;
1536 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1537 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
1538 RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
1539 if(BuildRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails),\
1540 ricSubsInfo) != ROK)
1542 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
1546 /* Prints the Msg formed */
1547 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
1549 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1551 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
1552 if(encRetVal.encoded == ENCODE_FAIL)
1554 DU_LOG("\nERROR --> E2AP : Could not encode RicSubscriptionRequest structure (at %s)\n",\
1555 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1560 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicSubscriptionRequest\n");
1561 for(int i=0; i< encBufSize; i++)
1563 DU_LOG("%x",encBuf[i]);
1568 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
1570 DU_LOG("\nERROR --> E2AP : Sending RIC subscription Request failed");
1574 /* Add RIC Subscription Info to RAN Function's RIC Subscription List */
1575 RIC_ALLOC(ricSubsNode , sizeof(CmLList));
1578 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1581 ricSubsNode->node = (PTR)ricSubsInfo;
1582 cmLListAdd2Tail(&ranFuncDb->subscriptionList, ricSubsNode);
1590 RIC_FREE(ricSubsInfo, sizeof(RicSubscription));
1591 RIC_FREE(ricSubsNode , sizeof(CmLList));
1594 FreeRicSubscriptionReq(e2apRicMsg);
1598 /*******************************************************************
1600 * @brief Process RicSubscriptionResponse
1604 * Function : ProcRicSubscriptionRsp
1606 * Functionality: Processes RicSubscriptionRsp
1608 * @return ROK - void
1610 ******************************************************************/
1612 void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricSubscriptionRsp)
1614 uint8_t duIdx = 0, ieIdx = 0, notAdmitIdx = 0;
1615 uint8_t ranFuncId = 0, actionId = 0;
1617 bool ricReqIdDecoded = false;
1618 RicRequestId ricReqId;
1619 RanFunction *ranFuncDb = NULLP;
1620 RicSubscription *ricSubs = NULLP;
1621 CmLList *ricSubsNode = NULLP;
1622 ActionInfo *action = NULLP;
1623 RICsubscriptionResponse_IEs_t *ricSubsRspIe = NULLP;
1624 RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
1626 DU_LOG("\nINFO --> E2AP : RIC Subscription Response received");
1629 SEARCH_DU_DB(duIdx, duId, duDb);
1632 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
1636 memset(&ricReqId, 0, sizeof(RicRequestId));
1637 if(ricSubscriptionRsp)
1639 if(ricSubscriptionRsp->protocolIEs.list.array)
1641 for(ieIdx=0; ieIdx<ricSubscriptionRsp->protocolIEs.list.count; ieIdx++)
1643 if(ricSubscriptionRsp->protocolIEs.list.array[ieIdx])
1645 ricSubsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1646 switch(ricSubscriptionRsp->protocolIEs.list.array[ieIdx]->id)
1648 case ProtocolIE_IDE2_id_RICrequestID:
1650 ricReqId.requestorId = ricSubsRspIe->value.choice.RICrequestID.ricRequestorID;
1651 ricReqId.instanceId = ricSubsRspIe->value.choice.RICrequestID.ricInstanceID;
1652 ricReqIdDecoded = true;
1655 case ProtocolIE_IDE2_id_RANfunctionID:
1657 ranFuncId = ricSubsRspIe->value.choice.RANfunctionID;
1658 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
1661 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionResponse: RAN Function ID [%d] not found", ranFuncId);
1666 case ProtocolIE_IDE2_id_RICactions_Admitted:
1670 case ProtocolIE_IDE2_id_RICactions_NotAdmitted:
1672 if(!(ranFuncDb && ricReqIdDecoded))
1675 notAdmitList = &ricSubsRspIe->value.choice.RICaction_NotAdmitted_List;
1676 for(notAdmitIdx = 0; notAdmitIdx < notAdmitList->list.count; notAdmitIdx++)
1678 actionId = ((RICaction_NotAdmitted_ItemIEs_t *)(notAdmitList->list.array[notAdmitIdx]))->\
1679 value.choice.RICaction_NotAdmitted_Item.ricActionID;
1681 /* Remove action from RAN Function's subscription list */
1682 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
1685 action = fetchActionInfoFromActionId(actionId, ricSubs);
1688 memset(action, 0, sizeof(ActionInfo));
1689 ricSubs->actionSequence[actionId].actionId = -1;
1690 ricSubs->numOfActions--;
1703 /*******************************************************************
1705 * @brief deallocate the memory allocated in E2SetupFailure
1709 * Function : FreeE2SetupFailure
1711 * Functionality: deallocate the memory allocated in E2SetupFailure
1713 * @params[in] E2AP_PDU_t *e2apMsg
1716 * ****************************************************************/
1717 void FreeE2SetupFailure(E2AP_PDU_t *e2apMsg)
1720 E2setupFailure_t *e2SetupFail;
1724 if(e2apMsg->choice.unsuccessfulOutcome)
1726 e2SetupFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
1727 if(e2SetupFail->protocolIEs.list.array)
1729 for(arrIdx=0; arrIdx<e2SetupFail->protocolIEs.list.count; arrIdx++)
1731 RIC_FREE(e2SetupFail->protocolIEs.list.array[arrIdx], sizeof(E2setupFailureIEs_t));
1733 RIC_FREE(e2SetupFail->protocolIEs.list.array, e2SetupFail->protocolIEs.list.size);
1735 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
1737 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1741 /*******************************************************************
1743 * @brief Buld and send the E2 Setup failure
1747 * Function : BuildAndSendE2SetupFailure
1750 * - Buld and send the E2 Setup failure
1751 * @return ROK - success
1754 * ****************************************************************/
1756 uint8_t BuildAndSendE2SetupFailure(uint32_t duId, uint8_t transId)
1758 uint8_t ret = RFAILED;
1759 E2AP_PDU_t *e2apMsg = NULL;
1760 E2setupFailure_t *e2SetupFailure;
1761 asn_enc_rval_t encRetVal;
1764 bool memAllocFailed = false;
1766 DU_LOG("\nINFO --> E2AP : Building E2 Setup failure\n");
1769 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1770 if(e2apMsg == NULLP)
1772 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1775 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
1776 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
1777 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
1779 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1783 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
1784 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
1785 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2setupFailure;
1786 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
1789 e2SetupFailure->protocolIEs.list.count = elementCnt;
1790 e2SetupFailure->protocolIEs.list.size = elementCnt * sizeof(struct E2setupFailureIEs *);
1792 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array, e2SetupFailure->protocolIEs.list.size);
1793 if(e2SetupFailure->protocolIEs.list.array == NULLP)
1795 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
1799 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
1801 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array[arrIdx], sizeof(struct E2setupFailureIEs));
1802 if(e2SetupFailure->protocolIEs.list.array[arrIdx] == NULLP)
1804 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
1805 memAllocFailed = true;
1810 if(memAllocFailed == true)
1812 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
1818 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
1819 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1820 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
1821 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
1824 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
1825 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1826 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
1827 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = CauseE2_PR_protocol;
1828 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.protocol = CauseE2Protocol_unspecified;
1831 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
1832 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
1833 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
1834 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
1836 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1837 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1839 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
1841 /* Check encode results */
1842 if(encRetVal.encoded == ENCODE_FAIL)
1844 DU_LOG("\nERROR --> E2AP : Could not encode E2 Setup failure structure (at %s)\n",\
1845 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1850 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Setup Failure\n");
1851 for(int i=0; i< encBufSize; i++)
1853 DU_LOG("%x",encBuf[i]);
1857 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
1859 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Failure failed");
1867 FreeE2SetupFailure(e2apMsg);
1871 /*******************************************************************
1873 * @brief process the e2setup request
1877 * Function : ProcE2SetupReq
1879 * Functionality: process the e2setup request
1881 * @return ROK - success
1884 ******************************************************************/
1886 uint8_t ProcE2SetupReq(uint32_t *duId, E2setupRequest_t *e2SetupReq)
1888 uint8_t arrIdx = 0, e2NodeAddListIdx =0, duIdx = 0, transId =0, ranFuncIdx;
1890 E2nodeComponentConfigAddition_List_t *e2NodeAddList;
1891 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem;
1892 RANfunction_ItemIEs_t *ranFuncItemIe;
1893 RANfunction_Item_t *ranFunItem;
1894 RANfunctions_List_t *ranFunctionsList;
1898 if(e2SetupReq->protocolIEs.list.array)
1900 for(arrIdx=0; arrIdx<e2SetupReq->protocolIEs.list.count; arrIdx++)
1902 if(e2SetupReq->protocolIEs.list.array[arrIdx])
1904 switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id)
1906 case ProtocolIE_IDE2_id_TransactionID:
1908 transId = e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
1911 case ProtocolIE_IDE2_id_GlobalE2node_ID:
1913 if(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID)
1915 *duId =e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID->buf[0];
1917 SEARCH_DU_DB(duIdx, *duId, duDb);
1920 duDb = &ricCb.duInfo[ricCb.numDu];
1923 memset(duDb, 0, sizeof(DuDb));
1928 case ProtocolIE_IDE2_id_RANfunctionsAdded:
1930 ranFunctionsList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
1932 if(ranFunctionsList->list.array)
1934 for(ranFuncIdx=0;ranFuncIdx<ranFunctionsList->list.count; ranFuncIdx++)
1936 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
1937 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
1938 duDb->ranFunction[ranFunItem->ranFunctionID-1].id = ranFunItem->ranFunctionID;
1939 duDb->ranFunction[ranFunItem->ranFunctionID-1].revisionCounter = ranFunItem->ranFunctionRevision;
1940 cmLListInit(&duDb->ranFunction[ranFunItem->ranFunctionID-1].subscriptionList);
1941 duDb->numOfRanFunction++;
1946 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
1948 e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
1949 if(e2NodeAddList->list.array)
1951 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
1953 if(e2NodeAddList->list.array[e2NodeAddListIdx])
1956 (E2nodeComponentConfigAddition_ItemIEs_t *)e2NodeAddList->list.array[e2NodeAddListIdx];
1957 if(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.\
1958 choice.e2nodeComponentInterfaceTypeF1)
1960 duDb->e2NodeComponent.interfaceType = F1;
1961 duDb->e2NodeComponent.componentId = \
1962 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.\
1963 choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0];
1978 if(BuildAndSendE2SetupRsp(duDb, transId) !=ROK)
1980 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 setup response");
1985 /*******************************************************************
1987 * @brief Deallocate the memory allocated for E2 Reset Response
1991 * Function : FreeE2ResetResponse
1994 * - freeing the memory allocated for E2ResetResponse
1996 * @params[in] E2AP_PDU_t *e2apMsg
1997 * @return ROK - success
2000 * ****************************************************************/
2001 void FreeE2ResetResponse(E2AP_PDU_t *e2apMsg)
2004 ResetResponseE2_t *resetResponse =NULLP;
2006 if(e2apMsg != NULLP)
2008 if(e2apMsg->choice.successfulOutcome != NULLP)
2010 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2011 if(resetResponse->protocolIEs.list.array)
2013 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
2015 if(resetResponse->protocolIEs.list.array[ieIdx])
2017 RIC_FREE(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2020 RIC_FREE(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2022 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2024 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2028 /*******************************************************************
2030 * @brief Buld and send the Reset Response msg
2034 * Function : BuildAndSendResetResponse
2037 * - Buld and send the Reset Response Message
2042 * @return ROK - success
2045 * ****************************************************************/
2046 uint8_t BuildAndSendResetResponse(uint32_t duId, uint8_t transId)
2048 uint8_t ieIdx = 0, elementCnt = 0;
2049 uint8_t ret = RFAILED;
2050 E2AP_PDU_t *e2apMsg = NULLP;
2051 ResetResponseE2_t *resetResponse=NULL;
2052 asn_enc_rval_t encRetVal; /* Encoder return value */
2054 DU_LOG("\nINFO --> E2AP : Building E2 Reset Response Message\n");
2057 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2058 if(e2apMsg == NULLP)
2060 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse(): Memory allocation for E2AP-PDU failed");
2063 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
2065 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2066 if(e2apMsg->choice.successfulOutcome == NULLP)
2068 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
2072 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
2073 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2074 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_ResetResponseE2;
2075 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
2078 resetResponse->protocolIEs.list.count = elementCnt;
2079 resetResponse->protocolIEs.list.size = elementCnt * sizeof(ResetResponseIEs_t *);
2080 RIC_ALLOC(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
2081 if(!resetResponse->protocolIEs.list.array)
2083 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array");
2087 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
2089 RIC_ALLOC(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
2090 if(!resetResponse->protocolIEs.list.array[ieIdx])
2092 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array element");
2096 if(ieIdx < elementCnt)
2100 resetResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2101 resetResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
2102 resetResponse->protocolIEs.list.array[ieIdx]->value.present = ResetResponseIEs__value_PR_TransactionID;
2103 resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
2105 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2107 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2109 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2110 if(encRetVal.encoded == ENCODE_FAIL)
2112 DU_LOG("\nERROR --> E2AP : Could not encode E2 reset response structure (at %s)\n",\
2113 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2118 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Reset Response \n");
2119 for(int i=0; i< encBufSize; i++)
2121 DU_LOG("%x",encBuf[i]);
2126 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2128 DU_LOG("\nERROR --> E2AP : Failed to send E2 Reset Response");
2136 FreeE2ResetResponse(e2apMsg);
2140 /*******************************************************************
2142 * @brief deallocate the memory allocated in building the
2143 * Service Query message
2147 * Function : FreeRicServiceQuery
2149 * Functionality: deallocate the memory allocated in building
2150 * Ric Service Query message
2152 * @params[in] E2AP_PDU_t *e2apMsg
2155 * ****************************************************************/
2157 void FreeRicServiceQuery(E2AP_PDU_t *e2apMsg)
2159 uint8_t arrIdx = 0, ranFuncIdx=0;
2160 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
2161 RICserviceQuery_t *ricServiceQuery=NULL;
2165 if(e2apMsg->choice.initiatingMessage)
2167 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2168 if(ricServiceQuery->protocolIEs.list.array)
2170 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
2172 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
2174 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
2176 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
2178 ranFuncAcceptedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2179 if(ranFuncAcceptedList->list.array)
2181 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
2183 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
2185 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
2189 case RICserviceQuery_IEs__value_PR_TransactionID:
2194 RIC_FREE(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2197 RIC_FREE(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2199 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
2201 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2205 /*******************************************************************
2207 * @brief build and send the ric service Query
2211 * Function : BuildAndSendRicServiceQuery
2213 * Functionality: build and send the ric service Query
2214 * @return ROK - success
2215 * RFAILED - Acknowledge
2217 ******************************************************************/
2219 uint8_t BuildAndSendRicServiceQuery(DuDb *duDb)
2223 uint8_t ret = RFAILED;
2224 bool memAllocFailed = false;
2225 E2AP_PDU_t *e2apMsg = NULL;
2226 asn_enc_rval_t encRetVal;
2227 RICserviceQuery_t *ricServiceQuery;
2229 DU_LOG("\nINFO --> E2AP : Building Ric service Query\n");
2232 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2233 if(e2apMsg == NULLP)
2235 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2238 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
2239 RIC_ALLOC(e2apMsg->choice.initiatingMessage , sizeof(struct InitiatingMessageE2));
2240 if(e2apMsg->choice.initiatingMessage == NULLP)
2242 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2246 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceQuery;
2247 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
2248 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceQuery;
2249 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2252 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
2253 if(duDb->numOfRanFunction)
2256 ricServiceQuery->protocolIEs.list.count = elementCnt;
2257 ricServiceQuery->protocolIEs.list.size = elementCnt * sizeof(RICserviceQuery_IEs_t*);
2259 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2260 if(ricServiceQuery->protocolIEs.list.array == NULLP)
2262 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2266 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2268 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2269 if(ricServiceQuery->protocolIEs.list.array[arrIdx] == NULLP)
2271 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2272 memAllocFailed = true;
2276 if(memAllocFailed == true)
2278 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2284 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2285 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2286 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_TransactionID;
2287 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = assignTransactionId(duDb);
2289 if(duDb->numOfRanFunction)
2291 /* Accepted RAN function Id */
2293 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
2294 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2295 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_RANfunctionsID_List;
2296 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceQuery)!=ROK)
2298 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
2303 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2304 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2306 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2308 /* Check encode results */
2309 if(encRetVal.encoded == ENCODE_FAIL)
2311 DU_LOG("\nERROR --> E2AP : Could not encode RIC service Query structure (at %s)\n",\
2312 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2317 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service Query\n");
2318 for(int i=0; i< encBufSize; i++)
2320 DU_LOG("%x",encBuf[i]);
2324 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2326 DU_LOG("\nERROR --> E2AP : Sending of RIC service Query failed");
2333 FreeRicServiceQuery(e2apMsg);
2337 /*******************************************************************
2339 * @brief deallocate the memory allocated in RicServiceUpdateFailure
2343 * Function : FreeRicServiceUpdateFailure
2345 * Functionality: deallocate the memory allocated in RicServiceUpdatefailure
2347 * @params[in] E2AP_PDU_t *e2apMsg
2350 * ****************************************************************/
2352 void FreeRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
2355 RICserviceUpdateFailure_t *ricServiceUpdateFailure=NULL;
2359 if(e2apMsg->choice.unsuccessfulOutcome)
2361 ricServiceUpdateFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
2362 if(ricServiceUpdateFailure->protocolIEs.list.array)
2364 for(arrIdx=0; arrIdx<ricServiceUpdateFailure->protocolIEs.list.count; arrIdx++)
2366 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
2368 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array, ricServiceUpdateFailure->protocolIEs.list.size);
2370 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
2372 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2376 /*******************************************************************
2378 * @brief fill E2 failure cause
2382 * Function : fillE2FailureCause
2384 * Functionality: fill E2 failure cause
2385 * @return ROK - success
2388 ******************************************************************/
2390 void fillE2FailureCause(CauseE2_t *cause, CauseE2_PR causePresent, uint8_t reason)
2392 cause->present = causePresent;
2394 switch(cause->present)
2396 case CauseE2_PR_ricRequest:
2397 cause->choice.ricRequest = reason;
2399 case CauseE2_PR_ricService:
2400 cause->choice.ricService = reason;
2402 case CauseE2_PR_e2Node:
2403 cause->choice.e2Node = reason;
2405 case CauseE2_PR_transport:
2406 cause->choice.transport = reason;
2408 case CauseE2_PR_protocol:
2409 cause->choice.protocol = reason;
2411 case CauseE2_PR_misc:
2412 cause->choice.misc = reason;
2415 cause->choice.misc = CauseE2Misc_unspecified;
2420 /*******************************************************************
2422 * @brief build and send the ric service update failure
2426 * Function : BuildAndSendRicServiceUpdateFailure
2428 * Functionality: build and send the ric service update failure
2429 * @return ROK - success
2432 ******************************************************************/
2434 uint8_t BuildAndSendRicServiceUpdateFailure(uint32_t duId, int8_t transId, CauseE2_PR causePresent, uint8_t reason)
2437 E2AP_PDU_t *e2apMsg = NULL;
2438 asn_enc_rval_t encRetVal;
2439 uint8_t ret = RFAILED;
2441 uint8_t elementCnt=0;
2442 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
2444 DU_LOG("\nINFO --> E2AP : Building Ric service update failure\n");
2447 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2448 if(e2apMsg == NULLP)
2450 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2453 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
2454 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
2455 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
2457 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2461 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
2462 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
2463 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure;
2464 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
2467 ricServiceFailure->protocolIEs.list.count = elementCnt;
2468 ricServiceFailure->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateFailure_IEs_t *);
2470 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array, ricServiceFailure->protocolIEs.list.size);
2471 if(ricServiceFailure->protocolIEs.list.array == NULLP)
2473 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2477 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2479 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
2480 if(ricServiceFailure->protocolIEs.list.array[arrIdx] == NULLP)
2482 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2486 if(arrIdx<elementCnt)
2488 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2494 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2495 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2496 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TransactionID;
2497 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2500 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
2501 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2502 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_CauseE2;
2503 fillE2FailureCause(&ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, causePresent, reason);
2506 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
2507 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
2508 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TimeToWaitE2;
2509 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
2511 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2512 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2514 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2516 /* Check encode results */
2517 if(encRetVal.encoded == ENCODE_FAIL)
2519 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update failure structure (at %s)\n",\
2520 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2525 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Failure\n");
2526 for(int i=0; i< encBufSize; i++)
2528 DU_LOG("%x",encBuf[i]);
2532 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2534 DU_LOG("\nERROR --> E2AP : Sending RIC service update failed");
2541 FreeRicServiceUpdateFailure(e2apMsg);
2546 /*******************************************************************
2548 * @brief deallocate the memory allocated in RicServiceUpdateAck(
2552 * Function : FreeRicServiceUpdateAck
2554 * Functionality: deallocate the memory allocated in RicServiceUpdateAck
2556 * @params[in] E2AP_PDU_t *e2apMsg
2559 * ****************************************************************/
2561 void FreeRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
2563 uint8_t arrIdx = 0, ranFuncIdx=0;
2564 RANfunctionsID_List_t *acceptedList=NULL;
2565 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
2566 RANfunctionsIDcause_List_t *rejectedList=NULL;
2570 if(e2apMsg->choice.successfulOutcome)
2572 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
2573 if(ricServiceUpdateAck->protocolIEs.list.array)
2575 for(arrIdx=0; arrIdx<ricServiceUpdateAck->protocolIEs.list.count; arrIdx++)
2577 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx])
2579 switch(ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id)
2581 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
2583 acceptedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2584 if(acceptedList->list.array)
2586 for(ranFuncIdx=0;ranFuncIdx<acceptedList->list.count; ranFuncIdx++)
2588 RIC_FREE(acceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
2590 RIC_FREE(acceptedList->list.array, acceptedList->list.size);
2595 case ProtocolIE_IDE2_id_RANfunctionsRejected:
2597 rejectedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
2598 if(rejectedList->list.array)
2600 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
2602 RIC_FREE(rejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
2604 RIC_FREE(rejectedList->list.array, rejectedList->list.size);
2609 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
2612 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
2614 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2616 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2620 /*******************************************************************
2622 * @brief Build RAN function rejected list
2626 * Function : BuildRanFunctionRejectedList
2628 * Functionality: Build RAN function rejected list
2631 * Count of ran functions to be rejected in the list
2632 * Received list of RAN functions
2634 * @return ROK - success
2636 * ****************************************************************/
2638 uint8_t BuildRanFunctionRejectedList(uint8_t count, RanFunction *ranFunRejectedList, RANfunctionsIDcause_List_t *ranFuncRejectedList)
2640 uint8_t ranFuncIdx = 0;
2641 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
2643 ranFuncRejectedList->list.count = count;
2645 ranFuncRejectedList->list.size = ranFuncRejectedList->list.count*sizeof(RANfunctionIDcause_ItemIEs_t*);
2646 RIC_ALLOC(ranFuncRejectedList->list.array, ranFuncRejectedList->list.size);
2647 if(ranFuncRejectedList->list.array == NULLP)
2649 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array");
2653 for(ranFuncIdx = 0; ranFuncIdx< ranFuncRejectedList->list.count; ranFuncIdx++)
2655 RIC_ALLOC(ranFuncRejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
2656 if(ranFuncRejectedList->list.array[ranFuncIdx] == NULLP)
2658 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array item");
2661 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)ranFuncRejectedList->list.array[ranFuncIdx];
2662 ranFuncRejectedItemIe->id = ProtocolIE_IDE2_id_RANfunctionIEcause_Item;
2663 ranFuncRejectedItemIe->criticality= CriticalityE2_ignore;
2664 ranFuncRejectedItemIe->value.present = RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item;
2665 ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID = ranFunRejectedList[ranFuncIdx].id;
2666 fillE2FailureCause(&ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.cause, CauseE2_PR_ricService,\
2667 CauseE2RICservice_ran_function_not_supported);
2673 /*******************************************************************
2675 * @brief build and send the ric service update Acknowledge
2679 * Function : BuildAndSendRicServiceUpdateAcknowledge
2681 * Functionality: build and send the ric service update Acknowledge
2682 * @return ROK - success
2683 * RFAILED - Acknowledge
2685 ******************************************************************/
2687 uint8_t BuildAndSendRicServiceUpdateAcknowledge(DuDb *duDb, int8_t transId, RicTmpRanFunList ricRanFuncList)
2689 E2AP_PDU_t *e2apMsg = NULL;
2690 asn_enc_rval_t encRetVal;
2691 uint8_t arrIdx=0, elementCnt=0, ret=RFAILED;;
2692 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
2694 DU_LOG("\nINFO --> E2AP : Building Ric service update Acknowledge\n");
2697 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2698 if(e2apMsg == NULLP)
2700 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2703 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
2704 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(struct SuccessfulOutcomeE2));
2705 if(e2apMsg->choice.successfulOutcome == NULLP)
2707 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2711 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
2712 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2713 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge;
2714 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
2717 if(ricRanFuncList.numOfRanFunAccepted)
2719 if(ricRanFuncList.numOfRanFuneRejected)
2723 ricServiceUpdateAck->protocolIEs.list.count = elementCnt;
2724 ricServiceUpdateAck->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateAcknowledge_IEs_t*);
2726 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
2727 if(ricServiceUpdateAck->protocolIEs.list.array == NULLP)
2729 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
2733 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2735 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
2736 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx] == NULLP)
2738 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
2742 if(arrIdx<elementCnt)
2744 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
2750 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2751 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2752 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_TransactionID;
2753 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2755 if(ricRanFuncList.numOfRanFunAccepted)
2757 /* Accepted RAN function List */
2759 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
2760 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2761 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List;
2762 if(BuildRanFunctionAcceptedList(duDb, ricRanFuncList.numOfRanFunAccepted, ricRanFuncList.ranFunAcceptedList,\
2763 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceUpdate)!=ROK)
2765 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
2770 if(ricRanFuncList.numOfRanFuneRejected)
2772 /* RAN Functions Rejected List */
2774 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsRejected;
2775 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2776 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List;
2777 if(BuildRanFunctionRejectedList(ricRanFuncList.numOfRanFuneRejected, ricRanFuncList.ranFunRejectedList, \
2778 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List)!=ROK)
2780 DU_LOG("\nERROR --> E2AP : Failed to build Ran function rejected list");
2786 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2787 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2789 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2791 /* Check encode results */
2792 if(encRetVal.encoded == ENCODE_FAIL)
2794 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update Acknowledge structure (at %s)\n",\
2795 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2800 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Acknowledge\n");
2801 for(int i=0; i< encBufSize; i++)
2803 DU_LOG("%x",encBuf[i]);
2807 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2809 DU_LOG("\nERROR --> E2AP : Sending RIC service update ack failed");
2815 FreeRicServiceUpdateAck(e2apMsg);
2819 /*******************************************************************
2821 * @brief process the RIC service update
2825 * Function : ProcRicserviceUpdate
2827 * Functionality: process the RIC service update
2829 * @return ROK - success
2832 ******************************************************************/
2834 void ProcRicServiceUpdate(uint32_t duId, RICserviceUpdate_t *ricServiceUpdate)
2836 RicTmpRanFunList ricRanFuncList;
2839 uint8_t duIdx = 0, elementCnt =0, arrIdx = 0;
2840 uint16_t ranFuncIdx = 0, failedRanFuncCount=0, recvdRanFuncCount=0;
2841 RanFunction *ranFuncDb = NULLP;
2842 RANfunction_ItemIEs_t *ranFuncItemIe =NULL;
2843 RANfunction_Item_t *ranFuncItem =NULL;
2844 RANfunctionID_Item_t *ranFuncIdItem=NULL;
2845 RANfunctions_List_t *ranFuncList=NULL;
2846 RANfunctionsID_List_t *deleteList=NULL;
2847 RANfunctionID_ItemIEs_t *delRanFuncItem=NULL;
2849 SEARCH_DU_DB(duIdx, duId, duDb);
2852 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
2855 memset(&ricRanFuncList, 0, sizeof(RicTmpRanFunList));
2857 if(!ricServiceUpdate)
2859 DU_LOG("\nERROR --> E2AP : ricServiceUpdate pointer is null");
2863 if(!ricServiceUpdate->protocolIEs.list.array)
2865 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array pointer is null");
2868 elementCnt = ricServiceUpdate->protocolIEs.list.count;
2869 for(arrIdx=0; arrIdx<ricServiceUpdate->protocolIEs.list.count; arrIdx++)
2871 if(!ricServiceUpdate->protocolIEs.list.array[arrIdx])
2873 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array idx %d pointer is null",arrIdx);
2877 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
2879 case ProtocolIE_IDE2_id_TransactionID:
2881 transId = ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
2883 if(transId < 0 || transId > 255)
2885 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
2891 case ProtocolIE_IDE2_id_RANfunctionsAdded:
2893 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
2895 if(ranFuncList->list.array)
2897 for(ranFuncIdx=0;ranFuncIdx<ranFuncList->list.count; ranFuncIdx++)
2899 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
2900 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
2902 /* Adding the ran function in temporary list */
2903 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
2904 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
2905 ricRanFuncList.numOfRanFunAccepted++;
2907 /* Adding the new ran function in DB*/
2908 duDb->ranFunction[ranFuncItem->ranFunctionID-1].id = ranFuncItem->ranFunctionID;
2909 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
2910 duDb->numOfRanFunction++;
2912 /* Calculating total number of ran fuctions which are received for addition */
2913 recvdRanFuncCount++;
2919 case ProtocolIE_IDE2_id_RANfunctionsModified:
2922 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
2923 if(ranFuncList->list.array)
2925 for(ranFuncIdx = 0; ranFuncIdx< ranFuncList->list.count; ranFuncIdx++)
2927 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
2928 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
2929 if(fetchRanFuncFromRanFuncId(duDb, ranFuncItem->ranFunctionID) == NULLP)
2931 /* Calculating total number of ran fuctions which are not present */
2932 failedRanFuncCount++;
2934 /* Adding the ran function in temporary list */
2935 ricRanFuncList.ranFunRejectedList[ricRanFuncList.numOfRanFuneRejected].id = ranFuncItem->ranFunctionID;
2936 ricRanFuncList.numOfRanFuneRejected++;
2941 /* Adding the ran function in temporary list */
2942 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
2943 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
2944 ricRanFuncList.numOfRanFunAccepted++;
2946 /* Updating the new ran function in DB*/
2947 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
2949 /* Calculating total number of ran fuctions which are received for modification */
2950 recvdRanFuncCount++;
2955 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
2958 deleteList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2959 if(deleteList->list.array)
2961 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
2963 delRanFuncItem = (RANfunctionID_ItemIEs_t*) deleteList->list.array[ranFuncIdx];
2964 ranFuncIdItem = &delRanFuncItem->value.choice.RANfunctionID_Item;
2965 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncIdItem->ranFunctionID);
2968 memset(ranFuncDb, 0, sizeof(RanFunction));
2969 duDb->numOfRanFunction--;
2972 /* Calculating total number of ran fuctions which are received for deletion */
2973 recvdRanFuncCount++;
2981 DU_LOG("\nERROR --> E2AP : IE [%ld] is not supported",ricServiceUpdate->protocolIEs.list.array[arrIdx]->id);
2987 /* Sending RIC Service Update Failed if all RAN Functions received fail or if any IE processing fails
2988 * Else sending RIC Service Update Acknowledge */
2989 if((elementCnt > arrIdx) ||((recvdRanFuncCount > 0) && (recvdRanFuncCount == failedRanFuncCount)))
2991 if(BuildAndSendRicServiceUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
2993 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update Failure");
2999 if(BuildAndSendRicServiceUpdateAcknowledge(duDb, transId, ricRanFuncList) != ROK)
3001 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update acknowledge");
3007 /*******************************************************************
3009 * @brief Processing RIC subscription failure from DU
3013 * Function : ProcRicSubscriptionFailure
3015 * Functionality: Processing RIC subscription failure from DU
3017 * @param ID of DU from which message was sent
3018 * RIC Subscription failure message
3019 * @return ROK - success
3022 ******************************************************************/
3023 uint8_t ProcRicSubscriptionFailure(uint32_t duId, RICsubscriptionFailure_t *ricSubscriptionFailure)
3025 uint8_t ieIdx = 0, duIdx = 0;
3026 uint8_t ranFuncId = 0;
3028 RanFunction *ranFuncDb = NULLP;
3029 RicSubscription *ricSubs = NULLP;
3030 CmLList *ricSubsNode = NULLP;
3031 RicRequestId ricReqId;
3032 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
3034 DU_LOG("\nINFO --> E2AP : Received RIC subscription failure");
3036 SEARCH_DU_DB(duIdx, duId, duDb);
3039 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3043 memset(&ricReqId, 0, sizeof(RicRequestId));
3044 if(ricSubscriptionFailure)
3046 if(ricSubscriptionFailure->protocolIEs.list.array)
3048 for(ieIdx=0; ieIdx<ricSubscriptionFailure->protocolIEs.list.count; ieIdx++)
3050 if(ricSubscriptionFailure->protocolIEs.list.array[ieIdx])
3052 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[ieIdx];
3053 switch(ricSubscriptionFailure->protocolIEs.list.array[ieIdx]->id)
3055 case ProtocolIE_IDE2_id_RICrequestID:
3057 ricReqId.requestorId = ricSubsFailIe->value.choice.RICrequestID.ricRequestorID;
3058 ricReqId.instanceId = ricSubsFailIe->value.choice.RICrequestID.ricInstanceID;
3061 case ProtocolIE_IDE2_id_RANfunctionID:
3063 ranFuncId = ricSubsFailIe->value.choice.RANfunctionID;
3064 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
3067 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionFailure : RAN Function Id [%d] not found", ranFuncId);
3072 /* Remove subscription entry from RAN Function */
3073 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
3076 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
3077 deleteRicSubscriptionNode(ricSubsNode);
3082 case ProtocolIE_IDE2_id_CauseE2:
3084 /* No handling required as of now since this is a stub */
3094 /*******************************************************************
3096 * @brief Free RIC Subscription Modification Refuse
3100 * Function : FreeRicSubsModRefuse
3102 * Functionality: Free RIC Subscription Modification Refuse
3104 * @param E2AP Message PDU to be freed
3107 ******************************************************************/
3108 void FreeRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
3111 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3115 if(e2apMsg->choice.unsuccessfulOutcome)
3117 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3118 if(ricSubsModRefuse->protocolIEs.list.array)
3120 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
3122 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3124 RIC_FREE(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3126 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3128 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3132 /*******************************************************************
3134 * @brief Build And Send RIC Subscription Modification Refuse
3138 * Function : BuildAndSendRicSubsModRefuse
3140 * Functionality: Build And Send RIC Subscription Modification Refuse
3143 * RIC Request ID of subscription
3147 * @return ROK - success
3150 ******************************************************************/
3151 uint8_t BuildAndSendRicSubsModRefuse(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, CauseE2_PR causeType, \
3154 uint8_t ieIdx = 0, elementCnt = 0;
3155 uint8_t ret = RFAILED;
3156 E2AP_PDU_t *e2apMsg = NULL;
3157 asn_enc_rval_t encRetVal;
3158 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
3159 RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
3161 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Refuse\n");
3164 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3165 if(e2apMsg == NULLP)
3167 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3170 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3171 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(UnsuccessfulOutcomeE2_t));
3172 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3174 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3178 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
3179 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3180 e2apMsg->choice.unsuccessfulOutcome->value.present = \
3181 UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse;
3182 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
3185 ricSubsModRefuse->protocolIEs.list.count = elementCnt;
3186 ricSubsModRefuse->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRefuse_IEs_t *);
3187 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array, ricSubsModRefuse->protocolIEs.list.size);
3188 if(!ricSubsModRefuse->protocolIEs.list.array)
3190 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3194 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
3196 RIC_ALLOC(ricSubsModRefuse->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRefuse_IEs_t));
3197 if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
3199 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3204 /* RIC Request ID */
3206 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3207 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RICrequestID;
3208 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3209 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RICrequestID;
3210 ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3211 ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3213 /* RAN Function ID */
3215 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3216 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3217 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3218 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_RANfunctionID;
3219 ricSubsModRefuseIe->value.choice.RANfunctionID = ranFuncId;
3223 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
3224 ricSubsModRefuseIe->id = ProtocolIE_IDE2_id_CauseE2;
3225 ricSubsModRefuseIe->criticality = CriticalityE2_reject;
3226 ricSubsModRefuseIe->value.present = RICsubscriptionModificationRefuse_IEs__value_PR_CauseE2;
3227 fillE2FailureCause(&ricSubsModRefuseIe->value.choice.CauseE2, causeType, cause);
3229 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3230 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3232 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3234 /* Check encode results */
3235 if(encRetVal.encoded == ENCODE_FAIL)
3237 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification refuse (at %s)\n",\
3238 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3243 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification refuse\n");
3244 for(int i=0; i< encBufSize; i++)
3246 DU_LOG("%x",encBuf[i]);
3250 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
3252 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Refused");
3259 FreeRicSubsModRefuse(e2apMsg);
3263 /*******************************************************************
3265 * @brief Free memory for RIC Subscription Modification Confirm
3269 * Function : FreeRicSubsModConfirm
3271 * Functionality: Free memory for RIC subscription modification
3274 * @param E2AP Message PDU to be freed
3277 ******************************************************************/
3278 void FreeRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
3280 uint8_t ieIdx = 0, arrIdx=0;
3281 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
3282 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
3283 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
3284 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
3285 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
3286 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
3290 if(e2apMsg->choice.successfulOutcome)
3292 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
3293 if(ricSubsModCfm->protocolIEs.list.array)
3295 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
3297 if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
3299 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3300 switch(ricSubsModCfmIe->id)
3302 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
3304 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
3305 if(modCfmList->list.array)
3307 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
3309 RIC_FREE(modCfmList->list.array[arrIdx], \
3310 sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
3312 RIC_FREE(modCfmList->list.array, modCfmList->list.size);
3317 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
3319 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
3320 if(modRefusedList->list.array)
3322 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
3324 RIC_FREE(modRefusedList->list.array[arrIdx], \
3325 sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
3327 RIC_FREE(modRefusedList->list.array, modRefusedList->list.size);
3332 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
3334 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
3335 if(rmvCfmList->list.array)
3337 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
3339 RIC_FREE(rmvCfmList->list.array[arrIdx], \
3340 sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
3342 RIC_FREE(rmvCfmList->list.array, rmvCfmList->list.size);
3347 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
3349 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
3350 if(rmvFailList->list.array)
3352 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
3354 RIC_ALLOC(rmvFailList->list.array[arrIdx], \
3355 sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
3357 RIC_FREE(rmvFailList->list.array, rmvFailList->list.size);
3366 RIC_FREE(ricSubsModCfmIe, sizeof(RICsubscriptionModificationConfirm_IEs_t));
3369 RIC_FREE(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
3371 RIC_FREE(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
3373 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3377 /*******************************************************************
3379 * @brief Fill the list of actions confirmed for modification
3383 * Function : fillActionModConfirmedList
3385 * Functionality: Fill the list of actions confirmed for modification
3387 * @param List to be filled
3389 * Source list of actions
3390 * @return ROK - success
3393 ******************************************************************/
3394 uint8_t fillActionModConfirmedList(RICactions_ConfirmedForModification_List_t *modCfmList, uint8_t numActions, \
3395 uint8_t *actionModifiedList)
3398 RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
3400 modCfmList->list.count = numActions;
3401 modCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForModification_ItemIEs_t *);
3402 RIC_ALLOC(modCfmList->list.array, modCfmList->list.size);
3403 if(!modCfmList->list.array)
3405 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3409 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
3411 RIC_ALLOC(modCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForModification_ItemIEs_t));
3412 if(!modCfmList->list.array[arrIdx])
3414 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3418 modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
3419 modCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForModification_Item;
3420 modCfmListItem->criticality = CriticalityE2_ignore;
3421 modCfmListItem->value.present = \
3422 RICaction_ConfirmedForModification_ItemIEs__value_PR_RICaction_ConfirmedForModification_Item;
3423 modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID = actionModifiedList[arrIdx];
3429 /*******************************************************************
3431 * @brief Fill the list of actions refused to be modified
3435 * Function : fillActionModRefusedList
3437 * Functionality: Fill the list of actions refused to be modified
3439 * @param List to be filled
3441 * Source list of actions refused tobe modified
3442 * @return ROK - success
3445 ******************************************************************/
3446 uint8_t fillActionModRefusedList(RICactions_RefusedToBeModified_List_t *modRefusedList, uint8_t numActions, \
3447 ActionFailed *actionModFailedList)
3450 RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
3452 modRefusedList->list.count = numActions;
3453 modRefusedList->list.size = numActions * sizeof(RICaction_RefusedToBeModified_ItemIEs_t *);
3454 RIC_ALLOC(modRefusedList->list.array, modRefusedList->list.size);
3455 if(!modRefusedList->list.array)
3457 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3461 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
3463 RIC_ALLOC(modRefusedList->list.array[arrIdx], sizeof(RICaction_RefusedToBeModified_ItemIEs_t));
3464 if(!modRefusedList->list.array[arrIdx])
3466 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3470 modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
3471 modRefusedListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeModified_Item;
3472 modRefusedListItem->criticality = CriticalityE2_ignore;
3473 modRefusedListItem->value.present = \
3474 RICaction_RefusedToBeModified_ItemIEs__value_PR_RICaction_RefusedToBeModified_Item;
3475 modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID = \
3476 actionModFailedList[arrIdx].actionId;
3477 fillE2FailureCause(&modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.cause, \
3478 actionModFailedList[arrIdx].failureType, actionModFailedList[arrIdx].cause);
3484 /*******************************************************************
3486 * @brief Fill the list of action confirmed for removal
3490 * Function : fillActionRemovalConfirmedList
3492 * Functionality: Fill the list of action confirmed for removal
3494 * @param List to be filled
3496 * Source list of actions removed
3497 * @return ROK - success
3500 ******************************************************************/
3501 uint8_t fillActionRemovalConfirmedList(RICactions_ConfirmedForRemoval_List_t *rmvCfmList, uint8_t numActions, \
3502 uint8_t *actionRemovedList)
3505 RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
3507 rmvCfmList->list.count = numActions;
3508 rmvCfmList->list.size = numActions * sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t *);
3509 RIC_ALLOC(rmvCfmList->list.array, rmvCfmList->list.size);
3510 if(!rmvCfmList->list.array)
3512 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3516 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
3518 RIC_ALLOC(rmvCfmList->list.array[arrIdx], sizeof(RICaction_ConfirmedForRemoval_ItemIEs_t));
3519 if(!rmvCfmList->list.array[arrIdx])
3521 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3525 rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
3526 rmvCfmListItem->id = ProtocolIE_IDE2_id_RICaction_ConfirmedForRemoval_Item;
3527 rmvCfmListItem->criticality = CriticalityE2_ignore;
3528 rmvCfmListItem->value.present = \
3529 RICaction_ConfirmedForRemoval_ItemIEs__value_PR_RICaction_ConfirmedForRemoval_Item;
3530 rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID = actionRemovedList[arrIdx];
3536 /*******************************************************************
3538 * @brief Fill the list of actions refused to be removed
3542 * Function : fillActionRemovalRefusedList
3544 * Functionality: Fill the list of actions refused to be removed
3546 * @param List to be filled
3548 * Source list of actions refused to be removed
3549 * @return ROK - success
3552 ******************************************************************/
3553 uint8_t fillActionRemovalRefusedList(RICactions_RefusedToBeRemoved_List_t *rmvFailList, \
3554 uint8_t numActions, ActionFailed *actionRmvlFailList)
3557 RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
3559 rmvFailList->list.count = numActions;
3560 rmvFailList->list.size = numActions * sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t *);
3561 RIC_ALLOC(rmvFailList->list.array, rmvFailList->list.size);
3562 if(!rmvFailList->list.array)
3564 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3568 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
3570 RIC_ALLOC(rmvFailList->list.array[arrIdx], sizeof(RICaction_RefusedToBeRemoved_ItemIEs_t));
3571 if(!rmvFailList->list.array[arrIdx])
3573 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3577 rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
3578 rmvFailListItem->id = ProtocolIE_IDE2_id_RICaction_RefusedToBeRemoved_Item;
3579 rmvFailListItem->criticality = CriticalityE2_ignore;
3580 rmvFailListItem->value.present = \
3581 RICaction_RefusedToBeRemoved_ItemIEs__value_PR_RICaction_RefusedToBeRemoved_Item;
3582 rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID = actionRmvlFailList[arrIdx].actionId;
3583 fillE2FailureCause(&rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.cause, \
3584 actionRmvlFailList[arrIdx].failureType, actionRmvlFailList[arrIdx].cause);
3591 /*******************************************************************
3593 * @brief Build And Send RIC Subscription Modification Confirm
3597 * Function : BuildAndSendRicSubsModConfirm
3599 * Functionality: Build And Send RIC Subscription Modification Confirm
3602 * RIC Request ID of subscription
3604 * Temporary source action list
3605 * @return ROK - success
3608 ******************************************************************/
3609 uint8_t BuildAndSendRicSubsModConfirm(uint32_t duId, RicRequestId ricReqId, uint16_t ranFuncId, RicTmpActionList tmpActionList)
3611 uint8_t ieIdx = 0, elementCnt = 0;
3612 uint8_t ret = RFAILED;
3613 E2AP_PDU_t *e2apMsg = NULLP;
3614 asn_enc_rval_t encRetVal;
3615 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
3616 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
3618 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Confirm\n");
3621 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3622 if(e2apMsg == NULLP)
3624 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3628 /* Successful Outcome */
3629 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
3630 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(SuccessfulOutcomeE2_t));
3631 if(e2apMsg->choice.successfulOutcome == NULLP)
3633 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3637 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
3638 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
3639 e2apMsg->choice.successfulOutcome->value.present = \
3640 SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm;
3641 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
3644 if(tmpActionList.numActionModified)
3646 if(tmpActionList.numActionModFailed)
3648 if(tmpActionList.numActionRemoved)
3650 if(tmpActionList.numActionRemovalFailed)
3653 ricSubsModCfm->protocolIEs.list.count = elementCnt;
3654 ricSubsModCfm->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationConfirm_IEs_t *);
3655 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array, ricSubsModCfm->protocolIEs.list.size);
3656 if(!ricSubsModCfm->protocolIEs.list.array)
3658 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3662 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
3664 RIC_ALLOC(ricSubsModCfm->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationConfirm_IEs_t));
3665 if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
3667 DU_LOG("\nERROR --> E2AP : Memory allocation failed for %s at line %d", __func__, __LINE__);
3672 /* RIC Request ID */
3674 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3675 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICrequestID;
3676 ricSubsModCfmIe->criticality = CriticalityE2_reject;
3677 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RICrequestID;
3678 ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3679 ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3681 /* RAN Function ID */
3683 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3684 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3685 ricSubsModCfmIe->criticality = CriticalityE2_reject;
3686 ricSubsModCfmIe->value.present = RICsubscriptionModificationConfirm_IEs__value_PR_RANfunctionID;
3687 ricSubsModCfmIe->value.choice.RANfunctionID = ranFuncId;
3689 /* RIC Actions List confirmed for modification */
3690 if(tmpActionList.numActionModified)
3693 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3694 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List;
3695 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
3696 ricSubsModCfmIe->value.present = \
3697 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForModification_List;
3698 if(fillActionModConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List, \
3699 tmpActionList.numActionModified, tmpActionList.actionModifiedList) != ROK)
3701 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Modification List", __func__);
3706 /* RIC Actions List refured to be modified */
3707 if(tmpActionList.numActionModFailed)
3710 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3711 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List;
3712 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
3713 ricSubsModCfmIe->value.present = \
3714 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeModified_List;
3715 if(fillActionModRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List, \
3716 tmpActionList.numActionModFailed, tmpActionList.actionModFailedList) != ROK)
3718 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Refused to be Modified List", __func__);
3723 /* RIC Actions List confirmed for removal */
3724 if(tmpActionList.numActionRemoved)
3727 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3728 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List;
3729 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
3730 ricSubsModCfmIe->value.present = \
3731 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_ConfirmedForRemoval_List;
3732 if(fillActionRemovalConfirmedList(&ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List, \
3733 tmpActionList.numActionRemoved, tmpActionList.actionRemovedList) != ROK)
3735 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Confirmed for Removal List", __func__);
3740 /* RIC Actions List Refused to be removed */
3741 if(tmpActionList.numActionRemovalFailed)
3744 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
3745 ricSubsModCfmIe->id = ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List;
3746 ricSubsModCfmIe->criticality = CriticalityE2_ignore;
3747 ricSubsModCfmIe->value.present = \
3748 RICsubscriptionModificationConfirm_IEs__value_PR_RICactions_RefusedToBeRemoved_List;
3749 if(fillActionRemovalRefusedList(&ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List, \
3750 tmpActionList.numActionRemovalFailed, tmpActionList.actionRemovalFailedList) != ROK)
3752 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Actions Failed to be Removed List", __func__);
3757 /* Print and encode E2AP Message PDU */
3758 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3759 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3761 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3763 /* Check encode results */
3764 if(encRetVal.encoded == ENCODE_FAIL)
3766 DU_LOG("\nERROR --> E2AP : Could not encode RIC subscription modification confirm (at %s)\n",\
3767 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3772 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription modification confirm\n");
3773 for(int i=0; i< encBufSize; i++)
3775 DU_LOG("%x",encBuf[i]);
3779 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
3781 DU_LOG("\nERROR --> E2AP : Failed to send RIC Subscription Modification Confirm");
3789 FreeRicSubsModConfirm(e2apMsg);
3793 /*******************************************************************
3795 * @brief Processing of RIC Subscription Modification Required
3799 * Function : ProcRicSubsModReqd
3801 * Functionality: Processing of RIC Subscription Modification Required
3802 * As of now, we do not identify any scenario where this message
3803 * shall be sent by DU. Hence, bare minimum handling has been
3807 * RIC Subscription Modification Required IEs
3808 * @return ROK-success
3811 ******************************************************************/
3812 uint8_t ProcRicSubsModReqd(uint32_t duId, RICsubscriptionModificationRequired_t *ricSubsModReqd)
3814 uint8_t ieIdx = 0, actionIdx = 0, duIdx = 0;
3818 RicRequestId ricReqId;
3819 RanFunction *ranFuncDb = NULLP;
3820 RicSubscription *ricSubs = NULLP;
3821 CmLList *ricSubsNode = NULLP;
3822 ActionInfo *action = NULLP;
3823 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
3824 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
3825 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
3826 RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULLP;
3827 RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULLP;
3828 RicTmpActionList tmpActionList;
3830 memset(&ricReqId, 0, sizeof(RicRequestId));
3831 memset(&tmpActionList, 0, sizeof(RicTmpActionList));
3833 SEARCH_DU_DB(duIdx, duId, duDb);
3836 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
3840 for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
3842 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
3843 switch(ricSubsModReqdIe->id)
3845 case ProtocolIE_IDE2_id_RICrequestID:
3847 ricReqId.requestorId = ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID;
3848 ricReqId.instanceId = ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID;
3851 case ProtocolIE_IDE2_id_RANfunctionID:
3853 ranFuncId = ricSubsModReqdIe->value.choice.RANfunctionID;
3854 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, ranFuncId);
3857 /* If RIC Subscription not found, send RIC Subscription modification refuse to DU */
3858 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RIC Subscription not found");
3859 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
3860 CauseE2RICrequest_ran_function_id_invalid);
3864 ricSubs = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
3867 /* If RAN Function not found, send RIC Subscription modification refuse to DU */
3868 DU_LOG("\nERROR --> E2AP : ProcRicSubsModReqd: RAN Function ID [%d] not found",ranFuncId);
3869 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, \
3870 CauseE2_PR_ricRequest, CauseE2RICrequest_request_id_unknown);
3875 case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
3877 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
3878 for(actionIdx = 0; actionIdx < actionToBeModList->list.count; actionIdx++)
3880 actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[actionIdx];
3881 actionId = actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID;
3882 action = fetchActionInfoFromActionId(actionId, ricSubs);
3885 /* No modification required as of now, hence directly adding to the list */
3886 tmpActionList.actionModifiedList[tmpActionList.numActionModified++] = actionId;
3890 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].actionId = actionId;
3891 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].failureType = \
3892 CauseE2_PR_ricRequest;
3893 tmpActionList.actionModFailedList[tmpActionList.numActionModFailed].cause = \
3894 CauseE2RICrequest_action_not_supported;
3895 tmpActionList.numActionModFailed++;
3900 case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
3902 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
3903 for(actionIdx = 0; actionIdx < actionToBeRmvList->list.count; actionIdx++)
3905 actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[actionIdx];
3906 actionId = actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID;
3907 action = fetchActionInfoFromActionId(actionId, ricSubs);
3910 tmpActionList.actionRemovedList[tmpActionList.numActionRemoved++] = actionId;
3911 memset(action, 0, sizeof(ActionInfo));
3912 action->actionId = -1;
3913 ricSubs->numOfActions--;
3923 /* If none of the action modification/removal is supported,
3924 * send RIC Subscription Modification Refuse
3926 * send RIC Subscription Modification Confirm
3928 if(tmpActionList.numActionModified || tmpActionList.numActionRemoved)
3930 BuildAndSendRicSubsModConfirm(duId, ricReqId, ranFuncId, tmpActionList);
3934 BuildAndSendRicSubsModRefuse(duId, ricReqId, ranFuncId, CauseE2_PR_ricRequest, \
3935 CauseE2RICrequest_action_not_supported);
3941 /*******************************************************************
3943 * @brief Free the ErrorIndication Message
3947 * Function : FreeRicIndication
3949 * Functionality: Free the ErrorIndication Message
3954 ******************************************************************/
3955 void FreeErrorIndication(E2AP_PDU_t *e2apMsg)
3958 ErrorIndicationE2_t *errorIndicationMsg= NULLP;
3960 if(e2apMsg != NULLP)
3962 if(e2apMsg->choice.initiatingMessage != NULLP)
3964 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
3965 if(errorIndicationMsg!= NULLP)
3967 if(errorIndicationMsg->protocolIEs.list.array != NULLP)
3969 for(arrIdx=0; arrIdx<errorIndicationMsg->protocolIEs.list.count; arrIdx++)
3971 RIC_FREE(errorIndicationMsg->protocolIEs.list.array[arrIdx],sizeof(ErrorIndicationE2_t));
3973 RIC_FREE(errorIndicationMsg->protocolIEs.list.array,errorIndicationMsg->protocolIEs.list.size);
3976 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
3978 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3983 /*******************************************************************
3985 * @brief Builds and Send the ErrorIndication Message
3989 * Function : BuildAndSendErrorIndication
3991 * Functionality:Fills the ErrorIndication Message
3999 * @return ROK - success
4002 ******************************************************************/
4004 uint8_t BuildAndSendErrorIndication(uint32_t duId, int8_t transId, RicRequestId requestId, uint16_t ranFuncId, uint8_t reason)
4006 uint8_t elementCnt =0, arrIdx=0, ret = RFAILED;
4007 E2AP_PDU_t *e2apMsg = NULLP;
4008 ErrorIndicationE2_t *errorIndicationMsg=NULLP;
4009 asn_enc_rval_t encRetVal; /* Encoder return value */
4013 DU_LOG("\nINFO --> E2AP : Building Error Indication Message\n");
4015 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4016 if(e2apMsg == NULLP)
4018 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4022 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4023 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4024 if(e2apMsg->choice.initiatingMessage == NULLP)
4026 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
4029 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_ErrorIndicationE2;
4030 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4031 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ErrorIndicationE2;
4033 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
4035 /* Element count is 2 for TransactionID/RICrequestID and Cause.
4036 * If the RAN function id is present, the count will be increased.*/
4041 errorIndicationMsg->protocolIEs.list.count = elementCnt;
4042 errorIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(ErrorIndicationE2_IEs_t*);
4044 /* Initialize the E2Setup members */
4045 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array, errorIndicationMsg->protocolIEs.list.size);
4046 if(errorIndicationMsg->protocolIEs.list.array == NULLP)
4048 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements in %s at line %d",__func__, __LINE__);
4051 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
4053 RIC_ALLOC(errorIndicationMsg->protocolIEs.list.array[arrIdx], sizeof(ErrorIndicationE2_IEs_t));
4054 if(errorIndicationMsg->protocolIEs.list.array[arrIdx] == NULLP)
4056 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array Idx %d in %s at line %d",arrIdx,__func__, __LINE__);
4060 if(arrIdx < elementCnt)
4065 if(transId >=0 && transId<=255)
4068 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4069 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4070 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_TransactionID;
4071 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
4076 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RICrequestID;
4077 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4078 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RICrequestID;
4079 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricRequestorID = requestId.requestorId;
4080 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricInstanceID = requestId.instanceId;
4085 /* RAN Function ID */
4087 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionID;
4088 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4089 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RANfunctionID;
4090 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionID = ranFuncId;
4095 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4096 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
4097 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
4098 fillE2FailureCause(&errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, CauseE2_PR_misc, reason);
4101 /* Prints the Msg formed */
4102 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4103 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4105 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4107 if(encRetVal.encoded == ENCODE_FAIL)
4109 DU_LOG("\nERROR --> E2AP : Could not encode Error Indication Message (at %s)\n",\
4110 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4115 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for Error Indication Message \n");
4116 #ifdef DEBUG_ASN_PRINT
4117 for(int i=0; i< encBufSize; i++)
4119 printf("%x",encBuf[i]);
4124 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
4126 DU_LOG("\nINFO --> E2AP : Sending Error Indication Message");
4132 FreeErrorIndication(e2apMsg);
4136 /*******************************************************************
4138 * @brief Deallocate the memory allocated for ResetRequest msg
4142 * Function : FreeResetRequest
4145 * - freeing the memory allocated for ResetRequest
4147 * @params[in] E2AP_PDU_t *e2apMsg
4148 * @return ROK - success
4151 * ****************************************************************/
4152 void FreeResetRequest(E2AP_PDU_t *e2apMsg)
4155 ResetRequestE2_t *resetReq = NULLP;
4157 if(e2apMsg != NULLP)
4159 if(e2apMsg->choice.initiatingMessage != NULLP)
4161 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4162 if(resetReq->protocolIEs.list.array)
4164 for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4166 RIC_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4168 RIC_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4170 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4172 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4176 /*******************************************************************
4178 * @brief Build and send the reset request msg
4182 * Function : BuildAndSendResetRequest
4185 * - Buld and send the reset request msg to E2 node
4191 * @return ROK - success
4194 * ****************************************************************/
4195 uint8_t BuildAndSendResetRequest(DuDb *duDb, CauseE2_PR causePresent, uint8_t reason)
4197 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
4198 uint8_t ret = RFAILED;
4199 E2AP_PDU_t *e2apMsg = NULLP;
4200 ResetRequestE2_t *resetReq = NULLP;
4201 asn_enc_rval_t encRetVal; /* Encoder return value */
4203 DU_LOG("\nINFO --> E2AP : Building Reset Request\n");
4207 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4208 if(e2apMsg == NULLP)
4210 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for E2AP-PDU failed");
4214 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4215 RIC_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4216 if(e2apMsg->choice.initiatingMessage == NULLP)
4218 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation for initiatingMessage");
4222 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
4223 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4224 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
4225 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4228 resetReq->protocolIEs.list.count = elementCnt;
4229 resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
4231 RIC_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4232 if(!resetReq->protocolIEs.list.array)
4234 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4235 Reset Request IE array");
4239 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4241 RIC_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4242 if(!resetReq->protocolIEs.list.array[ieIdx])
4244 DU_LOG("\nERROR --> E2AP : BuildAndSendResetRequest(): Memory allocation failed for \
4245 Reset Request IE array element");
4250 /* In case of failure */
4251 if(ieIdx < elementCnt)
4255 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4256 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
4257 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
4258 transId = assignTransactionId(duDb);
4259 resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
4262 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4263 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
4264 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
4265 fillE2FailureCause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, causePresent, reason);
4267 /* Prints the Msg formed */
4268 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4270 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4272 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4274 if(encRetVal.encoded == ENCODE_FAIL)
4276 DU_LOG("\nERROR --> E2AP : Could not encode reset request structure (at %s)\n",\
4277 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4282 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for reset request\n");
4283 #ifdef DEBUG_ASN_PRINT
4284 for(int i=0; i< encBufSize; i++)
4286 printf("%x",encBuf[i]);
4290 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
4292 DU_LOG("\nERROR --> E2AP : Sending reset request failed");
4301 /* Free all memory */
4302 FreeResetRequest(e2apMsg);
4306 /******************************************************************
4308 * @brief Delete Ric subscription node
4312 * Function : deleteRicSubscriptionNode
4314 * Functionality: Delete Ric subscription node
4316 * @params[in] Ric subscription info
4320 * ****************************************************************/
4321 void deleteRicSubscriptionNode(CmLList *subscriptionNode)
4323 uint8_t actionIdx=0;
4324 RicSubscription *ricSubscriptionInfo = NULLP;
4326 ricSubscriptionInfo = (RicSubscription*)subscriptionNode->node;
4328 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
4330 if(ricSubscriptionInfo->actionSequence[actionIdx].actionId > -1)
4332 memset(&ricSubscriptionInfo->actionSequence[actionIdx], 0, sizeof(ActionInfo));
4335 memset(ricSubscriptionInfo, 0, sizeof(RicSubscription));
4336 RIC_FREE(subscriptionNode->node, sizeof(RicSubscription));
4337 RIC_FREE(subscriptionNode, sizeof(CmLList));
4340 /*******************************************************************
4342 * @brief Delete RIC subscription List
4346 * Function : deleteRicSubscriptionList
4348 * Functionality: Delete RIC subscription list
4350 * @params[in] RIC Subscription list
4354 ******************************************************************/
4355 void deleteRicSubscriptionList(CmLListCp *subscriptionList)
4357 CmLList *subscriptionNode = NULLP;
4359 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
4360 while(subscriptionNode)
4362 cmLListDelFrm(subscriptionList, subscriptionNode);
4363 deleteRicSubscriptionNode(subscriptionNode);
4364 CM_LLIST_FIRST_NODE(subscriptionList, subscriptionNode);
4368 /*******************************************************************
4370 * @brief process the E2 Reset Response
4374 * Function : ProcResetResponse
4376 * Functionality: Process E2 Reset Response
4380 * Pointer to reset response
4383 ******************************************************************/
4385 void ProcResetResponse(uint32_t duId, ResetResponseE2_t *resetRsp)
4387 uint8_t ieIdx = 0, duIdx =0;
4389 RanFunction *ranFuncDb = NULLP;
4390 uint16_t ranFuncIdx = 0;
4392 SEARCH_DU_DB(duIdx, duId, duDb);
4395 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4401 DU_LOG("\nERROR --> E2AP : resetRsp pointer is null");
4405 if(!resetRsp->protocolIEs.list.array)
4407 DU_LOG("\nERROR --> E2AP : resetRsp array pointer is null");
4411 for(ieIdx=0; ieIdx < resetRsp->protocolIEs.list.count; ieIdx++)
4413 if(resetRsp->protocolIEs.list.array[ieIdx])
4415 switch(resetRsp->protocolIEs.list.array[ieIdx]->id)
4417 case ProtocolIE_IDE2_id_TransactionID:
4419 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
4421 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
4422 if(ranFuncDb->id > 0)
4424 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
4429 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4439 /*******************************************************************
4441 * @brief process the E2 Reset Request
4445 * Function : ProcResetRequest
4447 * Functionality: Process E2 Reset Request
4451 * Pointer to reset response
4454 ******************************************************************/
4456 void ProcResetRequest(uint32_t duId, ResetRequestE2_t *resetReq)
4458 uint8_t ieIdx = 0, duIdx =0, transId=0;
4460 RanFunction *ranFuncDb = NULLP;
4461 uint16_t ranFuncIdx = 0;
4463 SEARCH_DU_DB(duIdx, duId, duDb);
4466 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4472 DU_LOG("\nERROR --> E2AP : resetReq pointer is null");
4476 if(!resetReq->protocolIEs.list.array)
4478 DU_LOG("\nERROR --> E2AP : resetReq array pointer is null");
4482 for(ieIdx=0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4484 if(resetReq->protocolIEs.list.array[ieIdx])
4486 switch(resetReq->protocolIEs.list.array[ieIdx]->id)
4488 case ProtocolIE_IDE2_id_TransactionID:
4490 transId = resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
4493 case ProtocolIE_IDE2_id_CauseE2:
4495 for(ranFuncIdx = 0; ranFuncIdx < MAX_RAN_FUNCTION; ranFuncIdx++)
4497 ranFuncDb = &duDb->ranFunction[ranFuncIdx];
4498 if(ranFuncDb->id > 0)
4500 deleteRicSubscriptionList(&ranFuncDb->subscriptionList);
4509 if(BuildAndSendResetResponse(duId, transId) !=ROK)
4511 DU_LOG("\nERROR --> E2AP : Failed to build and send reset response");
4514 /*******************************************************************
4516 * @brief Processing of RIC Subscription Delete Required
4520 * Function : ProcRicSubsDeleteReqd
4522 * Functionality: Processing of RIC Subscription Delete Required
4523 * When received, RIC stub will initiate the RIC subscription
4524 * deletion procedure towards DU
4527 * RIC Subscription Delete Required IEs
4528 * @return ROK-success
4531 ******************************************************************/
4532 uint8_t ProcRicSubsDeleteReqd(uint32_t duId, RICsubscriptionDeleteRequired_t *ricSubsDelRqd)
4534 uint8_t ieIdx = 0, arrIdx = 0, duIdx = 0;
4536 RicRequestId ricReqId;
4537 RanFunction *ranFuncDb = NULLP;
4538 RicSubscription *subsDb = NULLP;
4539 CmLList *ricSubsNode = NULLP;
4540 RICsubscriptionDeleteRequired_IEs_t *ricSubsDelRqdIe = NULLP;
4541 RICsubscription_List_withCause_t *ricSubsList = NULLP;
4542 RICsubscription_withCause_Item_t *subsItem = NULLP;
4544 memset(&ricReqId, 0, sizeof(RicRequestId));
4548 DU_LOG("\nERROR --> E2AP : %s: Received NULL message", __func__);
4552 SEARCH_DU_DB(duIdx, duId, duDb);
4555 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
4559 for(ieIdx = 0; ieIdx < ricSubsDelRqd->protocolIEs.list.count; ieIdx++)
4561 ricSubsDelRqdIe = ricSubsDelRqd->protocolIEs.list.array[ieIdx];
4562 switch(ricSubsDelRqdIe->id)
4564 case ProtocolIE_IDE2_id_RICsubscriptionToBeRemoved:
4566 ricSubsList = &ricSubsDelRqdIe->value.choice.RICsubscription_List_withCause;
4567 for(arrIdx = 0; arrIdx < ricSubsList->list.count; arrIdx++)
4569 subsItem = &(((RICsubscription_withCause_ItemIEs_t *)ricSubsList->list.array[arrIdx])->\
4570 value.choice.RICsubscription_withCause_Item);
4571 ranFuncDb = fetchRanFuncFromRanFuncId(duDb, subsItem->ranFunctionID);
4574 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%ld] not found", __func__, subsItem->ranFunctionID);
4578 ricReqId.requestorId = subsItem->ricRequestID.ricRequestorID;
4579 ricReqId.instanceId = subsItem->ricRequestID.ricInstanceID;
4580 subsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
4583 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%ld] Instance_ID [%ld]", \
4584 __func__, subsItem->ricRequestID.ricRequestorID, subsItem->ricRequestID.ricInstanceID);
4588 /* Delete RIC Subcription from RAN Function */
4589 cmLListDelFrm(&ranFuncDb->subscriptionList, ricSubsNode);
4590 deleteRicSubscriptionNode(ricSubsNode);
4600 //BuildAndSendRicSubsDeleteRequest();
4604 /*******************************************************************
4606 * @brief Handles received E2AP message and sends back response
4610 * Function : E2APMsgHdlr
4613 * - Decodes received E2AP control message
4614 * - Prepares response message, encodes and sends to SCTP
4617 * @return ROK - success
4620 * ****************************************************************/
4621 void E2APMsgHdlr(uint32_t *duId, Buffer *mBuf)
4627 E2AP_PDU_t *e2apMsg;
4628 asn_dec_rval_t rval; /* Decoder return value */
4629 E2AP_PDU_t e2apasnmsg ;
4631 DU_LOG("\nINFO --> E2AP : Received E2AP message buffer");
4632 ODU_PRINT_MSG(mBuf, 0,0);
4634 /* Copy mBuf into char array to decode it */
4635 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
4636 RIC_ALLOC(recvBuf, (Size)recvBufLen);
4638 if(recvBuf == NULLP)
4640 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
4643 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
4645 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
4649 DU_LOG("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
4650 for(i=0; i< recvBufLen; i++)
4652 DU_LOG("%x",recvBuf[i]);
4655 /* Decoding flat buffer into E2AP messsage */
4656 e2apMsg = &e2apasnmsg;
4657 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
4659 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
4660 RIC_FREE(recvBuf, (Size)recvBufLen);
4662 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
4664 DU_LOG("\nERROR --> E2AP : ASN decode failed");
4668 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4670 switch(e2apMsg->present)
4672 case E2AP_PDU_PR_initiatingMessage:
4674 switch(e2apMsg->choice.initiatingMessage->value.present)
4676 case InitiatingMessageE2__value_PR_E2setupRequest:
4678 DU_LOG("\nINFO --> E2AP : E2 setup request received");
4679 ProcE2SetupReq(duId, &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest);
4682 case InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate:
4684 DU_LOG("\nINFO --> E2AP : E2 node config update received");
4685 ProcE2NodeConfigUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate);
4688 case InitiatingMessageE2__value_PR_ResetRequestE2:
4690 DU_LOG("\nINFO --> E2AP : E2 Reset Request received");
4691 ProcResetRequest(*duId, &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2);
4694 case InitiatingMessageE2__value_PR_RICindication:
4696 DU_LOG("\nINFO --> E2AP : RIC Indication received");
4699 case InitiatingMessageE2__value_PR_RICserviceUpdate:
4701 DU_LOG("\nINFO --> E2AP : RIC Service update received");
4702 ProcRicServiceUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate);
4705 case InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired:
4707 DU_LOG("\nINFO --> E2AP : RIC Subscription Modification Required");
4708 ProcRicSubsModReqd(*duId, \
4709 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired);
4712 case InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequired:
4714 DU_LOG("\nINFO --> E2AP : RIC Subscription Delete Required");
4715 ProcRicSubsDeleteReqd(*duId, \
4716 &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionDeleteRequired);
4720 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
4722 DU_LOG("\nINFO --> E2AP : Error indication received");
4727 DU_LOG("\nERROR --> E2AP : Invalid type of intiating message [%d]", \
4728 e2apMsg->choice.initiatingMessage->value.present);
4731 }/* End of switch(initiatingMessage) */
4734 case E2AP_PDU_PR_successfulOutcome:
4736 switch(e2apMsg->choice.successfulOutcome->value.present)
4738 case SuccessfulOutcomeE2__value_PR_ResetResponseE2:
4740 DU_LOG("\nINFO --> E2AP : Reset response received");
4741 ProcResetResponse(*duId, &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2);
4744 case SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse:
4746 ProcRicSubscriptionResponse(*duId, \
4747 &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse);
4752 DU_LOG("\nERROR --> E2AP : Invalid type of successfulOutcome message [%d]", \
4753 e2apMsg->choice.successfulOutcome->value.present);
4760 case E2AP_PDU_PR_unsuccessfulOutcome:
4762 switch(e2apMsg->choice.successfulOutcome->value.present)
4764 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure:
4766 ProcRicSubscriptionFailure(*duId, \
4767 &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure);
4772 DU_LOG("\nERROR --> E2AP : Invalid type of unsuccessfulOutcome message [%d]", \
4773 e2apMsg->choice.unsuccessfulOutcome->value.present);
4781 DU_LOG("\nERROR --> E2AP : Invalid type message type ");
4785 }/* End of switch(e2apMsg->present) */
4786 } /* End of E2APMsgHdlr */
4789 /**********************************************************************
4791 **********************************************************************/