1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains E2AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "ric_stub_sctp.h"
26 #include "ric_e2ap_msg_hdl.h"
27 #include "GlobalE2node-gNB-ID.h"
28 #include "ProtocolIE-FieldE2.h"
29 #include "InitiatingMessageE2.h"
30 #include "SuccessfulOutcomeE2.h"
31 #include "UnsuccessfulOutcomeE2.h"
34 #include "E2nodeComponentInterfaceF1.h"
35 #include "E2SM-KPM-RANfunction-Description.h"
36 #include "RANfunction-Name.h"
37 #include "RIC-EventTriggerStyle-Item.h"
38 #include "RIC-ReportStyle-Item.h"
39 #include "MeasurementInfo-Action-Item.h"
40 #include "MeasurementInfoItem.h"
41 #include "E2SM-KPM-ActionDefinition-Format1.h"
42 #include "E2SM-KPM-ActionDefinition.h"
43 #include "E2SM-KPM-EventTriggerDefinition-Format1.h"
44 #include "E2SM-KPM-EventTriggerDefinition.h"
47 /*******************************************************************
49 * @brief Assigns new transaction id to RIC initiated procedure
53 * Function : assignTransactionId
55 * Functionality: Assigns new transaction id to a RIC initiated
58 * @params[in] Region region
60 * @return ROK - success
63 * ****************************************************************/
65 uint8_t assignTransactionId(DuDb *duDb)
67 uint8_t currTransId = duDb->ricTransIdCounter;
69 /* Update to next valid value */
70 duDb->ricTransIdCounter++;
71 if(duDb->ricTransIdCounter == MAX_NUM_TRANSACTION)
72 duDb->ricTransIdCounter = 0;
77 /*******************************************************************
79 * @brief Sends E2 msg over SCTP
83 * Function : SendE2APMsg
85 * Functionality: Sends E2 msg over SCTP
87 * @params[in] Region region
89 * @return ROK - success
92 * ****************************************************************/
94 uint8_t SendE2APMsg(Region region, Pool pool, uint32_t duId)
98 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
100 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
102 ODU_PRINT_MSG(mBuf, 0,0);
104 if(sctpSend(duId, mBuf) != ROK)
106 DU_LOG("\nERROR --> E2AP : SCTP Send for E2 failed");
107 ODU_PUT_MSG_BUF(mBuf);
113 DU_LOG("\nERROR --> E2AP : ODU_ADD_POST_MSG_MULT failed");
114 ODU_PUT_MSG_BUF(mBuf);
117 ODU_PUT_MSG_BUF(mBuf);
121 DU_LOG("\nERROR --> E2AP : Failed to allocate memory");
128 /*******************************************************************
130 * @brief deallocate memory allocated in E2 Node Config Update Failure
134 * Function : FreeE2ConfigUpdateFail
136 * Functionality: deallocate memory allocated in E2 Node Config Update Failure
138 * @params[in] E2AP_PDU_t *e2apMsg
141 * ****************************************************************/
143 void FreeE2ConfigUpdateFail(E2AP_PDU_t *e2apMsg)
146 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdFail=NULL;
150 if(e2apMsg->choice.unsuccessfulOutcome)
152 e2NodeCfgUpdFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
153 if(e2NodeCfgUpdFail->protocolIEs.list.array)
155 for(arrIdx=0; arrIdx<e2NodeCfgUpdFail->protocolIEs.list.count; arrIdx++)
157 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array[arrIdx], sizeof(E2nodeConfigurationUpdateFailure_IEs_t));
159 RIC_FREE(e2NodeCfgUpdFail->protocolIEs.list.array, e2NodeCfgUpdFail->protocolIEs.list.size);
161 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
163 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
167 /*******************************************************************
169 * @brief Buld and send the E2 Node Config Update failure
173 * Function : BuildAndSendE2NodeConfigUpdateFailure
176 * - Buld and send the E2 Node Config Update failure
177 * @return ROK - success
180 * ****************************************************************/
182 uint8_t BuildAndSendE2NodeConfigUpdateFailure(uint32_t duId, uint8_t transId, uint8_t causeInfo, uint8_t causeReason)
184 E2AP_PDU_t *e2apMsg = NULL;
185 asn_enc_rval_t encRetVal;
187 uint8_t elementCnt=0;
188 bool memAllocFailed = false;
189 E2nodeConfigurationUpdateFailure_t *e2NodeCfgUpdateFail=NULL;
191 DU_LOG("\nINFO --> E2AP : Building E2 Node Config Update failure\n");
194 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
197 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
200 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
201 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
202 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
204 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
208 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2nodeConfigurationUpdate;
209 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
210 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2nodeConfigurationUpdateFailure;
211 e2NodeCfgUpdateFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2nodeConfigurationUpdateFailure;
214 e2NodeCfgUpdateFail->protocolIEs.list.count = elementCnt;
215 e2NodeCfgUpdateFail->protocolIEs.list.size = elementCnt * sizeof(struct E2nodeConfigurationUpdateFailure_IEs *);
217 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array, e2NodeCfgUpdateFail->protocolIEs.list.size);
218 if(e2NodeCfgUpdateFail->protocolIEs.list.array == NULLP)
220 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure array failed");
224 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
226 RIC_ALLOC(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx], sizeof(struct E2nodeConfigurationUpdateFailure_IEs));
227 if(e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx] == NULLP)
229 DU_LOG("\nERROR --> E2AP : Memory allocation for E2 node config update failure IEs failed");
230 memAllocFailed = true;
235 if(memAllocFailed == true)
242 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
243 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
244 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
245 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
248 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
249 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
250 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
251 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = causeInfo;
252 if(causeInfo == CauseE2_PR_e2Node)
253 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.e2Node = causeReason;
255 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.misc = causeReason;
258 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
259 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
260 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
261 e2NodeCfgUpdateFail->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
263 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
264 memset(encBuf, 0, ENC_BUF_MAX_LEN);
266 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
268 /* Check encode results */
269 if(encRetVal.encoded == ENCODE_FAIL)
271 DU_LOG("\nERROR --> E2AP : Could not encode E2 Node Config Update failure structure (at %s)\n",\
272 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
277 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Node Config Update Failure\n");
278 for(int i=0; i< encBufSize; i++)
280 DU_LOG("%x",encBuf[i]);
284 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
286 DU_LOG("\nERROR --> E2AP : Sending E2 Node Config Update Failure failed");
292 FreeE2ConfigUpdateFail(e2apMsg);
296 /*******************************************************************
298 * @brief process the E2 node configuration update
302 * Function : ProcE2NodeConfigUpdate
304 * Functionality: Process E2 node configuration update
306 * @return ROK - success
309 ******************************************************************/
311 void ProcE2NodeConfigUpdate(uint32_t duId, E2nodeConfigurationUpdate_t *e2NodeConfigUpdate)
313 uint8_t ieIdx = 0, duIdx = 0;
314 uint8_t transId = 0, e2NodeUpdateListIdx=0;
316 E2nodeComponentConfigUpdate_List_t *e2NodeUpdateList=NULLP;
317 E2nodeComponentConfigUpdate_ItemIEs_t *e2NodeUpdateItemIe=NULLP;
318 E2nodeComponentConfigUpdate_Item_t *e2NodeUpdateItem =NULLP;
320 if(e2NodeConfigUpdate)
322 if(e2NodeConfigUpdate->protocolIEs.list.array)
324 for(ieIdx=0; ieIdx < e2NodeConfigUpdate->protocolIEs.list.count; ieIdx++)
326 if(e2NodeConfigUpdate->protocolIEs.list.array[ieIdx])
328 switch(e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->id)
330 case ProtocolIE_IDE2_id_TransactionID:
331 transId = e2NodeConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
336 /*TODO - Other IEs will be handling in next gerrit*/
346 /*******************************************************************
348 * @brief Builds Global RIC Id Params
352 * Function : BuildGlobalRicId
354 * Functionality: Building the Plmn and ric id
356 * @params[in] GlobalRIC_ID_t *ricId
357 * @return ROK - success
360 * ****************************************************************/
362 uint8_t BuildGlobalRicId(GlobalRIC_ID_t *ricId)
365 uint8_t byteSize = 3;
369 ricId->pLMN_Identity.size = byteSize * sizeof(uint8_t);
370 RIC_ALLOC(ricId->pLMN_Identity.buf, ricId->pLMN_Identity.size);
371 buildPlmnId(ricCb.ricCfgParams.plmn , ricId->pLMN_Identity.buf);
373 ricId->ric_ID.size = byteSize * sizeof(uint8_t);
374 RIC_ALLOC(ricId->ric_ID.buf, ricId->ric_ID.size);
375 fillBitString(&ricId->ric_ID, unused, byteSize, ricVal);
380 /*******************************************************************
382 * @brief deallocate the memory allocated in E2SetupResponse
386 * Function : FreeE2SetupRsp
388 * Functionality: deallocate the memory allocated in E2SetupResponse
390 * @params[in] E2AP_PDU_t *e2apMsg
393 * ****************************************************************/
394 void FreeE2SetupRsp(E2AP_PDU_t *e2apMsg)
396 uint8_t arrIdx = 0, e2NodeConfigIdx=0, ranFuncIdx=0;
397 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
398 E2setupResponse_t *e2SetupRsp=NULL;
399 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItemIe=NULL;
400 E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList=NULL;
401 E2nodeComponentInterfaceF1_t *f1InterfaceInfo=NULL;
405 if(e2apMsg->choice.successfulOutcome)
407 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
408 if(e2SetupRsp->protocolIEs.list.array)
410 for(arrIdx=0; arrIdx<e2SetupRsp->protocolIEs.list.count; arrIdx++)
412 switch(e2SetupRsp->protocolIEs.list.array[arrIdx]->id)
414 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
416 ranFuncAcceptedList= &e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
417 if(ranFuncAcceptedList->list.array)
419 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
421 if(ranFuncAcceptedList->list.array[ranFuncIdx])
423 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
426 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
430 case ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck:
432 e2NodeConfigAdditionAckList =&e2SetupRsp->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAdditionAck_List;
433 if(e2NodeConfigAdditionAckList->list.count)
435 for(e2NodeConfigIdx=0; e2NodeConfigIdx<e2NodeConfigAdditionAckList->list.count; e2NodeConfigIdx++)
437 e2NodeAddAckItemIe = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[e2NodeConfigIdx];
438 if(e2NodeAddAckItemIe)
440 f1InterfaceInfo = e2NodeAddAckItemIe->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1;
443 RIC_FREE(f1InterfaceInfo->gNB_DU_ID.buf, f1InterfaceInfo->gNB_DU_ID.size);
444 RIC_FREE(f1InterfaceInfo, sizeof(E2nodeComponentInterfaceF1_t));
446 RIC_FREE(e2NodeAddAckItemIe, sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
449 RIC_FREE(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
454 RIC_FREE(e2SetupRsp->protocolIEs.list.array[arrIdx], sizeof(E2setupResponseIEs_t));
456 RIC_FREE(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
458 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
460 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
464 /*******************************************************************
466 * @brief Build E2node Component config addition ack list
470 * Function : BuildE2nodeComponentConfigAdditionAck
472 * Functionality: deallocate the memory allocated in E2SetupResponse
474 * @params[in] E2nodeComponentConfigAdditionAck_List_t
475 * *e2NodeConfigAdditionAckList
477 * @return ROK - success
479 * ****************************************************************/
481 uint8_t BuildE2nodeComponentConfigAdditionAck(E2nodeComponentConfigAdditionAck_List_t *e2NodeConfigAdditionAckList, DuDb *duDb)
484 E2nodeComponentConfigAdditionAck_ItemIEs_t *e2NodeAddAckItem;
486 e2NodeConfigAdditionAckList->list.count = 1;
487 e2NodeConfigAdditionAckList->list.size = e2NodeConfigAdditionAckList->list.count * sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t*);
488 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array, e2NodeConfigAdditionAckList->list.size);
489 if(e2NodeConfigAdditionAckList->list.array == NULLP)
491 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
495 for(arrIdx = 0; arrIdx< e2NodeConfigAdditionAckList->list.count; arrIdx++)
497 RIC_ALLOC(e2NodeConfigAdditionAckList->list.array[arrIdx], sizeof(E2nodeComponentConfigAdditionAck_ItemIEs_t));
498 if(e2NodeConfigAdditionAckList->list.array[arrIdx] == NULLP)
500 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
504 e2NodeAddAckItem = (E2nodeComponentConfigAdditionAck_ItemIEs_t*) e2NodeConfigAdditionAckList->list.array[0];
505 e2NodeAddAckItem->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck_Item;
506 e2NodeAddAckItem->criticality = CriticalityE2_reject;
507 e2NodeAddAckItem->value.present = E2nodeComponentConfigAdditionAck_ItemIEs__value_PR_E2nodeComponentConfigAdditionAck_Item;
508 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentInterfaceType = duDb->e2NodeComponent.interfaceType;
510 /* >E2 Node Component ID */
511 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.present = E2nodeComponentID_PR_e2nodeComponentInterfaceTypeF1;
512 RIC_ALLOC(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1,\
513 sizeof(E2nodeComponentInterfaceF1_t));
514 if(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1 == NULLP)
516 DU_LOG("\nERROR --> E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
519 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size = sizeof(uint8_t);
520 RIC_ALLOC(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf,\
521 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.size);
523 if(e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf == NULLP)
525 DU_LOG("\nERROR -->list. E2AP: Memory allocation failed for BuildE2nodeComponentConfigAdditionAck %d",__LINE__);
528 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentID.choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0] = duDb->e2NodeComponent.componentId;
530 /* >E2 Node Component Configuration Acknowledge*/
531 e2NodeAddAckItem->value.choice.E2nodeComponentConfigAdditionAck_Item.e2nodeComponentConfigurationAck.updateOutcome = \
532 E2nodeComponentConfigurationAck__updateOutcome_success;
537 /*******************************************************************
539 * @brief Build RAN function accepted list
543 * Function : BuildRanFunctionAcceptedList
545 * Functionality: Build RAN function accepted list
546 * ->For ProcedureCodeE2_id_E2setup or ProcedureCodeE2_id_RICserviceQuery
547 * we add all the RAN Function list which is present in RIC database.
548 * ->For any other procedures, we just fill the RAN functions whose ID
549 * is present in the recvList
553 * Count of ran functions to be accepted in the list
554 * Received list of RAN functions
558 * @return ROK - success
560 * ****************************************************************/
562 uint8_t BuildRanFunctionAcceptedList(DuDb *duDb, uint8_t count, RanFunction *ranFunAcceptedList, RANfunctionsID_List_t *ranFuncAcceptedList, uint8_t procedureCode)
564 uint8_t ranFuncIdx = 0;
565 RANfunctionID_ItemIEs_t *ranFuncAcceptedItemIe=NULL;
567 /* For ProcedureCodeE2_id_E2setup and ProcedureCodeE2_id_RICserviceQuery,
568 * the number of RAN function list items is equal to the number of
569 * ran function entries stored in the database.
570 * For any other procedure, the RAN function list count is equal
571 * to the count of ran functions obtained from the function's caller */
573 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
574 ranFuncAcceptedList->list.count = duDb->numOfRanFunction;
576 ranFuncAcceptedList->list.count = count;
578 ranFuncAcceptedList->list.size = ranFuncAcceptedList->list.count*sizeof(RANfunctionID_ItemIEs_t*);
579 RIC_ALLOC(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
580 if(ranFuncAcceptedList->list.array)
582 for(ranFuncIdx = 0; ranFuncIdx< ranFuncAcceptedList->list.count; ranFuncIdx++)
584 RIC_ALLOC(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
585 if(ranFuncAcceptedList->list.array[ranFuncIdx] == NULLP)
587 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array item");
590 ranFuncAcceptedItemIe = (RANfunctionID_ItemIEs_t*)ranFuncAcceptedList->list.array[ranFuncIdx];
591 ranFuncAcceptedItemIe->id = ProtocolIE_IDE2_id_RANfunctionID_Item;
592 ranFuncAcceptedItemIe->criticality= CriticalityE2_ignore;
593 ranFuncAcceptedItemIe->value.present = RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item;
594 if((procedureCode == ProcedureCodeE2_id_RICserviceQuery)||(procedureCode == ProcedureCodeE2_id_E2setup))
596 /* filling the RAN function information with the help of DuDb */
597 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = duDb->ranFunction[ranFuncIdx].id;
598 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= duDb->ranFunction[ranFuncIdx].revisionCounter;
602 /* filling the the RAN function information with the help received list of RAN functions */
603 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionID = ranFunAcceptedList[ranFuncIdx].id;
604 ranFuncAcceptedItemIe->value.choice.RANfunctionID_Item.ranFunctionRevision= ranFunAcceptedList[ranFuncIdx].revisionCounter;
610 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function added list array");
616 /*******************************************************************
618 * @brief Builds and sends the E2SetupResponse
622 * Function : BuildAndSendE2SetupRsp
624 * Functionality: Constructs the F1SetupResponse message and sends
625 * it back to the DU through SCTP.
627 * @params[in] void **buf,Buffer to which encoded pattern is written into
628 * @params[in] int *size,size of buffer
630 * @return ROK - success
633 * ****************************************************************/
635 uint8_t BuildAndSendE2SetupRsp(DuDb *duDb, uint8_t transId)
637 E2AP_PDU_t *e2apMsg = NULL;
638 E2setupResponse_t *e2SetupRsp;
639 asn_enc_rval_t encRetVal;
642 bool memAllocFailed = false;
644 DU_LOG("\nINFO --> E2AP : Building E2 Setup Response\n");
647 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
650 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
653 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
654 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
655 if(e2apMsg->choice.successfulOutcome == NULLP)
657 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
661 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
662 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
663 e2apMsg->choice.successfulOutcome->value.present = \
664 SuccessfulOutcomeE2__value_PR_E2setupResponse;
665 e2SetupRsp = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
668 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
669 if(duDb->numOfRanFunction)
672 e2SetupRsp->protocolIEs.list.count = elementCnt;
673 e2SetupRsp->protocolIEs.list.size = elementCnt * sizeof(E2setupResponseIEs_t*);
675 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array, e2SetupRsp->protocolIEs.list.size);
676 if(e2SetupRsp->protocolIEs.list.array == NULLP)
678 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
682 for(idx=0; idx<elementCnt; idx++)
684 RIC_ALLOC(e2SetupRsp->protocolIEs.list.array[idx], sizeof(E2setupResponseIEs_t));
685 if(e2SetupRsp->protocolIEs.list.array[idx] == NULLP)
687 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
688 memAllocFailed = true;
693 if(memAllocFailed == true)
695 DU_LOG("\nERROR --> E2AP : Memory allocation for E2ResponseIEs failed");
700 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_TransactionID;
701 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
702 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_TransactionID;
703 e2SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID = transId;
707 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalRIC_ID;
708 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
709 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_GlobalRIC_ID;
711 if(BuildGlobalRicId(&(e2SetupRsp->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID))!=ROK)
713 DU_LOG("\nERROR --> E2AP : Failed to build Global Ric Id");
717 if(duDb->numOfRanFunction)
719 /* Accepted RAN function Id */
721 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
722 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
723 e2SetupRsp->protocolIEs.list.array[idx]->value.present = E2setupResponseIEs__value_PR_RANfunctionsID_List;
724 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &e2SetupRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_E2setup)!=ROK)
726 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
731 /* E2 Node Component Configuration Addition Acknowledge List*/
733 e2SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_E2nodeComponentConfigAdditionAck;
734 e2SetupRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
735 e2SetupRsp->protocolIEs.list.array[idx]->value.present = \
736 E2setupResponseIEs__value_PR_E2nodeComponentConfigAdditionAck_List;
737 if(BuildE2nodeComponentConfigAdditionAck(&e2SetupRsp->protocolIEs.list.array[idx]->\
738 value.choice.E2nodeComponentConfigAdditionAck_List, duDb) != ROK)
740 DU_LOG("\nERROR --> E2AP : Failed to build E2Node Component config addition ack list");
744 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
745 memset(encBuf, 0, ENC_BUF_MAX_LEN);
747 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
749 /* Check encode results */
750 if(encRetVal.encoded == ENCODE_FAIL)
752 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupResponse structure (at %s)\n",\
753 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
758 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupResponse\n");
759 for(int i=0; i< encBufSize; i++)
761 DU_LOG("%x",encBuf[i]);
765 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
767 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Response failed");
773 FreeE2SetupRsp(e2apMsg);
774 BuildAndSendRicSubscriptionReq(duDb);
778 /*******************************************************************
780 * @brief Free RIC Subscription Details
784 * Function : FreeRicSubsDetails
786 * Functionality: Free the RIC Subscription Details
788 * @params[in] RICsubscriptionDetails_t *subsDetails
791 * ****************************************************************/
792 void FreeRicSubsDetails(RICsubscriptionDetails_t *subsDetails)
794 uint8_t elementIdx = 0;
795 RICaction_ToBeSetup_ItemIEs_t *actionItem = NULLP;
797 RIC_FREE(subsDetails->ricEventTriggerDefinition.buf, subsDetails->ricEventTriggerDefinition.size);
799 if(subsDetails->ricAction_ToBeSetup_List.list.array)
801 for(elementIdx = 0; elementIdx < subsDetails->ricAction_ToBeSetup_List.list.count; elementIdx++)
803 if(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
805 actionItem = (RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx];
806 if(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
808 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf, \
809 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size);
810 RIC_FREE(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
812 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t))
815 RIC_FREE(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
819 /*******************************************************************
821 * @brief Free RIC Subscription Request
825 * Function : FreeRicSubscriptionReq
827 * Functionality : Free RIC Subscription Request
829 * @return ROK - success
832 ******************************************************************/
833 void FreeRicSubscriptionReq(E2AP_PDU_t *e2apRicMsg)
836 RICsubscriptionRequest_t *ricSubscriptionReq;
840 if(e2apRicMsg->choice.initiatingMessage)
842 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
843 if(ricSubscriptionReq->protocolIEs.list.array)
845 for(idx=0; idx < ricSubscriptionReq->protocolIEs.list.count; idx++)
847 switch(ricSubscriptionReq->protocolIEs.list.array[idx]->id)
849 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
851 FreeRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails));
855 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
857 RIC_FREE(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
859 RIC_FREE(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
861 RIC_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
865 /*******************************************************************
867 * @brief Builds Ric Request Id
871 * Function : BuildNewRicRequestId
873 * Functionality: Assign new Ric Request ID
875 * @params[in] RIC request ID to be sent
876 * RIC request ID stored in DB
877 * @return ROK - success
880 * ****************************************************************/
882 uint8_t BuildNewRicRequestId(RICrequestID_t *ricReqId, RicRequestId *reqIdDb)
884 static uint16_t requestorId = 0;
885 static uint16_t instanceId = 0;
887 if(ricReqId != NULLP)
889 ricReqId->ricRequestorID = ++requestorId;
890 ricReqId->ricInstanceID = ++instanceId;
892 reqIdDb->requestorId = ricReqId->ricRequestorID;
893 reqIdDb->instanceId = ricReqId->ricInstanceID;
898 /*******************************************************************
900 * @brief Free RIC Action Definition
904 * Function : FreeRicActionDefinition
906 * Functionality: Free RIC Action Definition
908 * @params[in] E2SM-KPM Action definition
911 * ****************************************************************/
912 void FreeRicActionDefinition(E2SM_KPM_ActionDefinition_t actionDef)
914 uint8_t elementIdx = 0;
915 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
916 MeasurementInfoItem_t *measItem = NULLP;
918 switch(actionDef.actionDefinition_formats.present)
920 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1:
922 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1)
924 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
925 if(actionFormat1->measInfoList.list.array)
927 for(elementIdx = 0; elementIdx < actionFormat1->measInfoList.list.count; elementIdx++)
929 if(actionFormat1->measInfoList.list.array[elementIdx])
931 measItem = actionFormat1->measInfoList.list.array[elementIdx];
932 switch(measItem->measType.present)
934 case MeasurementType_PR_NOTHING:
935 case MeasurementType_PR_measID:
937 case MeasurementType_PR_measName:
939 RIC_FREE(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size)
943 RIC_FREE(measItem, sizeof(MeasurementInfoItem_t));
946 RIC_FREE(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
948 RIC_FREE(actionFormat1, sizeof(E2SM_KPM_ActionDefinition_Format1_t));
953 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format2:
954 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format3:
955 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format4:
956 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format5:
957 case E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_NOTHING:
962 /*******************************************************************
964 * @brief Fill RIC Action Definition
968 * Function : fillRicActionDef
970 * Functionality: Fill RIC Action Definition
972 * @params[in] RIC Action definition
976 * ****************************************************************/
977 uint8_t fillRicActionDef(RICactionDefinition_t *ricActionDef)
979 uint8_t ret = RFAILED;
980 asn_enc_rval_t encRetVal;
981 uint8_t elementCnt = 0, elementIdx = 0;
982 char *measurementTypeName[] = {"RRU.PrbTotDl", "RRU.PrbTotUl"};
983 E2SM_KPM_ActionDefinition_t actionDef;
984 E2SM_KPM_ActionDefinition_Format1_t *actionFormat1 = NULLP;
985 MeasurementInfoItem_t *measItem = NULLP;
989 /* Fill E2SM-KPM Action Definition Format 1 */
992 actionDef.ric_Style_Type = RIC_STYLE_TYPE;
994 /* RIC Action Definition Format 1 */
995 actionDef.actionDefinition_formats.present = \
996 E2SM_KPM_ActionDefinition__actionDefinition_formats_PR_actionDefinition_Format1;
998 RIC_ALLOC(actionDef.actionDefinition_formats.choice.actionDefinition_Format1, \
999 sizeof(E2SM_KPM_ActionDefinition_Format1_t));
1000 if(actionDef.actionDefinition_formats.choice.actionDefinition_Format1 == NULLP)
1002 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1005 actionFormat1 = actionDef.actionDefinition_formats.choice.actionDefinition_Format1;
1007 /* Measurement Info List */
1009 actionFormat1->measInfoList.list.count = elementCnt;
1010 actionFormat1->measInfoList.list.size = elementCnt * sizeof(MeasurementInfoItem_t *);
1011 RIC_ALLOC(actionFormat1->measInfoList.list.array, actionFormat1->measInfoList.list.size);
1012 if(actionFormat1->measInfoList.list.array == NULL)
1014 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1018 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1020 RIC_ALLOC(actionFormat1->measInfoList.list.array[elementIdx], sizeof(MeasurementInfoItem_t));
1021 if(actionFormat1->measInfoList.list.array[elementIdx] == NULLP)
1023 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1027 measItem = actionFormat1->measInfoList.list.array[elementIdx];
1028 measItem->measType.present = MeasurementType_PR_measName;
1030 measItem->measType.choice.measName.size = strlen(measurementTypeName[elementIdx]);
1031 RIC_ALLOC(measItem->measType.choice.measName.buf, measItem->measType.choice.measName.size);
1032 if(measItem->measType.choice.measName.buf == NULLP)
1034 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1037 memcpy(measItem->measType.choice.measName.buf, measurementTypeName[elementIdx], measItem->measType.choice.measName.size);
1039 if(elementIdx < elementCnt)
1042 /* Granularity Period */
1043 actionFormat1->granulPeriod = RIC_ACTION_GRANULARITY_PERIOD; /* In ms */
1045 /* Prints the Msg formed */
1046 xer_fprint(stdout, &asn_DEF_E2SM_KPM_ActionDefinition, &actionDef);
1048 /* Encode E2SM-KPM RIC Action Definition */
1049 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1051 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_ActionDefinition, 0, &actionDef, PrepFinalEncBuf, encBuf);
1052 if(encRetVal.encoded == ENCODE_FAIL)
1054 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM action definition structure (at %s)\n",\
1055 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1059 /* Copty encoded E2SM-KPM RIC action definition to E2AP octet string buffer */
1060 ricActionDef->size = encBufSize;
1061 RIC_ALLOC(ricActionDef->buf, encBufSize);
1062 if(ricActionDef->buf == NULLP)
1064 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1067 memcpy(ricActionDef->buf, encBuf, encBufSize);
1073 FreeRicActionDefinition(actionDef);
1077 /*******************************************************************
1079 * @brief Fills RIC Action To Be Setup Item
1083 * Function : fillActionToBeSetup
1085 * Functionality: Fill the RIC Action To Be Setup Ite,
1086 * RIC subscription DB
1088 * @params[in] RICaction_ToBeSetup_ItemIEs_t *items
1089 * @return ROK - success
1092 * ****************************************************************/
1093 uint8_t fillActionToBeSetup(RICaction_ToBeSetup_ItemIEs_t *actionItem, RicSubscription *ricSubsDb)
1095 static uint8_t ricActionId = 0;
1097 if(actionItem == NULLP)
1099 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1105 actionItem->id = ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item;
1106 actionItem->criticality = CriticalityE2_ignore;
1107 actionItem->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
1110 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID = ++ricActionId;
1111 ricSubsDb->actionSequence[ricActionId-1].id = \
1112 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
1114 /* RIC Action Type */
1115 actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
1117 /* RIC Action Definition */
1118 RIC_ALLOC(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition, sizeof(RICactionDefinition_t));
1119 if(!actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1121 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1124 if(fillRicActionDef(actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition) != ROK)
1126 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1130 ricSubsDb->numOfActions++;
1134 memset(&ricSubsDb->actionSequence[ricActionId-1], 0, sizeof(ActionInfo));
1138 /*******************************************************************
1140 * @brief Free Event Trigger Definition
1144 * Function : FreeEventTriggerDef
1146 * Functionality: Free Event Trigger Definition
1148 * @params[in] E2SM-KPM Event Trigger Definition
1151 * ****************************************************************/
1152 void FreeEventTriggerDef(E2SM_KPM_EventTriggerDefinition_t *eventTiggerDef)
1156 switch(eventTiggerDef->eventDefinition_formats.present)
1158 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_NOTHING:
1160 case E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1:
1161 RIC_FREE(eventTiggerDef->eventDefinition_formats.choice.eventDefinition_Format1, \
1162 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
1168 /*******************************************************************
1170 * @brief Fill Event Trigger Definition
1174 * Function : fillEventTriggerDef
1176 * Functionality: Fill Event Trigger Definition
1178 * @params[in] RIC Event Trigger Definition
1182 * ****************************************************************/
1183 uint8_t fillEventTriggerDef(RICeventTriggerDefinition_t *ricEventTriggerDef)
1185 uint8_t ret = RFAILED;
1186 asn_enc_rval_t encRetVal;
1187 E2SM_KPM_EventTriggerDefinition_t eventTiggerDef;
1191 /* Fill E2SM-KPM Event Trigger Definition Format 1 */
1192 eventTiggerDef.eventDefinition_formats.present = \
1193 E2SM_KPM_EventTriggerDefinition__eventDefinition_formats_PR_eventDefinition_Format1;
1195 RIC_ALLOC(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1, \
1196 sizeof(E2SM_KPM_EventTriggerDefinition_Format1_t));
1197 if(eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1 == NULLP)
1199 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1203 eventTiggerDef.eventDefinition_formats.choice.eventDefinition_Format1->reportingPeriod = 1000; /* In ms */
1205 /* Prints the Msg formed */
1206 xer_fprint(stdout, &asn_DEF_E2SM_KPM_EventTriggerDefinition, &eventTiggerDef);
1208 /* Encode E2SM-KPM Event Trigger Definition */
1209 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1211 encRetVal = aper_encode(&asn_DEF_E2SM_KPM_EventTriggerDefinition, 0, &eventTiggerDef, PrepFinalEncBuf, encBuf);
1212 if(encRetVal.encoded == ENCODE_FAIL)
1214 DU_LOG("\nERROR --> E2AP : Could not encode E2SM-KPM event trigger definition structure (at %s)\n",\
1215 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1219 /* Copy encoded E2SM-KPM event trigger definition to E2AP octet string buffer */
1220 ricEventTriggerDef->size = encBufSize;
1221 RIC_ALLOC(ricEventTriggerDef->buf, encBufSize);
1222 if(ricEventTriggerDef->buf == NULLP)
1224 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1227 memcpy(ricEventTriggerDef->buf, encBuf, encBufSize);
1233 FreeEventTriggerDef(&eventTiggerDef);
1237 /*******************************************************************
1239 * @brief builds RIC Subscription Details
1243 * Function : BuildsRicSubsDetails
1245 * Functionality: Builds the RIC Subscription Details
1247 * @params[in] RIC Subscription details to be filled
1248 * RIC subscriotion DB
1249 * @return ROK - success
1252 * ****************************************************************/
1254 uint8_t BuildRicSubsDetails(RICsubscriptionDetails_t *subsDetails, RicSubscription *ricSubsDb)
1256 uint8_t elementCnt = 0;
1257 uint8_t elementIdx = 0;
1259 if(subsDetails == NULLP)
1261 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1267 /* RIC Event Trigger Definition */
1268 if(fillEventTriggerDef(&subsDetails->ricEventTriggerDefinition) != ROK)
1270 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1274 /* RIC Actions To Be Setup List */
1276 subsDetails->ricAction_ToBeSetup_List.list.count = elementCnt;
1277 subsDetails->ricAction_ToBeSetup_List.list.size = elementCnt * sizeof(RICaction_ToBeSetup_ItemIEs_t *);
1278 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array, subsDetails->ricAction_ToBeSetup_List.list.size);
1279 if(subsDetails->ricAction_ToBeSetup_List.list.array == NULLP)
1281 DU_LOG("\nERROR --> E2AP : Memory allocation for RICactionToBeSetup Items failed");
1285 for(elementIdx = 0; elementIdx < elementCnt; elementIdx++)
1287 RIC_ALLOC(subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], sizeof(RICaction_ToBeSetup_ItemIEs_t));
1288 if(!subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx])
1290 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1294 if(elementIdx < elementCnt)
1298 if(fillActionToBeSetup((RICaction_ToBeSetup_ItemIEs_t *)subsDetails->ricAction_ToBeSetup_List.list.array[elementIdx], \
1301 DU_LOG("\nERROR --> E2AP : Failed at [%s] : line [%d]", __func__, __LINE__);
1310 /*******************************************************************
1312 * @brief Builds and Send the RicSubscriptionReq
1316 * Function : BuildAndSendRicSubscriptionReq
1318 * Functionality:Fills the RicSubscriptionReq
1320 * @return ROK - success
1323 ******************************************************************/
1324 uint8_t BuildAndSendRicSubscriptionReq(DuDb *duDb)
1326 uint8_t ret = RFAILED;
1327 E2AP_PDU_t *e2apRicMsg = NULL;
1328 RICsubscriptionRequest_t *ricSubscriptionReq;
1331 asn_enc_rval_t encRetVal; /* Encoder return value */
1332 RanFunction *ranFuncDb = &duDb->ranFunction[0];
1334 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Request\n");
1338 RIC_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
1339 if(e2apRicMsg == NULLP)
1341 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1345 e2apRicMsg->present = E2AP_PDU_PR_initiatingMessage;
1346 RIC_ALLOC(e2apRicMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1347 if(e2apRicMsg->choice.initiatingMessage == NULLP)
1349 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1352 e2apRicMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICsubscription;
1353 e2apRicMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1354 e2apRicMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICsubscriptionRequest;
1356 ricSubscriptionReq = &e2apRicMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
1359 ricSubscriptionReq->protocolIEs.list.count = elementCnt;
1360 ricSubscriptionReq->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionRequest_IEs_t);
1362 /* Initialize the subscription members */
1363 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array, ricSubscriptionReq->protocolIEs.list.size);
1364 if(ricSubscriptionReq->protocolIEs.list.array == NULLP)
1366 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1370 for(idx=0; idx<elementCnt; idx++)
1372 RIC_ALLOC(ricSubscriptionReq->protocolIEs.list.array[idx], sizeof(RICsubscriptionRequest_IEs_t));
1373 if(ricSubscriptionReq->protocolIEs.list.array[idx] == NULLP)
1375 DU_LOG("\nERROR --> E2AP : Memory allocation failed at [%s] : line [%d]", __func__, __LINE__);
1379 if(idx < elementCnt)
1382 /* Filling RIC Request Id */
1384 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
1385 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1386 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
1387 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
1388 if(BuildNewRicRequestId(&ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICrequestID, \
1389 &ranFuncDb->subscriptionList[ranFuncDb->numOfSubscription].requestId) != ROK)
1391 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
1396 /* Filling RAN Function Id */
1398 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
1399 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1400 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
1401 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
1402 ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID = ranFuncDb->id;
1404 /* Filling RIC Subscription Details */
1406 ricSubscriptionReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICsubscriptionDetails;
1407 ricSubscriptionReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1408 ricSubscriptionReq->protocolIEs.list.array[idx]->value.present =\
1409 RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
1410 if(BuildRicSubsDetails(&(ricSubscriptionReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails),\
1411 &ranFuncDb->subscriptionList[ranFuncDb->numOfSubscription]) != ROK)
1413 DU_LOG("\nERROR --> E2AP : Failed at [%s] : Line [%d]", __func__, __LINE__);
1417 /* Prints the Msg formed */
1418 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
1420 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1422 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf, encBuf);
1423 if(encRetVal.encoded == ENCODE_FAIL)
1425 DU_LOG("\nERROR --> E2AP : Could not encode RicSubscriptionRequest structure (at %s)\n",\
1426 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1431 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RicSubscriptionRequest\n");
1432 for(int i=0; i< encBufSize; i++)
1434 DU_LOG("%x",encBuf[i]);
1439 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
1441 DU_LOG("\nERROR --> E2AP : Sending RIC subscription Request failed");
1445 ranFuncDb->numOfSubscription++;
1451 memset(&ranFuncDb->subscriptionList[ranFuncDb->numOfSubscription], 0, sizeof(RicSubscription));
1452 FreeRicSubscriptionReq(e2apRicMsg);
1456 /*******************************************************************
1458 * @brief Process RicSubscriptionResponse
1462 * Function : ProcRicSubscriptionRsp
1464 * Functionality: Processes RicSubscriptionRsp
1466 * @return ROK - void
1468 ******************************************************************/
1470 void ProcRicSubscriptionResponse(uint32_t duId, RICsubscriptionResponse_t *ricSubscriptionRsp)
1472 uint8_t duIdx = 0, ieIdx = 0,subsIdx = 0, notAdmitIdx = 0;
1473 uint8_t ranFuncId = 0, actionId = 0;
1475 bool ricReqIdDecoded = false;
1476 RicRequestId ricReqId;
1477 RanFunction *ranFuncDb = NULLP;
1478 RICsubscriptionResponse_IEs_t *ricSubsRspIe = NULLP;
1479 RICaction_NotAdmitted_List_t *notAdmitList = NULLP;
1481 DU_LOG("\nINFO --> E2AP : RIC Subscription Response received");
1484 SEARCH_DU_DB(duIdx, duId, duDb);
1487 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
1491 memset(&ricReqId, 0, sizeof(RicRequestId));
1492 if(ricSubscriptionRsp)
1494 if(ricSubscriptionRsp->protocolIEs.list.array)
1496 for(ieIdx=0; ieIdx<ricSubscriptionRsp->protocolIEs.list.count; ieIdx++)
1498 if(ricSubscriptionRsp->protocolIEs.list.array[ieIdx])
1500 ricSubsRspIe = ricSubscriptionRsp->protocolIEs.list.array[ieIdx];
1501 switch(ricSubscriptionRsp->protocolIEs.list.array[ieIdx]->id)
1503 case ProtocolIE_IDE2_id_RICrequestID:
1505 ricReqId.requestorId = ricSubsRspIe->value.choice.RICrequestID.ricRequestorID;
1506 ricReqId.instanceId = ricSubsRspIe->value.choice.RICrequestID.ricInstanceID;
1507 ricReqIdDecoded = true;
1510 case ProtocolIE_IDE2_id_RANfunctionID:
1512 ranFuncId = ricSubsRspIe->value.choice.RANfunctionID;
1513 if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
1515 ranFuncDb = &duDb->ranFunction[ranFuncId-1];
1519 DU_LOG("\nERROR --> E2AP : ProcRicSubscriptionResponse: RAN Function ID [%d] not found", ranFuncId);
1524 case ProtocolIE_IDE2_id_RICactions_Admitted:
1528 case ProtocolIE_IDE2_id_RICactions_NotAdmitted:
1530 if(!(ranFuncDb && ricReqIdDecoded))
1533 notAdmitList = &ricSubsRspIe->value.choice.RICaction_NotAdmitted_List;
1534 for(notAdmitIdx = 0; notAdmitIdx < notAdmitList->list.count; notAdmitIdx++)
1536 actionId = ((RICaction_NotAdmitted_ItemIEs_t *)(notAdmitList->list.array[notAdmitIdx]))->\
1537 value.choice.RICaction_NotAdmitted_Item.ricActionID;
1539 /* Remove action from RAN Function's subscription list */
1540 for(subsIdx = 0; subsIdx < ranFuncDb->numOfSubscription; subsIdx++)
1542 if((ranFuncDb->subscriptionList[subsIdx].requestId.requestorId == ricReqId.requestorId) &&
1543 (ranFuncDb->subscriptionList[subsIdx].requestId.instanceId == ricReqId.instanceId))
1545 if(ranFuncDb->subscriptionList[subsIdx].actionSequence[actionId-1].id == actionId)
1547 memset(&ranFuncDb->subscriptionList[subsIdx].actionSequence[actionId-1], 0, \
1548 sizeof(ActionInfo));
1549 ranFuncDb->subscriptionList[subsIdx].numOfActions--;
1564 /*******************************************************************
1566 * @brief deallocate the memory allocated in E2SetupFailure
1570 * Function : FreeE2SetupFailure
1572 * Functionality: deallocate the memory allocated in E2SetupFailure
1574 * @params[in] E2AP_PDU_t *e2apMsg
1577 * ****************************************************************/
1578 void FreeE2SetupFailure(E2AP_PDU_t *e2apMsg)
1581 E2setupFailure_t *e2SetupFail;
1585 if(e2apMsg->choice.unsuccessfulOutcome)
1587 e2SetupFail = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
1588 if(e2SetupFail->protocolIEs.list.array)
1590 for(arrIdx=0; arrIdx<e2SetupFail->protocolIEs.list.count; arrIdx++)
1592 RIC_FREE(e2SetupFail->protocolIEs.list.array[arrIdx], sizeof(E2setupFailureIEs_t));
1594 RIC_FREE(e2SetupFail->protocolIEs.list.array, e2SetupFail->protocolIEs.list.size);
1596 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
1598 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1602 /*******************************************************************
1604 * @brief Buld and send the E2 Setup failure
1608 * Function : BuildAndSendE2SetupFailure
1611 * - Buld and send the E2 Setup failure
1612 * @return ROK - success
1615 * ****************************************************************/
1617 uint8_t BuildAndSendE2SetupFailure(uint32_t duId, uint8_t transId)
1619 E2AP_PDU_t *e2apMsg = NULL;
1620 E2setupFailure_t *e2SetupFailure;
1621 asn_enc_rval_t encRetVal;
1624 bool memAllocFailed = false;
1626 DU_LOG("\nINFO --> E2AP : Building E2 Setup failure\n");
1629 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1630 if(e2apMsg == NULLP)
1632 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1635 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
1636 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
1637 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
1639 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1643 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_E2setup;
1644 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
1645 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_E2setupFailure;
1646 e2SetupFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.E2setupFailure;
1649 e2SetupFailure->protocolIEs.list.count = elementCnt;
1650 e2SetupFailure->protocolIEs.list.size = elementCnt * sizeof(struct E2setupFailureIEs *);
1652 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array, e2SetupFailure->protocolIEs.list.size);
1653 if(e2SetupFailure->protocolIEs.list.array == NULLP)
1655 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
1659 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
1661 RIC_ALLOC(e2SetupFailure->protocolIEs.list.array[arrIdx], sizeof(struct E2setupFailureIEs));
1662 if(e2SetupFailure->protocolIEs.list.array[arrIdx] == NULLP)
1664 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
1665 memAllocFailed = true;
1670 if(memAllocFailed == true)
1672 DU_LOG("\nERROR --> E2AP : Memory allocation for E2FailureIEs failed");
1678 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
1679 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1680 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TransactionID;
1681 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
1684 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
1685 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
1686 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_CauseE2;
1687 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.present = CauseE2_PR_protocol;
1688 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2.choice.protocol = CauseE2Protocol_unspecified;
1691 e2SetupFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
1692 e2SetupFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
1693 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.present = E2setupFailureIEs__value_PR_TimeToWaitE2;
1694 e2SetupFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
1696 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1697 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1699 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
1701 /* Check encode results */
1702 if(encRetVal.encoded == ENCODE_FAIL)
1704 DU_LOG("\nERROR --> E2AP : Could not encode E2 Setup failure structure (at %s)\n",\
1705 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1710 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Setup Failure\n");
1711 for(int i=0; i< encBufSize; i++)
1713 DU_LOG("%x",encBuf[i]);
1717 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
1719 DU_LOG("\nERROR --> E2AP : Sending E2 Setup Failure failed");
1725 FreeE2SetupFailure(e2apMsg);
1728 /*******************************************************************
1730 * @brief process the e2setup request
1734 * Function : ProcE2SetupReq
1736 * Functionality: process the e2setup request
1738 * @return ROK - success
1741 ******************************************************************/
1743 uint8_t ProcE2SetupReq(uint32_t *duId, E2setupRequest_t *e2SetupReq)
1745 uint8_t arrIdx = 0, e2NodeAddListIdx =0, duIdx = 0, transId =0, ranFuncIdx;
1747 E2nodeComponentConfigAddition_List_t *e2NodeAddList;
1748 E2nodeComponentConfigAddition_ItemIEs_t *e2NodeAddItem;
1749 RANfunction_ItemIEs_t *ranFuncItemIe;
1750 RANfunction_Item_t *ranFunItem;
1751 RANfunctions_List_t *ranFunctionsList;
1755 if(e2SetupReq->protocolIEs.list.array)
1757 for(arrIdx=0; arrIdx<e2SetupReq->protocolIEs.list.count; arrIdx++)
1759 if(e2SetupReq->protocolIEs.list.array[arrIdx])
1761 switch(e2SetupReq->protocolIEs.list.array[arrIdx]->id)
1763 case ProtocolIE_IDE2_id_TransactionID:
1765 transId = e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
1768 case ProtocolIE_IDE2_id_GlobalE2node_ID:
1770 if(e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID)
1772 *duId =e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.GlobalE2node_ID.choice.gNB->gNB_DU_ID->buf[0];
1774 SEARCH_DU_DB(duIdx, *duId, duDb);
1777 duDb = &ricCb.duInfo[ricCb.numDu];
1780 memset(duDb, 0, sizeof(DuDb));
1785 case ProtocolIE_IDE2_id_RANfunctionsAdded:
1787 ranFunctionsList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
1789 if(ranFunctionsList->list.array)
1791 for(ranFuncIdx=0;ranFuncIdx<ranFunctionsList->list.count; ranFuncIdx++)
1793 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFunctionsList->list.array[ranFuncIdx];
1794 ranFunItem = &ranFuncItemIe->value.choice.RANfunction_Item;
1795 duDb->ranFunction[ranFunItem->ranFunctionID-1].id = ranFunItem->ranFunctionID;
1796 duDb->ranFunction[ranFunItem->ranFunctionID-1].revisionCounter = ranFunItem->ranFunctionRevision;
1797 duDb->numOfRanFunction++;
1802 case ProtocolIE_IDE2_id_E2nodeComponentConfigAddition:
1804 e2NodeAddList = &e2SetupReq->protocolIEs.list.array[arrIdx]->value.choice.E2nodeComponentConfigAddition_List;
1805 if(e2NodeAddList->list.array)
1807 for(e2NodeAddListIdx = 0; e2NodeAddListIdx< e2NodeAddList->list.count; e2NodeAddListIdx++)
1809 if(e2NodeAddList->list.array[e2NodeAddListIdx])
1812 (E2nodeComponentConfigAddition_ItemIEs_t *)e2NodeAddList->list.array[e2NodeAddListIdx];
1813 if(e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.\
1814 choice.e2nodeComponentInterfaceTypeF1)
1816 duDb->e2NodeComponent.interfaceType = F1;
1817 duDb->e2NodeComponent.componentId = \
1818 e2NodeAddItem->value.choice.E2nodeComponentConfigAddition_Item.e2nodeComponentID.\
1819 choice.e2nodeComponentInterfaceTypeF1->gNB_DU_ID.buf[0];
1834 if(BuildAndSendE2SetupRsp(duDb, transId) !=ROK)
1836 DU_LOG("\nERROR --> E2AP : Failed to build and send E2 setup response");
1841 /*******************************************************************
1843 * @brief Deallocate the memory allocated for E2 Reset Response
1847 * Function : FreeE2ResetResponse
1850 * - freeing the memory allocated for E2ResetResponse
1852 * @params[in] E2AP_PDU_t *e2apMsg
1853 * @return ROK - success
1856 * ****************************************************************/
1857 void FreeE2ResetResponse(E2AP_PDU_t *e2apMsg)
1860 ResetResponseE2_t *resetResponse;
1862 if(e2apMsg != NULLP)
1864 if(e2apMsg->choice.successfulOutcome != NULLP)
1866 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
1867 if(resetResponse->protocolIEs.list.array)
1869 for(ieIdx=0; ieIdx < resetResponse->protocolIEs.list.count; ieIdx++)
1871 if(resetResponse->protocolIEs.list.array[ieIdx])
1873 RIC_FREE(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
1876 RIC_FREE(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
1878 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1880 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1884 /*******************************************************************
1886 * @brief Buld and send the E2 Reset Response msg
1890 * Function : BuildAndSendE2ResetResponse
1893 * - Buld and send the E2 Reset Response Message
1894 * @return ROK - success
1897 * ****************************************************************/
1898 uint8_t BuildAndSendResetResponse(uint32_t duId, uint8_t transId)
1900 uint8_t ieIdx = 0, elementCnt = 0;
1901 uint8_t ret = RFAILED;
1902 E2AP_PDU_t *e2apMsg = NULLP;
1903 ResetResponseE2_t *resetResponse;
1904 asn_enc_rval_t encRetVal; /* Encoder return value */
1906 DU_LOG("\nINFO --> E2AP : Building E2 Reset Response Message\n");
1909 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1910 if(e2apMsg == NULLP)
1912 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse(): Memory allocation for E2AP-PDU failed");
1915 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
1917 RIC_ALLOC(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
1918 if(e2apMsg->choice.successfulOutcome == NULLP)
1920 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for successfulOutcome");
1921 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
1925 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_Reset;
1926 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
1927 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_ResetResponseE2;
1928 resetResponse = &e2apMsg->choice.successfulOutcome->value.choice.ResetResponseE2;
1931 resetResponse->protocolIEs.list.count = elementCnt;
1932 resetResponse->protocolIEs.list.size = elementCnt * sizeof(ResetResponseIEs_t *);
1933 RIC_ALLOC(resetResponse->protocolIEs.list.array, resetResponse->protocolIEs.list.size);
1934 if(!resetResponse->protocolIEs.list.array)
1936 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array");
1940 for(ieIdx=0; ieIdx < elementCnt; ieIdx++)
1942 RIC_ALLOC(resetResponse->protocolIEs.list.array[ieIdx], sizeof(ResetResponseIEs_t));
1943 if(!resetResponse->protocolIEs.list.array[ieIdx])
1945 DU_LOG("\nERROR --> E2AP : BuildAndSendResetResponse: Memory allocation failed for protocol IE array element");
1949 if(ieIdx < elementCnt)
1953 resetResponse->protocolIEs.list.array[ieIdx]->id = ProtocolIE_IDE2_id_TransactionID;
1954 resetResponse->protocolIEs.list.array[ieIdx]->criticality = CriticalityE2_reject;
1955 resetResponse->protocolIEs.list.array[ieIdx]->value.present = ResetResponseIEs__value_PR_TransactionID;
1956 resetResponse->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = transId;
1958 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1960 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1962 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
1963 if(encRetVal.encoded == ENCODE_FAIL)
1965 DU_LOG("\nERROR --> E2AP : Could not encode E2 reset response structure (at %s)\n",\
1966 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1971 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2 Reset Response \n");
1972 for(int i=0; i< encBufSize; i++)
1974 DU_LOG("%x",encBuf[i]);
1979 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
1981 DU_LOG("\nERROR --> E2AP : Failed to send E2 Reset Response");
1989 FreeE2ResetResponse(e2apMsg);
1993 /*******************************************************************
1995 * @brief process the E2 Reset Request
1999 * Function : ProcE2ResetReq
2001 * Functionality: Process E2 Reset Request
2003 * @return ROK - success
2006 ******************************************************************/
2008 uint8_t ProcE2ResetReq(uint32_t duId, ResetRequestE2_t *resetReq)
2010 uint8_t ieIdx = 0, duIdx = 0;
2011 uint8_t transId = 0, cause = 0;
2016 if(resetReq->protocolIEs.list.array)
2018 for(ieIdx=0; ieIdx < resetReq->protocolIEs.list.count; ieIdx++)
2020 if(resetReq->protocolIEs.list.array[ieIdx])
2022 switch(resetReq->protocolIEs.list.array[ieIdx]->id)
2024 case ProtocolIE_IDE2_id_TransactionID:
2025 transId = resetReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
2027 case ProtocolIE_IDE2_id_CauseE2:
2028 DU_LOG("\nDEBUG --> E2AP : Reset reason %d", resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.present);
2029 switch(resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.present)
2031 case CauseE2_PR_NOTHING:
2033 case CauseE2_PR_ricRequest:
2034 cause = resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.choice.ricRequest;
2036 case CauseE2_PR_ricService:
2037 cause = resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.choice.ricService;
2039 case CauseE2_PR_e2Node:
2040 cause = resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.choice.e2Node;
2042 case CauseE2_PR_transport:
2043 cause = resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.choice.transport;
2045 case CauseE2_PR_protocol:
2046 cause = resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.choice.protocol;
2048 case CauseE2_PR_misc:
2049 cause = resetReq->protocolIEs.list.array[ieIdx]->value.choice.CauseE2.choice.misc;
2052 DU_LOG("\nDEBUG --> E2AP : Reset cause %d", cause);
2059 BuildAndSendResetResponse(duId, transId);
2063 /*******************************************************************
2065 * @brief deallocate the memory allocated in building the
2066 * Service Query message
2070 * Function : FreeRicServiceQuery
2072 * Functionality: deallocate the memory allocated in building
2073 * Ric Service Query message
2075 * @params[in] E2AP_PDU_t *e2apMsg
2078 * ****************************************************************/
2080 void FreeRicServiceQuery(E2AP_PDU_t *e2apMsg)
2082 uint8_t arrIdx = 0, ranFuncIdx=0;
2083 RANfunctionsID_List_t *ranFuncAcceptedList=NULL;
2084 RICserviceQuery_t *ricServiceQuery=NULL;
2088 if(e2apMsg->choice.initiatingMessage)
2090 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2091 if(ricServiceQuery->protocolIEs.list.array)
2093 for(arrIdx=0; arrIdx<ricServiceQuery->protocolIEs.list.count; arrIdx++)
2095 if(ricServiceQuery->protocolIEs.list.array[arrIdx])
2097 switch(ricServiceQuery->protocolIEs.list.array[arrIdx]->id)
2099 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
2101 ranFuncAcceptedList= &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2102 if(ranFuncAcceptedList->list.array)
2104 for(ranFuncIdx=0;ranFuncIdx<ranFuncAcceptedList->list.count; ranFuncIdx++)
2106 RIC_FREE(ranFuncAcceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
2108 RIC_FREE(ranFuncAcceptedList->list.array, ranFuncAcceptedList->list.size);
2112 case RICserviceQuery_IEs__value_PR_TransactionID:
2117 RIC_FREE(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2120 RIC_FREE(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2122 RIC_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
2124 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2128 /*******************************************************************
2130 * @brief build and send the ric service Query
2134 * Function : BuildAndSendRicServiceQuery
2136 * Functionality: build and send the ric service Query
2137 * @return ROK - success
2138 * RFAILED - Acknowledge
2140 ******************************************************************/
2142 uint8_t BuildAndSendRicServiceQuery(DuDb *duDb)
2146 uint8_t ret = RFAILED;
2147 bool memAllocFailed = false;
2148 E2AP_PDU_t *e2apMsg = NULL;
2149 asn_enc_rval_t encRetVal;
2150 RICserviceQuery_t *ricServiceQuery;
2152 DU_LOG("\nINFO --> E2AP : Building Ric service Query\n");
2155 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2156 if(e2apMsg == NULLP)
2158 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2161 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
2162 RIC_ALLOC(e2apMsg->choice.initiatingMessage , sizeof(struct InitiatingMessageE2));
2163 if(e2apMsg->choice.initiatingMessage == NULLP)
2165 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2169 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICserviceQuery;
2170 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
2171 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICserviceQuery;
2172 ricServiceQuery = &e2apMsg->choice.initiatingMessage->value.choice.RICserviceQuery;
2175 /* Fill Accepted RAN function IE If Ran function information is stored in databse */
2176 if(duDb->numOfRanFunction)
2179 ricServiceQuery->protocolIEs.list.count = elementCnt;
2180 ricServiceQuery->protocolIEs.list.size = elementCnt * sizeof(RICserviceQuery_IEs_t*);
2182 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array, ricServiceQuery->protocolIEs.list.size);
2183 if(ricServiceQuery->protocolIEs.list.array == NULLP)
2185 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2189 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2191 RIC_ALLOC(ricServiceQuery->protocolIEs.list.array[arrIdx], sizeof(RICserviceQuery_IEs_t));
2192 if(ricServiceQuery->protocolIEs.list.array[arrIdx] == NULLP)
2194 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2195 memAllocFailed = true;
2199 if(memAllocFailed == true)
2201 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceQueryIEs failed");
2207 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2208 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2209 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_TransactionID;
2210 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = assignTransactionId(duDb);
2212 if(duDb->numOfRanFunction)
2214 /* Accepted RAN function Id */
2216 ricServiceQuery->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
2217 ricServiceQuery->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2218 ricServiceQuery->protocolIEs.list.array[arrIdx]->value.present = RICserviceQuery_IEs__value_PR_RANfunctionsID_List;
2219 if(BuildRanFunctionAcceptedList(duDb, 0, NULL, &ricServiceQuery->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceQuery)!=ROK)
2221 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
2226 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2227 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2229 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2231 /* Check encode results */
2232 if(encRetVal.encoded == ENCODE_FAIL)
2234 DU_LOG("\nERROR --> E2AP : Could not encode RIC service Query structure (at %s)\n",\
2235 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2240 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service Query\n");
2241 for(int i=0; i< encBufSize; i++)
2243 DU_LOG("%x",encBuf[i]);
2247 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2249 DU_LOG("\nERROR --> E2AP : Sending of RIC service Query failed");
2256 FreeRicServiceQuery(e2apMsg);
2260 /*******************************************************************
2262 * @brief deallocate the memory allocated in RicServiceUpdateFailure
2266 * Function : FreeRicServiceUpdateFailure
2268 * Functionality: deallocate the memory allocated in RicServiceUpdatefailure
2270 * @params[in] E2AP_PDU_t *e2apMsg
2273 * ****************************************************************/
2275 void FreeRicServiceUpdateFailure(E2AP_PDU_t *e2apMsg)
2278 RICserviceUpdateFailure_t *ricServiceUpdateFailure=NULL;
2282 if(e2apMsg->choice.unsuccessfulOutcome)
2284 ricServiceUpdateFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
2285 if(ricServiceUpdateFailure->protocolIEs.list.array)
2287 for(arrIdx=0; arrIdx<ricServiceUpdateFailure->protocolIEs.list.count; arrIdx++)
2289 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
2291 RIC_FREE(ricServiceUpdateFailure->protocolIEs.list.array, ricServiceUpdateFailure->protocolIEs.list.size);
2293 RIC_FREE(e2apMsg->choice.unsuccessfulOutcome, sizeof(UnsuccessfulOutcomeE2_t));
2295 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2299 /*******************************************************************
2301 * @brief fill E2 failure cause
2305 * Function : fillE2FailureCause
2307 * Functionality: fill E2 failure cause
2308 * @return ROK - success
2311 ******************************************************************/
2313 void fillE2FailureCause(CauseE2_t *cause, CauseE2_PR causePresent, uint8_t reason)
2315 cause->present = causePresent;
2317 switch(cause->present)
2319 case CauseE2_PR_ricRequest:
2320 cause->choice.ricRequest = reason;
2322 case CauseE2_PR_ricService:
2323 cause->choice.ricService = reason;
2325 case CauseE2_PR_e2Node:
2326 cause->choice.e2Node = reason;
2328 case CauseE2_PR_transport:
2329 cause->choice.transport = reason;
2331 case CauseE2_PR_protocol:
2332 cause->choice.protocol = reason;
2334 case CauseE2_PR_misc:
2335 cause->choice.misc = reason;
2338 cause->choice.misc = CauseE2Misc_unspecified;
2343 /*******************************************************************
2345 * @brief build and send the ric service update failure
2349 * Function : BuildAndSendRicServiceUpdateFailure
2351 * Functionality: build and send the ric service update failure
2352 * @return ROK - success
2355 ******************************************************************/
2357 uint8_t BuildAndSendRicServiceUpdateFailure(uint32_t duId, int8_t transId, CauseE2_PR causePresent, uint8_t reason)
2360 E2AP_PDU_t *e2apMsg = NULL;
2361 asn_enc_rval_t encRetVal;
2362 uint8_t ret = RFAILED;
2364 uint8_t elementCnt=0;
2365 RICserviceUpdateFailure_t *ricServiceFailure=NULL;
2367 DU_LOG("\nINFO --> E2AP : Building Ric service update failure\n");
2370 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2371 if(e2apMsg == NULLP)
2373 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2376 e2apMsg->present = E2AP_PDU_PR_unsuccessfulOutcome;
2377 RIC_ALLOC(e2apMsg->choice.unsuccessfulOutcome , sizeof(struct UnsuccessfulOutcomeE2));
2378 if(e2apMsg->choice.unsuccessfulOutcome == NULLP)
2380 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2384 e2apMsg->choice.unsuccessfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
2385 e2apMsg->choice.unsuccessfulOutcome->criticality = CriticalityE2_reject;
2386 e2apMsg->choice.unsuccessfulOutcome->value.present = UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure;
2387 ricServiceFailure = &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICserviceUpdateFailure;
2390 ricServiceFailure->protocolIEs.list.count = elementCnt;
2391 ricServiceFailure->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateFailure_IEs_t *);
2393 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array, ricServiceFailure->protocolIEs.list.size);
2394 if(ricServiceFailure->protocolIEs.list.array == NULLP)
2396 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2400 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2402 RIC_ALLOC(ricServiceFailure->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateFailure_IEs_t));
2403 if(ricServiceFailure->protocolIEs.list.array[arrIdx] == NULLP)
2405 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2409 if(arrIdx<elementCnt)
2411 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceFailureIEs failed");
2417 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2418 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2419 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TransactionID;
2420 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2423 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_CauseE2;
2424 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2425 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_CauseE2;
2426 fillE2FailureCause(&ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.CauseE2, causePresent, reason);
2429 ricServiceFailure->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TimeToWaitE2;
2430 ricServiceFailure->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_ignore;
2431 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateFailure_IEs__value_PR_TimeToWaitE2;
2432 ricServiceFailure->protocolIEs.list.array[arrIdx]->value.choice.TimeToWaitE2 = TimeToWaitE2_v5s;
2434 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2435 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2437 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2439 /* Check encode results */
2440 if(encRetVal.encoded == ENCODE_FAIL)
2442 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update failure structure (at %s)\n",\
2443 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2448 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Failure\n");
2449 for(int i=0; i< encBufSize; i++)
2451 DU_LOG("%x",encBuf[i]);
2455 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duId) != ROK)
2457 DU_LOG("\nERROR --> E2AP : Sending RIC service update failed");
2464 FreeRicServiceUpdateFailure(e2apMsg);
2469 /*******************************************************************
2471 * @brief deallocate the memory allocated in RicServiceUpdateAck(
2475 * Function : FreeRicServiceUpdateAck
2477 * Functionality: deallocate the memory allocated in RicServiceUpdateAck
2479 * @params[in] E2AP_PDU_t *e2apMsg
2482 * ****************************************************************/
2484 void FreeRicServiceUpdateAck(E2AP_PDU_t *e2apMsg)
2486 uint8_t arrIdx = 0, ranFuncIdx=0;
2487 RANfunctionsID_List_t *acceptedList=NULL;
2488 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
2489 RANfunctionsIDcause_List_t *rejectedList=NULL;
2493 if(e2apMsg->choice.successfulOutcome)
2495 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
2496 if(ricServiceUpdateAck->protocolIEs.list.array)
2498 for(arrIdx=0; arrIdx<ricServiceUpdateAck->protocolIEs.list.count; arrIdx++)
2500 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx])
2502 switch(ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id)
2504 case ProtocolIE_IDE2_id_RANfunctionsAccepted:
2506 acceptedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2507 if(acceptedList->list.array)
2509 for(ranFuncIdx=0;ranFuncIdx<acceptedList->list.count; ranFuncIdx++)
2511 RIC_FREE(acceptedList->list.array[ranFuncIdx], sizeof(RANfunction_ItemIEs_t));
2513 RIC_FREE(acceptedList->list.array, acceptedList->list.size);
2518 case ProtocolIE_IDE2_id_RANfunctionsRejected:
2520 rejectedList= &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List;
2521 if(rejectedList->list.array)
2523 for(ranFuncIdx=0;ranFuncIdx<rejectedList->list.count; ranFuncIdx++)
2525 RIC_FREE(rejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
2527 RIC_FREE(rejectedList->list.array, rejectedList->list.size);
2532 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
2535 RIC_FREE(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
2537 RIC_FREE(e2apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
2539 RIC_FREE(e2apMsg, sizeof(E2AP_PDU_t));
2543 /*******************************************************************
2545 * @brief Build RAN function rejected list
2549 * Function : BuildRanFunctionRejectedList
2551 * Functionality: Build RAN function rejected list
2554 * Count of ran functions to be rejected in the list
2555 * Received list of RAN functions
2557 * @return ROK - success
2559 * ****************************************************************/
2561 uint8_t BuildRanFunctionRejectedList(uint8_t count, RanFunction *ranFunRejectedList, RANfunctionsIDcause_List_t *ranFuncRejectedList)
2563 uint8_t ranFuncIdx = 0;
2564 RANfunctionIDcause_ItemIEs_t *ranFuncRejectedItemIe=NULL;
2566 ranFuncRejectedList->list.count = count;
2568 ranFuncRejectedList->list.size = ranFuncRejectedList->list.count*sizeof(RANfunctionIDcause_ItemIEs_t*);
2569 RIC_ALLOC(ranFuncRejectedList->list.array, ranFuncRejectedList->list.size);
2570 if(ranFuncRejectedList->list.array == NULLP)
2572 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array");
2576 for(ranFuncIdx = 0; ranFuncIdx< ranFuncRejectedList->list.count; ranFuncIdx++)
2578 RIC_ALLOC(ranFuncRejectedList->list.array[ranFuncIdx], sizeof(RANfunctionIDcause_ItemIEs_t));
2579 if(ranFuncRejectedList->list.array[ranFuncIdx] == NULLP)
2581 DU_LOG("\nERROR --> E2AP : Memory allocation for RAN function rejected list array item");
2584 ranFuncRejectedItemIe = (RANfunctionIDcause_ItemIEs_t*)ranFuncRejectedList->list.array[ranFuncIdx];
2585 ranFuncRejectedItemIe->id = ProtocolIE_IDE2_id_RANfunctionIEcause_Item;
2586 ranFuncRejectedItemIe->criticality= CriticalityE2_ignore;
2587 ranFuncRejectedItemIe->value.present = RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item;
2588 ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.ranFunctionID = ranFunRejectedList[ranFuncIdx].id;
2589 fillE2FailureCause(&ranFuncRejectedItemIe->value.choice.RANfunctionIDcause_Item.cause, CauseE2_PR_ricService,\
2590 CauseE2RICservice_ran_function_not_supported);
2596 /*******************************************************************
2598 * @brief build and send the ric service update Acknowledge
2602 * Function : BuildAndSendRicServiceUpdateAcknowledge
2604 * Functionality: build and send the ric service update Acknowledge
2605 * @return ROK - success
2606 * RFAILED - Acknowledge
2608 ******************************************************************/
2610 uint8_t BuildAndSendRicServiceUpdateAcknowledge(DuDb *duDb, int8_t transId, RicTmpRanFunList ricRanFuncList)
2612 E2AP_PDU_t *e2apMsg = NULL;
2613 asn_enc_rval_t encRetVal;
2614 uint8_t arrIdx=0, elementCnt=0, ret=RFAILED;;
2615 RICserviceUpdateAcknowledge_t *ricServiceUpdateAck=NULL;
2617 DU_LOG("\nINFO --> E2AP : Building Ric service update Acknowledge\n");
2620 RIC_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
2621 if(e2apMsg == NULLP)
2623 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2626 e2apMsg->present = E2AP_PDU_PR_successfulOutcome;
2627 RIC_ALLOC(e2apMsg->choice.successfulOutcome , sizeof(struct SuccessfulOutcomeE2));
2628 if(e2apMsg->choice.successfulOutcome == NULLP)
2630 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
2634 e2apMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICserviceUpdate;
2635 e2apMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
2636 e2apMsg->choice.successfulOutcome->value.present = SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge;
2637 ricServiceUpdateAck = &e2apMsg->choice.successfulOutcome->value.choice.RICserviceUpdateAcknowledge;
2640 if(ricRanFuncList.numOfRanFunAccepted)
2642 if(ricRanFuncList.numOfRanFuneRejected)
2646 ricServiceUpdateAck->protocolIEs.list.count = elementCnt;
2647 ricServiceUpdateAck->protocolIEs.list.size = elementCnt * sizeof(RICserviceUpdateAcknowledge_IEs_t*);
2649 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array, ricServiceUpdateAck->protocolIEs.list.size);
2650 if(ricServiceUpdateAck->protocolIEs.list.array == NULLP)
2652 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
2656 for(arrIdx=0; arrIdx<elementCnt; arrIdx++)
2658 RIC_ALLOC(ricServiceUpdateAck->protocolIEs.list.array[arrIdx], sizeof(RICserviceUpdateAcknowledge_IEs_t));
2659 if(ricServiceUpdateAck->protocolIEs.list.array[arrIdx] == NULLP)
2661 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
2665 if(arrIdx<elementCnt)
2667 DU_LOG("\nERROR --> E2AP : Memory allocation for ricServiceUpdateAckIEs failed");
2673 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_TransactionID;
2674 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2675 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_TransactionID;
2676 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.TransactionID = transId;
2678 if(ricRanFuncList.numOfRanFunAccepted)
2680 /* Accepted RAN function List */
2682 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsAccepted;
2683 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2684 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List;
2685 if(BuildRanFunctionAcceptedList(duDb, ricRanFuncList.numOfRanFunAccepted, ricRanFuncList.ranFunAcceptedList,\
2686 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List, ProcedureCodeE2_id_RICserviceUpdate)!=ROK)
2688 DU_LOG("\nERROR --> E2AP : Failed to build Ran function added list");
2693 if(ricRanFuncList.numOfRanFuneRejected)
2695 /* RAN Functions Rejected List */
2697 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->id = ProtocolIE_IDE2_id_RANfunctionsRejected;
2698 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->criticality = CriticalityE2_reject;
2699 ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.present = RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List;
2700 if(BuildRanFunctionRejectedList(ricRanFuncList.numOfRanFuneRejected, ricRanFuncList.ranFunRejectedList, \
2701 &ricServiceUpdateAck->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsIDcause_List)!=ROK)
2703 DU_LOG("\nERROR --> E2AP : Failed to build Ran function rejected list");
2709 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
2710 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2712 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf, encBuf);
2714 /* Check encode results */
2715 if(encRetVal.encoded == ENCODE_FAIL)
2717 DU_LOG("\nERROR --> E2AP : Could not encode RIC service update Acknowledge structure (at %s)\n",\
2718 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2723 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC service update Acknowledge\n");
2724 for(int i=0; i< encBufSize; i++)
2726 DU_LOG("%x",encBuf[i]);
2730 if(SendE2APMsg(RIC_APP_MEM_REG, RIC_POOL, duDb->duId) != ROK)
2732 DU_LOG("\nERROR --> E2AP : Sending RIC service update ack failed");
2738 FreeRicServiceUpdateAck(e2apMsg);
2742 /*******************************************************************
2744 * @brief process the RIC service update
2748 * Function : ProcRicserviceUpdate
2750 * Functionality: process the RIC service update
2752 * @return ROK - success
2755 ******************************************************************/
2757 void ProcRicServiceUpdate(uint32_t duId, RICserviceUpdate_t *ricServiceUpdate)
2759 RicTmpRanFunList ricRanFuncList;
2762 uint8_t duIdx = 0, elementCnt =0, arrIdx = 0;
2763 uint16_t ranFuncIdx = 0, failedRanFuncCount=0, recvdRanFuncCount=0;
2764 RANfunction_ItemIEs_t *ranFuncItemIe =NULL;
2765 RANfunction_Item_t *ranFuncItem =NULL;
2766 RANfunctionID_Item_t *ranFuncIdItem=NULL;
2767 RANfunctions_List_t *ranFuncList=NULL;
2768 RANfunctionsID_List_t *deleteList=NULL;
2769 RANfunctionID_ItemIEs_t *delRanFuncItem=NULL;
2771 SEARCH_DU_DB(duIdx, duId, duDb);
2774 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
2777 memset(&ricRanFuncList, 0, sizeof(RicTmpRanFunList));
2779 if(!ricServiceUpdate)
2781 DU_LOG("\nERROR --> E2AP : ricServiceUpdate pointer is null");
2785 if(!ricServiceUpdate->protocolIEs.list.array)
2787 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array pointer is null");
2790 elementCnt = ricServiceUpdate->protocolIEs.list.count;
2791 for(arrIdx=0; arrIdx<ricServiceUpdate->protocolIEs.list.count; arrIdx++)
2793 if(!ricServiceUpdate->protocolIEs.list.array[arrIdx])
2795 DU_LOG("\nERROR --> E2AP : ricServiceUpdate array idx %d pointer is null",arrIdx);
2799 switch(ricServiceUpdate->protocolIEs.list.array[arrIdx]->id)
2801 case ProtocolIE_IDE2_id_TransactionID:
2803 transId = ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.TransactionID;
2805 if(transId < 0 || transId > 255)
2807 DU_LOG("\nERROR --> E2AP : Received invalid transId %d",transId);
2813 case ProtocolIE_IDE2_id_RANfunctionsAdded:
2815 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
2817 if(ranFuncList->list.array)
2819 for(ranFuncIdx=0;ranFuncIdx<ranFuncList->list.count; ranFuncIdx++)
2821 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
2822 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
2824 /* Adding the ran function in temporary list */
2825 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
2826 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
2827 ricRanFuncList.numOfRanFunAccepted++;
2829 /* Adding the new ran function in DB*/
2830 duDb->ranFunction[ranFuncItem->ranFunctionID-1].id = ranFuncItem->ranFunctionID;
2831 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
2832 duDb->numOfRanFunction++;
2834 /* Calculating total number of ran fuctions which are received for addition */
2835 recvdRanFuncCount++;
2841 case ProtocolIE_IDE2_id_RANfunctionsModified:
2844 ranFuncList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctions_List;
2845 if(ranFuncList->list.array)
2847 for(ranFuncIdx = 0; ranFuncIdx< ranFuncList->list.count; ranFuncIdx++)
2849 ranFuncItemIe = (RANfunction_ItemIEs_t *) ranFuncList->list.array[ranFuncIdx];
2850 ranFuncItem = &ranFuncItemIe->value.choice.RANfunction_Item;
2851 if(duDb->ranFunction[ranFuncItem->ranFunctionID-1].id != ranFuncItem->ranFunctionID)
2853 /* Calculating total number of ran fuctions which are not present */
2854 failedRanFuncCount++;
2856 /* Adding the ran function in temporary list */
2857 ricRanFuncList.ranFunRejectedList[ricRanFuncList.numOfRanFuneRejected].id = ranFuncItem->ranFunctionID;
2858 ricRanFuncList.numOfRanFuneRejected++;
2863 /* Adding the ran function in temporary list */
2864 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].id = ranFuncItem->ranFunctionID;
2865 ricRanFuncList.ranFunAcceptedList[ricRanFuncList.numOfRanFunAccepted].revisionCounter = ranFuncItem->ranFunctionRevision;
2866 ricRanFuncList.numOfRanFunAccepted++;
2868 /* Updating the new ran function in DB*/
2869 duDb->ranFunction[ranFuncItem->ranFunctionID-1].revisionCounter = ranFuncItem->ranFunctionRevision;
2871 /* Calculating total number of ran fuctions which are received for modification */
2872 recvdRanFuncCount++;
2877 case ProtocolIE_IDE2_id_RANfunctionsDeleted:
2880 deleteList = &ricServiceUpdate->protocolIEs.list.array[arrIdx]->value.choice.RANfunctionsID_List;
2881 if(deleteList->list.array)
2883 for(ranFuncIdx = 0; ranFuncIdx< deleteList->list.count; ranFuncIdx++)
2885 delRanFuncItem = (RANfunctionID_ItemIEs_t*) deleteList->list.array[ranFuncIdx];
2886 ranFuncIdItem = &delRanFuncItem->value.choice.RANfunctionID_Item;
2887 if(duDb->ranFunction[ranFuncIdItem->ranFunctionID-1].id == ranFuncIdItem->ranFunctionID)
2889 memset(&duDb->ranFunction[ranFuncIdItem->ranFunctionID-1], 0, sizeof(RanFunction));
2890 duDb->numOfRanFunction--;
2893 /* Calculating total number of ran fuctions which are received for deletion */
2894 recvdRanFuncCount++;
2902 DU_LOG("\nERROR --> E2AP : IE [%ld] is not supported",ricServiceUpdate->protocolIEs.list.array[arrIdx]->id);
2908 /* Sending RIC Service Update Failed if all RAN Functions received fail or if any IE processing fails
2909 * Else sending RIC Service Update Acknowledge */
2910 if((elementCnt > arrIdx) ||((recvdRanFuncCount > 0) && (recvdRanFuncCount == failedRanFuncCount)))
2912 if(BuildAndSendRicServiceUpdateFailure(duDb->duId, transId, CauseE2_PR_misc, CauseE2Misc_unspecified) != ROK)
2914 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update Failure");
2920 if(BuildAndSendRicServiceUpdateAcknowledge(duDb, transId, ricRanFuncList) != ROK)
2922 DU_LOG("\nERROR --> E2AP : Failed to build and send RIC service update acknowledge");
2928 /*******************************************************************
2930 * @brief Processing RIC subscription failure from DU
2934 * Function : ProcRicSubscriptionFailure
2936 * Functionality: Processing RIC subscription failure from DU
2938 * @param ID of DU from which message was sent
2939 * RIC Subscription failure message
2940 * @return ROK - success
2943 ******************************************************************/
2944 uint8_t ProcRicSubscriptionFailure(uint32_t duId, RICsubscriptionFailure_t *ricSubscriptionFailure)
2946 uint8_t ieIdx = 0, duIdx = 0, subsIdx = 0;
2947 uint8_t ranFuncId = 0;
2948 bool ricReqIdDecoded = false;
2950 RanFunction *ranFuncDb = NULLP;
2951 RicRequestId ricReqId;
2952 RICsubscriptionFailure_IEs_t *ricSubsFailIe = NULLP;
2954 DU_LOG("\nINFO --> E2AP : Received RIC subscription failure");
2956 SEARCH_DU_DB(duIdx, duId, duDb);
2959 DU_LOG("\nERROR --> E2AP : duDb is not present for duId %d",duId);
2963 memset(&ricReqId, 0, sizeof(RicRequestId));
2964 if(ricSubscriptionFailure)
2966 if(ricSubscriptionFailure->protocolIEs.list.array)
2968 for(ieIdx=0; ieIdx<ricSubscriptionFailure->protocolIEs.list.count; ieIdx++)
2970 if(ricSubscriptionFailure->protocolIEs.list.array[ieIdx])
2972 ricSubsFailIe = ricSubscriptionFailure->protocolIEs.list.array[ieIdx];
2973 switch(ricSubscriptionFailure->protocolIEs.list.array[ieIdx]->id)
2975 case ProtocolIE_IDE2_id_RICrequestID:
2977 ricReqId.requestorId = ricSubsFailIe->value.choice.RICrequestID.ricRequestorID;
2978 ricReqId.instanceId = ricSubsFailIe->value.choice.RICrequestID.ricInstanceID;
2979 ricReqIdDecoded = true;
2982 case ProtocolIE_IDE2_id_RANfunctionID:
2984 ranFuncId = ricSubsFailIe->value.choice.RANfunctionID;
2985 if(duDb->ranFunction[ranFuncId-1].id == ranFuncId)
2987 ranFuncDb = &duDb->ranFunction[ranFuncId-1];
2991 case ProtocolIE_IDE2_id_CauseE2:
2993 /* No handling required as of now since this is a stub */
3000 /* Remove subscription entry from RAN Function */
3001 if(ranFuncDb && ricReqIdDecoded)
3003 for(subsIdx = 0; subsIdx < ranFuncDb->numOfSubscription; subsIdx++)
3005 if((ranFuncDb->subscriptionList[subsIdx].requestId.requestorId == ricReqId.requestorId) &&
3006 (ranFuncDb->subscriptionList[subsIdx].requestId.instanceId == ricReqId.instanceId))
3008 memset(&ranFuncDb->subscriptionList[subsIdx], 0, sizeof(RicSubscription));
3018 /*******************************************************************
3020 * @brief Handles received E2AP message and sends back response
3024 * Function : E2APMsgHdlr
3027 * - Decodes received E2AP control message
3028 * - Prepares response message, encodes and sends to SCTP
3031 * @return ROK - success
3034 * ****************************************************************/
3035 void E2APMsgHdlr(uint32_t *duId, Buffer *mBuf)
3041 E2AP_PDU_t *e2apMsg;
3042 asn_dec_rval_t rval; /* Decoder return value */
3043 E2AP_PDU_t e2apasnmsg ;
3045 DU_LOG("\nINFO --> E2AP : Received E2AP message buffer");
3046 ODU_PRINT_MSG(mBuf, 0,0);
3048 /* Copy mBuf into char array to decode it */
3049 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
3050 RIC_ALLOC(recvBuf, (Size)recvBufLen);
3052 if(recvBuf == NULLP)
3054 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
3057 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
3059 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
3063 DU_LOG("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
3064 for(i=0; i< recvBufLen; i++)
3066 DU_LOG("%x",recvBuf[i]);
3069 /* Decoding flat buffer into E2AP messsage */
3070 e2apMsg = &e2apasnmsg;
3071 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
3073 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
3074 RIC_FREE(recvBuf, (Size)recvBufLen);
3076 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
3078 DU_LOG("\nERROR --> E2AP : ASN decode failed");
3082 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
3084 switch(e2apMsg->present)
3086 case E2AP_PDU_PR_initiatingMessage:
3088 switch(e2apMsg->choice.initiatingMessage->value.present)
3090 case InitiatingMessageE2__value_PR_E2setupRequest:
3092 DU_LOG("\nINFO --> E2AP : E2 setup request received");
3093 ProcE2SetupReq(duId, &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest);
3096 case InitiatingMessageE2__value_PR_E2nodeConfigurationUpdate:
3098 DU_LOG("\nINFO --> E2AP : E2 node config update received");
3099 ProcE2NodeConfigUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.E2nodeConfigurationUpdate);
3102 case InitiatingMessageE2__value_PR_ResetRequestE2:
3104 DU_LOG("\nINFO --> E2AP : E2 Reset Request received");
3105 ProcE2ResetReq(*duId, &e2apMsg->choice.initiatingMessage->value.choice.ResetRequestE2);
3108 case InitiatingMessageE2__value_PR_RICindication:
3110 DU_LOG("\nINFO --> E2AP : RIC Indication Acknowledged");
3113 case InitiatingMessageE2__value_PR_RICserviceUpdate:
3115 DU_LOG("\nINFO --> E2AP : RIC Service update received");
3116 ProcRicServiceUpdate(*duId, &e2apMsg->choice.initiatingMessage->value.choice.RICserviceUpdate);
3122 DU_LOG("\nERROR --> E2AP : Invalid type of intiating message [%d]", \
3123 e2apMsg->choice.initiatingMessage->value.present);
3126 }/* End of switch(initiatingMessage) */
3129 case E2AP_PDU_PR_successfulOutcome:
3131 switch(e2apMsg->choice.successfulOutcome->value.present)
3133 case SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse:
3135 ProcRicSubscriptionResponse(*duId, \
3136 &e2apMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse);
3141 DU_LOG("\nERROR --> E2AP : Invalid type of successfulOutcome message [%d]", \
3142 e2apMsg->choice.successfulOutcome->value.present);
3149 case E2AP_PDU_PR_unsuccessfulOutcome:
3151 switch(e2apMsg->choice.successfulOutcome->value.present)
3153 case UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure:
3155 ProcRicSubscriptionFailure(*duId, \
3156 &e2apMsg->choice.unsuccessfulOutcome->value.choice.RICsubscriptionFailure);
3161 DU_LOG("\nERROR --> E2AP : Invalid type of unsuccessfulOutcome message [%d]", \
3162 e2apMsg->choice.unsuccessfulOutcome->value.present);
3170 DU_LOG("\nERROR --> E2AP : Invalid type message type ");
3174 }/* End of switch(e2apMsg->present) */
3175 } /* End of E2APMsgHdlr */
3178 /**********************************************************************
3180 **********************************************************************/