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"
22 #define ENC_BUF_MAX_LEN 100
25 DuCfgParams duCfgParam;
26 char encBuf[ENC_BUF_MAX_LEN];
29 /*******************************************************************
31 * @brief Writes the encoded chunks into a buffer
35 * Function : PrepFinalEncBuf
37 * Functionality:Fills the encoded buffer
39 * @params[in] void *buffer,initial encoded data
40 * @params[in] size_t size,size of buffer
41 * @params[in] void *encodedBuf,final buffer
42 * @return ROK - success
45 * ****************************************************************/
46 static int PrepFinalEncBuf(const void *buffer, size_t size, void *encodedBuf)
48 memcpy(encodedBuf + encBufSize, buffer, size);
51 } /* PrepFinalEncBuf */
53 /*******************************************************************
55 * @brief Builds PLMN ID
59 * Function : BuildPlmnId
61 * Functionality: Building the PLMN ID
63 * @params[in] PLMNID plmn
64 * OCTET_STRING_t *plmnid
65 * @return ROK - success
68 * ****************************************************************/
70 S16 BuildPlmnId(PlmnId plmn, OCTET_STRING_t *plmnid)
74 DU_ALLOC(plmnid->buf, plmnid->size * sizeof(U8));
75 if(plmnid->buf == NULLP)
80 plmnid->buf[0] = ((plmn.mcc[1] << 4) | (plmn.mcc[0]));
83 plmnid->buf[1] = ((0xf0) | (plmn.mcc[2]));
84 plmnid->buf[2] = ((plmn.mnc[1] << 4) | (plmn.mnc[0]));
88 plmnid->buf[1] = ((plmn.mnc[0] << 4) | (plmn.mcc[2]));
89 plmnid->buf[2] = ((plmn.mnc[2] << 4) | (plmn.mnc[1]));
94 /*******************************************************************
96 * @brief Builds NodeB Id
100 * Function : BuildNodeBId
102 * Functionality: Building the NodeBId
104 * @params[in] BIT_STRING_t *nbid,
109 * @return ROK - success
112 * ****************************************************************/
114 S16 BuildNodeBId(BIT_STRING_t *nbid, U8 unusedBits, U8 byteSize, U8 val)
117 nbid->size = byteSize;
118 DU_ALLOC(nbid->buf, nbid->size * sizeof(U8));
119 if(nbid->buf == NULLP)
124 for (tmp = 0 ; tmp < ((nbid->size)-1); tmp++)
128 nbid->buf[byteSize-1] = val;
129 nbid->bits_unused = unusedBits;
133 /*******************************************************************
135 * @brief Builds Global gNodeB Params
139 * Function : BuildGlobalgNB
141 * Functionality: Building the Plmn and gNB id
143 * @params[in] GlobalE2node_gNB_ID_t *gNbId
144 * @return ROK - success
147 * ****************************************************************/
149 S16 BuildGlobalgNB(GlobalE2node_gNB_ID_t *gNbId)
156 BuildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
157 &gNbId->global_gNB_ID.plmn_id);
159 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
160 BuildNodeBId(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, val);
165 /*******************************************************************
167 * @brief Builds and Send the E2SetupRequest
171 * Function : BuildAndSendE2SetupReq
173 * Functionality:Fills the E2SetupRequest
175 * @return ROK - success
178 ******************************************************************/
180 S16 BuildAndSendE2SetupReq()
182 E2AP_PDU_t *e2apMsg = NULLP;
183 E2setupRequest_t *e2SetupReq;
188 asn_enc_rval_t encRetVal; /* Encoder return value */
190 DU_LOG("\nE2AP : Building E2 Setup Request\n");
192 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
195 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
199 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
200 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
201 if(e2apMsg->choice.initiatingMessage == NULLP)
203 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
204 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
207 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
208 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
209 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
211 DU_ALLOC(e2SetupReq, sizeof(E2setupRequest_t));
212 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
216 e2SetupReq->protocolIEs.list.count = elementCnt;
217 e2SetupReq->protocolIEs.list.size = elementCnt * sizeof(E2setupRequestIEs_t);
219 /* Initialize the E2Setup members */
220 DU_ALLOC(e2SetupReq->protocolIEs.list.array, \
221 e2SetupReq->protocolIEs.list.size);
222 if(e2SetupReq->protocolIEs.list.array == NULLP)
224 DU_LOG("\nE2AP : Memory allocation for E2RequestIEs failed");
225 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
226 DU_FREE(e2apMsg, (Size)sizeof(E2AP_PDU_t));
230 for(idx=0; idx<elementCnt; idx++)
232 DU_ALLOC(e2SetupReq->protocolIEs.list.array[idx],\
233 sizeof(E2setupRequestIEs_t));
234 if(e2SetupReq->protocolIEs.list.array[idx] == NULLP)
236 for(ieId=0; ieId<idx; ieId++)
238 DU_FREE(e2SetupReq->protocolIEs.list.array[ieId],\
239 sizeof(E2setupRequestIEs_t));
241 DU_FREE(e2SetupReq->protocolIEs.list.array,\
242 e2SetupReq->protocolIEs.list.size);
243 DU_FREE(e2apMsg->choice.initiatingMessage, \
244 sizeof(InitiatingMessageE2_t));
245 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
251 /* GlobalE2node_gNB_ID */
252 e2SetupReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalE2node_ID;
253 e2SetupReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
254 e2SetupReq->protocolIEs.list.array[idx]->value.present =\
255 E2setupRequestIEs__value_PR_GlobalE2node_ID;
256 e2SetupReq->protocolIEs.list.array[idx]->value.choice.GlobalE2node_ID.present = \
257 GlobalE2node_ID_PR_gNB;
259 GlobalE2node_gNB_ID_t *gNbId;
260 DU_ALLOC(gNbId, sizeof(GlobalE2node_gNB_ID_t));
261 BuildGlobalgNB(gNbId);
262 e2SetupReq->protocolIEs.list.array[idx]->value.choice.GlobalE2node_ID.choice.gNB = gNbId;
264 /* Prints the Msg formed */
265 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
268 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
270 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
272 if(encRetVal.encoded == ENCODE_FAIL)
274 DU_LOG("\nE2AP : Could not encode E2SetupRequest structure (at %s)\n",\
275 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
280 DU_LOG("\nE2AP : Created APER encoded buffer for E2SetupRequest\n");
281 for(int i=0; i< encBufSize; i++)
283 printf("%x",encBuf[i]);
287 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
289 DU_LOG("\nE2AP : Sending E2 Setup request failed");
294 }/* End of BuildAndSendE2SetupReq */
296 /*******************************************************************
298 * @brief Builds Ric Request Id
302 * Function : BuildRicRequestId
304 * Functionality: Building the Ric Request Id
306 * @params[in] RICrequestID_t *ricReqId
307 * @return ROK - success
310 * ****************************************************************/
312 S16 BuildRicRequestId(RICrequestID_t *ricReqId)
314 if(ricReqId != NULLP)
316 ricReqId->ricRequestorID = 1;
317 ricReqId->ricInstanceID = 1;
322 /*******************************************************************
324 * @brief Fills the mandatory RicAdmitted List Items
328 * Function : fillRicAdmitList
330 * Functionality: Fills the mandatory Ric Admitted List Items
332 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
333 * @return ROK - success
336 * ****************************************************************/
338 S16 fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
341 if(ricAdmitItems != NULLP)
343 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
344 ricAdmitItems->criticality = CriticalityE2_reject;
345 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
346 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
350 /*******************************************************************
352 * @brief Builds the mandatory RicAdmitted List Params
356 * Function : fillRicAdmitList
358 * Functionality: Builds the mandatory Ric Admitted List Params
360 * @params[in] RICaction_Admitted_List_t *admitListPtr
361 * @return ROK - success
364 * ****************************************************************/
366 S16 BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
371 admitListPtr->list.count = elementCnt;
372 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
373 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
374 if(admitListPtr->list.array == NULLP)
376 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
379 DU_ALLOC(admitListPtr->list.array[0], sizeof(RICaction_Admitted_ItemIEs_t));
380 fillRicAdmitList(admitListPtr->list.array[0]);
385 /*******************************************************************
387 * @brief Builds and Send the RicSubscriptionRsp
391 * Function : BuildAndSendRicSubscriptionRsp
393 * Functionality:Fills the RicSubscriptionRsp
395 * @return ROK - success
398 ******************************************************************/
400 S16 BuildAndSendRicSubscriptionRsp()
403 E2AP_PDU_t *e2apRicMsg = NULLP;
404 RICsubscriptionResponse_t *ricSubscriptionRsp;
405 asn_enc_rval_t encRetVal;
410 DU_LOG("\nE2AP : Building RIC Subscription Response\n");
412 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
413 if(e2apRicMsg == NULLP)
415 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
418 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
419 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
420 if(e2apRicMsg->choice.successfulOutcome == NULLP)
422 DU_LOG("\nE2AP : Memory allocation for Ric subscription Response failed");
423 DU_FREE(e2apRicMsg, sizeof(RICsubscriptionResponse_t));
427 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
428 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
429 e2apRicMsg->choice.successfulOutcome->value.present = \
430 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
431 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
434 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
435 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
437 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
438 ricSubscriptionRsp->protocolIEs.list.size);
439 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
441 DU_LOG("\nE2AP : Memory allocation for RICsubscriptionResponseIE failed");
442 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
443 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
447 for(idx=0; idx<elementCnt; idx++)
449 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
450 sizeof(RICsubscriptionResponse_IEs_t));
451 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
453 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array,\
454 ricSubscriptionRsp->protocolIEs.list.size);
455 DU_FREE(e2apRicMsg->choice.successfulOutcome, \
456 sizeof(SuccessfulOutcomeE2_t));
457 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
462 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
463 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
464 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
465 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
466 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
469 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
470 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
471 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
472 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
473 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
476 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
477 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
478 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
479 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
480 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
483 /* Prints the Msg formed */
484 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
486 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
488 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
490 if(encRetVal.encoded == ENCODE_FAIL)
492 DU_LOG("\nE2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
493 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
498 DU_LOG("\nE2AP : Created APER encoded buffer for RIC subscription response \n");
499 for(int i=0; i< encBufSize; i++)
501 printf("%x",encBuf[i]);
505 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
507 DU_LOG("\nE2AP : Sending RIC Subscription Response failed");
513 /******************************************************************
515 * @brief Processes E2 Setup Response sent by RIC
519 * Function : procE2SetupRsp
521 * Functionality: Processes E2 Setup Response sent by RIC
523 * @params[in] E2AP_PDU_t ASN decoded E2AP message
524 * @return ROK - success
527 * ****************************************************************/
528 S16 procE2SetupRsp(E2AP_PDU_t *e2apMsg)
530 E2setupResponse_t *e2SetRspMsg;
531 E2apMsgDb e2SetupRspDb;
534 DU_LOG("\nE2AP : E2 Setup Response received");
535 duCb.e2Status = TRUE; //Set E2 status as true
536 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
538 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
540 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
542 case ProtocolIE_IDE2_id_GlobalRIC_ID:
544 /* To store the Ric Id Params */
546 memset(&e2SetupRspDb.plmn, 0, sizeof(PLMN_IdentityE2_t));
548 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity);
550 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2SetupRspDb.ricId);
552 aper_decode(0, &asn_DEF_PLMN_IdentityE2, (void **)&e2SetupRspDb.plmn, &e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity, recvBufLen, 0, 0);
553 //xer_fprint(stdout, &asn_DEF_PLMN_IdentityE2, &e2SetupRspDb.plmn);
558 DU_LOG("\nE2AP : Invalid IE received in E2SetupRsp:%ld",
559 e2SetRspMsg->protocolIEs.list.array[idx]->id);
566 /******************************************************************
568 * @brief Processes RIC Subscription Req sent by RIC
572 * Function : procRicSubsReq
574 * Functionality: Processes E2 Setup Response sent by CU
576 * @params[in] E2AP_PDU_t ASN decoded E2AP message
577 * @return ROK - success
580 * ****************************************************************/
582 S16 procRicSubsReq(E2AP_PDU_t *e2apMsg)
587 RICsubscriptionRequest_t *ricSubsReq;
588 RICaction_ToBeSetup_ItemIEs_t *actionItem;
591 DU_LOG("\nE2AP : Ric Subscription request received");
592 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
594 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
596 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
598 case ProtocolIE_IDE2_id_RICrequestID:
600 ricReqDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID;
601 ricReqDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID;
604 case ProtocolIE_IDE2_id_RANfunctionID:
606 ricReqDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID;
609 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
612 memset(&ricReqDb.ricEventTrigger, 0, sizeof(RICeventTriggerDefinition_t));
614 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition);
616 aper_decode(0, &asn_DEF_RICeventTriggerDefinition, (void **)&ricReqDb.ricEventTrigger, &(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition), recvBufLen, 0, 0);
617 //xer_fprint(stdout, &asn_DEF_RICeventTriggerDefinition, &ricReqDb.ricEventTrigger);
619 actionItem = *ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list.array;
621 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
622 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
624 switch(actionItem->id)
626 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
628 ricReqDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
629 ricReqDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
633 DU_LOG("\nE2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
642 DU_LOG("\nE2AP : Invalid IE received in Ric SubsReq:%ld",
643 ricSubsReq->protocolIEs.list.array[idx]->id);
647 ret = BuildAndSendRicSubscriptionRsp();
653 /*******************************************************************
655 * @brief Builds and Send the RicIndication Message
659 * Function : BuildAndSendRicIndication
661 * Functionality:Fills the RicIndication Message
663 * @return ROK - success
666 ******************************************************************/
668 S16 BuildAndSendRicIndication()
670 E2AP_PDU_t *e2apMsg = NULLP;
671 RICindication_t *ricIndicationMsg;
677 asn_enc_rval_t encRetVal; /* Encoder return value */
679 DU_LOG("\nE2AP : Building Ric Indication Message\n");
681 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
684 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
688 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
689 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
690 if(e2apMsg->choice.initiatingMessage == NULLP)
692 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
693 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
696 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
697 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
698 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
700 DU_ALLOC(ricIndicationMsg, sizeof(RICindication_t));
701 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
705 ricIndicationMsg->protocolIEs.list.count = elementCnt;
706 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
708 /* Initialize the Ric Indication members */
709 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
710 ricIndicationMsg->protocolIEs.list.size);
711 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
713 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
714 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
715 DU_FREE(e2apMsg, (Size)sizeof(E2AP_PDU_t));
719 for(idx=0; idx<elementCnt; idx++)
721 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
722 sizeof(RICindication_IEs_t));
723 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
725 for(ieId=0; ieId<idx; ieId++)
727 DU_FREE(ricIndicationMsg->protocolIEs.list.array[ieId],\
728 sizeof(RICindication_IEs_t));
730 DU_FREE(ricIndicationMsg->protocolIEs.list.array,\
731 ricIndicationMsg->protocolIEs.list.size);
732 DU_FREE(e2apMsg->choice.initiatingMessage, \
733 sizeof(InitiatingMessageE2_t));
734 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
739 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
740 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
741 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
742 RICindication_IEs__value_PR_RICrequestID;
743 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = e2apMsgDb.ricReqId;
744 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = e2apMsgDb.ricInstanceId;
747 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
748 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
749 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
750 RICindication_IEs__value_PR_RANfunctionID;
751 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID = e2apMsgDb.ranFuncId;
754 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
755 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
756 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
757 RICindication_IEs__value_PR_RICactionID;
758 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID = e2apMsgDb.ricActionId;
762 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
763 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
764 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
765 RICindication_IEs__value_PR_RICindicationType;
767 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType = e2apMsgDb.ricActionType;
771 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
772 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
773 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
774 RICindication_IEs__value_PR_RICindicationHeader;
775 BuildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
776 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader);
778 /* TO BE CHANGED: RIC INDICATION DATA */
779 /* Foe now filling a dummy octect data, need to tested with PRBs*/
781 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
782 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
783 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
784 RICindication_IEs__value_PR_RICindicationMessage;
785 BuildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
786 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage);
788 /* Prints the Msg formed */
789 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
791 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
793 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
795 if(encRetVal.encoded == ENCODE_FAIL)
797 DU_LOG("\nE2AP : Could not encode RIC Indication Message (at %s)\n",\
798 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
803 DU_LOG("\nE2AP : Created APER encoded buffer for RIC Indication Message \n");
804 for(int i=0; i< encBufSize; i++)
806 printf("%x",encBuf[i]);
810 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
812 DU_LOG("\nE2AP : Sending RIC Indication Message");
818 /*******************************************************************
820 * @brief Sends E2 msg over SCTP
824 * Function : SendE2APMsg
826 * Functionality: Sends E2 msg over SCTP
828 * @params[in] Region region
830 * @return ROK - success
833 * ****************************************************************/
835 S16 SendE2APMsg(Region region, Pool pool)
839 if(SGetMsg(region, pool, &mBuf) == ROK)
841 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
845 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
847 DU_LOG("\nE2AP : SCTP Send for E2 failed");
854 DU_LOG("\nE2AP : SAddPstMsgMult failed");
862 DU_LOG("\nE2AP : Failed to allocate memory");
869 /*******************************************************************
871 * @brief Handles received E2AP message and sends back response
875 * Function : E2APMsgHdlr
878 * - Decodes received E2AP control message
879 * - Prepares response message, encodes and sends to SCTP
882 * @return ROK - success
885 * ****************************************************************/
886 void E2APMsgHdlr(Buffer *mBuf)
893 asn_dec_rval_t rval; /* Decoder return value */
894 E2AP_PDU_t e2apasnmsg ;
896 DU_LOG("\nE2AP : Received E2AP message buffer");
899 /* Copy mBuf into char array to decode it */
900 SFndLenMsg(mBuf, &recvBufLen);
901 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
903 DU_LOG("\nE2AP : Memory allocation failed");
906 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
908 DU_LOG("\nE2AP : Failed while copying %d", copyCnt);
912 printf("\nE2AP : Received flat buffer to be decoded : ");
913 for(i=0; i< recvBufLen; i++)
915 printf("%x",recvBuf[i]);
918 /* Decoding flat buffer into E2AP messsage */
919 e2apMsg = &e2apasnmsg;
920 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
922 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
923 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
924 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
926 DU_LOG("\nE2AP : ASN decode failed");
930 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
932 switch(e2apMsg->present)
934 case E2AP_PDU_PR_successfulOutcome:
936 switch(e2apMsg->choice.successfulOutcome->value.present)
938 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
942 DU_LOG("\nE2AP : Store E2 setup response Params");
943 procE2SetupRsp(e2apMsg);
949 DU_LOG("\nE2AP : Invalid type of intiating message [%d]", e2apMsg->choice.initiatingMessage->value.present);
952 }/* End of switch(successfulOutcome) */
955 case E2AP_PDU_PR_initiatingMessage:
957 switch(e2apMsg->choice.initiatingMessage->value.present)
959 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
961 DU_LOG("\nE2AP : Calling RIC Subscription Response");
962 if(procRicSubsReq(e2apMsg) == ROK)
964 BuildAndSendRicIndication();
970 DU_LOG("\nE2AP : Invalid type of successfulOutcome message [%d]", e2apMsg->choice.successfulOutcome->value.present);
973 }/* End of switch(initiatingMessage) */
978 DU_LOG("\nE2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
982 }/* End of switch(e2apMsg->present) */
984 } /* End of E2APMsgHdlr */
986 /**********************************************************************
988 **********************************************************************/