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 BuildGlobalgNBId(GlobalE2node_gNB_ID_t *gNbId)
48 /* Allocate Buffer size */
49 gNbId->global_gNB_ID.plmn_id.size = 3 * sizeof(U8);
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(U8);
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 uint16_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 S16 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((U8 *)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 uint16_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 S16 BuildRicRequestId(RICrequestID_t *ricReqId)
350 if(ricReqId != NULLP)
352 ricReqId->ricRequestorID = 1;
353 ricReqId->ricInstanceID = 1;
358 /*******************************************************************
360 * @brief Fills the mandatory RicAdmitted List Items
364 * Function : fillRicAdmitList
366 * Functionality: Fills the mandatory Ric Admitted List Items
368 * @params[in] RICaction_Admitted_ItemIEs_t *ricAdmitItems
369 * @return ROK - success
372 * ****************************************************************/
374 S16 fillRicAdmitList(RICaction_Admitted_ItemIEs_t *ricAdmitItems)
377 if(ricAdmitItems != NULLP)
379 ricAdmitItems->id = ProtocolIE_IDE2_id_RICaction_Admitted_Item;
380 ricAdmitItems->criticality = CriticalityE2_reject;
381 ricAdmitItems->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
382 ricAdmitItems->value.choice.RICaction_Admitted_Item.ricActionID = 1;
386 /*******************************************************************
388 * @brief Builds the mandatory RicAdmitted List Params
392 * Function : fillRicAdmitList
394 * Functionality: Builds the mandatory Ric Admitted List Params
396 * @params[in] RICaction_Admitted_List_t *admitListPtr
397 * @return ROK - success
400 * ****************************************************************/
402 S16 BuildRicAdmitList(RICaction_Admitted_List_t *admitListPtr)
407 admitListPtr->list.count = elementCnt;
408 admitListPtr->list.size = elementCnt * sizeof(RICaction_Admitted_ItemIEs_t);
409 DU_ALLOC(admitListPtr->list.array, admitListPtr->list.size);
410 if(admitListPtr->list.array == NULLP)
412 DU_LOG("\nE2AP : Memory allocation for RIC Admit List failed");
415 DU_ALLOC(admitListPtr->list.array[0], sizeof(RICaction_Admitted_ItemIEs_t));
416 fillRicAdmitList((RICaction_Admitted_ItemIEs_t *)admitListPtr->list.array[0]);
421 /*******************************************************************
423 * @brief Builds and Send the RicSubscriptionRsp
427 * Function : BuildAndSendRicSubscriptionRsp
429 * Functionality:Fills the RicSubscriptionRsp
431 * @return ROK - success
434 ******************************************************************/
436 S16 BuildAndSendRicSubscriptionRsp()
439 E2AP_PDU_t *e2apRicMsg = NULLP;
440 RICsubscriptionResponse_t *ricSubscriptionRsp;
441 asn_enc_rval_t encRetVal;
446 DU_LOG("\nE2AP : Building RIC Subscription Response\n");
448 DU_ALLOC(e2apRicMsg, sizeof(E2AP_PDU_t));
449 if(e2apRicMsg == NULLP)
451 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
454 e2apRicMsg->present = E2AP_PDU_PR_successfulOutcome;
455 DU_ALLOC(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
456 if(e2apRicMsg->choice.successfulOutcome == NULLP)
458 DU_LOG("\nE2AP : Memory allocation for Ric subscription Response failed");
459 DU_FREE(e2apRicMsg, sizeof(RICsubscriptionResponse_t));
463 e2apRicMsg->choice.successfulOutcome->procedureCode = ProcedureCodeE2_id_RICsubscription;
464 e2apRicMsg->choice.successfulOutcome->criticality = CriticalityE2_reject;
465 e2apRicMsg->choice.successfulOutcome->value.present = \
466 SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse;
467 ricSubscriptionRsp = &e2apRicMsg->choice.successfulOutcome->value.choice.RICsubscriptionResponse;
470 ricSubscriptionRsp->protocolIEs.list.count = elementCnt;
471 ricSubscriptionRsp->protocolIEs.list.size = elementCnt * sizeof(RICsubscriptionResponse_IEs_t);
473 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array, \
474 ricSubscriptionRsp->protocolIEs.list.size);
475 if(ricSubscriptionRsp->protocolIEs.list.array == NULLP)
477 DU_LOG("\nE2AP : Memory allocation for RICsubscriptionResponseIE failed");
478 DU_FREE(e2apRicMsg->choice.successfulOutcome, sizeof(SuccessfulOutcomeE2_t));
479 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
483 for(idx=0; idx<elementCnt; idx++)
485 DU_ALLOC(ricSubscriptionRsp->protocolIEs.list.array[idx], \
486 sizeof(RICsubscriptionResponse_IEs_t));
487 if(ricSubscriptionRsp->protocolIEs.list.array[idx] == NULLP)
489 DU_FREE(ricSubscriptionRsp->protocolIEs.list.array,\
490 ricSubscriptionRsp->protocolIEs.list.size);
491 DU_FREE(e2apRicMsg->choice.successfulOutcome, \
492 sizeof(SuccessfulOutcomeE2_t));
493 DU_FREE(e2apRicMsg, sizeof(E2AP_PDU_t));
498 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
499 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
500 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
501 RICsubscriptionRequest_IEs__value_PR_RICrequestID;
502 BuildRicRequestId(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICrequestID);
505 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
506 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
507 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
508 RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
509 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RANfunctionID = 1;
512 ricSubscriptionRsp->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactions_Admitted;
513 ricSubscriptionRsp->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
514 ricSubscriptionRsp->protocolIEs.list.array[idx]->value.present =\
515 RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
516 BuildRicAdmitList(&ricSubscriptionRsp->protocolIEs.list.array[idx]->value.choice.RICaction_Admitted_List);
519 /* Prints the Msg formed */
520 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apRicMsg);
522 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
524 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apRicMsg, PrepFinalEncBuf,\
526 if(encRetVal.encoded == ENCODE_FAIL)
528 DU_LOG("\nE2AP : Could not encode RIC Subscription Response structure (at %s)\n",\
529 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
534 DU_LOG("\nE2AP : Created APER encoded buffer for RIC subscription response \n");
535 for(int i=0; i< encBufSize; i++)
537 printf("%x",encBuf[i]);
541 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
543 DU_LOG("\nE2AP : Sending RIC Subscription Response failed");
549 /******************************************************************
551 * @brief Processes E2 Setup Response sent by RIC
555 * Function : procE2SetupRsp
557 * Functionality: Processes E2 Setup Response sent by RIC
559 * @params[in] E2AP_PDU_t ASN decoded E2AP message
560 * @return ROK - success
563 * ****************************************************************/
564 S16 procE2SetupRsp(E2AP_PDU_t *e2apMsg)
566 E2setupResponse_t *e2SetRspMsg;
567 E2apMsgDb e2SetupRspDb;
570 DU_LOG("\nE2AP : E2 Setup Response received");
571 duCb.e2Status = TRUE; //Set E2 status as true
572 e2SetRspMsg = &e2apMsg->choice.successfulOutcome->value.choice.E2setupResponse;
574 for(idx=0; idx<e2SetRspMsg->protocolIEs.list.count; idx++)
576 switch(e2SetRspMsg->protocolIEs.list.array[idx]->id)
578 case ProtocolIE_IDE2_id_GlobalRIC_ID:
580 /* To store the Ric Id Params */
582 memset(&e2SetupRspDb.plmn, 0, sizeof(PLMN_IdentityE2_t));
584 recvBufLen = sizeof(e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity);
586 bitStringToInt(&e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.ric_ID, &e2SetupRspDb.ricId);
587 aper_decode(0, &asn_DEF_PLMN_IdentityE2, (void **)&e2SetupRspDb.plmn, \
588 &e2SetRspMsg->protocolIEs.list.array[idx]->value.choice.GlobalRIC_ID.pLMN_Identity, recvBufLen, 0, 0);
590 xer_fprint(stdout, &asn_DEF_PLMN_IdentityE2, &e2SetupRspDb.plmn);
594 DU_LOG("\nE2AP : Invalid IE received in E2SetupRsp:%ld",
595 e2SetRspMsg->protocolIEs.list.array[idx]->id);
602 /******************************************************************
604 * @brief Processes RIC Subscription Req sent by RIC
608 * Function : procRicSubsReq
610 * Functionality: Processes E2 Setup Response sent by CU
612 * @params[in] E2AP_PDU_t ASN decoded E2AP message
613 * @return ROK - success
616 * ****************************************************************/
618 S16 procRicSubsReq(E2AP_PDU_t *e2apMsg)
623 RICsubscriptionRequest_t *ricSubsReq;
624 RICaction_ToBeSetup_ItemIEs_t *actionItem;
627 DU_LOG("\nE2AP : Ric Subscription request received");
628 ricSubsReq = &e2apMsg->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
630 for(idx=0; idx<ricSubsReq->protocolIEs.list.count; idx++)
632 switch(ricSubsReq->protocolIEs.list.array[idx]->id)
634 case ProtocolIE_IDE2_id_RICrequestID:
636 ricReqDb.ricReqId = ricSubsReq->protocolIEs.list.array[idx]->\
637 value.choice.RICrequestID.ricRequestorID;
638 ricReqDb.ricInstanceId = ricSubsReq->protocolIEs.list.array[idx]-> \
639 value.choice.RICrequestID.ricInstanceID;
642 case ProtocolIE_IDE2_id_RANfunctionID:
644 ricReqDb.ranFuncId = ricSubsReq->protocolIEs.list.array[idx]-> \
645 value.choice.RANfunctionID;
648 case ProtocolIE_IDE2_id_RICsubscriptionDetails:
651 memset(&ricReqDb.ricEventTrigger, 0, sizeof(RICeventTriggerDefinition_t));
653 recvBufLen = sizeof(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition);
655 aper_decode(0, &asn_DEF_RICeventTriggerDefinition, (void **)&ricReqDb.ricEventTrigger, &(ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition), recvBufLen, 0, 0);
656 xer_fprint(stdout, &asn_DEF_RICeventTriggerDefinition, &ricReqDb.ricEventTrigger);
658 actionItem =(RICaction_ToBeSetup_ItemIEs_t *) ricSubsReq->protocolIEs.list.array[idx]->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list.array[0];
660 for(ied = 0; ied < ricSubsReq->protocolIEs.list.array[idx]->value.choice.\
661 RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count; ied++)
663 switch(actionItem->id)
665 case ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item:
667 ricReqDb.ricActionId = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionID;
668 ricReqDb.ricActionType = actionItem->value.choice.RICaction_ToBeSetup_Item.ricActionType;
672 DU_LOG("\nE2AP : Invalid IE received in RicSetupLst:%ld",actionItem->id);
681 DU_LOG("\nE2AP : Invalid IE received in Ric SubsReq:%ld",
682 ricSubsReq->protocolIEs.list.array[idx]->id);
686 ret = BuildAndSendRicSubscriptionRsp();
692 /*******************************************************************
694 * @brief Builds and Send the RicIndication Message
698 * Function : BuildAndSendRicIndication
700 * Functionality:Fills the RicIndication Message
702 * @return ROK - success
705 ******************************************************************/
707 S16 BuildAndSendRicIndication()
709 E2AP_PDU_t *e2apMsg = NULLP;
710 RICindication_t *ricIndicationMsg;
715 asn_enc_rval_t encRetVal; /* Encoder return value */
717 DU_LOG("\nE2AP : Building Ric Indication Message\n");
719 DU_ALLOC(e2apMsg, sizeof(E2AP_PDU_t));
722 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
726 e2apMsg->present = E2AP_PDU_PR_initiatingMessage;
727 DU_ALLOC(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
728 if(e2apMsg->choice.initiatingMessage == NULLP)
730 DU_LOG("\nE2AP : Memory allocation for E2AP-PDU failed");
731 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
734 e2apMsg->choice.initiatingMessage->procedureCode = ProcedureCodeE2_id_RICindication;
735 e2apMsg->choice.initiatingMessage->criticality = CriticalityE2_reject;
736 e2apMsg->choice.initiatingMessage->value.present = InitiatingMessageE2__value_PR_RICindication;
738 DU_ALLOC(ricIndicationMsg, sizeof(RICindication_t));
739 ricIndicationMsg = &e2apMsg->choice.initiatingMessage->value.choice.RICindication;
743 ricIndicationMsg->protocolIEs.list.count = elementCnt;
744 ricIndicationMsg->protocolIEs.list.size = elementCnt * sizeof(RICindication_t);
746 /* Initialize the Ric Indication members */
747 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array, \
748 ricIndicationMsg->protocolIEs.list.size);
749 if(ricIndicationMsg->protocolIEs.list.array == NULLP)
751 DU_LOG("\nE2AP : Memory allocation for RICindicationIEs failed");
752 DU_FREE(e2apMsg->choice.initiatingMessage, sizeof(InitiatingMessageE2_t));
753 DU_FREE(e2apMsg, (Size)sizeof(E2AP_PDU_t));
757 for(idx=0; idx<elementCnt; idx++)
759 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx],\
760 sizeof(RICindication_IEs_t));
761 if(ricIndicationMsg->protocolIEs.list.array[idx] == NULLP)
763 for(ieId=0; ieId<idx; ieId++)
765 DU_FREE(ricIndicationMsg->protocolIEs.list.array[ieId],\
766 sizeof(RICindication_IEs_t));
768 DU_FREE(ricIndicationMsg->protocolIEs.list.array,\
769 ricIndicationMsg->protocolIEs.list.size);
770 DU_FREE(e2apMsg->choice.initiatingMessage, \
771 sizeof(InitiatingMessageE2_t));
772 DU_FREE(e2apMsg, sizeof(E2AP_PDU_t));
777 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICrequestID;
778 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
779 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
780 RICindication_IEs__value_PR_RICrequestID;
781 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricRequestorID = e2apMsgDb.ricReqId;
782 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICrequestID.ricInstanceID = e2apMsgDb.ricInstanceId;
785 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RANfunctionID;
786 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
787 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
788 RICindication_IEs__value_PR_RANfunctionID;
789 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RANfunctionID = e2apMsgDb.ranFuncId;
792 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICactionID;
793 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
794 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
795 RICindication_IEs__value_PR_RICactionID;
796 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICactionID = e2apMsgDb.ricActionId;
800 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationType;
801 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
802 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
803 RICindication_IEs__value_PR_RICindicationType;
805 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationType = e2apMsgDb.ricActionType;
809 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationHeader;
810 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
811 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
812 RICindication_IEs__value_PR_RICindicationHeader;
813 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size = 3 * sizeof(U8);
814 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.buf ,\
815 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader.size);
816 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
817 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationHeader);
819 /* TO BE CHANGED: RIC INDICATION DATA */
820 /* For now filling a dummy octect data, need to tested with PRBs*/
822 ricIndicationMsg->protocolIEs.list.array[idx]->id = ProtocolIE_IDE2_id_RICindicationMessage;
823 ricIndicationMsg->protocolIEs.list.array[idx]->criticality = CriticalityE2_reject;
824 ricIndicationMsg->protocolIEs.list.array[idx]->value.present = \
825 RICindication_IEs__value_PR_RICindicationMessage;
826 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size = 3 * sizeof(U8);
827 DU_ALLOC(ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.buf ,\
828 ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage.size);
829 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn, \
830 &ricIndicationMsg->protocolIEs.list.array[idx]->value.choice.RICindicationMessage);
832 /* Prints the Msg formed */
833 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
835 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
837 encRetVal = aper_encode(&asn_DEF_E2AP_PDU, 0, e2apMsg, PrepFinalEncBuf,\
839 if(encRetVal.encoded == ENCODE_FAIL)
841 DU_LOG("\nE2AP : Could not encode RIC Indication Message (at %s)\n",\
842 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
847 DU_LOG("\nE2AP : Created APER encoded buffer for RIC Indication Message \n");
848 for(int i=0; i< encBufSize; i++)
850 printf("%x",encBuf[i]);
854 if(SendE2APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
856 DU_LOG("\nE2AP : Sending RIC Indication Message");
862 /*******************************************************************
864 * @brief Sends E2 msg over SCTP
868 * Function : SendE2APMsg
870 * Functionality: Sends E2 msg over SCTP
872 * @params[in] Region region
874 * @return ROK - success
877 * ****************************************************************/
879 S16 SendE2APMsg(Region region, Pool pool)
883 if(SGetMsg(region, pool, &mBuf) == ROK)
885 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
889 if(sctpSend(mBuf, E2_INTERFACE) != ROK)
891 DU_LOG("\nE2AP : SCTP Send for E2 failed");
898 DU_LOG("\nE2AP : SAddPstMsgMult failed");
906 DU_LOG("\nE2AP : Failed to allocate memory");
913 /*******************************************************************
915 * @brief Handles received E2AP message and sends back response
919 * Function : E2APMsgHdlr
922 * - Decodes received E2AP control message
923 * - Prepares response message, encodes and sends to SCTP
926 * @return ROK - success
929 * ****************************************************************/
930 void E2APMsgHdlr(Buffer *mBuf)
937 asn_dec_rval_t rval; /* Decoder return value */
938 E2AP_PDU_t e2apasnmsg ;
940 DU_LOG("\nE2AP : Received E2AP message buffer");
943 /* Copy mBuf into char array to decode it */
944 SFndLenMsg(mBuf, &recvBufLen);
945 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
947 DU_LOG("\nE2AP : Memory allocation failed");
950 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
952 DU_LOG("\nE2AP : Failed while copying %d", copyCnt);
956 printf("\nE2AP : Received flat buffer to be decoded : ");
957 for(i=0; i< recvBufLen; i++)
959 printf("%x",recvBuf[i]);
962 /* Decoding flat buffer into E2AP messsage */
963 e2apMsg = &e2apasnmsg;
964 memset(e2apMsg, 0, sizeof(E2AP_PDU_t));
966 rval = aper_decode(0, &asn_DEF_E2AP_PDU, (void **)&e2apMsg, recvBuf, recvBufLen, 0, 0);
967 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
968 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
970 DU_LOG("\nE2AP : ASN decode failed");
974 xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2apMsg);
976 switch(e2apMsg->present)
978 case E2AP_PDU_PR_successfulOutcome:
980 switch(e2apMsg->choice.successfulOutcome->value.present)
982 case SuccessfulOutcomeE2__value_PR_E2setupResponse:
986 DU_LOG("\nE2AP : Store E2 setup response Params");
987 procE2SetupRsp(e2apMsg);
993 DU_LOG("\nE2AP : Invalid type of intiating message [%d]", e2apMsg->choice.initiatingMessage->value.present);
996 }/* End of switch(successfulOutcome) */
999 case E2AP_PDU_PR_initiatingMessage:
1001 switch(e2apMsg->choice.initiatingMessage->value.present)
1003 case InitiatingMessageE2__value_PR_RICsubscriptionRequest:
1005 DU_LOG("\nE2AP : Calling RIC Subscription Response");
1006 if(procRicSubsReq(e2apMsg) == ROK)
1008 BuildAndSendRicIndication();
1014 DU_LOG("\nE2AP : Invalid type of successfulOutcome message [%d]", e2apMsg->choice.successfulOutcome->value.present);
1017 }/* End of switch(initiatingMessage) */
1022 DU_LOG("\nE2AP : Invalid type of e2apMsg->present [%d]",e2apMsg->present);
1026 }/* End of switch(e2apMsg->present) */
1028 } /* End of E2APMsgHdlr */
1030 /**********************************************************************
1032 **********************************************************************/