1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
18 #include "common_def.h"
23 #include "du_app_mac_inf.h"
24 #include "du_app_rlc_inf.h"
27 #include "du_mgr_main.h"
29 #include "GlobalE2node-gNB-ID.h"
30 #include<ProtocolIE-FieldE2.h>
31 #include "E2setupRequest.h"
32 #include "InitiatingMessageE2.h"
33 #include "SuccessfulOutcomeE2.h"
35 #include "du_e2ap_msg_hdl.h"
36 #include "odu_common_codec.h"
39 DuCfgParams duCfgParam;
40 /*******************************************************************
42 * @brief Builds Global gNodeB Params
46 * Function : BuildGlobalgNBId
48 * Functionality: Building the Plmn and gNB id
50 * @params[in] GlobalE2node_gNB_ID_t *gNbId
51 * @return ROK - success
54 ******************************************************************/
56 uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId)
63 /* Allocate Buffer size */
64 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(uint8_t);
65 gNbId->global_gNB_ID.plmn_id.buf = NULLP;
66 DU_ALLOC(gNbId->global_gNB_ID.plmn_id.buf , gNbId->global_gNB_ID.plmn_id.size);
67 if(gNbId->global_gNB_ID.plmn_id.buf == NULLP)
69 DU_LOG("\nERROR --> E2AP: Memory allocation failed for Plmn buffer");
74 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
75 gNbId->global_gNB_ID.plmn_id.buf);
77 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
78 /* Allocate Buffer size */
79 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size = byteSize * sizeof(uint8_t);
80 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf = NULLP;
81 DU_ALLOC(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf, \
82 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
83 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf == NULLP)
85 DU_LOG("\nERROR --> E2AP: Memory allocation failed for gnb buffer");
90 fillBitString(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, val);
96 /*******************************************************************
98 * @brief Fills the initiating IE for E2 Setup Request
102 * Function : fillE2SetupReq
104 * Functionality:Fills the Initiating message for
107 * @params[in] E2setupRequest_t *e2SetupReq,
109 * @return ROK - success
112 ******************************************************************/
114 uint8_t fillE2SetupReq(E2setupRequest_t **e2SetupReq, uint8_t *idx)
116 uint8_t elementCnt = 0;
120 if(*e2SetupReq != NULLP)
123 (*e2SetupReq)->protocolIEs.list.count = elementCnt;
124 (*e2SetupReq)->protocolIEs.list.size = \
125 elementCnt * sizeof(E2setupRequestIEs_t);
127 /* Initialize the E2Setup members */
128 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array, \
129 (*e2SetupReq)->protocolIEs.list.size);
130 if((*e2SetupReq)->protocolIEs.list.array == NULLP)
132 DU_LOG("\nERROR --> E2AP : Memory allocation failed for array elements");
137 for(*idx = 0; *idx < elementCnt; (*idx)++)
139 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[*idx],\
140 sizeof(E2setupRequestIEs_t));
141 if((*e2SetupReq)->protocolIEs.list.array[*idx] == NULLP)
143 DU_LOG("\nERROR --> E2AP : Memory allocation failed for arrayidx [%d]", *idx);
148 /* GlobalE2node_gNB_ID */
149 (*e2SetupReq)->protocolIEs.list.array[idx2]->id = \
150 ProtocolIE_IDE2_id_GlobalE2node_ID;
151 (*e2SetupReq)->protocolIEs.list.array[idx2]->criticality = \
152 CriticalityE2_reject;
153 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.present =\
154 E2setupRequestIEs__value_PR_GlobalE2node_ID;
155 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
156 GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB;
158 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
159 GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
160 if((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
161 GlobalE2node_ID.choice.gNB == NULLP)
163 DU_LOG("\nERROR --> E2AP : Memory allocation failed for gNbId");
168 ret = BuildGlobalgNBId((*e2SetupReq)->protocolIEs.list.array[idx2]->value.\
169 choice.GlobalE2node_ID.choice.gNB);
183 DU_LOG("\nERROR --> E2AP : received e2SetupReq is NULL");
188 /*******************************************************************
190 * @brief Builds and Send the E2SetupRequest
194 * Function : BuildAndSendE2SetupReq
196 * Functionality:Fills the E2SetupRequest
198 * @return ROK - success
201 ******************************************************************/
203 uint8_t BuildAndSendE2SetupReq()
207 E2AP_PDU_t *e2apMsg = NULLP;
208 E2setupRequest_t *e2SetupReq = NULLP;
209 asn_enc_rval_t encRetVal; /* Encoder return value */
211 DU_LOG("\nINFO --> E2AP : Building E2 Setup Request\n");
214 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
217 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
220 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
221 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
222 if(e2apMsg->choice.initiatingMessage == NULLP)
224 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
225 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
228 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
229 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
230 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
231 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
233 ret = fillE2SetupReq(&e2SetupReq, &idx);
236 DU_LOG("\nERROR --> E2AP : fillE2SetupReq() failed");
239 /* Prints the Msg formed */
240 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
242 memset(encBuf, 0, ENC_BUF_MAX_LEN);
244 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
246 if(encRetVal.encoded == ENCODE_FAIL)
248 DU_LOG("\nERROR --> E2AP : Could not encode E2SetupRequest structure (at %s)\n",\
249 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
254 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for E2SetupRequest\n");
255 for(int i=0; i< encBufSize; i++)
257 printf("%x",encBuf[i]);
260 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
262 DU_LOG("\nERROR --> E2AP : Sending E2 Setup request failed");
268 deAllocateE2SetupReqMsg(e2apMsg, e2SetupReq, idx);
270 }/* End of BuildAndSendE2SetupReq */
272 /*******************************************************************
274 * @brief De Allocate E2 Setup Request Message
278 * Function : deAllocateE2SetupReqMsg
280 * Functionality: De-Allocating E2 Setup request Message
282 * @params[in] E2AP_PDU_t *e2apMsg
283 * E2setupRequest_t *e2SetupReq
284 * @return ROK - success
287 * ****************************************************************/
289 uint8_t deAllocateE2SetupReqMsg(E2AP_PDU_t *e2apMsg, \
290 E2setupRequest_t *e2SetupReq, uint8_t idx)
294 /* De-allocating Memory */
297 if(e2apMsg->choice.initiatingMessage != NULLP)
299 if(e2SetupReq->protocolIEs.list.array != NULLP)
301 for(idx2 = 0; idx2 < idx; idx2++)
303 if(e2SetupReq->protocolIEs.list.array[idx2] != NULLP)
305 switch(e2SetupReq->protocolIEs.list.array[idx2]->id)
307 case ProtocolIE_IDE2_id_GlobalE2node_ID:
309 if(e2SetupReq->protocolIEs.list.array[idx2]->\
310 value.choice.GlobalE2node_ID.choice.gNB != NULLP)
312 GlobalE2node_gNB_ID_t *gNbId = NULLP;
313 gNbId = e2SetupReq->protocolIEs.list.array[idx2]->\
314 value.choice.GlobalE2node_ID.choice.gNB;
315 if(gNbId->global_gNB_ID.plmn_id.buf != NULLP)
317 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf != NULLP)
319 DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\
320 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
322 DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\
323 gNbId->global_gNB_ID.plmn_id.size);
325 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2]->value.\
326 choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
328 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2],\
329 sizeof(E2setupRequestIEs_t));
333 DU_LOG("\nERROR --> E2AP: Invalid event at e2SetupRequet %ld ",\
334 (e2SetupReq->protocolIEs.list.array[idx2]->id));
339 DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size);
341 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
343 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
347 /*******************************************************************
349 * @brief Builds Ric Request Id
353 * Function : BuildRicRequestId
355 * Functionality: Building the Ric Request Id
357 * @params[in] RICrequestID_t *ricReqId
358 * @return ROK - success
361 * ****************************************************************/
363 uint8_t BuildRicRequestId(RICrequestID_t *ricReqId)
365 if(ricReqId == NULLP)
370 ricReqId->ricRequestorID = 1;
371 ricReqId->ricInstanceID = 1;
375 /*******************************************************************
377 * @brief Fills the mandatory RicAdmitted List Items
381 * Function : fillRicAdmitList
383 * Functionality: Fills the mandatory Ric Admitted List Items
385 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
386 * @return ROK - success
389 * ****************************************************************/
391 uint8_t fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
394 if(ricAdmitItems != NULLP)
396 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
397 ricAdmitItems->criticality = CriticalityE2_reject;
398 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
399 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
407 /*******************************************************************
409 * @brief Builds the mandatory RicAdmitted List Params
413 * Function : BuildRicAdmitList
415 * Functionality: Builds the mandatory Ric Admitted List Params
417 * @params[in] RICaction_Admitted_List_t *admitListPtr
418 * @return ROK - success
421 * ****************************************************************/
423 uint8_t BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
430 if(admitListPtr == NULLP)
432 DU_LOG("\nERROR --> E2AP : Memory allocation for RIC Admit List failed");
437 admitListPtr->list.count = elementCnt;
438 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
439 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
440 if(admitListPtr->list.array == NULLP)
442 DU_LOG("\nERROR --> E2AP : Memory allocation for RIC Admit List failed");
447 for(idx=0 ; idx<elementCnt ; idx++ )
449 DU_ALLOC(admitListPtr->list.array[idx], sizeof(RICaction_Admitted_ItemIEs_t));
450 if(admitListPtr->list.array[idx] == NULLP)
458 fillRicAdmitList((RICaction_Admitted_ItemIEs_t *)admitListPtr->list.array[idx]);
464 /*******************************************************************
466 * @breif Deallocation of BuildAndSendRicSubscriptionRsp memory
470 * Function : FreeRicSubscriptionRsp
472 * Functionality:Free the RicSubscriptionRsp
474 * @param[in] E2AP_PDU_t *e2apRicMsg
479 ******************************************************************/
480 void FreeRicSubscriptionRsp(E2AP_PDU_t *e2apRicMsg)
482 RICsubscriptionResponse_t *ricSubscriptionRsp= NULLP;
485 RICaction_Admitted_List_t *admitListPtr;
487 if(e2apRicMsg != NULLP)
489 if(e2apRicMsg->choice.successfulOutcome != NULLP)
491 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
492 if(ricSubscriptionRsp)
494 if(ricSubscriptionRsp->protocolIEs.list.array != NULLP)
496 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
498 if(ricSubscriptionRsp->protocolIEs.list.array[idx] != NULLP)
500 switch(ricSubscriptionRsp->protocolIEs.list.array[idx]->id)
502 case ProtocolIE_IDE2_id_RICrequestID:
505 case ProtocolIE_IDE2_id_RANfunctionID:
508 case ProtocolIE_IDE2_id_RICactions_Admitted:
510 admitListPtr = &ricSubscriptionRsp->protocolIEs.list.\
511 array[idx]->value.choice.RICaction_Admitted_List;
512 if(admitListPtr->list.array != NULLP)
514 for(idx1=0 ; idx1<admitListPtr->list.count; idx1++ )
516 if(admitListPtr->list.array[idx1] != NULLP)
518 DU_FREE(admitListPtr->list.array[idx1],
519 sizeof(RICaction_Admitted_ItemIEs_t));
522 DU_FREE(admitListPtr->list.array, admitListPtr->list.size);
529 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array[idx], \
530 sizeof(RICsubscriptionResponse_IEs_t));
533 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array, \
534 ricSubscriptionRsp->protocolIEs.list.size);
537 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
539 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
542 /*******************************************************************
544 * @brief Builds and Send the RicSubscriptionRsp
548 * Function : BuildAndSendRicSubscriptionRsp
550 * functionality:Fills the RicSubscriptionRsp
552 * @return ROK - success
555 ******************************************************************/
556 uint8_t FillRicSubscriptionRsp(RICsubscriptionResponse_t *ricSubscriptionRsp )
560 uint8_t elementCnt = 0;
561 uint8_t BuildRicRequestIdret=ROK;
562 uint8_t BuildRicAdmitListret=ROK;
565 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
566 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
567 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
568 ricSubscriptionRsp->protocolIEs.list.size);
569 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
571 DU_LOG("\nERROR --> E2AP : Memory allocation for FillRicSubscriptionRsp failed");
576 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
578 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
579 sizeof(RICsubscriptionResponse_IEs_t));
580 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
589 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
590 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
591 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
592 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
593 BuildRicRequestIdret =
594 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
595 if(BuildRicRequestIdret != ROK)
602 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
603 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
604 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
605 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
606 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
609 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
610 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
611 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
612 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
613 BuildRicAdmitListret =
614 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
615 if(BuildRicAdmitListret != ROK)
624 /*******************************************************************
626 * @brief Builds and Send the RicSubscriptionRsp
630 * Function : BuildAndSendRicSubscriptionRsp
632 * Functionality:Fills the RicSubscriptionRsp
634 * @return ROK - success
637 ******************************************************************/
639 uint8_t BuildAndSendRicSubscriptionRsp()
642 E2AP_PDU_t *e2apRicMsg = NULLP;
643 RICsubscriptionResponse_t *ricSubscriptionRsp=NULLP;
644 asn_enc_rval_t encRetVal;
645 uint8_t ret = RFAILED;
646 uint8_t FillRicricSubscriptionRspret;
650 DU_LOG("\nINFO --> E2AP : Building RIC Subscription Response\n");
652 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
653 if(e2apRicMsg == NULLP)
655 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
658 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
659 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
660 if(e2apRicMsg->choice.successfulOutcome == NULLP)
662 DU_LOG("\nERROR --> E2AP : Memory allocation for RIC subscription Response failed");
666 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
667 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
668 e2apRicMsg->choice.successfulOutcome->value.present = \
669 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
670 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
672 FillRicricSubscriptionRspret = FillRicSubscriptionRsp(ricSubscriptionRsp);
673 if(FillRicricSubscriptionRspret != ROK)
675 DU_LOG("\nERROR --> E2AP : Memory allocation for RICsubscriptionResponseIE failed");
679 /* Prints the Msg formed */
680 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
682 memset(encBuf, 0, ENC_BUF_MAX_LEN);
684 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
686 if(encRetVal.encoded == ENCODE_FAIL)
688 DU_LOG("\nERROR --> E2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
689 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
694 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC subscription response \n");
695 for(int i=0; i< encBufSize; i++)
697 printf("%x",encBuf[i]);
701 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
703 DU_LOG("\nERROR --> E2AP : Sending RIC Subscription Response failed");
711 FreeRicSubscriptionRsp(e2apRicMsg);
715 /******************************************************************
717 * @brief Processes E2 Setup Response sent by RIC
721 * Function : procE2SetupRsp
723 * Functionality: Processes E2 Setup Response sent by RIC
725 * @params[in] E2AP_PDU_t ASN decoded E2AP message
726 * @return ROK - success
729 * ****************************************************************/
730 uint8_t procE2SetupRsp(E2AP_PDU_t *e2apMsg)
734 E2setupResponse_t *e2SetRspMsg;
736 DU_LOG("\nINFO --> E2AP : E2 Setup Response received");
737 duCb.e2Status = TRUE; //Set E2 status as true
738 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
740 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
742 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
744 case ProtocolIE_IDE2_id_GlobalRIC_ID:
746 /* To store the Ric Id Params */
747 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value\
748 .choice.GlobalRIC_ID.pLMN_Identity.size);
749 e2apMsgDb.plmn = NULLP;
750 DU_ALLOC(e2apMsgDb.plmn, recvBufLen);
753 memcpy(e2apMsgDb.plmn, e2SetRspMsg->protocolIEs.list.array[idx]\
754 ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen);
755 free(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.\
756 GlobalRIC_ID.pLMN_Identity.buf);
758 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2apMsgDb.ricId);
759 free(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.\
760 GlobalRIC_ID.ric_ID.buf);
761 /*TODO : e2apMsgDb.plmn memory to be deallocated after the usage */
765 DU_LOG("\nERROR --> E2AP : Invalid IE received in E2SetupRsp:%ld",
766 e2SetRspMsg->protocolIEs.list.array[idx]->id);
769 free(e2SetRspMsg->protocolIEs.list.array[idx]);
771 free(e2SetRspMsg->protocolIEs.list.array);
775 /******************************************************************
777 * @brief Processes RIC Subscription Req sent by RIC
781 * Function : procRicSubsReq
783 * Functionality: Processes E2 Setup Response sent by CU
785 * @params[in] E2AP_PDU_t ASN decoded E2AP message
786 * @return ROK - success
789 * ****************************************************************/
791 uint8_t procRicSubsReq(E2AP_PDU_t *e2apMsg)
797 RICsubscriptionRequest_t *ricSubsReq;
798 RICaction_ToBeSetup_ItemIEs_t *actionItem;
800 DU_LOG("\nINFO --> E2AP : RIC Subscription request received");
801 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
803 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
805 if(ricSubsReq->protocolIEs.list.array[idx])
807 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
809 case ProtocolIE_IDE2_id_RICrequestID:
811 e2apMsgDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->\
812 value.choice.RICrequestID.ricRequestorID;
813 e2apMsgDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]-> \
814 value.choice.RICrequestID.ricInstanceID;
817 case ProtocolIE_IDE2_id_RANfunctionID:
819 e2apMsgDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]-> \
820 value.choice.RANfunctionID;
823 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
825 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value\
826 .choice.RICsubscriptionDetails.ricEventTriggerDefinition.size);
827 e2apMsgDb.ricEventTrigger = NULLP;
828 DU_ALLOC(e2apMsgDb.ricEventTrigger, recvBufLen);
829 /*TODO : e2apMsgDb.ricEventTrigger memory to be deallocated after the usage */
830 if(e2apMsgDb.ricEventTrigger)
832 memcpy(e2apMsgDb.ricEventTrigger, ricSubsReq->protocolIEs.list.array[idx]\
833 ->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.buf, \
835 free(ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
836 RICsubscriptionDetails.ricEventTriggerDefinition.buf);
838 if(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.\
841 actionItem =(RICaction_ToBeSetup_ItemIEs_t *)ricSubsReq->protocolIEs.list\
842 .array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List\
845 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
846 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
848 switch(actionItem->id)
850 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
852 e2apMsgDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
853 e2apMsgDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
857 DU_LOG("\nERROR --> E2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
862 free(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.\
869 DU_LOG("\nERROR --> E2AP : Invalid IE received in RIC SubsReq:%ld",
870 ricSubsReq->protocolIEs.list.array[idx]->id);
873 free(ricSubsReq->protocolIEs.list.array[idx]);
876 free(ricSubsReq->protocolIEs.list.array);
877 ret = BuildAndSendRicSubscriptionRsp();
882 /*******************************************************************
884 * @brief Free the RicIndication Message
888 * Function : FreeRicIndication
890 * Functionality: Free the RicIndication Message
895 ******************************************************************/
896 void FreeRicIndication(E2AP_PDU_t *e2apMsg)
899 RICindication_t *ricIndicationMsg= NULLP;
904 if(e2apMsg->choice.initiatingMessage != NULLP)
906 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
907 if(ricIndicationMsg!= NULLP)
909 if(ricIndicationMsg->protocolIEs.list.array != NULLP)
911 for(idx=0; idx<ricIndicationMsg->protocolIEs.list.count; idx++)
913 if(ricIndicationMsg->protocolIEs.list.array[idx] != NULLP)
915 switch(ricIndicationMsg->protocolIEs.list.array[idx]->id)
917 case ProtocolIE_IDE2_id_RICrequestID:
920 case ProtocolIE_IDE2_id_RANfunctionID:
923 case ProtocolIE_IDE2_id_RICactionID:
926 case ProtocolIE_IDE2_id_RICindicationType:
929 case ProtocolIE_IDE2_id_RICindicationHeader:
931 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf,\
932 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
935 case ProtocolIE_IDE2_id_RICindicationMessage:
937 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf,\
938 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
944 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx],sizeof(RICindication_IEs_t));
947 DU_FREE(ricIndicationMsg->protocolIEs.list.array,ricIndicationMsg->protocolIEs.list.size);
950 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
952 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
955 /*******************************************************************
957 * brief Fill the RicIndication Message
961 * Function : FillRicIndication
963 * Functionality:Fills the RicIndication Message
965 * @return ROK - success
968 ******************************************************************/
969 uint8_t FillRicIndication(RICindication_t *ricIndicationMsg)
971 uint8_t elementCnt=0;
976 ricIndicationMsg->protocolIEs.list.count = elementCnt;
977 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
978 /* Initialize the Ric Indication members */
979 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
980 ricIndicationMsg->protocolIEs.list.size);
981 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
983 DU_LOG("\nERROR --> E2AP : Memory allocation for RICindicationIEs failed");
988 for(idx=0; idx<elementCnt; idx++)
990 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
991 sizeof(RICindication_IEs_t));
992 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
994 DU_LOG("\nERROR --> E2AP : Memory allocation for RICindicationIEs failed");
1002 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
1003 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1004 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1005 RICindication_IEs__value_PR_RICrequestID;
1006 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID =\
1008 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID =\
1009 e2apMsgDb.ricInstanceId;
1012 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
1013 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1014 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1015 RICindication_IEs__value_PR_RANfunctionID;
1016 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID =
1017 e2apMsgDb.ranFuncId;
1020 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
1021 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1022 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1023 RICindication_IEs__value_PR_RICactionID;
1024 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID =
1025 e2apMsgDb.ricActionId;
1028 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
1029 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1030 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1031 RICindication_IEs__value_PR_RICindicationType;
1032 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType =
1033 e2apMsgDb.ricActionType;
1036 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
1037 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1038 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1039 RICindication_IEs__value_PR_RICindicationHeader;
1040 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size = 3 *
1042 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf ,\
1043 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
1044 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf == NULLP)
1046 DU_LOG("\nERROR --> E2AP : Memory allocation for RICindicationIEs failed");
1051 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1052 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf);
1054 /* TO BE CHANGED: RIC INDICATION DATA */
1055 /* For now filling a dummy octect data, need to tested with PRBs*/
1056 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
1057 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1058 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1059 RICindication_IEs__value_PR_RICindicationMessage;
1060 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size = 3 *
1062 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf ,\
1063 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
1064 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf == NULLP)
1066 DU_LOG("\nERROR --> E2AP : Memory allocation for RICindicationIEs failed");
1071 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1072 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf);
1080 /*******************************************************************
1082 * @brief Builds and Send the RicIndication Message
1086 * Function : BuildAndSendRicIndication
1088 * Functionality:Fills the RicIndication Message
1090 * @return ROK - success
1093 ******************************************************************/
1095 uint8_t BuildAndSendRicIndication()
1097 E2AP_PDU_t *e2apMsg = NULLP;
1098 RICindication_t *ricIndicationMsg=NULLP;
1099 asn_enc_rval_t encRetVal; /* Encoder return value */
1100 uint8_t ret = RFAILED;
1101 uint8_t FillRicIndicationret = ROK;
1105 DU_LOG("\nINFO --> E2AP : Building RIC Indication Message\n");
1107 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1108 if(e2apMsg == NULLP)
1110 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1114 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
1115 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1116 if(e2apMsg->choice.initiatingMessage == NULLP)
1118 DU_LOG("\nERROR --> E2AP : Memory allocation for E2AP-PDU failed");
1121 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
1122 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1123 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
1125 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
1127 FillRicIndicationret = FillRicIndication(ricIndicationMsg);
1128 if(FillRicIndicationret != ROK)
1132 /* Prints the Msg formed */
1133 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1134 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1136 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
1138 if(encRetVal.encoded == ENCODE_FAIL)
1140 DU_LOG("\nERROR --> E2AP : Could not encode RIC Indication Message (at %s)\n",\
1141 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1146 DU_LOG("\nDEBUG --> E2AP : Created APER encoded buffer for RIC Indication Message \n");
1147 for(int i=0; i< encBufSize; i++)
1149 printf("%x",encBuf[i]);
1153 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1155 DU_LOG("\nINFO --> E2AP : Sending RIC Indication Message");
1161 FreeRicIndication(e2apMsg);
1165 /*******************************************************************
1167 * @brief Sends E2 msg over SCTP
1171 * Function : SendE2APMsg
1173 * Functionality: Sends E2 msg over SCTP
1175 * @params[in] Region region
1177 * @return ROK - success
1180 * ****************************************************************/
1182 uint8_t SendE2APMsg(Region region, Pool pool)
1186 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
1188 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
1190 ODU_PRINT_MSG(mBuf, 0,0);
1192 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
1194 DU_LOG("\nERROR --> E2AP : SCTP Send for E2 failed");
1195 ODU_PUT_MSG_BUF(mBuf);
1201 DU_LOG("\nERROR --> E2AP : ODU_ADD_POST_MSG_MULT failed");
1202 ODU_PUT_MSG_BUF(mBuf);
1205 ODU_PUT_MSG_BUF(mBuf);
1209 DU_LOG("\nERROR --> E2AP : Failed to allocate memory");
1216 /*******************************************************************
1218 * @brief Handles received E2AP message and sends back response
1222 * Function : E2APMsgHdlr
1225 * - Decodes received E2AP control message
1226 * - Prepares response message, encodes and sends to SCTP
1229 * @return ROK - success
1232 * ****************************************************************/
1233 void E2APMsgHdlr(Buffer *mBuf)
1236 char *recvBuf = NULLP;
1238 MsgLen recvBufLen =0;
1239 E2AP_PDU_t *e2apMsg = NULLP;
1240 asn_dec_rval_t rval ={0}; /* Decoder return value */
1241 E2AP_PDU_t e2apasnmsg={0} ;
1243 DU_LOG("\nDEBUG --> E2AP : Received E2AP message buffer");
1244 ODU_PRINT_MSG(mBuf, 0,0);
1246 /* Copy mBuf into char array to decode it */
1247 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
1248 DU_ALLOC(recvBuf, (Size)recvBufLen);
1250 if(recvBuf == NULLP)
1252 DU_LOG("\nERROR --> E2AP : Memory allocation failed");
1255 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
1257 DU_LOG("\nERROR --> E2AP : Failed while copying %d", copyCnt);
1261 printf("\nDEBUG --> E2AP : Received flat buffer to be decoded : ");
1262 for(i=0; i< recvBufLen; i++)
1264 printf("%x",recvBuf[i]);
1267 /* Decoding flat buffer into E2AP messsage */
1268 e2apMsg = &e2apasnmsg;
1269 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
1271 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
1272 DU_FREE(recvBuf, (Size)recvBufLen);
1274 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1276 DU_LOG("\nERROR --> E2AP : ASN decode failed");
1280 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1282 switch(e2apMsg->present)
1284 case E2AP_PDU_PR_successfulOutcome:
1286 switch(e2apMsg->choice.successfulOutcome->value.present)
1288 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
1292 DU_LOG("\nDEBUG --> E2AP : Store E2 setup response Params");
1293 procE2SetupRsp(e2apMsg);
1299 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_successfulOutcome [%d]",\
1300 e2apMsg->choice.successfulOutcome->value.present);
1303 }/* End of switch(successfulOutcome) */
1304 free(e2apMsg->choice.successfulOutcome);
1307 case E2AP_PDU_PR_initiatingMessage:
1309 switch(e2apMsg->choice.initiatingMessage->value.present)
1311 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
1313 if(procRicSubsReq(e2apMsg) == ROK)
1315 BuildAndSendRicIndication();
1321 DU_LOG("\nERROR --> E2AP : Invalid type of E2AP_PDU_PR_initiatingMessage [%d]",\
1322 e2apMsg->choice.initiatingMessage->value.present);
1325 }/* End of switch(initiatingMessage) */
1326 free(e2apMsg->choice.initiatingMessage);
1331 DU_LOG("\nERROR --> E2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
1336 }/* End of switch(e2apMsg->present) */
1338 } /* End of E2APMsgHdlr */
1340 /**********************************************************************
1342 **********************************************************************/