1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
18 #include "common_def.h"
24 #include "du_app_mac_inf.h"
25 #include "du_app_rlc_inf.h"
26 #include "du_e2ap_mgr.h"
27 #include "du_e2ap_msg_hdl.h"
30 #include "du_mgr_main.h"
32 #include "GlobalE2node-gNB-ID.h"
33 #include "ProtocolIE-FieldE2.h"
34 #include "E2setupRequest.h"
35 #include "InitiatingMessageE2.h"
36 #include "SuccessfulOutcomeE2.h"
37 #include "UnsuccessfulOutcomeE2.h"
39 #include "odu_common_codec.h"
40 #include "E2nodeComponentInterfaceF1.h"
41 #include "E2setupRequest.h"
42 #include "du_e2_conversions.h"
43 #include "E2SM-KPM-RANfunction-Description.h"
44 #include "RANfunction-Name.h"
45 #include "RIC-EventTriggerStyle-Item.h"
46 #include "RIC-ReportStyle-Item.h"
47 #include "MeasurementInfo-Action-Item.h"
48 #include "E2SM-KPM-EventTriggerDefinition.h"
49 #include "E2SM-KPM-EventTriggerDefinition-Format1.h"
50 #include "E2SM-KPM-ActionDefinition.h"
51 #include "E2SM-KPM-ActionDefinition-Format1.h"
52 #include "MeasurementInfoItem.h"
53 #include "RANfunctionsIDcause-List.h"
54 #include "MeasurementRecord.h"
55 #include "MeasurementData.h"
56 #include "MeasurementRecordItem.h"
57 #include "MeasurementDataItem.h"
58 #include "E2SM-KPM-IndicationMessage-Format1.h"
59 #include "E2SM-KPM-IndicationMessage.h"
60 #include "E2SM-KPM-IndicationHeader.h"
61 #include "E2SM-KPM-IndicationHeader-Format1.h"
62 #include "LabelInfoItem.h"
64 /*******************************************************************
66 * @brief Fill E2 Failure Cause
70 * Function : fillE2Cause
72 * Functionality: Fill E2 Failure Cause
74 * @params[in] E2 Cause pointer to be filled in
75 * E2 Cause to be filled from
78 ******************************************************************/
79 void fillE2Cause(CauseE2_t *e2Cause, E2FailureCause failureCause)
81 e2Cause->present = failureCause.causeType;
82 switch(e2Cause->present)
84 case CauseE2_PR_ricRequest:
86 e2Cause->choice.ricRequest = failureCause.cause;
89 case CauseE2_PR_ricService:
91 e2Cause->choice.ricService = failureCause.cause;
94 case CauseE2_PR_e2Node:
96 e2Cause->choice.e2Node = failureCause.cause;
99 case CauseE2_PR_transport:
101 e2Cause->choice.transport = failureCause.cause;
104 case CauseE2_PR_protocol:
106 e2Cause->choice.protocol = failureCause.cause;
109 case CauseE2_PR_misc:
111 e2Cause->choice.misc = failureCause.cause;
114 case CauseE2_PR_NOTHING:
120 /*******************************************************************
122 * @brief Printing Type and Cause of failure
126 * Function : printE2ErrorCause
128 * Functionality: Printing Type and Cause of failure
130 * @params[in] E2 Cause
133 ******************************************************************/
134 void printE2ErrorCause(CauseE2_t *cause)
136 switch(cause->present)
138 case CauseE2_PR_ricRequest:
140 DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Request", cause->choice.ricRequest);
143 case CauseE2_PR_ricService:
145 DU_LOG("Failure_Type [%s] Cause [%ld]", "RIC_Service", cause->choice.ricService);
148 case CauseE2_PR_e2Node:
150 DU_LOG("Failure_Type [%s] Cause [%ld]", "E2_Node", cause->choice.e2Node);
153 case CauseE2_PR_transport:
155 DU_LOG("Failure_Type [%s] Cause [%ld]", "Transport", cause->choice.transport);
158 case CauseE2_PR_protocol:
160 DU_LOG("Failure_Type [%s] Cause [%ld]", "Protocol", cause->choice.protocol);
163 case CauseE2_PR_misc:
165 DU_LOG("Failure_Type [%s] Cause [%ld]", "Miscellaneous", cause->choice.misc);
170 DU_LOG("Failure_Type and Cause unknown");
176 /*******************************************************************
178 * @brief Free the ErrorIndication Message
182 * Function : FreeRicIndication
184 * Functionality: Free the ErrorIndication Message
187 * E2AP_PDU is to freed
190 ******************************************************************/
191 void FreeErrorIndication(E2AP_PDU_t *e2apMsg)
194 ErrorIndicationE2_t *errorIndicationMsg= NULLP;
198 if(e2apMsg->choice.initiatingMessage != NULLP)
200 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
201 if(errorIndicationMsg!= NULLP)
203 if(errorIndicationMsg->protocolIEs.list.array != NULLP)
205 for(arrIdx=0; arrIdx<errorIndicationMsg->protocolIEs.list.count; arrIdx++)
207 DU_FREE(errorIndicationMsg->protocolIEs.list.array[arrIdx],sizeof(ErrorIndicationE2_t));
209 DU_FREE(errorIndicationMsg->protocolIEs.list.array,errorIndicationMsg->protocolIEs.list.size);
212 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
214 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
218 /*******************************************************************
220 * @brief Builds and Send the ErrorIndication Message
224 * Function : BuildAndSendErrorIndication
226 * Functionality:Fills the ErrorIndication Message
233 * @return ROK - success
236 ******************************************************************/
238 uint8_t BuildAndSendErrorIndication(int8_t transId, RicRequestId requestId, uint16_t ranFuncId, E2FailureCause failureCause)
240 uint8_t elementCnt =0, arrIdx=0, ret = RFAILED;
241 E2AP_PDU_t *e2apMsg = NULLP;
242 ErrorIndicationE2_t *errorIndicationMsg=NULLP;
243 asn_enc_rval_t encRetVal; /* Encoder return value */
247 DU_LOG("\nINFO --> E2AP : Building Error Indication Message\n");
249 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
252 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
256 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
257 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
258 if(e2apMsg->choice.initiatingMessage == NULLP)
260 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed in %s at line %d",__func__, __LINE__);
263 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_ErrorIndicationE2;
264 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
265 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ErrorIndicationE2;
267 errorIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.ErrorIndicationE2;
269 /* Element count is 2 for TransactionID/RICrequestID and Cause.
270 * If the RAN function id is present, the count will be increased.*/
277 errorIndicationMsg->protocolIEs.list.count = elementCnt;
278 errorIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(ErrorIndicationE2_IEs_t*);
280 /* Initialize the E2Setup members */
281 DU_ALLOC(errorIndicationMsg->protocolIEs.list.array, errorIndicationMsg->protocolIEs.list.size);
282 if(errorIndicationMsg->protocolIEs.list.array == NULLP)
284 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements in %s at line %d",__func__, __LINE__);
288 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
290 DU_ALLOC(errorIndicationMsg->protocolIEs.list.array[arrIdx], sizeof(ErrorIndicationE2_IEs_t));
291 if(errorIndicationMsg->protocolIEs.list.array[arrIdx] == NULLP)
293 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array [%d] elements in %s at line %d", arrIdx, __func__, __LINE__);
297 if(arrIdx < elementCnt)
302 if(transId >=0 && transId<=255)
305 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
306 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
307 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_TransactionID;
308 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
313 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RICrequestID;
314 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
315 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RICrequestID;
316 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricRequestorID = requestId.requestorId;
317 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RICrequestID.ricInstanceID = requestId.instanceId;
322 /* RAN Function ID */
324 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionID;
325 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
326 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_RANfunctionID;
327 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionID = ranFuncId;
332 errorIndicationMsg->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
333 errorIndicationMsg->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
334 errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.present = ErrorIndicationE2_IEs__value_PR_CauseE2;
335 fillE2Cause(&errorIndicationMsg->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, failureCause);
337 /* Prints the Msg formed */
338 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
339 memset(encBuf, 0, ENC_BUF_MAX_LEN);
341 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
343 if(encRetVal.encoded == ENCODE_FAIL)
345 DU_LOG("\nERROR --> E2AP : Could not encode Error Indication Message (at %s)\n",\
346 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
351 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for Error Indication Message \n");
352 #ifdef DEBUG_ASN_PRINT
353 for(int i=0; i< encBufSize; i++)
355 printf("%x",encBuf[i]);
360 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
362 DU_LOG("\nINFO --> E2AP : Sending Error Indication Message");
368 FreeErrorIndication(e2apMsg);
372 /******************************************************************
374 * @brief Deallocation of memory allocated by aper decoder for e2
375 * Config Update Failure
379 * Function : freeAperDecodingOfE2Node Config UpdateFailure
381 * Functionality: Deallocation of memory allocated by aper decoder
382 * for e2 Config Update Failure
384 * @params[in] E2nodeConfigurationUpdateFailure_t to be deallocated
387 * ****************************************************************/
389 void freeAperDecodingOfE2NodeConfigUpdateFailure(E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail)
395 if(e2NodeCfgUpdFail->protocolIEs.list.array)
397 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
399 if(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx])
401 free(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]);
404 free(e2NodeCfgUpdFail->protocolIEs.list.array);
409 /******************************************************************
411 * @brief Processes E2 Node Config Update Failure sent by RIC
415 * Function : procE2NodeConfigUpdateFailure
417 * Functionality: Processes E2 Node Config Update failure sent by RIC
419 * @params[in] E2AP_PDU_t ASN decoded E2AP message
420 * @return ROK - success
423 * ****************************************************************/
425 void procE2NodeConfigUpdateFailure(E2AP_PDU_t *e2apMsg)
427 uint8_t arrIdx =0, transId =0, timerValue=0;
428 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail=NULL;
430 DU_LOG("\nINFO --> E2AP : E2 Node Config Update failure received");
431 e2NodeCfgUpdFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
433 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
435 switch(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]->id)
437 case ProtocolIE_IDE2_id_TransactionID:
439 transId = e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
440 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
441 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
443 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
447 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
451 case ProtocolIE_IDE2_id_TimeToWaitE2:
453 timerValue = convertE2WaitTimerEnumToValue(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
454 if((duChkTmr((PTR)&(duCb.e2apDb), EVENT_E2_NODE_CONFIG_UPDATE_TMR)) == FALSE)
456 duStartTmr((PTR)&(duCb.e2apDb), EVENT_E2_NODE_CONFIG_UPDATE_TMR, timerValue);
460 DU_LOG("\nERROR --> E2AP : EVENT_E2_NODE_CONFIG_UPDATE_TMR timer is already running");
467 freeAperDecodingOfE2NodeConfigUpdateFailure(e2NodeCfgUpdFail);
470 /*******************************************************************
472 * @brief Builds Global gNodeB Params
476 * Function : BuildGlobalgNBId
478 * Functionality: Building the Plmn and gNB id
480 * @params[in] GlobalE2node_gNB_ID_t *gNbId
481 * @return ROK - success
484 ******************************************************************/
486 uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId)
489 uint8_t byteSize = 4;
490 uint8_t gnbId = duCb.gnbId;
493 /* fill Global gNB ID Id */
494 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(uint8_t);
495 gNbId->global_gNB_ID.plmn_id.buf = NULLP;
496 DU_ALLOC(gNbId->global_gNB_ID.plmn_id.buf , gNbId->global_gNB_ID.plmn_id.size);
497 if(gNbId->global_gNB_ID.plmn_id.buf == NULLP)
499 DU_LOG("\nERROR --> E2AP: Memory allocation failed for Plmn buffer");
504 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
505 gNbId->global_gNB_ID.plmn_id.buf);
506 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
507 /* Allocate Buffer size */
508 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size = byteSize * sizeof(uint8_t);
509 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf = NULLP;
510 DU_ALLOC(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf, \
511 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
512 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf == NULLP)
514 DU_LOG("\nERROR --> E2AP: Memory allocation failed for gnb buffer");
519 fillBitString(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, gnbId);
524 DU_ALLOC( gNbId->gNB_DU_ID, sizeof(GNB_DU_ID_t));
525 if(gNbId->gNB_DU_ID == NULLP)
527 DU_LOG("\nERROR --> E2AP: Memory allocation failed for gNB_DU_ID ");
532 gNbId->gNB_DU_ID->size = sizeof(uint8_t);
533 DU_ALLOC( gNbId->gNB_DU_ID->buf, sizeof(uint8_t));
534 if(gNbId->gNB_DU_ID->buf)
536 gNbId->gNB_DU_ID->buf[0] =duCb.e2apDb.e2NodeId;
540 DU_LOG("\nERROR --> E2AP: Memory allocation failed for gNB_DU_ID buffer");
548 /*******************************************************************
550 * @brief fill the E2 node config information
554 * Function : fillE2NodeConfig
556 * Functionality: fill E2 node config information
559 * Pointer to e2NodeCfg to be filled
560 * E2 Node Component information
561 * Type of configuration
562 * @return ROK - success
565 ******************************************************************/
567 uint8_t fillE2NodeConfig(PTR e2NodeCfg, E2NodeComponent *e2NodeComponentInfo, ConfigType configType)
569 E2nodeComponentInterfaceType_t *interfaceType=NULLP;
570 E2nodeComponentID_t *componentID =NULLP;
571 E2nodeComponentConfiguration_t *configuration=NULLP;
572 E2nodeComponentConfigAddition_Item_t *e2NodeAddItem=NULL;
573 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULL;
574 E2nodeComponentConfigRemoval_Item_t *e2NodeRemovalItem=NULL;
580 e2NodeAddItem = (E2nodeComponentConfigAddition_Item_t*)e2NodeCfg;
581 interfaceType = &e2NodeAddItem->e2nodeComponentInterfaceType;
582 componentID = &e2NodeAddItem->e2nodeComponentID;
583 configuration = &e2NodeAddItem->e2nodeComponentConfiguration;
588 e2NodeUpdateItem = (E2nodeComponentConfigUpdate_Item_t *) e2NodeCfg;
589 interfaceType = &e2NodeUpdateItem->e2nodeComponentInterfaceType;
590 componentID = &e2NodeUpdateItem->e2nodeComponentID;
591 configuration = &e2NodeUpdateItem->e2nodeComponentConfiguration;
596 e2NodeRemovalItem = (E2nodeComponentConfigRemoval_Item_t*) e2NodeCfg;
597 interfaceType = &e2NodeRemovalItem->e2nodeComponentInterfaceType;
598 componentID = &e2NodeRemovalItem->e2nodeComponentID;
603 DU_LOG("\nERROR --> E2AP : Configuration type %d does not supported ", configType);
607 /* E2nodeComponentInterfaceType */
608 *interfaceType = convertInterfaceToE2ComponentInterfaceType(e2NodeComponentInfo->interfaceType);
610 /* We now only support the F1 interface out of these interfaces
611 * (NG,XN,E1,F1,W1,S1,X2), therefore only the F1 component identifier was filled in. */
613 if(*interfaceType == F1)
615 /* E2 Node Component ID */
616 componentID->present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1;
617 DU_ALLOC(componentID->choice.e2nodeComponentInterfaceTypeF1,sizeof(E2nodeComponentInterfaceF1_t));
618 if(componentID->choice.e2nodeComponentInterfaceTypeF1 == NULLP)
620 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
623 componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t);
624 DU_ALLOC(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\
625 componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
627 if(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP)
629 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
632 memcpy(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, &e2NodeComponentInfo->componentId,\
633 componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
636 if(configType == CONFIG_DEL)
638 /* We don't need to fill out the E2 Node Component Request and Response
639 * information in the case of CONFIG_DEL, therefore returning ROK from here. */
643 /* E2 Node Component Request Part */
644 if(e2NodeComponentInfo->componentRequestPart)
646 configuration->e2nodeComponentRequestPart.size = e2NodeComponentInfo->reqBufSize ;
647 DU_ALLOC(configuration->e2nodeComponentRequestPart.buf,\
648 configuration->e2nodeComponentRequestPart.size);
649 if(configuration->e2nodeComponentRequestPart.buf == NULLP)
651 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
655 memcpy(configuration->e2nodeComponentRequestPart.buf,\
656 e2NodeComponentInfo->componentRequestPart, configuration->\
657 e2nodeComponentRequestPart.size);
661 DU_LOG("\nERROR --> E2AP: componentRequestPart is null ");
665 /* E2 Node Component Response Part */
666 if(e2NodeComponentInfo->componentResponsePart)
668 configuration->e2nodeComponentResponsePart.size = e2NodeComponentInfo->rspBufSize;
669 DU_ALLOC(configuration->e2nodeComponentResponsePart.buf, configuration->e2nodeComponentResponsePart.size);
670 if(configuration->e2nodeComponentResponsePart.buf == NULLP)
672 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at line %d",__func__,__LINE__);
675 memcpy(configuration->e2nodeComponentResponsePart.buf, e2NodeComponentInfo->componentResponsePart, configuration->\
676 e2nodeComponentResponsePart.size);
680 DU_LOG("\nERROR --> E2AP: componentResponsePart is null");
687 /*******************************************************************
689 * @brief Builds E2 node config addition list
693 * Function : BuildE2NodeConfigAddList
695 * Functionality: Building E2 node config addition list
698 * E2nodeComponentConfigAddition_List_t to be filled
700 * Count of E2 node to be added in the list
701 * Received list of E2 node configuration
703 * @return ROK - success
706 ******************************************************************/
708 uint8_t BuildE2NodeConfigAddList(E2nodeComponentConfigAddition_List_t *e2NodeAddList, uint8_t procedureCode, uint16_t count, E2NodeConfigItem *e2NodeList)
712 E2NodeComponent *e2NodeComponentInfo=NULL;
713 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItemIe=NULL;
714 E2nodeComponentConfigAddition_Item_t *e2NodeAddItem=NULL;
717 /* For ProcedureCodeE2_id_E2setup, the number of E2 node configuration list items is
718 * equal to the number of E2 node configuration entries stored in the database.
719 * For any other procedure, the E2 node configuration list count is equal
720 * to the count of E2 node configuration obtained from the function's caller */
722 if(procedureCode == ProcedureCodeE2_id_E2setup)
723 e2NodeAddList->list.count = duCb.e2apDb.e2NodeComponentList.count;
725 e2NodeAddList->list.count = count;
727 e2NodeAddList->list.size = e2NodeAddList->list.count * sizeof(E2nodeComponentConfigAddition_ItemIEs_t *);
728 DU_ALLOC(e2NodeAddList->list.array, e2NodeAddList->list.size);
729 if(e2NodeAddList->list.array == NULLP)
731 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__);
735 for(arrIdx = 0; arrIdx< e2NodeAddList->list.count; arrIdx++)
737 DU_ALLOC(e2NodeAddList->list.array[arrIdx], sizeof(E2nodeComponentConfigAddition_ItemIEs_t));
738 if(e2NodeAddList->list.array[arrIdx] == NULLP)
740 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigAddList %d",__LINE__);
744 if(procedureCode == ProcedureCodeE2_id_E2setup)
746 /* Getting all of the E2 node configuration's information from DuCb one by one*/
749 CM_LLIST_FIRST_NODE(&duCb.e2apDb.e2NodeComponentList, node);
757 DU_LOG("\nERROR --> E2AP : E2 node component list node is null");
760 e2NodeComponentInfo = (E2NodeComponent*)node->node;
764 /* Getting only those E2 node configuration from DuCb whose interface
765 * and action type is present in the received array */
766 e2NodeComponentInfo = fetchE2NodeComponentInfo(e2NodeList[arrIdx].interface, e2NodeList[arrIdx].actionType, &node);
769 if(!e2NodeComponentInfo)
771 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
775 e2NodeAddItemIe = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[arrIdx];
776 e2NodeAddItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition_Item;
777 e2NodeAddItemIe->criticality = CriticalityE2_reject;
778 e2NodeAddItemIe->value.present = E2nodeComponentConfigAddition_ItemIEs__value_PR_E2nodeComponentConfigAddition_Item;
779 e2NodeAddItem = &e2NodeAddItemIe->value.choice.E2nodeComponentConfigAddition_Item;
780 if(fillE2NodeConfig((PTR)e2NodeAddItem, e2NodeComponentInfo, CONFIG_ADD) != ROK)
782 DU_LOG("\nERROR --> E2AP : Failed to fill the E2 node configuration");
789 /*******************************************************************
791 * @brief Builds E2 node config update list
795 * Function : BuildE2NodeConfigUpdateList
797 * Functionality: Building E2 node config update list
800 * E2nodeComponentConfigUpdate_List_t to be filled
801 * Count of E2 node to be update in the list
802 * Received list of E2 node configuration
804 * @return ROK - success
807 ******************************************************************/
809 uint8_t BuildE2NodeConfigUpdateList(E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList, uint16_t count, E2NodeConfigItem *updateE2Node)
813 E2NodeComponent *e2NodeComponentInfo =NULL;
814 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe =NULL;
815 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULL;
817 e2NodeUpdateList->list.count = count;
818 e2NodeUpdateList->list.size = e2NodeUpdateList->list.count * sizeof(E2nodeComponentConfigUpdate_ItemIEs_t *);
819 DU_ALLOC(e2NodeUpdateList->list.array, e2NodeUpdateList->list.size);
820 if(e2NodeUpdateList->list.array == NULLP)
822 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigUpdateList %d",__LINE__);
826 for(arrIdx = 0; arrIdx< e2NodeUpdateList->list.count; arrIdx++)
828 DU_ALLOC(e2NodeUpdateList->list.array[arrIdx], sizeof(E2nodeComponentConfigUpdate_ItemIEs_t));
829 if(e2NodeUpdateList->list.array[arrIdx] == NULLP)
831 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigUpdateList %d",__LINE__);
835 e2NodeComponentInfo= fetchE2NodeComponentInfo(updateE2Node[arrIdx].interface, updateE2Node[arrIdx].actionType, &node);
836 if(!e2NodeComponentInfo)
838 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
842 e2NodeUpdateItemIe = (E2nodeComponentConfigUpdate_ItemIEs_t *) e2NodeUpdateList->list.array[arrIdx];
843 e2NodeUpdateItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate_Item;
844 e2NodeUpdateItemIe->criticality = CriticalityE2_reject;
845 e2NodeUpdateItemIe->value.present = E2nodeComponentConfigUpdate_ItemIEs__value_PR_E2nodeComponentConfigUpdate_Item;
846 e2NodeUpdateItem = &e2NodeUpdateItemIe->value.choice.E2nodeComponentConfigUpdate_Item;
848 if(fillE2NodeConfig((PTR)e2NodeUpdateItem, e2NodeComponentInfo, CONFIG_MOD) != ROK)
850 DU_LOG("\nERROR --> E2AP : Failed to fill the E2 node configuration");
860 /*******************************************************************
862 * @brief Builds E2 node config remove list
866 * Function :BuildE2NodeConfigRemoveList
868 * Functionality: Building E2 node config remove list
871 * E2nodeComponentConfigRemoval_List_t to be filled
872 * Count of E2 node to be remove in the list
873 * Received list of E2 node configuration
874 * @return ROK - success
877 ******************************************************************/
879 uint8_t BuildE2NodeConfigRemoveList(E2nodeComponentConfigRemoval_List_t *e2NodeRemoveList, uint16_t count, E2NodeConfigItem *updateE2Node)
883 E2NodeComponent *e2NodeComponentInfo=NULL;
884 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItemIe=NULL;
885 E2nodeComponentConfigRemoval_Item_t *e2NodeRemovalItem=NULL;
887 e2NodeRemoveList->list.count = count;
888 e2NodeRemoveList->list.size = e2NodeRemoveList->list.count * sizeof(E2nodeComponentConfigRemoval_ItemIEs_t *);
889 DU_ALLOC(e2NodeRemoveList->list.array, e2NodeRemoveList->list.size);
890 if(e2NodeRemoveList->list.array == NULLP)
892 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigRemoveList %d",__LINE__);
896 for(arrIdx = 0; arrIdx< e2NodeRemoveList->list.count; arrIdx++)
898 DU_ALLOC(e2NodeRemoveList->list.array[arrIdx], sizeof(E2nodeComponentConfigRemoval_ItemIEs_t));
899 if(e2NodeRemoveList->list.array[arrIdx] == NULLP)
901 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2NodeConfigRemoveList %d",__LINE__);
905 e2NodeComponentInfo= fetchE2NodeComponentInfo(updateE2Node[arrIdx].interface, updateE2Node[arrIdx].actionType, &node);
906 if(!e2NodeComponentInfo)
908 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
912 e2NodeRemovalItemIe = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemoveList->list.array[arrIdx];
913 e2NodeRemovalItemIe->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval_Item;
914 e2NodeRemovalItemIe->criticality = CriticalityE2_reject;
915 e2NodeRemovalItemIe->value.present = E2nodeComponentConfigRemoval_ItemIEs__value_PR_E2nodeComponentConfigRemoval_Item;
916 e2NodeRemovalItem = &e2NodeRemovalItemIe->value.choice.E2nodeComponentConfigRemoval_Item;
918 if(fillE2NodeConfig((PTR)e2NodeRemovalItem, e2NodeComponentInfo, CONFIG_DEL) != ROK)
920 DU_LOG("\nERROR --> E2AP : Failed to fill the E2 node configuration");
927 /*******************************************************************
929 * @brief deallocation of E2SM_KPM_RANfunction_Description_t
933 * Function : freeE2smKpmRanFunctionDefinition
935 * Functionality: deallocation of E2SM_KPM_RANfunction_Description_t
937 * @params[in] E2SM_KPM_RANfunction_Description_t *ranFunctionDefinition
940 ******************************************************************/
942 void freeE2smKpmRanFunctionDefinition(E2SM_KPM_RANfunction_Description_t *ranFunctionDefinition)
944 MeasurementInfo_Action_Item_t *measInfoList;
945 uint8_t eventTriggerIdx, reportStyleIdx, measInfoIdx;
946 RANfunction_Name_t *ranFuncName;
947 struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List *ricReportStyle;
948 struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List *eventTriggerStyle;
949 if(ranFunctionDefinition)
951 ranFuncName = &ranFunctionDefinition->ranFunction_Name;
952 /* Free RAN function Name */
953 DU_FREE(ranFuncName->ranFunction_ShortName.buf, ranFuncName->ranFunction_ShortName.size);
954 DU_FREE(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncName->ranFunction_E2SM_OID.size);
955 DU_FREE(ranFuncName->ranFunction_Description.buf, ranFuncName->ranFunction_Description.size);
957 /* Sequence of Event Trigger styles */
958 eventTriggerStyle = ranFunctionDefinition->ric_EventTriggerStyle_List;
959 if(eventTriggerStyle)
961 if(eventTriggerStyle->list.array)
963 for(eventTriggerIdx =0;eventTriggerIdx<eventTriggerStyle->list.count; eventTriggerIdx++)
965 if(eventTriggerStyle->list.array[eventTriggerIdx])
967 DU_FREE(eventTriggerStyle->list.array[eventTriggerIdx]->ric_EventTriggerStyle_Name.buf,\
968 eventTriggerStyle->list.array[eventTriggerIdx]->ric_EventTriggerStyle_Name.size);
969 DU_FREE(eventTriggerStyle->list.array[eventTriggerIdx], sizeof(RIC_EventTriggerStyle_Item_t ));
972 DU_FREE(eventTriggerStyle->list.array, eventTriggerStyle->list.size)
974 DU_FREE(eventTriggerStyle, sizeof(struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List));
977 /* Sequence of Report styles */
978 ricReportStyle = ranFunctionDefinition->ric_ReportStyle_List;
981 if(ricReportStyle->list.array)
983 for(reportStyleIdx =0;reportStyleIdx<ricReportStyle->list.count; reportStyleIdx++)
985 if(ricReportStyle->list.array[reportStyleIdx])
987 if(ricReportStyle->list.array[reportStyleIdx]->ric_ReportStyle_Name.buf)
989 DU_FREE(ricReportStyle->list.array[reportStyleIdx]->ric_ReportStyle_Name.buf,\
990 ricReportStyle->list.array[reportStyleIdx]->ric_ReportStyle_Name.size);
992 if(ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.array)
994 for(measInfoIdx=0; measInfoIdx<ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.count; \
997 measInfoList = ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.array[measInfoIdx];
1000 DU_FREE(measInfoList->measID, sizeof(long));
1001 DU_FREE(measInfoList->measName.buf, measInfoList->measName.size);
1002 DU_FREE(measInfoList,sizeof(MeasurementInfo_Action_Item_t));
1005 DU_FREE(measInfoList,ricReportStyle->list.array[reportStyleIdx]->measInfo_Action_List.list.size);
1007 DU_FREE(ricReportStyle->list.array[reportStyleIdx], sizeof(RIC_ReportStyle_Item_t));
1010 DU_FREE(ricReportStyle->list.array, ricReportStyle->list.size);
1012 DU_FREE(ricReportStyle, sizeof(struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List));
1014 DU_FREE(ranFunctionDefinition, sizeof(E2SM_KPM_RANfunction_Description_t));
1018 /*******************************************************************
1020 * @brief fill the e2sm ric report style
1024 * Function : fillRicReportStyle
1026 * Functionality: fill the report style
1028 * @params[in] RanFunction *ranFuncDb, struct
1029 * E2SM_KPM_RANfunction_Description__ric_ReportStyle_List *ricReportStyle
1030 * @return ROK - success
1033 ******************************************************************/
1034 uint8_t fillRicReportStyle(RanFunction *ranFuncDb, struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List *ricReportStyle)
1036 uint8_t styleIdx, measInfoIdx;
1037 MeasurementInfo_Action_List_t *measInfo;
1040 ricReportStyle->list.count = ranFuncDb->numOfReportStyleSupported;
1041 ricReportStyle->list.size = ricReportStyle->list.count * sizeof(RIC_ReportStyle_Item_t*);
1042 DU_ALLOC(ricReportStyle->list.array, ricReportStyle->list.size);
1043 if(!ricReportStyle->list.array)
1045 DU_LOG("\nERROR --> E2AP: Memory allocation failed for ranFuncDefinition %d",__LINE__);
1049 for(styleIdx =0;styleIdx<ricReportStyle->list.count; styleIdx++)
1051 DU_ALLOC(ricReportStyle->list.array[styleIdx], sizeof(RIC_ReportStyle_Item_t));
1052 if(!ricReportStyle->list.array[styleIdx])
1054 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1058 /* RIC Report Style Type */
1059 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Type = ranFuncDb->reportStyleList[styleIdx].reportStyle.styleType;
1061 /* RIC Report Style Format Type */
1062 ricReportStyle->list.array[styleIdx]->ric_ActionFormat_Type = ranFuncDb->reportStyleList[styleIdx].reportStyle.formatType;
1064 /* RIC Report Style Name */
1065 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.size = strlen(ranFuncDb->reportStyleList[styleIdx].reportStyle.name);
1066 DU_ALLOC(ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.buf,\
1067 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.size);
1068 if(!ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.buf)
1070 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1073 memcpy(ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.buf, ranFuncDb->reportStyleList[styleIdx].reportStyle.name,\
1074 ricReportStyle->list.array[styleIdx]->ric_ReportStyle_Name.size);
1076 /* RIC Indication Header Format Type*/
1077 ricReportStyle->list.array[styleIdx]->ric_IndicationHeaderFormat_Type = ranFuncDb->ricIndicationHeaderFormat;
1079 /* RIC Indication Message Format Type*/
1080 ricReportStyle->list.array[styleIdx]->ric_IndicationMessageFormat_Type = ranFuncDb->ricIndicationMessageFormat;
1082 /* Measurement Info Action List */
1083 CmLListCp measInfoList =ranFuncDb->reportStyleList[styleIdx].measurementInfoList;
1084 if(!measInfoList.count)
1089 CM_LLIST_FIRST_NODE(&ranFuncDb->reportStyleList[styleIdx].measurementInfoList, node);
1090 measInfo = &ricReportStyle->list.array[styleIdx]->measInfo_Action_List;
1092 measInfo->list.count = measInfoList.count;
1093 measInfo->list.size = measInfoList.count*sizeof(MeasurementInfo_Action_Item_t*);
1094 DU_ALLOC(measInfo->list.array, measInfo->list.size);
1095 if(!measInfo->list.array)
1097 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1101 for(measInfoIdx=0; measInfoIdx<measInfo->list.count; measInfoIdx++)
1105 DU_LOG("\nERROR --> E2AP: Measurement info node is null");
1109 DU_ALLOC(measInfo->list.array[measInfoIdx],sizeof(MeasurementInfo_Action_Item_t));
1110 if(!measInfo->list.array[measInfoIdx])
1112 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1115 MeasurementInfoForAction *measInfoForAction= (MeasurementInfoForAction*)node->node;
1116 DU_ALLOC(measInfo->list.array[measInfoIdx]->measID, sizeof(long));
1117 if(!measInfo->list.array[measInfoIdx]->measID)
1119 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1123 memcpy(measInfo->list.array[measInfoIdx]->measID, &measInfoForAction->measurementTypeId,sizeof(long));
1124 measInfo->list.array[measInfoIdx]->measName.size= strlen(measInfoForAction->measurementTypeName);
1125 DU_ALLOC(measInfo->list.array[measInfoIdx]->measName.buf, measInfo->list.array[measInfoIdx]->measName.size);
1126 if(!measInfo->list.array[measInfoIdx]->measName.size)
1128 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1132 memcpy(measInfo->list.array[measInfoIdx]->measName.buf, \
1133 measInfoForAction->measurementTypeName,\
1134 measInfo->list.array[measInfoIdx]->measName.size);
1141 /*******************************************************************
1143 * @brief fill the ric event trigger style
1147 * Function : fillRicEventTriggerStyle
1149 * Functionality: fill the ric event trigger style
1152 * @return ROK - success
1155 ******************************************************************/
1156 uint8_t fillRicEventTriggerStyle(RanFunction *ranFuncDb, struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List *ricEventTriggerStyle)
1160 ricEventTriggerStyle->list.count = ranFuncDb->numOfEventTriggerStyleSupported;
1161 ricEventTriggerStyle->list.size = ricEventTriggerStyle->list.count* sizeof(RIC_EventTriggerStyle_Item_t *);
1162 DU_ALLOC(ricEventTriggerStyle->list.array, ricEventTriggerStyle->list.size);
1163 if(!ricEventTriggerStyle->list.array)
1165 DU_LOG("\nERROR --> E2AP: Memory allocation failed for ric_EventTriggerStyle_List %d",__LINE__);
1169 for(styleIdx =0;styleIdx<ricEventTriggerStyle->list.count; styleIdx++)
1171 DU_ALLOC(ricEventTriggerStyle->list.array[styleIdx], sizeof(RIC_EventTriggerStyle_Item_t ));
1172 if(!ricEventTriggerStyle->list.array[styleIdx])
1174 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1177 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Type = ranFuncDb->eventTriggerStyleList[styleIdx].styleType;
1179 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerFormat_Type = ranFuncDb->eventTriggerStyleList[styleIdx].formatType;
1181 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.size = strlen(ranFuncDb->eventTriggerStyleList[styleIdx].name);
1182 DU_ALLOC(ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.buf,\
1183 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.size);
1184 if(!ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.buf)
1186 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1189 memcpy(ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.buf,ranFuncDb->eventTriggerStyleList[styleIdx].name,\
1190 ricEventTriggerStyle->list.array[styleIdx]->ric_EventTriggerStyle_Name.size);
1196 /*******************************************************************
1198 * @brief Builds Ran function item
1202 * Function : BuildRanFunctionItem
1204 * Functionality: Building RAN function item
1207 * RAN function item that has to be filled
1208 * Stored RAN Function information
1209 * @return ROK - success
1212 ******************************************************************/
1214 uint8_t BuildRanFunctionItem(RANfunction_Item_t *ranFuncItem, RanFunction *ranFuncDb)
1216 uint8_t ret =RFAILED;
1217 RANfunctionDefinition_t *ranFunctionDefinition;
1218 RANfunction_Name_t *ranFuncName;
1219 asn_enc_rval_t encRetVal;
1220 E2SM_KPM_RANfunction_Description_t *ranFuncDefinition;
1224 /* RAN function Id*/
1225 ranFuncItem->ranFunctionID = ranFuncDb->id;
1227 /* RAN Function Revision*/
1228 ranFuncItem->ranFunctionRevision = ranFuncDb->revisionCounter;
1230 /* RAN function OID*/
1231 ranFuncItem->ranFunctionOID.size = strlen(ranFuncDb->name.serviceModelOID);
1232 DU_ALLOC(ranFuncItem->ranFunctionOID.buf, ranFuncItem->ranFunctionOID.size);
1233 if(!ranFuncItem->ranFunctionOID.buf)
1235 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1238 memcpy(ranFuncItem->ranFunctionOID.buf, ranFuncDb->name.serviceModelOID, ranFuncItem->ranFunctionOID.size);
1240 /* RAN function Definition */
1241 DU_ALLOC(ranFuncDefinition, sizeof(E2SM_KPM_RANfunction_Description_t));
1242 if(!ranFuncDefinition)
1244 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1248 /* RAN function Name */
1249 ranFuncName = &ranFuncDefinition->ranFunction_Name;
1251 /* RAN function ShortName */
1252 ranFuncName->ranFunction_ShortName.size = strlen(ranFuncDb->name.shortName);
1253 DU_ALLOC(ranFuncName->ranFunction_ShortName.buf, ranFuncName->ranFunction_ShortName.size);
1254 if(!ranFuncName->ranFunction_ShortName.buf)
1256 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1259 memcpy(ranFuncName->ranFunction_ShortName.buf, ranFuncDb->name.shortName, strlen(ranFuncDb->name.shortName));
1261 /* RAN function E2SM_OID */
1262 ranFuncName->ranFunction_E2SM_OID.size = strlen(ranFuncDb->name.serviceModelOID);
1263 DU_ALLOC(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncName->ranFunction_E2SM_OID.size);
1264 if(!ranFuncName->ranFunction_E2SM_OID.buf)
1266 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1269 memcpy(ranFuncName->ranFunction_E2SM_OID.buf, ranFuncDb->name.serviceModelOID, ranFuncName->ranFunction_E2SM_OID.size);
1271 /* RAN Function Name Description */
1272 ranFuncName->ranFunction_Description.size = strlen(ranFuncDb->name.description);
1273 DU_ALLOC(ranFuncName->ranFunction_Description.buf, ranFuncName->ranFunction_Description.size);
1274 if(!ranFuncName->ranFunction_Description.buf)
1276 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1279 memcpy(ranFuncName->ranFunction_Description.buf, ranFuncDb->name.description, ranFuncName->ranFunction_Description.size);
1281 /* RIC Event Trigger Style List */
1282 DU_ALLOC(ranFuncDefinition->ric_EventTriggerStyle_List, sizeof(struct E2SM_KPM_RANfunction_Description__ric_EventTriggerStyle_List));
1283 if(!ranFuncDefinition->ric_EventTriggerStyle_List)
1285 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1289 if(fillRicEventTriggerStyle(ranFuncDb, ranFuncDefinition->ric_EventTriggerStyle_List)!=ROK)
1291 DU_LOG("\nERROR --> E2AP: failed to fill ric event trigger style");
1295 /* RIC Report Style List */
1296 DU_ALLOC(ranFuncDefinition->ric_ReportStyle_List, sizeof(struct E2SM_KPM_RANfunction_Description__ric_ReportStyle_List));
1297 if(!ranFuncDefinition->ric_ReportStyle_List)
1299 DU_LOG("\nERROR --> E2AP: Memory allocation failed in function %s at %d",__func__,__LINE__);
1302 if(fillRicReportStyle(ranFuncDb, ranFuncDefinition->ric_ReportStyle_List) != ROK)
1304 DU_LOG("\nERROR --> E2AP: failed to fill ric report style");
1308 /* Encode the F1SetupRequest type as APER */
1309 xer_fprint(stdout, &asn_DEF_E2SM_KPM_RANfunction_Description, ranFuncDefinition);
1311 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1313 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_RANfunction_Description, 0, ranFuncDefinition, PrepFinalEncBuf, encBuf);
1315 /* Encode results */
1316 if(encRetVal.encoded == ENCODE_FAIL)
1318 DU_LOG("\nERROR --> F1AP : Could not encode RAN function definition (at %s)\n",\
1319 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1324 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RAN function definition \n");
1325 for(uint8_t measIeIdx=0; measIeIdx< encBufSize; measIeIdx++)
1327 printf("%x",encBuf[measIeIdx]);
1329 ranFunctionDefinition = &ranFuncItem->ranFunctionDefinition;
1330 ranFunctionDefinition->size = encBufSize;
1331 DU_ALLOC(ranFunctionDefinition->buf, encBufSize);
1332 if(ranFunctionDefinition->buf == NULLP)
1334 DU_LOG("\nERROR --> F1AP : Memory allocation failed for RAN function definition buffer");
1337 memcpy(ranFunctionDefinition->buf, &encBuf, encBufSize);
1342 freeE2smKpmRanFunctionDefinition(ranFuncDefinition);
1346 /*******************************************************************
1348 * @brief Builds Ran function add list based on the procedure code
1352 * Function : BuildRanFunctionAddList
1354 * Functionality: Building RAN addition addition list
1355 * In case of ProcedureCodeE2_id_E2setup we add all the RAN Function list
1356 * which is present in E2 database.
1357 * In the case of other procedures, we just fill the RAN functions whose ID
1358 * is contained in recvList
1363 * Count of ran functions to be added in the list
1364 * Received list of RAN functions
1366 * @return ROK - success
1369 ******************************************************************/
1371 uint8_t BuildRanFunctionAddList(RANfunctions_List_t *ranFunctionsList, uint8_t procedureCode, uint8_t count, RanFuncInfo *recvList)
1374 RanFunction *ranFuncDb;
1376 RANfunction_ItemIEs_t *ranFuncItemIe;
1378 /* For ProcedureCodeE2_id_E2setup, the number of RAN function list items is
1379 * equal to the number of ran function entries stored in the database.
1380 * For any other procedure, the RAN function list count is equal
1381 * to the count of ran functions obtained from the function's caller */
1383 if(procedureCode == ProcedureCodeE2_id_E2setup)
1384 ranFunctionsList->list.count = duCb.e2apDb.numOfRanFunction;
1386 ranFunctionsList->list.count = count;
1388 ranFunctionsList->list.size = ranFunctionsList->list.count * sizeof(RANfunction_ItemIEs_t*);
1389 DU_ALLOC(ranFunctionsList->list.array, ranFunctionsList->list.size);
1390 if(ranFunctionsList->list.array == NULLP)
1392 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
1396 for(ranFuncIdx = 0; ranFuncIdx< ranFunctionsList->list.count; ranFuncIdx++)
1398 DU_ALLOC(ranFunctionsList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
1399 if(ranFunctionsList->list.array[ranFuncIdx] == NULLP)
1401 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
1404 if(procedureCode == ProcedureCodeE2_id_E2setup)
1406 /* Getting all of the RAN function's information from DuCb one by one*/
1407 ranFuncDb = &duCb.e2apDb.ranFunction[ranFuncIdx];
1411 /* Getting only the RAN function information from DuCb whose Id is
1412 * present in the received array */
1413 id =recvList[ranFuncIdx].id;
1414 ranFuncDb = &duCb.e2apDb.ranFunction[id-1];
1416 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
1417 ranFuncItemIe->id = ProtocolIE_IDE2_id_RANfunction_Item;
1418 ranFuncItemIe->criticality = CriticalityE2_ignore;
1419 ranFuncItemIe->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
1420 BuildRanFunctionItem(&ranFuncItemIe->value.choice.RANfunction_Item, ranFuncDb);
1425 /*******************************************************************
1427 * @brief De Allocate E2 Setup Request Message
1431 * Function : FreeE2SetupReq
1433 * Functionality: De-Allocating E2 Setup request Message
1435 * @params[in] E2AP_PDU_t *e2apMsg
1439 * ****************************************************************/
1441 void FreeE2SetupReq(E2AP_PDU_t *e2apMsg)
1444 uint8_t e2NodeAddListIdx =0, ranFuncAddListIdx;
1445 E2setupRequest_t *e2SetupReq;
1446 E2nodeComponentConfigAddition_List_t *e2NodeAddList;
1447 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem;
1448 RANfunctions_List_t *ranFunctionsList;
1449 RANfunction_ItemIEs_t *ranFuncItemIe;
1450 RANfunction_Item_t *ranFunItem;
1452 /* De-allocating Memory */
1453 if(e2apMsg != NULLP)
1455 if(e2apMsg->choice.initiatingMessage != NULLP)
1457 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
1458 if(e2SetupReq->protocolIEs.list.array != NULLP)
1460 for(arrIdx = 0; arrIdx < e2SetupReq->protocolIEs.list.count; arrIdx++)
1462 if(e2SetupReq->protocolIEs.list.array[arrIdx] != NULLP)
1464 switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id)
1466 case ProtocolIE_IDE2_id_TransactionID:
1468 case ProtocolIE_IDE2_id_GlobalE2node_ID:
1470 if(e2SetupReq->protocolIEs.list.array[arrIdx]->\
1471 value.choice.GlobalE2node_ID.choice.gNB != NULLP)
1473 GlobalE2node_gNB_ID_t *gNbId = NULLP;
1474 gNbId = e2SetupReq->protocolIEs.list.array[arrIdx]->\
1475 value.choice.GlobalE2node_ID.choice.gNB;
1476 if(gNbId->global_gNB_ID.plmn_id.buf != NULLP)
1478 DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\
1479 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
1480 DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\
1481 gNbId->global_gNB_ID.plmn_id.size);
1484 if(gNbId->gNB_DU_ID != NULLP)
1486 DU_FREE( gNbId->gNB_DU_ID->buf, gNbId->gNB_DU_ID->size);
1487 DU_FREE(gNbId->gNB_DU_ID, sizeof(GNB_DU_ID_t));
1489 DU_FREE(e2SetupReq->protocolIEs.list.array[arrIdx]->value.\
1490 choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
1494 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
1496 e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
1497 if(e2NodeAddList->list.array)
1499 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
1501 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[e2NodeAddListIdx];
1503 /* Free E2 Node Component Request Part */
1504 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentRequestPart.buf,\
1505 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentRequestPart.size);
1507 /* Free E2 Node Component Response Part */
1508 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.\
1509 e2nodeComponentResponsePart.buf, \
1510 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration.e2nodeComponentResponsePart.size);
1512 /* Free E2 Node Component ID */
1513 if(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1)
1515 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.\
1516 e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\
1517 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.\
1518 e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
1519 DU_FREE(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1,\
1520 sizeof(E2nodeComponentInterfaceF1_t));
1522 DU_FREE(e2NodeAddList->list.array[e2NodeAddListIdx], sizeof(E2nodeComponentConfigAddition_ItemIEs_t));
1524 DU_FREE(e2NodeAddList->list.array, e2NodeAddList->list.size);
1528 case ProtocolIE_IDE2_id_RANfunctionsAdded:
1530 ranFunctionsList = &(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List);
1531 if(ranFunctionsList->list.array)
1533 for(ranFuncAddListIdx= 0; ranFuncAddListIdx< ranFunctionsList->list.count; ranFuncAddListIdx++)
1535 if(ranFunctionsList->list.array[ranFuncAddListIdx])
1537 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncAddListIdx];
1538 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
1539 DU_FREE(ranFunItem->ranFunctionOID.buf, ranFunItem->ranFunctionOID.size);
1540 DU_FREE(ranFunItem->ranFunctionDefinition.buf, ranFunItem->ranFunctionDefinition.size);
1541 DU_FREE(ranFunctionsList->list.array[ranFuncAddListIdx], sizeof(RANfunction_ItemIEs_t));
1544 DU_FREE(ranFunctionsList->list.array, ranFunctionsList->list.size);
1550 DU_LOG("\nERROR --> E2AP: Invalid event at e2SetupRequet %ld ",\
1551 (e2SetupReq->protocolIEs.list.array[arrIdx]->id));
1554 DU_FREE(e2SetupReq->protocolIEs.list.array[arrIdx], sizeof(E2setupRequestIEs_t));
1557 DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size);
1559 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1561 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1565 /*******************************************************************
1567 * @brief Builds and Send the E2SetupRequest
1571 * Function : BuildAndSendE2SetupReq
1573 * Functionality:Fills the E2SetupRequest
1575 * @return ROK - success
1578 ******************************************************************/
1580 uint8_t BuildAndSendE2SetupReq()
1582 uint8_t arrIdx = 0, elementCnt=0;
1583 uint8_t transId = 0, ret = ROK;
1584 bool memAllocFailed;
1585 E2AP_PDU_t *e2apMsg = NULLP;
1586 E2setupRequest_t *e2SetupReq = NULLP;
1587 asn_enc_rval_t encRetVal; /* Encoder return value */
1589 DU_LOG("\nINFO --> E2AP : Building E2 Setup Request\n");
1592 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1593 if(e2apMsg == NULLP)
1595 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1598 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
1599 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1600 if(e2apMsg->choice.initiatingMessage == NULLP)
1602 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1605 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1606 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
1607 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
1608 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
1611 e2SetupReq->protocolIEs.list.count = elementCnt;
1612 e2SetupReq->protocolIEs.list.size = elementCnt * sizeof(E2setupRequestIEs_t*);
1614 /* Initialize the E2Setup members */
1615 DU_ALLOC(e2SetupReq->protocolIEs.list.array, \
1616 e2SetupReq->protocolIEs.list.size);
1617 if(e2SetupReq->protocolIEs.list.array == NULLP)
1619 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements");
1622 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
1624 DU_ALLOC(e2SetupReq->protocolIEs.list.array[arrIdx],\
1625 sizeof(E2setupRequestIEs_t));
1626 if(e2SetupReq->protocolIEs.list.array[arrIdx] == NULLP)
1628 memAllocFailed = true;
1629 DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayarrIdx [%d]", arrIdx);
1633 if(memAllocFailed == true)
1639 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
1640 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1641 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_TransactionID;
1642 transId = assignTransactionId();
1643 e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
1646 /* GlobalE2node_gNB_ID */
1647 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_GlobalE2node_ID;
1648 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1649 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_GlobalE2node_ID;
1650 e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB;
1652 DU_ALLOC(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.\
1653 GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
1654 if(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.\
1655 GlobalE2node_ID.choice.gNB == NULLP)
1657 DU_LOG("\nERROR --> E2AP : Memory allocation failed for gNbId");
1662 ret = BuildGlobalgNBId(e2SetupReq->protocolIEs.list.array[arrIdx]->value.\
1663 choice.GlobalE2node_ID.choice.gNB);
1666 DU_LOG("\nERROR --> E2AP : Failed to build Global Gnb Id");
1671 /* RAN Functions Added List */
1673 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAdded;
1674 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1675 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_RANfunctions_List;
1676 if(BuildRanFunctionAddList(&(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List), ProcedureCodeE2_id_E2setup, 0, NULL)!=ROK)
1678 DU_LOG("\nERROR --> E2AP : Failed to create RAN Function");
1682 /* E2 Node Component Configuration Addition List */
1684 e2SetupReq->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition;
1685 e2SetupReq->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1686 e2SetupReq->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_E2nodeComponentConfigAddition_List;
1687 if(BuildE2NodeConfigAddList(&(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List), ProcedureCodeE2_id_E2setup, 0, NULL)!=ROK)
1689 DU_LOG("\nERROR --> E2AP : Failed to create E2 Node config list");
1695 /* Prints the Msg formed */
1696 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1698 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1700 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
1702 if(encRetVal.encoded == ENCODE_FAIL)
1704 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupRequest structure (at %s)\n",\
1705 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1710 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupRequest\n");
1711 #ifdef DEBUG_ASN_PRINT
1712 for(int i=0; i< encBufSize; i++)
1714 printf("%x",encBuf[i]);
1718 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
1720 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
1725 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
1726 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
1728 FreeE2SetupReq(e2apMsg);
1730 }/* End of BuildAndSendE2SetupReq */
1732 /*******************************************************************
1734 * @brief Builds RIC Action Admitted List
1738 * Function : BuildRicActionAdmitList
1740 * Functionality: Builds RIC Action Admitted List
1742 * @params[in] Pointer to RIC Action Admitted List to be filled
1743 * Subscription Response information
1744 * @return ROK - success
1747 * ****************************************************************/
1748 uint8_t BuildRicActionAdmitList(RICaction_Admitted_List_t *admitList, PendingSubsRspInfo *subsRspInfo)
1751 uint8_t elementCnt = 0;
1752 RICaction_Admitted_ItemIEs_t *admitItem = NULLP;
1754 elementCnt = subsRspInfo->numOfAcceptedActions;
1756 admitList->list.count = elementCnt;
1757 admitList->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t *);
1759 DU_ALLOC(admitList->list.array, admitList->list.size);
1760 if(admitList->list.array == NULLP)
1762 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1766 for(idx=0; idx<elementCnt; idx++)
1768 DU_ALLOC(admitList->list.array[idx], sizeof(RICaction_Admitted_ItemIEs_t));
1769 if(admitList->list.array[idx] == NULLP)
1771 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1775 admitItem = (RICaction_Admitted_ItemIEs_t *)admitList->list.array[idx];
1776 admitItem->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
1777 admitItem->criticality = CriticalityE2_reject;
1778 admitItem->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
1779 admitItem->value.choice.RICaction_Admitted_Item.ricActionID = subsRspInfo->acceptedActionList[idx];
1784 /*******************************************************************
1786 * @brief Builds RIC Action Not Admitted List
1790 * Function : BuildRicActionNotAdmitList
1792 * Functionality: Builds RIC Action Not Admitted List
1794 * @params[in] Pointer to RIC Action Not Admitted List to be filled
1795 * Subscription Response information
1796 * @return ROK - success
1799 * ****************************************************************/
1800 uint8_t BuildRicActionNotAdmitList(RICaction_NotAdmitted_List_t *notAdmitList, PendingSubsRspInfo *subsRspInfo)
1803 uint8_t elementCnt = 0;
1804 RICaction_NotAdmitted_ItemIEs_t *notAdmitItem = NULLP;
1806 elementCnt = subsRspInfo->numOfRejectedActions;
1808 notAdmitList->list.count = elementCnt;
1809 notAdmitList->list.size = elementCnt * sizeof(RICaction_NotAdmitted_ItemIEs_t *);
1811 DU_ALLOC(notAdmitList->list.array, notAdmitList->list.size);
1812 if(notAdmitList->list.array == NULLP)
1814 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1818 for(idx=0; idx<elementCnt; idx++)
1820 DU_ALLOC(notAdmitList->list.array[idx], sizeof(RICaction_NotAdmitted_ItemIEs_t));
1821 if(notAdmitList->list.array[idx] == NULLP)
1823 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1827 notAdmitItem = (RICaction_NotAdmitted_ItemIEs_t *)notAdmitList->list.array[idx];
1828 notAdmitItem->id = ProtocolIE_IDE2_id_RICaction_NotAdmitted_Item;
1829 notAdmitItem->criticality = CriticalityE2_reject;
1830 notAdmitItem->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
1831 notAdmitItem->value.choice.RICaction_NotAdmitted_Item.ricActionID = \
1832 subsRspInfo->rejectedActionList[idx].id;
1833 fillE2Cause(¬AdmitItem->value.choice.RICaction_NotAdmitted_Item.cause, \
1834 subsRspInfo->rejectedActionList[idx].failureCause);
1839 /*******************************************************************
1841 * @breif Deallocation of BuildAndSendRicSubscriptionRsp memory
1845 * Function : FreeRicSubscriptionRsp
1847 * Functionality:Free the RicSubscriptionRsp
1849 * @param[in] E2AP_PDU_t *e2apRicMsg
1853 ******************************************************************/
1854 void FreeRicSubscriptionRsp(E2AP_PDU_t *e2apRicMsg)
1856 RICsubscriptionResponse_t *ricSubscriptionRsp= NULLP;
1859 RICaction_Admitted_List_t *admitList = NULLP;
1860 RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
1862 if(e2apRicMsg != NULLP)
1864 if(e2apRicMsg->choice.successfulOutcome != NULLP)
1866 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
1867 if(ricSubscriptionRsp)
1869 if(ricSubscriptionRsp->protocolIEs.list.array != NULLP)
1871 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
1873 if(ricSubscriptionRsp->protocolIEs.list.array[idx] != NULLP)
1875 switch(ricSubscriptionRsp->protocolIEs.list.array[idx]->id)
1877 case ProtocolIE_IDE2_id_RICactions_Admitted:
1879 admitList = &ricSubscriptionRsp->protocolIEs.list.\
1880 array[idx]->value.choice.RICaction_Admitted_List;
1881 if(admitList->list.array != NULLP)
1883 for(listIdx=0 ; listIdx < admitList->list.count; listIdx++)
1885 DU_FREE(admitList->list.array[listIdx], sizeof(RICaction_Admitted_ItemIEs_t));
1887 DU_FREE(admitList->list.array, admitList->list.size);
1891 case ProtocolIE_IDE2_id_RICactions_NotAdmitted:
1893 notAdmitList = &ricSubscriptionRsp->protocolIEs.list.\
1894 array[idx]->value.choice.RICaction_NotAdmitted_List;
1895 if(notAdmitList->list.array != NULLP)
1897 for(listIdx=0 ; listIdx < notAdmitList->list.count; listIdx++)
1899 DU_FREE(notAdmitList->list.array[listIdx], sizeof(RICaction_NotAdmitted_ItemIEs_t));
1901 DU_FREE(notAdmitList->list.array, notAdmitList->list.size);
1908 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array[idx], sizeof(RICsubscriptionResponse_IEs_t));
1911 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array, ricSubscriptionRsp->protocolIEs.list.size);
1914 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1916 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
1920 /*******************************************************************
1922 * @brief Fill RIC Subscription Response IEs
1926 * Function : fillRicSubscriptionRsp
1928 * functionality: Fill RIC Subscription Response IEs
1930 * @param Pointer to RIC subscription response
1931 * Subscription response information
1932 * @return ROK - success
1935 ******************************************************************/
1936 uint8_t fillRicSubscriptionRsp(RICsubscriptionResponse_t *ricSubscriptionRsp, PendingSubsRspInfo *subsRspInfo)
1939 uint8_t elementCnt = 0;
1940 RICsubscriptionResponse_IEs_t *subsRspIe = NULLP;
1943 if(subsRspInfo->numOfRejectedActions)
1946 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
1947 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
1948 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, ricSubscriptionRsp->protocolIEs.list.size);
1949 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
1951 DU_LOG("\nERROR --> E2AP : Memory allocation failed at %s : line %d", __func__, __LINE__);
1955 for(ieIdx=0; ieIdx<ricSubscriptionRsp->protocolIEs.list.count; ieIdx++)
1957 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionResponse_IEs_t));
1958 if(ricSubscriptionRsp->protocolIEs.list.array[ieIdx] == NULLP)
1960 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d] : ieIdx [%d]", __func__, __LINE__,ieIdx);
1965 /* RIC Request ID */
1967 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1968 subsRspIe->id = ProtocolIE_IDE2_id_RICrequestID;
1969 subsRspIe->criticality = CriticalityE2_reject;
1970 subsRspIe->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
1971 subsRspIe->value.choice.RICrequestID.ricRequestorID = subsRspInfo->requestId.requestorId;
1972 subsRspIe->value.choice.RICrequestID.ricInstanceID = subsRspInfo->requestId.instanceId;
1974 /* RAN Function ID */
1976 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1977 subsRspIe->id = ProtocolIE_IDE2_id_RANfunctionID;
1978 subsRspIe->criticality = CriticalityE2_reject;
1979 subsRspIe->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
1980 subsRspIe->value.choice.RANfunctionID = subsRspInfo->ranFuncId;
1982 /* RIC Action Admitted List */
1984 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1985 subsRspIe->id = ProtocolIE_IDE2_id_RICactions_Admitted;
1986 subsRspIe->criticality = CriticalityE2_reject;
1987 subsRspIe->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
1988 if(BuildRicActionAdmitList(&subsRspIe->value.choice.RICaction_Admitted_List, subsRspInfo) != ROK)
1990 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Action Admitted List in RIC Subscription Response");
1994 /* RIC Action Not Admitted List */
1995 if(subsRspInfo->numOfRejectedActions)
1998 subsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1999 subsRspIe->id = ProtocolIE_IDE2_id_RICactions_NotAdmitted;
2000 subsRspIe->criticality = CriticalityE2_reject;
2001 subsRspIe->criticality = CriticalityE2_reject;
2002 subsRspIe->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List;
2003 if(BuildRicActionNotAdmitList(&subsRspIe->value.choice.RICaction_NotAdmitted_List, subsRspInfo) != ROK)
2005 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Action Not Admitted List in RIC Subscription Response");
2013 /*******************************************************************
2015 * @brief Builds and Send the RicSubscriptionRsp
2019 * Function : BuildAndSendRicSubscriptionRsp
2021 * Functionality:Fills the RicSubscriptionRsp
2023 * @return ROK - success
2026 ******************************************************************/
2028 uint8_t BuildAndSendRicSubscriptionRsp(PendingSubsRspInfo *subsRspInfo)
2030 uint8_t ret = RFAILED;
2031 E2AP_PDU_t *e2apRicMsg = NULLP;
2032 RICsubscriptionResponse_t *ricSubscriptionRsp=NULLP;
2033 asn_enc_rval_t encRetVal;
2037 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Response\n");
2039 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
2040 if(e2apRicMsg == NULLP)
2042 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2046 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
2047 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2048 if(e2apRicMsg->choice.successfulOutcome == NULLP)
2050 DU_LOG("\nERROR --> E2AP : Memory allocation for RIC subscription Response failed");
2054 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
2055 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2056 e2apRicMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
2058 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
2060 if(fillRicSubscriptionRsp(ricSubscriptionRsp, subsRspInfo) != ROK)
2062 DU_LOG("\nERROR --> E2AP : Memory allocation for RICsubscriptionResponseIE failed");
2066 /* Prints the Msg formed */
2067 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
2069 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2071 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
2072 if(encRetVal.encoded == ENCODE_FAIL)
2074 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
2075 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2080 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription response \n");
2081 #ifdef DEBUG_ASN_PRINT
2082 for(int i=0; i< encBufSize; i++)
2084 printf("%x",encBuf[i]);
2089 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
2091 DU_LOG("\nERROR --> E2AP : Sending RIC Subscription Response failed");
2100 FreeRicSubscriptionRsp(e2apRicMsg);
2104 /******************************************************************
2106 * @brief Deallocation of memory allocated by aper decoder for e2 setup response
2110 * Function : freeAperDecodingOfE2SetupRsp
2112 * Functionality: Deallocation of memory allocated by aper decoder for e2
2115 * @params[in] E2setupResponse_t *e2SetRspMsg;
2118 * ****************************************************************/
2119 void freeAperDecodingOfE2SetupRsp(E2setupResponse_t *e2SetRspMsg)
2121 uint8_t arrIdx, e2NodeConfigAddAckListIdx;
2122 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem;
2123 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAddAckList;
2127 if(e2SetRspMsg->protocolIEs.list.array)
2129 for(arrIdx=0; arrIdx<e2SetRspMsg->protocolIEs.list.count; arrIdx++)
2131 if(e2SetRspMsg->protocolIEs.list.array[arrIdx])
2133 switch(e2SetRspMsg->protocolIEs.list.array[arrIdx]->id)
2135 case ProtocolIE_IDE2_id_TransactionID:
2138 case ProtocolIE_IDE2_id_GlobalRIC_ID:
2140 free(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.pLMN_Identity.buf);
2141 free(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.ric_ID.buf);
2145 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
2147 e2NodeConfigAddAckList = &e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
2148 if(e2NodeConfigAddAckList->list.array )
2150 for(e2NodeConfigAddAckListIdx = 0; e2NodeConfigAddAckListIdx< e2NodeConfigAddAckList->list.count; e2NodeConfigAddAckListIdx++)
2152 if(e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx])
2154 e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx];
2155 free(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.\
2156 e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf);
2157 free(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.\
2158 e2nodeComponentInterfaceTypeF1);
2159 free(e2NodeConfigAddAckList->list.array[e2NodeConfigAddAckListIdx]);
2162 free(e2NodeConfigAddAckList->list.array);
2167 free(e2SetRspMsg->protocolIEs.list.array[arrIdx]);
2170 free(e2SetRspMsg->protocolIEs.list.array);
2174 /******************************************************************
2176 * @brief Processes E2 Setup Response sent by RIC
2180 * Function : procE2SetupRsp
2182 * Functionality: Processes E2 Setup Response sent by RIC
2184 * @params[in] E2AP_PDU_t ASN decoded E2AP message
2185 * @return ROK - success
2188 * ****************************************************************/
2190 uint8_t procE2SetupRsp(E2AP_PDU_t *e2apMsg)
2192 uint8_t arrIdx =0, transId=0, idx=0;
2193 uint32_t recvBufLen;
2194 E2setupResponse_t *e2SetRspMsg=NULL;
2196 E2NodeComponent *e2NodeComponentInfo=NULL;
2197 E2nodeComponentConfigAdditionAck_List_t *e2NodeCfgAckList=NULL;
2198 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem=NULL;
2200 DU_LOG("\nINFO --> E2AP : E2 Setup Response received");
2201 duCb.e2Status = TRUE; //Set E2 status as true
2202 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
2204 for(arrIdx=0; arrIdx<e2SetRspMsg->protocolIEs.list.count; arrIdx++)
2206 switch(e2SetRspMsg->protocolIEs.list.array[arrIdx]->id)
2208 case ProtocolIE_IDE2_id_TransactionID:
2210 transId = e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
2211 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
2212 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
2214 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
2218 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
2224 case ProtocolIE_IDE2_id_GlobalRIC_ID:
2226 /* To store the Ric Id Params */
2227 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[arrIdx]->value\
2228 .choice.GlobalRIC_ID.pLMN_Identity.size);
2229 memcpy(&duCb.e2apDb.ricId.plmnId, e2SetRspMsg->protocolIEs.list.array[arrIdx]\
2230 ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen);
2231 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.GlobalRIC_ID.ric_ID, &duCb.e2apDb.ricId);
2232 /*TODO : duCb.e2apDb.ricId.plmnId memory to be deallocated after the usage */
2236 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
2238 e2NodeCfgAckList = &e2SetRspMsg->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
2239 for(idx =0; idx <e2NodeCfgAckList->list.count; idx++)
2241 e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeCfgAckList->list.array[idx];
2242 switch(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.present)
2244 case E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1:
2246 e2NodeComponentInfo = fetchE2NodeComponentInfo(F1, E2_NODE_COMPONENT_ADD, &node);
2247 if(!e2NodeComponentInfo)
2249 DU_LOG("\nERROR --> E2AP : Received null e2NodeComponentInfo at line number %d",__LINE__);
2254 cmLListDelFrm(&duCb.e2apDb.e2NodeComponentList, node);
2255 DU_FREE(e2NodeComponentInfo->componentRequestPart, e2NodeComponentInfo->reqBufSize);
2256 DU_FREE(e2NodeComponentInfo->componentResponsePart, e2NodeComponentInfo->rspBufSize);
2257 DU_FREE(e2NodeComponentInfo, sizeof(E2NodeComponent));
2258 DU_FREE(node, sizeof(CmLList));
2270 DU_LOG("\nERROR --> E2AP : Invalid IE received in E2SetupRsp:%ld",
2271 e2SetRspMsg->protocolIEs.list.array[arrIdx]->id);
2275 freeAperDecodingOfE2SetupRsp(e2SetRspMsg);
2277 if(duSendE2NodeConfigurationUpdate() != ROK)
2279 DU_LOG("\nERROR --> E2AP : Failed to send E2 node config update");
2285 /*******************************************************************
2287 * @brief Free RIC Subscription Request
2291 * Function : freeAperDecodingOfRicSubsReq
2293 * Functionality : Free RIC Subscription Request
2297 ******************************************************************/
2298 void freeAperDecodingOfRicSubsReq(RICsubscriptionRequest_t *ricSubscriptionReq)
2301 uint8_t elementIdx = 0;
2302 RICsubscriptionDetails_t *subsDetails = NULLP;
2303 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
2305 if(ricSubscriptionReq->protocolIEs.list.array)
2307 for(idx=0; idx < ricSubscriptionReq->protocolIEs.list.count; idx++)
2309 switch(ricSubscriptionReq->protocolIEs.list.array[idx]->id)
2311 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
2313 subsDetails = &(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails);
2314 free(subsDetails->ricEventTriggerDefinition.buf);
2316 if(subsDetails->ricAction_ToBeSetup_List.list.array)
2318 for(elementIdx = 0; elementIdx < subsDetails->ricAction_ToBeSetup_List.list.count; elementIdx++)
2320 if(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
2322 actionItem = (RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx];
2323 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
2325 free(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf);
2326 free(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition);
2328 free(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx]);
2331 free(subsDetails->ricAction_ToBeSetup_List.list.array);
2336 free(ricSubscriptionReq->protocolIEs.list.array[idx]);
2338 free(ricSubscriptionReq->protocolIEs.list.array);
2342 /*******************************************************************
2344 * @brief Free Event Trigger Definition
2348 * Function : freeAperDecodingOfEventTriggerDef
2350 * Functionality: Free Event Trigger Definition
2352 * @params[in] E2SM-KPM Event Trigger Definition
2355 * ****************************************************************/
2356 void freeAperDecodingOfEventTriggerDef(E2SM_KPM_EventTriggerDefinition_t *eventTiggerDef)
2360 switch(eventTiggerDef->eventDefinition_formats.present)
2362 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING:
2365 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1:
2366 free(eventTiggerDef->eventDefinition_formats.choice.eventDefinition_Format1);
2372 /*******************************************************************
2374 * @brief Extract E2SM-KPM Event trigger definition
2378 * Function : extractEventTriggerDef
2380 * Functionality : This function :
2381 * - Decodes E2SM-KPM Event Trigger Definition
2382 * - Validates that even trigger style is supported by E2 node
2383 * - Stores event trigger details in local DB
2385 * @params[in] RAN Function Database structure
2386 * RIC Subscription Info to be added to RAN function
2387 * RIC Event Trigger Definition buffer received from RIC
2388 * @return ROK - success
2391 ******************************************************************/
2392 uint8_t extractEventTriggerDef(RanFunction *ranFuncDb, RicSubscription *ricSubscriptionInfo, \
2393 RICeventTriggerDefinition_t *ricEventTriggerDef, E2FailureCause *failureCause)
2395 uint8_t ret = RFAILED;
2396 uint8_t eventIdx = 0;
2397 asn_dec_rval_t rval ={0};
2398 E2SM_KPM_EventTriggerDefinition_t eventTiggerDef, *eventTiggerDefPtr = NULLP;
2400 /* Decoding E2SM-KPM Even Trigger Definition */
2401 eventTiggerDefPtr = &eventTiggerDef;
2402 memset(eventTiggerDefPtr, 0, sizeof(E2SM_KPM_EventTriggerDefinition_t));
2404 rval = aper_decode(0, &asn_DEF_E2SM_KPM_EventTriggerDefinition, (void **)&eventTiggerDefPtr, ricEventTriggerDef->buf,\
2405 ricEventTriggerDef->size, 0, 0);
2406 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2408 DU_LOG("\nERROR --> E2AP : ASN decode failed for E2SM-KPM Event Trigger Definition");
2409 failureCause->causeType = E2_PROTOCOL;
2410 failureCause->cause = E2_ABSTRACT_SYNTAX_ERROR_FALSELY_CONSTRUCTED_MESSAGE;
2414 xer_fprint(stdout, &asn_DEF_E2SM_KPM_EventTriggerDefinition, eventTiggerDefPtr);
2416 /* Validating the received event trigger definition format */
2417 for(eventIdx = 0; eventIdx < ranFuncDb->numOfEventTriggerStyleSupported; eventIdx++)
2419 if((eventTiggerDefPtr->eventDefinition_formats.present != \
2420 E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING) && \
2421 (eventTiggerDefPtr->eventDefinition_formats.present == ranFuncDb->eventTriggerStyleList[eventIdx].formatType))
2423 ricSubscriptionInfo->eventTriggerDefinition.formatType = ranFuncDb->eventTriggerStyleList[eventIdx].formatType;
2424 ricSubscriptionInfo->eventTriggerDefinition.choice.format1.reportingPeriod = \
2425 eventTiggerDefPtr->eventDefinition_formats.choice.eventDefinition_Format1->reportingPeriod;
2434 failureCause->causeType = E2_RIC_REQUEST;
2435 failureCause->cause = E2_EVENT_TRIGGER_NOT_SUPPORTED;
2437 /* Free E2SM_KPM_EventTriggerDefinition_t */
2438 freeAperDecodingOfEventTriggerDef(eventTiggerDefPtr);
2442 /*******************************************************************
2444 * @brief Free RIC Action Definition
2448 * Function : freeAperDecodingOfRicActionDefinition
2450 * Functionality: Free RIC Action Definition
2452 * @params[in] E2SM-KPM Action definition
2455 * ****************************************************************/
2456 void freeAperDecodingOfRicActionDefinition(E2SM_KPM_ActionDefinition_t *actionDef)
2458 uint8_t elementIdx = 0;
2459 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
2460 MeasurementInfoItem_t *measItem = NULLP;
2462 switch(actionDef->actionDefinition_formats.present)
2464 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
2466 if(actionDef->actionDefinition_formats.choice.actionDefinition_Format1)
2468 actionFormat1 = actionDef->actionDefinition_formats.choice.actionDefinition_Format1;
2469 if(actionFormat1->measInfoList.list.array)
2471 for(elementIdx = 0; elementIdx < actionFormat1->measInfoList.list.count; elementIdx++)
2473 if(actionFormat1->measInfoList.list.array[elementIdx])
2475 measItem = actionFormat1->measInfoList.list.array[elementIdx];
2476 switch(measItem->measType.present)
2478 case MeasurementType_PR_NOTHING:
2481 case MeasurementType_PR_measName:
2483 free(measItem->measType.choice.measName.buf);
2487 case MeasurementType_PR_measID:
2493 free(actionFormat1->measInfoList.list.array);
2495 free(actionFormat1);
2499 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2:
2500 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3:
2501 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format4:
2502 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format5:
2508 /*******************************************************************
2510 * @brief Extract Measurement Info list from action definition
2514 * Function : extractMeasInfoList
2516 * Functionality : This function :
2517 * - Traverses Measurement-to-be-subscribed list
2518 * - Validates that each measurement in Measurement-to-be-subscribed
2519 * list is supported in RAN-Function->Measurement-supported list.
2520 * - If all measurements in an action is supported by RAN function,
2521 * it is added to measurement-subscribed list in local DB
2523 * @params[in] Measurement Info supported list by RAN function
2524 * Measurement Info to be subscribed as requested by RIC
2525 * Measurement Info finally subscribed
2526 * Memory failure indicator
2527 * @return ROK - success
2530 ******************************************************************/
2531 uint8_t extractMeasInfoList(CmLListCp *measInfoSupportedList, MeasurementInfoList_t *measInfoToBeSubscribedList, \
2532 CmLListCp *measInfoSubscribedList, bool *memFailure)
2534 uint8_t elementIdx = 0;
2535 MeasurementInfoForAction *measInfoSupportedDb = NULLP;
2536 MeasurementInfo *measInfoSubscribedDb = NULLP, *measInfoToDel = NULLP;
2537 CmLList *supportedMeasNode = NULLP, *measToAddNode = NULLP, *measToDelNode = NULLP;;
2538 MeasurementInfoItem_t *measItem = NULLP;
2540 /* Validate Measurement list is supported by E2 node.
2542 * Traverse and compare the Measurement-Supported List in E2
2543 * node with Measurement-to-be-subscribed list received from RIC.
2544 * If a match is found, add it to measurement-subscription list.
2546 for(elementIdx = 0; elementIdx < measInfoToBeSubscribedList->list.count; elementIdx++)
2548 measInfoSubscribedDb = NULLP;
2549 measToAddNode = NULLP;
2550 measItem = measInfoToBeSubscribedList->list.array[elementIdx];
2552 CM_LLIST_FIRST_NODE(measInfoSupportedList, supportedMeasNode);
2553 while(supportedMeasNode)
2555 measInfoSupportedDb = (MeasurementInfoForAction*)supportedMeasNode->node;
2556 switch(measItem->measType.present)
2558 case MeasurementType_PR_measName:
2560 if(!strcmp(measInfoSupportedDb->measurementTypeName, (char *)measItem->measType.choice.measName.buf))
2562 DU_ALLOC(measInfoSubscribedDb, sizeof(MeasurementInfo));
2567 case MeasurementType_PR_measID:
2569 if(measInfoSupportedDb->measurementTypeId == measItem->measType.choice.measID)
2571 DU_ALLOC(measInfoSubscribedDb, sizeof(MeasurementInfo));
2578 DU_LOG("\nERROR -> DUAPP: Invalid Measurement-type identifier in \
2579 E2SM-KPM Action Definition Format");
2582 } /* End of switch, for measurement type identifier */
2584 /* If measurement type is supported, add to measurement-subscription list */
2585 if(measInfoSubscribedDb)
2587 measInfoSubscribedDb->measurementTypeId = measInfoSupportedDb->measurementTypeId;
2588 memcpy(measInfoSubscribedDb->measurementTypeName, measInfoSupportedDb->measurementTypeName, \
2589 strlen(measInfoSupportedDb->measurementTypeName));
2591 DU_ALLOC(measToAddNode, sizeof(CmLList));
2594 measToAddNode->node = (PTR) measInfoSubscribedDb;
2595 cmLListAdd2Tail(measInfoSubscribedList, measToAddNode);
2597 /* Break out of while loop if measurement info is found in measurement-supported list */
2602 DU_FREE(measInfoSubscribedDb, sizeof(MeasurementInfo));
2603 measInfoSubscribedDb = NULLP;
2609 supportedMeasNode = supportedMeasNode->next;
2611 } /* End of while for traversing measurement-supported list in a report style */
2613 /* If a measurement-to-be-subscribed is not found in measurement-supported list in this report style
2615 * Delete all entries from measurement-subscription list and
2616 * Break out of for loop to search in next report style */
2617 if(!measInfoSubscribedDb)
2619 deleteMeasurementInfoList(measInfoSubscribedList);
2623 } /* End of for loop , traversing measurement-to-be-subscribed list */
2625 /* If all measurement-to-be-subscribed was found in measurement-supported list and
2626 * was added to measurement-subscription list successfully, return from here */
2627 if(measInfoToBeSubscribedList->list.count == measInfoSubscribedList->count)
2633 /*******************************************************************
2635 * @brief Extract E2SM-KPM Action definition
2639 * Function : extractRicActionDef
2641 * Functionality : This function :
2642 * - Decodes E2SM-KPM Action Definition
2643 * - Validates that action is supported by E2 node
2644 * - Stores action details in local DB
2646 * @params[in] RAN Function Database structure
2647 * RIC subscription's Action definition to be added to
2649 * RIC Action Definition buffer received from RIC
2650 * @return ROK - success
2653 ******************************************************************/
2654 uint8_t extractRicActionDef(RanFunction *ranFuncDb, ActionDefinition *actionDefDb, RICactionDefinition_t *ricActionDef,\
2655 E2FailureCause *failureCause)
2657 bool memFailure = false;
2658 uint8_t styleIdx = 0;
2659 asn_dec_rval_t rval ={0};
2661 E2SM_KPM_ActionDefinition_t actionDef, *actionDefPtr = NULLP;
2662 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
2663 CmLListCp *measInfoSupportedList = NULLP;
2664 CmLListCp *measInfoSubscribedList = NULLP;
2666 /* Decoding E2SM-KPM Action Definition */
2667 actionDefPtr = &actionDef;
2668 memset(actionDefPtr, 0, sizeof(E2SM_KPM_EventTriggerDefinition_t));
2670 rval = aper_decode(0, &asn_DEF_E2SM_KPM_ActionDefinition, (void **)&actionDefPtr, ricActionDef->buf,\
2671 ricActionDef->size, 0, 0);
2672 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2674 DU_LOG("\nERROR --> E2AP : ASN decode failed for E2SM-KPM Action Definition");
2675 failureCause->causeType = E2_PROTOCOL;
2676 failureCause->cause = E2_ABSTRACT_SYNTAX_ERROR_FALSELY_CONSTRUCTED_MESSAGE;
2680 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, actionDefPtr);
2683 /* Validate if Report style to subscribe is supported by E2 Node */
2684 for(styleIdx= 0; styleIdx < ranFuncDb->numOfReportStyleSupported; styleIdx++)
2686 /* Validate Report style type and report style format type is supported by E2 Node */
2687 if((ranFuncDb->reportStyleList[styleIdx].reportStyle.styleType == actionDefPtr->ric_Style_Type) &&
2688 (ranFuncDb->reportStyleList[styleIdx].reportStyle.formatType == actionDefPtr->actionDefinition_formats.present))
2690 /* Fetch Report stype type and format type */
2691 actionDefDb->styleType = actionDefPtr->ric_Style_Type;
2692 actionDefDb->formatType = actionDefPtr->actionDefinition_formats.present;
2694 switch(actionDefPtr->actionDefinition_formats.present)
2696 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
2698 actionFormat1 = actionDefPtr->actionDefinition_formats.choice.actionDefinition_Format1;
2700 /* Fetch granularity period */
2701 actionDefDb->choice.format1.granularityPeriod = actionFormat1->granulPeriod;
2703 /* Validate and add the Measurement to subscription list */
2704 measInfoSupportedList = &ranFuncDb->reportStyleList[styleIdx].measurementInfoList;
2705 measInfoSubscribedList = &actionDefDb->choice.format1.measurementInfoList;
2706 if(extractMeasInfoList(measInfoSupportedList, &actionFormat1->measInfoList, \
2707 measInfoSubscribedList, &memFailure) == ROK)
2711 /* Free E2SM_KPM_ActionDefinition_t */
2712 freeAperDecodingOfRicActionDefinition(actionDefPtr);
2717 break; /* End of E2SM-KPM Action definition format 1 case */
2722 DU_LOG("\nERROR -> DUAPP: Only E2SM-KPM Action Definition Format 1 is supported");
2725 } /* End of switch for E2SM-KPM Action definition formats */
2730 failureCause->causeType = E2_MISCELLANEOUS;
2731 failureCause->cause = E2_MISCELLANEOUS_CAUSE_UNSPECIFIED;
2734 } /* End of for loop, traversing Report-styles-supported list in E2 node */
2736 /* Memset action Db and Free E2SM_KPM_ActionDefinition_t */
2737 memset(actionDefDb, 0, sizeof(ActionDefinition));
2738 freeAperDecodingOfRicActionDefinition(actionDefPtr);
2740 if(failureCause->causeType == E2_NOTHING)
2742 failureCause->causeType = E2_RIC_REQUEST;
2743 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2748 /*******************************************************************
2750 * @brief Extract RIC Action to be setup
2754 * Function : extractRicActionToBeSetup
2756 * Functionality : This function :
2757 * - Validates that each action-to-be-setup is supported by E2 node
2758 * - Stores event trigger details in local DB
2760 * @params[in] RAN Function Database structure
2761 * RIC Subscription Info to be added to RAN function
2762 * RIC Action To Be Setup List received from RIC
2763 * @return ROK - success
2766 ******************************************************************/
2767 uint8_t extractRicActionToBeSetup(RanFunction *ranFuncDb, RicSubscription *ricSubscriptionInfo, \
2768 RICactions_ToBeSetup_List_t *actionList, E2FailureCause *failureCause, PendingSubsRspInfo *subsRsp)
2770 uint8_t actionIdx = 0;
2771 uint8_t ricActionId = 0;
2772 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
2774 if(actionList->list.array)
2776 for(actionIdx = 0; actionIdx < actionList->list.count; actionIdx++)
2778 actionItem =(RICaction_ToBeSetup_ItemIEs_t *)actionList->list.array[actionIdx];
2779 switch(actionItem->id)
2781 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
2783 /* If Action type is REPORT and
2784 * If RIC action definition's extraction and validation passes,
2786 * This action is added to action sequence list of subscription info */
2787 ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
2789 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType == RICactionType_report)
2791 ricSubscriptionInfo->actionSequence[ricActionId].actionId = ricActionId;
2792 ricSubscriptionInfo->actionSequence[ricActionId].type = REPORT;
2794 if(extractRicActionDef(ranFuncDb, &ricSubscriptionInfo->actionSequence[ricActionId].definition, \
2795 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, failureCause) == ROK)
2797 ricSubscriptionInfo->actionSequence[ricActionId].action = CONFIG_ADD;
2798 ricSubscriptionInfo->numOfActions++;
2803 /* In case of any failure, action is rejected
2804 * Added to rejected-action-list in subscription response */
2805 deleteActionSequence(&ricSubscriptionInfo->actionSequence[ricActionId]);
2807 subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].id = ricActionId;
2808 if(failureCause->causeType == E2_NOTHING)
2810 failureCause->causeType = E2_RIC_REQUEST;
2811 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2813 memcpy(&subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].failureCause, \
2814 failureCause, sizeof(E2FailureCause));
2815 subsRsp->numOfRejectedActions++;
2819 DU_LOG("\nERROR --> E2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
2825 /* If there is even 1 action that can be added, return ROK */
2826 if(ricSubscriptionInfo->numOfActions)
2829 if(failureCause->causeType == E2_NOTHING)
2831 failureCause->causeType = E2_RIC_REQUEST;
2832 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2837 /******************************************************************
2839 * @brief Processes RIC Subscription Req sent by RIC
2843 * Function : procRicSubscriptionRequest
2845 * Functionality: Processes RIC Subscription Request from RIC
2847 * @params[in] E2AP_PDU_t ASN decoded E2AP message
2848 * @return ROK - success
2851 * ****************************************************************/
2852 uint8_t procRicSubscriptionRequest(E2AP_PDU_t *e2apMsg)
2854 uint8_t idx = 0, actionIdx = 0;
2856 uint16_t ranFuncId = 0;
2857 RicRequestId ricReqId;
2858 CmLList *ricSubscriptionNode = NULLP;
2859 RanFunction *ranFuncDb = NULLP;
2860 RICsubscriptionRequest_t *ricSubsReq = NULLP;
2861 RICsubscriptionDetails_t *subsDetails = NULLP;
2862 RicSubscription *ricSubscriptionInfo = NULLP;
2863 E2FailureCause failureCause;
2865 DU_LOG("\nINFO --> E2AP : RIC Subscription request received");
2867 memset(&failureCause, 0, sizeof(E2FailureCause));
2868 memset(&ricReqId, 0, sizeof(RicRequestId));
2870 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
2871 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
2873 if(ricSubsReq->protocolIEs.list.array[idx])
2875 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
2877 case ProtocolIE_IDE2_id_RICrequestID:
2879 ricReqId.requestorId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID;
2880 ricReqId.instanceId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID;
2885 case ProtocolIE_IDE2_id_RANfunctionID:
2887 ranFuncId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID;
2889 /* Validating RAN Function id */
2890 ranFuncDb = fetchRanFuncFromRanFuncId(ranFuncId);
2894 failureCause.causeType = E2_RIC_REQUEST;
2895 failureCause.cause = E2_RAN_FUNCTION_ID_INVALID;
2900 if(ranFuncDb->numPendingSubsRsp >= MAX_PENDING_SUBSCRIPTION_RSP)
2902 failureCause.causeType = E2_RIC_REQUEST;
2903 failureCause.cause = E2_FUNCTION_RESOURCE_LIMIT;
2908 DU_ALLOC(ricSubscriptionInfo, sizeof(RicSubscription));
2909 if(!ricSubscriptionInfo)
2911 DU_LOG("\nERROR --> E2AP : Memory allocation failed for ricSubscriptionInfo");
2912 failureCause.causeType = E2_MISCELLANEOUS;
2913 failureCause.cause = E2_MISCELLANEOUS_CAUSE_UNSPECIFIED;
2917 ricSubscriptionInfo->requestId.requestorId = ricReqId.requestorId;
2918 ricSubscriptionInfo->requestId.instanceId = ricReqId.instanceId;
2919 ricSubscriptionInfo->ranFuncId = ranFuncId;
2921 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
2923 ricSubscriptionInfo->actionSequence[actionIdx].actionId = -1;
2926 memset(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp], 0, sizeof(PendingSubsRspInfo));
2927 memcpy(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp].requestId,
2928 &ricReqId, sizeof(RicRequestId));
2929 ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp].ranFuncId = ranFuncId;
2933 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
2935 subsDetails = &ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails;
2937 /* Decode, Validate and record Event Trigger Definition */
2938 if(extractEventTriggerDef(ranFuncDb, ricSubscriptionInfo, &subsDetails->ricEventTriggerDefinition, \
2939 &failureCause) != ROK)
2945 /* Decode, Validate and record RIC actions */
2946 if(extractRicActionToBeSetup(ranFuncDb, ricSubscriptionInfo, &subsDetails->ricAction_ToBeSetup_List, \
2947 &failureCause, &ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp]) != ROK)
2956 DU_LOG("\nERROR --> E2AP : Invalid IE received in RIC SubsReq:%ld",
2957 ricSubsReq->protocolIEs.list.array[idx]->id);
2966 freeAperDecodingOfRicSubsReq(ricSubsReq);
2970 cmInitTimers(&(ricSubscriptionInfo->ricSubsReportTimer), 1);
2972 /* Add RAN subcription detail to RAN function */
2973 DU_ALLOC(ricSubscriptionNode, sizeof(CmLList));
2974 if(ricSubscriptionNode)
2976 ricSubscriptionNode->node = (PTR) ricSubscriptionInfo;
2977 cmLListAdd2Tail(&ranFuncDb->subscriptionList, ricSubscriptionNode);
2980 ranFuncDb->numPendingSubsRsp++;
2982 #ifdef KPI_CALCULATION
2983 /* Send statistics request to other DU entities */
2984 BuildAndSendStatsReq(ricSubscriptionInfo);
2989 DU_FREE(ricSubscriptionInfo, sizeof(RicSubscription));
2993 memset(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp], 0, sizeof(PendingSubsRspInfo));
2996 /* Send RIC Subcription Failure */
2997 BuildAndSendRicSubscriptionFailure(ricReqId, ranFuncId, failureCause);
3003 /******************************************************************
3005 * @brief Free RIC Subscription Failure
3009 * Function : FreeRicSubscriptionFailure
3011 * Functionality: Free RIC Subscription Failure
3013 * @params[in] E2AP PDU
3016 * ****************************************************************/
3017 void FreeRicSubscriptionFailure(E2AP_PDU_t *e2apMsg)
3019 uint8_t elemIdx = 0;
3020 RICsubscriptionFailure_t *ricSubscriptionFailure = NULLP;
3024 if(e2apMsg->choice.unsuccessfulOutcome)
3026 ricSubscriptionFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure;
3027 if(ricSubscriptionFailure->protocolIEs.list.array)
3029 for(elemIdx = 0; elemIdx < ricSubscriptionFailure->protocolIEs.list.count; elemIdx++)
3031 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array[elemIdx], sizeof(RICsubscriptionFailure_IEs_t));
3033 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array, ricSubscriptionFailure->protocolIEs.list.size);
3035 DU_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3037 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3041 /******************************************************************
3043 * @brief Fill and Send RIC Subscription Failure to RIC
3047 * Function : BuildAndSendRicSubscriptionFailure
3049 * Functionality: Fill and Send RIC Subscription Failure to RIC
3051 * @params[in] RIC Request ID
3054 * @return ROK - success
3057 * ****************************************************************/
3058 uint8_t BuildAndSendRicSubscriptionFailure(RicRequestId ricReqId, uint16_t ranFuncId, E2FailureCause failureCause)
3060 uint8_t ret = RFAILED;
3061 uint8_t elementCnt = 0, elemIdx = 0;
3062 E2AP_PDU_t *e2apMsg = NULLP;
3063 asn_enc_rval_t encRetVal; /* Encoder return value */
3064 RICsubscriptionFailure_t *ricSubscriptionFailure = NULLP;
3065 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
3069 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Failure\n");
3071 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3072 if(e2apMsg == NULLP)
3074 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3078 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3079 DU_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3080 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3082 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3085 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
3086 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3087 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure;
3089 ricSubscriptionFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure;
3092 ricSubscriptionFailure->protocolIEs.list.count = elementCnt;
3093 ricSubscriptionFailure->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionFailure_IEs_t *);
3094 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array, ricSubscriptionFailure->protocolIEs.list.size);
3095 if(!ricSubscriptionFailure->protocolIEs.list.array)
3097 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3101 for(elemIdx = 0; elemIdx < elementCnt; elemIdx++)
3103 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array[elemIdx], sizeof(RICsubscriptionFailure_IEs_t));
3104 if(!ricSubscriptionFailure->protocolIEs.list.array[elemIdx])
3106 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d] for IE at index [%d]", \
3107 __func__, __LINE__, elemIdx);
3111 if(elemIdx < elementCnt)
3116 /* RIC Request ID */
3117 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3118 ricSubsFailIe->id = ProtocolIE_IDE2_id_RICrequestID;
3119 ricSubsFailIe->criticality = CriticalityE2_reject;
3120 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID;
3121 ricSubsFailIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3122 ricSubsFailIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3124 /* RAN Function ID */
3125 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3126 ricSubsFailIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3127 ricSubsFailIe->criticality = CriticalityE2_reject;
3128 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID;
3129 ricSubsFailIe->value.choice.RANfunctionID = ranFuncId;
3132 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3133 ricSubsFailIe->id = ProtocolIE_IDE2_id_CauseE2;
3134 ricSubsFailIe->criticality = CriticalityE2_reject;
3135 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_CauseE2;
3136 fillE2Cause(&ricSubsFailIe->value.choice.CauseE2, failureCause);
3138 /* Prints the Msg formed */
3139 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3140 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3142 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3143 if(encRetVal.encoded == ENCODE_FAIL)
3145 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Failure Message (at %s)\n",\
3146 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3151 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Failure Message \n");
3152 #ifdef DEBUG_ASN_PRINT
3153 for(int i=0; i< encBufSize; i++)
3155 printf("%x",encBuf[i]);
3160 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
3162 DU_LOG("\nINFO --> E2AP : Sending RIC Subscription Failure");
3168 FreeRicSubscriptionFailure(e2apMsg);
3172 /*******************************************************************
3174 * @brief Free the RicIndication Message
3178 * Function : FreeRicIndication
3180 * Functionality: Free the RicIndication Message
3185 ******************************************************************/
3186 void FreeRicIndication(E2AP_PDU_t *e2apMsg)
3189 RICindication_t *ricIndicationMsg= NULLP;
3191 if(e2apMsg != NULLP)
3193 if(e2apMsg->choice.initiatingMessage != NULLP)
3195 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
3196 if(ricIndicationMsg!= NULLP)
3198 if(ricIndicationMsg->protocolIEs.list.array != NULLP)
3200 for(idx=0; idx<ricIndicationMsg->protocolIEs.list.count; idx++)
3202 if(ricIndicationMsg->protocolIEs.list.array[idx] != NULLP)
3204 switch(ricIndicationMsg->protocolIEs.list.array[idx]->id)
3206 case ProtocolIE_IDE2_id_RICrequestID:
3207 case ProtocolIE_IDE2_id_RANfunctionID:
3208 case ProtocolIE_IDE2_id_RICactionID:
3209 case ProtocolIE_IDE2_id_RICindicationType:
3212 case ProtocolIE_IDE2_id_RICindicationHeader:
3214 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf,\
3215 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
3218 case ProtocolIE_IDE2_id_RICindicationMessage:
3220 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf,\
3221 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
3227 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx],sizeof(RICindication_IEs_t));
3230 DU_FREE(ricIndicationMsg->protocolIEs.list.array,ricIndicationMsg->protocolIEs.list.size);
3233 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
3235 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3239 /*******************************************************************
3241 * @brief Free measurement record
3245 * Function : freeMeasRecord
3247 * Functionality: Free all measurement recorded for a measurement
3248 * within an action in a RIC subscription
3250 * @param Measurement data to be freed
3253 ******************************************************************/
3254 void freeMeasData(MeasurementData_t *measData)
3256 uint8_t measIdx = 0, measRecIdx = 0;
3257 MeasurementRecord_t *measRecord = NULLP;
3259 if(measData->list.array)
3261 for(measIdx = 0; measIdx < measData->list.count; measIdx++)
3263 if(measData->list.array[measIdx])
3265 measRecord = &measData->list.array[measIdx]->measRecord;
3266 if(measRecord->list.array)
3268 for(measRecIdx = 0; measRecIdx < measRecord->list.count; measRecIdx++)
3270 DU_FREE(measRecord->list.array[measRecIdx], sizeof(MeasurementRecordItem_t));
3272 DU_FREE(measRecord->list.array, measRecord->list.size);
3274 DU_FREE(measData->list.array[measIdx], sizeof(MeasurementDataItem_t));
3277 DU_FREE(measData->list.array, measData->list.size);
3281 /*******************************************************************
3283 * @brief Fill measurement info list
3287 * Function : freeMeasInfoList
3289 * Functionality: Fills all measurement info within an action
3290 * in a RIC subscription
3292 * @param Measurement Info list to be freed
3295 ******************************************************************/
3296 void freeMeasInfoList(MeasurementInfoList_t *measInfoList)
3298 uint8_t measInfoIdx = 0;
3300 if(measInfoList->list.array)
3302 for(measInfoIdx = 0; measInfoIdx < measInfoList->list.count; measInfoIdx++)
3304 if(measInfoList->list.array[measInfoIdx])
3306 DU_FREE(measInfoList->list.array[measInfoIdx]->measType.choice.measName.buf, \
3307 measInfoList->list.array[measInfoIdx]->measType.choice.measName.size);
3309 DU_FREE(measInfoList->list.array[measInfoIdx], measInfoList->list.size);
3312 DU_FREE(measInfoList->list.array, measInfoList->list.size);
3316 /*******************************************************************
3318 * @brief Free E2SM-KPM Indication Message
3322 * Function : FreeE2smKpmIndicationMessage
3324 * Functionality: Free E2SM-KPM Indication Message
3326 * @param E2SM-KPM Indication message to be freed
3329 ******************************************************************/
3330 void FreeE2smKpmIndicationMessage(E2SM_KPM_IndicationMessage_t *e2smKpmIndMsg)
3332 E2SM_KPM_IndicationMessage_Format1_t *format1Msg = NULLP;
3334 switch(e2smKpmIndMsg->indicationMessage_formats.present)
3336 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format1:
3338 if(e2smKpmIndMsg->indicationMessage_formats.choice.indicationMessage_Format1)
3340 format1Msg = e2smKpmIndMsg->indicationMessage_formats.choice.indicationMessage_Format1;
3342 /* Measurement Data */
3343 freeMeasData(&format1Msg->measData);
3345 /* Measurement Info List */
3346 if(format1Msg->measInfoList)
3348 freeMeasInfoList(format1Msg->measInfoList);
3349 DU_FREE(format1Msg->measInfoList, sizeof(MeasurementInfoList_t));
3352 /* Granularity Period */
3353 DU_FREE(format1Msg->granulPeriod, sizeof(GranularityPeriod_t));
3355 DU_FREE(format1Msg, sizeof(E2SM_KPM_IndicationMessage_Format1_t));
3360 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_NOTHING:
3361 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format2:
3367 /*******************************************************************
3369 * @brief Fill measurement record
3373 * Function : fillMeasRecord
3375 * Functionality: Fills all measurement value for a measurement
3376 * within an action in a RIC subscription
3378 * @param Measurement record to be filled
3379 * Measurement database with measurement records
3380 * @return ROK - success
3383 ******************************************************************/
3384 uint8_t fillMeasRecord(MeasurementRecord_t *measRecord, MeasurementInfo *measInfoDb)
3386 uint8_t measRecIdx = 0;
3387 CmLList *measValNode = NULLP;
3390 measRecord->list.count = measInfoDb->measuredValue.count;
3391 measRecord->list.size = measRecord->list.count * sizeof(MeasurementRecordItem_t *);
3393 DU_ALLOC(measRecord->list.array, measRecord->list.size);
3394 if(!measRecord->list.array)
3396 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3400 for(measRecIdx = 0; measRecIdx < measRecord->list.count; measRecIdx++)
3402 DU_ALLOC(measRecord->list.array[measRecIdx], sizeof(MeasurementRecordItem_t));
3403 if(!measRecord->list.array[measRecIdx])
3405 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3411 CM_LLIST_FIRST_NODE(&measInfoDb->measuredValue, measValNode);
3414 measVal = *(double *)measValNode->node;
3415 if(measVal == (int)measVal)
3417 measRecord->list.array[measRecIdx]->present = MeasurementRecordItem_PR_integer;
3418 measRecord->list.array[measRecIdx]->choice.integer = (int)measVal;
3422 measRecord->list.array[measRecIdx]->present = MeasurementRecordItem_PR_real;
3423 measRecord->list.array[measRecIdx]->choice.real = measVal;
3426 measValNode= measValNode->next;
3427 /* Once the measurement record is added to the message, delete it from DB */
3430 deleteMeasuredValueList(&measInfoDb->measuredValue);
3434 /*******************************************************************
3436 * @brief Fills measuerement data
3440 * Function : fillMeasData
3442 * Functionality: Fill all measurement recorded for all measurements
3443 * in an action in a RIC subscription
3445 * @param Measurement data to be filled
3446 * Measurement info list from an action DB
3447 * @return ROK - success
3450 ******************************************************************/
3451 uint8_t fillMeasData(MeasurementData_t *measData, CmLListCp *measInfoListDb)
3453 uint8_t measIdx = 0;
3454 CmLList *measInfoNode = NULLP;
3455 MeasurementInfo *measInfoDb = NULLP;
3456 MeasurementRecord_t *measRecord = NULLP;
3458 measData->list.count = measInfoListDb->count;
3459 measData->list.size = measData->list.count * sizeof(MeasurementDataItem_t *);
3461 DU_ALLOC(measData->list.array, measData->list.size);
3462 if(!measData->list.array)
3464 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3469 CM_LLIST_FIRST_NODE(measInfoListDb, measInfoNode);
3472 measInfoDb = (MeasurementInfo *)measInfoNode->node;
3475 DU_ALLOC(measData->list.array[measIdx], sizeof(MeasurementDataItem_t));
3476 if(!measData->list.array[measIdx])
3478 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3482 measRecord = &measData->list.array[measIdx]->measRecord;
3483 if(fillMeasRecord(measRecord, measInfoDb) != ROK)
3485 DU_LOG("\nERROR --> E2AP : Failed to fill measurement record");
3490 measInfoNode = measInfoNode->next;
3496 /*******************************************************************
3498 * @brief Fill all measurement info
3502 * Function : fillMeasInfoList
3504 * Functionality: Fills all measurement info belonging to an action
3505 * in a RIC subscription
3507 * @param Measurement Info list to be filled
3508 * Measurement Info list from E2AP DB
3509 * @return ROK - success
3512 ******************************************************************/
3513 uint8_t fillMeasInfoList(MeasurementInfoList_t *measInfoList, CmLListCp *measInfoListDb)
3515 uint8_t measInfoIdx = 0;
3516 CmLList *measInfoNode = NULLP;
3517 MeasurementInfo *measInfoDb = NULLP;
3518 MeasurementInfoItem_t *measInfoItem = NULLP;
3520 measInfoList->list.count = measInfoListDb->count;
3521 measInfoList->list.size = measInfoList->list.count * sizeof(MeasurementInfoItem_t *);
3523 DU_ALLOC(measInfoList->list.array, measInfoList->list.size);
3524 if(!measInfoList->list.array)
3526 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3531 CM_LLIST_FIRST_NODE(measInfoListDb, measInfoNode);
3534 DU_ALLOC(measInfoList->list.array[measInfoIdx], sizeof(MeasurementInfoItem_t));
3535 if(!measInfoList->list.array[measInfoIdx])
3537 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3541 measInfoItem = measInfoList->list.array[measInfoIdx];
3542 measInfoDb = (MeasurementInfo *)measInfoNode->node;
3545 /* Measurement Type */
3546 measInfoItem->measType.present = MeasurementType_PR_measName;
3547 measInfoItem->measType.choice.measName.size = strlen(measInfoDb->measurementTypeName);
3549 DU_ALLOC(measInfoItem->measType.choice.measName.buf, measInfoItem->measType.choice.measName.size);
3550 if(!measInfoItem->measType.choice.measName.buf)
3552 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3556 memcpy(measInfoItem->measType.choice.measName.buf, measInfoDb->measurementTypeName,\
3557 measInfoItem->measType.choice.measName.size);
3561 measInfoNode = measInfoNode->next;
3568 /*******************************************************************
3570 * @brief Fill E2SM-KPM Indication Message Format 1
3574 * Function : fillE2smKpmIndMsgFormat1
3576 * Functionality: Fill E2SM-KPM Indication Message Format 1
3578 * @param Format 1 Message to be filled
3579 * Action Definition format 1 from E2AP DB
3580 * @return ROK - success
3583 ******************************************************************/
3584 uint8_t fillE2smKpmIndMsgFormat1(E2SM_KPM_IndicationMessage_Format1_t *format1Msg, ActionDefFormat1 *format1)
3586 /* Measurement Data */
3587 if(fillMeasData(&format1Msg->measData, &format1->measurementInfoList) != ROK)
3589 DU_LOG("\nERROR --> E2AP : Failed to fill measurement data");
3593 /* Measurement Information */
3594 DU_ALLOC(format1Msg->measInfoList, sizeof(MeasurementInfoList_t));
3595 if(!format1Msg->measInfoList)
3597 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3601 if(fillMeasInfoList(format1Msg->measInfoList, &format1->measurementInfoList) != ROK)
3603 DU_LOG("\nERROR --> E2AP : Failed to fill measurement information list");
3607 /* Granularity Period */
3608 DU_ALLOC(format1Msg->granulPeriod, sizeof(GranularityPeriod_t));
3609 if(!format1Msg->granulPeriod)
3611 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3614 *(format1Msg->granulPeriod) = format1->granularityPeriod;
3619 /*******************************************************************
3621 * @brief Fill RIC Indication Message buffer
3625 * Function : fillRicIndMsgBuf
3627 * Functionality: Fill E2SM-KPM Indication Message
3628 * Encode this message and copy to RIC Indication Message buffer
3630 * @param RIC Indication Message buffer to be filled
3631 * Source action info from E2AP DB
3632 * @return ROK - success
3635 ******************************************************************/
3636 uint8_t fillRicIndMsgBuf(RICindicationMessage_t *ricIndMsgBuf, ActionInfo *actionInfo)
3638 uint8_t ret = RFAILED;
3639 bool failedInFormat = false;
3640 E2SM_KPM_IndicationMessage_t e2smKpmIndMsg;
3641 asn_enc_rval_t encRetVal; /* Encoder return value */
3643 memset(&e2smKpmIndMsg, 0, sizeof(E2SM_KPM_IndicationMessage_t));
3647 /* E2SM-KPM Indication message format type */
3648 e2smKpmIndMsg.indicationMessage_formats.present = actionInfo->definition.formatType;
3649 switch(e2smKpmIndMsg.indicationMessage_formats.present)
3651 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format1:
3653 /* E2SM-KPM Indication message format 1 */
3654 DU_ALLOC(e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1, \
3655 sizeof(E2SM_KPM_IndicationMessage_Format1_t));
3656 if(!e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1)
3658 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3659 failedInFormat = true;
3663 if(fillE2smKpmIndMsgFormat1(e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1, \
3664 &actionInfo->definition.choice.format1) != ROK)
3666 DU_LOG("\nERROR --> E2AP : Failed to fill E2SM-KPM Indication message format 1");
3667 failedInFormat = true;
3673 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_NOTHING:
3674 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format2:
3677 DU_LOG("\nERROR --> E2AP : fillRicIndMsgBuf: Only Format 1 supported");
3678 failedInFormat = true;
3686 /* Encode E2SM-KPM Indication Message */
3687 xer_fprint(stdout, &asn_DEF_E2SM_KPM_IndicationMessage, &e2smKpmIndMsg);
3688 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3690 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_IndicationMessage, 0, &e2smKpmIndMsg, PrepFinalEncBuf, encBuf);
3691 if(encRetVal.encoded == ENCODE_FAIL)
3693 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM Indication Message (at %s)\n",\
3694 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3699 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SM-KPM Indication Message \n");
3700 #ifdef DEBUG_ASN_PRINT
3701 for(int i=0; i< encBufSize; i++)
3703 printf("%x",encBuf[i]);
3708 /* Copy encoded string to RIC Indication Message buffer */
3709 ricIndMsgBuf->size = encBufSize;
3710 DU_ALLOC(ricIndMsgBuf->buf, ricIndMsgBuf->size);
3711 if(!ricIndMsgBuf->buf)
3713 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3716 memset(ricIndMsgBuf->buf, 0, ricIndMsgBuf->size);
3717 memcpy(ricIndMsgBuf->buf, encBuf, encBufSize);
3723 /* Free E2SM-KPM Indication Message */
3724 FreeE2smKpmIndicationMessage(&e2smKpmIndMsg);
3729 /*******************************************************************
3731 * @brief Free E2SM-KPM Indication Header
3735 * Function : FreeE2smKpmIndicationHeader
3737 * Functionality: Free E2SM-KPM Indication Header
3739 * @param E2SM-KPM Indication Header to be free
3742 ******************************************************************/
3743 void FreeE2smKpmIndicationHeader(E2SM_KPM_IndicationHeader_t *e2smKpmIndHdr)
3745 E2SM_KPM_IndicationHeader_Format1_t *format1 = NULLP;
3749 switch(e2smKpmIndHdr->indicationHeader_formats.present)
3751 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_indicationHeader_Format1:
3753 if(e2smKpmIndHdr->indicationHeader_formats.choice.indicationHeader_Format1)
3755 format1 = e2smKpmIndHdr->indicationHeader_formats.choice.indicationHeader_Format1;
3757 DU_FREE(format1->colletStartTime.buf, format1->colletStartTime.size);
3758 DU_FREE(format1, sizeof(E2SM_KPM_IndicationHeader_Format1_t));
3762 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_NOTHING:
3769 /*******************************************************************
3771 * @brief Fill RIC Indication Header buffer
3775 * Function : fillRicIndHeader
3777 * Functionality: Fill E2SM-KPM Indication Header
3778 * Encode this message and copy to RIC Indication Header buffer
3780 * @param RIC Indication Header buffer to be filled
3781 * Source RIC subscription info from E2AP DB
3782 * @return ROK - success
3785 ******************************************************************/
3786 uint8_t fillRicIndHeader(RICindicationHeader_t *ricIndHdr, RicSubscription *ricSubsInfo)
3788 uint8_t ret = RFAILED;
3789 uint8_t secBufIdx = 0, milliSecBufIdx = 0;
3791 bool formatFailure = false;
3792 RanFunction *ranFunc = NULLP;
3793 ReportStartTime *startTime = NULLP;
3794 E2SM_KPM_IndicationHeader_t e2smKpmIndHdr;
3795 E2SM_KPM_IndicationHeader_Format1_t *format1 = NULLP;
3796 asn_enc_rval_t encRetVal; /* Encoder return value */
3800 ranFunc = fetchRanFuncFromRanFuncId(ricSubsInfo->ranFuncId);
3801 if(ranFunc == NULLP)
3803 DU_LOG("\nERROR --> E2AP : RAN Function ID [%d] not found", ricSubsInfo->ranFuncId);
3807 memset(&e2smKpmIndHdr, 0, sizeof(E2SM_KPM_IndicationHeader_t));
3809 e2smKpmIndHdr.indicationHeader_formats.present = ranFunc->ricIndicationHeaderFormat;
3810 switch(e2smKpmIndHdr.indicationHeader_formats.present)
3812 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_indicationHeader_Format1:
3814 DU_ALLOC(e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1, \
3815 sizeof(E2SM_KPM_IndicationHeader_Format1_t));
3816 if(!e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1)
3818 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3819 formatFailure = true;
3822 format1 = e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1;
3824 /* Fetch reporting period start time from DB */
3825 switch(ricSubsInfo->eventTriggerDefinition.formatType)
3829 startTime = &ricSubsInfo->eventTriggerDefinition.choice.format1.startTime;
3833 format1->colletStartTime.size = 8 * sizeof(uint8_t);
3834 DU_ALLOC(format1->colletStartTime.buf, format1->colletStartTime.size);
3835 if(!format1->colletStartTime.buf)
3837 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3838 formatFailure = true;
3842 /* As per O-RAN.WG3.E2SM-KPM-R003-v03.00, section 8.3.12 and
3843 * RFC 5905, section 6 :
3844 * Time stamp has a 64-bit format where first 32-bit is seconds
3845 * and next 32-bit is fraction in picosecond-level.
3846 * This fraction has been rounded in microseconds.
3849 * Storing 32-bit seconds at MSB 0-3 and
3850 * 32-bit milliseconds at next 4 bytes i.e. bytes 4-7
3854 for(byteIdx = 3; byteIdx >= 0; byteIdx--)
3856 format1->colletStartTime.buf[secBufIdx++] = startTime->timeInSec >> (8*byteIdx);
3857 format1->colletStartTime.buf[milliSecBufIdx++] = startTime->timeInMilliSec >> (8*byteIdx);
3862 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_NOTHING:
3865 DU_LOG("\nERROR --> E2AP : Only E2SM-KPM Indication Header Format 1 supported");
3866 formatFailure = true;
3874 /* Encode E2SM-KPM Indication Header */
3875 xer_fprint(stdout, &asn_DEF_E2SM_KPM_IndicationHeader, &e2smKpmIndHdr);
3876 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3878 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_IndicationHeader, 0, &e2smKpmIndHdr, PrepFinalEncBuf, encBuf);
3879 if(encRetVal.encoded == ENCODE_FAIL)
3881 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM Indication Header (at %s)\n",\
3882 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3887 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SM-KPM Indication Header \n");
3888 #ifdef DEBUG_ASN_PRINT
3889 for(int i=0; i< encBufSize; i++)
3891 printf("%x",encBuf[i]);
3896 /* Copy encoded string to RIC Indication Header buffer */
3897 ricIndHdr->size = encBufSize;
3898 DU_ALLOC(ricIndHdr->buf, ricIndHdr->size);
3901 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3904 memset(ricIndHdr->buf, 0, ricIndHdr->size);
3905 memcpy(ricIndHdr->buf, encBuf, encBufSize);
3910 /* Free E2SM-KPM Indication Header */
3911 FreeE2smKpmIndicationHeader(&e2smKpmIndHdr);
3916 /*******************************************************************
3918 * brief Fill the RIC Indication Message
3922 * Function : fillRicIndication
3924 * Functionality: Fills the RIC Indication Message
3926 * @param RIC Indication Message to be filled
3927 * RIC Subscription DB
3929 * @return ROK - success
3932 ******************************************************************/
3933 uint8_t fillRicIndication(RICindication_t *ricIndicationMsg, RicSubscription *ricSubscriptionInfo, ActionInfo *actionInfo)
3935 uint8_t elementCnt = 0, idx = 0;
3940 ricIndicationMsg->protocolIEs.list.count = elementCnt;
3941 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_IEs_t *);
3943 /* Initialize the Ric Indication members */
3944 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, ricIndicationMsg->protocolIEs.list.size);
3945 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
3947 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3951 for(idx=0; idx<elementCnt; idx++)
3953 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx], sizeof(RICindication_IEs_t));
3954 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
3956 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3961 /* RIC Request ID */
3963 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
3964 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3965 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICrequestID;
3966 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = \
3967 ricSubscriptionInfo->requestId.requestorId;
3968 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = \
3969 ricSubscriptionInfo->requestId.instanceId;
3971 /* RAN Function ID */
3973 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
3974 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3975 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RANfunctionID;
3976 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ricSubscriptionInfo->ranFuncId;
3980 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
3981 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3982 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICactionID;
3983 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID = actionInfo->actionId;
3985 /* RIC Indication Type */
3987 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
3988 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3989 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationType;
3990 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType = actionInfo->type;
3992 /* RIC Indication Header */
3994 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
3995 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3996 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationHeader;
3997 if(fillRicIndHeader(&ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader, \
3998 ricSubscriptionInfo) != ROK)
4000 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication header");
4004 /* RIC Indication Message */
4006 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
4007 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4008 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationMessage;
4009 if(fillRicIndMsgBuf(&ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage, \
4012 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication Message");
4019 /*******************************************************************
4021 * @brief Builds and Send the RicIndication Message
4025 * Function : BuildAndSendRicIndication
4027 * Functionality:Fills the RicIndication Message
4029 * @return ROK - success
4032 ******************************************************************/
4034 uint8_t BuildAndSendRicIndication(RicSubscription *ricSubscriptionInfo, ActionInfo *actionInfo)
4036 uint8_t ret = RFAILED;
4037 E2AP_PDU_t *e2apMsg = NULLP;
4038 RICindication_t *ricIndicationMsg = NULLP;
4039 asn_enc_rval_t encRetVal; /* Encoder return value */
4043 DU_LOG("\nINFO --> E2AP : Building RIC Indication Message\n");
4045 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4046 if(e2apMsg == NULLP)
4048 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4052 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4053 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4054 if(e2apMsg->choice.initiatingMessage == NULLP)
4056 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4059 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
4060 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4061 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
4063 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
4065 if(fillRicIndication(ricIndicationMsg, ricSubscriptionInfo, actionInfo) != ROK)
4067 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication message");
4071 /* Prints the Msg formed */
4072 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4073 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4075 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4077 if(encRetVal.encoded == ENCODE_FAIL)
4079 DU_LOG("\nERROR --> E2AP : Could not encode RIC Indication Message (at %s)\n",\
4080 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4085 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Indication Message \n");
4086 #ifdef DEBUG_ASN_PRINT
4087 for(int i=0; i< encBufSize; i++)
4089 printf("%x",encBuf[i]);
4094 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
4096 DU_LOG("\nINFO --> E2AP : Sending RIC Indication Message");
4102 FreeRicIndication(e2apMsg);
4106 /*******************************************************************
4108 * @brief free e2 node component configuration req and rsp
4112 * Function : freeE2NodeComponentConfiguration
4115 * - free e2 node component configuration req and rsp
4117 * @params[in] E2nodeComponentConfiguration_t *e2nodeComponentConfiguration
4118 * @return ROK - success
4121 * ****************************************************************/
4123 void freeE2NodeComponentConfiguration(E2nodeComponentConfiguration_t *e2nodeComponentConfiguration)
4125 /* Free E2 Node Component Request Part */
4126 DU_FREE(e2nodeComponentConfiguration->e2nodeComponentRequestPart.buf, e2nodeComponentConfiguration->e2nodeComponentRequestPart.size);
4128 /* Free E2 Node Component Response Part */
4129 DU_FREE(e2nodeComponentConfiguration->e2nodeComponentResponsePart.buf, e2nodeComponentConfiguration->e2nodeComponentResponsePart.size);
4133 /*******************************************************************
4135 * @brief free e2 node component component identifier
4139 * Function : freeE2NodeComponentIdentifier
4142 * - free e2 node component component identifier
4144 * @params[in] E2nodeComponentID_t *componentID
4145 * @return ROK - success
4148 * ****************************************************************/
4150 void freeE2NodeComponentIdentifier(E2nodeComponentID_t *componentID)
4152 if(componentID->choice.e2nodeComponentInterfaceTypeF1)
4154 DU_FREE(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
4155 DU_FREE(componentID->choice.e2nodeComponentInterfaceTypeF1, sizeof(E2nodeComponentInterfaceF1_t));
4160 /*******************************************************************
4162 * @brief Deallocate the memory allocated for E2nodeConfigurationUpdate msg
4166 * Function : FreeE2NodeConfigUpdate
4169 * - freeing the memory allocated for E2nodeConfigurationUpdate
4171 * @params[in] E2AP_PDU_t *e2apMsg
4172 * @return ROK - success
4175 * ****************************************************************/
4177 void FreeE2NodeConfigUpdate(E2AP_PDU_t *e2apMsg)
4179 uint8_t arrIdx =0, e2NodeUpdateListIdx=0, e2NodeRemovalListIdx=0, e2NodeAddListIdx=0;
4180 E2nodeConfigurationUpdate_t *e2NodeConfigUpdate =NULL;
4181 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList =NULL;
4182 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItem =NULL;
4183 E2nodeComponentConfigRemoval_List_t *e2NodeRemovalList =NULL;
4184 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItem =NULL;
4185 E2nodeComponentConfigAddition_List_t *e2NodeAddList =NULL;
4186 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem =NULL;
4188 if(e2apMsg != NULLP)
4190 if(e2apMsg->choice.initiatingMessage != NULLP)
4192 e2NodeConfigUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate;
4193 if(e2NodeConfigUpdate->protocolIEs.list.array != NULLP)
4195 for(arrIdx = 0; arrIdx < e2NodeConfigUpdate->protocolIEs.list.count; arrIdx++)
4197 if(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx])
4200 switch(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id)
4202 case ProtocolIE_IDE2_id_TransactionID:
4205 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
4207 e2NodeAddList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
4208 if(e2NodeAddList->list.array)
4210 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
4212 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[e2NodeAddListIdx];
4214 freeE2NodeComponentConfiguration(&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration);
4215 freeE2NodeComponentIdentifier(&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID);
4216 DU_FREE(e2NodeAddItem, sizeof(E2nodeComponentConfigAddition_ItemIEs_t));
4218 DU_FREE(e2NodeAddList->list.array, e2NodeAddList->list.size);
4222 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
4224 e2NodeUpdateList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdate_List;
4225 if(e2NodeUpdateList->list.array)
4227 for(e2NodeUpdateListIdx = 0; e2NodeUpdateListIdx< e2NodeUpdateList->list.count; e2NodeUpdateListIdx++)
4229 e2NodeUpdateItem = (E2nodeComponentConfigUpdate_ItemIEs_t *) e2NodeUpdateList->list.array[e2NodeUpdateListIdx];
4231 freeE2NodeComponentConfiguration(&e2NodeUpdateItem->value.choice.E2nodeComponentConfigUpdate_Item.e2nodeComponentConfiguration);
4232 freeE2NodeComponentIdentifier(&e2NodeUpdateItem->value.choice.E2nodeComponentConfigUpdate_Item.e2nodeComponentID);
4233 DU_FREE(e2NodeUpdateItem, sizeof(E2nodeComponentConfigUpdate_ItemIEs_t));
4235 DU_FREE(e2NodeUpdateList->list.array, e2NodeUpdateList->list.size);
4239 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
4241 e2NodeRemovalList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemoval_List;
4242 if(e2NodeRemovalList->list.array)
4244 for(e2NodeRemovalListIdx = 0; e2NodeRemovalListIdx< e2NodeRemovalList->list.count; e2NodeRemovalListIdx++)
4246 e2NodeRemovalItem = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemovalList->list.array[e2NodeRemovalListIdx];
4248 freeE2NodeComponentIdentifier(&e2NodeRemovalItem->value.choice.E2nodeComponentConfigRemoval_Item.e2nodeComponentID);
4249 DU_FREE(e2NodeRemovalItem, sizeof(E2nodeComponentConfigRemoval_ItemIEs_t));
4251 DU_FREE(e2NodeRemovalList->list.array, e2NodeRemovalList->list.size);
4259 DU_FREE(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdate_IEs_t));
4262 DU_FREE(e2NodeConfigUpdate->protocolIEs.list.array, e2NodeConfigUpdate->protocolIEs.list.size);
4264 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4266 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4270 /*******************************************************************
4272 * @brief Buld and send the E2 node config update msg
4276 * Function : BuildAndSendE2NodeConfigUpdate
4279 * - Buld and send the E2 node config update msg
4282 * @return ROK - success
4285 * ****************************************************************/
4287 uint8_t BuildAndSendE2NodeConfigUpdate(E2NodeConfigList *e2NodeList)
4289 uint8_t ret = RFAILED;
4290 uint8_t arrIdx = 0,elementCnt = 0, transId=0;
4291 E2AP_PDU_t *e2apMsg = NULLP;
4292 asn_enc_rval_t encRetVal; /* Encoder return value */
4293 E2nodeConfigurationUpdate_t *e2NodeConfigUpdate = NULLP;
4295 DU_LOG("\nINFO --> E2AP : Building E2 Node config update\n");
4298 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4299 if(e2apMsg == NULLP)
4301 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4305 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4306 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4307 if(e2apMsg->choice.initiatingMessage == NULLP)
4309 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4312 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4313 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
4314 e2apMsg->choice.initiatingMessage->value.present = \
4315 InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate;
4316 e2NodeConfigUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate;
4319 if(e2NodeList->addE2NodeCount)
4321 if(e2NodeList->updateE2NodeCount)
4323 if(e2NodeList->removeE2NodeCount)
4326 e2NodeConfigUpdate->protocolIEs.list.count = elementCnt;
4327 e2NodeConfigUpdate->protocolIEs.list.size = elementCnt * sizeof(E2nodeConfigurationUpdate_IEs_t*);
4328 DU_ALLOC(e2NodeConfigUpdate->protocolIEs.list.array, e2NodeConfigUpdate->protocolIEs.list.size);
4329 if(e2NodeConfigUpdate->protocolIEs.list.array == NULLP)
4331 DU_LOG("\nERROR --> E2AP : Memory allocation for e2NodeConfigUpdate failed");
4335 for(arrIdx =0; arrIdx<elementCnt; arrIdx++)
4337 DU_ALLOC(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdate_IEs_t));
4338 if(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx] == NULLP)
4341 DU_LOG("\nERROR --> E2AP : Memory allocation for e2NodeConfigUpdate failed");
4346 if(arrIdx<elementCnt)
4350 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4351 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4352 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_TransactionID;
4353 transId = assignTransactionId();
4354 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
4356 if(e2NodeList->addE2NodeCount)
4359 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition;
4360 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4361 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigAddition_List;
4362 if(BuildE2NodeConfigAddList(&(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List),\
4363 ProcedureCodeE2_id_E2nodeConfigurationUpdate, e2NodeList->addE2NodeCount, e2NodeList->addE2Node)!=ROK)
4365 DU_LOG("\nERROR --> E2AP : Failed to create E2 Node config list");
4370 if(e2NodeList->updateE2NodeCount)
4373 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate;
4374 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4375 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigUpdate_List;
4376 if(BuildE2NodeConfigUpdateList(&e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdate_List,\
4377 e2NodeList->updateE2NodeCount, e2NodeList->updateE2Node) != ROK)
4380 DU_LOG("\nERROR --> E2AP : Failed to update the E2 node configuration");
4385 if(e2NodeList->removeE2NodeCount)
4388 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval;
4389 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4390 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigRemoval_List;
4391 if(BuildE2NodeConfigRemoveList(&e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemoval_List,\
4392 e2NodeList->removeE2NodeCount, e2NodeList->removeE2Node) != ROK)
4395 DU_LOG("\nERROR --> E2AP : Failed to remove the E2 node configuration");
4400 /* Prints the Msg formed */
4401 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4403 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4405 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
4406 if(encRetVal.encoded == ENCODE_FAIL)
4408 DU_LOG("\nERROR --> E2AP : Could not encode E2nodeConfigurationUpdate structure (at %s)\n",\
4409 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4414 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2nodeConfigurationUpdate\n");
4415 #ifdef DEBUG_ASN_PRINT
4416 for(int i=0; i< encBufSize; i++)
4418 printf("%x",encBuf[i]);
4422 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize))
4424 DU_LOG("\nERROR --> E2AP : Sending E2 node config update failed");
4428 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
4429 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
4430 memcpy(&duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.configList, e2NodeList, sizeof(E2NodeConfigList));
4435 FreeE2NodeConfigUpdate(e2apMsg);
4439 /*******************************************************************
4441 * @brief Deallocate the memory allocated for E2ResetRequest msg
4445 * Function : FreeE2ResetRequest
4448 * - freeing the memory allocated for E2ResetRequest
4450 * @params[in] E2AP_PDU_t *e2apMsg
4451 * @return ROK - success
4454 * ****************************************************************/
4455 void FreeE2ResetRequest(E2AP_PDU_t *e2apMsg)
4458 ResetRequestE2_t *resetReq = NULLP;
4460 if(e2apMsg != NULLP)
4462 if(e2apMsg->choice.initiatingMessage != NULLP)
4464 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4465 if(resetReq->protocolIEs.list.array)
4467 for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4469 DU_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4471 DU_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4473 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4475 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4479 /*******************************************************************
4481 * @brief Build and send the E2 reset request msg
4485 * Function : BuildAndSendE2ResetRequest
4488 * - Buld and send the E2 reset request msg to RIC
4491 * @return ROK - success
4494 * ****************************************************************/
4495 uint8_t BuildAndSendE2ResetRequest(E2FailureCause resetCause)
4497 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
4498 uint8_t ret = RFAILED;
4499 E2AP_PDU_t *e2apMsg = NULLP;
4500 ResetRequestE2_t *resetReq = NULLP;
4501 asn_enc_rval_t encRetVal; /* Encoder return value */
4503 DU_LOG("\nINFO --> E2AP : Building E2 Reset Request\n");
4507 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4508 if(e2apMsg == NULLP)
4510 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation for E2AP-PDU failed");
4514 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4515 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4516 if(e2apMsg->choice.initiatingMessage == NULLP)
4518 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation for initiatingMessage");
4522 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
4523 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4524 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
4525 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4528 resetReq->protocolIEs.list.count = elementCnt;
4529 resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
4531 DU_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4532 if(!resetReq->protocolIEs.list.array)
4534 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation failed for \
4535 Reset Request IE array");
4539 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4541 DU_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4542 if(!resetReq->protocolIEs.list.array[ieIdx])
4544 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation failed for \
4545 Reset Request IE array element");
4550 /* In case of failure */
4551 if(ieIdx < elementCnt)
4555 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4556 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
4557 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
4558 transId = assignTransactionId();
4559 resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
4562 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4563 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
4564 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
4565 fillE2Cause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, resetCause);
4567 /* Prints the Msg formed */
4568 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4570 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4572 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4574 if(encRetVal.encoded == ENCODE_FAIL)
4576 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupRequest structure (at %s)\n",\
4577 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4582 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupRequest\n");
4583 #ifdef DEBUG_ASN_PRINT
4584 for(int i=0; i< encBufSize; i++)
4586 printf("%x",encBuf[i]);
4590 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
4592 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
4596 /* In case the message is sent successfully, store the transaction info to
4597 * be used when response is received */
4598 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
4599 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
4605 /* Free all memory */
4606 FreeE2ResetRequest(e2apMsg);
4610 /*******************************************************************
4612 * @brief Deallocate the memory allocated for Reset Response msg
4616 * Function : freeAperDecodingOfE2ResetRsp
4619 * - freeing the memory allocated for Reset response
4621 * @params[in] ResetResponseE2_t *resetResponse
4624 * ****************************************************************/
4625 void freeAperDecodingOfE2ResetRsp(ResetResponseE2_t *resetResponse)
4631 if(resetResponse->protocolIEs.list.array)
4633 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
4635 if(resetResponse->protocolIEs.list.array[ieIdx])
4637 switch(resetResponse->protocolIEs.list.array[ieIdx]->id)
4639 case ProtocolIE_IDE2_id_TransactionID:
4642 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4645 free(resetResponse->protocolIEs.list.array[ieIdx]);
4648 free(resetResponse->protocolIEs.list.array);
4653 /******************************************************************
4655 * @brief Processes E2 Reset Response sent by RIC
4659 * Function : procResetResponse
4661 * Functionality: Processes E2 Reset Response sent by RIC
4663 * @params[in] E2AP_PDU_t ASN decoded E2AP message
4664 * @return ROK - success
4667 * ****************************************************************/
4668 uint8_t procResetResponse(E2AP_PDU_t *e2apMsg)
4670 uint8_t ieIdx =0, transId;
4671 ResetResponseE2_t *resetResponse;
4673 DU_LOG("\nINFO --> E2AP : E2 Reset Response received");
4674 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;;
4676 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
4678 switch(resetResponse->protocolIEs.list.array[ieIdx]->id)
4680 case ProtocolIE_IDE2_id_TransactionID:
4681 transId = resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
4682 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) && \
4683 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
4685 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
4689 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
4693 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4694 /* As per ORAN WG3 E2AP spec v3.0, section 9.2.2
4695 Criticality Diagnostics IE is sent by Near-RT RIC when parts of a received message i.e.
4696 Reset Request in this case, have not been comprehended or were missing, or if the message
4697 contained logical errors.
4699 Processing of this ID should be implemented when negative call flows are to be supported.
4703 DU_LOG("\nERROR --> E2AP : Invalid IE received in E2 Reset Response : %ld",
4704 resetResponse->protocolIEs.list.array[ieIdx]->id);
4709 freeAperDecodingOfE2ResetRsp(resetResponse);
4713 /******************************************************************
4715 * @brief Deallocation of memory allocated by aper decoder for e2 setup Failure
4719 * Function : freeAperDecodingOfE2SetupFailure
4721 * Functionality: Deallocation of memory allocated by aper decoder for e2
4724 * @params[in] E2setupFailure_t *e2SetupFailure;
4727 * ****************************************************************/
4728 void freeAperDecodingOfE2SetupFailure(E2setupFailure_t *e2SetupFailure)
4734 if(e2SetupFailure->protocolIEs.list.array)
4736 for(arrIdx=0; arrIdx<e2SetupFailure->protocolIEs.list.count; arrIdx++)
4738 if(e2SetupFailure->protocolIEs.list.array[arrIdx])
4740 free(e2SetupFailure->protocolIEs.list.array[arrIdx]);
4743 free(e2SetupFailure->protocolIEs.list.array);
4747 /******************************************************************
4749 * @brief Processes E2 Setup Failure sent by RIC
4753 * Function : procE2SetupFailure
4755 * Functionality: Processes E2 Setup failure sent by RIC
4757 * @params[in] E2AP_PDU_t ASN decoded E2AP message
4758 * @return ROK - success
4761 * ****************************************************************/
4762 void procE2SetupFailure(E2AP_PDU_t *e2apMsg)
4764 uint8_t arrIdx =0, transId =0, timerValue=0;
4765 E2setupFailure_t *e2SetupFailure;
4767 DU_LOG("\nINFO --> E2AP : E2 Setup failure received");
4768 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
4770 for(arrIdx=0; arrIdx<e2SetupFailure->protocolIEs.list.count; arrIdx++)
4772 switch(e2SetupFailure->protocolIEs.list.array[arrIdx]->id)
4774 case ProtocolIE_IDE2_id_TransactionID:
4776 transId = e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
4777 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
4778 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
4780 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
4784 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
4789 case ProtocolIE_IDE2_id_TimeToWaitE2:
4791 timerValue = convertE2WaitTimerEnumToValue(e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
4792 if((duChkTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR)) == FALSE)
4794 duStartTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR, timerValue);
4798 DU_LOG("\nERROR --> E2AP : EVENT_E2_SETUP_TMR timer is already running");
4806 freeAperDecodingOfE2SetupFailure(e2SetupFailure);
4808 /******************************************************************
4810 * @brief Deallocation of memory allocated by aper decoder for RIC service Query
4814 * Function : freeAperDecodingOfRicServiceQuery
4816 * Functionality: Deallocation of memory allocated by aper decoder for RIC
4819 * @params[in] RICserviceQuery_t *ricServiceQuery;
4822 * ****************************************************************/
4824 void freeAperDecodingOfRicServiceQuery(RICserviceQuery_t *ricServiceQuery)
4826 uint8_t arrIdx,ranFuncIdx;
4827 RANfunctionsID_List_t *ranFuncAddedList;
4831 if(ricServiceQuery->protocolIEs.list.array)
4833 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
4835 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
4837 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
4839 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
4841 ranFuncAddedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
4842 if(ranFuncAddedList->list.array)
4844 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
4846 free(ranFuncAddedList->list.array[ranFuncIdx]);
4848 free(ranFuncAddedList->list.array);;
4855 free(ricServiceQuery->protocolIEs.list.array[arrIdx]);
4858 free(ricServiceQuery->protocolIEs.list.array);
4862 /*******************************************************************
4864 * @brief Build RanFunction Delete List
4868 * Function : BuildRanFunctionDeleteList
4870 * Functionality: Build RanFunction Delete List
4873 * RANfunctionsID List
4874 * Count of the RAN function
4875 * Received RAN function list
4877 * @return ROK - success
4880 ******************************************************************/
4882 uint8_t BuildRanFunctionDeleteList(RANfunctionsID_List_t *deleteList, uint8_t count, RanFuncInfo *recvdRanFunc)
4884 uint8_t ranFuncIdx=0;
4885 RANfunctionID_ItemIEs_t *delRanFuncItem;
4889 deleteList->list.count = count;
4890 deleteList->list.size = deleteList->list.count * sizeof(RANfunctionID_ItemIEs_t*);
4891 DU_ALLOC(deleteList->list.array, deleteList->list.size);
4892 if(deleteList->list.array == NULLP)
4894 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
4897 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
4899 DU_ALLOC(deleteList->list.array[ranFuncIdx], sizeof(RANfunctionID_ItemIEs_t));
4900 if(deleteList->list.array[ranFuncIdx] == NULLP)
4902 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
4905 delRanFuncItem= (RANfunctionID_ItemIEs_t *) deleteList->list.array[ranFuncIdx];
4906 delRanFuncItem->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
4907 delRanFuncItem->criticality = CriticalityE2_ignore;
4908 delRanFuncItem->value.choice.RANfunctionID_Item.ranFunctionID = recvdRanFunc[ranFuncIdx].id;
4909 delRanFuncItem->value.choice.RANfunctionID_Item.ranFunctionRevision = recvdRanFunc[ranFuncIdx].revisionCounter;
4915 /*******************************************************************
4917 * @brief De Allocate Ric Service Update message
4921 * Function : FreeRicServiceUpdate
4923 * Functionality: De-Allocating Ric Service Update message
4925 * @params[in] E2AP_PDU_t *e2apMsg
4929 * ****************************************************************/
4931 void FreeRicServiceUpdate(E2AP_PDU_t *e2apMsg)
4934 uint8_t ranFuncAddListIdx=0, ranFuncDelIdx=0;
4935 RICserviceUpdate_t *ricServiceUpdate;
4936 RANfunctions_List_t *ranFunctionsList;
4937 RANfunction_ItemIEs_t *ranFuncItemIe;
4938 RANfunction_Item_t *ranFunItem;
4939 RANfunctionsID_List_t *deleteList;
4941 /* De-allocating Memory */
4942 if(e2apMsg != NULLP)
4944 if(e2apMsg->choice.initiatingMessage != NULLP)
4946 ricServiceUpdate = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate;
4947 if(ricServiceUpdate->protocolIEs.list.array != NULLP)
4949 for(arrIdx = 0; arrIdx < ricServiceUpdate->protocolIEs.list.count; arrIdx++)
4951 if(ricServiceUpdate->protocolIEs.list.array[arrIdx] != NULLP)
4953 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
4955 case ProtocolIE_IDE2_id_TransactionID:
4958 case ProtocolIE_IDE2_id_RANfunctionsAdded:
4959 case ProtocolIE_IDE2_id_RANfunctionsModified:
4961 ranFunctionsList = &(ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List);
4962 if(ranFunctionsList->list.array)
4964 for(ranFuncAddListIdx= 0; ranFuncAddListIdx< ranFunctionsList->list.count; ranFuncAddListIdx++)
4966 if(ranFunctionsList->list.array[ranFuncAddListIdx])
4968 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncAddListIdx];
4969 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
4970 DU_FREE(ranFunItem->ranFunctionOID.buf, ranFunItem->ranFunctionOID.size);
4971 DU_FREE(ranFunItem->ranFunctionDefinition.buf, ranFunItem->ranFunctionDefinition.size);
4972 DU_FREE(ranFunctionsList->list.array[ranFuncAddListIdx], sizeof(RANfunction_ItemIEs_t));
4975 DU_FREE(ranFunctionsList->list.array, ranFunctionsList->list.size);
4979 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
4981 deleteList= &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
4982 if(deleteList->list.array)
4984 for(ranFuncDelIdx = 0; ranFuncDelIdx< deleteList->list.count; ranFuncDelIdx++)
4986 DU_FREE(deleteList->list.array[ranFuncDelIdx], sizeof(RANfunctionID_ItemIEs_t));
4988 DU_FREE(deleteList->list.array, deleteList->list.size);
4994 DU_LOG("\nERROR --> E2AP: Invalid event at ricServiceUpdate %ld ",\
4995 (ricServiceUpdate->protocolIEs.list.array[arrIdx]->id));
4998 DU_FREE(ricServiceUpdate->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdate_IEs_t));
5001 DU_FREE(ricServiceUpdate->protocolIEs.list.array, ricServiceUpdate->protocolIEs.list.size);
5003 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5005 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5009 /*******************************************************************
5011 * @brief Builds and Send the RicServiceUpdateuest
5015 * Function : BuildAndSendRicServiceUpdate
5017 * Functionality:Fills the RicServiceUpdateuest
5019 * @return ROK - success
5022 ******************************************************************/
5024 uint8_t BuildAndSendRicServiceUpdate(RicServiceUpdate serviceUpdate)
5026 uint8_t arrIdx = 0, elementCnt=0;
5027 uint8_t transId = 0, ret = RFAILED;
5028 bool memAllocFailed =false;
5029 E2AP_PDU_t *e2apMsg = NULLP;
5030 RICserviceUpdate_t *ricServiceUpdate = NULLP;
5031 asn_enc_rval_t encRetVal; /* Encoder return value */
5033 DU_LOG("\nINFO --> E2AP : Building Ric Service Update\n");
5036 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5037 if(e2apMsg == NULLP)
5039 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
5042 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5043 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5044 if(e2apMsg->choice.initiatingMessage == NULLP)
5046 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
5049 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5050 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
5051 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceUpdate;
5052 ricServiceUpdate = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate;
5054 /* For TransId IE, set elementCnt to 1.
5055 If there is any item in the RAN function add list, RAN function modification list, or RAN function delete list, increment the elementCnt.*/
5058 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5060 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeModified)
5062 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted)
5065 ricServiceUpdate->protocolIEs.list.count = elementCnt;
5066 ricServiceUpdate->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdate_IEs_t*);
5068 /* Initialize the E2Setup members */
5069 DU_ALLOC(ricServiceUpdate->protocolIEs.list.array, ricServiceUpdate->protocolIEs.list.size);
5070 if(ricServiceUpdate->protocolIEs.list.array == NULLP)
5072 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements");
5076 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
5078 DU_ALLOC(ricServiceUpdate->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdate_IEs_t));
5079 if(ricServiceUpdate->protocolIEs.list.array[arrIdx] == NULLP)
5081 memAllocFailed = true;
5082 DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayIdx [%d]", arrIdx);
5086 if(memAllocFailed == true)
5092 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
5093 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5094 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_TransactionID;
5095 if(serviceUpdate.dir == E2_NODE_INITIATED)
5096 transId = assignTransactionId();
5098 transId = serviceUpdate.transId;
5099 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
5101 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5104 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAdded;
5105 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5106 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctions_List;
5107 if(BuildRanFunctionAddList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List,\
5108 e2apMsg->choice.initiatingMessage->procedureCode, serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded, serviceUpdate.recvRanFuncList.ranFunToBeAdded) !=ROK)
5114 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeModified)
5117 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsModified;
5118 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5119 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctions_List;
5120 if(BuildRanFunctionAddList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List,
5121 e2apMsg->choice.initiatingMessage->procedureCode, serviceUpdate.recvRanFuncList.numOfRanFunToBeModified, serviceUpdate.recvRanFuncList.ranFunToBeModified) !=ROK)
5127 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted)
5130 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsDeleted;
5131 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5132 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctionsID_List;
5133 if(BuildRanFunctionDeleteList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List,\
5134 serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted, serviceUpdate.recvRanFuncList.ranFunToBeDeleted) != ROK)
5139 /* Prints the Msg formed */
5140 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5142 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5144 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
5145 if(encRetVal.encoded == ENCODE_FAIL)
5147 DU_LOG("\nERROR --> E2AP : Could not encode RicServiceUpdateuest structure (at %s)\n",\
5148 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5153 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicServiceUpdateuest\n");
5154 #ifdef DEBUG_ASN_PRINT
5155 for(int i=0; i< encBufSize; i++)
5157 printf("%x",encBuf[i]);
5161 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
5163 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
5172 if(serviceUpdate.dir == E2_NODE_INITIATED)
5174 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
5175 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
5179 duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].transactionId = transId;
5180 duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
5182 duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.dir = serviceUpdate.dir;
5183 duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.transId =transId;
5184 memcpy(&duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.recvRanFuncList, &serviceUpdate.recvRanFuncList, sizeof(E2TmpRanFunList));
5186 FreeRicServiceUpdate(e2apMsg);
5189 /******************************************************************
5191 * @brief Processes RIC service Query sent by RIC
5195 * Function : procRicServiceQuery
5197 * Functionality: Processes RIC service Query sent by RIC
5199 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5200 * @return ROK - success
5203 * ****************************************************************/
5205 void procRicServiceQuery(E2AP_PDU_t *e2apMsg)
5208 uint16_t arrIdx =0, ranFuncIdx=0,tmpIdx=0;
5209 uint16_t id,revisionCcounter;
5210 bool tmpArray[MAX_RAN_FUNCTION] = {false};
5211 RICserviceQuery_t *ricServiceQuery=NULL;
5212 RicServiceUpdate ricUpdate;
5213 RANfunctionID_ItemIEs_t *ranFuncAddedItemIe;
5214 RANfunctionsID_List_t *ranFuncAddedList;
5216 DU_LOG("\nINFO --> E2AP : RIC Service Query received");
5217 memset(&ricUpdate, 0, sizeof(RicServiceUpdate));
5218 ricUpdate.dir = RIC_INITIATED;
5219 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
5221 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
5223 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
5225 /* TODO completing in next patch/gerrit */
5226 case ProtocolIE_IDE2_id_TransactionID:
5228 ricUpdate.transId = ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
5232 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5234 ranFuncAddedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
5235 if(ranFuncAddedList->list.array)
5237 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
5239 if(ranFuncAddedList->list.array[ranFuncIdx])
5241 /* Using the RAN function Id, identify the RAN function to be modified or deleted. */
5243 ranFuncAddedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAddedList->list.array[ranFuncIdx];
5244 id = ranFuncAddedItemIe->value.choice.RANfunctionID_Item.ranFunctionID;
5245 revisionCcounter = ranFuncAddedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision;
5247 if((id != duCb.e2apDb.ranFunction[id-1].id))
5249 action = CONFIG_DEL;
5251 else if((id == duCb.e2apDb.ranFunction[id-1].id)&&(revisionCcounter!=duCb.e2apDb.ranFunction[id-1].revisionCounter))
5253 action = CONFIG_MOD;
5256 if(action == CONFIG_DEL)
5258 ricUpdate.recvRanFuncList.ranFunToBeDeleted[ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted].id = id;
5259 ricUpdate.recvRanFuncList.ranFunToBeDeleted[ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted].revisionCounter = revisionCcounter;
5260 ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted++;
5262 else if(action == CONFIG_MOD)
5264 ricUpdate.recvRanFuncList.ranFunToBeModified[ricUpdate.recvRanFuncList.numOfRanFunToBeModified].id = id;
5265 ricUpdate.recvRanFuncList.ranFunToBeModified[ricUpdate.recvRanFuncList.numOfRanFunToBeModified].revisionCounter = revisionCcounter;
5266 ricUpdate.recvRanFuncList.numOfRanFunToBeModified++;
5269 /* If any ID is set to true, it means that the ID has been used in either modification or deletion list.
5270 * Else we will add the IDs into the added list */
5271 tmpArray[id-1] = true;
5280 /* Traversing the whole RAN function list in ducb to check if any new Ran function ids have been added. */
5281 for(arrIdx =0; arrIdx<MAX_RAN_FUNCTION; arrIdx++)
5283 tmpIdx= ricUpdate.recvRanFuncList.numOfRanFunToBeAdded;
5284 if((duCb.e2apDb.ranFunction[arrIdx].id >0)&&(!tmpArray[arrIdx]))
5286 ricUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].id = duCb.e2apDb.ranFunction[arrIdx].id;
5287 ricUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].revisionCounter = duCb.e2apDb.ranFunction[arrIdx].revisionCounter;
5288 ricUpdate.recvRanFuncList.numOfRanFunToBeAdded++;
5292 if(BuildAndSendRicServiceUpdate(ricUpdate)!= ROK)
5294 DU_LOG("\nERROR --> E2AP : Failed to build and send ric service update message");
5297 freeAperDecodingOfRicServiceQuery(ricServiceQuery);
5300 /******************************************************************
5302 * @brief Deallocation of memory allocated by aper decoder for
5303 * RIC service update ack
5307 * Function : freeAperDecodingOfRicServiceUpdateAck
5309 * Functionality: Deallocation of memory allocated by aper decoder
5310 * for RIC service update ack
5312 * @params[in] RICserviceUpdateAck_t *ricServiceAck;
5315 * ****************************************************************/
5317 void freeAperDecodingOfRicServiceUpdateAck(RICserviceUpdateAcknowledge_t *ricServiceAck)
5319 uint8_t arrIdx=0,ranFuncIdx=0;
5320 RANfunctionsID_List_t *ranFuncAddedList=NULL;
5324 if(ricServiceAck->protocolIEs.list.array)
5326 for(arrIdx=0; arrIdx<ricServiceAck->protocolIEs.list.count; arrIdx++)
5328 if(ricServiceAck->protocolIEs.list.array[arrIdx])
5330 switch(ricServiceAck->protocolIEs.list.array[arrIdx]->id)
5332 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5334 ranFuncAddedList= &ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
5335 if(ranFuncAddedList->list.array)
5337 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
5339 free(ranFuncAddedList->list.array[ranFuncIdx]);
5341 free(ranFuncAddedList->list.array);
5348 free(ricServiceAck->protocolIEs.list.array[arrIdx]);
5351 free(ricServiceAck->protocolIEs.list.array);
5356 /******************************************************************
5358 * @brief Processes RIC service update ack sent by RIC
5362 * Function : procRicServiceUpdateAck
5364 * Functionality: Processes RIC service update ack sent by RIC
5366 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5367 * @return ROK - success
5370 * ****************************************************************/
5372 void procRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
5374 uint8_t arrIdx =0, transId =0;
5375 uint16_t id =0, tmpIdx=0, ranFuncIdx=0;
5376 RicServiceUpdate serviceUpdate;
5377 RANfunctionsIDcause_List_t *rejectedList=NULL;
5378 RICserviceUpdateAcknowledge_t *ricServiceAck=NULL;
5379 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
5381 DU_LOG("\nINFO --> E2AP : RIC service update ack received");
5382 memset(&serviceUpdate, 0, sizeof(RicServiceUpdate));
5383 ricServiceAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
5385 for(arrIdx=0; arrIdx<ricServiceAck->protocolIEs.list.count; arrIdx++)
5387 switch(ricServiceAck->protocolIEs.list.array[arrIdx]->id)
5389 case ProtocolIE_IDE2_id_TransactionID:
5391 transId = ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
5392 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
5393 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
5395 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
5397 else if((duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].transactionId == transId) &&\
5398 (duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
5400 memset(&duCb.e2apDb.e2TransInfo.ricInitTransaction[transId], 0, sizeof(E2TransInfo));
5404 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
5410 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5413 case ProtocolIE_IDE2_id_RANfunctionsRejected:
5415 rejectedList= &ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
5416 if(rejectedList->list.array)
5418 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
5420 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)rejectedList->list.array[ranFuncIdx];
5421 id = ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID;
5422 tmpIdx= serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded;
5423 serviceUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].id = duCb.e2apDb.ranFunction[id-1].id;
5424 serviceUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].revisionCounter = duCb.e2apDb.ranFunction[id-1].revisionCounter;
5425 serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded++;
5434 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5436 serviceUpdate.dir = E2_NODE_INITIATED;
5437 BuildAndSendRicServiceUpdate(serviceUpdate);
5439 freeAperDecodingOfRicServiceUpdateAck(ricServiceAck);
5442 /******************************************************************
5444 * @brief Deallocation of memory allocated by aper decoder for
5445 * RIC service update failure
5449 * Function : freeAperDecodingOfRicServiceUpdateFailure
5451 * Functionality: Deallocation of memory allocated by aper decoder
5452 * for RIC service update failure
5454 * @params[in] RICserviceUpdateFailure_t *ricServiceFailure;
5457 * ****************************************************************/
5459 void freeAperDecodingOfRicServiceUpdateFailure(RICserviceUpdateFailure_t *ricServiceFailure)
5463 if(ricServiceFailure)
5465 if(ricServiceFailure->protocolIEs.list.array)
5467 for(arrIdx=0; arrIdx<ricServiceFailure->protocolIEs.list.count; arrIdx++)
5469 if(ricServiceFailure->protocolIEs.list.array[arrIdx])
5471 free(ricServiceFailure->protocolIEs.list.array[arrIdx]);
5474 free(ricServiceFailure->protocolIEs.list.array);
5479 /******************************************************************
5481 * @brief Processes RIC service update failure sent by RIC
5485 * Function : procRicServiceUpdateFailure
5487 * Functionality: Processes RIC service update failure sent by RIC
5489 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5490 * @return ROK - success
5493 * ****************************************************************/
5495 void procRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
5497 uint8_t arrIdx =0, timerValue=0;
5498 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
5500 DU_LOG("\nINFO --> E2AP : RIC service update failure received");
5501 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
5503 for(arrIdx=0; arrIdx<ricServiceFailure->protocolIEs.list.count; arrIdx++)
5505 switch(ricServiceFailure->protocolIEs.list.array[arrIdx]->id)
5507 case ProtocolIE_IDE2_id_TransactionID:
5511 case ProtocolIE_IDE2_id_TimeToWaitE2:
5513 timerValue = convertE2WaitTimerEnumToValue(ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
5514 if((duChkTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer), EVENT_RIC_SERVICE_UPDATE_TMR)) == FALSE)
5516 duStartTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer), EVENT_RIC_SERVICE_UPDATE_TMR, timerValue);
5520 DU_LOG("\nERROR --> E2AP : EVENT_RIC_SERVICE_UPDATE_TMR timer is already running");
5525 case ProtocolIE_IDE2_id_CauseE2:
5532 freeAperDecodingOfRicServiceUpdateFailure(ricServiceFailure);
5535 /******************************************************************
5537 * @brief DU Send E2 Node Configuration Update
5541 * Function : duSendE2NodeConfigurationUpdate
5543 * Functionality: DU Send E2 Node Configuration Update
5545 * @return ROK - success
5548 * ****************************************************************/
5550 uint8_t duSendE2NodeConfigurationUpdate()
5552 E2NodeConfigList e2NodeList;
5553 CmLList *node =NULL;
5554 E2NodeComponent *e2NodeComponentInfo=NULL;
5556 memset(&e2NodeList, 0, sizeof(E2NodeConfigList));
5557 CM_LLIST_FIRST_NODE(&duCb.e2apDb.e2NodeComponentList, node);
5560 e2NodeComponentInfo = (E2NodeComponent*)node->node;
5562 if(e2NodeComponentInfo->componentRequestPart && e2NodeComponentInfo->componentResponsePart)
5564 switch(e2NodeComponentInfo->componentActionType)
5566 case E2_NODE_COMPONENT_ADD:
5568 e2NodeList.addE2Node[e2NodeList.addE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5569 e2NodeList.addE2Node[e2NodeList.addE2NodeCount].actionType = e2NodeComponentInfo->componentActionType;
5570 e2NodeList.removeE2NodeCount++;
5573 case E2_NODE_COMPONENT_UPDATE:
5575 e2NodeList.updateE2Node[e2NodeList.updateE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5576 e2NodeList.updateE2Node[e2NodeList.updateE2NodeCount].actionType = e2NodeComponentInfo->componentActionType;
5577 e2NodeList.updateE2NodeCount++;
5581 case E2_NODE_COMPONENT_DEL:
5583 e2NodeList.removeE2Node[e2NodeList.removeE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5584 e2NodeList.removeE2Node[e2NodeList.removeE2NodeCount].actionType = e2NodeComponentInfo->componentActionType;
5585 e2NodeList.removeE2NodeCount++;
5593 if(BuildAndSendE2NodeConfigUpdate(&e2NodeList) !=ROK)
5595 DU_LOG("\nERROR --> E2AP : Failed to build and send e2 node config update message to RIC_stub");
5601 /*******************************************************************
5603 * @brief Free RIC Subscription Modification Required
5607 * Function : FreeRicSubsModRequired
5609 * Functionality: Freqq RIC Subscription Modification required
5611 * @param E2AP Message PDU to be freed
5614 ******************************************************************/
5615 void FreeRicSubsModRequired(E2AP_PDU_t *e2apMsg)
5617 uint8_t ieIdx = 0, arrIdx = 0;
5618 RICsubscriptionModificationRequired_t *ricSubsModReqd = NULLP;
5619 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
5620 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
5621 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
5625 if(e2apMsg->choice.initiatingMessage)
5627 ricSubsModReqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired;
5628 if(ricSubsModReqd->protocolIEs.list.array)
5630 for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
5632 if(ricSubsModReqd->protocolIEs.list.array[ieIdx])
5634 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5635 switch(ricSubsModReqdIe->id)
5637 case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
5639 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
5640 if(actionToBeModList->list.array)
5642 for(arrIdx = 0; arrIdx < actionToBeModList->list.count; arrIdx++)
5644 DU_FREE(actionToBeModList->list.array[arrIdx], \
5645 sizeof(RICaction_RequiredToBeModified_ItemIEs_t));
5647 DU_FREE(actionToBeModList->list.array, actionToBeModList->list.size);
5652 case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
5654 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
5655 if(actionToBeRmvList->list.array)
5657 for(arrIdx = 0; arrIdx < actionToBeRmvList->list.count; arrIdx++)
5659 DU_FREE(actionToBeRmvList->list.array[arrIdx], \
5660 sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t));
5662 DU_FREE(actionToBeRmvList->list.array, actionToBeRmvList->list.size);
5670 DU_FREE(ricSubsModReqd->protocolIEs.list.array[ieIdx], \
5671 sizeof(RICsubscriptionModificationRequired_IEs_t));
5674 DU_FREE(ricSubsModReqd->protocolIEs.list.array, ricSubsModReqd->protocolIEs.list.size);
5676 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5678 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5682 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
5683 * However, E2SM-KPM supports only RIC Report service.
5684 * Hence there is no subsequent action in RIC subscription that may require modification.
5685 * So commenting the action-modification IEs for the time being
5688 /*******************************************************************
5690 * @brief Fill Action required to be modified list
5694 * Function : FillActionReqdToBeModList
5696 * Functionality: Fill Action required to be modified list
5698 * @param RIC Actions Required To Be Modified List to be filled
5699 * Number of actions to be modified
5700 * RIC Subscription DB
5701 * @return ROK - success
5704 ******************************************************************/
5705 uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *actionToBeModList, uint8_t numActionsMod, \
5706 RicSubscription *ricSubscription)
5708 uint8_t arrIdx = 0, actionIdx = 0;
5709 RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULL;
5711 actionToBeModList->list.count = numActionsMod;
5712 actionToBeModList->list.size = numActionsMod * sizeof(RICaction_RequiredToBeModified_ItemIEs_t *);
5713 DU_ALLOC(actionToBeModList->list.array, actionToBeModList->list.size);
5714 if(!actionToBeModList->list.array)
5716 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
5721 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5723 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD)
5725 DU_ALLOC(actionToBeModList->list.array[arrIdx], sizeof(RICaction_RequiredToBeModified_ItemIEs_t));
5726 if(!actionToBeModList->list.array[arrIdx])
5728 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
5731 actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[arrIdx];
5733 actionToBeMod->id = ProtocolIE_IDE2_id_RICaction_RequiredToBeModified_Item;
5734 actionToBeMod->criticality = CriticalityE2_reject;
5735 actionToBeMod->value.present = \
5736 RICaction_RequiredToBeModified_ItemIEs__value_PR_RICaction_RequiredToBeModified_Item;
5737 actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID = \
5738 ricSubscription->actionSequence[actionIdx].actionId;
5739 actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricTimeToWait = RICtimeToWait_w5ms;
5749 /*******************************************************************
5751 * @brief Fill Action required to be removed list
5755 * Function : FillActionReqdToBeRmvList
5757 * Functionality: Fill Action required to be removed list
5759 * @param RIC Actions Required To Be Removed List to be filled
5760 * Number of actions to be removed
5761 * RIC Subscription DB
5762 * @return ROK - success
5765 ******************************************************************/
5766 uint8_t FillActionReqdToBeRmvList(RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList, uint8_t numActionsRmv, \
5767 RicSubscription *ricSubscription)
5769 uint8_t arrIdx = 0, actionIdx = 0;
5770 RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULL;
5772 actionToBeRmvList->list.count = numActionsRmv;
5773 actionToBeRmvList->list.size = numActionsRmv * sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t *);
5774 DU_ALLOC(actionToBeRmvList->list.array, actionToBeRmvList->list.size);
5775 if(!actionToBeRmvList->list.array)
5777 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5782 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5784 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL)
5786 DU_ALLOC(actionToBeRmvList->list.array[arrIdx], sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t));
5787 if(!actionToBeRmvList->list.array[arrIdx])
5789 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5792 actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[arrIdx];
5794 actionToBeRmv->id = ProtocolIE_IDE2_id_RICaction_RequiredToBeRemoved_Item;
5795 actionToBeRmv->criticality = CriticalityE2_reject;
5796 actionToBeRmv->value.present = \
5797 RICaction_RequiredToBeRemoved_ItemIEs__value_PR_RICaction_RequiredToBeRemoved_Item;
5798 actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID = \
5799 ricSubscription->actionSequence[actionIdx].actionId;
5800 fillE2Cause(&actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.cause, \
5801 ricSubscription->actionSequence[actionIdx].failureCause);
5810 /*******************************************************************
5812 * @brief Fill RIC Subscription Modification Required IEs
5816 * Function : FillRicSubsModRequired
5818 * Functionality: Fill RIC Subscription Modification Required IEs
5820 * @param RIC Subscription Modification Required IEs to be filled
5821 * RIC Subscription DB
5822 * @return ROK - success
5825 ******************************************************************/
5826 uint8_t FillRicSubsModRequired(RICsubscriptionModificationRequired_t *ricSubsModReqd, RicSubscription *ricSubscription)
5828 uint8_t ieIdx = 0, elementCnt=0, actionIdx = 0;
5829 uint8_t numActionsMod = 0, numActionsRmv = 0;
5830 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
5831 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
5833 /* Unused in case of E2SM-KPM */
5835 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
5838 /* Count number of Actions to be modified or deleted */
5839 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5841 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD)
5843 else if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL)
5847 /* Count number of IEs to be added to messages */
5854 ricSubsModReqd->protocolIEs.list.count = elementCnt;
5855 ricSubsModReqd->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRequired_IEs_t *);
5856 DU_ALLOC(ricSubsModReqd->protocolIEs.list.array, ricSubsModReqd->protocolIEs.list.size);
5857 if(!ricSubsModReqd->protocolIEs.list.array)
5859 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5863 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
5865 DU_ALLOC(ricSubsModReqd->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRequired_IEs_t));
5866 if(!ricSubsModReqd->protocolIEs.list.array[ieIdx])
5868 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5873 /* RIC Request ID */
5875 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5876 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICrequestID;
5877 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5878 ricSubsModReqdIe->value.present = RICsubscriptionModificationRequired_IEs__value_PR_RICrequestID;
5879 ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID = ricSubscription->requestId.requestorId;
5880 ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID = ricSubscription->requestId.instanceId;
5882 /* RAN Function ID */
5884 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5885 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RANfunctionID;
5886 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5887 ricSubsModReqdIe->value.present = RICsubscriptionModificationRequired_IEs__value_PR_RANfunctionID;
5888 ricSubsModReqdIe->value.choice.RANfunctionID = ricSubscription->ranFuncId;
5890 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
5891 * However, E2SM-KPM supports only RIC Report service.
5892 * Hence there is no subsequent action in RIC subscription that may require modification.
5893 * So commenting the action-modification IEs for the time being
5896 /* RIC Actions Required to be Modified */
5900 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5901 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List;
5902 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5903 ricSubsModReqdIe->value.present = \
5904 RICsubscriptionModificationRequired_IEs__value_PR_RICactions_RequiredToBeModified_List;
5905 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
5907 if(FillActionReqdToBeModList(actionToBeModList, numActionsMod, ricSubscription) != ROK)
5909 DU_LOG("\nERROR --> E2AP : %s: Failed to fill actions required to be modified list", __func__);
5915 /* RIC Actions Required to be removed */
5919 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5920 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List;
5921 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5922 ricSubsModReqdIe->value.present = \
5923 RICsubscriptionModificationRequired_IEs__value_PR_RICactions_RequiredToBeRemoved_List;
5924 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
5926 if(FillActionReqdToBeRmvList(actionToBeRmvList, numActionsRmv, ricSubscription) != ROK)
5928 DU_LOG("\nERROR --> E2AP : %s: Failed to fill actions required to be removed list", __func__);
5936 /*******************************************************************
5938 * @brief Builds and Send RIC Subscription Modification Required
5943 * Function : BuildAndSendRicSubsModRequired
5945 * Functionality: Builds and Send RIC Subscription Modification
5948 * @param RIC Subscription DB
5949 * @return ROK - success
5952 ******************************************************************/
5953 uint8_t BuildAndSendRicSubsModRequired(RicSubscription *ricSubscription)
5955 uint8_t ret = RFAILED;
5956 E2AP_PDU_t *e2apMsg = NULLP;
5957 RICsubscriptionModificationRequired_t *ricSubsModReqd = NULLP;
5958 asn_enc_rval_t encRetVal; /* Encoder return value */
5960 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Required \n");
5963 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5964 if(e2apMsg == NULLP)
5966 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5970 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5971 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5972 if(e2apMsg->choice.initiatingMessage == NULLP)
5974 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5977 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5978 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
5979 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired;
5981 ricSubsModReqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired;
5983 if(FillRicSubsModRequired(ricSubsModReqd, ricSubscription) != ROK)
5985 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Subscription Modification Required IEs", __func__);
5990 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5992 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5994 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
5995 if(encRetVal.encoded == ENCODE_FAIL)
5997 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Modifiction Required structure (at %s)\n",\
5998 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6003 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Modification Required \n");
6004 #ifdef DEBUG_ASN_PRINT
6005 for(int i=0; i< encBufSize; i++)
6007 printf("%x",encBuf[i]);
6011 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
6013 DU_LOG("\nERROR --> E2AP : Sending RIC Subscription Modification Required failed");
6020 /* Free RIC Subscription modification required */
6021 FreeRicSubsModRequired(e2apMsg);
6025 /*******************************************************************
6027 * @brief Free APER decoding of RIC Subscription Modification Confirm
6031 * Function : freeAperDecodingOfRicSubsModConfirm
6033 * Functionality: Free APER decoding of RIC Subscription
6034 * Modification Confirm
6036 * @param E2AP Message PDU
6039 ******************************************************************/
6040 void freeAperDecodingOfRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
6042 uint8_t ieIdx = 0, arrIdx=0;
6043 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
6044 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
6045 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
6046 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
6047 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
6048 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
6050 if(e2apMsg && e2apMsg->choice.successfulOutcome)
6052 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
6053 if(ricSubsModCfm->protocolIEs.list.array)
6055 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
6057 if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
6059 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
6060 switch(ricSubsModCfmIe->id)
6062 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
6064 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
6065 if(modCfmList->list.array)
6067 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
6069 if(modCfmList->list.array[arrIdx])
6070 free(modCfmList->list.array[arrIdx]);
6072 free(modCfmList->list.array);
6077 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
6079 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
6080 if(modRefusedList->list.array)
6082 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
6084 if(modRefusedList->list.array[arrIdx])
6085 free(modRefusedList->list.array[arrIdx]);
6087 free(modRefusedList->list.array);
6092 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
6094 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
6095 if(rmvCfmList->list.array)
6097 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
6099 if(rmvCfmList->list.array[arrIdx])
6100 free(rmvCfmList->list.array[arrIdx]);
6102 free(rmvCfmList->list.array);
6107 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
6109 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
6110 if(rmvFailList->list.array)
6112 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
6114 if(rmvFailList->list.array[arrIdx])
6115 free(rmvFailList->list.array[arrIdx]);
6117 free(rmvFailList->list.array);
6126 free(ricSubsModCfmIe);
6129 free(ricSubsModCfm->protocolIEs.list.array);
6134 /*******************************************************************
6136 * @brief Process RIC Subscription Modification Confirm Message
6140 * Function : procRicSubscriptionModificationConfirm
6142 * Functionality: Process RIC Subscription Modification Confirm
6143 * Message received from RIC.
6145 * @param E2AP Message PDU
6148 ******************************************************************/
6149 void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg)
6151 uint8_t actionId = 0, ieIdx = 0, arrIdx = 0;
6152 uint16_t ranFuncId = 0;
6153 bool procFailure = false;
6154 RicRequestId ricReqId;
6155 RanFunction *ranFuncDb = NULLP;
6156 CmLList *ricSubsNode = NULLP;
6157 RicSubscription *ricSubsDb = NULLP;
6158 ActionInfo *actionDb = NULLP;
6160 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
6161 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
6163 /* Not used in case of E2SM-KPM */
6165 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
6166 RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
6168 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
6169 RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
6172 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
6173 RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
6175 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
6176 RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
6178 DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Modification Confirm", __func__);
6183 DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__);
6187 if(!e2apMsg->choice.successfulOutcome)
6189 DU_LOG("\nERROR --> E2AP : %s: Successful Outcome in E2AP message is NULL", __func__);
6193 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
6194 if(!ricSubsModCfm->protocolIEs.list.array)
6196 DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__);
6200 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
6202 if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
6204 DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx);
6208 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
6209 switch(ricSubsModCfmIe->id)
6211 case ProtocolIE_IDE2_id_RICrequestID:
6213 memset(&ricReqId, 0, sizeof(RicRequestId));
6214 ricReqId.requestorId = ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID;
6215 ricReqId.instanceId = ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID;
6219 case ProtocolIE_IDE2_id_RANfunctionID:
6221 ranFuncId = ricSubsModCfmIe->value.choice.RANfunctionID;
6222 ranFuncDb = fetchRanFuncFromRanFuncId(ranFuncId);
6225 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%d] not found", __func__, ranFuncId);
6230 ricSubsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
6233 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%d] Instance_ID [%d]",\
6234 __func__, ricReqId.requestorId, ricReqId.instanceId);
6242 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
6243 * However, E2SM-KPM supports only RIC Report service.
6244 * Hence there is no subsequent action in RIC subscription that may require modification.
6245 * So commenting the action-modification IEs for the time being
6248 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
6250 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
6251 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
6253 modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
6254 actionId = modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID;
6256 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6259 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6263 actionDb->action = CONFIG_UNKNOWN;
6264 /* Further handling can be added here in future once the
6265 * use case of this procedure is identified */
6272 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
6274 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
6275 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
6277 modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
6278 actionId = modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID;
6279 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6282 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6286 /* Spec doesnt mention if in case of failure, DU should retry for modify action
6287 * Hence, chaging the action from CONFIG_MOD to CONFIG_UNKNOWN
6289 actionDb->action = CONFIG_UNKNOWN;
6297 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
6299 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
6300 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
6302 rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
6303 actionId = rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID;
6304 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6307 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6311 deleteActionSequence(actionDb);
6313 ricSubsDb->numOfActions--;
6314 /* Further handling can include :
6315 * Deletion of this action from all DU layers
6323 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
6325 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
6326 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
6328 rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
6329 actionId = rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID;
6330 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6333 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6337 actionDb->action = CONFIG_UNKNOWN;
6346 } /* End of switch for Protocol IE Id */
6350 } /* End of for loop for Protocol IE list */
6355 freeAperDecodingOfRicSubsModConfirm(e2apMsg);
6359 /******************************************************************
6360 * @brief Deallocate the memory allocated for E2 Reset Response
6364 * Function : FreeE2ResetResponse
6367 * - freeing the memory allocated for E2ResetResponse
6369 * @params[in] E2AP_PDU_t *e2apMsg
6370 * @return ROK - success
6373 * ****************************************************************/
6374 void FreeE2ResetResponse(E2AP_PDU_t *e2apMsg)
6377 ResetResponseE2_t *resetResponse;
6379 if(e2apMsg != NULLP)
6381 if(e2apMsg->choice.successfulOutcome != NULLP)
6383 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
6384 if(resetResponse->protocolIEs.list.array)
6386 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
6388 if(resetResponse->protocolIEs.list.array[ieIdx])
6390 DU_FREE(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
6393 DU_FREE(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
6396 DU_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6398 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
6402 /*******************************************************************
6404 * @brief Buld and send the E2 Reset Response msg
6408 * Function : BuildAndSendE2ResetResponse
6411 * - Buld and send the E2 Reset Response Message
6413 * @params[in] Trans Id
6414 * @return ROK - success
6417 * ****************************************************************/
6418 uint8_t BuildAndSendResetResponse(uint8_t transId)
6420 uint8_t ieIdx = 0, elementCnt = 0;
6421 uint8_t ret = RFAILED;
6422 E2AP_PDU_t *e2apMsg = NULLP;
6423 ResetResponseE2_t *resetResponse;
6424 asn_enc_rval_t encRetVal; /* Encoder return value */
6426 DU_LOG("\nINFO --> E2AP : Building E2 Reset Response Message\n");
6429 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
6430 if(e2apMsg == NULLP)
6432 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse(): Memory allocation for E2AP-PDU failed");
6435 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
6437 DU_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
6438 if(e2apMsg->choice.successfulOutcome == NULLP)
6440 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
6444 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
6445 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
6446 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_ResetResponseE2;
6447 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
6450 resetResponse->protocolIEs.list.count = elementCnt;
6451 resetResponse->protocolIEs.list.size = elementCnt * sizeof(ResetResponseIEs_t *);
6452 DU_ALLOC(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
6453 if(!resetResponse->protocolIEs.list.array)
6455 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array");
6459 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
6461 DU_ALLOC(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
6462 if(!resetResponse->protocolIEs.list.array[ieIdx])
6464 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array element");
6468 if(ieIdx < elementCnt)
6472 resetResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
6473 resetResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
6474 resetResponse->protocolIEs.list.array[ieIdx]->value.present = ResetResponseIEs__value_PR_TransactionID;
6475 resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
6477 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6479 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6481 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6482 if(encRetVal.encoded == ENCODE_FAIL)
6484 DU_LOG("\nERROR --> E2AP : Could not encode E2 reset response structure (at %s)\n",\
6485 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6490 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Reset Response \n");
6491 for(int i=0; i< encBufSize; i++)
6493 DU_LOG("%x",encBuf[i]);
6498 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
6500 DU_LOG("\nERROR --> E2AP : Failed to send E2 Reset Response");
6508 FreeE2ResetResponse(e2apMsg);
6512 /******************************************************************
6514 * @brief Deallocation of memory allocated by aper decoder for reset req
6518 * Function : freeAperDecodingOfE2ResetReq
6520 * Functionality: Deallocation of memory allocated by aper decoder for
6523 * @params[in] Pointer to resetReq
6526 * ****************************************************************/
6527 void freeAperDecodingOfE2ResetReq(ResetRequestE2_t *resetReq)
6533 if(resetReq->protocolIEs.list.array)
6535 for(arrIdx=0; arrIdx<resetReq->protocolIEs.list.count; arrIdx++)
6537 if(resetReq->protocolIEs.list.array[arrIdx])
6539 free(resetReq->protocolIEs.list.array[arrIdx]);
6542 free(resetReq->protocolIEs.list.array);
6547 /*******************************************************************
6549 * @brief Process reset req received from RIC
6553 * Function : procE2ResetRequest
6555 * Functionality: Process reset req received from RIC
6557 * @param E2AP_PDU_t *e2apMsg
6560 ******************************************************************/
6562 void procE2ResetRequest(E2AP_PDU_t *e2apMsg)
6564 uint16_t ranFuncIdx=0;
6565 uint8_t arrIdx =0, transId =0;
6566 ResetRequestE2_t *resetReq;
6568 DU_LOG("\nINFO --> E2AP : E2 Reset request received");
6569 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
6571 for(arrIdx=0; arrIdx<resetReq->protocolIEs.list.count; arrIdx++)
6573 switch(resetReq->protocolIEs.list.array[arrIdx]->id)
6575 case ProtocolIE_IDE2_id_TransactionID:
6577 transId = resetReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
6581 case ProtocolIE_IDE2_id_CauseE2:
6583 for(ranFuncIdx=0; ranFuncIdx<MAX_RAN_FUNCTION; ranFuncIdx++)
6585 if(duCb.e2apDb.ranFunction[ranFuncIdx].id >0)
6587 deleteRicSubscriptionList(&(duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList));
6588 memset(&(duCb.e2apDb.ranFunction[ranFuncIdx].pendingSubsRspInfo), 0, MAX_PENDING_SUBSCRIPTION_RSP*sizeof(PendingSubsRspInfo));
6595 if(BuildAndSendResetResponse(transId) != ROK)
6597 DU_LOG("\nERROR --> E2AP : Failed to build and send reset response");
6599 freeAperDecodingOfE2ResetReq(resetReq);
6602 /*******************************************************************
6604 * @brief Free APER decoding of RIC Subscription Modification Refuse
6608 * Function : freeAperDecodingOfRicSubsModRefuse
6610 * Functionality: Free APER decoding of RIC Subscription
6611 * Modification Refuse
6613 * @param E2AP Message PDU
6616 ******************************************************************/
6617 void freeAperDecodingOfRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
6620 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
6622 if(e2apMsg && e2apMsg->choice.unsuccessfulOutcome)
6624 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
6625 if(ricSubsModRefuse->protocolIEs.list.array)
6627 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
6629 if(ricSubsModRefuse->protocolIEs.list.array[ieIdx])
6630 free(ricSubsModRefuse->protocolIEs.list.array[ieIdx]);
6632 free(ricSubsModRefuse->protocolIEs.list.array);
6637 /*******************************************************************
6639 * @brief Process RIC Subscription Modification Refuse Message
6643 * Function : procRicSubscriptionModificationRefuse
6645 * Functionality: Process RIC Subscription Modification Refuse
6646 * Message received from RIC.
6648 * @param E2AP Message PDU
6651 ******************************************************************/
6652 void procRicSubscriptionModificationRefuse(E2AP_PDU_t *e2apMsg)
6655 uint16_t ranFuncId = 0;
6656 RicRequestId ricReqId;
6657 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
6658 RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
6659 CauseE2_t *cause = NULLP;
6661 DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Modification Refuse", __func__);
6666 DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__);
6670 if(!e2apMsg->choice.unsuccessfulOutcome)
6672 DU_LOG("\nERROR --> E2AP : %s: Unsuccessful Outcome in E2AP message is NULL", __func__);
6676 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
6677 if(!ricSubsModRefuse->protocolIEs.list.array)
6679 DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__);
6683 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
6685 if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
6687 DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx);
6691 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
6692 switch(ricSubsModRefuseIe->id)
6694 case ProtocolIE_IDE2_id_RICrequestID:
6696 memset(&ricReqId, 0, sizeof(RicRequestId));
6697 ricReqId.requestorId = ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID;
6698 ricReqId.instanceId = ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID;
6702 case ProtocolIE_IDE2_id_RANfunctionID:
6704 ranFuncId = ricSubsModRefuseIe->value.choice.RANfunctionID;
6708 case ProtocolIE_IDE2_id_CauseE2:
6710 DU_LOG("\nDEBUG --> E2AP : %s: RIC subscriptiom modification refused for RIC_Requestor_ID [%d] \
6711 RIC_Instance_ID [%d] RAN_Function_ID [%d] ", __func__, ricReqId.requestorId, \
6712 ricReqId.instanceId, ranFuncId);
6714 cause = &ricSubsModRefuseIe->value.choice.CauseE2;
6715 printE2ErrorCause(cause);
6720 } /* End of switch for Protocol IE Id */
6721 } /* End of for loop for Protocol IE list */
6726 freeAperDecodingOfRicSubsModRefuse(e2apMsg);
6730 /*******************************************************************
6732 * @brief Handles received E2AP message and sends back response
6736 * Function : E2APMsgHdlr
6739 * - Decodes received E2AP control message
6740 * - Prepares response message, encodes and sends to SCTP
6743 * @return ROK - success
6746 * ****************************************************************/
6747 void E2APMsgHdlr(Buffer *mBuf)
6750 char *recvBuf = NULLP;
6752 MsgLen recvBufLen =0;
6753 E2AP_PDU_t *e2apMsg = NULLP;
6754 asn_dec_rval_t rval ={0}; /* Decoder return value */
6755 E2AP_PDU_t e2apasnmsg={0} ;
6757 DU_LOG("\nDEBUG --> E2AP : Received E2AP message buffer");
6758 ODU_PRINT_MSG(mBuf, 0,0);
6760 /* Copy mBuf into char array to decode it */
6761 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
6762 DU_ALLOC(recvBuf, (Size)recvBufLen);
6764 if(recvBuf == NULLP)
6766 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
6769 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6771 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
6775 #ifdef DEBUG_ASN_PRINT
6776 printf("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
6777 for(i=0; i< recvBufLen; i++)
6779 printf("%x",recvBuf[i]);
6783 /* Decoding flat buffer into E2AP messsage */
6784 e2apMsg = &e2apasnmsg;
6785 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
6787 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
6788 DU_FREE(recvBuf, (Size)recvBufLen);
6790 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6792 DU_LOG("\nERROR --> E2AP : ASN decode failed");
6796 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6798 switch(e2apMsg->present)
6800 case E2AP_PDU_PR_unsuccessfulOutcome:
6802 switch(e2apMsg->choice.unsuccessfulOutcome->value.present)
6804 case UnsuccessfulOutcomeE2__value_PR_E2setupFailure:
6806 procE2SetupFailure(e2apMsg);
6809 case UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure:
6811 procE2NodeConfigUpdateFailure(e2apMsg);
6814 case UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure:
6816 procRicServiceUpdateFailure(e2apMsg);
6819 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse:
6821 procRicSubscriptionModificationRefuse(e2apMsg);
6826 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_unsuccessfulOutcome [%d]",\
6827 e2apMsg->choice.unsuccessfulOutcome->value.present);
6831 free(e2apMsg->choice.unsuccessfulOutcome);
6834 case E2AP_PDU_PR_successfulOutcome:
6836 switch(e2apMsg->choice.successfulOutcome->value.present)
6838 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
6842 procE2SetupRsp(e2apMsg);
6846 case SuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateAcknowledge:
6848 DU_LOG("\nDEBUG --> E2AP : E2 node Config update ack message recevied");
6851 case SuccessfulOutcomeE2__value_PR_ResetResponseE2:
6853 procResetResponse(e2apMsg);
6856 case SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge:
6858 procRicServiceUpdateAck(e2apMsg);
6861 case SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm:
6863 procRicSubscriptionModificationConfirm(e2apMsg);
6869 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_successfulOutcome [%d]",\
6870 e2apMsg->choice.successfulOutcome->value.present);
6873 }/* End of switch(successfulOutcome) */
6874 free(e2apMsg->choice.successfulOutcome);
6878 case E2AP_PDU_PR_initiatingMessage:
6880 switch(e2apMsg->choice.initiatingMessage->value.present)
6882 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
6884 procRicSubscriptionRequest(e2apMsg);
6887 case InitiatingMessageE2__value_PR_RICserviceQuery:
6889 procRicServiceQuery(e2apMsg);
6892 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
6894 DU_LOG("\nINFO --> E2AP : Error indication received");
6897 case InitiatingMessageE2__value_PR_ResetRequestE2:
6899 DU_LOG("\nINFO --> E2AP : Error indication received");
6900 procE2ResetRequest(e2apMsg);
6905 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_initiatingMessage [%d]",\
6906 e2apMsg->choice.initiatingMessage->value.present);
6909 }/* End of switch(initiatingMessage) */
6910 free(e2apMsg->choice.initiatingMessage);
6915 DU_LOG("\nERROR --> E2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
6920 }/* End of switch(e2apMsg->present) */
6922 } /* End of E2APMsgHdlr */
6924 /**********************************************************************
6926 **********************************************************************/