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 while(measInfoSubscribedList->count)
2621 measToDelNode = cmLListDelFrm(measInfoSubscribedList, measInfoSubscribedList->first);
2622 measInfoToDel = (MeasurementInfo*)measToDelNode->node;
2623 DU_FREE(measInfoToDel, sizeof(MeasurementInfo));
2624 DU_FREE(measToDelNode, sizeof(CmLList));
2629 } /* End of for loop , traversing measurement-to-be-subscribed list */
2631 /* If all measurement-to-be-subscribed was found in measurement-supported list and
2632 * was added to measurement-subscription list successfully, return from here */
2633 if(measInfoToBeSubscribedList->list.count == measInfoSubscribedList->count)
2639 /*******************************************************************
2641 * @brief Extract E2SM-KPM Action definition
2645 * Function : extractRicActionDef
2647 * Functionality : This function :
2648 * - Decodes E2SM-KPM Action Definition
2649 * - Validates that action is supported by E2 node
2650 * - Stores action details in local DB
2652 * @params[in] RAN Function Database structure
2653 * RIC subscription's Action definition to be added to
2655 * RIC Action Definition buffer received from RIC
2656 * @return ROK - success
2659 ******************************************************************/
2660 uint8_t extractRicActionDef(RanFunction *ranFuncDb, ActionDefinition *actionDefDb, RICactionDefinition_t *ricActionDef,\
2661 E2FailureCause *failureCause)
2663 bool memFailure = false;
2664 uint8_t styleIdx = 0;
2665 asn_dec_rval_t rval ={0};
2667 E2SM_KPM_ActionDefinition_t actionDef, *actionDefPtr = NULLP;
2668 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
2669 CmLListCp *measInfoSupportedList = NULLP;
2670 CmLListCp *measInfoSubscribedList = NULLP;
2672 /* Decoding E2SM-KPM Action Definition */
2673 actionDefPtr = &actionDef;
2674 memset(actionDefPtr, 0, sizeof(E2SM_KPM_EventTriggerDefinition_t));
2676 rval = aper_decode(0, &asn_DEF_E2SM_KPM_ActionDefinition, (void **)&actionDefPtr, ricActionDef->buf,\
2677 ricActionDef->size, 0, 0);
2678 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2680 DU_LOG("\nERROR --> E2AP : ASN decode failed for E2SM-KPM Action Definition");
2681 failureCause->causeType = E2_PROTOCOL;
2682 failureCause->cause = E2_ABSTRACT_SYNTAX_ERROR_FALSELY_CONSTRUCTED_MESSAGE;
2686 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, actionDefPtr);
2689 /* Validate if Report style to subscribe is supported by E2 Node */
2690 for(styleIdx= 0; styleIdx < ranFuncDb->numOfReportStyleSupported; styleIdx++)
2692 /* Validate Report style type and report style format type is supported by E2 Node */
2693 if((ranFuncDb->reportStyleList[styleIdx].reportStyle.styleType == actionDefPtr->ric_Style_Type) &&
2694 (ranFuncDb->reportStyleList[styleIdx].reportStyle.formatType == actionDefPtr->actionDefinition_formats.present))
2696 /* Fetch Report stype type and format type */
2697 actionDefDb->styleType = actionDefPtr->ric_Style_Type;
2698 actionDefDb->formatType = actionDefPtr->actionDefinition_formats.present;
2700 switch(actionDefPtr->actionDefinition_formats.present)
2702 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
2704 actionFormat1 = actionDefPtr->actionDefinition_formats.choice.actionDefinition_Format1;
2706 /* Fetch granularity period */
2707 actionDefDb->choice.format1.granularityPeriod = actionFormat1->granulPeriod;
2709 /* Validate and add the Measurement to subscription list */
2710 measInfoSupportedList = &ranFuncDb->reportStyleList[styleIdx].measurementInfoList;
2711 measInfoSubscribedList = &actionDefDb->choice.format1.measurementInfoList;
2712 if(extractMeasInfoList(measInfoSupportedList, &actionFormat1->measInfoList, \
2713 measInfoSubscribedList, &memFailure) == ROK)
2717 /* Free E2SM_KPM_ActionDefinition_t */
2718 freeAperDecodingOfRicActionDefinition(actionDefPtr);
2723 break; /* End of E2SM-KPM Action definition format 1 case */
2728 DU_LOG("\nERROR -> DUAPP: Only E2SM-KPM Action Definition Format 1 is supported");
2731 } /* End of switch for E2SM-KPM Action definition formats */
2736 failureCause->causeType = E2_MISCELLANEOUS;
2737 failureCause->cause = E2_MISCELLANEOUS_CAUSE_UNSPECIFIED;
2740 } /* End of for loop, traversing Report-styles-supported list in E2 node */
2742 /* Memset action Db and Free E2SM_KPM_ActionDefinition_t */
2743 memset(actionDefDb, 0, sizeof(ActionDefinition));
2744 freeAperDecodingOfRicActionDefinition(actionDefPtr);
2746 if(failureCause->causeType == E2_NOTHING)
2748 failureCause->causeType = E2_RIC_REQUEST;
2749 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2754 /*******************************************************************
2756 * @brief Extract RIC Action to be setup
2760 * Function : extractRicActionToBeSetup
2762 * Functionality : This function :
2763 * - Validates that each action-to-be-setup is supported by E2 node
2764 * - Stores event trigger details in local DB
2766 * @params[in] RAN Function Database structure
2767 * RIC Subscription Info to be added to RAN function
2768 * RIC Action To Be Setup List received from RIC
2769 * @return ROK - success
2772 ******************************************************************/
2773 uint8_t extractRicActionToBeSetup(RanFunction *ranFuncDb, RicSubscription *ricSubscriptionInfo, \
2774 RICactions_ToBeSetup_List_t *actionList, E2FailureCause *failureCause, PendingSubsRspInfo *subsRsp)
2776 uint8_t actionIdx = 0;
2777 uint8_t ricActionId = 0;
2778 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
2780 if(actionList->list.array)
2782 for(actionIdx = 0; actionIdx < actionList->list.count; actionIdx++)
2784 actionItem =(RICaction_ToBeSetup_ItemIEs_t *)actionList->list.array[actionIdx];
2785 switch(actionItem->id)
2787 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
2789 /* If Action type is REPORT and
2790 * If RIC action definition's extraction and validation passes,
2792 * This action is added to action sequence list of subscription info */
2793 ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
2795 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType == RICactionType_report)
2797 ricSubscriptionInfo->actionSequence[ricActionId].actionId = ricActionId;
2798 ricSubscriptionInfo->actionSequence[ricActionId].type = REPORT;
2800 if(extractRicActionDef(ranFuncDb, &ricSubscriptionInfo->actionSequence[ricActionId].definition, \
2801 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, failureCause) == ROK)
2803 ricSubscriptionInfo->actionSequence[ricActionId].action = CONFIG_ADD;
2804 ricSubscriptionInfo->numOfActions++;
2809 /* In case of any failure, action is rejected
2810 * Added to rejected-action-list in subscription response */
2811 memset(&ricSubscriptionInfo->actionSequence[ricActionId], 0, sizeof(ActionInfo));
2812 ricSubscriptionInfo->actionSequence[ricActionId].actionId = -1;
2814 subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].id = ricActionId;
2815 if(failureCause->causeType == E2_NOTHING)
2817 failureCause->causeType = E2_RIC_REQUEST;
2818 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2820 memcpy(&subsRsp->rejectedActionList[subsRsp->numOfRejectedActions].failureCause, \
2821 failureCause, sizeof(E2FailureCause));
2822 subsRsp->numOfRejectedActions++;
2826 DU_LOG("\nERROR --> E2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
2832 /* If there is even 1 action that can be added, return ROK */
2833 if(ricSubscriptionInfo->numOfActions)
2836 if(failureCause->causeType == E2_NOTHING)
2838 failureCause->causeType = E2_RIC_REQUEST;
2839 failureCause->cause = E2_ACTION_NOT_SUPPORTED;
2844 /******************************************************************
2846 * @brief Processes RIC Subscription Req sent by RIC
2850 * Function : procRicSubscriptionRequest
2852 * Functionality: Processes RIC Subscription Request from RIC
2854 * @params[in] E2AP_PDU_t ASN decoded E2AP message
2855 * @return ROK - success
2858 * ****************************************************************/
2859 uint8_t procRicSubscriptionRequest(E2AP_PDU_t *e2apMsg)
2861 uint8_t idx = 0, actionIdx = 0;
2863 uint16_t ranFuncId = 0;
2864 RicRequestId ricReqId;
2865 CmLList *ricSubscriptionNode = NULLP;
2866 RanFunction *ranFuncDb = NULLP;
2867 RICsubscriptionRequest_t *ricSubsReq = NULLP;
2868 RICsubscriptionDetails_t *subsDetails = NULLP;
2869 RicSubscription *ricSubscriptionInfo = NULLP;
2870 E2FailureCause failureCause;
2872 DU_LOG("\nINFO --> E2AP : RIC Subscription request received");
2874 memset(&failureCause, 0, sizeof(E2FailureCause));
2875 memset(&ricReqId, 0, sizeof(RicRequestId));
2877 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
2878 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
2880 if(ricSubsReq->protocolIEs.list.array[idx])
2882 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
2884 case ProtocolIE_IDE2_id_RICrequestID:
2886 ricReqId.requestorId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID;
2887 ricReqId.instanceId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID;
2892 case ProtocolIE_IDE2_id_RANfunctionID:
2894 ranFuncId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID;
2896 /* Validating RAN Function id */
2897 ranFuncDb = fetchRanFuncFromRanFuncId(ranFuncId);
2901 failureCause.causeType = E2_RIC_REQUEST;
2902 failureCause.cause = E2_RAN_FUNCTION_ID_INVALID;
2907 if(ranFuncDb->numPendingSubsRsp >= MAX_PENDING_SUBSCRIPTION_RSP)
2909 failureCause.causeType = E2_RIC_REQUEST;
2910 failureCause.cause = E2_FUNCTION_RESOURCE_LIMIT;
2915 DU_ALLOC(ricSubscriptionInfo, sizeof(RicSubscription));
2916 if(!ricSubscriptionInfo)
2918 DU_LOG("\nERROR --> E2AP : Memory allocation failed for ricSubscriptionInfo");
2919 failureCause.causeType = E2_MISCELLANEOUS;
2920 failureCause.cause = E2_MISCELLANEOUS_CAUSE_UNSPECIFIED;
2924 ricSubscriptionInfo->requestId.requestorId = ricReqId.requestorId;
2925 ricSubscriptionInfo->requestId.instanceId = ricReqId.instanceId;
2926 ricSubscriptionInfo->ranFuncId = ranFuncId;
2928 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
2930 ricSubscriptionInfo->actionSequence[actionIdx].actionId = -1;
2933 memset(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp], 0, sizeof(PendingSubsRspInfo));
2934 memcpy(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp].requestId,
2935 &ricReqId, sizeof(RicRequestId));
2936 ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp].ranFuncId = ranFuncId;
2940 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
2942 subsDetails = &ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails;
2944 /* Decode, Validate and record Event Trigger Definition */
2945 if(extractEventTriggerDef(ranFuncDb, ricSubscriptionInfo, &subsDetails->ricEventTriggerDefinition, \
2946 &failureCause) != ROK)
2952 /* Decode, Validate and record RIC actions */
2953 if(extractRicActionToBeSetup(ranFuncDb, ricSubscriptionInfo, &subsDetails->ricAction_ToBeSetup_List, \
2954 &failureCause, &ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp]) != ROK)
2963 DU_LOG("\nERROR --> E2AP : Invalid IE received in RIC SubsReq:%ld",
2964 ricSubsReq->protocolIEs.list.array[idx]->id);
2973 freeAperDecodingOfRicSubsReq(ricSubsReq);
2977 cmInitTimers(&(ricSubscriptionInfo->ricSubsReportTimer), 1);
2979 /* Add RAN subcription detail to RAN function */
2980 DU_ALLOC(ricSubscriptionNode, sizeof(CmLList));
2981 if(ricSubscriptionNode)
2983 ricSubscriptionNode->node = (PTR) ricSubscriptionInfo;
2984 cmLListAdd2Tail(&ranFuncDb->subscriptionList, ricSubscriptionNode);
2987 ranFuncDb->numPendingSubsRsp++;
2989 #ifdef KPI_CALCULATION
2990 /* Send statistics request to other DU entities */
2991 BuildAndSendStatsReq(ricSubscriptionInfo);
2996 DU_FREE(ricSubscriptionInfo, sizeof(RicSubscription));
3000 memset(&ranFuncDb->pendingSubsRspInfo[ranFuncDb->numPendingSubsRsp], 0, sizeof(PendingSubsRspInfo));
3003 /* Send RIC Subcription Failure */
3004 BuildAndSendRicSubscriptionFailure(ricReqId, ranFuncId, failureCause);
3010 /******************************************************************
3012 * @brief Free RIC Subscription Failure
3016 * Function : FreeRicSubscriptionFailure
3018 * Functionality: Free RIC Subscription Failure
3020 * @params[in] E2AP PDU
3023 * ****************************************************************/
3024 void FreeRicSubscriptionFailure(E2AP_PDU_t *e2apMsg)
3026 uint8_t elemIdx = 0;
3027 RICsubscriptionFailure_t *ricSubscriptionFailure = NULLP;
3031 if(e2apMsg->choice.unsuccessfulOutcome)
3033 ricSubscriptionFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure;
3034 if(ricSubscriptionFailure->protocolIEs.list.array)
3036 for(elemIdx = 0; elemIdx < ricSubscriptionFailure->protocolIEs.list.count; elemIdx++)
3038 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array[elemIdx], sizeof(RICsubscriptionFailure_IEs_t));
3040 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array, ricSubscriptionFailure->protocolIEs.list.size);
3042 DU_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3044 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3048 /******************************************************************
3050 * @brief Fill and Send RIC Subscription Failure to RIC
3054 * Function : BuildAndSendRicSubscriptionFailure
3056 * Functionality: Fill and Send RIC Subscription Failure to RIC
3058 * @params[in] RIC Request ID
3061 * @return ROK - success
3064 * ****************************************************************/
3065 uint8_t BuildAndSendRicSubscriptionFailure(RicRequestId ricReqId, uint16_t ranFuncId, E2FailureCause failureCause)
3067 uint8_t ret = RFAILED;
3068 uint8_t elementCnt = 0, elemIdx = 0;
3069 E2AP_PDU_t *e2apMsg = NULLP;
3070 asn_enc_rval_t encRetVal; /* Encoder return value */
3071 RICsubscriptionFailure_t *ricSubscriptionFailure = NULLP;
3072 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
3076 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Failure\n");
3078 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
3079 if(e2apMsg == NULLP)
3081 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3085 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
3086 DU_ALLOC(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
3087 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
3089 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3092 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
3093 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
3094 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure;
3096 ricSubscriptionFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure;
3099 ricSubscriptionFailure->protocolIEs.list.count = elementCnt;
3100 ricSubscriptionFailure->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionFailure_IEs_t *);
3101 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array, ricSubscriptionFailure->protocolIEs.list.size);
3102 if(!ricSubscriptionFailure->protocolIEs.list.array)
3104 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d]", __func__, __LINE__);
3108 for(elemIdx = 0; elemIdx < elementCnt; elemIdx++)
3110 DU_ALLOC(ricSubscriptionFailure->protocolIEs.list.array[elemIdx], sizeof(RICsubscriptionFailure_IEs_t));
3111 if(!ricSubscriptionFailure->protocolIEs.list.array[elemIdx])
3113 DU_LOG("\nERROR --> E2AP : Memory allocation at [%s] : Line [%d] for IE at index [%d]", \
3114 __func__, __LINE__, elemIdx);
3118 if(elemIdx < elementCnt)
3123 /* RIC Request ID */
3124 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3125 ricSubsFailIe->id = ProtocolIE_IDE2_id_RICrequestID;
3126 ricSubsFailIe->criticality = CriticalityE2_reject;
3127 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID;
3128 ricSubsFailIe->value.choice.RICrequestID.ricRequestorID = ricReqId.requestorId;
3129 ricSubsFailIe->value.choice.RICrequestID.ricInstanceID = ricReqId.instanceId;
3131 /* RAN Function ID */
3132 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3133 ricSubsFailIe->id = ProtocolIE_IDE2_id_RANfunctionID;
3134 ricSubsFailIe->criticality = CriticalityE2_reject;
3135 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID;
3136 ricSubsFailIe->value.choice.RANfunctionID = ranFuncId;
3139 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[elemIdx++];
3140 ricSubsFailIe->id = ProtocolIE_IDE2_id_CauseE2;
3141 ricSubsFailIe->criticality = CriticalityE2_reject;
3142 ricSubsFailIe->value.present = RICsubscriptionFailure_IEs__value_PR_CauseE2;
3143 fillE2Cause(&ricSubsFailIe->value.choice.CauseE2, failureCause);
3145 /* Prints the Msg formed */
3146 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3147 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3149 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
3150 if(encRetVal.encoded == ENCODE_FAIL)
3152 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Failure Message (at %s)\n",\
3153 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3158 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Failure Message \n");
3159 #ifdef DEBUG_ASN_PRINT
3160 for(int i=0; i< encBufSize; i++)
3162 printf("%x",encBuf[i]);
3167 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
3169 DU_LOG("\nINFO --> E2AP : Sending RIC Subscription Failure");
3175 FreeRicSubscriptionFailure(e2apMsg);
3179 /*******************************************************************
3181 * @brief Free the RicIndication Message
3185 * Function : FreeRicIndication
3187 * Functionality: Free the RicIndication Message
3192 ******************************************************************/
3193 void FreeRicIndication(E2AP_PDU_t *e2apMsg)
3196 RICindication_t *ricIndicationMsg= NULLP;
3198 if(e2apMsg != NULLP)
3200 if(e2apMsg->choice.initiatingMessage != NULLP)
3202 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
3203 if(ricIndicationMsg!= NULLP)
3205 if(ricIndicationMsg->protocolIEs.list.array != NULLP)
3207 for(idx=0; idx<ricIndicationMsg->protocolIEs.list.count; idx++)
3209 if(ricIndicationMsg->protocolIEs.list.array[idx] != NULLP)
3211 switch(ricIndicationMsg->protocolIEs.list.array[idx]->id)
3213 case ProtocolIE_IDE2_id_RICrequestID:
3214 case ProtocolIE_IDE2_id_RANfunctionID:
3215 case ProtocolIE_IDE2_id_RICactionID:
3216 case ProtocolIE_IDE2_id_RICindicationType:
3219 case ProtocolIE_IDE2_id_RICindicationHeader:
3221 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf,\
3222 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
3225 case ProtocolIE_IDE2_id_RICindicationMessage:
3227 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf,\
3228 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
3234 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx],sizeof(RICindication_IEs_t));
3237 DU_FREE(ricIndicationMsg->protocolIEs.list.array,ricIndicationMsg->protocolIEs.list.size);
3240 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
3242 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
3246 /*******************************************************************
3248 * @brief Free measurement record
3252 * Function : freeMeasRecord
3254 * Functionality: Free all measurement recorded for a measurement
3255 * within an action in a RIC subscription
3257 * @param Measurement data to be freed
3260 ******************************************************************/
3261 void freeMeasData(MeasurementData_t *measData)
3263 uint8_t measIdx = 0, measRecIdx = 0;
3264 MeasurementRecord_t *measRecord = NULLP;
3266 if(measData->list.array)
3268 for(measIdx = 0; measIdx < measData->list.count; measIdx++)
3270 if(measData->list.array[measIdx])
3272 measRecord = &measData->list.array[measIdx]->measRecord;
3273 if(measRecord->list.array)
3275 for(measRecIdx = 0; measRecIdx < measRecord->list.count; measRecIdx++)
3277 DU_FREE(measRecord->list.array[measRecIdx], sizeof(MeasurementRecordItem_t));
3279 DU_FREE(measRecord->list.array, measRecord->list.size);
3281 DU_FREE(measData->list.array[measIdx], sizeof(MeasurementDataItem_t));
3284 DU_FREE(measData->list.array, measData->list.size);
3288 /*******************************************************************
3290 * @brief Fill measurement info list
3294 * Function : freeMeasInfoList
3296 * Functionality: Fills all measurement info within an action
3297 * in a RIC subscription
3299 * @param Measurement Info list to be freed
3302 ******************************************************************/
3303 void freeMeasInfoList(MeasurementInfoList_t *measInfoList)
3305 uint8_t measInfoIdx = 0;
3307 if(measInfoList->list.array)
3309 for(measInfoIdx = 0; measInfoIdx < measInfoList->list.count; measInfoIdx++)
3311 if(measInfoList->list.array[measInfoIdx])
3313 DU_FREE(measInfoList->list.array[measInfoIdx]->measType.choice.measName.buf, \
3314 measInfoList->list.array[measInfoIdx]->measType.choice.measName.size);
3316 DU_FREE(measInfoList->list.array[measInfoIdx], measInfoList->list.size);
3319 DU_FREE(measInfoList->list.array, measInfoList->list.size);
3323 /*******************************************************************
3325 * @brief Free E2SM-KPM Indication Message
3329 * Function : FreeE2smKpmIndicationMessage
3331 * Functionality: Free E2SM-KPM Indication Message
3333 * @param E2SM-KPM Indication message to be freed
3336 ******************************************************************/
3337 void FreeE2smKpmIndicationMessage(E2SM_KPM_IndicationMessage_t *e2smKpmIndMsg)
3339 E2SM_KPM_IndicationMessage_Format1_t *format1Msg = NULLP;
3341 switch(e2smKpmIndMsg->indicationMessage_formats.present)
3343 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format1:
3345 if(e2smKpmIndMsg->indicationMessage_formats.choice.indicationMessage_Format1)
3347 format1Msg = e2smKpmIndMsg->indicationMessage_formats.choice.indicationMessage_Format1;
3349 /* Measurement Data */
3350 freeMeasData(&format1Msg->measData);
3352 /* Measurement Info List */
3353 if(format1Msg->measInfoList)
3355 freeMeasInfoList(format1Msg->measInfoList);
3356 DU_FREE(format1Msg->measInfoList, sizeof(MeasurementInfoList_t));
3359 /* Granularity Period */
3360 DU_FREE(format1Msg->granulPeriod, sizeof(GranularityPeriod_t));
3362 DU_FREE(format1Msg, sizeof(E2SM_KPM_IndicationMessage_Format1_t));
3367 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_NOTHING:
3368 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format2:
3374 /*******************************************************************
3376 * @brief Fill measurement record
3380 * Function : fillMeasRecord
3382 * Functionality: Fills all measurement value for a measurement
3383 * within an action in a RIC subscription
3385 * @param Measurement record to be filled
3386 * Measurement database with measurement records
3387 * @return ROK - success
3390 ******************************************************************/
3391 uint8_t fillMeasRecord(MeasurementRecord_t *measRecord, MeasurementInfo *measInfoDb)
3393 uint8_t measRecIdx = 0;
3394 CmLList *measValNode = NULLP;
3397 measRecord->list.count = measInfoDb->measuredValue.count;
3398 measRecord->list.size = measRecord->list.count * sizeof(MeasurementRecordItem_t *);
3400 DU_ALLOC(measRecord->list.array, measRecord->list.size);
3401 if(!measRecord->list.array)
3403 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3407 for(measRecIdx = 0; measRecIdx < measRecord->list.count; measRecIdx++)
3409 DU_ALLOC(measRecord->list.array[measRecIdx], sizeof(MeasurementRecordItem_t));
3410 if(!measRecord->list.array[measRecIdx])
3412 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3418 CM_LLIST_FIRST_NODE(&measInfoDb->measuredValue, measValNode);
3421 measVal = *(double *)measValNode->node;
3422 if(measVal == (int)measVal)
3424 measRecord->list.array[measRecIdx]->present = MeasurementRecordItem_PR_integer;
3425 measRecord->list.array[measRecIdx]->choice.integer = (int)measVal;
3429 measRecord->list.array[measRecIdx]->present = MeasurementRecordItem_PR_real;
3430 measRecord->list.array[measRecIdx]->choice.real = measVal;
3434 /* Once the measurement record is added to the message, delete it from DB */
3435 cmLListDelFrm(&measInfoDb->measuredValue, measValNode);
3436 DU_FREE(measValNode->node, sizeof(double));
3437 DU_FREE(measValNode, sizeof(CmLList));
3439 CM_LLIST_FIRST_NODE(&measInfoDb->measuredValue, measValNode);
3446 /*******************************************************************
3448 * @brief Fills measuerement data
3452 * Function : fillMeasData
3454 * Functionality: Fill all measurement recorded for all measurements
3455 * in an action in a RIC subscription
3457 * @param Measurement data to be filled
3458 * Measurement info list from an action DB
3459 * @return ROK - success
3462 ******************************************************************/
3463 uint8_t fillMeasData(MeasurementData_t *measData, CmLListCp *measInfoListDb)
3465 uint8_t measIdx = 0;
3466 CmLList *measInfoNode = NULLP;
3467 MeasurementInfo *measInfoDb = NULLP;
3468 MeasurementRecord_t *measRecord = NULLP;
3470 measData->list.count = measInfoListDb->count;
3471 measData->list.size = measData->list.count * sizeof(MeasurementDataItem_t *);
3473 DU_ALLOC(measData->list.array, measData->list.size);
3474 if(!measData->list.array)
3476 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3481 CM_LLIST_FIRST_NODE(measInfoListDb, measInfoNode);
3484 measInfoDb = (MeasurementInfo *)measInfoNode->node;
3487 DU_ALLOC(measData->list.array[measIdx], sizeof(MeasurementDataItem_t));
3488 if(!measData->list.array[measIdx])
3490 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3494 measRecord = &measData->list.array[measIdx]->measRecord;
3495 if(fillMeasRecord(measRecord, measInfoDb) != ROK)
3497 DU_LOG("\nERROR --> E2AP : Failed to fill measurement record");
3502 measInfoNode = measInfoNode->next;
3508 /*******************************************************************
3510 * @brief Fill all measurement info
3514 * Function : fillMeasInfoList
3516 * Functionality: Fills all measurement info belonging to an action
3517 * in a RIC subscription
3519 * @param Measurement Info list to be filled
3520 * Measurement Info list from E2AP DB
3521 * @return ROK - success
3524 ******************************************************************/
3525 uint8_t fillMeasInfoList(MeasurementInfoList_t *measInfoList, CmLListCp *measInfoListDb)
3527 uint8_t measInfoIdx = 0;
3528 CmLList *measInfoNode = NULLP;
3529 MeasurementInfo *measInfoDb = NULLP;
3530 MeasurementInfoItem_t *measInfoItem = NULLP;
3532 measInfoList->list.count = measInfoListDb->count;
3533 measInfoList->list.size = measInfoList->list.count * sizeof(MeasurementInfoItem_t *);
3535 DU_ALLOC(measInfoList->list.array, measInfoList->list.size);
3536 if(!measInfoList->list.array)
3538 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3543 CM_LLIST_FIRST_NODE(measInfoListDb, measInfoNode);
3546 DU_ALLOC(measInfoList->list.array[measInfoIdx], sizeof(MeasurementInfoItem_t));
3547 if(!measInfoList->list.array[measInfoIdx])
3549 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3553 measInfoItem = measInfoList->list.array[measInfoIdx];
3554 measInfoDb = (MeasurementInfo *)measInfoNode->node;
3557 /* Measurement Type */
3558 measInfoItem->measType.present = MeasurementType_PR_measName;
3559 measInfoItem->measType.choice.measName.size = strlen(measInfoDb->measurementTypeName);
3561 DU_ALLOC(measInfoItem->measType.choice.measName.buf, measInfoItem->measType.choice.measName.size);
3562 if(!measInfoItem->measType.choice.measName.buf)
3564 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3568 memcpy(measInfoItem->measType.choice.measName.buf, measInfoDb->measurementTypeName,\
3569 measInfoItem->measType.choice.measName.size);
3573 measInfoNode = measInfoNode->next;
3580 /*******************************************************************
3582 * @brief Fill E2SM-KPM Indication Message Format 1
3586 * Function : fillE2smKpmIndMsgFormat1
3588 * Functionality: Fill E2SM-KPM Indication Message Format 1
3590 * @param Format 1 Message to be filled
3591 * Action Definition format 1 from E2AP DB
3592 * @return ROK - success
3595 ******************************************************************/
3596 uint8_t fillE2smKpmIndMsgFormat1(E2SM_KPM_IndicationMessage_Format1_t *format1Msg, ActionDefFormat1 *format1)
3598 /* Measurement Data */
3599 if(fillMeasData(&format1Msg->measData, &format1->measurementInfoList) != ROK)
3601 DU_LOG("\nERROR --> E2AP : Failed to fill measurement data");
3605 /* Measurement Information */
3606 DU_ALLOC(format1Msg->measInfoList, sizeof(MeasurementInfoList_t));
3607 if(!format1Msg->measInfoList)
3609 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3613 if(fillMeasInfoList(format1Msg->measInfoList, &format1->measurementInfoList) != ROK)
3615 DU_LOG("\nERROR --> E2AP : Failed to fill measurement information list");
3619 /* Granularity Period */
3620 DU_ALLOC(format1Msg->granulPeriod, sizeof(GranularityPeriod_t));
3621 if(!format1Msg->granulPeriod)
3623 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3626 *(format1Msg->granulPeriod) = format1->granularityPeriod;
3631 /*******************************************************************
3633 * @brief Fill RIC Indication Message buffer
3637 * Function : fillRicIndMsgBuf
3639 * Functionality: Fill E2SM-KPM Indication Message
3640 * Encode this message and copy to RIC Indication Message buffer
3642 * @param RIC Indication Message buffer to be filled
3643 * Source action info from E2AP DB
3644 * @return ROK - success
3647 ******************************************************************/
3648 uint8_t fillRicIndMsgBuf(RICindicationMessage_t *ricIndMsgBuf, ActionInfo *actionInfo)
3650 uint8_t ret = RFAILED;
3651 bool failedInFormat = false;
3652 E2SM_KPM_IndicationMessage_t e2smKpmIndMsg;
3653 asn_enc_rval_t encRetVal; /* Encoder return value */
3655 memset(&e2smKpmIndMsg, 0, sizeof(E2SM_KPM_IndicationMessage_t));
3659 /* E2SM-KPM Indication message format type */
3660 e2smKpmIndMsg.indicationMessage_formats.present = actionInfo->definition.formatType;
3661 switch(e2smKpmIndMsg.indicationMessage_formats.present)
3663 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format1:
3665 /* E2SM-KPM Indication message format 1 */
3666 DU_ALLOC(e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1, \
3667 sizeof(E2SM_KPM_IndicationMessage_Format1_t));
3668 if(!e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1)
3670 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3671 failedInFormat = true;
3675 if(fillE2smKpmIndMsgFormat1(e2smKpmIndMsg.indicationMessage_formats.choice.indicationMessage_Format1, \
3676 &actionInfo->definition.choice.format1) != ROK)
3678 DU_LOG("\nERROR --> E2AP : Failed to fill E2SM-KPM Indication message format 1");
3679 failedInFormat = true;
3685 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_NOTHING:
3686 case E2SM_KPM_IndicationMessage__indicationMessage_formats_PR_indicationMessage_Format2:
3689 DU_LOG("\nERROR --> E2AP : fillRicIndMsgBuf: Only Format 1 supported");
3690 failedInFormat = true;
3698 /* Encode E2SM-KPM Indication Message */
3699 xer_fprint(stdout, &asn_DEF_E2SM_KPM_IndicationMessage, &e2smKpmIndMsg);
3700 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3702 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_IndicationMessage, 0, &e2smKpmIndMsg, PrepFinalEncBuf, encBuf);
3703 if(encRetVal.encoded == ENCODE_FAIL)
3705 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM Indication Message (at %s)\n",\
3706 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3711 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SM-KPM Indication Message \n");
3712 #ifdef DEBUG_ASN_PRINT
3713 for(int i=0; i< encBufSize; i++)
3715 printf("%x",encBuf[i]);
3720 /* Copy encoded string to RIC Indication Message buffer */
3721 ricIndMsgBuf->size = encBufSize;
3722 DU_ALLOC(ricIndMsgBuf->buf, ricIndMsgBuf->size);
3723 if(!ricIndMsgBuf->buf)
3725 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3728 memset(ricIndMsgBuf->buf, 0, ricIndMsgBuf->size);
3729 memcpy(ricIndMsgBuf->buf, encBuf, encBufSize);
3735 /* Free E2SM-KPM Indication Message */
3736 FreeE2smKpmIndicationMessage(&e2smKpmIndMsg);
3741 /*******************************************************************
3743 * @brief Free E2SM-KPM Indication Header
3747 * Function : FreeE2smKpmIndicationHeader
3749 * Functionality: Free E2SM-KPM Indication Header
3751 * @param E2SM-KPM Indication Header to be free
3754 ******************************************************************/
3755 void FreeE2smKpmIndicationHeader(E2SM_KPM_IndicationHeader_t *e2smKpmIndHdr)
3757 E2SM_KPM_IndicationHeader_Format1_t *format1 = NULLP;
3761 switch(e2smKpmIndHdr->indicationHeader_formats.present)
3763 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_indicationHeader_Format1:
3765 if(e2smKpmIndHdr->indicationHeader_formats.choice.indicationHeader_Format1)
3767 format1 = e2smKpmIndHdr->indicationHeader_formats.choice.indicationHeader_Format1;
3769 DU_FREE(format1->colletStartTime.buf, format1->colletStartTime.size);
3770 DU_FREE(format1, sizeof(E2SM_KPM_IndicationHeader_Format1_t));
3774 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_NOTHING:
3781 /*******************************************************************
3783 * @brief Fill RIC Indication Header buffer
3787 * Function : fillRicIndHeader
3789 * Functionality: Fill E2SM-KPM Indication Header
3790 * Encode this message and copy to RIC Indication Header buffer
3792 * @param RIC Indication Header buffer to be filled
3793 * Source RIC subscription info from E2AP DB
3794 * @return ROK - success
3797 ******************************************************************/
3798 uint8_t fillRicIndHeader(RICindicationHeader_t *ricIndHdr, RicSubscription *ricSubsInfo)
3800 uint8_t ret = RFAILED;
3801 uint8_t secBufIdx = 0, milliSecBufIdx = 0;
3803 bool formatFailure = false;
3804 RanFunction *ranFunc = NULLP;
3805 ReportStartTime *startTime = NULLP;
3806 E2SM_KPM_IndicationHeader_t e2smKpmIndHdr;
3807 E2SM_KPM_IndicationHeader_Format1_t *format1 = NULLP;
3808 asn_enc_rval_t encRetVal; /* Encoder return value */
3812 ranFunc = fetchRanFuncFromRanFuncId(ricSubsInfo->ranFuncId);
3813 if(ranFunc == NULLP)
3815 DU_LOG("\nERROR --> E2AP : RAN Function ID [%d] not found", ricSubsInfo->ranFuncId);
3819 memset(&e2smKpmIndHdr, 0, sizeof(E2SM_KPM_IndicationHeader_t));
3821 e2smKpmIndHdr.indicationHeader_formats.present = ranFunc->ricIndicationHeaderFormat;
3822 switch(e2smKpmIndHdr.indicationHeader_formats.present)
3824 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_indicationHeader_Format1:
3826 DU_ALLOC(e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1, \
3827 sizeof(E2SM_KPM_IndicationHeader_Format1_t));
3828 if(!e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1)
3830 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3831 formatFailure = true;
3834 format1 = e2smKpmIndHdr.indicationHeader_formats.choice.indicationHeader_Format1;
3836 /* Fetch reporting period start time from DB */
3837 switch(ricSubsInfo->eventTriggerDefinition.formatType)
3841 startTime = &ricSubsInfo->eventTriggerDefinition.choice.format1.startTime;
3845 format1->colletStartTime.size = 8 * sizeof(uint8_t);
3846 DU_ALLOC(format1->colletStartTime.buf, format1->colletStartTime.size);
3847 if(!format1->colletStartTime.buf)
3849 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3850 formatFailure = true;
3854 /* As per O-RAN.WG3.E2SM-KPM-R003-v03.00, section 8.3.12 and
3855 * RFC 5905, section 6 :
3856 * Time stamp has a 64-bit format where first 32-bit is seconds
3857 * and next 32-bit is fraction in picosecond-level.
3858 * This fraction has been rounded in microseconds.
3861 * Storing 32-bit seconds at MSB 0-3 and
3862 * 32-bit milliseconds at next 4 bytes i.e. bytes 4-7
3866 for(byteIdx = 3; byteIdx >= 0; byteIdx--)
3868 format1->colletStartTime.buf[secBufIdx++] = startTime->timeInSec >> (8*byteIdx);
3869 format1->colletStartTime.buf[milliSecBufIdx++] = startTime->timeInMilliSec >> (8*byteIdx);
3874 case E2SM_KPM_IndicationHeader__indicationHeader_formats_PR_NOTHING:
3877 DU_LOG("\nERROR --> E2AP : Only E2SM-KPM Indication Header Format 1 supported");
3878 formatFailure = true;
3886 /* Encode E2SM-KPM Indication Header */
3887 xer_fprint(stdout, &asn_DEF_E2SM_KPM_IndicationHeader, &e2smKpmIndHdr);
3888 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3890 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_IndicationHeader, 0, &e2smKpmIndHdr, PrepFinalEncBuf, encBuf);
3891 if(encRetVal.encoded == ENCODE_FAIL)
3893 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM Indication Header (at %s)\n",\
3894 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3899 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SM-KPM Indication Header \n");
3900 #ifdef DEBUG_ASN_PRINT
3901 for(int i=0; i< encBufSize; i++)
3903 printf("%x",encBuf[i]);
3908 /* Copy encoded string to RIC Indication Header buffer */
3909 ricIndHdr->size = encBufSize;
3910 DU_ALLOC(ricIndHdr->buf, ricIndHdr->size);
3913 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3916 memset(ricIndHdr->buf, 0, ricIndHdr->size);
3917 memcpy(ricIndHdr->buf, encBuf, encBufSize);
3922 /* Free E2SM-KPM Indication Header */
3923 FreeE2smKpmIndicationHeader(&e2smKpmIndHdr);
3928 /*******************************************************************
3930 * brief Fill the RIC Indication Message
3934 * Function : fillRicIndication
3936 * Functionality: Fills the RIC Indication Message
3938 * @param RIC Indication Message to be filled
3939 * RIC Subscription DB
3941 * @return ROK - success
3944 ******************************************************************/
3945 uint8_t fillRicIndication(RICindication_t *ricIndicationMsg, RicSubscription *ricSubscriptionInfo, ActionInfo *actionInfo)
3947 uint8_t elementCnt = 0, idx = 0;
3952 ricIndicationMsg->protocolIEs.list.count = elementCnt;
3953 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_IEs_t *);
3955 /* Initialize the Ric Indication members */
3956 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, ricIndicationMsg->protocolIEs.list.size);
3957 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
3959 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3963 for(idx=0; idx<elementCnt; idx++)
3965 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx], sizeof(RICindication_IEs_t));
3966 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
3968 DU_LOG("\nERROR --> E2AP : Memory allocation in [%s] at line [%d]", __func__, __LINE__);
3973 /* RIC Request ID */
3975 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
3976 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3977 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICrequestID;
3978 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = \
3979 ricSubscriptionInfo->requestId.requestorId;
3980 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = \
3981 ricSubscriptionInfo->requestId.instanceId;
3983 /* RAN Function ID */
3985 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
3986 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3987 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RANfunctionID;
3988 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ricSubscriptionInfo->ranFuncId;
3992 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
3993 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
3994 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICactionID;
3995 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID = actionInfo->actionId;
3997 /* RIC Indication Type */
3999 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
4000 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4001 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationType;
4002 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType = actionInfo->type;
4004 /* RIC Indication Header */
4006 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
4007 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4008 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationHeader;
4009 if(fillRicIndHeader(&ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader, \
4010 ricSubscriptionInfo) != ROK)
4012 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication header");
4016 /* RIC Indication Message */
4018 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
4019 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
4020 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = RICindication_IEs__value_PR_RICindicationMessage;
4021 if(fillRicIndMsgBuf(&ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage, \
4024 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication Message");
4031 /*******************************************************************
4033 * @brief Builds and Send the RicIndication Message
4037 * Function : BuildAndSendRicIndication
4039 * Functionality:Fills the RicIndication Message
4041 * @return ROK - success
4044 ******************************************************************/
4046 uint8_t BuildAndSendRicIndication(RicSubscription *ricSubscriptionInfo, ActionInfo *actionInfo)
4048 uint8_t ret = RFAILED;
4049 E2AP_PDU_t *e2apMsg = NULLP;
4050 RICindication_t *ricIndicationMsg = NULLP;
4051 asn_enc_rval_t encRetVal; /* Encoder return value */
4055 DU_LOG("\nINFO --> E2AP : Building RIC Indication Message\n");
4057 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4058 if(e2apMsg == NULLP)
4060 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4064 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4065 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4066 if(e2apMsg->choice.initiatingMessage == NULLP)
4068 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4071 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
4072 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4073 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
4075 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
4077 if(fillRicIndication(ricIndicationMsg, ricSubscriptionInfo, actionInfo) != ROK)
4079 DU_LOG("\nERROR --> E2AP : Failed to fill RIC Indication message");
4083 /* Prints the Msg formed */
4084 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4085 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4087 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4089 if(encRetVal.encoded == ENCODE_FAIL)
4091 DU_LOG("\nERROR --> E2AP : Could not encode RIC Indication Message (at %s)\n",\
4092 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4097 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Indication Message \n");
4098 #ifdef DEBUG_ASN_PRINT
4099 for(int i=0; i< encBufSize; i++)
4101 printf("%x",encBuf[i]);
4106 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
4108 DU_LOG("\nINFO --> E2AP : Sending RIC Indication Message");
4114 FreeRicIndication(e2apMsg);
4118 /*******************************************************************
4120 * @brief free e2 node component configuration req and rsp
4124 * Function : freeE2NodeComponentConfiguration
4127 * - free e2 node component configuration req and rsp
4129 * @params[in] E2nodeComponentConfiguration_t *e2nodeComponentConfiguration
4130 * @return ROK - success
4133 * ****************************************************************/
4135 void freeE2NodeComponentConfiguration(E2nodeComponentConfiguration_t *e2nodeComponentConfiguration)
4137 /* Free E2 Node Component Request Part */
4138 DU_FREE(e2nodeComponentConfiguration->e2nodeComponentRequestPart.buf, e2nodeComponentConfiguration->e2nodeComponentRequestPart.size);
4140 /* Free E2 Node Component Response Part */
4141 DU_FREE(e2nodeComponentConfiguration->e2nodeComponentResponsePart.buf, e2nodeComponentConfiguration->e2nodeComponentResponsePart.size);
4145 /*******************************************************************
4147 * @brief free e2 node component component identifier
4151 * Function : freeE2NodeComponentIdentifier
4154 * - free e2 node component component identifier
4156 * @params[in] E2nodeComponentID_t *componentID
4157 * @return ROK - success
4160 * ****************************************************************/
4162 void freeE2NodeComponentIdentifier(E2nodeComponentID_t *componentID)
4164 if(componentID->choice.e2nodeComponentInterfaceTypeF1)
4166 DU_FREE(componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf, componentID->choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
4167 DU_FREE(componentID->choice.e2nodeComponentInterfaceTypeF1, sizeof(E2nodeComponentInterfaceF1_t));
4172 /*******************************************************************
4174 * @brief Deallocate the memory allocated for E2nodeConfigurationUpdate msg
4178 * Function : FreeE2NodeConfigUpdate
4181 * - freeing the memory allocated for E2nodeConfigurationUpdate
4183 * @params[in] E2AP_PDU_t *e2apMsg
4184 * @return ROK - success
4187 * ****************************************************************/
4189 void FreeE2NodeConfigUpdate(E2AP_PDU_t *e2apMsg)
4191 uint8_t arrIdx =0, e2NodeUpdateListIdx=0, e2NodeRemovalListIdx=0, e2NodeAddListIdx=0;
4192 E2nodeConfigurationUpdate_t *e2NodeConfigUpdate =NULL;
4193 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList =NULL;
4194 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItem =NULL;
4195 E2nodeComponentConfigRemoval_List_t *e2NodeRemovalList =NULL;
4196 E2nodeComponentConfigRemoval_ItemIEs_t *e2NodeRemovalItem =NULL;
4197 E2nodeComponentConfigAddition_List_t *e2NodeAddList =NULL;
4198 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem =NULL;
4200 if(e2apMsg != NULLP)
4202 if(e2apMsg->choice.initiatingMessage != NULLP)
4204 e2NodeConfigUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate;
4205 if(e2NodeConfigUpdate->protocolIEs.list.array != NULLP)
4207 for(arrIdx = 0; arrIdx < e2NodeConfigUpdate->protocolIEs.list.count; arrIdx++)
4209 if(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx])
4212 switch(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id)
4214 case ProtocolIE_IDE2_id_TransactionID:
4217 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
4219 e2NodeAddList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
4220 if(e2NodeAddList->list.array)
4222 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
4224 e2NodeAddItem = (E2nodeComponentConfigAddition_ItemIEs_t *) e2NodeAddList->list.array[e2NodeAddListIdx];
4226 freeE2NodeComponentConfiguration(&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentConfiguration);
4227 freeE2NodeComponentIdentifier(&e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID);
4228 DU_FREE(e2NodeAddItem, sizeof(E2nodeComponentConfigAddition_ItemIEs_t));
4230 DU_FREE(e2NodeAddList->list.array, e2NodeAddList->list.size);
4234 case ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate:
4236 e2NodeUpdateList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdate_List;
4237 if(e2NodeUpdateList->list.array)
4239 for(e2NodeUpdateListIdx = 0; e2NodeUpdateListIdx< e2NodeUpdateList->list.count; e2NodeUpdateListIdx++)
4241 e2NodeUpdateItem = (E2nodeComponentConfigUpdate_ItemIEs_t *) e2NodeUpdateList->list.array[e2NodeUpdateListIdx];
4243 freeE2NodeComponentConfiguration(&e2NodeUpdateItem->value.choice.E2nodeComponentConfigUpdate_Item.e2nodeComponentConfiguration);
4244 freeE2NodeComponentIdentifier(&e2NodeUpdateItem->value.choice.E2nodeComponentConfigUpdate_Item.e2nodeComponentID);
4245 DU_FREE(e2NodeUpdateItem, sizeof(E2nodeComponentConfigUpdate_ItemIEs_t));
4247 DU_FREE(e2NodeUpdateList->list.array, e2NodeUpdateList->list.size);
4251 case ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval:
4253 e2NodeRemovalList = &e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemoval_List;
4254 if(e2NodeRemovalList->list.array)
4256 for(e2NodeRemovalListIdx = 0; e2NodeRemovalListIdx< e2NodeRemovalList->list.count; e2NodeRemovalListIdx++)
4258 e2NodeRemovalItem = (E2nodeComponentConfigRemoval_ItemIEs_t *) e2NodeRemovalList->list.array[e2NodeRemovalListIdx];
4260 freeE2NodeComponentIdentifier(&e2NodeRemovalItem->value.choice.E2nodeComponentConfigRemoval_Item.e2nodeComponentID);
4261 DU_FREE(e2NodeRemovalItem, sizeof(E2nodeComponentConfigRemoval_ItemIEs_t));
4263 DU_FREE(e2NodeRemovalList->list.array, e2NodeRemovalList->list.size);
4271 DU_FREE(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdate_IEs_t));
4274 DU_FREE(e2NodeConfigUpdate->protocolIEs.list.array, e2NodeConfigUpdate->protocolIEs.list.size);
4276 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4278 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4282 /*******************************************************************
4284 * @brief Buld and send the E2 node config update msg
4288 * Function : BuildAndSendE2NodeConfigUpdate
4291 * - Buld and send the E2 node config update msg
4294 * @return ROK - success
4297 * ****************************************************************/
4299 uint8_t BuildAndSendE2NodeConfigUpdate(E2NodeConfigList *e2NodeList)
4301 uint8_t ret = RFAILED;
4302 uint8_t arrIdx = 0,elementCnt = 0, transId=0;
4303 E2AP_PDU_t *e2apMsg = NULLP;
4304 asn_enc_rval_t encRetVal; /* Encoder return value */
4305 E2nodeConfigurationUpdate_t *e2NodeConfigUpdate = NULLP;
4307 DU_LOG("\nINFO --> E2AP : Building E2 Node config update\n");
4310 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4311 if(e2apMsg == NULLP)
4313 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4317 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4318 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4319 if(e2apMsg->choice.initiatingMessage == NULLP)
4321 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
4324 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4325 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
4326 e2apMsg->choice.initiatingMessage->value.present = \
4327 InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate;
4328 e2NodeConfigUpdate = &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate;
4331 if(e2NodeList->addE2NodeCount)
4333 if(e2NodeList->updateE2NodeCount)
4335 if(e2NodeList->removeE2NodeCount)
4338 e2NodeConfigUpdate->protocolIEs.list.count = elementCnt;
4339 e2NodeConfigUpdate->protocolIEs.list.size = elementCnt * sizeof(E2nodeConfigurationUpdate_IEs_t*);
4340 DU_ALLOC(e2NodeConfigUpdate->protocolIEs.list.array, e2NodeConfigUpdate->protocolIEs.list.size);
4341 if(e2NodeConfigUpdate->protocolIEs.list.array == NULLP)
4343 DU_LOG("\nERROR --> E2AP : Memory allocation for e2NodeConfigUpdate failed");
4347 for(arrIdx =0; arrIdx<elementCnt; arrIdx++)
4349 DU_ALLOC(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdate_IEs_t));
4350 if(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx] == NULLP)
4353 DU_LOG("\nERROR --> E2AP : Memory allocation for e2NodeConfigUpdate failed");
4358 if(arrIdx<elementCnt)
4362 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4363 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4364 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_TransactionID;
4365 transId = assignTransactionId();
4366 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
4368 if(e2NodeList->addE2NodeCount)
4371 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAddition;
4372 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4373 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigAddition_List;
4374 if(BuildE2NodeConfigAddList(&(e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List),\
4375 ProcedureCodeE2_id_E2nodeConfigurationUpdate, e2NodeList->addE2NodeCount, e2NodeList->addE2Node)!=ROK)
4377 DU_LOG("\nERROR --> E2AP : Failed to create E2 Node config list");
4382 if(e2NodeList->updateE2NodeCount)
4385 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigUpdate;
4386 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4387 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigUpdate_List;
4388 if(BuildE2NodeConfigUpdateList(&e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigUpdate_List,\
4389 e2NodeList->updateE2NodeCount, e2NodeList->updateE2Node) != ROK)
4392 DU_LOG("\nERROR --> E2AP : Failed to update the E2 node configuration");
4397 if(e2NodeList->removeE2NodeCount)
4400 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigRemoval;
4401 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
4402 e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.present = E2nodeConfigurationUpdate_IEs__value_PR_E2nodeComponentConfigRemoval_List;
4403 if(BuildE2NodeConfigRemoveList(&e2NodeConfigUpdate->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigRemoval_List,\
4404 e2NodeList->removeE2NodeCount, e2NodeList->removeE2Node) != ROK)
4407 DU_LOG("\nERROR --> E2AP : Failed to remove the E2 node configuration");
4412 /* Prints the Msg formed */
4413 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4415 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4417 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
4418 if(encRetVal.encoded == ENCODE_FAIL)
4420 DU_LOG("\nERROR --> E2AP : Could not encode E2nodeConfigurationUpdate structure (at %s)\n",\
4421 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4426 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2nodeConfigurationUpdate\n");
4427 #ifdef DEBUG_ASN_PRINT
4428 for(int i=0; i< encBufSize; i++)
4430 printf("%x",encBuf[i]);
4434 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize))
4436 DU_LOG("\nERROR --> E2AP : Sending E2 node config update failed");
4440 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
4441 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
4442 memcpy(&duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.configList, e2NodeList, sizeof(E2NodeConfigList));
4447 FreeE2NodeConfigUpdate(e2apMsg);
4451 /*******************************************************************
4453 * @brief Deallocate the memory allocated for E2ResetRequest msg
4457 * Function : FreeE2ResetRequest
4460 * - freeing the memory allocated for E2ResetRequest
4462 * @params[in] E2AP_PDU_t *e2apMsg
4463 * @return ROK - success
4466 * ****************************************************************/
4467 void FreeE2ResetRequest(E2AP_PDU_t *e2apMsg)
4470 ResetRequestE2_t *resetReq = NULLP;
4472 if(e2apMsg != NULLP)
4474 if(e2apMsg->choice.initiatingMessage != NULLP)
4476 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4477 if(resetReq->protocolIEs.list.array)
4479 for(ieIdx = 0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
4481 DU_FREE(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4483 DU_FREE(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4485 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4487 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
4491 /*******************************************************************
4493 * @brief Build and send the E2 reset request msg
4497 * Function : BuildAndSendE2ResetRequest
4500 * - Buld and send the E2 reset request msg to RIC
4503 * @return ROK - success
4506 * ****************************************************************/
4507 uint8_t BuildAndSendE2ResetRequest(E2FailureCause resetCause)
4509 uint8_t ieIdx = 0, elementCnt = 0, transId = 0;
4510 uint8_t ret = RFAILED;
4511 E2AP_PDU_t *e2apMsg = NULLP;
4512 ResetRequestE2_t *resetReq = NULLP;
4513 asn_enc_rval_t encRetVal; /* Encoder return value */
4515 DU_LOG("\nINFO --> E2AP : Building E2 Reset Request\n");
4519 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
4520 if(e2apMsg == NULLP)
4522 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation for E2AP-PDU failed");
4526 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
4527 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
4528 if(e2apMsg->choice.initiatingMessage == NULLP)
4530 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation for initiatingMessage");
4534 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_Reset;
4535 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
4536 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_ResetRequestE2;
4537 resetReq = &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2;
4540 resetReq->protocolIEs.list.count = elementCnt;
4541 resetReq->protocolIEs.list.size = elementCnt * sizeof(ResetRequestIEs_t *);
4543 DU_ALLOC(resetReq->protocolIEs.list.array, resetReq->protocolIEs.list.size);
4544 if(!resetReq->protocolIEs.list.array)
4546 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation failed for \
4547 Reset Request IE array");
4551 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
4553 DU_ALLOC(resetReq->protocolIEs.list.array[ieIdx], sizeof(ResetRequestIEs_t));
4554 if(!resetReq->protocolIEs.list.array[ieIdx])
4556 DU_LOG("\nERROR --> E2AP : BuildAndSendE2ResetRequest(): Memory allocation failed for \
4557 Reset Request IE array element");
4562 /* In case of failure */
4563 if(ieIdx < elementCnt)
4567 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
4568 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
4569 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_TransactionID;
4570 transId = assignTransactionId();
4571 resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
4574 resetReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_CauseE2;
4575 resetReq->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_ignore;
4576 resetReq->protocolIEs.list.array[ieIdx]->value.present = ResetRequestIEs__value_PR_CauseE2;
4577 fillE2Cause(&resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2, resetCause);
4579 /* Prints the Msg formed */
4580 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
4582 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4584 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
4586 if(encRetVal.encoded == ENCODE_FAIL)
4588 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupRequest structure (at %s)\n",\
4589 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4594 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupRequest\n");
4595 #ifdef DEBUG_ASN_PRINT
4596 for(int i=0; i< encBufSize; i++)
4598 printf("%x",encBuf[i]);
4602 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
4604 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
4608 /* In case the message is sent successfully, store the transaction info to
4609 * be used when response is received */
4610 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
4611 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
4617 /* Free all memory */
4618 FreeE2ResetRequest(e2apMsg);
4622 /*******************************************************************
4624 * @brief Deallocate the memory allocated for Reset Response msg
4628 * Function : freeAperDecodingOfE2ResetRsp
4631 * - freeing the memory allocated for Reset response
4633 * @params[in] ResetResponseE2_t *resetResponse
4636 * ****************************************************************/
4637 void freeAperDecodingOfE2ResetRsp(ResetResponseE2_t *resetResponse)
4643 if(resetResponse->protocolIEs.list.array)
4645 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
4647 if(resetResponse->protocolIEs.list.array[ieIdx])
4649 switch(resetResponse->protocolIEs.list.array[ieIdx]->id)
4651 case ProtocolIE_IDE2_id_TransactionID:
4654 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4657 free(resetResponse->protocolIEs.list.array[ieIdx]);
4660 free(resetResponse->protocolIEs.list.array);
4665 /******************************************************************
4667 * @brief Processes E2 Reset Response sent by RIC
4671 * Function : procResetResponse
4673 * Functionality: Processes E2 Reset Response sent by RIC
4675 * @params[in] E2AP_PDU_t ASN decoded E2AP message
4676 * @return ROK - success
4679 * ****************************************************************/
4680 uint8_t procResetResponse(E2AP_PDU_t *e2apMsg)
4682 uint8_t ieIdx =0, transId;
4683 ResetResponseE2_t *resetResponse;
4685 DU_LOG("\nINFO --> E2AP : E2 Reset Response received");
4686 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;;
4688 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
4690 switch(resetResponse->protocolIEs.list.array[ieIdx]->id)
4692 case ProtocolIE_IDE2_id_TransactionID:
4693 transId = resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
4694 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) && \
4695 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.successfulOutcome->procedureCode))
4697 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
4701 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
4705 case ProtocolIE_IDE2_id_CriticalityDiagnosticsE2:
4706 /* As per ORAN WG3 E2AP spec v3.0, section 9.2.2
4707 Criticality Diagnostics IE is sent by Near-RT RIC when parts of a received message i.e.
4708 Reset Request in this case, have not been comprehended or were missing, or if the message
4709 contained logical errors.
4711 Processing of this ID should be implemented when negative call flows are to be supported.
4715 DU_LOG("\nERROR --> E2AP : Invalid IE received in E2 Reset Response : %ld",
4716 resetResponse->protocolIEs.list.array[ieIdx]->id);
4721 freeAperDecodingOfE2ResetRsp(resetResponse);
4725 /******************************************************************
4727 * @brief Deallocation of memory allocated by aper decoder for e2 setup Failure
4731 * Function : freeAperDecodingOfE2SetupFailure
4733 * Functionality: Deallocation of memory allocated by aper decoder for e2
4736 * @params[in] E2setupFailure_t *e2SetupFailure;
4739 * ****************************************************************/
4740 void freeAperDecodingOfE2SetupFailure(E2setupFailure_t *e2SetupFailure)
4746 if(e2SetupFailure->protocolIEs.list.array)
4748 for(arrIdx=0; arrIdx<e2SetupFailure->protocolIEs.list.count; arrIdx++)
4750 if(e2SetupFailure->protocolIEs.list.array[arrIdx])
4752 free(e2SetupFailure->protocolIEs.list.array[arrIdx]);
4755 free(e2SetupFailure->protocolIEs.list.array);
4759 /******************************************************************
4761 * @brief Processes E2 Setup Failure sent by RIC
4765 * Function : procE2SetupFailure
4767 * Functionality: Processes E2 Setup failure sent by RIC
4769 * @params[in] E2AP_PDU_t ASN decoded E2AP message
4770 * @return ROK - success
4773 * ****************************************************************/
4774 void procE2SetupFailure(E2AP_PDU_t *e2apMsg)
4776 uint8_t arrIdx =0, transId =0, timerValue=0;
4777 E2setupFailure_t *e2SetupFailure;
4779 DU_LOG("\nINFO --> E2AP : E2 Setup failure received");
4780 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
4782 for(arrIdx=0; arrIdx<e2SetupFailure->protocolIEs.list.count; arrIdx++)
4784 switch(e2SetupFailure->protocolIEs.list.array[arrIdx]->id)
4786 case ProtocolIE_IDE2_id_TransactionID:
4788 transId = e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
4789 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
4790 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
4792 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
4796 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
4801 case ProtocolIE_IDE2_id_TimeToWaitE2:
4803 timerValue = convertE2WaitTimerEnumToValue(e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
4804 if((duChkTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR)) == FALSE)
4806 duStartTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), EVENT_E2_SETUP_TMR, timerValue);
4810 DU_LOG("\nERROR --> E2AP : EVENT_E2_SETUP_TMR timer is already running");
4818 freeAperDecodingOfE2SetupFailure(e2SetupFailure);
4820 /******************************************************************
4822 * @brief Deallocation of memory allocated by aper decoder for RIC service Query
4826 * Function : freeAperDecodingOfRicServiceQuery
4828 * Functionality: Deallocation of memory allocated by aper decoder for RIC
4831 * @params[in] RICserviceQuery_t *ricServiceQuery;
4834 * ****************************************************************/
4836 void freeAperDecodingOfRicServiceQuery(RICserviceQuery_t *ricServiceQuery)
4838 uint8_t arrIdx,ranFuncIdx;
4839 RANfunctionsID_List_t *ranFuncAddedList;
4843 if(ricServiceQuery->protocolIEs.list.array)
4845 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
4847 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
4849 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
4851 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
4853 ranFuncAddedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
4854 if(ranFuncAddedList->list.array)
4856 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
4858 free(ranFuncAddedList->list.array[ranFuncIdx]);
4860 free(ranFuncAddedList->list.array);;
4867 free(ricServiceQuery->protocolIEs.list.array[arrIdx]);
4870 free(ricServiceQuery->protocolIEs.list.array);
4874 /*******************************************************************
4876 * @brief Build RanFunction Delete List
4880 * Function : BuildRanFunctionDeleteList
4882 * Functionality: Build RanFunction Delete List
4885 * RANfunctionsID List
4886 * Count of the RAN function
4887 * Received RAN function list
4889 * @return ROK - success
4892 ******************************************************************/
4894 uint8_t BuildRanFunctionDeleteList(RANfunctionsID_List_t *deleteList, uint8_t count, RanFuncInfo *recvdRanFunc)
4896 uint8_t ranFuncIdx=0;
4897 RANfunctionID_ItemIEs_t *delRanFuncItem;
4901 deleteList->list.count = count;
4902 deleteList->list.size = deleteList->list.count * sizeof(RANfunctionID_ItemIEs_t*);
4903 DU_ALLOC(deleteList->list.array, deleteList->list.size);
4904 if(deleteList->list.array == NULLP)
4906 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
4909 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
4911 DU_ALLOC(deleteList->list.array[ranFuncIdx], sizeof(RANfunctionID_ItemIEs_t));
4912 if(deleteList->list.array[ranFuncIdx] == NULLP)
4914 DU_LOG("\nERROR --> E2AP: Memory allocation failed in %s at %d",__func__, __LINE__);
4917 delRanFuncItem= (RANfunctionID_ItemIEs_t *) deleteList->list.array[ranFuncIdx];
4918 delRanFuncItem->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
4919 delRanFuncItem->criticality = CriticalityE2_ignore;
4920 delRanFuncItem->value.choice.RANfunctionID_Item.ranFunctionID = recvdRanFunc[ranFuncIdx].id;
4921 delRanFuncItem->value.choice.RANfunctionID_Item.ranFunctionRevision = recvdRanFunc[ranFuncIdx].revisionCounter;
4927 /*******************************************************************
4929 * @brief De Allocate Ric Service Update message
4933 * Function : FreeRicServiceUpdate
4935 * Functionality: De-Allocating Ric Service Update message
4937 * @params[in] E2AP_PDU_t *e2apMsg
4941 * ****************************************************************/
4943 void FreeRicServiceUpdate(E2AP_PDU_t *e2apMsg)
4946 uint8_t ranFuncAddListIdx=0, ranFuncDelIdx=0;
4947 RICserviceUpdate_t *ricServiceUpdate;
4948 RANfunctions_List_t *ranFunctionsList;
4949 RANfunction_ItemIEs_t *ranFuncItemIe;
4950 RANfunction_Item_t *ranFunItem;
4951 RANfunctionsID_List_t *deleteList;
4953 /* De-allocating Memory */
4954 if(e2apMsg != NULLP)
4956 if(e2apMsg->choice.initiatingMessage != NULLP)
4958 ricServiceUpdate = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate;
4959 if(ricServiceUpdate->protocolIEs.list.array != NULLP)
4961 for(arrIdx = 0; arrIdx < ricServiceUpdate->protocolIEs.list.count; arrIdx++)
4963 if(ricServiceUpdate->protocolIEs.list.array[arrIdx] != NULLP)
4965 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
4967 case ProtocolIE_IDE2_id_TransactionID:
4970 case ProtocolIE_IDE2_id_RANfunctionsAdded:
4971 case ProtocolIE_IDE2_id_RANfunctionsModified:
4973 ranFunctionsList = &(ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List);
4974 if(ranFunctionsList->list.array)
4976 for(ranFuncAddListIdx= 0; ranFuncAddListIdx< ranFunctionsList->list.count; ranFuncAddListIdx++)
4978 if(ranFunctionsList->list.array[ranFuncAddListIdx])
4980 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncAddListIdx];
4981 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
4982 DU_FREE(ranFunItem->ranFunctionOID.buf, ranFunItem->ranFunctionOID.size);
4983 DU_FREE(ranFunItem->ranFunctionDefinition.buf, ranFunItem->ranFunctionDefinition.size);
4984 DU_FREE(ranFunctionsList->list.array[ranFuncAddListIdx], sizeof(RANfunction_ItemIEs_t));
4987 DU_FREE(ranFunctionsList->list.array, ranFunctionsList->list.size);
4991 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
4993 deleteList= &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
4994 if(deleteList->list.array)
4996 for(ranFuncDelIdx = 0; ranFuncDelIdx< deleteList->list.count; ranFuncDelIdx++)
4998 DU_FREE(deleteList->list.array[ranFuncDelIdx], sizeof(RANfunctionID_ItemIEs_t));
5000 DU_FREE(deleteList->list.array, deleteList->list.size);
5006 DU_LOG("\nERROR --> E2AP: Invalid event at ricServiceUpdate %ld ",\
5007 (ricServiceUpdate->protocolIEs.list.array[arrIdx]->id));
5010 DU_FREE(ricServiceUpdate->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdate_IEs_t));
5013 DU_FREE(ricServiceUpdate->protocolIEs.list.array, ricServiceUpdate->protocolIEs.list.size);
5015 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5017 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5021 /*******************************************************************
5023 * @brief Builds and Send the RicServiceUpdateuest
5027 * Function : BuildAndSendRicServiceUpdate
5029 * Functionality:Fills the RicServiceUpdateuest
5031 * @return ROK - success
5034 ******************************************************************/
5036 uint8_t BuildAndSendRicServiceUpdate(RicServiceUpdate serviceUpdate)
5038 uint8_t arrIdx = 0, elementCnt=0;
5039 uint8_t transId = 0, ret = RFAILED;
5040 bool memAllocFailed =false;
5041 E2AP_PDU_t *e2apMsg = NULLP;
5042 RICserviceUpdate_t *ricServiceUpdate = NULLP;
5043 asn_enc_rval_t encRetVal; /* Encoder return value */
5045 DU_LOG("\nINFO --> E2AP : Building Ric Service Update\n");
5048 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5049 if(e2apMsg == NULLP)
5051 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
5054 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5055 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5056 if(e2apMsg->choice.initiatingMessage == NULLP)
5058 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
5061 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5062 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
5063 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceUpdate;
5064 ricServiceUpdate = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate;
5066 /* For TransId IE, set elementCnt to 1.
5067 If there is any item in the RAN function add list, RAN function modification list, or RAN function delete list, increment the elementCnt.*/
5070 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5072 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeModified)
5074 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted)
5077 ricServiceUpdate->protocolIEs.list.count = elementCnt;
5078 ricServiceUpdate->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdate_IEs_t*);
5080 /* Initialize the E2Setup members */
5081 DU_ALLOC(ricServiceUpdate->protocolIEs.list.array, ricServiceUpdate->protocolIEs.list.size);
5082 if(ricServiceUpdate->protocolIEs.list.array == NULLP)
5084 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements");
5088 for(arrIdx = 0; arrIdx < elementCnt; (arrIdx)++)
5090 DU_ALLOC(ricServiceUpdate->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdate_IEs_t));
5091 if(ricServiceUpdate->protocolIEs.list.array[arrIdx] == NULLP)
5093 memAllocFailed = true;
5094 DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayIdx [%d]", arrIdx);
5098 if(memAllocFailed == true)
5104 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
5105 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5106 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = E2setupRequestIEs__value_PR_TransactionID;
5107 if(serviceUpdate.dir == E2_NODE_INITIATED)
5108 transId = assignTransactionId();
5110 transId = serviceUpdate.transId;
5111 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
5113 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5116 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAdded;
5117 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5118 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctions_List;
5119 if(BuildRanFunctionAddList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List,\
5120 e2apMsg->choice.initiatingMessage->procedureCode, serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded, serviceUpdate.recvRanFuncList.ranFunToBeAdded) !=ROK)
5126 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeModified)
5129 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsModified;
5130 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5131 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctions_List;
5132 if(BuildRanFunctionAddList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List,
5133 e2apMsg->choice.initiatingMessage->procedureCode, serviceUpdate.recvRanFuncList.numOfRanFunToBeModified, serviceUpdate.recvRanFuncList.ranFunToBeModified) !=ROK)
5139 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted)
5142 ricServiceUpdate->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsDeleted;
5143 ricServiceUpdate->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
5144 ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdate_IEs__value_PR_RANfunctionsID_List;
5145 if(BuildRanFunctionDeleteList(&ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List,\
5146 serviceUpdate.recvRanFuncList.numOfRanFunToBeDeleted, serviceUpdate.recvRanFuncList.ranFunToBeDeleted) != ROK)
5151 /* Prints the Msg formed */
5152 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
5154 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5156 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
5157 if(encRetVal.encoded == ENCODE_FAIL)
5159 DU_LOG("\nERROR --> E2AP : Could not encode RicServiceUpdateuest structure (at %s)\n",\
5160 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5165 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicServiceUpdateuest\n");
5166 #ifdef DEBUG_ASN_PRINT
5167 for(int i=0; i< encBufSize; i++)
5169 printf("%x",encBuf[i]);
5173 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
5175 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
5184 if(serviceUpdate.dir == E2_NODE_INITIATED)
5186 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId = transId;
5187 duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
5191 duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].transactionId = transId;
5192 duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].procedureCode = e2apMsg->choice.initiatingMessage->procedureCode;
5194 duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.dir = serviceUpdate.dir;
5195 duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.transId =transId;
5196 memcpy(&duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.ricService.recvRanFuncList, &serviceUpdate.recvRanFuncList, sizeof(E2TmpRanFunList));
5198 FreeRicServiceUpdate(e2apMsg);
5201 /******************************************************************
5203 * @brief Processes RIC service Query sent by RIC
5207 * Function : procRicServiceQuery
5209 * Functionality: Processes RIC service Query sent by RIC
5211 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5212 * @return ROK - success
5215 * ****************************************************************/
5217 void procRicServiceQuery(E2AP_PDU_t *e2apMsg)
5220 uint16_t arrIdx =0, ranFuncIdx=0,tmpIdx=0;
5221 uint16_t id,revisionCcounter;
5222 bool tmpArray[MAX_RAN_FUNCTION] = {false};
5223 RICserviceQuery_t *ricServiceQuery=NULL;
5224 RicServiceUpdate ricUpdate;
5225 RANfunctionID_ItemIEs_t *ranFuncAddedItemIe;
5226 RANfunctionsID_List_t *ranFuncAddedList;
5228 DU_LOG("\nINFO --> E2AP : RIC Service Query received");
5229 memset(&ricUpdate, 0, sizeof(RicServiceUpdate));
5230 ricUpdate.dir = RIC_INITIATED;
5231 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
5233 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
5235 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
5237 /* TODO completing in next patch/gerrit */
5238 case ProtocolIE_IDE2_id_TransactionID:
5240 ricUpdate.transId = ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
5244 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5246 ranFuncAddedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
5247 if(ranFuncAddedList->list.array)
5249 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
5251 if(ranFuncAddedList->list.array[ranFuncIdx])
5253 /* Using the RAN function Id, identify the RAN function to be modified or deleted. */
5255 ranFuncAddedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAddedList->list.array[ranFuncIdx];
5256 id = ranFuncAddedItemIe->value.choice.RANfunctionID_Item.ranFunctionID;
5257 revisionCcounter = ranFuncAddedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision;
5259 if((id != duCb.e2apDb.ranFunction[id-1].id))
5261 action = CONFIG_DEL;
5263 else if((id == duCb.e2apDb.ranFunction[id-1].id)&&(revisionCcounter!=duCb.e2apDb.ranFunction[id-1].revisionCounter))
5265 action = CONFIG_MOD;
5268 if(action == CONFIG_DEL)
5270 ricUpdate.recvRanFuncList.ranFunToBeDeleted[ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted].id = id;
5271 ricUpdate.recvRanFuncList.ranFunToBeDeleted[ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted].revisionCounter = revisionCcounter;
5272 ricUpdate.recvRanFuncList.numOfRanFunToBeDeleted++;
5274 else if(action == CONFIG_MOD)
5276 ricUpdate.recvRanFuncList.ranFunToBeModified[ricUpdate.recvRanFuncList.numOfRanFunToBeModified].id = id;
5277 ricUpdate.recvRanFuncList.ranFunToBeModified[ricUpdate.recvRanFuncList.numOfRanFunToBeModified].revisionCounter = revisionCcounter;
5278 ricUpdate.recvRanFuncList.numOfRanFunToBeModified++;
5281 /* If any ID is set to true, it means that the ID has been used in either modification or deletion list.
5282 * Else we will add the IDs into the added list */
5283 tmpArray[id-1] = true;
5292 /* Traversing the whole RAN function list in ducb to check if any new Ran function ids have been added. */
5293 for(arrIdx =0; arrIdx<MAX_RAN_FUNCTION; arrIdx++)
5295 tmpIdx= ricUpdate.recvRanFuncList.numOfRanFunToBeAdded;
5296 if((duCb.e2apDb.ranFunction[arrIdx].id >0)&&(!tmpArray[arrIdx]))
5298 ricUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].id = duCb.e2apDb.ranFunction[arrIdx].id;
5299 ricUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].revisionCounter = duCb.e2apDb.ranFunction[arrIdx].revisionCounter;
5300 ricUpdate.recvRanFuncList.numOfRanFunToBeAdded++;
5304 if(BuildAndSendRicServiceUpdate(ricUpdate)!= ROK)
5306 DU_LOG("\nERROR --> E2AP : Failed to build and send ric service update message");
5309 freeAperDecodingOfRicServiceQuery(ricServiceQuery);
5312 /******************************************************************
5314 * @brief Deallocation of memory allocated by aper decoder for
5315 * RIC service update ack
5319 * Function : freeAperDecodingOfRicServiceUpdateAck
5321 * Functionality: Deallocation of memory allocated by aper decoder
5322 * for RIC service update ack
5324 * @params[in] RICserviceUpdateAck_t *ricServiceAck;
5327 * ****************************************************************/
5329 void freeAperDecodingOfRicServiceUpdateAck(RICserviceUpdateAcknowledge_t *ricServiceAck)
5331 uint8_t arrIdx=0,ranFuncIdx=0;
5332 RANfunctionsID_List_t *ranFuncAddedList=NULL;
5336 if(ricServiceAck->protocolIEs.list.array)
5338 for(arrIdx=0; arrIdx<ricServiceAck->protocolIEs.list.count; arrIdx++)
5340 if(ricServiceAck->protocolIEs.list.array[arrIdx])
5342 switch(ricServiceAck->protocolIEs.list.array[arrIdx]->id)
5344 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5346 ranFuncAddedList= &ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
5347 if(ranFuncAddedList->list.array)
5349 for(ranFuncIdx=0;ranFuncIdx<ranFuncAddedList->list.count; ranFuncIdx++)
5351 free(ranFuncAddedList->list.array[ranFuncIdx]);
5353 free(ranFuncAddedList->list.array);
5360 free(ricServiceAck->protocolIEs.list.array[arrIdx]);
5363 free(ricServiceAck->protocolIEs.list.array);
5368 /******************************************************************
5370 * @brief Processes RIC service update ack sent by RIC
5374 * Function : procRicServiceUpdateAck
5376 * Functionality: Processes RIC service update ack sent by RIC
5378 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5379 * @return ROK - success
5382 * ****************************************************************/
5384 void procRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
5386 uint8_t arrIdx =0, transId =0;
5387 uint16_t id =0, tmpIdx=0, ranFuncIdx=0;
5388 RicServiceUpdate serviceUpdate;
5389 RANfunctionsIDcause_List_t *rejectedList=NULL;
5390 RICserviceUpdateAcknowledge_t *ricServiceAck=NULL;
5391 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
5393 DU_LOG("\nINFO --> E2AP : RIC service update ack received");
5394 memset(&serviceUpdate, 0, sizeof(RicServiceUpdate));
5395 ricServiceAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
5397 for(arrIdx=0; arrIdx<ricServiceAck->protocolIEs.list.count; arrIdx++)
5399 switch(ricServiceAck->protocolIEs.list.array[arrIdx]->id)
5401 case ProtocolIE_IDE2_id_TransactionID:
5403 transId = ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
5404 if((duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].transactionId == transId) &&\
5405 (duCb.e2apDb.e2TransInfo.e2InitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
5407 memset(&duCb.e2apDb.e2TransInfo.e2InitTransaction[transId], 0, sizeof(E2TransInfo));
5409 else if((duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].transactionId == transId) &&\
5410 (duCb.e2apDb.e2TransInfo.ricInitTransaction[transId].procedureCode == e2apMsg->choice.unsuccessfulOutcome->procedureCode))
5412 memset(&duCb.e2apDb.e2TransInfo.ricInitTransaction[transId], 0, sizeof(E2TransInfo));
5416 DU_LOG("\nERROR --> E2AP : Invalid transaction id [%d]", transId);
5422 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
5425 case ProtocolIE_IDE2_id_RANfunctionsRejected:
5427 rejectedList= &ricServiceAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
5428 if(rejectedList->list.array)
5430 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
5432 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)rejectedList->list.array[ranFuncIdx];
5433 id = ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID;
5434 tmpIdx= serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded;
5435 serviceUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].id = duCb.e2apDb.ranFunction[id-1].id;
5436 serviceUpdate.recvRanFuncList.ranFunToBeAdded[tmpIdx].revisionCounter = duCb.e2apDb.ranFunction[id-1].revisionCounter;
5437 serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded++;
5446 if(serviceUpdate.recvRanFuncList.numOfRanFunToBeAdded)
5448 serviceUpdate.dir = E2_NODE_INITIATED;
5449 BuildAndSendRicServiceUpdate(serviceUpdate);
5451 freeAperDecodingOfRicServiceUpdateAck(ricServiceAck);
5454 /******************************************************************
5456 * @brief Deallocation of memory allocated by aper decoder for
5457 * RIC service update failure
5461 * Function : freeAperDecodingOfRicServiceUpdateFailure
5463 * Functionality: Deallocation of memory allocated by aper decoder
5464 * for RIC service update failure
5466 * @params[in] RICserviceUpdateFailure_t *ricServiceFailure;
5469 * ****************************************************************/
5471 void freeAperDecodingOfRicServiceUpdateFailure(RICserviceUpdateFailure_t *ricServiceFailure)
5475 if(ricServiceFailure)
5477 if(ricServiceFailure->protocolIEs.list.array)
5479 for(arrIdx=0; arrIdx<ricServiceFailure->protocolIEs.list.count; arrIdx++)
5481 if(ricServiceFailure->protocolIEs.list.array[arrIdx])
5483 free(ricServiceFailure->protocolIEs.list.array[arrIdx]);
5486 free(ricServiceFailure->protocolIEs.list.array);
5491 /******************************************************************
5493 * @brief Processes RIC service update failure sent by RIC
5497 * Function : procRicServiceUpdateFailure
5499 * Functionality: Processes RIC service update failure sent by RIC
5501 * @params[in] E2AP_PDU_t ASN decoded E2AP message
5502 * @return ROK - success
5505 * ****************************************************************/
5507 void procRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
5509 uint8_t arrIdx =0, timerValue=0;
5510 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
5512 DU_LOG("\nINFO --> E2AP : RIC service update failure received");
5513 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
5515 for(arrIdx=0; arrIdx<ricServiceFailure->protocolIEs.list.count; arrIdx++)
5517 switch(ricServiceFailure->protocolIEs.list.array[arrIdx]->id)
5519 case ProtocolIE_IDE2_id_TransactionID:
5523 case ProtocolIE_IDE2_id_TimeToWaitE2:
5525 timerValue = convertE2WaitTimerEnumToValue(ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2);
5526 if((duChkTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer), EVENT_RIC_SERVICE_UPDATE_TMR)) == FALSE)
5528 duStartTmr((PTR)&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer), EVENT_RIC_SERVICE_UPDATE_TMR, timerValue);
5532 DU_LOG("\nERROR --> E2AP : EVENT_RIC_SERVICE_UPDATE_TMR timer is already running");
5537 case ProtocolIE_IDE2_id_CauseE2:
5544 freeAperDecodingOfRicServiceUpdateFailure(ricServiceFailure);
5547 /******************************************************************
5549 * @brief DU Send E2 Node Configuration Update
5553 * Function : duSendE2NodeConfigurationUpdate
5555 * Functionality: DU Send E2 Node Configuration Update
5557 * @return ROK - success
5560 * ****************************************************************/
5562 uint8_t duSendE2NodeConfigurationUpdate()
5564 E2NodeConfigList e2NodeList;
5565 CmLList *node =NULL;
5566 E2NodeComponent *e2NodeComponentInfo=NULL;
5568 memset(&e2NodeList, 0, sizeof(E2NodeConfigList));
5569 CM_LLIST_FIRST_NODE(&duCb.e2apDb.e2NodeComponentList, node);
5572 e2NodeComponentInfo = (E2NodeComponent*)node->node;
5574 if(e2NodeComponentInfo->componentRequestPart && e2NodeComponentInfo->componentResponsePart)
5576 switch(e2NodeComponentInfo->componentActionType)
5578 case E2_NODE_COMPONENT_ADD:
5580 e2NodeList.addE2Node[e2NodeList.addE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5581 e2NodeList.addE2Node[e2NodeList.addE2NodeCount].actionType = e2NodeComponentInfo->componentActionType;
5582 e2NodeList.removeE2NodeCount++;
5585 case E2_NODE_COMPONENT_UPDATE:
5587 e2NodeList.updateE2Node[e2NodeList.updateE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5588 e2NodeList.updateE2Node[e2NodeList.updateE2NodeCount].actionType = e2NodeComponentInfo->componentActionType;
5589 e2NodeList.updateE2NodeCount++;
5593 case E2_NODE_COMPONENT_DEL:
5595 e2NodeList.removeE2Node[e2NodeList.removeE2NodeCount].interface = e2NodeComponentInfo->interfaceType;
5596 e2NodeList.removeE2Node[e2NodeList.removeE2NodeCount].actionType = e2NodeComponentInfo->componentActionType;
5597 e2NodeList.removeE2NodeCount++;
5605 if(BuildAndSendE2NodeConfigUpdate(&e2NodeList) !=ROK)
5607 DU_LOG("\nERROR --> E2AP : Failed to build and send e2 node config update message to RIC_stub");
5613 /*******************************************************************
5615 * @brief Free RIC Subscription Modification Required
5619 * Function : FreeRicSubsModRequired
5621 * Functionality: Freqq RIC Subscription Modification required
5623 * @param E2AP Message PDU to be freed
5626 ******************************************************************/
5627 void FreeRicSubsModRequired(E2AP_PDU_t *e2apMsg)
5629 uint8_t ieIdx = 0, arrIdx = 0;
5630 RICsubscriptionModificationRequired_t *ricSubsModReqd = NULLP;
5631 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
5632 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
5633 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
5637 if(e2apMsg->choice.initiatingMessage)
5639 ricSubsModReqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired;
5640 if(ricSubsModReqd->protocolIEs.list.array)
5642 for(ieIdx = 0; ieIdx < ricSubsModReqd->protocolIEs.list.count; ieIdx++)
5644 if(ricSubsModReqd->protocolIEs.list.array[ieIdx])
5646 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5647 switch(ricSubsModReqdIe->id)
5649 case ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List:
5651 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
5652 if(actionToBeModList->list.array)
5654 for(arrIdx = 0; arrIdx < actionToBeModList->list.count; arrIdx++)
5656 DU_FREE(actionToBeModList->list.array[arrIdx], \
5657 sizeof(RICaction_RequiredToBeModified_ItemIEs_t));
5659 DU_FREE(actionToBeModList->list.array, actionToBeModList->list.size);
5664 case ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List:
5666 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
5667 if(actionToBeRmvList->list.array)
5669 for(arrIdx = 0; arrIdx < actionToBeRmvList->list.count; arrIdx++)
5671 DU_FREE(actionToBeRmvList->list.array[arrIdx], \
5672 sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t));
5674 DU_FREE(actionToBeRmvList->list.array, actionToBeRmvList->list.size);
5682 DU_FREE(ricSubsModReqd->protocolIEs.list.array[ieIdx], \
5683 sizeof(RICsubscriptionModificationRequired_IEs_t));
5686 DU_FREE(ricSubsModReqd->protocolIEs.list.array, ricSubsModReqd->protocolIEs.list.size);
5688 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5690 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
5694 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
5695 * However, E2SM-KPM supports only RIC Report service.
5696 * Hence there is no subsequent action in RIC subscription that may require modification.
5697 * So commenting the action-modification IEs for the time being
5700 /*******************************************************************
5702 * @brief Fill Action required to be modified list
5706 * Function : FillActionReqdToBeModList
5708 * Functionality: Fill Action required to be modified list
5710 * @param RIC Actions Required To Be Modified List to be filled
5711 * Number of actions to be modified
5712 * RIC Subscription DB
5713 * @return ROK - success
5716 ******************************************************************/
5717 uint8_t FillActionReqdToBeModList(RICactions_RequiredToBeModified_List_t *actionToBeModList, uint8_t numActionsMod, \
5718 RicSubscription *ricSubscription)
5720 uint8_t arrIdx = 0, actionIdx = 0;
5721 RICaction_RequiredToBeModified_ItemIEs_t *actionToBeMod = NULL;
5723 actionToBeModList->list.count = numActionsMod;
5724 actionToBeModList->list.size = numActionsMod * sizeof(RICaction_RequiredToBeModified_ItemIEs_t *);
5725 DU_ALLOC(actionToBeModList->list.array, actionToBeModList->list.size);
5726 if(!actionToBeModList->list.array)
5728 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
5733 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5735 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD)
5737 DU_ALLOC(actionToBeModList->list.array[arrIdx], sizeof(RICaction_RequiredToBeModified_ItemIEs_t));
5738 if(!actionToBeModList->list.array[arrIdx])
5740 DU_LOG("\nERROR --> E2AP : Memory allocation failed in %s at line %d", __func__, __LINE__);
5743 actionToBeMod = (RICaction_RequiredToBeModified_ItemIEs_t *)actionToBeModList->list.array[arrIdx];
5745 actionToBeMod->id = ProtocolIE_IDE2_id_RICaction_RequiredToBeModified_Item;
5746 actionToBeMod->criticality = CriticalityE2_reject;
5747 actionToBeMod->value.present = \
5748 RICaction_RequiredToBeModified_ItemIEs__value_PR_RICaction_RequiredToBeModified_Item;
5749 actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricActionID = \
5750 ricSubscription->actionSequence[actionIdx].actionId;
5751 actionToBeMod->value.choice.RICaction_RequiredToBeModified_Item.ricTimeToWait = RICtimeToWait_w5ms;
5761 /*******************************************************************
5763 * @brief Fill Action required to be removed list
5767 * Function : FillActionReqdToBeRmvList
5769 * Functionality: Fill Action required to be removed list
5771 * @param RIC Actions Required To Be Removed List to be filled
5772 * Number of actions to be removed
5773 * RIC Subscription DB
5774 * @return ROK - success
5777 ******************************************************************/
5778 uint8_t FillActionReqdToBeRmvList(RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList, uint8_t numActionsRmv, \
5779 RicSubscription *ricSubscription)
5781 uint8_t arrIdx = 0, actionIdx = 0;
5782 RICaction_RequiredToBeRemoved_ItemIEs_t *actionToBeRmv = NULL;
5784 actionToBeRmvList->list.count = numActionsRmv;
5785 actionToBeRmvList->list.size = numActionsRmv * sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t *);
5786 DU_ALLOC(actionToBeRmvList->list.array, actionToBeRmvList->list.size);
5787 if(!actionToBeRmvList->list.array)
5789 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5794 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5796 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL)
5798 DU_ALLOC(actionToBeRmvList->list.array[arrIdx], sizeof(RICaction_RequiredToBeRemoved_ItemIEs_t));
5799 if(!actionToBeRmvList->list.array[arrIdx])
5801 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5804 actionToBeRmv = (RICaction_RequiredToBeRemoved_ItemIEs_t *)actionToBeRmvList->list.array[arrIdx];
5806 actionToBeRmv->id = ProtocolIE_IDE2_id_RICaction_RequiredToBeRemoved_Item;
5807 actionToBeRmv->criticality = CriticalityE2_reject;
5808 actionToBeRmv->value.present = \
5809 RICaction_RequiredToBeRemoved_ItemIEs__value_PR_RICaction_RequiredToBeRemoved_Item;
5810 actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.ricActionID = \
5811 ricSubscription->actionSequence[actionIdx].actionId;
5812 fillE2Cause(&actionToBeRmv->value.choice.RICaction_RequiredToBeRemoved_Item.cause, \
5813 ricSubscription->actionSequence[actionIdx].failureCause);
5822 /*******************************************************************
5824 * @brief Fill RIC Subscription Modification Required IEs
5828 * Function : FillRicSubsModRequired
5830 * Functionality: Fill RIC Subscription Modification Required IEs
5832 * @param RIC Subscription Modification Required IEs to be filled
5833 * RIC Subscription DB
5834 * @return ROK - success
5837 ******************************************************************/
5838 uint8_t FillRicSubsModRequired(RICsubscriptionModificationRequired_t *ricSubsModReqd, RicSubscription *ricSubscription)
5840 uint8_t ieIdx = 0, elementCnt=0, actionIdx = 0;
5841 uint8_t numActionsMod = 0, numActionsRmv = 0;
5842 RICsubscriptionModificationRequired_IEs_t *ricSubsModReqdIe = NULLP;
5843 RICactions_RequiredToBeRemoved_List_t *actionToBeRmvList = NULLP;
5845 /* Unused in case of E2SM-KPM */
5847 RICactions_RequiredToBeModified_List_t *actionToBeModList = NULLP;
5850 /* Count number of Actions to be modified or deleted */
5851 for(actionIdx = 0; actionIdx < MAX_RIC_ACTION; actionIdx++)
5853 if(ricSubscription->actionSequence[actionIdx].action == CONFIG_MOD)
5855 else if(ricSubscription->actionSequence[actionIdx].action == CONFIG_DEL)
5859 /* Count number of IEs to be added to messages */
5866 ricSubsModReqd->protocolIEs.list.count = elementCnt;
5867 ricSubsModReqd->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionModificationRequired_IEs_t *);
5868 DU_ALLOC(ricSubsModReqd->protocolIEs.list.array, ricSubsModReqd->protocolIEs.list.size);
5869 if(!ricSubsModReqd->protocolIEs.list.array)
5871 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5875 for(ieIdx = 0; ieIdx < elementCnt; ieIdx++)
5877 DU_ALLOC(ricSubsModReqd->protocolIEs.list.array[ieIdx], sizeof(RICsubscriptionModificationRequired_IEs_t));
5878 if(!ricSubsModReqd->protocolIEs.list.array[ieIdx])
5880 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5885 /* RIC Request ID */
5887 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5888 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICrequestID;
5889 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5890 ricSubsModReqdIe->value.present = RICsubscriptionModificationRequired_IEs__value_PR_RICrequestID;
5891 ricSubsModReqdIe->value.choice.RICrequestID.ricRequestorID = ricSubscription->requestId.requestorId;
5892 ricSubsModReqdIe->value.choice.RICrequestID.ricInstanceID = ricSubscription->requestId.instanceId;
5894 /* RAN Function ID */
5896 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5897 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RANfunctionID;
5898 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5899 ricSubsModReqdIe->value.present = RICsubscriptionModificationRequired_IEs__value_PR_RANfunctionID;
5900 ricSubsModReqdIe->value.choice.RANfunctionID = ricSubscription->ranFuncId;
5902 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
5903 * However, E2SM-KPM supports only RIC Report service.
5904 * Hence there is no subsequent action in RIC subscription that may require modification.
5905 * So commenting the action-modification IEs for the time being
5908 /* RIC Actions Required to be Modified */
5912 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5913 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICactionsRequiredToBeModified_List;
5914 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5915 ricSubsModReqdIe->value.present = \
5916 RICsubscriptionModificationRequired_IEs__value_PR_RICactions_RequiredToBeModified_List;
5917 actionToBeModList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeModified_List;
5919 if(FillActionReqdToBeModList(actionToBeModList, numActionsMod, ricSubscription) != ROK)
5921 DU_LOG("\nERROR --> E2AP : %s: Failed to fill actions required to be modified list", __func__);
5927 /* RIC Actions Required to be removed */
5931 ricSubsModReqdIe = ricSubsModReqd->protocolIEs.list.array[ieIdx];
5932 ricSubsModReqdIe->id = ProtocolIE_IDE2_id_RICactionsRequiredToBeRemoved_List;
5933 ricSubsModReqdIe->criticality = CriticalityE2_reject;
5934 ricSubsModReqdIe->value.present = \
5935 RICsubscriptionModificationRequired_IEs__value_PR_RICactions_RequiredToBeRemoved_List;
5936 actionToBeRmvList = &ricSubsModReqdIe->value.choice.RICactions_RequiredToBeRemoved_List;
5938 if(FillActionReqdToBeRmvList(actionToBeRmvList, numActionsRmv, ricSubscription) != ROK)
5940 DU_LOG("\nERROR --> E2AP : %s: Failed to fill actions required to be removed list", __func__);
5948 /*******************************************************************
5950 * @brief Builds and Send RIC Subscription Modification Required
5955 * Function : BuildAndSendRicSubsModRequired
5957 * Functionality: Builds and Send RIC Subscription Modification
5960 * @param RIC Subscription DB
5961 * @return ROK - success
5964 ******************************************************************/
5965 uint8_t BuildAndSendRicSubsModRequired(RicSubscription *ricSubscription)
5967 uint8_t ret = RFAILED;
5968 E2AP_PDU_t *e2apMsg = NULLP;
5969 RICsubscriptionModificationRequired_t *ricSubsModReqd = NULLP;
5970 asn_enc_rval_t encRetVal; /* Encoder return value */
5972 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Modification Required \n");
5975 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
5976 if(e2apMsg == NULLP)
5978 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5982 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
5983 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
5984 if(e2apMsg->choice.initiatingMessage == NULLP)
5986 DU_LOG("\nERROR --> E2AP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5989 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
5990 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscriptionModificationRequired;
5991 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionModificationRequired;
5993 ricSubsModReqd = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionModificationRequired;
5995 if(FillRicSubsModRequired(ricSubsModReqd, ricSubscription) != ROK)
5997 DU_LOG("\nERROR --> E2AP : %s: Failed to fill RIC Subscription Modification Required IEs", __func__);
6002 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6004 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6006 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
6007 if(encRetVal.encoded == ENCODE_FAIL)
6009 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Modifiction Required structure (at %s)\n",\
6010 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6015 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Subscription Modification Required \n");
6016 #ifdef DEBUG_ASN_PRINT
6017 for(int i=0; i< encBufSize; i++)
6019 printf("%x",encBuf[i]);
6023 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL, encBuf, encBufSize) != ROK)
6025 DU_LOG("\nERROR --> E2AP : Sending RIC Subscription Modification Required failed");
6032 /* Free RIC Subscription modification required */
6033 FreeRicSubsModRequired(e2apMsg);
6037 /*******************************************************************
6039 * @brief Free APER decoding of RIC Subscription Modification Confirm
6043 * Function : freeAperDecodingOfRicSubsModConfirm
6045 * Functionality: Free APER decoding of RIC Subscription
6046 * Modification Confirm
6048 * @param E2AP Message PDU
6051 ******************************************************************/
6052 void freeAperDecodingOfRicSubsModConfirm(E2AP_PDU_t *e2apMsg)
6054 uint8_t ieIdx = 0, arrIdx=0;
6055 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
6056 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
6057 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
6058 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
6059 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
6060 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
6062 if(e2apMsg && e2apMsg->choice.successfulOutcome)
6064 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
6065 if(ricSubsModCfm->protocolIEs.list.array)
6067 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
6069 if(ricSubsModCfm->protocolIEs.list.array[ieIdx])
6071 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
6072 switch(ricSubsModCfmIe->id)
6074 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
6076 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
6077 if(modCfmList->list.array)
6079 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
6081 if(modCfmList->list.array[arrIdx])
6082 free(modCfmList->list.array[arrIdx]);
6084 free(modCfmList->list.array);
6089 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
6091 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
6092 if(modRefusedList->list.array)
6094 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
6096 if(modRefusedList->list.array[arrIdx])
6097 free(modRefusedList->list.array[arrIdx]);
6099 free(modRefusedList->list.array);
6104 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
6106 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
6107 if(rmvCfmList->list.array)
6109 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
6111 if(rmvCfmList->list.array[arrIdx])
6112 free(rmvCfmList->list.array[arrIdx]);
6114 free(rmvCfmList->list.array);
6119 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
6121 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
6122 if(rmvFailList->list.array)
6124 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
6126 if(rmvFailList->list.array[arrIdx])
6127 free(rmvFailList->list.array[arrIdx]);
6129 free(rmvFailList->list.array);
6138 free(ricSubsModCfmIe);
6141 free(ricSubsModCfm->protocolIEs.list.array);
6146 /*******************************************************************
6148 * @brief Process RIC Subscription Modification Confirm Message
6152 * Function : procRicSubscriptionModificationConfirm
6154 * Functionality: Process RIC Subscription Modification Confirm
6155 * Message received from RIC.
6157 * @param E2AP Message PDU
6160 ******************************************************************/
6161 void procRicSubscriptionModificationConfirm(E2AP_PDU_t *e2apMsg)
6163 uint8_t actionId = 0, ieIdx = 0, arrIdx = 0;
6164 uint16_t ranFuncId = 0;
6165 bool procFailure = false;
6166 RicRequestId ricReqId;
6167 RanFunction *ranFuncDb = NULLP;
6168 CmLList *ricSubsNode = NULLP;
6169 RicSubscription *ricSubsDb = NULLP;
6170 ActionInfo *actionDb = NULLP;
6172 RICsubscriptionModificationConfirm_t *ricSubsModCfm = NULLP;
6173 RICsubscriptionModificationConfirm_IEs_t *ricSubsModCfmIe = NULLP;
6175 /* Not used in case of E2SM-KPM */
6177 RICactions_ConfirmedForModification_List_t *modCfmList = NULLP;
6178 RICaction_ConfirmedForModification_ItemIEs_t *modCfmListItem = NULLP;
6180 RICactions_RefusedToBeModified_List_t *modRefusedList = NULLP;
6181 RICaction_RefusedToBeModified_ItemIEs_t *modRefusedListItem = NULLP;
6184 RICactions_ConfirmedForRemoval_List_t *rmvCfmList = NULLP;
6185 RICaction_ConfirmedForRemoval_ItemIEs_t *rmvCfmListItem = NULLP;
6187 RICactions_RefusedToBeRemoved_List_t *rmvFailList = NULLP;
6188 RICaction_RefusedToBeRemoved_ItemIEs_t *rmvFailListItem = NULLP;
6190 DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Modification Confirm", __func__);
6195 DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__);
6199 if(!e2apMsg->choice.successfulOutcome)
6201 DU_LOG("\nERROR --> E2AP : %s: Successful Outcome in E2AP message is NULL", __func__);
6205 ricSubsModCfm = &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionModificationConfirm;
6206 if(!ricSubsModCfm->protocolIEs.list.array)
6208 DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__);
6212 for(ieIdx = 0; ieIdx < ricSubsModCfm->protocolIEs.list.count; ieIdx++)
6214 if(!ricSubsModCfm->protocolIEs.list.array[ieIdx])
6216 DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx);
6220 ricSubsModCfmIe = ricSubsModCfm->protocolIEs.list.array[ieIdx];
6221 switch(ricSubsModCfmIe->id)
6223 case ProtocolIE_IDE2_id_RICrequestID:
6225 memset(&ricReqId, 0, sizeof(RicRequestId));
6226 ricReqId.requestorId = ricSubsModCfmIe->value.choice.RICrequestID.ricRequestorID;
6227 ricReqId.instanceId = ricSubsModCfmIe->value.choice.RICrequestID.ricInstanceID;
6231 case ProtocolIE_IDE2_id_RANfunctionID:
6233 ranFuncId = ricSubsModCfmIe->value.choice.RANfunctionID;
6234 ranFuncDb = fetchRanFuncFromRanFuncId(ranFuncId);
6237 DU_LOG("\nERROR --> E2AP : %s: RAN Function ID [%d] not found", __func__, ranFuncId);
6242 ricSubsDb = fetchSubsInfoFromRicReqId(ricReqId, ranFuncDb, &ricSubsNode);
6245 DU_LOG("\nERROR --> E2AP : %s: RIC Subscription not found for Requestor_ID [%d] Instance_ID [%d]",\
6246 __func__, ricReqId.requestorId, ricReqId.instanceId);
6254 /* A RIC Subscription includes RIC subsequent action only for RIC Insert service.
6255 * However, E2SM-KPM supports only RIC Report service.
6256 * Hence there is no subsequent action in RIC subscription that may require modification.
6257 * So commenting the action-modification IEs for the time being
6260 case ProtocolIE_IDE2_id_RICactionsConfirmedForModification_List:
6262 modCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForModification_List;
6263 for(arrIdx = 0; arrIdx < modCfmList->list.count; arrIdx++)
6265 modCfmListItem = (RICaction_ConfirmedForModification_ItemIEs_t *)modCfmList->list.array[arrIdx];
6266 actionId = modCfmListItem->value.choice.RICaction_ConfirmedForModification_Item.ricActionID;
6268 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6271 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6275 actionDb->action = CONFIG_UNKNOWN;
6276 /* Further handling can be added here in future once the
6277 * use case of this procedure is identified */
6284 case ProtocolIE_IDE2_id_RICactionsRefusedToBeModified_List:
6286 modRefusedList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeModified_List;
6287 for(arrIdx = 0; arrIdx < modRefusedList->list.count; arrIdx++)
6289 modRefusedListItem = (RICaction_RefusedToBeModified_ItemIEs_t *)modRefusedList->list.array[arrIdx];
6290 actionId = modRefusedListItem->value.choice.RICaction_RefusedToBeModified_Item.ricActionID;
6291 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6294 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6298 /* Spec doesnt mention if in case of failure, DU should retry for modify action
6299 * Hence, chaging the action from CONFIG_MOD to CONFIG_UNKNOWN
6301 actionDb->action = CONFIG_UNKNOWN;
6309 case ProtocolIE_IDE2_id_RICactionsConfirmedForRemoval_List:
6311 rmvCfmList = &ricSubsModCfmIe->value.choice.RICactions_ConfirmedForRemoval_List;
6312 for(arrIdx = 0; arrIdx < rmvCfmList->list.count; arrIdx++)
6314 rmvCfmListItem = (RICaction_ConfirmedForRemoval_ItemIEs_t *)rmvCfmList->list.array[arrIdx];
6315 actionId = rmvCfmListItem->value.choice.RICaction_ConfirmedForRemoval_Item.ricActionID;
6316 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6319 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6323 memset(actionDb, 0, sizeof(ActionInfo));
6324 actionDb->actionId = -1;
6325 ricSubsDb->numOfActions--;
6326 /* Further handling can include :
6327 * Deletion of this action from all DU layers
6335 case ProtocolIE_IDE2_id_RICactionsRefusedToBeRemoved_List:
6337 rmvFailList = &ricSubsModCfmIe->value.choice.RICactions_RefusedToBeRemoved_List;
6338 for(arrIdx = 0; arrIdx < rmvFailList->list.count; arrIdx++)
6340 rmvFailListItem = (RICaction_RefusedToBeRemoved_ItemIEs_t *)rmvFailList->list.array[arrIdx];
6341 actionId = rmvFailListItem->value.choice.RICaction_RefusedToBeRemoved_Item.ricActionID;
6342 actionDb = fetchActionInfoFromActionId(actionId, ricSubsDb);
6345 DU_LOG("\nERROR --> E2AP : %s: Action ID [%d] not found", __func__, actionId);
6349 actionDb->action = CONFIG_UNKNOWN;
6358 } /* End of switch for Protocol IE Id */
6362 } /* End of for loop for Protocol IE list */
6367 freeAperDecodingOfRicSubsModConfirm(e2apMsg);
6371 /*******************************************************************
6373 * @brief Free APER decoding of RIC Subscription Modification Refuse
6377 * Function : freeAperDecodingOfRicSubsModRefuse
6379 * Functionality: Free APER decoding of RIC Subscription
6380 * Modification Refuse
6382 * @param E2AP Message PDU
6385 ******************************************************************/
6386 void freeAperDecodingOfRicSubsModRefuse(E2AP_PDU_t *e2apMsg)
6389 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
6391 if(e2apMsg && e2apMsg->choice.unsuccessfulOutcome)
6393 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
6394 if(ricSubsModRefuse->protocolIEs.list.array)
6396 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
6398 if(ricSubsModRefuse->protocolIEs.list.array[ieIdx])
6399 free(ricSubsModRefuse->protocolIEs.list.array[ieIdx]);
6401 free(ricSubsModRefuse->protocolIEs.list.array);
6406 /*******************************************************************
6408 * @brief Process RIC Subscription Modification Refuse Message
6412 * Function : procRicSubscriptionModificationRefuse
6414 * Functionality: Process RIC Subscription Modification Refuse
6415 * Message received from RIC.
6417 * @param E2AP Message PDU
6420 ******************************************************************/
6421 void procRicSubscriptionModificationRefuse(E2AP_PDU_t *e2apMsg)
6424 uint16_t ranFuncId = 0;
6425 RicRequestId ricReqId;
6426 RICsubscriptionModificationRefuse_t *ricSubsModRefuse = NULLP;
6427 RICsubscriptionModificationRefuse_IEs_t *ricSubsModRefuseIe = NULLP;
6428 CauseE2_t *cause = NULLP;
6430 DU_LOG("\nINFO --> E2AP : %s: Received RIC Subscription Modification Refuse", __func__);
6435 DU_LOG("\nERROR --> E2AP : %s: E2AP Message is NULL", __func__);
6439 if(!e2apMsg->choice.unsuccessfulOutcome)
6441 DU_LOG("\nERROR --> E2AP : %s: Unsuccessful Outcome in E2AP message is NULL", __func__);
6445 ricSubsModRefuse = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionModificationRefuse;
6446 if(!ricSubsModRefuse->protocolIEs.list.array)
6448 DU_LOG("\nERROR --> E2AP : %s: Array conatining E2AP message IEs is null", __func__);
6452 for(ieIdx = 0; ieIdx < ricSubsModRefuse->protocolIEs.list.count; ieIdx++)
6454 if(!ricSubsModRefuse->protocolIEs.list.array[ieIdx])
6456 DU_LOG("\nERROR --> E2AP : %s: IE at index [%d] in E2AP message IEs list is null", __func__, ieIdx);
6460 ricSubsModRefuseIe = ricSubsModRefuse->protocolIEs.list.array[ieIdx];
6461 switch(ricSubsModRefuseIe->id)
6463 case ProtocolIE_IDE2_id_RICrequestID:
6465 memset(&ricReqId, 0, sizeof(RicRequestId));
6466 ricReqId.requestorId = ricSubsModRefuseIe->value.choice.RICrequestID.ricRequestorID;
6467 ricReqId.instanceId = ricSubsModRefuseIe->value.choice.RICrequestID.ricInstanceID;
6471 case ProtocolIE_IDE2_id_RANfunctionID:
6473 ranFuncId = ricSubsModRefuseIe->value.choice.RANfunctionID;
6477 case ProtocolIE_IDE2_id_CauseE2:
6479 DU_LOG("\nDEBUG --> E2AP : %s: RIC subscriptiom modification refused for RIC_Requestor_ID [%d] \
6480 RIC_Instance_ID [%d] RAN_Function_ID [%d] ", __func__, ricReqId.requestorId, \
6481 ricReqId.instanceId, ranFuncId);
6483 cause = &ricSubsModRefuseIe->value.choice.CauseE2;
6484 printE2ErrorCause(cause);
6489 } /* End of switch for Protocol IE Id */
6490 } /* End of for loop for Protocol IE list */
6495 freeAperDecodingOfRicSubsModRefuse(e2apMsg);
6499 /*******************************************************************
6501 * @brief Handles received E2AP message and sends back response
6505 * Function : E2APMsgHdlr
6508 * - Decodes received E2AP control message
6509 * - Prepares response message, encodes and sends to SCTP
6512 * @return ROK - success
6515 * ****************************************************************/
6516 void E2APMsgHdlr(Buffer *mBuf)
6519 char *recvBuf = NULLP;
6521 MsgLen recvBufLen =0;
6522 E2AP_PDU_t *e2apMsg = NULLP;
6523 asn_dec_rval_t rval ={0}; /* Decoder return value */
6524 E2AP_PDU_t e2apasnmsg={0} ;
6526 DU_LOG("\nDEBUG --> E2AP : Received E2AP message buffer");
6527 ODU_PRINT_MSG(mBuf, 0,0);
6529 /* Copy mBuf into char array to decode it */
6530 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
6531 DU_ALLOC(recvBuf, (Size)recvBufLen);
6533 if(recvBuf == NULLP)
6535 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
6538 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6540 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
6544 #ifdef DEBUG_ASN_PRINT
6545 printf("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
6546 for(i=0; i< recvBufLen; i++)
6548 printf("%x",recvBuf[i]);
6552 /* Decoding flat buffer into E2AP messsage */
6553 e2apMsg = &e2apasnmsg;
6554 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
6556 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
6557 DU_FREE(recvBuf, (Size)recvBufLen);
6559 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6561 DU_LOG("\nERROR --> E2AP : ASN decode failed");
6565 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
6567 switch(e2apMsg->present)
6569 case E2AP_PDU_PR_unsuccessfulOutcome:
6571 switch(e2apMsg->choice.unsuccessfulOutcome->value.present)
6573 case UnsuccessfulOutcomeE2__value_PR_E2setupFailure:
6575 procE2SetupFailure(e2apMsg);
6578 case UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure:
6580 procE2NodeConfigUpdateFailure(e2apMsg);
6583 case UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure:
6585 procRicServiceUpdateFailure(e2apMsg);
6588 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionModificationRefuse:
6590 procRicSubscriptionModificationRefuse(e2apMsg);
6595 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_unsuccessfulOutcome [%d]",\
6596 e2apMsg->choice.unsuccessfulOutcome->value.present);
6600 free(e2apMsg->choice.unsuccessfulOutcome);
6603 case E2AP_PDU_PR_successfulOutcome:
6605 switch(e2apMsg->choice.successfulOutcome->value.present)
6607 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
6611 procE2SetupRsp(e2apMsg);
6615 case SuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateAcknowledge:
6617 DU_LOG("\nDEBUG --> E2AP : E2 node Config update ack message recevied");
6620 case SuccessfulOutcomeE2__value_PR_ResetResponseE2:
6622 procResetResponse(e2apMsg);
6625 case SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge:
6627 procRicServiceUpdateAck(e2apMsg);
6630 case SuccessfulOutcomeE2__value_PR_RICsubscriptionModificationConfirm:
6632 procRicSubscriptionModificationConfirm(e2apMsg);
6638 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_successfulOutcome [%d]",\
6639 e2apMsg->choice.successfulOutcome->value.present);
6642 }/* End of switch(successfulOutcome) */
6643 free(e2apMsg->choice.successfulOutcome);
6647 case E2AP_PDU_PR_initiatingMessage:
6649 switch(e2apMsg->choice.initiatingMessage->value.present)
6651 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
6653 procRicSubscriptionRequest(e2apMsg);
6656 case InitiatingMessageE2__value_PR_RICserviceQuery:
6658 procRicServiceQuery(e2apMsg);
6661 case InitiatingMessageE2__value_PR_ErrorIndicationE2:
6663 DU_LOG("\nINFO --> E2AP : Error indication received");
6668 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_initiatingMessage [%d]",\
6669 e2apMsg->choice.initiatingMessage->value.present);
6672 }/* End of switch(initiatingMessage) */
6673 free(e2apMsg->choice.initiatingMessage);
6678 DU_LOG("\nERROR --> E2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
6683 }/* End of switch(e2apMsg->present) */
6685 } /* End of E2APMsgHdlr */
6687 /**********************************************************************
6689 **********************************************************************/