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 "du_e2ap_msg_hdl.h"
19 #include "du_mgr_main.h"
20 #include "GlobalE2node-gNB-ID.h"
23 DuCfgParams duCfgParam;
25 /*******************************************************************
27 * @brief Builds Global gNodeB Params
31 * Function : BuildGlobalgNBId
33 * Functionality: Building the Plmn and gNB id
35 * @params[in] GlobalE2node_gNB_ID_t *gNbId
36 * @return ROK - success
39 ******************************************************************/
41 uint8_t BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId)
48 /* Allocate Buffer size */
49 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(uint8_t);
50 gNbId->global_gNB_ID.plmn_id.buf = NULLP;
51 DU_ALLOC(gNbId->global_gNB_ID.plmn_id.buf , gNbId->global_gNB_ID.plmn_id.size);
52 if(gNbId->global_gNB_ID.plmn_id.buf == NULLP)
54 DU_LOG("\nE2AP: Memory allocation failed for Plmn buffer");
59 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
60 &gNbId->global_gNB_ID.plmn_id);
62 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
63 /* Allocate Buffer size */
64 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size = byteSize * sizeof(uint8_t);
65 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf = NULLP;
66 DU_ALLOC(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf, \
67 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
68 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf == NULLP)
70 DU_LOG("\nE2AP: Memory allocation failed for gnb buffer");
75 fillBitString(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, val);
81 /*******************************************************************
83 * @brief Fills the initiating IE for E2 Setup Request
87 * Function : fillE2SetupReq
89 * Functionality:Fills the Initiating message for
92 * @params[in] E2setupRequest_t *e2SetupReq,
94 * @return ROK - success
97 ******************************************************************/
99 uint8_t fillE2SetupReq(E2setupRequest_t **e2SetupReq, uint8_t *idx)
101 uint8_t elementCnt = 0;
105 if(*e2SetupReq != NULLP)
108 (*e2SetupReq)->protocolIEs.list.count = elementCnt;
109 (*e2SetupReq)->protocolIEs.list.size = \
110 elementCnt * sizeof(E2setupRequestIEs_t);
112 /* Initialize the E2Setup members */
113 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array, \
114 (*e2SetupReq)->protocolIEs.list.size);
115 if((*e2SetupReq)->protocolIEs.list.array == NULLP)
117 DU_LOG("\nE2AP : Memory allocation failed for array elements");
122 for(*idx = 0; *idx < elementCnt; (*idx)++)
124 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[*idx],\
125 sizeof(E2setupRequestIEs_t));
126 if((*e2SetupReq)->protocolIEs.list.array[*idx] == NULLP)
128 DU_LOG("\nE2AP : Memory allocation failed for arrayidx [%d]", *idx);
133 /* GlobalE2node_gNB_ID */
134 (*e2SetupReq)->protocolIEs.list.array[idx2]->id = \
135 ProtocolIE_IDE2_id_GlobalE2node_ID;
136 (*e2SetupReq)->protocolIEs.list.array[idx2]->criticality = \
137 CriticalityE2_reject;
138 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.present =\
139 E2setupRequestIEs__value_PR_GlobalE2node_ID;
140 (*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
141 GlobalE2node_ID.present = GlobalE2node_ID_PR_gNB;
143 DU_ALLOC((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
144 GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
145 if((*e2SetupReq)->protocolIEs.list.array[idx2]->value.choice.\
146 GlobalE2node_ID.choice.gNB == NULLP)
148 DU_LOG("\nE2AP : Memory allocation failed for gNbId");
153 ret = BuildGlobalgNBId((*e2SetupReq)->protocolIEs.list.array[idx2]->value.\
154 choice.GlobalE2node_ID.choice.gNB);
168 DU_LOG("\nE2AP : Passed e2SetupReq is NULL");
173 /*******************************************************************
175 * @brief Builds and Send the E2SetupRequest
179 * Function : BuildAndSendE2SetupReq
181 * Functionality:Fills the E2SetupRequest
183 * @return ROK - success
186 ******************************************************************/
188 uint8_t BuildAndSendE2SetupReq()
192 E2AP_PDU_t *e2apMsg = NULLP;
193 E2setupRequest_t *e2SetupReq = NULLP;
194 asn_enc_rval_t encRetVal; /* Encoder return value */
196 DU_LOG("\nE2AP : Building E2 Setup Request\n");
199 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
202 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
205 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
206 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
207 if(e2apMsg->choice.initiatingMessage == NULLP)
209 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
210 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
213 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
214 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
215 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
216 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
218 ret = fillE2SetupReq(&e2SetupReq, &idx);
221 DU_LOG("\nE2AP : fillE2SetupReq() failed");
224 /* Prints the Msg formed */
225 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
227 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
229 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
231 if(encRetVal.encoded == ENCODE_FAIL)
233 DU_LOG("\nE2AP : Could not encode E2SetupRequest structure (at %s)\n",\
234 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
239 DU_LOG("\nE2AP : Created APER encoded buffer for E2SetupRequest\n");
240 for(int i=0; i< encBufSize; i++)
242 printf("%x",encBuf[i]);
245 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
247 DU_LOG("\nE2AP : Sending E2 Setup request failed");
253 deAllocateE2SetupReqMsg(e2apMsg, e2SetupReq, idx);
255 }/* End of BuildAndSendE2SetupReq */
257 /*******************************************************************
259 * @brief De Allocate E2 Setup Request Message
263 * Function : deAllocateE2SetupReqMsg
265 * Functionality: De-Allocating E2 Setup request Message
267 * @params[in] E2AP_PDU_t *e2apMsg
268 * E2setupRequest_t *e2SetupReq
269 * @return ROK - success
272 * ****************************************************************/
274 uint8_t deAllocateE2SetupReqMsg(E2AP_PDU_t *e2apMsg, \
275 E2setupRequest_t *e2SetupReq, uint8_t idx)
279 /* De-allocating Memory */
282 if(e2apMsg->choice.initiatingMessage != NULLP)
284 if(e2SetupReq->protocolIEs.list.array != NULLP)
286 for(idx2 = 0; idx2 < idx; idx2++)
288 if(e2SetupReq->protocolIEs.list.array[idx2] != NULLP)
290 switch(e2SetupReq->protocolIEs.list.array[idx2]->id)
292 case ProtocolIE_IDE2_id_GlobalE2node_ID:
294 if(e2SetupReq->protocolIEs.list.array[idx2]->\
295 value.choice.GlobalE2node_ID.choice.gNB != NULLP)
297 GlobalE2node_gNB_ID_t *gNbId = NULLP;
298 gNbId = e2SetupReq->protocolIEs.list.array[idx2]->\
299 value.choice.GlobalE2node_ID.choice.gNB;
300 if(gNbId->global_gNB_ID.plmn_id.buf != NULLP)
302 if(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf != NULLP)
304 DU_FREE(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf,\
305 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
307 DU_FREE(gNbId->global_gNB_ID.plmn_id.buf,\
308 gNbId->global_gNB_ID.plmn_id.size);
310 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2]->value.\
311 choice.GlobalE2node_ID.choice.gNB, sizeof(GlobalE2node_gNB_ID_t));
313 DU_FREE(e2SetupReq->protocolIEs.list.array[idx2],\
314 sizeof(E2setupRequestIEs_t));
318 DU_LOG("\n E2AP: Invalid event at e2SetupRequet %ld ",\
319 (e2SetupReq->protocolIEs.list.array[idx2]->id));
324 DU_FREE(e2SetupReq->protocolIEs.list.array, e2SetupReq->protocolIEs.list.size);
326 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
328 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
332 /*******************************************************************
334 * @brief Builds Ric Request Id
338 * Function : BuildRicRequestId
340 * Functionality: Building the Ric Request Id
342 * @params[in] RICrequestID_t *ricReqId
343 * @return ROK - success
346 * ****************************************************************/
348 uint8_t BuildRicRequestId(RICrequestID_t *ricReqId)
350 if(ricReqId != NULLP)
352 ricReqId->ricRequestorID = 1;
353 ricReqId->ricInstanceID = 1;
362 /*******************************************************************
364 * @brief Fills the mandatory RicAdmitted List Items
368 * Function : fillRicAdmitList
370 * Functionality: Fills the mandatory Ric Admitted List Items
372 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
373 * @return ROK - success
376 * ****************************************************************/
378 uint8_t fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
381 if(ricAdmitItems != NULLP)
383 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
384 ricAdmitItems->criticality = CriticalityE2_reject;
385 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
386 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
394 /*******************************************************************
396 * @brief Builds the mandatory RicAdmitted List Params
400 * Function : BuildRicAdmitList
402 * Functionality: Builds the mandatory Ric Admitted List Params
404 * @params[in] RICaction_Admitted_List_t *admitListPtr
405 * @return ROK - success
408 * ****************************************************************/
410 uint8_t BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
417 if(admitListPtr == NULLP)
419 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
424 admitListPtr->list.count = elementCnt;
425 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
426 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
427 if(admitListPtr->list.array == NULLP)
429 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
434 for(idx=0 ; idx<elementCnt ; idx++ )
436 DU_ALLOC(admitListPtr->list.array[idx], sizeof(RICaction_Admitted_ItemIEs_t));
437 if(admitListPtr->list.array[idx] == NULLP)
445 fillRicAdmitList((RICaction_Admitted_ItemIEs_t *)admitListPtr->list.array[idx]);
451 /*******************************************************************
453 * @breif Deallocation of BuildAndSendRicSubscriptionRsp memory
457 * Function : FreeRicSubscriptionRsp
459 * Functionality:Free the RicSubscriptionRsp
461 * @param[in] E2AP_PDU_t *e2apRicMsg
466 ******************************************************************/
467 void FreeRicSubscriptionRsp(E2AP_PDU_t *e2apRicMsg)
469 RICsubscriptionResponse_t *ricSubscriptionRsp= NULLP;
472 RICaction_Admitted_List_t *admitListPtr;
474 if(e2apRicMsg != NULLP)
476 if(e2apRicMsg->choice.successfulOutcome != NULLP)
478 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
479 if(ricSubscriptionRsp)
481 if(ricSubscriptionRsp->protocolIEs.list.array != NULLP)
483 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
485 if(ricSubscriptionRsp->protocolIEs.list.array[idx] != NULLP)
487 switch(ricSubscriptionRsp->protocolIEs.list.array[idx]->id)
489 case ProtocolIE_IDE2_id_RICrequestID:
492 case ProtocolIE_IDE2_id_RANfunctionID:
495 case ProtocolIE_IDE2_id_RICactions_Admitted:
497 admitListPtr = &ricSubscriptionRsp->protocolIEs.list.\
498 array[idx]->value.choice.RICaction_Admitted_List;
499 if(admitListPtr->list.array != NULLP)
501 for(idx1=0 ; idx1<admitListPtr->list.count; idx1++ )
503 if(admitListPtr->list.array[idx1] != NULLP)
505 DU_FREE(admitListPtr->list.array[idx1],
506 sizeof(RICaction_Admitted_ItemIEs_t));
509 DU_FREE(admitListPtr->list.array, admitListPtr->list.size);
516 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array[idx], \
517 sizeof(RICsubscriptionResponse_IEs_t));
520 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array, \
521 ricSubscriptionRsp->protocolIEs.list.size);
524 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
526 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
529 /*******************************************************************
531 * @brief Builds and Send the RicSubscriptionRsp
535 * Function : BuildAndSendRicSubscriptionRsp
537 * functionality:Fills the RicSubscriptionRsp
539 * @return ROK - success
542 ******************************************************************/
543 uint8_t FillRicSubscriptionRsp(RICsubscriptionResponse_t *ricSubscriptionRsp )
547 uint8_t elementCnt = 0;
548 uint8_t BuildRicRequestIdret=ROK;
549 uint8_t BuildRicAdmitListret=ROK;
552 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
553 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
554 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
555 ricSubscriptionRsp->protocolIEs.list.size);
556 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
558 DU_LOG("\nE2AP : Memory allocation for FillRicSubscriptionRsp failed");
563 for(idx=0; idx<ricSubscriptionRsp->protocolIEs.list.count; idx++)
565 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
566 sizeof(RICsubscriptionResponse_IEs_t));
567 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
576 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
577 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
578 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
579 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
580 BuildRicRequestIdret =
581 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
582 if(BuildRicRequestIdret != ROK)
589 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
590 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
591 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
592 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
593 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
596 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
597 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
598 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
599 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
600 BuildRicAdmitListret =
601 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
602 if(BuildRicAdmitListret != ROK)
611 /*******************************************************************
613 * @brief Builds and Send the RicSubscriptionRsp
617 * Function : BuildAndSendRicSubscriptionRsp
619 * Functionality:Fills the RicSubscriptionRsp
621 * @return ROK - success
624 ******************************************************************/
626 uint8_t BuildAndSendRicSubscriptionRsp()
629 E2AP_PDU_t *e2apRicMsg = NULLP;
630 RICsubscriptionResponse_t *ricSubscriptionRsp=NULLP;
631 asn_enc_rval_t encRetVal;
632 uint8_t ret = RFAILED;
633 uint8_t FillRicricSubscriptionRspret;
637 DU_LOG("\nE2AP : Building RIC Subscription Response\n");
639 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
640 if(e2apRicMsg == NULLP)
642 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
645 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
646 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
647 if(e2apRicMsg->choice.successfulOutcome == NULLP)
649 DU_LOG("\nE2AP : Memory allocation for Ric subscription Response failed");
653 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
654 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
655 e2apRicMsg->choice.successfulOutcome->value.present = \
656 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
657 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
659 FillRicricSubscriptionRspret = FillRicSubscriptionRsp(ricSubscriptionRsp);
660 if(FillRicricSubscriptionRspret != ROK)
662 DU_LOG("\nE2AP : Memory allocation for RICsubscriptionResponseIE failed");
666 /* Prints the Msg formed */
667 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
669 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
671 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
673 if(encRetVal.encoded == ENCODE_FAIL)
675 DU_LOG("\nE2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
676 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
681 DU_LOG("\nE2AP : Created APER encoded buffer for RIC subscription response \n");
682 for(int i=0; i< encBufSize; i++)
684 printf("%x",encBuf[i]);
688 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
690 DU_LOG("\nE2AP : Sending RIC Subscription Response failed");
698 FreeRicSubscriptionRsp(e2apRicMsg);
702 /******************************************************************
704 * @brief Processes E2 Setup Response sent by RIC
708 * Function : procE2SetupRsp
710 * Functionality: Processes E2 Setup Response sent by RIC
712 * @params[in] E2AP_PDU_t ASN decoded E2AP message
713 * @return ROK - success
716 * ****************************************************************/
717 uint8_t procE2SetupRsp(E2AP_PDU_t *e2apMsg)
721 E2setupResponse_t *e2SetRspMsg;
723 DU_LOG("\nE2AP : E2 Setup Response received");
724 duCb.e2Status = TRUE; //Set E2 status as true
725 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
727 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
729 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
731 case ProtocolIE_IDE2_id_GlobalRIC_ID:
733 /* To store the Ric Id Params */
734 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value\
735 .choice.GlobalRIC_ID.pLMN_Identity.size);
736 e2apMsgDb.plmn = NULLP;
737 DU_ALLOC(e2apMsgDb.plmn, recvBufLen);
740 memcpy(e2apMsgDb.plmn, e2SetRspMsg->protocolIEs.list.array[idx]\
741 ->value.choice.GlobalRIC_ID.pLMN_Identity.buf, recvBufLen);
743 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2apMsgDb.ricId);
744 /*TODO : e2apMsgDb.plmn memory to be deallocated after the usage */
748 DU_LOG("\nE2AP : Invalid IE received in E2SetupRsp:%ld",
749 e2SetRspMsg->protocolIEs.list.array[idx]->id);
756 /******************************************************************
758 * @brief Processes RIC Subscription Req sent by RIC
762 * Function : procRicSubsReq
764 * Functionality: Processes E2 Setup Response sent by CU
766 * @params[in] E2AP_PDU_t ASN decoded E2AP message
767 * @return ROK - success
770 * ****************************************************************/
772 uint8_t procRicSubsReq(E2AP_PDU_t *e2apMsg)
778 RICsubscriptionRequest_t *ricSubsReq;
779 RICaction_ToBeSetup_ItemIEs_t *actionItem;
781 DU_LOG("\nE2AP : Ric Subscription request received");
782 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
784 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
786 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
788 case ProtocolIE_IDE2_id_RICrequestID:
790 e2apMsgDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->\
791 value.choice.RICrequestID.ricRequestorID;
792 e2apMsgDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]-> \
793 value.choice.RICrequestID.ricInstanceID;
796 case ProtocolIE_IDE2_id_RANfunctionID:
798 e2apMsgDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]-> \
799 value.choice.RANfunctionID;
802 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
804 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value\
805 .choice.RICsubscriptionDetails.ricEventTriggerDefinition.size);
806 e2apMsgDb.ricEventTrigger = NULLP;
807 DU_ALLOC(e2apMsgDb.ricEventTrigger, recvBufLen);
808 /*TODO : e2apMsgDb.ricEventTrigger memory to be deallocated after the usage */
809 if(e2apMsgDb.ricEventTrigger)
811 memcpy(e2apMsgDb.ricEventTrigger, ricSubsReq->protocolIEs.list.array[idx]\
812 ->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.buf, \
815 actionItem =(RICaction_ToBeSetup_ItemIEs_t *)ricSubsReq->protocolIEs.list\
816 .array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List\
819 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
820 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
822 switch(actionItem->id)
824 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
826 e2apMsgDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
827 e2apMsgDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
831 DU_LOG("\nE2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
840 DU_LOG("\nE2AP : Invalid IE received in Ric SubsReq:%ld",
841 ricSubsReq->protocolIEs.list.array[idx]->id);
845 ret = BuildAndSendRicSubscriptionRsp();
850 /*******************************************************************
852 * @brief Free the RicIndication Message
856 * Function : FreeRicIndication
858 * Functionality: Free the RicIndication Message
863 ******************************************************************/
864 void FreeRicIndication(E2AP_PDU_t *e2apMsg)
867 RICindication_t *ricIndicationMsg= NULLP;
872 if(e2apMsg->choice.initiatingMessage != NULLP)
874 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
875 if(ricIndicationMsg!= NULLP)
877 if(ricIndicationMsg->protocolIEs.list.array != NULLP)
879 for(idx=0; idx<ricIndicationMsg->protocolIEs.list.count; idx++)
881 if(ricIndicationMsg->protocolIEs.list.array[idx] != NULLP)
883 switch(ricIndicationMsg->protocolIEs.list.array[idx]->id)
885 case ProtocolIE_IDE2_id_RICrequestID:
888 case ProtocolIE_IDE2_id_RANfunctionID:
891 case ProtocolIE_IDE2_id_RICactionID:
894 case ProtocolIE_IDE2_id_RICindicationType:
897 case ProtocolIE_IDE2_id_RICindicationHeader:
899 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf,\
900 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
903 case ProtocolIE_IDE2_id_RICindicationMessage:
905 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf,\
906 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
912 DU_FREE(ricIndicationMsg->protocolIEs.list.array[idx],sizeof(RICindication_IEs_t));
915 DU_FREE(ricIndicationMsg->protocolIEs.list.array,ricIndicationMsg->protocolIEs.list.size);
918 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
920 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
923 /*******************************************************************
925 * brief Fill the RicIndication Message
929 * Function : FillRicIndication
931 * Functionality:Fills the RicIndication Message
933 * @return ROK - success
936 ******************************************************************/
937 uint8_t FillRicIndication(RICindication_t *ricIndicationMsg)
939 uint8_t elementCnt=0;
944 ricIndicationMsg->protocolIEs.list.count = elementCnt;
945 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
946 /* Initialize the Ric Indication members */
947 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
948 ricIndicationMsg->protocolIEs.list.size);
949 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
951 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
956 for(idx=0; idx<elementCnt; idx++)
958 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
959 sizeof(RICindication_IEs_t));
960 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
962 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
970 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
971 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
972 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
973 RICindication_IEs__value_PR_RICrequestID;
974 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID =\
976 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID =\
977 e2apMsgDb.ricInstanceId;
980 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
981 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
982 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
983 RICindication_IEs__value_PR_RANfunctionID;
984 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID =
988 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
989 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
990 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
991 RICindication_IEs__value_PR_RICactionID;
992 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID =
993 e2apMsgDb.ricActionId;
996 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
997 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
998 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
999 RICindication_IEs__value_PR_RICindicationType;
1000 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType =
1001 e2apMsgDb.ricActionType;
1004 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
1005 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1006 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1007 RICindication_IEs__value_PR_RICindicationHeader;
1008 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size = 3 *
1010 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf ,\
1011 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
1012 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf == NULLP)
1014 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
1019 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1020 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader);
1022 /* TO BE CHANGED: RIC INDICATION DATA */
1023 /* For now filling a dummy octect data, need to tested with PRBs*/
1024 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
1025 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
1026 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
1027 RICindication_IEs__value_PR_RICindicationMessage;
1028 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size = 3 *
1030 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf ,\
1031 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
1032 if(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf == NULLP)
1034 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
1039 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
1040 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage);
1048 /*******************************************************************
1050 * @brief Builds and Send the RicIndication Message
1054 * Function : BuildAndSendRicIndication
1056 * Functionality:Fills the RicIndication Message
1058 * @return ROK - success
1061 ******************************************************************/
1063 uint8_t BuildAndSendRicIndication()
1065 E2AP_PDU_t *e2apMsg = NULLP;
1066 RICindication_t *ricIndicationMsg=NULLP;
1067 uint8_t elementCnt=0;
1068 asn_enc_rval_t encRetVal; /* Encoder return value */
1069 uint8_t ret = RFAILED;
1070 uint8_t FillRicIndicationret = ROK;
1074 DU_LOG("\nE2AP : Building Ric Indication Message\n");
1076 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
1077 if(e2apMsg == NULLP)
1079 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
1083 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
1084 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
1085 if(e2apMsg->choice.initiatingMessage == NULLP)
1087 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
1090 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
1091 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
1092 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
1094 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
1096 FillRicIndicationret = FillRicIndication(ricIndicationMsg);
1097 if(FillRicIndicationret != ROK)
1101 /* Prints the Msg formed */
1102 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1103 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1105 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
1107 if(encRetVal.encoded == ENCODE_FAIL)
1109 DU_LOG("\nE2AP : Could not encode RIC Indication Message (at %s)\n",\
1110 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1115 DU_LOG("\nE2AP : Created APER encoded buffer for RIC Indication Message \n");
1116 for(int i=0; i< encBufSize; i++)
1118 printf("%x",encBuf[i]);
1122 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1124 DU_LOG("\nE2AP : Sending RIC Indication Message");
1130 FreeRicIndication(e2apMsg);
1134 /*******************************************************************
1136 * @brief Sends E2 msg over SCTP
1140 * Function : SendE2APMsg
1142 * Functionality: Sends E2 msg over SCTP
1144 * @params[in] Region region
1146 * @return ROK - success
1149 * ****************************************************************/
1151 uint8_t SendE2APMsg(Region region, Pool pool)
1155 if(SGetMsg(region, pool, &mBuf) == ROK)
1157 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
1159 SPrntMsg(mBuf, 0,0);
1161 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
1163 DU_LOG("\nE2AP : SCTP Send for E2 failed");
1170 DU_LOG("\nE2AP : SAddPstMsgMult failed");
1178 DU_LOG("\nE2AP : Failed to allocate memory");
1185 /*******************************************************************
1187 * @brief Handles received E2AP message and sends back response
1191 * Function : E2APMsgHdlr
1194 * - Decodes received E2AP control message
1195 * - Prepares response message, encodes and sends to SCTP
1198 * @return ROK - success
1201 * ****************************************************************/
1202 void E2APMsgHdlr(Buffer *mBuf)
1208 E2AP_PDU_t *e2apMsg;
1209 asn_dec_rval_t rval; /* Decoder return value */
1210 E2AP_PDU_t e2apasnmsg ;
1212 DU_LOG("\nE2AP : Received E2AP message buffer");
1213 SPrntMsg(mBuf, 0,0);
1215 /* Copy mBuf into char array to decode it */
1216 SFndLenMsg(mBuf, &recvBufLen);
1217 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
1219 DU_LOG("\nE2AP : Memory allocation failed");
1222 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
1224 DU_LOG("\nE2AP : Failed while copying %d", copyCnt);
1228 printf("\nE2AP : Received flat buffer to be decoded : ");
1229 for(i=0; i< recvBufLen; i++)
1231 printf("%x",recvBuf[i]);
1234 /* Decoding flat buffer into E2AP messsage */
1235 e2apMsg = &e2apasnmsg;
1236 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
1238 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
1239 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
1240 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
1242 DU_LOG("\nE2AP : ASN decode failed");
1246 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
1248 switch(e2apMsg->present)
1250 case E2AP_PDU_PR_successfulOutcome:
1252 switch(e2apMsg->choice.successfulOutcome->value.present)
1254 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
1258 DU_LOG("\nE2AP : Store E2 setup response Params");
1259 procE2SetupRsp(e2apMsg);
1265 DU_LOG("\nE2AP : Invalid type of intiating message [%d]", e2apMsg->choice.initiatingMessage->value.present);
1268 }/* End of switch(successfulOutcome) */
1271 case E2AP_PDU_PR_initiatingMessage:
1273 switch(e2apMsg->choice.initiatingMessage->value.present)
1275 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
1277 DU_LOG("\nE2AP : Calling RIC Subscription Response");
1278 if(procRicSubsReq(e2apMsg) == ROK)
1280 BuildAndSendRicIndication();
1286 DU_LOG("\nE2AP : Invalid type of successfulOutcome message [%d]", e2apMsg->choice.successfulOutcome->value.present);
1289 }/* End of switch(initiatingMessage) */
1294 DU_LOG("\nE2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
1298 }/* End of switch(e2apMsg->present) */
1300 } /* End of E2APMsgHdlr */
1302 /**********************************************************************
1304 **********************************************************************/