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>
32 #include "du_e2ap_msg_hdl.h"
33 #include "odu_common_codec.h"
36 DuCfgParams duCfgParam;
37 /*******************************************************************
39 * @brief Builds Global gNodeB Params
43 * Function : BuildGlobalgNBId
45 * Functionality: Building the Plmn and gNB id
47 * @params[in] GlobalE2node_gNB_ID_t *gNbId
48 * @return ROK - success
51 ******************************************************************/
53 uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId)
60 /* Allocate Buffer size */
61 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(uint8_t);
62 gNbId->global_gNB_ID.plmn_id.buf = NULLP;
63 DU_ALLOC(gNbId->global_gNB_ID.plmn_id.buf , gNbId->global_gNB_ID.plmn_id.size);
64 if(gNbId->global_gNB_ID.plmn_id.buf == NULLP)
66 DU_LOG("\nE2AP: Memory allocation failed for Plmn buffer");
71 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
72 gNbId->global_gNB_ID.plmn_id.buf);
74 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
75 /* Allocate Buffer size */
76 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size = byteSize * sizeof(uint8_t);
77 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf = NULLP;
78 DU_ALLOC(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf, \
79 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
80 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf == NULLP)
82 DU_LOG("\nE2AP: Memory allocation failed for gnb buffer");
87 fillBitString(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, val);
93 /*******************************************************************
95 * @brief Fills the initiating IE for E2 Setup Request
99 * Function : fillE2SetupReq
101 * Functionality:Fills the Initiating message for
104 * @params[in] E2setupRequest_t *e2SetupReq,
106 * @return ROK - success
109 ******************************************************************/
111 uint8_t fillE2SetupReq(E2setupRequest_t **e2SetupReq, uint8_t *idx)
113 uint8_t elementCnt = 0;
117 if(*e2SetupReq != NULLP)
120 (*e2SetupReq)->protocolIEs.list.count = elementCnt;
121 (*e2SetupReq)->protocolIEs.list.size = \
122 elementCnt * sizeof(E2setupRequestIEs_t);
124 /* Initialize the E2Setup members */
125 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array, \
126 (*e2SetupReq)->protocolIEs.list.size);
127 if((*e2SetupReq)->protocolIEs.list.array == NULLP)
129 DU_LOG("\nE2AP : Memory allocation failed for array elements");
134 for(*idx = 0; *idx < elementCnt; (*idx)++)
136 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[*idx],\
137 sizeof(E2setupRequestIEs_t));
138 if((*e2SetupReq)->protocolIEs.list.array[*idx] == NULLP)
140 DU_LOG("\nE2AP : Memory allocation failed for arrayidx [%d]", *idx);
145 /* GlobalE2node_gNB_ID */
146 (*e2SetupReq)->protocolIEs.list.array[idx2]->id = \
147 ProtocolIE_IDE2_id_GlobalE2node_ID;
148 (*e2SetupReq)->protocolIEs.list.array[idx2]->criticality = \
149 CriticalityE2_reject;
150 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.present =\
151 E2setupRequestIEs__value_PR_GlobalE2node_ID;
152 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
153 GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB;
155 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
156 GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
157 if((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
158 GlobalE2node_ID.choice.gNB == NULLP)
160 DU_LOG("\nE2AP : Memory allocation failed for gNbId");
165 ret = BuildGlobalgNBId((*e2SetupReq)->protocolIEs.list.array[idx2]->value.\
166 choice.GlobalE2node_ID.choice.gNB);
180 DU_LOG("\nE2AP : Passed e2SetupReq is NULL");
185 /*******************************************************************
187 * @brief Builds and Send the E2SetupRequest
191 * Function : BuildAndSendE2SetupReq
193 * Functionality:Fills the E2SetupRequest
195 * @return ROK - success
198 ******************************************************************/
200 uint8_t BuildAndSendE2SetupReq()
204 E2AP_PDU_t *e2apMsg = NULLP;
205 E2setupRequest_t *e2SetupReq = NULLP;
206 asn_enc_rval_t encRetVal; /* Encoder return value */
208 DU_LOG("\nE2AP : Building E2 Setup Request\n");
211 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
214 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
217 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
218 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
219 if(e2apMsg->choice.initiatingMessage == NULLP)
221 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
222 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
225 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
226 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
227 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
228 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
230 ret = fillE2SetupReq(&e2SetupReq, &idx);
233 DU_LOG("\nE2AP : fillE2SetupReq() failed");
236 /* Prints the Msg formed */
237 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
239 memset(encBuf, 0, ENC_BUF_MAX_LEN);
241 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
243 if(encRetVal.encoded == ENCODE_FAIL)
245 DU_LOG("\nE2AP : Could not encode E2SetupRequest structure (at %s)\n",\
246 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
251 DU_LOG("\nE2AP : Created APER encoded buffer for E2SetupRequest\n");
252 for(int i=0; i< encBufSize; i++)
254 printf("%x",encBuf[i]);
257 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
259 DU_LOG("\nE2AP : Sending E2 Setup request failed");
265 deAllocateE2SetupReqMsg(e2apMsg, e2SetupReq, idx);
267 }/* End of BuildAndSendE2SetupReq */
269 /*******************************************************************
271 * @brief De Allocate E2 Setup Request Message
275 * Function : deAllocateE2SetupReqMsg
277 * Functionality: De-Allocating E2 Setup request Message
279 * @params[in] E2AP_PDU_t *e2apMsg
280 * E2setupRequest_t *e2SetupReq
281 * @return ROK - success
284 * ****************************************************************/
286 uint8_t deAllocateE2SetupReqMsg(E2AP_PDU_t *e2apMsg, \
287 E2setupRequest_t *e2SetupReq, uint8_t idx)
291 /* De-allocating Memory */
294 if(e2apMsg->choice.initiatingMessage != NULLP)
296 if(e2SetupReq->protocolIEs.list.array != NULLP)
298 for(idx2 = 0; idx2 < idx; idx2++)
300 if(e2SetupReq->protocolIEs.list.array[idx2] != NULLP)
302 switch(e2SetupReq->protocolIEs.list.array[idx2]->id)
304 case ProtocolIE_IDE2_id_GlobalE2node_ID:
306 if(e2SetupReq->protocolIEs.list.array[idx2]->\
307 value.choice.GlobalE2node_ID.choice.gNB != NULLP)
309 GlobalE2node_gNB_ID_t *gNbId = NULLP;
310 gNbId = e2SetupReq->protocolIEs.list.array[idx2]->\
311 value.choice.GlobalE2node_ID.choice.gNB;
312 if(gNbId->global_gNB_ID.plmn_id.buf != NULLP)
314 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf != NULLP)
316 DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\
317 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
319 DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\
320 gNbId->global_gNB_ID.plmn_id.size);
322 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2]->value.\
323 choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
325 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2],\
326 sizeof(E2setupRequestIEs_t));
330 DU_LOG("\n E2AP: Invalid event at e2SetupRequet %ld ",\
331 (e2SetupReq->protocolIEs.list.array[idx2]->id));
336 DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size);
338 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
340 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
344 /*******************************************************************
346 * @brief Builds Ric Request Id
350 * Function : BuildRicRequestId
352 * Functionality: Building the Ric Request Id
354 * @params[in] RICrequestID_t *ricReqId
355 * @return ROK - success
358 * ****************************************************************/
360 uint8_t BuildRicRequestId(RICrequestID_t *ricReqId)
362 if(ricReqId != NULLP)
364 ricReqId->ricRequestorID = 1;
365 ricReqId->ricInstanceID = 1;
374 /*******************************************************************
376 * @brief Fills the mandatory RicAdmitted List Items
380 * Function : fillRicAdmitList
382 * Functionality: Fills the mandatory Ric Admitted List Items
384 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
385 * @return ROK - success
388 * ****************************************************************/
390 uint8_t fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
393 if(ricAdmitItems != NULLP)
395 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
396 ricAdmitItems->criticality = CriticalityE2_reject;
397 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
398 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
406 /*******************************************************************
408 * @brief Builds the mandatory RicAdmitted List Params
412 * Function : BuildRicAdmitList
414 * Functionality: Builds the mandatory Ric Admitted List Params
416 * @params[in] RICaction_Admitted_List_t *admitListPtr
417 * @return ROK - success
420 * ****************************************************************/
422 uint8_t BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
429 if(admitListPtr == NULLP)
431 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
436 admitListPtr->list.count = elementCnt;
437 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
438 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
439 if(admitListPtr->list.array == NULLP)
441 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
446 for(idx=0 ; idx<elementCnt ; idx++ )
448 DU_ALLOC(admitListPtr->list.array[idx], sizeof(RICaction_Admitted_ItemIEs_t));
449 if(admitListPtr->list.array[idx] == NULLP)
457 fillRicAdmitList((RICaction_Admitted_ItemIEs_t *)admitListPtr->list.array[idx]);
463 /*******************************************************************
465 * @breif Deallocation of BuildAndSendRicSubscriptionRsp memory
469 * Function : FreeRicSubscriptionRsp
471 * Functionality:Free the RicSubscriptionRsp
473 * @param[in] E2AP_PDU_t *e2apRicMsg
478 ******************************************************************/
479 void FreeRicSubscriptionRsp(E2AP_PDU_t *e2apRicMsg)
481 RICsubscriptionResponse_t *ricSubscriptionRsp= NULLP;
484 RICaction_Admitted_List_t *admitListPtr;
486 if(e2apRicMsg != NULLP)
488 if(e2apRicMsg->choice.successfulOutcome != NULLP)
490 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
491 if(ricSubscriptionRsp)
493 if(ricSubscriptionRsp->protocolIEs.list.array != NULLP)
495 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
497 if(ricSubscriptionRsp->protocolIEs.list.array[idx] != NULLP)
499 switch(ricSubscriptionRsp->protocolIEs.list.array[idx]->id)
501 case ProtocolIE_IDE2_id_RICrequestID:
504 case ProtocolIE_IDE2_id_RANfunctionID:
507 case ProtocolIE_IDE2_id_RICactions_Admitted:
509 admitListPtr = &ricSubscriptionRsp->protocolIEs.list.\
510 array[idx]->value.choice.RICaction_Admitted_List;
511 if(admitListPtr->list.array != NULLP)
513 for(idx1=0 ; idx1<admitListPtr->list.count; idx1++ )
515 if(admitListPtr->list.array[idx1] != NULLP)
517 DU_FREE(admitListPtr->list.array[idx1],
518 sizeof(RICaction_Admitted_ItemIEs_t));
521 DU_FREE(admitListPtr->list.array, admitListPtr->list.size);
528 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array[idx], \
529 sizeof(RICsubscriptionResponse_IEs_t));
532 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array, \
533 ricSubscriptionRsp->protocolIEs.list.size);
536 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
538 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
541 /*******************************************************************
543 * @brief Builds and Send the RicSubscriptionRsp
547 * Function : BuildAndSendRicSubscriptionRsp
549 * functionality:Fills the RicSubscriptionRsp
551 * @return ROK - success
554 ******************************************************************/
555 uint8_t FillRicSubscriptionRsp(RICsubscriptionResponse_t *ricSubscriptionRsp )
559 uint8_t elementCnt = 0;
560 uint8_t BuildRicRequestIdret=ROK;
561 uint8_t BuildRicAdmitListret=ROK;
564 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
565 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
566 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
567 ricSubscriptionRsp->protocolIEs.list.size);
568 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
570 DU_LOG("\nE2AP : Memory allocation for FillRicSubscriptionRsp failed");
575 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
577 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
578 sizeof(RICsubscriptionResponse_IEs_t));
579 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
588 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
589 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
590 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
591 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
592 BuildRicRequestIdret =
593 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
594 if(BuildRicRequestIdret != ROK)
601 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
602 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
603 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
604 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
605 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
608 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
609 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
610 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
611 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
612 BuildRicAdmitListret =
613 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
614 if(BuildRicAdmitListret != ROK)
623 /*******************************************************************
625 * @brief Builds and Send the RicSubscriptionRsp
629 * Function : BuildAndSendRicSubscriptionRsp
631 * Functionality:Fills the RicSubscriptionRsp
633 * @return ROK - success
636 ******************************************************************/
638 uint8_t BuildAndSendRicSubscriptionRsp()
641 E2AP_PDU_t *e2apRicMsg = NULLP;
642 RICsubscriptionResponse_t *ricSubscriptionRsp=NULLP;
643 asn_enc_rval_t encRetVal;
644 uint8_t ret = RFAILED;
645 uint8_t FillRicricSubscriptionRspret;
649 DU_LOG("\nE2AP : Building RIC Subscription Response\n");
651 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
652 if(e2apRicMsg == NULLP)
654 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
657 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
658 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
659 if(e2apRicMsg->choice.successfulOutcome == NULLP)
661 DU_LOG("\nE2AP : Memory allocation for Ric subscription Response failed");
665 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
666 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
667 e2apRicMsg->choice.successfulOutcome->value.present = \
668 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
669 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
671 FillRicricSubscriptionRspret = FillRicSubscriptionRsp(ricSubscriptionRsp);
672 if(FillRicricSubscriptionRspret != ROK)
674 DU_LOG("\nE2AP : Memory allocation for RICsubscriptionResponseIE failed");
678 /* Prints the Msg formed */
679 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
681 memset(encBuf, 0, ENC_BUF_MAX_LEN);
683 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
685 if(encRetVal.encoded == ENCODE_FAIL)
687 DU_LOG("\nE2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
688 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
693 DU_LOG("\nE2AP : Created APER encoded buffer for RIC subscription response \n");
694 for(int i=0; i< encBufSize; i++)
696 printf("%x",encBuf[i]);
700 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
702 DU_LOG("\nE2AP : Sending RIC Subscription Response failed");
710 FreeRicSubscriptionRsp(e2apRicMsg);
714 /******************************************************************
716 * @brief Processes E2 Setup Response sent by RIC
720 * Function : procE2SetupRsp
722 * Functionality: Processes E2 Setup Response sent by RIC
724 * @params[in] E2AP_PDU_t ASN decoded E2AP message
725 * @return ROK - success
728 * ****************************************************************/
729 uint8_t procE2SetupRsp(E2AP_PDU_t *e2apMsg)
733 E2setupResponse_t *e2SetRspMsg;
735 DU_LOG("\nE2AP : E2 Setup Response received");
736 duCb.e2Status = TRUE; //Set E2 status as true
737 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
739 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
741 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
743 case ProtocolIE_IDE2_id_GlobalRIC_ID:
745 /* To store the Ric Id Params */
746 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value\
747 .choice.GlobalRIC_ID.pLMN_Identity.size);
748 e2apMsgDb.plmn = NULLP;
749 DU_ALLOC(e2apMsgDb.plmn, recvBufLen);
752 memcpy(e2apMsgDb.plmn, e2SetRspMsg->protocolIEs.list.array[idx]\
753 ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen);
755 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2apMsgDb.ricId);
756 /*TODO : e2apMsgDb.plmn memory to be deallocated after the usage */
760 DU_LOG("\nE2AP : Invalid IE received in E2SetupRsp:%ld",
761 e2SetRspMsg->protocolIEs.list.array[idx]->id);
768 /******************************************************************
770 * @brief Processes RIC Subscription Req sent by RIC
774 * Function : procRicSubsReq
776 * Functionality: Processes E2 Setup Response sent by CU
778 * @params[in] E2AP_PDU_t ASN decoded E2AP message
779 * @return ROK - success
782 * ****************************************************************/
784 uint8_t procRicSubsReq(E2AP_PDU_t *e2apMsg)
790 RICsubscriptionRequest_t *ricSubsReq;
791 RICaction_ToBeSetup_ItemIEs_t *actionItem;
793 DU_LOG("\nE2AP : Ric Subscription request received");
794 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
796 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
798 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
800 case ProtocolIE_IDE2_id_RICrequestID:
802 e2apMsgDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->\
803 value.choice.RICrequestID.ricRequestorID;
804 e2apMsgDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]-> \
805 value.choice.RICrequestID.ricInstanceID;
808 case ProtocolIE_IDE2_id_RANfunctionID:
810 e2apMsgDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]-> \
811 value.choice.RANfunctionID;
814 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
816 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value\
817 .choice.RICsubscriptionDetails.ricEventTriggerDefinition.size);
818 e2apMsgDb.ricEventTrigger = NULLP;
819 DU_ALLOC(e2apMsgDb.ricEventTrigger, recvBufLen);
820 /*TODO : e2apMsgDb.ricEventTrigger memory to be deallocated after the usage */
821 if(e2apMsgDb.ricEventTrigger)
823 memcpy(e2apMsgDb.ricEventTrigger, ricSubsReq->protocolIEs.list.array[idx]\
824 ->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.buf, \
827 actionItem =(RICaction_ToBeSetup_ItemIEs_t *)ricSubsReq->protocolIEs.list\
828 .array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List\
831 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
832 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
834 switch(actionItem->id)
836 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
838 e2apMsgDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
839 e2apMsgDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
843 DU_LOG("\nE2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
852 DU_LOG("\nE2AP : Invalid IE received in Ric SubsReq:%ld",
853 ricSubsReq->protocolIEs.list.array[idx]->id);
857 ret = BuildAndSendRicSubscriptionRsp();
862 /*******************************************************************
864 * @brief Free the RicIndication Message
868 * Function : FreeRicIndication
870 * Functionality: Free the RicIndication Message
875 ******************************************************************/
876 void FreeRicIndication(E2AP_PDU_t *e2apMsg)
879 RICindication_t *ricIndicationMsg= NULLP;
884 if(e2apMsg->choice.initiatingMessage != NULLP)
886 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
887 if(ricIndicationMsg!= NULLP)
889 if(ricIndicationMsg->protocolIEs.list.array != NULLP)
891 for(idx=0; idx<ricIndicationMsg->protocolIEs.list.count; idx++)
893 if(ricIndicationMsg->protocolIEs.list.array[idx] != NULLP)
895 switch(ricIndicationMsg->protocolIEs.list.array[idx]->id)
897 case ProtocolIE_IDE2_id_RICrequestID:
900 case ProtocolIE_IDE2_id_RANfunctionID:
903 case ProtocolIE_IDE2_id_RICactionID:
906 case ProtocolIE_IDE2_id_RICindicationType:
909 case ProtocolIE_IDE2_id_RICindicationHeader:
911 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf,\
912 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
915 case ProtocolIE_IDE2_id_RICindicationMessage:
917 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf,\
918 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
924 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx],sizeof(RICindication_IEs_t));
927 DU_FREE(ricIndicationMsg->protocolIEs.list.array,ricIndicationMsg->protocolIEs.list.size);
930 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
932 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
935 /*******************************************************************
937 * brief Fill the RicIndication Message
941 * Function : FillRicIndication
943 * Functionality:Fills the RicIndication Message
945 * @return ROK - success
948 ******************************************************************/
949 uint8_t FillRicIndication(RICindication_t *ricIndicationMsg)
951 uint8_t elementCnt=0;
956 ricIndicationMsg->protocolIEs.list.count = elementCnt;
957 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
958 /* Initialize the Ric Indication members */
959 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
960 ricIndicationMsg->protocolIEs.list.size);
961 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
963 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
968 for(idx=0; idx<elementCnt; idx++)
970 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
971 sizeof(RICindication_IEs_t));
972 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
974 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
982 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
983 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
984 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
985 RICindication_IEs__value_PR_RICrequestID;
986 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID =\
988 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID =\
989 e2apMsgDb.ricInstanceId;
992 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
993 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
994 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
995 RICindication_IEs__value_PR_RANfunctionID;
996 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID =
1000 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
1001 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1002 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1003 RICindication_IEs__value_PR_RICactionID;
1004 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID =
1005 e2apMsgDb.ricActionId;
1008 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
1009 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1010 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1011 RICindication_IEs__value_PR_RICindicationType;
1012 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType =
1013 e2apMsgDb.ricActionType;
1016 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
1017 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1018 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1019 RICindication_IEs__value_PR_RICindicationHeader;
1020 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size = 3 *
1022 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf ,\
1023 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
1024 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf == NULLP)
1026 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
1031 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1032 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf);
1034 /* TO BE CHANGED: RIC INDICATION DATA */
1035 /* For now filling a dummy octect data, need to tested with PRBs*/
1036 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
1037 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1038 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1039 RICindication_IEs__value_PR_RICindicationMessage;
1040 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size = 3 *
1042 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf ,\
1043 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
1044 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf == NULLP)
1046 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
1051 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1052 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf);
1060 /*******************************************************************
1062 * @brief Builds and Send the RicIndication Message
1066 * Function : BuildAndSendRicIndication
1068 * Functionality:Fills the RicIndication Message
1070 * @return ROK - success
1073 ******************************************************************/
1075 uint8_t BuildAndSendRicIndication()
1077 E2AP_PDU_t *e2apMsg = NULLP;
1078 RICindication_t *ricIndicationMsg=NULLP;
1079 asn_enc_rval_t encRetVal; /* Encoder return value */
1080 uint8_t ret = RFAILED;
1081 uint8_t FillRicIndicationret = ROK;
1085 DU_LOG("\nE2AP : Building Ric Indication Message\n");
1087 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1088 if(e2apMsg == NULLP)
1090 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
1094 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
1095 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1096 if(e2apMsg->choice.initiatingMessage == NULLP)
1098 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
1101 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
1102 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1103 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
1105 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
1107 FillRicIndicationret = FillRicIndication(ricIndicationMsg);
1108 if(FillRicIndicationret != ROK)
1112 /* Prints the Msg formed */
1113 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1114 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1116 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
1118 if(encRetVal.encoded == ENCODE_FAIL)
1120 DU_LOG("\nE2AP : Could not encode RIC Indication Message (at %s)\n",\
1121 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1126 DU_LOG("\nE2AP : Created APER encoded buffer for RIC Indication Message \n");
1127 for(int i=0; i< encBufSize; i++)
1129 printf("%x",encBuf[i]);
1133 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1135 DU_LOG("\nE2AP : Sending RIC Indication Message");
1141 FreeRicIndication(e2apMsg);
1145 /*******************************************************************
1147 * @brief Sends E2 msg over SCTP
1151 * Function : SendE2APMsg
1153 * Functionality: Sends E2 msg over SCTP
1155 * @params[in] Region region
1157 * @return ROK - success
1160 * ****************************************************************/
1162 uint8_t SendE2APMsg(Region region, Pool pool)
1166 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
1168 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
1170 ODU_PRINT_MSG(mBuf, 0,0);
1172 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
1174 DU_LOG("\nE2AP : SCTP Send for E2 failed");
1175 ODU_PUT_MSG_BUF(mBuf);
1181 DU_LOG("\nE2AP : ODU_ADD_POST_MSG_MULT failed");
1182 ODU_PUT_MSG_BUF(mBuf);
1185 ODU_PUT_MSG_BUF(mBuf);
1189 DU_LOG("\nE2AP : Failed to allocate memory");
1196 /*******************************************************************
1198 * @brief Handles received E2AP message and sends back response
1202 * Function : E2APMsgHdlr
1205 * - Decodes received E2AP control message
1206 * - Prepares response message, encodes and sends to SCTP
1209 * @return ROK - success
1212 * ****************************************************************/
1213 void E2APMsgHdlr(Buffer *mBuf)
1219 E2AP_PDU_t *e2apMsg;
1220 asn_dec_rval_t rval; /* Decoder return value */
1221 E2AP_PDU_t e2apasnmsg ;
1223 DU_LOG("\nE2AP : Received E2AP message buffer");
1224 ODU_PRINT_MSG(mBuf, 0,0);
1226 /* Copy mBuf into char array to decode it */
1227 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
1228 DU_ALLOC(recvBuf, (Size)recvBufLen);
1230 if(recvBuf == NULLP)
1232 DU_LOG("\nE2AP : Memory allocation failed");
1235 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
1237 DU_LOG("\nE2AP : Failed while copying %d", copyCnt);
1241 printf("\nE2AP : Received flat buffer to be decoded : ");
1242 for(i=0; i< recvBufLen; i++)
1244 printf("%x",recvBuf[i]);
1247 /* Decoding flat buffer into E2AP messsage */
1248 e2apMsg = &e2apasnmsg;
1249 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
1251 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
1252 DU_FREE(recvBuf, (Size)recvBufLen);
1254 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1256 DU_LOG("\nE2AP : ASN decode failed");
1260 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1262 switch(e2apMsg->present)
1264 case E2AP_PDU_PR_successfulOutcome:
1266 switch(e2apMsg->choice.successfulOutcome->value.present)
1268 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
1272 DU_LOG("\nE2AP : Store E2 setup response Params");
1273 procE2SetupRsp(e2apMsg);
1279 DU_LOG("\nE2AP : Invalid type of intiating message [%d]", e2apMsg->choice.initiatingMessage->value.present);
1282 }/* End of switch(successfulOutcome) */
1285 case E2AP_PDU_PR_initiatingMessage:
1287 switch(e2apMsg->choice.initiatingMessage->value.present)
1289 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
1291 DU_LOG("\nE2AP : Calling RIC Subscription Response");
1292 if(procRicSubsReq(e2apMsg) == ROK)
1294 BuildAndSendRicIndication();
1300 DU_LOG("\nE2AP : Invalid type of successfulOutcome message [%d]", e2apMsg->choice.successfulOutcome->value.present);
1303 }/* End of switch(initiatingMessage) */
1308 DU_LOG("\nE2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
1312 }/* End of switch(e2apMsg->present) */
1314 } /* End of E2APMsgHdlr */
1316 /**********************************************************************
1318 **********************************************************************/