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"
21 #include "GlobalE2node-gNB-ID.h"
23 #define ENC_BUF_MAX_LEN 100
26 DuCfgParams duCfgParam;
27 char encBuf[ENC_BUF_MAX_LEN];
30 /*******************************************************************
32 * @brief Writes the encoded chunks into a buffer
36 * Function : PrepFinalEncBuf
38 * Functionality:Fills the encoded buffer
40 * @params[in] void *buffer,initial encoded data
41 * @params[in] size_t size,size of buffer
42 * @params[in] void *encodedBuf,final buffer
43 * @return ROK - success
46 * ****************************************************************/
47 static int PrepFinalEncBuf(const void *buffer, size_t size, void *encodedBuf)
49 memcpy(encodedBuf + encBufSize, buffer, size);
52 } /* PrepFinalEncBuf */
54 /*******************************************************************
56 * @brief Builds PLMN ID
60 * Function : BuildPlmnId
62 * Functionality: Building the PLMN ID
64 * @params[in] PLMNID plmn
65 * OCTET_STRING_t *plmnid
66 * @return ROK - success
69 * ****************************************************************/
71 S16 BuildPlmnId(PlmnId plmn, OCTET_STRING_t *plmnid)
75 DU_ALLOC(plmnid->buf, plmnid->size * sizeof(U8));
76 if(plmnid->buf == NULLP)
81 plmnid->buf[0] = ((plmn.mcc[1] << 4) | (plmn.mcc[0]));
84 plmnid->buf[1] = ((0xf0) | (plmn.mcc[2]));
85 plmnid->buf[2] = ((plmn.mnc[1] << 4) | (plmn.mnc[0]));
89 plmnid->buf[1] = ((plmn.mnc[0] << 4) | (plmn.mcc[2]));
90 plmnid->buf[2] = ((plmn.mnc[2] << 4) | (plmn.mnc[1]));
95 /*******************************************************************
97 * @brief Builds NodeB Id
101 * Function : BuildNodeBId
103 * Functionality: Building the NodeBId
105 * @params[in] BIT_STRING_t *nbid,
110 * @return ROK - success
113 * ****************************************************************/
115 S16 BuildNodeBId(BIT_STRING_t *nbid, U8 unusedBits, U8 byteSize, U8 val)
118 nbid->size = byteSize;
119 DU_ALLOC(nbid->buf, nbid->size * sizeof(U8));
120 if(nbid->buf == NULLP)
125 for (tmp = 0 ; tmp < ((nbid->size)-1); tmp++)
129 nbid->buf[byteSize-1] = val;
130 nbid->bits_unused = unusedBits;
134 /*******************************************************************
136 * @brief Builds Global gNodeB Params
140 * Function : BuildGlobalgNB
142 * Functionality: Building the Plmn and gNB id
144 * @params[in] GlobalE2node_gNB_ID_t *gNbId
145 * @return ROK - success
148 * ****************************************************************/
150 S16 BuildGlobalgNB(GlobalE2node_gNB_ID_t *gNbId)
157 BuildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
158 &gNbId->global_gNB_ID.plmn_id);
160 gNbId->global_gNB_ID.gnb_id.present = GNB_ID_Choice_PR_gnb_ID;
161 BuildNodeBId(&gNbId->global_gNB_ID.gnb_id.choice.gnb_ID, unused, byteSize, val);
166 /*******************************************************************
168 * @brief Builds and Send the E2SetupRequest
172 * Function : BuildAndSendE2SetupReq
174 * Functionality:Fills the E2SetupRequest
176 * @return ROK - success
179 ******************************************************************/
181 S16 BuildAndSendE2SetupReq()
183 E2AP_PDU_t *e2apMsg = NULLP;
184 E2setupRequest_t *e2SetupReq;
189 asn_enc_rval_t encRetVal; /* Encoder return value */
191 DU_LOG("\nE2AP : Building E2 Setup Request\n");
193 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
196 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
200 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
201 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
202 if(e2apMsg->choice.initiatingMessage == NULLP)
204 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
205 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
208 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
209 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_E2setup;
210 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_E2setupRequest;
212 DU_ALLOC(e2SetupReq, sizeof(E2setupRequest_t));
213 e2SetupReq = &e2apMsg->choice.initiatingMessage->value.choice.E2setupRequest;
217 e2SetupReq->protocolIEs.list.count = elementCnt;
218 e2SetupReq->protocolIEs.list.size = elementCnt * sizeof(E2setupRequestIEs_t);
220 /* Initialize the E2Setup members */
221 DU_ALLOC(e2SetupReq->protocolIEs.list.array, \
222 e2SetupReq->protocolIEs.list.size);
223 if(e2SetupReq->protocolIEs.list.array == NULLP)
225 DU_LOG("\nE2AP : Memory allocation for E2RequestIEs failed");
226 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
227 DU_FREE(e2apMsg, (Size)sizeof(E2AP_PDU_t));
231 for(idx=0; idx<elementCnt; idx++)
233 DU_ALLOC(e2SetupReq->protocolIEs.list.array[idx],\
234 sizeof(E2setupRequestIEs_t));
235 if(e2SetupReq->protocolIEs.list.array[idx] == NULLP)
237 for(ieId=0; ieId<idx; ieId++)
239 DU_FREE(e2SetupReq->protocolIEs.list.array[ieId],\
240 sizeof(E2setupRequestIEs_t));
242 DU_FREE(e2SetupReq->protocolIEs.list.array,\
243 e2SetupReq->protocolIEs.list.size);
244 DU_FREE(e2apMsg->choice.initiatingMessage, \
245 sizeof(InitiatingMessageE2_t));
246 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
252 /* GlobalE2node_gNB_ID */
253 e2SetupReq->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_GlobalE2node_ID;
254 e2SetupReq->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
255 e2SetupReq->protocolIEs.list.array[idx]->value.present =\
256 E2setupRequestIEs__value_PR_GlobalE2node_ID;
257 e2SetupReq->protocolIEs.list.array[idx]->value.choice.GlobalE2node_ID.present = \
258 GlobalE2node_ID_PR_gNB;
260 GlobalE2node_gNB_ID_t *gNbId;
261 DU_ALLOC(gNbId, sizeof(GlobalE2node_gNB_ID_t));
262 BuildGlobalgNB(gNbId);
263 e2SetupReq->protocolIEs.list.array[idx]->value.choice.GlobalE2node_ID.choice.gNB = gNbId;
265 /* Prints the Msg formed */
266 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
269 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
271 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
273 if(encRetVal.encoded == ENCODE_FAIL)
275 DU_LOG("\nE2AP : Could not encode E2SetupRequest structure (at %s)\n",\
276 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
281 DU_LOG("\nE2AP : Created APER encoded buffer for E2SetupRequest\n");
282 for(int i=0; i< encBufSize; i++)
284 printf("%x",encBuf[i]);
288 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
290 DU_LOG("\nE2AP : Sending E2 Setup request failed");
295 }/* End of BuildAndSendE2SetupReq */
297 /*******************************************************************
299 * @brief Builds Ric Request Id
303 * Function : BuildRicRequestId
305 * Functionality: Building the Ric Request Id
307 * @params[in] RICrequestID_t *ricReqId
308 * @return ROK - success
311 * ****************************************************************/
313 S16 BuildRicRequestId(RICrequestID_t *ricReqId)
315 if(ricReqId != NULLP)
317 ricReqId->ricRequestorID = 1;
318 ricReqId->ricInstanceID = 1;
323 /*******************************************************************
325 * @brief Fills the mandatory RicAdmitted List Items
329 * Function : fillRicAdmitList
331 * Functionality: Fills the mandatory Ric Admitted List Items
333 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
334 * @return ROK - success
337 * ****************************************************************/
339 S16 fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
342 if(ricAdmitItems != NULLP)
344 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
345 ricAdmitItems->criticality = CriticalityE2_reject;
346 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
347 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
351 /*******************************************************************
353 * @brief Builds the mandatory RicAdmitted List Params
357 * Function : fillRicAdmitList
359 * Functionality: Builds the mandatory Ric Admitted List Params
361 * @params[in] RICaction_Admitted_List_t *admitListPtr
362 * @return ROK - success
365 * ****************************************************************/
367 S16 BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
372 admitListPtr->list.count = elementCnt;
373 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
374 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
375 if(admitListPtr->list.array == NULLP)
377 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
380 DU_ALLOC(admitListPtr->list.array[0], sizeof(RICaction_Admitted_ItemIEs_t));
381 fillRicAdmitList(admitListPtr->list.array[0]);
386 /*******************************************************************
388 * @brief Builds and Send the RicSubscriptionRsp
392 * Function : BuildAndSendRicSubscriptionRsp
394 * Functionality:Fills the RicSubscriptionRsp
396 * @return ROK - success
399 ******************************************************************/
401 S16 BuildAndSendRicSubscriptionRsp()
404 E2AP_PDU_t *e2apRicMsg = NULLP;
405 RICsubscriptionResponse_t *ricSubscriptionRsp;
406 asn_enc_rval_t encRetVal;
411 DU_LOG("\nE2AP : Building RIC Subscription Response\n");
413 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
414 if(e2apRicMsg == NULLP)
416 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
419 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
420 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
421 if(e2apRicMsg->choice.successfulOutcome == NULLP)
423 DU_LOG("\nE2AP : Memory allocation for Ric subscription Response failed");
424 DU_FREE(e2apRicMsg, sizeof(RICsubscriptionResponse_t));
428 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
429 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
430 e2apRicMsg->choice.successfulOutcome->value.present = \
431 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
432 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
435 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
436 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
438 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
439 ricSubscriptionRsp->protocolIEs.list.size);
440 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
442 DU_LOG("\nE2AP : Memory allocation for RICsubscriptionResponseIE failed");
443 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
444 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
448 for(idx=0; idx<elementCnt; idx++)
450 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
451 sizeof(RICsubscriptionResponse_IEs_t));
452 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
454 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array,\
455 ricSubscriptionRsp->protocolIEs.list.size);
456 DU_FREE(e2apRicMsg->choice.successfulOutcome, \
457 sizeof(SuccessfulOutcomeE2_t));
458 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
463 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
464 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
465 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
466 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
467 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
470 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
471 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
472 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
473 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
474 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
477 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
478 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
479 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
480 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
481 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
484 /* Prints the Msg formed */
485 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
487 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
489 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
491 if(encRetVal.encoded == ENCODE_FAIL)
493 DU_LOG("\nE2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
494 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
499 DU_LOG("\nE2AP : Created APER encoded buffer for RIC subscription response \n");
500 for(int i=0; i< encBufSize; i++)
502 printf("%x",encBuf[i]);
506 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
508 DU_LOG("\nE2AP : Sending RIC Subscription Response failed");
514 /******************************************************************
516 * @brief Processes E2 Setup Response sent by RIC
520 * Function : procE2SetupRsp
522 * Functionality: Processes E2 Setup Response sent by RIC
524 * @params[in] E2AP_PDU_t ASN decoded E2AP message
525 * @return ROK - success
528 * ****************************************************************/
529 S16 procE2SetupRsp(E2AP_PDU_t *e2apMsg)
531 E2setupResponse_t *e2SetRspMsg;
532 E2apMsgDb e2SetupRspDb;
535 DU_LOG("\nE2AP : E2 Setup Response received");
536 duCb.e2Status = TRUE; //Set E2 status as true
537 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
539 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
541 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
543 case ProtocolIE_IDE2_id_GlobalRIC_ID:
545 /* To store the Ric Id Params */
547 memset(&e2SetupRspDb.plmn, 0, sizeof(PLMN_IdentityE2_t));
549 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity);
551 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2SetupRspDb.ricId);
553 aper_decode(0, &asn_DEF_PLMN_IdentityE2, (void **)&e2SetupRspDb.plmn, &e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity, recvBufLen, 0, 0);
554 //xer_fprint(stdout, &asn_DEF_PLMN_IdentityE2, &e2SetupRspDb.plmn);
559 DU_LOG("\nE2AP : Invalid IE received in E2SetupRsp:%ld",
560 e2SetRspMsg->protocolIEs.list.array[idx]->id);
567 /******************************************************************
569 * @brief Processes RIC Subscription Req sent by RIC
573 * Function : procRicSubsReq
575 * Functionality: Processes E2 Setup Response sent by CU
577 * @params[in] E2AP_PDU_t ASN decoded E2AP message
578 * @return ROK - success
581 * ****************************************************************/
583 S16 procRicSubsReq(E2AP_PDU_t *e2apMsg)
588 RICsubscriptionRequest_t *ricSubsReq;
589 RICaction_ToBeSetup_ItemIEs_t *actionItem;
592 DU_LOG("\nE2AP : Ric Subscription request received");
593 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
595 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
597 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
599 case ProtocolIE_IDE2_id_RICrequestID:
601 ricReqDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID;
602 ricReqDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID;
605 case ProtocolIE_IDE2_id_RANfunctionID:
607 ricReqDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]->value.choice.RANfunctionID;
610 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
613 memset(&ricReqDb.ricEventTrigger, 0, sizeof(RICeventTriggerDefinition_t));
615 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition);
617 aper_decode(0, &asn_DEF_RICeventTriggerDefinition, (void **)&ricReqDb.ricEventTrigger, &(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition), recvBufLen, 0, 0);
618 //xer_fprint(stdout, &asn_DEF_RICeventTriggerDefinition, &ricReqDb.ricEventTrigger);
620 actionItem = *ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list.array;
622 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
623 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
625 switch(actionItem->id)
627 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
629 ricReqDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
630 ricReqDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
634 DU_LOG("\nE2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
643 DU_LOG("\nE2AP : Invalid IE received in Ric SubsReq:%ld",
644 ricSubsReq->protocolIEs.list.array[idx]->id);
648 ret = BuildAndSendRicSubscriptionRsp();
654 /*******************************************************************
656 * @brief Builds and Send the RicIndication Message
660 * Function : BuildAndSendRicIndication
662 * Functionality:Fills the RicIndication Message
664 * @return ROK - success
667 ******************************************************************/
669 S16 BuildAndSendRicIndication()
671 E2AP_PDU_t *e2apMsg = NULLP;
672 RICindication_t *ricIndicationMsg;
678 asn_enc_rval_t encRetVal; /* Encoder return value */
680 DU_LOG("\nE2AP : Building Ric Indication Message\n");
682 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
685 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
689 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
690 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
691 if(e2apMsg->choice.initiatingMessage == NULLP)
693 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
694 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
697 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
698 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
699 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
701 DU_ALLOC(ricIndicationMsg, sizeof(RICindication_t));
702 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
706 ricIndicationMsg->protocolIEs.list.count = elementCnt;
707 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
709 /* Initialize the Ric Indication members */
710 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
711 ricIndicationMsg->protocolIEs.list.size);
712 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
714 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
715 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
716 DU_FREE(e2apMsg, (Size)sizeof(E2AP_PDU_t));
720 for(idx=0; idx<elementCnt; idx++)
722 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
723 sizeof(RICindication_IEs_t));
724 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
726 for(ieId=0; ieId<idx; ieId++)
728 DU_FREE(ricIndicationMsg->protocolIEs.list.array[ieId],\
729 sizeof(RICindication_IEs_t));
731 DU_FREE(ricIndicationMsg->protocolIEs.list.array,\
732 ricIndicationMsg->protocolIEs.list.size);
733 DU_FREE(e2apMsg->choice.initiatingMessage, \
734 sizeof(InitiatingMessageE2_t));
735 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
740 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
741 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
742 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
743 RICindication_IEs__value_PR_RICrequestID;
744 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = e2apMsgDb.ricReqId;
745 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = e2apMsgDb.ricInstanceId;
748 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
749 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
750 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
751 RICindication_IEs__value_PR_RANfunctionID;
752 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID = e2apMsgDb.ranFuncId;
755 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
756 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
757 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
758 RICindication_IEs__value_PR_RICactionID;
759 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID = e2apMsgDb.ricActionId;
763 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
764 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
765 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
766 RICindication_IEs__value_PR_RICindicationType;
768 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType = e2apMsgDb.ricActionType;
772 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
773 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
774 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
775 RICindication_IEs__value_PR_RICindicationHeader;
776 BuildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
777 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader);
779 /* TO BE CHANGED: RIC INDICATION DATA */
780 /* Foe now filling a dummy octect data, need to tested with PRBs*/
782 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
783 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
784 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
785 RICindication_IEs__value_PR_RICindicationMessage;
786 BuildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
787 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage);
789 /* Prints the Msg formed */
790 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
792 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
794 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
796 if(encRetVal.encoded == ENCODE_FAIL)
798 DU_LOG("\nE2AP : Could not encode RIC Indication Message (at %s)\n",\
799 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
804 DU_LOG("\nE2AP : Created APER encoded buffer for RIC Indication Message \n");
805 for(int i=0; i< encBufSize; i++)
807 printf("%x",encBuf[i]);
811 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
813 DU_LOG("\nE2AP : Sending RIC Indication Message");
819 /*******************************************************************
821 * @brief Sends E2 msg over SCTP
825 * Function : SendE2APMsg
827 * Functionality: Sends E2 msg over SCTP
829 * @params[in] Region region
831 * @return ROK - success
834 * ****************************************************************/
836 S16 SendE2APMsg(Region region, Pool pool)
840 if(SGetMsg(region, pool, &mBuf) == ROK)
842 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
846 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
848 DU_LOG("\nE2AP : SCTP Send for E2 failed");
855 DU_LOG("\nE2AP : SAddPstMsgMult failed");
863 DU_LOG("\nE2AP : Failed to allocate memory");
870 /*******************************************************************
872 * @brief Handles received E2AP message and sends back response
876 * Function : E2APMsgHdlr
879 * - Decodes received E2AP control message
880 * - Prepares response message, encodes and sends to SCTP
883 * @return ROK - success
886 * ****************************************************************/
887 void E2APMsgHdlr(Buffer *mBuf)
894 asn_dec_rval_t rval; /* Decoder return value */
895 E2AP_PDU_t e2apasnmsg ;
897 DU_LOG("\nE2AP : Received E2AP message buffer");
900 /* Copy mBuf into char array to decode it */
901 SFndLenMsg(mBuf, &recvBufLen);
902 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
904 DU_LOG("\nE2AP : Memory allocation failed");
907 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
909 DU_LOG("\nE2AP : Failed while copying %d", copyCnt);
913 printf("\nE2AP : Received flat buffer to be decoded : ");
914 for(i=0; i< recvBufLen; i++)
916 printf("%x",recvBuf[i]);
919 /* Decoding flat buffer into E2AP messsage */
920 e2apMsg = &e2apasnmsg;
921 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
923 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
924 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
925 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
927 DU_LOG("\nE2AP : ASN decode failed");
931 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
933 switch(e2apMsg->present)
935 case E2AP_PDU_PR_successfulOutcome:
937 switch(e2apMsg->choice.successfulOutcome->value.present)
939 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
943 DU_LOG("\nE2AP : Store E2 setup response Params");
944 procE2SetupRsp(e2apMsg);
950 DU_LOG("\nE2AP : Invalid type of intiating message [%d]", e2apMsg->choice.initiatingMessage->value.present);
953 }/* End of switch(successfulOutcome) */
956 case E2AP_PDU_PR_initiatingMessage:
958 switch(e2apMsg->choice.initiatingMessage->value.present)
960 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
962 DU_LOG("\nE2AP : Calling RIC Subscription Response");
963 if(procRicSubsReq(e2apMsg) == ROK)
965 BuildAndSendRicIndication();
971 DU_LOG("\nE2AP : Invalid type of successfulOutcome message [%d]", e2apMsg->choice.successfulOutcome->value.present);
974 }/* End of switch(initiatingMessage) */
979 DU_LOG("\nE2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
983 }/* End of switch(e2apMsg->present) */
985 } /* End of E2APMsgHdlr */
987 /**********************************************************************
989 **********************************************************************/