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"
25 #include "du_mgr_main.h"
27 #include "GlobalE2node-gNB-ID.h"
28 #include<ProtocolIE-FieldE2.h>
30 #include "du_e2ap_msg_hdl.h"
31 #include "odu_common_codec.h"
34 DuCfgParams duCfgParam;
35 /*******************************************************************
37 * @brief Builds Global gNodeB Params
41 * Function : BuildGlobalgNBId
43 * Functionality: Building the Plmn and gNB id
45 * @params[in] GlobalE2node_gNB_ID_t *gNbId
46 * @return ROK - success
49 ******************************************************************/
51 uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId)
58 /* Allocate Buffer size */
59 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(uint8_t);
60 gNbId->global_gNB_ID.plmn_id.buf = NULLP;
61 DU_ALLOC(gNbId->global_gNB_ID.plmn_id.buf , gNbId->global_gNB_ID.plmn_id.size);
62 if(gNbId->global_gNB_ID.plmn_id.buf == NULLP)
64 DU_LOG("\nE2AP: Memory allocation failed for Plmn buffer");
69 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
70 &gNbId->global_gNB_ID.plmn_id);
72 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
73 /* Allocate Buffer size */
74 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size = byteSize * sizeof(uint8_t);
75 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf = NULLP;
76 DU_ALLOC(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf, \
77 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
78 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf == NULLP)
80 DU_LOG("\nE2AP: Memory allocation failed for gnb buffer");
85 fillBitString(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, val);
91 /*******************************************************************
93 * @brief Fills the initiating IE for E2 Setup Request
97 * Function : fillE2SetupReq
99 * Functionality:Fills the Initiating message for
102 * @params[in] E2setupRequest_t *e2SetupReq,
104 * @return ROK - success
107 ******************************************************************/
109 uint8_t fillE2SetupReq(E2setupRequest_t **e2SetupReq, uint8_t *idx)
111 uint8_t elementCnt = 0;
115 if(*e2SetupReq != NULLP)
118 (*e2SetupReq)->protocolIEs.list.count = elementCnt;
119 (*e2SetupReq)->protocolIEs.list.size = \
120 elementCnt * sizeof(E2setupRequestIEs_t);
122 /* Initialize the E2Setup members */
123 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array, \
124 (*e2SetupReq)->protocolIEs.list.size);
125 if((*e2SetupReq)->protocolIEs.list.array == NULLP)
127 DU_LOG("\nE2AP : Memory allocation failed for array elements");
132 for(*idx = 0; *idx < elementCnt; (*idx)++)
134 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[*idx],\
135 sizeof(E2setupRequestIEs_t));
136 if((*e2SetupReq)->protocolIEs.list.array[*idx] == NULLP)
138 DU_LOG("\nE2AP : Memory allocation failed for arrayidx [%d]", *idx);
143 /* GlobalE2node_gNB_ID */
144 (*e2SetupReq)->protocolIEs.list.array[idx2]->id = \
145 ProtocolIE_IDE2_id_GlobalE2node_ID;
146 (*e2SetupReq)->protocolIEs.list.array[idx2]->criticality = \
147 CriticalityE2_reject;
148 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.present =\
149 E2setupRequestIEs__value_PR_GlobalE2node_ID;
150 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
151 GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB;
153 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
154 GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
155 if((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
156 GlobalE2node_ID.choice.gNB == NULLP)
158 DU_LOG("\nE2AP : Memory allocation failed for gNbId");
163 ret = BuildGlobalgNBId((*e2SetupReq)->protocolIEs.list.array[idx2]->value.\
164 choice.GlobalE2node_ID.choice.gNB);
178 DU_LOG("\nE2AP : Passed e2SetupReq is NULL");
183 /*******************************************************************
185 * @brief Builds and Send the E2SetupRequest
189 * Function : BuildAndSendE2SetupReq
191 * Functionality:Fills the E2SetupRequest
193 * @return ROK - success
196 ******************************************************************/
198 uint8_t BuildAndSendE2SetupReq()
202 E2AP_PDU_t *e2apMsg = NULLP;
203 E2setupRequest_t *e2SetupReq = NULLP;
204 asn_enc_rval_t encRetVal; /* Encoder return value */
206 DU_LOG("\nE2AP : Building E2 Setup Request\n");
209 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
212 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
215 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
216 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
217 if(e2apMsg->choice.initiatingMessage == NULLP)
219 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
220 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
223 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
224 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
225 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
226 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
228 ret = fillE2SetupReq(&e2SetupReq, &idx);
231 DU_LOG("\nE2AP : fillE2SetupReq() failed");
234 /* Prints the Msg formed */
235 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
237 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
239 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
241 if(encRetVal.encoded == ENCODE_FAIL)
243 DU_LOG("\nE2AP : Could not encode E2SetupRequest structure (at %s)\n",\
244 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
249 DU_LOG("\nE2AP : Created APER encoded buffer for E2SetupRequest\n");
250 for(int i=0; i< encBufSize; i++)
252 printf("%x",encBuf[i]);
255 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
257 DU_LOG("\nE2AP : Sending E2 Setup request failed");
263 deAllocateE2SetupReqMsg(e2apMsg, e2SetupReq, idx);
265 }/* End of BuildAndSendE2SetupReq */
267 /*******************************************************************
269 * @brief De Allocate E2 Setup Request Message
273 * Function : deAllocateE2SetupReqMsg
275 * Functionality: De-Allocating E2 Setup request Message
277 * @params[in] E2AP_PDU_t *e2apMsg
278 * E2setupRequest_t *e2SetupReq
279 * @return ROK - success
282 * ****************************************************************/
284 uint8_t deAllocateE2SetupReqMsg(E2AP_PDU_t *e2apMsg, \
285 E2setupRequest_t *e2SetupReq, uint8_t idx)
289 /* De-allocating Memory */
292 if(e2apMsg->choice.initiatingMessage != NULLP)
294 if(e2SetupReq->protocolIEs.list.array != NULLP)
296 for(idx2 = 0; idx2 < idx; idx2++)
298 if(e2SetupReq->protocolIEs.list.array[idx2] != NULLP)
300 switch(e2SetupReq->protocolIEs.list.array[idx2]->id)
302 case ProtocolIE_IDE2_id_GlobalE2node_ID:
304 if(e2SetupReq->protocolIEs.list.array[idx2]->\
305 value.choice.GlobalE2node_ID.choice.gNB != NULLP)
307 GlobalE2node_gNB_ID_t *gNbId = NULLP;
308 gNbId = e2SetupReq->protocolIEs.list.array[idx2]->\
309 value.choice.GlobalE2node_ID.choice.gNB;
310 if(gNbId->global_gNB_ID.plmn_id.buf != NULLP)
312 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf != NULLP)
314 DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\
315 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
317 DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\
318 gNbId->global_gNB_ID.plmn_id.size);
320 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2]->value.\
321 choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
323 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2],\
324 sizeof(E2setupRequestIEs_t));
328 DU_LOG("\n E2AP: Invalid event at e2SetupRequet %ld ",\
329 (e2SetupReq->protocolIEs.list.array[idx2]->id));
334 DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size);
336 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
338 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
342 /*******************************************************************
344 * @brief Builds Ric Request Id
348 * Function : BuildRicRequestId
350 * Functionality: Building the Ric Request Id
352 * @params[in] RICrequestID_t *ricReqId
353 * @return ROK - success
356 * ****************************************************************/
358 uint8_t BuildRicRequestId(RICrequestID_t *ricReqId)
360 if(ricReqId != NULLP)
362 ricReqId->ricRequestorID = 1;
363 ricReqId->ricInstanceID = 1;
372 /*******************************************************************
374 * @brief Fills the mandatory RicAdmitted List Items
378 * Function : fillRicAdmitList
380 * Functionality: Fills the mandatory Ric Admitted List Items
382 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
383 * @return ROK - success
386 * ****************************************************************/
388 uint8_t fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
391 if(ricAdmitItems != NULLP)
393 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
394 ricAdmitItems->criticality = CriticalityE2_reject;
395 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
396 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
404 /*******************************************************************
406 * @brief Builds the mandatory RicAdmitted List Params
410 * Function : BuildRicAdmitList
412 * Functionality: Builds the mandatory Ric Admitted List Params
414 * @params[in] RICaction_Admitted_List_t *admitListPtr
415 * @return ROK - success
418 * ****************************************************************/
420 uint8_t BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
427 if(admitListPtr == NULLP)
429 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
434 admitListPtr->list.count = elementCnt;
435 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
436 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
437 if(admitListPtr->list.array == NULLP)
439 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
444 for(idx=0 ; idx<elementCnt ; idx++ )
446 DU_ALLOC(admitListPtr->list.array[idx], sizeof(RICaction_Admitted_ItemIEs_t));
447 if(admitListPtr->list.array[idx] == NULLP)
455 fillRicAdmitList((RICaction_Admitted_ItemIEs_t *)admitListPtr->list.array[idx]);
461 /*******************************************************************
463 * @breif Deallocation of BuildAndSendRicSubscriptionRsp memory
467 * Function : FreeRicSubscriptionRsp
469 * Functionality:Free the RicSubscriptionRsp
471 * @param[in] E2AP_PDU_t *e2apRicMsg
476 ******************************************************************/
477 void FreeRicSubscriptionRsp(E2AP_PDU_t *e2apRicMsg)
479 RICsubscriptionResponse_t *ricSubscriptionRsp= NULLP;
482 RICaction_Admitted_List_t *admitListPtr;
484 if(e2apRicMsg != NULLP)
486 if(e2apRicMsg->choice.successfulOutcome != NULLP)
488 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
489 if(ricSubscriptionRsp)
491 if(ricSubscriptionRsp->protocolIEs.list.array != NULLP)
493 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
495 if(ricSubscriptionRsp->protocolIEs.list.array[idx] != NULLP)
497 switch(ricSubscriptionRsp->protocolIEs.list.array[idx]->id)
499 case ProtocolIE_IDE2_id_RICrequestID:
502 case ProtocolIE_IDE2_id_RANfunctionID:
505 case ProtocolIE_IDE2_id_RICactions_Admitted:
507 admitListPtr = &ricSubscriptionRsp->protocolIEs.list.\
508 array[idx]->value.choice.RICaction_Admitted_List;
509 if(admitListPtr->list.array != NULLP)
511 for(idx1=0 ; idx1<admitListPtr->list.count; idx1++ )
513 if(admitListPtr->list.array[idx1] != NULLP)
515 DU_FREE(admitListPtr->list.array[idx1],
516 sizeof(RICaction_Admitted_ItemIEs_t));
519 DU_FREE(admitListPtr->list.array, admitListPtr->list.size);
526 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array[idx], \
527 sizeof(RICsubscriptionResponse_IEs_t));
530 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array, \
531 ricSubscriptionRsp->protocolIEs.list.size);
534 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
536 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
539 /*******************************************************************
541 * @brief Builds and Send the RicSubscriptionRsp
545 * Function : BuildAndSendRicSubscriptionRsp
547 * functionality:Fills the RicSubscriptionRsp
549 * @return ROK - success
552 ******************************************************************/
553 uint8_t FillRicSubscriptionRsp(RICsubscriptionResponse_t *ricSubscriptionRsp )
557 uint8_t elementCnt = 0;
558 uint8_t BuildRicRequestIdret=ROK;
559 uint8_t BuildRicAdmitListret=ROK;
562 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
563 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
564 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
565 ricSubscriptionRsp->protocolIEs.list.size);
566 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
568 DU_LOG("\nE2AP : Memory allocation for FillRicSubscriptionRsp failed");
573 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
575 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
576 sizeof(RICsubscriptionResponse_IEs_t));
577 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
586 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
587 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
588 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
589 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
590 BuildRicRequestIdret =
591 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
592 if(BuildRicRequestIdret != ROK)
599 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
600 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
601 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
602 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
603 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
606 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
607 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
608 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
609 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
610 BuildRicAdmitListret =
611 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
612 if(BuildRicAdmitListret != ROK)
621 /*******************************************************************
623 * @brief Builds and Send the RicSubscriptionRsp
627 * Function : BuildAndSendRicSubscriptionRsp
629 * Functionality:Fills the RicSubscriptionRsp
631 * @return ROK - success
634 ******************************************************************/
636 uint8_t BuildAndSendRicSubscriptionRsp()
639 E2AP_PDU_t *e2apRicMsg = NULLP;
640 RICsubscriptionResponse_t *ricSubscriptionRsp=NULLP;
641 asn_enc_rval_t encRetVal;
642 uint8_t ret = RFAILED;
643 uint8_t FillRicricSubscriptionRspret;
647 DU_LOG("\nE2AP : Building RIC Subscription Response\n");
649 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
650 if(e2apRicMsg == NULLP)
652 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
655 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
656 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
657 if(e2apRicMsg->choice.successfulOutcome == NULLP)
659 DU_LOG("\nE2AP : Memory allocation for Ric subscription Response failed");
663 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
664 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
665 e2apRicMsg->choice.successfulOutcome->value.present = \
666 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
667 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
669 FillRicricSubscriptionRspret = FillRicSubscriptionRsp(ricSubscriptionRsp);
670 if(FillRicricSubscriptionRspret != ROK)
672 DU_LOG("\nE2AP : Memory allocation for RICsubscriptionResponseIE failed");
676 /* Prints the Msg formed */
677 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
679 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
681 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
683 if(encRetVal.encoded == ENCODE_FAIL)
685 DU_LOG("\nE2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
686 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
691 DU_LOG("\nE2AP : Created APER encoded buffer for RIC subscription response \n");
692 for(int i=0; i< encBufSize; i++)
694 printf("%x",encBuf[i]);
698 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
700 DU_LOG("\nE2AP : Sending RIC Subscription Response failed");
708 FreeRicSubscriptionRsp(e2apRicMsg);
712 /******************************************************************
714 * @brief Processes E2 Setup Response sent by RIC
718 * Function : procE2SetupRsp
720 * Functionality: Processes E2 Setup Response sent by RIC
722 * @params[in] E2AP_PDU_t ASN decoded E2AP message
723 * @return ROK - success
726 * ****************************************************************/
727 uint8_t procE2SetupRsp(E2AP_PDU_t *e2apMsg)
731 E2setupResponse_t *e2SetRspMsg;
733 DU_LOG("\nE2AP : E2 Setup Response received");
734 duCb.e2Status = TRUE; //Set E2 status as true
735 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
737 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
739 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
741 case ProtocolIE_IDE2_id_GlobalRIC_ID:
743 /* To store the Ric Id Params */
744 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value\
745 .choice.GlobalRIC_ID.pLMN_Identity.size);
746 e2apMsgDb.plmn = NULLP;
747 DU_ALLOC(e2apMsgDb.plmn, recvBufLen);
750 memcpy(e2apMsgDb.plmn, e2SetRspMsg->protocolIEs.list.array[idx]\
751 ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen);
753 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2apMsgDb.ricId);
754 /*TODO : e2apMsgDb.plmn memory to be deallocated after the usage */
758 DU_LOG("\nE2AP : Invalid IE received in E2SetupRsp:%ld",
759 e2SetRspMsg->protocolIEs.list.array[idx]->id);
766 /******************************************************************
768 * @brief Processes RIC Subscription Req sent by RIC
772 * Function : procRicSubsReq
774 * Functionality: Processes E2 Setup Response sent by CU
776 * @params[in] E2AP_PDU_t ASN decoded E2AP message
777 * @return ROK - success
780 * ****************************************************************/
782 uint8_t procRicSubsReq(E2AP_PDU_t *e2apMsg)
788 RICsubscriptionRequest_t *ricSubsReq;
789 RICaction_ToBeSetup_ItemIEs_t *actionItem;
791 DU_LOG("\nE2AP : Ric Subscription request received");
792 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
794 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
796 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
798 case ProtocolIE_IDE2_id_RICrequestID:
800 e2apMsgDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->\
801 value.choice.RICrequestID.ricRequestorID;
802 e2apMsgDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]-> \
803 value.choice.RICrequestID.ricInstanceID;
806 case ProtocolIE_IDE2_id_RANfunctionID:
808 e2apMsgDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]-> \
809 value.choice.RANfunctionID;
812 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
814 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value\
815 .choice.RICsubscriptionDetails.ricEventTriggerDefinition.size);
816 e2apMsgDb.ricEventTrigger = NULLP;
817 DU_ALLOC(e2apMsgDb.ricEventTrigger, recvBufLen);
818 /*TODO : e2apMsgDb.ricEventTrigger memory to be deallocated after the usage */
819 if(e2apMsgDb.ricEventTrigger)
821 memcpy(e2apMsgDb.ricEventTrigger, ricSubsReq->protocolIEs.list.array[idx]\
822 ->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.buf, \
825 actionItem =(RICaction_ToBeSetup_ItemIEs_t *)ricSubsReq->protocolIEs.list\
826 .array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List\
829 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
830 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
832 switch(actionItem->id)
834 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
836 e2apMsgDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
837 e2apMsgDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
841 DU_LOG("\nE2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
850 DU_LOG("\nE2AP : Invalid IE received in Ric SubsReq:%ld",
851 ricSubsReq->protocolIEs.list.array[idx]->id);
855 ret = BuildAndSendRicSubscriptionRsp();
860 /*******************************************************************
862 * @brief Free the RicIndication Message
866 * Function : FreeRicIndication
868 * Functionality: Free the RicIndication Message
873 ******************************************************************/
874 void FreeRicIndication(E2AP_PDU_t *e2apMsg)
877 RICindication_t *ricIndicationMsg= NULLP;
882 if(e2apMsg->choice.initiatingMessage != NULLP)
884 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
885 if(ricIndicationMsg!= NULLP)
887 if(ricIndicationMsg->protocolIEs.list.array != NULLP)
889 for(idx=0; idx<ricIndicationMsg->protocolIEs.list.count; idx++)
891 if(ricIndicationMsg->protocolIEs.list.array[idx] != NULLP)
893 switch(ricIndicationMsg->protocolIEs.list.array[idx]->id)
895 case ProtocolIE_IDE2_id_RICrequestID:
898 case ProtocolIE_IDE2_id_RANfunctionID:
901 case ProtocolIE_IDE2_id_RICactionID:
904 case ProtocolIE_IDE2_id_RICindicationType:
907 case ProtocolIE_IDE2_id_RICindicationHeader:
909 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf,\
910 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
913 case ProtocolIE_IDE2_id_RICindicationMessage:
915 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf,\
916 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
922 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx],sizeof(RICindication_IEs_t));
925 DU_FREE(ricIndicationMsg->protocolIEs.list.array,ricIndicationMsg->protocolIEs.list.size);
928 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
930 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
933 /*******************************************************************
935 * brief Fill the RicIndication Message
939 * Function : FillRicIndication
941 * Functionality:Fills the RicIndication Message
943 * @return ROK - success
946 ******************************************************************/
947 uint8_t FillRicIndication(RICindication_t *ricIndicationMsg)
949 uint8_t elementCnt=0;
954 ricIndicationMsg->protocolIEs.list.count = elementCnt;
955 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
956 /* Initialize the Ric Indication members */
957 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
958 ricIndicationMsg->protocolIEs.list.size);
959 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
961 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
966 for(idx=0; idx<elementCnt; idx++)
968 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
969 sizeof(RICindication_IEs_t));
970 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
972 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
980 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
981 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
982 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
983 RICindication_IEs__value_PR_RICrequestID;
984 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID =\
986 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID =\
987 e2apMsgDb.ricInstanceId;
990 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
991 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
992 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
993 RICindication_IEs__value_PR_RANfunctionID;
994 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID =
998 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
999 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1000 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1001 RICindication_IEs__value_PR_RICactionID;
1002 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID =
1003 e2apMsgDb.ricActionId;
1006 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
1007 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1008 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1009 RICindication_IEs__value_PR_RICindicationType;
1010 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType =
1011 e2apMsgDb.ricActionType;
1014 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
1015 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1016 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1017 RICindication_IEs__value_PR_RICindicationHeader;
1018 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size = 3 *
1020 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf ,\
1021 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
1022 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf == NULLP)
1024 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
1029 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1030 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader);
1032 /* TO BE CHANGED: RIC INDICATION DATA */
1033 /* For now filling a dummy octect data, need to tested with PRBs*/
1034 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
1035 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1036 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1037 RICindication_IEs__value_PR_RICindicationMessage;
1038 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size = 3 *
1040 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf ,\
1041 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
1042 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf == NULLP)
1044 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
1049 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1050 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage);
1058 /*******************************************************************
1060 * @brief Builds and Send the RicIndication Message
1064 * Function : BuildAndSendRicIndication
1066 * Functionality:Fills the RicIndication Message
1068 * @return ROK - success
1071 ******************************************************************/
1073 uint8_t BuildAndSendRicIndication()
1075 E2AP_PDU_t *e2apMsg = NULLP;
1076 RICindication_t *ricIndicationMsg=NULLP;
1077 asn_enc_rval_t encRetVal; /* Encoder return value */
1078 uint8_t ret = RFAILED;
1079 uint8_t FillRicIndicationret = ROK;
1083 DU_LOG("\nE2AP : Building Ric Indication Message\n");
1085 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1086 if(e2apMsg == NULLP)
1088 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
1092 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
1093 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1094 if(e2apMsg->choice.initiatingMessage == NULLP)
1096 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
1099 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
1100 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1101 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
1103 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
1105 FillRicIndicationret = FillRicIndication(ricIndicationMsg);
1106 if(FillRicIndicationret != ROK)
1110 /* Prints the Msg formed */
1111 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1112 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1114 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
1116 if(encRetVal.encoded == ENCODE_FAIL)
1118 DU_LOG("\nE2AP : Could not encode RIC Indication Message (at %s)\n",\
1119 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1124 DU_LOG("\nE2AP : Created APER encoded buffer for RIC Indication Message \n");
1125 for(int i=0; i< encBufSize; i++)
1127 printf("%x",encBuf[i]);
1131 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1133 DU_LOG("\nE2AP : Sending RIC Indication Message");
1139 FreeRicIndication(e2apMsg);
1143 /*******************************************************************
1145 * @brief Sends E2 msg over SCTP
1149 * Function : SendE2APMsg
1151 * Functionality: Sends E2 msg over SCTP
1153 * @params[in] Region region
1155 * @return ROK - success
1158 * ****************************************************************/
1160 uint8_t SendE2APMsg(Region region, Pool pool)
1164 if(SGetMsg(region, pool, &mBuf) == ROK)
1166 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
1168 SPrntMsg(mBuf, 0,0);
1170 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
1172 DU_LOG("\nE2AP : SCTP Send for E2 failed");
1179 DU_LOG("\nE2AP : SAddPstMsgMult failed");
1187 DU_LOG("\nE2AP : Failed to allocate memory");
1194 /*******************************************************************
1196 * @brief Handles received E2AP message and sends back response
1200 * Function : E2APMsgHdlr
1203 * - Decodes received E2AP control message
1204 * - Prepares response message, encodes and sends to SCTP
1207 * @return ROK - success
1210 * ****************************************************************/
1211 void E2APMsgHdlr(Buffer *mBuf)
1217 E2AP_PDU_t *e2apMsg;
1218 asn_dec_rval_t rval; /* Decoder return value */
1219 E2AP_PDU_t e2apasnmsg ;
1221 DU_LOG("\nE2AP : Received E2AP message buffer");
1222 SPrntMsg(mBuf, 0,0);
1224 /* Copy mBuf into char array to decode it */
1225 SFndLenMsg(mBuf, &recvBufLen);
1226 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
1228 DU_LOG("\nE2AP : Memory allocation failed");
1231 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
1233 DU_LOG("\nE2AP : Failed while copying %d", copyCnt);
1237 printf("\nE2AP : Received flat buffer to be decoded : ");
1238 for(i=0; i< recvBufLen; i++)
1240 printf("%x",recvBuf[i]);
1243 /* Decoding flat buffer into E2AP messsage */
1244 e2apMsg = &e2apasnmsg;
1245 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
1247 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
1248 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
1249 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1251 DU_LOG("\nE2AP : ASN decode failed");
1255 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1257 switch(e2apMsg->present)
1259 case E2AP_PDU_PR_successfulOutcome:
1261 switch(e2apMsg->choice.successfulOutcome->value.present)
1263 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
1267 DU_LOG("\nE2AP : Store E2 setup response Params");
1268 procE2SetupRsp(e2apMsg);
1274 DU_LOG("\nE2AP : Invalid type of intiating message [%d]", e2apMsg->choice.initiatingMessage->value.present);
1277 }/* End of switch(successfulOutcome) */
1280 case E2AP_PDU_PR_initiatingMessage:
1282 switch(e2apMsg->choice.initiatingMessage->value.present)
1284 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
1286 DU_LOG("\nE2AP : Calling RIC Subscription Response");
1287 if(procRicSubsReq(e2apMsg) == ROK)
1289 BuildAndSendRicIndication();
1295 DU_LOG("\nE2AP : Invalid type of successfulOutcome message [%d]", e2apMsg->choice.successfulOutcome->value.present);
1298 }/* End of switch(initiatingMessage) */
1303 DU_LOG("\nE2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
1307 }/* End of switch(e2apMsg->present) */
1309 } /* End of E2APMsgHdlr */
1311 /**********************************************************************
1313 **********************************************************************/