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 : BuildGlobalgNB
33 * Functionality: Building the Plmn and gNB id
35 * @params[in] GlobalE2node_gNB_ID_t *gNbId
36 * @return ROK - success
39 * ****************************************************************/
41 S16 BuildGlobalgNB(GlobalE2node_gNB_ID_t *gNbId)
48 /* Allocate Buffer size */
49 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(U8);
50 DU_ALLOC(gNbId->global_gNB_ID.plmn_id.buf , gNbId->global_gNB_ID.plmn_id.size);
51 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
52 &gNbId->global_gNB_ID.plmn_id);
55 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
56 /* Allocate Buffer size */
57 gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size = byteSize * sizeof(U8);
58 DU_ALLOC(gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.buf, gNbId->global_gNB_ID.gnb_id.choice.gnb_ID.size);
59 fillBitString(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, val);
64 /*******************************************************************
66 * @brief Builds and Send the E2SetupRequest
70 * Function : BuildAndSendE2SetupReq
72 * Functionality:Fills the E2SetupRequest
74 * @return ROK - success
77 ******************************************************************/
79 S16 BuildAndSendE2SetupReq()
81 E2AP_PDU_t *e2apMsg = NULLP;
82 E2setupRequest_t *e2SetupReq;
86 asn_enc_rval_t encRetVal; /* Encoder return value */
88 DU_LOG("\nE2AP : Building E2 Setup Request\n");
90 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
93 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
97 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
98 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
99 if(e2apMsg->choice.initiatingMessage == NULLP)
101 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
102 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
105 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
106 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
107 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
109 DU_ALLOC(e2SetupReq, sizeof(E2setupRequest_t));
110 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
114 e2SetupReq->protocolIEs.list.count = elementCnt;
115 e2SetupReq->protocolIEs.list.size = elementCnt * sizeof(E2setupRequestIEs_t);
117 /* Initialize the E2Setup members */
118 DU_ALLOC(e2SetupReq->protocolIEs.list.array, \
119 e2SetupReq->protocolIEs.list.size);
120 if(e2SetupReq->protocolIEs.list.array == NULLP)
122 DU_LOG("\nE2AP : Memory allocation for E2RequestIEs failed");
123 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
124 DU_FREE(e2apMsg, (Size)sizeof(E2AP_PDU_t));
128 for(idx=0; idx<elementCnt; idx++)
130 DU_ALLOC(e2SetupReq->protocolIEs.list.array[idx],\
131 sizeof(E2setupRequestIEs_t));
132 if(e2SetupReq->protocolIEs.list.array[idx] == NULLP)
134 for(ieId=0; ieId<idx; ieId++)
136 DU_FREE(e2SetupReq->protocolIEs.list.array[ieId],\
137 sizeof(E2setupRequestIEs_t));
139 DU_FREE(e2SetupReq->protocolIEs.list.array,\
140 e2SetupReq->protocolIEs.list.size);
141 DU_FREE(e2apMsg->choice.initiatingMessage, \
142 sizeof(InitiatingMessageE2_t));
143 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
149 /* GlobalE2node_gNB_ID */
150 e2SetupReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalE2node_ID;
151 e2SetupReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
152 e2SetupReq->protocolIEs.list.array[idx]->value.present =\
153 E2setupRequestIEs__value_PR_GlobalE2node_ID;
154 e2SetupReq->protocolIEs.list.array[idx]->value.choice.GlobalE2node_ID.present = \
155 GlobalE2node_ID_PR_gNB;
157 GlobalE2node_gNB_ID_t *gNbId;
158 DU_ALLOC(gNbId, sizeof(GlobalE2node_gNB_ID_t));
159 BuildGlobalgNB(gNbId);
160 e2SetupReq->protocolIEs.list.array[idx]->value.choice.GlobalE2node_ID.choice.gNB = gNbId;
162 /* Prints the Msg formed */
163 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
166 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
168 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
170 if(encRetVal.encoded == ENCODE_FAIL)
172 DU_LOG("\nE2AP : Could not encode E2SetupRequest structure (at %s)\n",\
173 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
178 DU_LOG("\nE2AP : Created APER encoded buffer for E2SetupRequest\n");
179 for(int i=0; i< encBufSize; i++)
181 printf("%x",encBuf[i]);
185 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
187 DU_LOG("\nE2AP : Sending E2 Setup request failed");
192 }/* End of BuildAndSendE2SetupReq */
194 /*******************************************************************
196 * @brief Builds Ric Request Id
200 * Function : BuildRicRequestId
202 * Functionality: Building the Ric Request Id
204 * @params[in] RICrequestID_t *ricReqId
205 * @return ROK - success
208 * ****************************************************************/
210 S16 BuildRicRequestId(RICrequestID_t *ricReqId)
212 if(ricReqId != NULLP)
214 ricReqId->ricRequestorID = 1;
215 ricReqId->ricInstanceID = 1;
220 /*******************************************************************
222 * @brief Fills the mandatory RicAdmitted List Items
226 * Function : fillRicAdmitList
228 * Functionality: Fills the mandatory Ric Admitted List Items
230 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
231 * @return ROK - success
234 * ****************************************************************/
236 S16 fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
239 if(ricAdmitItems != NULLP)
241 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
242 ricAdmitItems->criticality = CriticalityE2_reject;
243 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
244 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
248 /*******************************************************************
250 * @brief Builds the mandatory RicAdmitted List Params
254 * Function : fillRicAdmitList
256 * Functionality: Builds the mandatory Ric Admitted List Params
258 * @params[in] RICaction_Admitted_List_t *admitListPtr
259 * @return ROK - success
262 * ****************************************************************/
264 S16 BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
269 admitListPtr->list.count = elementCnt;
270 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
271 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
272 if(admitListPtr->list.array == NULLP)
274 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
277 DU_ALLOC(admitListPtr->list.array[0], sizeof(RICaction_Admitted_ItemIEs_t));
278 fillRicAdmitList((RICaction_Admitted_ItemIEs_t *)admitListPtr->list.array[0]);
283 /*******************************************************************
285 * @brief Builds and Send the RicSubscriptionRsp
289 * Function : BuildAndSendRicSubscriptionRsp
291 * Functionality:Fills the RicSubscriptionRsp
293 * @return ROK - success
296 ******************************************************************/
298 S16 BuildAndSendRicSubscriptionRsp()
301 E2AP_PDU_t *e2apRicMsg = NULLP;
302 RICsubscriptionResponse_t *ricSubscriptionRsp;
303 asn_enc_rval_t encRetVal;
308 DU_LOG("\nE2AP : Building RIC Subscription Response\n");
310 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
311 if(e2apRicMsg == NULLP)
313 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
316 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
317 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
318 if(e2apRicMsg->choice.successfulOutcome == NULLP)
320 DU_LOG("\nE2AP : Memory allocation for Ric subscription Response failed");
321 DU_FREE(e2apRicMsg, sizeof(RICsubscriptionResponse_t));
325 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
326 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
327 e2apRicMsg->choice.successfulOutcome->value.present = \
328 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
329 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
332 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
333 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
335 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
336 ricSubscriptionRsp->protocolIEs.list.size);
337 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
339 DU_LOG("\nE2AP : Memory allocation for RICsubscriptionResponseIE failed");
340 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
341 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
345 for(idx=0; idx<elementCnt; idx++)
347 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
348 sizeof(RICsubscriptionResponse_IEs_t));
349 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
351 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array,\
352 ricSubscriptionRsp->protocolIEs.list.size);
353 DU_FREE(e2apRicMsg->choice.successfulOutcome, \
354 sizeof(SuccessfulOutcomeE2_t));
355 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
360 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
361 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
362 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
363 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
364 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
367 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
368 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
369 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
370 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
371 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
374 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
375 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
376 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
377 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
378 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
381 /* Prints the Msg formed */
382 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
384 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
386 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
388 if(encRetVal.encoded == ENCODE_FAIL)
390 DU_LOG("\nE2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
391 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
396 DU_LOG("\nE2AP : Created APER encoded buffer for RIC subscription response \n");
397 for(int i=0; i< encBufSize; i++)
399 printf("%x",encBuf[i]);
403 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
405 DU_LOG("\nE2AP : Sending RIC Subscription Response failed");
411 /******************************************************************
413 * @brief Processes E2 Setup Response sent by RIC
417 * Function : procE2SetupRsp
419 * Functionality: Processes E2 Setup Response sent by RIC
421 * @params[in] E2AP_PDU_t ASN decoded E2AP message
422 * @return ROK - success
425 * ****************************************************************/
426 S16 procE2SetupRsp(E2AP_PDU_t *e2apMsg)
428 E2setupResponse_t *e2SetRspMsg;
429 E2apMsgDb e2SetupRspDb;
432 DU_LOG("\nE2AP : E2 Setup Response received");
433 duCb.e2Status = TRUE; //Set E2 status as true
434 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
436 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
438 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
440 case ProtocolIE_IDE2_id_GlobalRIC_ID:
442 /* To store the Ric Id Params */
444 memset(&e2SetupRspDb.plmn, 0, sizeof(PLMN_IdentityE2_t));
446 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity);
448 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2SetupRspDb.ricId);
449 aper_decode(0, &asn_DEF_PLMN_IdentityE2, (void **)&e2SetupRspDb.plmn, \
450 &e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity, recvBufLen, 0, 0);
452 xer_fprint(stdout, &asn_DEF_PLMN_IdentityE2, &e2SetupRspDb.plmn);
456 DU_LOG("\nE2AP : Invalid IE received in E2SetupRsp:%ld",
457 e2SetRspMsg->protocolIEs.list.array[idx]->id);
464 /******************************************************************
466 * @brief Processes RIC Subscription Req sent by RIC
470 * Function : procRicSubsReq
472 * Functionality: Processes E2 Setup Response sent by CU
474 * @params[in] E2AP_PDU_t ASN decoded E2AP message
475 * @return ROK - success
478 * ****************************************************************/
480 S16 procRicSubsReq(E2AP_PDU_t *e2apMsg)
485 RICsubscriptionRequest_t *ricSubsReq;
486 RICaction_ToBeSetup_ItemIEs_t *actionItem;
489 DU_LOG("\nE2AP : Ric Subscription request received");
490 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
492 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
494 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
496 case ProtocolIE_IDE2_id_RICrequestID:
498 ricReqDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->\
499 value.choice.RICrequestID.ricRequestorID;
500 ricReqDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]-> \
501 value.choice.RICrequestID.ricInstanceID;
504 case ProtocolIE_IDE2_id_RANfunctionID:
506 ricReqDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]-> \
507 value.choice.RANfunctionID;
510 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
513 memset(&ricReqDb.ricEventTrigger, 0, sizeof(RICeventTriggerDefinition_t));
515 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition);
517 aper_decode(0, &asn_DEF_RICeventTriggerDefinition, (void **)&ricReqDb.ricEventTrigger, &(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition), recvBufLen, 0, 0);
518 xer_fprint(stdout, &asn_DEF_RICeventTriggerDefinition, &ricReqDb.ricEventTrigger);
520 actionItem =(RICaction_ToBeSetup_ItemIEs_t *) ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list.array[0];
522 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
523 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
525 switch(actionItem->id)
527 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
529 ricReqDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
530 ricReqDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
534 DU_LOG("\nE2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
543 DU_LOG("\nE2AP : Invalid IE received in Ric SubsReq:%ld",
544 ricSubsReq->protocolIEs.list.array[idx]->id);
548 ret = BuildAndSendRicSubscriptionRsp();
554 /*******************************************************************
556 * @brief Builds and Send the RicIndication Message
560 * Function : BuildAndSendRicIndication
562 * Functionality:Fills the RicIndication Message
564 * @return ROK - success
567 ******************************************************************/
569 S16 BuildAndSendRicIndication()
571 E2AP_PDU_t *e2apMsg = NULLP;
572 RICindication_t *ricIndicationMsg;
577 asn_enc_rval_t encRetVal; /* Encoder return value */
579 DU_LOG("\nE2AP : Building Ric Indication Message\n");
581 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
584 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
588 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
589 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
590 if(e2apMsg->choice.initiatingMessage == NULLP)
592 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
593 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
596 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
597 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
598 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
600 DU_ALLOC(ricIndicationMsg, sizeof(RICindication_t));
601 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
605 ricIndicationMsg->protocolIEs.list.count = elementCnt;
606 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
608 /* Initialize the Ric Indication members */
609 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
610 ricIndicationMsg->protocolIEs.list.size);
611 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
613 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
614 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
615 DU_FREE(e2apMsg, (Size)sizeof(E2AP_PDU_t));
619 for(idx=0; idx<elementCnt; idx++)
621 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
622 sizeof(RICindication_IEs_t));
623 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
625 for(ieId=0; ieId<idx; ieId++)
627 DU_FREE(ricIndicationMsg->protocolIEs.list.array[ieId],\
628 sizeof(RICindication_IEs_t));
630 DU_FREE(ricIndicationMsg->protocolIEs.list.array,\
631 ricIndicationMsg->protocolIEs.list.size);
632 DU_FREE(e2apMsg->choice.initiatingMessage, \
633 sizeof(InitiatingMessageE2_t));
634 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
639 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
640 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
641 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
642 RICindication_IEs__value_PR_RICrequestID;
643 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = e2apMsgDb.ricReqId;
644 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = e2apMsgDb.ricInstanceId;
647 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
648 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
649 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
650 RICindication_IEs__value_PR_RANfunctionID;
651 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID = e2apMsgDb.ranFuncId;
654 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
655 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
656 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
657 RICindication_IEs__value_PR_RICactionID;
658 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID = e2apMsgDb.ricActionId;
662 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
663 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
664 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
665 RICindication_IEs__value_PR_RICindicationType;
667 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType = e2apMsgDb.ricActionType;
671 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
672 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
673 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
674 RICindication_IEs__value_PR_RICindicationHeader;
675 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size = 3 * sizeof(U8);
676 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf ,\
677 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
678 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
679 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader);
681 /* TO BE CHANGED: RIC INDICATION DATA */
682 /* For now filling a dummy octect data, need to tested with PRBs*/
684 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
685 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
686 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
687 RICindication_IEs__value_PR_RICindicationMessage;
688 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size = 3 * sizeof(U8);
689 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf ,\
690 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
691 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
692 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage);
694 /* Prints the Msg formed */
695 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
697 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
699 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
701 if(encRetVal.encoded == ENCODE_FAIL)
703 DU_LOG("\nE2AP : Could not encode RIC Indication Message (at %s)\n",\
704 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
709 DU_LOG("\nE2AP : Created APER encoded buffer for RIC Indication Message \n");
710 for(int i=0; i< encBufSize; i++)
712 printf("%x",encBuf[i]);
716 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
718 DU_LOG("\nE2AP : Sending RIC Indication Message");
724 /*******************************************************************
726 * @brief Sends E2 msg over SCTP
730 * Function : SendE2APMsg
732 * Functionality: Sends E2 msg over SCTP
734 * @params[in] Region region
736 * @return ROK - success
739 * ****************************************************************/
741 S16 SendE2APMsg(Region region, Pool pool)
745 if(SGetMsg(region, pool, &mBuf) == ROK)
747 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
751 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
753 DU_LOG("\nE2AP : SCTP Send for E2 failed");
760 DU_LOG("\nE2AP : SAddPstMsgMult failed");
768 DU_LOG("\nE2AP : Failed to allocate memory");
775 /*******************************************************************
777 * @brief Handles received E2AP message and sends back response
781 * Function : E2APMsgHdlr
784 * - Decodes received E2AP control message
785 * - Prepares response message, encodes and sends to SCTP
788 * @return ROK - success
791 * ****************************************************************/
792 void E2APMsgHdlr(Buffer *mBuf)
799 asn_dec_rval_t rval; /* Decoder return value */
800 E2AP_PDU_t e2apasnmsg ;
802 DU_LOG("\nE2AP : Received E2AP message buffer");
805 /* Copy mBuf into char array to decode it */
806 SFndLenMsg(mBuf, &recvBufLen);
807 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
809 DU_LOG("\nE2AP : Memory allocation failed");
812 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
814 DU_LOG("\nE2AP : Failed while copying %d", copyCnt);
818 printf("\nE2AP : Received flat buffer to be decoded : ");
819 for(i=0; i< recvBufLen; i++)
821 printf("%x",recvBuf[i]);
824 /* Decoding flat buffer into E2AP messsage */
825 e2apMsg = &e2apasnmsg;
826 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
828 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
829 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
830 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
832 DU_LOG("\nE2AP : ASN decode failed");
836 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
838 switch(e2apMsg->present)
840 case E2AP_PDU_PR_successfulOutcome:
842 switch(e2apMsg->choice.successfulOutcome->value.present)
844 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
848 DU_LOG("\nE2AP : Store E2 setup response Params");
849 procE2SetupRsp(e2apMsg);
855 DU_LOG("\nE2AP : Invalid type of intiating message [%d]", e2apMsg->choice.initiatingMessage->value.present);
858 }/* End of switch(successfulOutcome) */
861 case E2AP_PDU_PR_initiatingMessage:
863 switch(e2apMsg->choice.initiatingMessage->value.present)
865 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
867 DU_LOG("\nE2AP : Calling RIC Subscription Response");
868 if(procRicSubsReq(e2apMsg) == ROK)
870 BuildAndSendRicIndication();
876 DU_LOG("\nE2AP : Invalid type of successfulOutcome message [%d]", e2apMsg->choice.successfulOutcome->value.present);
879 }/* End of switch(initiatingMessage) */
884 DU_LOG("\nE2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
888 }/* End of switch(e2apMsg->present) */
890 } /* End of E2APMsgHdlr */
892 /**********************************************************************
894 **********************************************************************/