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 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
22 #include "du_mgr_main.h"
23 #include "du_cell_mgr.h"
24 #include "du_f1ap_msg_hdl.h"
25 #include "GNB-DU-System-Information.h"
26 #include "CellGroupConfigRrc.h"
27 #include "MAC-CellGroupConfig.h"
28 #include "SchedulingRequestConfig.h"
29 #include "SchedulingRequestToAddMod.h"
30 #include "BSR-Config.h"
31 #include "TAG-Config.h"
33 #include "PHR-Config.h"
34 #include "RLC-Config.h"
35 #include "UL-AM-RLC.h"
36 #include "DL-AM-RLC.h"
37 #include "LogicalChannelConfig.h"
38 #include "RLC-BearerConfig.h"
39 #include "PhysicalCellGroupConfig.h"
40 #include "SpCellConfig.h"
41 #include "ServingCellConfig.h"
42 #include "BWP-DownlinkDedicated.h"
43 #include "UplinkConfig.h"
44 #include "DUtoCURRCContainer.h"
46 extern char encBuf[ENC_BUF_MAX_LEN];
47 extern DuCfgParams duCfgParam;
48 static S16 BuildULTnlInforet=RFAILED;
50 S16 sctpSend(Buffer *mBuf, U8 itfType);
53 /*******************************************************************
55 * @brief Builds Uplink Info for NR
59 * Function : BuildULNRInfo
61 * Functionality: Building NR Uplink Info
63 * @params[in] NRFreqInfo_t *ulnrfreq
64 * @return ROK - success
67 * ****************************************************************/
68 S16 BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
71 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
72 fdd.ulNrFreqInfo.nrArfcn;
73 ulnrfreq->freqBandListNr.list.count = 1;
74 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
75 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
76 if(ulnrfreq->freqBandListNr.list.array == NULLP)
80 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
82 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
83 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
88 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
89 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
90 freqBand[0].nrFreqBand;
91 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
94 /*******************************************************************
96 * @brief Builds Downlink NR Info
100 * Function : BuildDLNRInfo
102 * Functionality: Building Downlink NR Info
104 * @params[in] NRFreqInfo_t *dlnrfreq
105 * @return ROK - success
108 * ****************************************************************/
109 S16 BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
112 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
113 fdd.dlNrFreqInfo.nrArfcn;
114 dlnrfreq->freqBandListNr.list.count = 1;
115 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
116 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
117 if(dlnrfreq->freqBandListNr.list.array == NULLP)
121 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
123 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
124 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
129 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
130 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
131 freqBand[0].nrFreqBand;
132 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
137 /*******************************************************************
139 * @brief Builds Nrcgi
143 * Function : BuildNrcgi
145 * Functionality: Building the PLMN ID and NR Cell id
147 * @params[in] NRCGI_t *nrcgi
148 * @return ROK - success
151 * ****************************************************************/
152 S16 BuildNrcgi(NRCGI_t *nrcgi)
158 /* Allocate Buffer Memory */
159 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(U8);
160 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
161 if(nrcgi->pLMN_Identity.buf == NULLP)
165 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
166 &nrcgi->pLMN_Identity); // Building PLMN function
172 //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
173 nrcgi->nRCellIdentity.size = byteSize * sizeof(U8);
174 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
175 if(nrcgi->nRCellIdentity.buf == NULLP)
179 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
186 /*******************************************************************
188 * @brief Builds FiveGStac
192 * Function : BuildFiveGSTac
194 * Functionality: Building the FiveGSTac
196 * @params[in] OCTET_STRING_t *fivegsTac
197 * @return ROK - success
200 * ****************************************************************/
201 S16 BuildFiveGSTac(Served_Cell_Information_t *servcell)
203 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
204 if(servcell->fiveGS_TAC == NULLP)
208 servcell->fiveGS_TAC->size = 3 * sizeof(U8);
209 DU_ALLOC(servcell->fiveGS_TAC->buf,\
210 sizeof(servcell->fiveGS_TAC->size));
211 if(servcell->fiveGS_TAC->buf == NULLP)
215 servcell->fiveGS_TAC->buf[0] = 0;
216 servcell->fiveGS_TAC->buf[1] = 0;
217 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
220 /*******************************************************************
222 * @brief Builds NR Mode
226 * Function : BuildNrMode
228 * Functionality: Building the NR Mode
230 * @params[in] NR_Mode_Info_t *fdd
231 * @return ROK - success
234 * ****************************************************************/
235 S16 BuildNrMode(NR_Mode_Info_t *mode)
237 S16 BuildDLNRInforet=0;
238 S16 BuildULNRInforet=0;
240 mode->present = NR_Mode_Info_PR_fDD;
241 if(mode->present == NR_Mode_Info_PR_fDD)
243 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
244 if(mode->choice.fDD == NULLP)
248 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
249 if(BuildULNRInforet != ROK)
253 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
254 if(BuildDLNRInforet != ROK)
259 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
260 duCfgParam.srvdCellLst[0].duCellInfo.\
261 f1Mode.mode.fdd.ulTxBw.nrScs;
262 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
263 duCfgParam.srvdCellLst[0].duCellInfo.\
264 f1Mode.mode.fdd.ulTxBw.nrb;
265 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
266 duCfgParam.srvdCellLst[0].duCellInfo.\
267 f1Mode.mode.fdd.dlTxBw.nrScs;
268 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
269 duCfgParam.srvdCellLst[0].duCellInfo.\
270 f1Mode.mode.fdd.dlTxBw.nrb;
273 /*******************************************************************
275 * @brief Builds IE Extensions for Served PLMNs
279 * Function : BuildExtensions
281 * Functionality: Building the IE Extensions
283 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
284 * @return ROK - success
287 * ****************************************************************/
288 S16 BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
295 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
296 if((*ieExtend) == NULLP)
300 (*ieExtend)->list.count = extensionCnt;
301 (*ieExtend)->list.size = \
302 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
303 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
304 if((*ieExtend)->list.array == NULLP)
308 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
310 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
311 sizeof(ServedPLMNs_ItemExtIEs_t));
312 if((*ieExtend)->list.array[plmnidx] == NULLP)
318 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
319 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
320 (*ieExtend)->list.array[idx]->extensionValue.present = \
321 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
322 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
324 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
325 list.size = sizeof(SliceSupportItem_t *);
326 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
327 list.array,sizeof(SliceSupportItem_t *));
328 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
333 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
334 list.array[sliceId],sizeof(SliceSupportItem_t));
335 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
336 list.array[sliceId] == NULLP)
340 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
341 list.array[sliceId]->sNSSAI.sST.size = sizeof(U8);
342 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
343 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
344 extensionValue.choice.SliceSupportList.\
345 list.array[sliceId]->sNSSAI.sST.size);
346 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
347 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
351 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
352 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
353 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
354 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
355 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
356 list.array[sliceId]->sNSSAI.sD == NULLP)
360 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
361 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(U8);
362 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
363 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
364 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
365 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
366 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
371 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
372 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
374 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
375 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
377 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
378 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
381 /*******************************************************************
383 * @brief Builds Served PLMN
387 * Function : BuildServedPlmn
389 * Functionality: Building the Served PLMN
391 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
392 * @return ROK - success
395 * ****************************************************************/
396 S16 BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
400 S16 buildPlmnIdret=0;
401 S16 BuildExtensionsret=0;
402 srvplmn->list.count = servPlmnCnt;
403 srvplmn->list.size = \
404 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
405 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
406 if(srvplmn->list.array == NULLP)
410 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
412 DU_ALLOC(srvplmn->list.array[plmnidx],\
413 sizeof(ServedPLMNs_Item_t));
414 if(srvplmn->list.array[plmnidx] == NULLP)
419 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(U8);
420 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
421 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
422 &srvplmn->list.array[0]->pLMN_Identity);
423 if(buildPlmnIdret!= ROK)
427 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
428 if(BuildExtensionsret!= ROK)
434 /*******************************************************************
436 * @brief Builds Served Cell List
440 * Function : BuildServedCellList
442 * Functionality: Building Served Cell List
444 * @params[in] PLMNID plmn
445 * @return ROK - success
448 * ****************************************************************/
450 S16 BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
453 S16 BuildFiveGSTacret=0;
454 S16 BuildServedPlmnret=0;
455 S16 BuildNrModeret=0;
459 GNB_DU_Served_Cells_Item_t *srvCellItem;
460 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
461 duServedCell->list.count = plmnCnt;
463 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
464 if(duServedCell->list.array == NULLP)
468 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
470 DU_ALLOC(duServedCell->list.array[plmnidx],\
471 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
472 if(duServedCell->list.array[plmnidx] == NULLP)
478 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
479 duServedCell->list.array[idx]->criticality = Criticality_reject;
480 duServedCell->list.array[idx]->value.present = \
481 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
483 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
485 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
486 if(BuildNrcgiret != ROK)
491 srvCellItem->served_Cell_Information.nRPCI = \
492 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
495 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
496 if(BuildFiveGSTacret != ROK)
501 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
502 if(BuildServedPlmnret !=ROK)
506 /*nR Mode Info with FDD*/
507 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
508 if(BuildNrModeret != ROK)
512 /*Measurement timing Config*/
513 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
515 DU_ALLOC(srvCellItem->served_Cell_Information.\
516 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
517 if(srvCellItem->served_Cell_Information.\
518 measurementTimingConfiguration.buf == NULLP)
522 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
523 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
525 /* GNB DU System Information */
526 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
527 sizeof(GNB_DU_System_Information_t));
528 if(!srvCellItem->gNB_DU_System_Information)
533 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
534 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
535 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
536 srvCellItem->gNB_DU_System_Information->mIB_message.size);
537 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
541 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
542 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
545 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
546 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
548 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
549 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
550 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
554 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
556 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
557 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
561 /*******************************************************************
563 * @brief Builds RRC Version
567 * Function : BuildRrcVer
569 * Functionality: Building RRC Version
571 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
572 * @return ROK - success
575 * ****************************************************************/
576 S16 BuildRrcVer(RRC_Version_t *rrcVer)
580 rrcVer->latest_RRC_Version.size = sizeof(U8);
581 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(U8));
582 if(rrcVer->latest_RRC_Version.buf == NULLP)
586 rrcVer->latest_RRC_Version.buf[0] = 0;
587 rrcVer->latest_RRC_Version.bits_unused = 5;
588 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
589 if(rrcVer->iE_Extensions == NULLP)
593 rrcVer->iE_Extensions->list.count = 1;
594 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
595 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
596 if(rrcVer->iE_Extensions->list.array == NULLP)
601 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
602 sizeof(RRC_Version_ExtIEs_t));
603 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
607 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
608 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
609 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
610 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
611 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
612 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
613 .Latest_RRC_Version_Enhanced.size = 3*sizeof(U8);
614 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
615 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
616 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
617 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
618 .Latest_RRC_Version_Enhanced.buf == NULLP)
623 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
624 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
626 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
627 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
629 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
630 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
633 /*******************************************************************
635 * @brief Sends F1 msg over SCTP
639 * Function : SendF1APMsg
641 * Functionality: Sends F1 msg over SCTP
643 * @params[in] Region region
645 * @return ROK - success
648 * ****************************************************************/
649 S16 SendF1APMsg(Region region, Pool pool)
653 if(SGetMsg(region, pool, &mBuf) == ROK)
655 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
659 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
661 DU_LOG("\nF1AP : SCTP Send failed");
668 DU_LOG("\nF1AP : SAddPstMsgMult failed");
676 DU_LOG("\nF1AP : Failed to allocate memory");
682 /*******************************************************************
684 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
688 * Function : FreeRrcVer
690 * Functionality: deallocating the memory of function BuildRrcVer
692 * @params[in] RRC_Version_t *rrcVer
696 *****************************************************************/
697 void FreeRrcVer(RRC_Version_t *rrcVer)
699 if(rrcVer->latest_RRC_Version.buf != NULLP)
701 if(rrcVer->iE_Extensions != NULLP)
703 if(rrcVer->iE_Extensions->list.array != NULLP)
705 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
707 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
710 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
711 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
712 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
714 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
716 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
718 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
720 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
723 /*******************************************************************
725 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
729 * Function : FreeServedCellList
731 * Functionality: deallocating the memory of function BuildServedCellList
734 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
738 * ****************************************************************/
739 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
747 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
748 if(duServedCell->list.array!=NULLP)
750 if(duServedCell->list.array[0]!=NULLP)
752 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
754 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
756 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
758 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
760 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
762 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
764 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
766 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
768 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
770 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
772 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
773 extensionValue.choice.SliceSupportList.list.array!=NULLP)
775 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
776 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
778 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
779 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
781 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
782 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
784 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
785 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
787 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
789 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
790 freqBandListNr.list.array!=NULLP)
792 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
793 freqBandListNr.list.array[0]!=NULLP)
795 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
796 freqBandListNr.list.array)
798 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
799 freqBandListNr.list.array[0]!=NULLP)
801 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
803 if(!srvCellItem->gNB_DU_System_Information)
805 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
807 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
809 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
810 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
811 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
812 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
814 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
815 srvCellItem->gNB_DU_System_Information->mIB_message.size);
816 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
817 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
819 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
821 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
822 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
824 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
825 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
827 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
828 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
830 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
831 list.array[0],sizeof(FreqBandNrItem_t));
833 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
834 list.array,sizeof(FreqBandNrItem_t*));
836 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
838 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
839 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
840 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
841 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
843 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
844 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
845 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
847 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
848 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
849 sNSSAI.sST.buf,sizeof(U8));
851 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
852 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
854 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
855 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
857 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
858 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
860 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
861 array[servId]->iE_Extensions->list.array,\
862 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
864 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
865 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
867 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
868 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
869 servedPLMNs.list.array[servId]->pLMN_Identity.size
872 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
873 sizeof(ServedPLMNs_Item_t *));
875 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
876 sizeof(ServedPLMNs_Item_t *));
878 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
879 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
881 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
883 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
884 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
887 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
888 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
891 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
893 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
896 /*******************************************************************
898 * @brief Builds and Send the F1SetupRequest
902 * Function : BuildAndSendF1SetupReq
904 * Functionality:Fills the F1SetupRequest
906 * @return ROK - success
909 ******************************************************************/
910 S16 BuildAndSendF1SetupReq()
912 S16 BuildServedCellListreturn=0;
913 S16 BuildRrcVerreturn=0;
917 F1AP_PDU_t *f1apMsg = NULLP;
918 F1SetupRequest_t *f1SetupReq=NULLP;
919 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
920 RRC_Version_t *rrcVer=NULLP;
921 asn_enc_rval_t encRetVal; /* Encoder return value */
923 DU_LOG("\nF1AP : Building F1 Setup Request\n");
926 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
931 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
932 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
933 if(f1apMsg->choice.initiatingMessage == NULLP)
937 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
938 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
939 f1apMsg->choice.initiatingMessage->value.present = \
940 InitiatingMessage__value_PR_F1SetupRequest;
942 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
944 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
946 f1SetupReq->protocolIEs.list.count = elementCnt;
947 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
949 /* Initialize the F1Setup members */
950 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
951 if(f1SetupReq->protocolIEs.list.array == NULLP)
955 for(idx=0; idx<elementCnt; idx++)
957 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
958 sizeof(F1SetupRequestIEs_t));
959 if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
967 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
968 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
969 f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
970 F1SetupRequestIEs__value_PR_TransactionID;
971 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
976 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
977 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
978 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
979 F1SetupRequestIEs__value_PR_GNB_DU_ID;
980 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
983 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
984 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
985 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
991 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
995 if(duCfgParam.duName != NULL)
998 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
999 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
1000 f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1001 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
1002 strlen((char *)duCfgParam.duName);
1003 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
1004 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1005 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
1010 strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
1011 choice.GNB_DU_Name.buf,
1012 (char*)&duCfgParam.duName);
1016 /*Served Cell list */
1018 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1019 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1020 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1021 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1022 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1023 duServedCell = &f1SetupReq->protocolIEs.list.\
1024 array[idx2]->value.choice.GNB_DU_Served_Cells_List;
1025 BuildServedCellListreturn = BuildServedCellList(duServedCell);
1026 if(BuildServedCellListreturn != ROK)
1033 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1034 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1035 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1036 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1037 F1SetupRequestIEs__value_PR_RRC_Version;
1038 rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1039 BuildRrcVerreturn = BuildRrcVer(rrcVer);
1041 if(BuildRrcVerreturn != ROK)
1045 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1047 /* Encode the F1SetupRequest type as APER */
1048 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1050 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1053 /* Encode results */
1054 if(encRetVal.encoded == ENCODE_FAIL)
1056 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1057 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1062 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1063 for(i=0; i< encBufSize; i++)
1065 printf("%x",encBuf[i]);
1070 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1072 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1079 if(f1apMsg != NULLP)
1082 if(f1apMsg->choice.initiatingMessage != NULLP)
1084 if(f1SetupReq->protocolIEs.list.array != NULLP)
1086 if(idx == elementCnt-1)
1088 if(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf != NULLP)
1090 if(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf != NULLP)
1092 if(BuildServedCellListreturn == ROK)
1096 FreeServedCellList(duServedCell);
1097 DU_FREE(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1099 DU_FREE(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf, sizeof(U8));
1101 for(idx=0; idx<elementCnt; idx++)
1103 DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
1108 for(ieId=0 ; ieId<idx ;ieId++)
1110 if(f1SetupReq->protocolIEs.list.array[ieId]!=NULLP)
1112 DU_FREE(f1SetupReq->protocolIEs.list.array[ieId],\
1113 sizeof(F1SetupRequestIEs_t));
1117 DU_FREE(f1SetupReq->protocolIEs.list.array,\
1118 elementCnt * sizeof(F1SetupRequestIEs_t *));
1120 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1122 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1129 }/* End of BuildAndSendF1SetupReq */
1131 /*******************************************************************
1133 * @brief Builds and sends the DUConfigUpdate
1137 * Function : BuildAndSendDUConfigUpdate
1139 * Functionality: Constructs the DU Update message and sends
1140 * it to the CU through SCTP.
1142 * @params[in] void **buf,Buffer to which encoded pattern is written into
1143 * @params[in] int *size,size of buffer
1145 * @return ROK - success
1148 * ****************************************************************/
1149 S16 BuildAndSendDUConfigUpdate()
1160 asn_enc_rval_t encRetVal; /* Encoder return value */
1161 F1AP_PDU_t *f1apDuCfg = NULL;
1162 GNBDUConfigurationUpdate_t *duCfgUpdate;
1163 Served_Cells_To_Modify_List_t *cellsToModify;
1164 Served_Cells_To_Modify_Item_t *modifyItem;
1165 bool checkvar=false;
1170 DU_LOG("\nF1AP : Building DU config update\n");
1171 /* Allocate the memory for F1DuCfg */
1172 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1173 if(f1apDuCfg == NULLP)
1175 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1179 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1180 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1181 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1183 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1187 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1188 ProcedureCode_id_gNBDUConfigurationUpdate;
1189 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1190 f1apDuCfg->choice.initiatingMessage->value.present = \
1191 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1192 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1193 choice.GNBDUConfigurationUpdate;
1195 duCfgUpdate->protocolIEs.list.count = elementCnt;
1196 duCfgUpdate->protocolIEs.list.size = \
1197 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1199 /* Initialize the F1Setup members */
1200 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1201 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1203 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1206 for(idx=0;idx<elementCnt;idx++)
1208 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1209 if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1217 duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1218 duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1219 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1220 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1221 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1224 /*Served Cell to Modify */
1226 duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1227 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1228 duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1229 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1230 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1231 cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1232 Served_Cells_To_Modify_List;
1234 cellsToModify->list.count = modifyCnt;
1235 cellsToModify->list.size = \
1236 modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1237 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1238 if(cellsToModify->list.array == NULLP)
1242 for(idy=0; idy<modifyCnt ;idy++)
1244 DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1245 Served_Cells_To_Modify_ItemIEs_t));
1246 if(cellsToModify->list.array[idy] == NULLP)
1251 cellsToModify->list.array[0]->id = \
1252 ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1253 cellsToModify->list.array[0]->criticality = Criticality_reject;
1254 cellsToModify->list.array[0]->value.present =\
1255 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1256 modifyItem=&cellsToModify->list.array[0]->value.choice.\
1257 Served_Cells_To_Modify_Item;
1260 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1261 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1262 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1266 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1267 &modifyItem->oldNRCGI.pLMN_Identity);
1270 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1271 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1272 modifyItem->oldNRCGI.nRCellIdentity.size);
1273 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1277 for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1279 modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1281 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1282 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1285 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1286 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1287 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1288 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1292 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1293 &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1294 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1295 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1296 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1297 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1301 for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1302 nRCGI.nRCellIdentity.size-1 ; tmp++)
1304 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1306 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1307 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1309 modifyItem->served_Cell_Information.nRPCI = \
1310 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1313 modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1314 modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1315 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1316 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1317 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1318 if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1322 for(idy1=0;idy1<servPlmnCnt;idy1++)
1324 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1325 sizeof(ServedPLMNs_Item_t));
1326 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1331 modifyItem->served_Cell_Information.servedPLMNs.list.\
1332 array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1333 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1334 array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1335 array[0]->pLMN_Identity.size);
1336 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1337 array[0]->pLMN_Identity.buf == NULLP)
1341 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1342 &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1343 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1344 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1345 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1346 array[0]->iE_Extensions == NULLP)
1351 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1352 iE_Extensions->list.count = extensionCnt;
1353 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1354 iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1355 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1356 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1357 iE_Extensions->list.size);
1358 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1359 array[0]->iE_Extensions->list.array == NULLP)
1363 for(idy2=0;idy2<extensionCnt;idy2++)
1365 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1366 array[0]->iE_Extensions->list.array[idy2],\
1367 sizeof(ServedPLMNs_ItemExtIEs_t));
1368 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1369 array[0]->iE_Extensions->list.array[idy2] == NULLP)
1374 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1375 iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1376 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1377 iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1378 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1379 iE_Extensions->list.array[0]->extensionValue.present = \
1380 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1381 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1382 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1384 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1385 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1386 list.size = sizeof(SliceSupportItem_t *);
1387 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1388 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1389 list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1390 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1391 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1392 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1393 list.array == NULLP)
1398 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1399 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1400 list.array[0],sizeof( SliceSupportItem_t));
1401 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1402 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1403 list.array[0] == NULLP)
1407 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1408 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1409 list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1410 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1411 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1412 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1413 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1414 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1415 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1416 list.array[0]->sNSSAI.sST.buf == NULLP)
1420 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1421 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1422 list.array[0]->sNSSAI.sST.buf[0] = 3;
1423 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1424 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1425 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1426 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1427 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1428 list.array[0]->sNSSAI.sD == NULLP)
1432 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1433 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1434 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1435 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1436 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1437 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1438 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1439 list.array[0]->sNSSAI.sD->size);
1440 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1441 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1442 list.array[0]->sNSSAI.sD->buf == NULLP)
1446 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1447 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1448 list.array[0]->sNSSAI.sD->buf[0] = 3;
1449 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1450 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1451 list.array[0]->sNSSAI.sD->buf[1] = 6;
1452 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1453 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1454 list.array[0]->sNSSAI.sD->buf[2] = 9;
1456 /*nR Mode Info with FDD*/
1457 modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1458 NR_Mode_Info_PR_fDD;
1459 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1460 sizeof(FDD_Info_t));
1461 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1465 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1466 uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1467 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1468 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1469 uL_NRFreqInfo.freqBandListNr.list.count = 1;
1470 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1471 uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1472 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1473 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1474 array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1475 uL_NRFreqInfo.freqBandListNr.list.size);
1476 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1477 fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1481 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1482 uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1483 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1484 uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1488 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1489 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1490 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1491 freqBand[0].nrFreqBand;
1492 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1493 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1494 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1495 nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1496 dlNrFreqInfo.nrArfcn;
1497 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1498 freqBandListNr.list.count = 1;
1499 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1500 freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1501 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1502 dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1503 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1504 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1505 dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1509 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1510 dL_NRFreqInfo.freqBandListNr.list.array[0],\
1511 sizeof(FreqBandNrItem_t));
1512 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1513 dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1517 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1518 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1519 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1520 freqBand[0].nrFreqBand;
1521 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1522 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1524 /*Transmission Bandwidth*/
1525 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1526 uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1527 f1Mode.mode.fdd.ulTxBw.nrScs;
1528 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1529 uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1530 f1Mode.mode.fdd.ulTxBw.nrb;
1531 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1532 dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1533 f1Mode.mode.fdd.dlTxBw.nrScs;
1534 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1535 dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1536 f1Mode.mode.fdd.dlTxBw.nrb;
1537 /*Measurement timing Config*/
1538 modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1540 DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1541 buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1542 if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1546 modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1547 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1549 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1552 duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1553 duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1554 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1555 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1556 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1558 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1559 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1560 if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1564 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1567 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1569 /* Encode the DU Config Update type as APER */
1570 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1572 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1574 /* Checking encode results */
1575 if(encRetVal.encoded == ENCODE_FAIL)
1577 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1582 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1583 for(i=0; i< encBufSize; i++)
1585 printf("%x",encBuf[i]);
1589 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1591 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1597 if(f1apDuCfg != NULLP)
1599 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1601 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1605 if(cellsToModify->list.array != NULLP)
1609 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1611 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1613 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1615 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1618 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1621 if(idy1==servPlmnCnt)
1623 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1624 array[0]->pLMN_Identity.buf != NULLP)
1626 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1627 array[0]->iE_Extensions!= NULLP)
1629 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1630 array[0]->iE_Extensions->list.array != NULLP)
1632 if(idy2==extensionCnt)
1634 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1635 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1638 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1639 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1640 list.array[0]!=NULLP)
1642 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1643 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1644 list.array[0]->sNSSAI.sST.buf!=NULLP)
1646 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1647 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1648 list.array[0]->sNSSAI.sD != NULLP)
1650 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1651 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1652 list.array[0]->sNSSAI.sD->buf!=NULLP)
1654 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1657 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1658 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1660 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1661 fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]!=NULLP)
1663 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1664 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1666 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1667 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1670 if(modifyItem->served_Cell_Information.\
1671 measurementTimingConfiguration.buf !=NULLP)
1673 if(duCfgUpdate->protocolIEs.list.array[2]->value.\
1674 choice.GNB_DU_ID.buf!=NULLP)
1676 DU_FREE(duCfgUpdate->protocolIEs.list.\
1677 array[2]->value.choice.GNB_DU_ID.buf,\
1678 duCfgUpdate->protocolIEs.list.array[2]->\
1679 value.choice.GNB_DU_ID.size);
1681 DU_FREE(modifyItem->served_Cell_Information.\
1682 measurementTimingConfiguration.\
1683 buf,modifyItem->served_Cell_Information.\
1684 measurementTimingConfiguration.size);
1686 DU_FREE(modifyItem->served_Cell_Information.\
1687 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1688 list.array[0],sizeof(FreqBandNrItem_t));
1690 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1691 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1692 modifyItem->served_Cell_Information.nR_Mode_Info.\
1693 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1695 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1696 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1697 array[0],sizeof(FreqBandNrItem_t));
1699 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1700 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1701 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1702 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1704 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1705 fDD,sizeof(FDD_Info_t));
1707 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1708 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1709 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1710 servedPLMNs.list.array[0]->iE_Extensions->list.array[0]->\
1711 extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sD->size);
1714 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1715 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1716 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1718 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1719 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1720 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.\
1721 list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.\
1722 SliceSupportList.list.array[0]->sNSSAI.sST.size);
1724 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1725 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1726 list.array[0],sizeof(SliceSupportItem_t));
1728 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1729 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1731 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1732 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1734 for(i=0;i<extensionCnt;i++)
1736 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1737 array[0]->iE_Extensions->list.array[i],\
1738 sizeof(ServedPLMNs_ItemExtIEs_t ));
1745 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1746 array[0]->iE_Extensions->list.array[i],\
1747 sizeof(ServedPLMNs_ItemExtIEs_t));
1750 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1751 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1752 list.array[0]->iE_Extensions->list.size);
1754 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1755 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1757 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1758 array[0]->pLMN_Identity.buf,
1759 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity.size);
1763 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1764 sizeof(ServedPLMNs_Item_t));
1771 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1772 sizeof(ServedPLMNs_Item_t));
1775 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1776 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1778 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1779 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1781 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1782 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1784 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1785 modifyItem->oldNRCGI.nRCellIdentity.size);
1787 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1788 modifyItem->oldNRCGI.pLMN_Identity.size);
1790 for(int iy=0; iy<modifyCnt ;iy++)
1792 DU_FREE(cellsToModify->list.array[iy],\
1793 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1798 for(int iy=0; iy<idy ;iy++)
1800 DU_FREE(cellsToModify->list.array[iy],\
1801 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1804 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1806 for(i=0;i<elementCnt;i++)
1808 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1809 sizeof(GNBDUConfigurationUpdateIEs_t));
1816 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1817 sizeof(GNBDUConfigurationUpdateIEs_t));
1820 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1822 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1824 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1830 }/* End of BuildAndSendDUConfigUpdate */
1832 /*******************************************************************
1834 * @brief Builds and sends the ULRRCMessageTransfer
1838 * Function : BuildAndSendULRRCMessageTransfer
1840 * Functionality: Constructs the UL RRC Message Transfer and sends
1841 * it to the CU through SCTP.
1845 * @return ROK - success
1848 * ****************************************************************/
1849 S16 BuildAndSendULRRCMessageTransfer()
1854 F1AP_PDU_t *f1apMsg = NULL;
1855 ULRRCMessageTransfer_t *ulRRCMsg;
1856 asn_enc_rval_t encRetVal; /* Encoder return value */
1857 bool checkvar=false;
1860 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1862 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1863 if(f1apMsg == NULLP)
1865 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1869 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1870 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1871 if(f1apMsg->choice.initiatingMessage == NULLP)
1873 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1876 f1apMsg->choice.initiatingMessage->procedureCode = \
1877 ProcedureCode_id_ULRRCMessageTransfer;
1878 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1879 f1apMsg->choice.initiatingMessage->value.present = \
1880 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1882 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1884 ulRRCMsg->protocolIEs.list.count = elementCnt;
1885 ulRRCMsg->protocolIEs.list.size = \
1886 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
1888 /* Initialize the F1Setup members */
1889 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
1890 if(ulRRCMsg->protocolIEs.list.array == NULLP)
1892 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
1895 for(idx=0; idx<elementCnt; idx++)
1897 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
1898 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
1906 /*GNB CU UE F1AP ID*/
1907 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
1908 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1909 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1910 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1911 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1912 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1914 /*GNB DU UE F1AP ID*/
1916 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
1917 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1918 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1919 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1920 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1921 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1925 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
1926 ProtocolIE_ID_id_SRBID;
1927 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1928 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1929 ULRRCMessageTransferIEs__value_PR_SRBID;
1930 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = UL_SRBID;
1935 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1937 /* Encode the F1SetupRequest type as APER */
1938 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1940 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1942 /* Encode results */
1943 if(encRetVal.encoded == ENCODE_FAIL)
1945 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
1946 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1951 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
1952 for(int i=0; i< encBufSize; i++)
1954 printf("%x",encBuf[i]);
1959 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
1961 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
1968 if(f1apMsg != NULLP)
1970 if(f1apMsg->choice.initiatingMessage != NULLP)
1972 if(ulRRCMsg->protocolIEs.list.array != NULLP)
1974 for(idx1=0;idx1<idx;idx1++)
1976 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
1978 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
1981 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
1983 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1985 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1992 }/* End of BuildAndSendULRRCMessageTransfer*/
1994 /*******************************************************************
1996 * @brief Builds tag config
2000 * Function : BuildTagConfig
2002 * Functionality: Builds tag config in MacCellGroupConfig
2004 * @params[in] TAG_Config *tag_Config
2006 * @return ROK - success
2009 * ****************************************************************/
2010 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2012 struct TAG_Config__tag_ToAddModList *tagList;
2013 uint8_t idx, elementCnt;
2015 tagConfig->tag_ToAddModList = NULLP;
2016 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2017 if(!tagConfig->tag_ToAddModList)
2019 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2023 elementCnt = 1; //ODU_VALUE_ONE;
2024 tagList = tagConfig->tag_ToAddModList;
2025 tagList->list.count = elementCnt;
2026 tagList->list.size = elementCnt * sizeof(struct TAG);
2028 tagList->list.array = NULLP;
2029 DU_ALLOC(tagList->list.array, tagList->list.size);
2030 if(!tagList->list.array)
2032 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2036 for(idx=0; idx<tagList->list.count; idx++)
2038 tagList->list.array[idx] = NULLP;
2039 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2040 if(!tagList->list.array[idx])
2042 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2048 tagList->list.array[idx]->tag_Id = TAG_ID;
2049 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2054 /*******************************************************************
2056 * @brief Builds PHR Config
2060 * Function : BuildPhrConfig
2062 * Functionality: Builds phrConfig in MacCellGroupConfig
2064 * @params[in] PHR Config *
2066 * @return ROK - success
2069 * ****************************************************************/
2070 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2073 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2074 phrConfig->choice.setup = NULLP;
2075 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2076 if(!phrConfig->choice.setup)
2078 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2082 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2083 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2084 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2085 phrConfig->choice.setup->multiplePHR = false;
2086 phrConfig->choice.setup->dummy = false;
2087 phrConfig->choice.setup->phr_Type2OtherCell = false;
2088 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2093 /*******************************************************************
2095 * @brief Builds BSR Config
2099 * Function : BuildBsrConfig
2101 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2103 * @params[in] BSR_Config *bsrConfig
2105 * @return ROK - success
2108 * ****************************************************************/
2109 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2111 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2112 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2117 /*******************************************************************
2119 * @brief Builds scheduling request config
2123 * Function : BuildSchedulingReqConfig
2125 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2127 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2129 * @return ROK - success
2132 * ****************************************************************/
2133 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2135 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2136 uint8_t idx, elementCnt;
2138 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2139 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2140 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2141 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2143 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2147 elementCnt = 1; //ODU_VALUE_ONE;
2148 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2149 schReqList->list.count = elementCnt;
2150 schReqList->list.size = elementCnt * sizeof(SchedulingRequestId_t);
2152 schReqList->list.array = NULLP;
2153 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2154 if(!schReqList->list.array)
2156 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2160 for(idx=0;idx<schReqList->list.count; idx++)
2162 schReqList->list.array[idx] = NULLP;
2163 DU_ALLOC(schReqList->list.array[idx], sizeof(SchedulingRequestId_t));
2164 if(!schReqList->list.array[idx])
2166 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2172 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2174 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2175 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2176 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2178 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2181 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2183 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2188 /*******************************************************************
2190 * @brief Builds RLC Config
2194 * Function : BuildRlcConfig
2196 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
2198 * @params[in] RLC_Config *rlcConfig
2200 * @return ROK - success
2203 * ****************************************************************/
2204 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2207 rlcConfig->present = RLC_Config_PR_am;
2209 rlcConfig->choice.am = NULLP;
2210 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2211 if(!rlcConfig->choice.am)
2213 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2218 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2219 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2220 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2222 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2225 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2226 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2227 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2228 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2229 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
2232 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2233 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2234 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2236 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2239 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2240 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
2241 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
2246 /*******************************************************************
2248 * @brief Builds MAC LC Config
2252 * Function : BuildMacLCConfig
2254 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
2256 * @params[in] struct LogicalChannelConfig macLcConfig
2258 * @return ROK - success
2261 * ****************************************************************/
2262 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2265 macLcConfig->ul_SpecificParameters = NULLP;
2266 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2267 if(!macLcConfig->ul_SpecificParameters)
2269 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2273 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2274 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
2275 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
2277 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2278 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2279 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2281 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2284 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2286 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2287 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2288 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2290 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2293 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2295 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2296 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2301 /*******************************************************************
2303 * @brief Builds RLC Bearer to Add/Mod list
2307 * Function :BuildRlcBearerToAddModList
2309 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2311 * @params[in] rlc_BearerToAddModList
2313 * @return ROK - success
2316 * ****************************************************************/
2317 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2319 uint8_t idx, elementCnt;
2322 rlcBearerList->list.count = elementCnt;
2323 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig);
2325 rlcBearerList->list.array = NULLP;
2326 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2327 if(!rlcBearerList->list.array)
2329 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2333 for(idx=0; idx<rlcBearerList->list.count; idx++)
2335 rlcBearerList->list.array[idx] = NULLP;
2336 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2337 if(!rlcBearerList->list.array[idx])
2339 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2345 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
2347 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2348 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2350 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2354 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2355 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
2357 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2358 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2359 if(!rlcBearerList->list.array[idx]->rlc_Config)
2361 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2365 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2367 DU_LOG("\nF1AP : BuildRlcConfig failed");
2371 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2372 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2373 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2375 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2379 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2381 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2388 /*******************************************************************
2390 * @brief Builds intitial DL BWP
2393 * Function : BuildInitialDlBWP
2395 * Functionality: Builds intitial DL BWP in spCellCfgDed
2397 * @params[in] BWP_DownlinkDedicated_t *dlBwp
2399 * @return ROK - success
2402 * ****************************************************************/
2403 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
2409 /*******************************************************************
2411 * @brief Builds UL config
2414 * Function : BuildUlCfg
2416 * Functionality: Builds UL config in spCellCfgDed
2418 * @params[in] UplinkConfig_t *ulCfg
2420 * @return ROK - success
2423 * ****************************************************************/
2424 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
2430 /*******************************************************************
2432 * @brief Builds PDSCH serving cell config
2435 * Function : BuildPdschSrvCellCfg
2437 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
2439 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
2441 * @return ROK - success
2444 * ****************************************************************/
2445 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
2451 /*******************************************************************
2453 * @brief Builds CSI Meas config
2456 * Function : BuildCsiMeasCfg
2458 * Functionality: Builds CSI Meas config in spCellCfgDed
2460 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
2462 * @return ROK - success
2465 * ****************************************************************/
2466 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
2472 /*******************************************************************
2474 * @brief Builds Spcell config dedicated
2477 * Function : BuildSpCellCfgDed
2479 * Functionality: Builds sp cell config dedicated in spCellCfg
2481 * @params[in] ServingCellConfig_t srvCellCfg
2483 * @return ROK - success
2486 * ****************************************************************/
2487 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
2490 srvCellCfg->initialDownlinkBWP = NULLP;
2491 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2492 if(!srvCellCfg->initialDownlinkBWP)
2494 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2498 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
2500 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
2504 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
2505 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2506 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
2508 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2511 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2513 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
2514 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2515 if(!srvCellCfg->defaultDownlinkBWP_Id)
2517 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2520 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2522 srvCellCfg->uplinkConfig = NULLP;
2523 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2524 if(!srvCellCfg->uplinkConfig)
2526 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2530 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
2532 DU_LOG("\nF1AP : BuildUlCfg failed");
2536 srvCellCfg->pdsch_ServingCellConfig = NULLP;
2537 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
2538 if(!srvCellCfg->pdsch_ServingCellConfig)
2540 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2544 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
2546 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
2550 srvCellCfg->csi_MeasConfig = NULLP;
2551 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
2552 if(!srvCellCfg->csi_MeasConfig)
2554 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2558 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
2560 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
2564 srvCellCfg->tag_Id = TAG_ID;
2568 /*******************************************************************
2570 * @brief Builds Spcell config
2574 * Function : BuildSpCellCfg
2576 * Functionality: Builds sp cell config in DuToCuRrcContainer
2578 * @params[in] SpCellConfig_t spCellCfg
2580 * @return ROK - success
2583 * ****************************************************************/
2584 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
2587 spCellCfg->servCellIndex = NULLP;
2588 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
2589 if(!spCellCfg->servCellIndex)
2591 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2594 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
2596 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
2597 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2598 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
2600 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2603 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
2605 spCellCfg->spCellConfigDedicated = NULLP;
2606 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2607 if(!spCellCfg->spCellConfigDedicated)
2609 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2613 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
2615 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
2621 /*******************************************************************
2623 * @brief Builds Phy cell group config
2627 * Function : BuildPhyCellGrpCfg
2629 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
2631 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
2633 * @return ROK - success
2636 * ****************************************************************/
2637 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
2639 phyCellGrpCfg->p_NR_FR1 = NULLP;
2640 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2641 if(!phyCellGrpCfg->p_NR_FR1)
2643 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
2646 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
2647 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
2651 /*******************************************************************
2653 * @brief Builds Mac cell group config
2657 * Function : BuildMacCellGrpCfg
2659 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
2661 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
2663 * @return ROK - success
2666 * ****************************************************************/
2667 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
2670 macCellGrpCfg->schedulingRequestConfig = NULLP;
2671 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2672 if(!macCellGrpCfg->schedulingRequestConfig)
2674 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2678 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
2680 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
2684 macCellGrpCfg->bsr_Config = NULLP;
2685 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2686 if(!macCellGrpCfg->bsr_Config)
2688 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2692 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
2694 DU_LOG("\nF1AP : BuildBsrConfig failed");
2698 macCellGrpCfg->tag_Config = NULLP;
2699 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
2700 if(!macCellGrpCfg->tag_Config)
2702 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2706 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
2708 DU_LOG("\nF1AP : BuildTagConfig failed");
2712 macCellGrpCfg->phr_Config = NULLP;
2713 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
2714 if(!macCellGrpCfg->phr_Config)
2716 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2720 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
2722 DU_LOG("\nF1AP : BuildPhrConfig failed");
2726 macCellGrpCfg->skipUplinkTxDynamic = false;
2731 /*******************************************************************
2733 * @brief Frees emmory allocated for DUToCURRCContainer
2737 * Function : FreeMemDuToCuRrcCont
2739 * Functionality: Builds DuToCuRrcContainer
2741 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
2743 * @return ROK - success
2746 * ****************************************************************/
2747 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
2750 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList;
2751 struct RLC_Config *rlcConfig;
2752 struct LogicalChannelConfig *macLcConfig;
2753 MAC_CellGroupConfig_t *macCellGrpCfg;
2754 struct SchedulingRequestConfig *schedulingRequestConfig;
2755 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2756 struct TAG_Config *tagConfig;
2757 struct TAG_Config__tag_ToAddModList *tagList;
2758 struct MAC_CellGroupConfig__phr_Config *phrConfig;
2759 PhysicalCellGroupConfig_t *phyCellGrpCfg;
2760 SpCellConfig_t *spCellCfg;
2761 ServingCellConfig_t *srvCellCfg;
2763 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
2766 if(rlcBearerList->list.array)
2768 for(idx=0; idx<rlcBearerList->list.count; idx++)
2770 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
2771 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
2772 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2773 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2774 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2775 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
2776 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2777 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2778 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2779 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2780 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2781 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2783 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
2785 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2788 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
2791 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
2792 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2794 for(idx=0;idx<schReqList->list.count; idx++)
2796 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2797 DU_FREE(schReqList->list.array[idx], sizeof(SchedulingRequestId_t));
2799 DU_FREE(schReqList->list.array, schReqList->list.size);
2800 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
2801 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2802 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2804 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2806 tagConfig = macCellGrpCfg->tag_Config;
2807 tagList = tagConfig->tag_ToAddModList;
2808 for(idx=0; idx<tagList->list.count; idx++)
2810 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
2812 DU_FREE(tagList->list.array, tagList->list.size);
2813 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2814 DU_FREE(tagConfig, sizeof(struct TAG_Config));
2816 phrConfig = macCellGrpCfg->phr_Config;
2817 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
2818 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
2820 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
2823 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
2826 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2827 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
2831 spCellCfg = cellGrpCfg->spCellConfig;
2834 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
2835 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2837 srvCellCfg = spCellCfg->spCellConfigDedicated;
2839 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2841 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2842 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2845 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2848 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
2851 DU_FREE(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig));
2853 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2854 DU_FREE(spCellCfg, sizeof(SpCellConfig_t));
2859 /*******************************************************************
2861 * @brief Builds DU To CU RRC Container
2865 * Function : BuildDuToCuRrcContainer
2867 * Functionality: Builds DuToCuRrcContainer
2869 * @params[in] idx, index in F1AP msg
2870 * DuToCuRRCContainer, DuToCuRRCContainer
2872 * @return ROK - success
2875 * ****************************************************************/
2876 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
2878 CellGroupConfigRrc_t cellGrpCfg;
2879 asn_enc_rval_t encRetVal;
2884 duToCuRrcContainer = NULLP;
2885 cellGrpCfg.cellGroupId = CELL_GRP_ID;
2887 cellGrpCfg.rlc_BearerToAddModList = NULLP;
2888 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2889 if(!cellGrpCfg.rlc_BearerToAddModList)
2891 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2894 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
2896 DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
2900 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
2901 cellGrpCfg.mac_CellGroupConfig = NULLP;
2902 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
2903 if(!cellGrpCfg.mac_CellGroupConfig)
2905 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2908 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
2910 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
2915 cellGrpCfg.physicalCellGroupConfig = NULLP;
2916 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
2917 if(!cellGrpCfg.physicalCellGroupConfig)
2919 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2922 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
2924 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
2928 cellGrpCfg.spCellConfig = NULLP;
2929 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
2930 if(!cellGrpCfg.spCellConfig)
2932 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2935 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
2937 DU_LOG("\nF1AP : BuildSpCellCfg failed");
2941 /* encode cellGrpCfg into duToCuRrcContainer */
2942 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
2943 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
2945 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
2946 /* Encode results */
2947 if(encRetVal.encoded == ENCODE_FAIL)
2949 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
2950 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2955 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
2956 for(int i=0; i< encBufSize; i++)
2958 printf("%x",encBuf[i]);
2962 memcpy(duToCuRrcContainer, encBuf, encBufSize);
2965 FreeMemDuToCuRrcCont(&cellGrpCfg);
2969 /*******************************************************************
2971 * @brief Builds and sends the InitialULRRCMessage
2975 * Function : BuildAndSendInitialRrcMsgTransfer
2977 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
2978 * it to the CU through SCTP.
2982 * @return ROK - success
2985 * ****************************************************************/
2986 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
2987 uint8_t *rrcContainer)
2994 F1AP_PDU_t *f1apMsg = NULLP;
2995 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
2996 asn_enc_rval_t encRetVal;
2997 bool checkvar=false;
3000 DU_LOG("\n F1AP : Building RRC Setup Request\n");
3001 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3002 if(f1apMsg == NULLP)
3004 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3007 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
3008 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3009 if(f1apMsg->choice.initiatingMessage == NULLP)
3011 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3014 f1apMsg->choice.initiatingMessage->procedureCode =\
3015 ProcedureCode_id_InitialULRRCMessageTransfer;
3016 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
3017 f1apMsg->choice.initiatingMessage->value.present = \
3018 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
3020 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
3022 initULRRCMsg->protocolIEs.list.count = elementCnt;
3023 initULRRCMsg->protocolIEs.list.size = \
3024 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
3025 /* Initialize the F1Setup members */
3026 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3027 if(initULRRCMsg->protocolIEs.list.array == NULLP)
3029 DU_LOG(" F1AP : Memory allocation for\
3030 RRCSetupRequestMessageTransferIEs failed");
3033 for(idx=0; idx<elementCnt; idx++)
3035 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
3036 sizeof(InitialULRRCMessageTransferIEs_t));
3037 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
3043 /*GNB DU UE F1AP ID*/
3044 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3045 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
3046 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3047 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3048 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
3049 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
3054 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3055 ProtocolIE_ID_id_NRCGI;
3056 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
3057 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3058 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
3061 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
3069 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3070 ProtocolIE_ID_id_C_RNTI;
3071 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3072 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3073 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
3074 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
3078 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3079 ProtocolIE_ID_id_RRCContainer;
3080 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3081 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3082 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
3084 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size =\
3085 strlen((const char*)rrcContainer);
3086 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3087 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3088 if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3090 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
3094 memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
3095 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
3098 /*DUtoCURRCContainer*/
3100 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3101 ProtocolIE_ID_id_DUtoCURRCContainer;
3102 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3103 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3104 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
3106 BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
3108 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3109 /* Encode the F1SetupRequest type as APER */
3110 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3112 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
3113 /* Encode results */
3114 if(encRetVal.encoded == ENCODE_FAIL)
3116 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
3117 structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3123 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
3124 Message transfer\n");
3125 for(int i=0; i< encBufSize; i++)
3127 printf("%x",encBuf[i]);
3131 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
3133 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
3140 if(f1apMsg != NULLP)
3142 if(f1apMsg->choice.initiatingMessage != NULLP)
3144 if(initULRRCMsg->protocolIEs.list.array != NULLP)
3146 if(idx == elementCnt)
3149 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
3151 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
3153 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
3154 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
3156 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
3157 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
3161 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3163 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3164 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3166 for(ieId=0; ieId<elementCnt; ieId++)
3168 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3173 for(ieId=0; ieId<idx; ieId++)
3175 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3178 DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3180 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3182 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3188 }/* End of BuildAndSendInitialRrcMsgTransfer*/
3190 /*******************************************************************
3192 * @brief Builds Special cell list for UE Setup Request
3196 * Function : BuildSplCellList
3198 * Functionality: Constructs the Special Cell list for UESetReq
3200 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3202 * @return ROK - success
3205 * ****************************************************************/
3206 S16 BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3212 spCellLst->list.count = cellCnt;
3213 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
3214 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
3215 if(spCellLst->list.array == NULLP)
3219 for(idx=0; idx<cellCnt; idx++)
3221 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3222 if(spCellLst->list.array[idx] == NULLP)
3228 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
3229 spCellLst->list.array[idx]->criticality = Criticality_ignore;
3230 spCellLst->list.array[idx]->value.present =\
3231 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
3232 /* Special Cell ID -NRCGI */
3233 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3238 /*Special Cell Index*/
3239 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
3241 }/* End of BuildSplCellList*/
3243 /*******************************************************************
3245 * @brief Builds SRBS to be setup
3249 * Function : BuildSRBSetup
3251 * Functionality: Constructs the SRB's for UESetReq
3253 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3255 * @return ROK - success
3258 * ****************************************************************/
3259 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3264 srbSet->list.count = srbCnt;
3265 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
3266 DU_ALLOC(srbSet->list.array,srbSet->list.size);
3267 if(srbSet->list.array == NULLP)
3271 for(idx=0; idx<srbCnt; idx++)
3273 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3274 if(srbSet->list.array[idx] == NULLP)
3280 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
3281 srbSet->list.array[idx]->criticality = Criticality_ignore;
3282 srbSet->list.array[idx]->value.present = \
3283 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
3284 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
3286 }/* End of BuildSRBSetup*/
3288 /*******************************************************************
3290 * @brief Builds QOS Info for DRB Setum Item
3294 * Function : BuildQOSInfo
3296 * Functionality: Constructs the QOS Info for DRB Setup Item
3298 * @params[in] QoSInformation_t *qosinfo
3300 * @return ROK - success
3303 * ****************************************************************/
3304 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3306 /* NonDynamic5QIDescriptor */
3307 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
3308 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3309 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
3314 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
3316 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3317 sizeof(AveragingWindow_t));
3318 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
3323 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
3324 /*MaxDataBurstVolume*/
3325 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3326 sizeof(MaxDataBurstVolume_t));
3327 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
3332 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
3334 /*nRGRAN Allocation Retention Priority*/
3335 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
3336 PriorityLevel_highest;
3337 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
3338 Pre_emptionCapability_may_trigger_pre_emption;
3339 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
3340 Pre_emptionVulnerability_not_pre_emptable;
3342 /* TO DO: GBR_QoSFlowInformation */
3344 }/*End of BuildQOSInfo*/
3346 /*******************************************************************
3348 * @brief Builds SNSSAI
3352 * Function : BuildSNSSAI
3354 * Functionality: Constructs the SNSSAI For DRB list
3356 * @params[in] SNSSAI_t *snssai
3358 * @return ROK - success
3361 * ****************************************************************/
3362 S16 BuildSNSSAI(SNSSAI_t *snssai)
3366 snssai->sST.size = sizeof(U8);
3367 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
3368 if(snssai->sST.buf == NULLP)
3372 snssai->sST.buf[0] = 3;
3374 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
3375 if(snssai->sD == NULLP)
3379 snssai->sD->size = 3*sizeof(U8);
3380 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
3381 if(snssai->sD->buf == NULLP)
3385 snssai->sD->buf[0] = 3;
3386 snssai->sD->buf[1] = 6;
3387 snssai->sD->buf[2] = 9;
3389 }/*End of BuildSNSSAI*/
3391 /*******************************************************************
3393 * @brief Builds the flow map.
3397 * Function : BuildFlowsMap
3399 * Functionality: Constructs the flowmap For DRB list
3401 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
3403 * @return ROK - success
3406 * ****************************************************************/
3407 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
3413 flowMap->list.count = flowCnt;
3414 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
3415 DU_ALLOC(flowMap->list.array,flowMap->list.size);
3416 if(flowMap->list.array == NULLP)
3420 for(idx=0; idx<flowCnt; idx++)
3422 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
3423 if(flowMap->list.array[idx] == NULLP)
3429 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
3430 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
3436 }/*End of BuildFlowsMap*/
3438 /*******************************************************************
3440 * @brief Builds the Uplink Tunnel Info
3444 * Function : BuildULTnlInfo
3446 * Functionality: Constructs the UL TnlInfo For DRB list
3448 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3450 * @return ROK - success
3453 * ****************************************************************/
3454 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3459 ulInfo->list.count = ulCnt;
3460 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
3461 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
3462 if(ulInfo->list.array == NULLP)
3466 for(idx=0; idx<ulCnt; idx++)
3468 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3469 if(ulInfo->list.array[idx] == NULLP)
3475 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
3476 UPTransportLayerInformation_PR_gTPTunnel;
3478 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
3479 sizeof(GTPTunnel_t));
3480 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
3484 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3485 transportLayerAddress.size = 4*sizeof(U8);
3486 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3487 transportLayerAddress.buf,ulInfo->list.array[idx]->\
3488 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3489 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3490 transportLayerAddress.buf == NULLP)
3494 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3495 transportLayerAddress.buf[0] = 4;
3496 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3497 transportLayerAddress.buf[1] = 4;
3498 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3499 transportLayerAddress.buf[2] = 4;
3500 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3501 transportLayerAddress.buf[3] = 5;
3502 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3503 transportLayerAddress.bits_unused = 0;
3505 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
3507 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3508 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
3509 gTPTunnel->gTP_TEID.size);
3510 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3515 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3516 gTP_TEID.buf[0] = 11;
3517 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3518 gTP_TEID.buf[1] = 0;
3519 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3520 gTP_TEID.buf[2] = 0;
3521 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3522 gTP_TEID.buf[3] = 1;
3525 }/*End of BuildULTnlInfo*/
3527 /*******************************************************************
3529 * @brief Builds DRBS to be setup
3533 * Function : BuildDRBSetup
3535 * Functionality: Constructs the DRB's for UESetReq
3537 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3539 * @return ROK - success
3542 * ****************************************************************/
3543 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3545 S16 BuildQOSInforet;
3547 S16 BuildFlowsMapret;
3550 DRBs_ToBeSetup_Item_t *drbSetItem;
3552 drbSet->list.count = drbCnt;
3553 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
3554 DU_ALLOC(drbSet->list.array,drbSet->list.size);
3555 if(drbSet->list.array == NULLP)
3559 for(idx=0; idx<drbCnt; idx++)
3561 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3562 if(drbSet->list.array[idx] == NULLP)
3568 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
3569 drbSet->list.array[idx]->criticality = Criticality_ignore;
3570 drbSet->list.array[idx]->value.present = \
3571 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
3572 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
3574 drbSetItem->dRBID = 1;
3576 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
3577 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3578 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
3582 drbSetItem->qoSInformation.choice.choice_extension->id = \
3583 ProtocolIE_ID_id_DRB_Information;
3584 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
3586 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
3587 QoSInformation_ExtIEs__value_PR_DRB_Information;
3588 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
3589 choice_extension->value.choice.DRB_Information.dRB_QoS);
3590 if(BuildQOSInforet != ROK)
3595 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
3596 choice_extension->value.choice.DRB_Information.sNSSAI);
3597 if(BuildSNSSAIret != ROK)
3601 /*Flows mapped to DRB List*/
3602 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
3603 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
3604 if(BuildFlowsMapret != ROK)
3608 /*ULUPTNLInformation To Be Setup List*/
3609 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3610 if(BuildULTnlInforet != ROK)
3615 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3617 /*UL Configuration*/
3618 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3619 if(drbSetItem->uLConfiguration == NULLP)
3623 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
3625 }/* End of BuildDRBSetup*/
3626 /*******************************************************************
3628 * @brief Deallocating memory of function BuildAndSendUESetReq
3632 * Function : FreeNrcgi
3634 * Functionality: Deallocating memory for function BuildNrcgi
3636 * @params[in] NRCGI_t *nrcgi
3640 *******************************************************************/
3641 void FreeNrcgi(NRCGI_t *nrcgi)
3643 if(nrcgi->pLMN_Identity.buf != NULLP)
3645 if(nrcgi->nRCellIdentity.buf != NULLP)
3647 DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3649 DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3652 /*******************************************************************
3654 * @brief Deallocating memory of function BuildAndSendUESetReq
3658 * Function : FreeSplCellList
3660 * Functionality: Deallocating memory for function BuildSplCellList
3662 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3667 * *****************************************************************/
3668 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3671 if(spCellLst->list.array != NULLP)
3673 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3675 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3677 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3679 if(spCellLst->list.array[cellidx]!=NULLP)
3681 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3684 DU_FREE(spCellLst->list.array,spCellLst->list.size);
3687 /*******************************************************************
3689 * @brief Deallocating memory of function BuildAndSendUESetReq
3693 * Function : FreeSRBSetup
3695 * Functionality: Deallocating memory for function BuildSRBSetup
3697 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3702 * ******************************************************************/
3703 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3706 if(srbSet->list.array != NULLP)
3708 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3710 if(srbSet->list.array[srbidx]!=NULLP)
3712 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3715 DU_FREE(srbSet->list.array,srbSet->list.size);
3718 /*******************************************************************
3720 * @brief Deallocating memory of function BuildAndSendUESetReq
3724 * Function : FreeQOSInfo
3726 * Functionality: Deallocating memory for function BuildQOSInfo
3728 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3732 * ****************************************************************/
3733 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3735 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3737 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3739 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3741 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3742 sizeof(MaxDataBurstVolume_t));
3744 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3745 sizeof(AveragingWindow_t));
3747 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3748 sizeof(NonDynamic5QIDescriptor_t));
3751 /*******************************************************************
3753 * @brief Deallocating memory of function BuildAndSendUESetReq
3757 * Function : FreeULTnlInfo
3759 * Functionality: Deallocating memory for function BuildULTnlInfo
3761 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3766 * ****************************************************************/
3767 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3770 if(ulInfo->list.array != NULLP)
3772 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3774 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3776 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3778 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3779 transportLayerAddress.buf != NULLP)
3781 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3784 DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3785 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3786 gTPTunnel->gTP_TEID.size);
3788 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3789 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3790 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3792 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3793 sizeof(GTPTunnel_t));
3796 if(ulInfo->list.array[ulidx]!=NULLP)
3798 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3801 DU_FREE(ulInfo->list.array,ulInfo->list.size);
3804 /*******************************************************************
3806 * @brief Deallocating memory for BuildAndSendUESetReq
3810 * Function : FreeDRBSetup
3812 * Functionality: Deallocating memory for BuildDRBSetup
3814 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3818 * ****************************************************************/
3819 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3821 DRBs_ToBeSetup_Item_t *drbSetItem;
3824 if(drbSet->list.array == NULLP)
3826 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3828 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
3830 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3831 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3833 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3834 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3836 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3837 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3839 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3840 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3842 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3844 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3846 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3848 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3849 flows_Mapped_To_DRB_List.list.array != NULLP)
3851 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3852 flows_Mapped_To_DRB_List.list.count; flowidx++)
3854 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3855 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3857 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3858 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3859 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3861 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3862 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3863 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3865 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3866 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3867 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3869 if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
3871 DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3873 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3874 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3875 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3876 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3877 sizeof(MaxDataBurstVolume_t));
3879 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3880 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3881 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3883 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3884 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3885 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3888 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3889 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3891 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3892 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3895 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3896 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3897 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3899 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3900 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3902 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3903 sizeof(OCTET_STRING_t));
3905 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3906 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3908 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3909 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3911 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3912 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3914 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3915 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3917 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3920 if(drbSet->list.array[drbidx]!=NULLP)
3922 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3925 DU_FREE(drbSet->list.array,drbSet->list.size);
3928 /*******************************************************************
3930 * @brief Builds and sends the UE Setup Request
3934 * Function : BuildAndSendUESetReq
3936 * Functionality: Constructs the UE Setup Request and sends
3937 * it to the CU through SCTP.
3941 * @return ROK - success
3944 * ****************************************************************/
3945 S16 BuildAndSendUESetReq()
3950 S16 BuildSplCellListret;
3951 S16 BuildSRBSetupret;
3955 F1AP_PDU_t *f1apMsg = NULL;
3956 UEContextSetupRequest_t *ueSetReq;
3957 asn_enc_rval_t encRetVal; /* Encoder return value */
3958 bool checkvar=false;
3961 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
3963 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3964 if(f1apMsg == NULLP)
3966 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3970 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
3971 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3972 if(f1apMsg->choice.initiatingMessage == NULLP)
3974 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3978 f1apMsg->choice.initiatingMessage->procedureCode = \
3979 ProcedureCode_id_UEContextSetup;
3980 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
3981 f1apMsg->choice.initiatingMessage->value.present = \
3982 InitiatingMessage__value_PR_UEContextSetupRequest;
3984 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3986 ueSetReq->protocolIEs.list.count = elementCnt;
3987 ueSetReq->protocolIEs.list.size = \
3988 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
3990 /* Initialize the UESetup members */
3991 DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3993 if(ueSetReq->protocolIEs.list.array == NULLP)
3995 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
3999 for(idx1=0; idx1<elementCnt; idx1++)
4001 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
4002 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
4010 /*GNB CU UE F1AP ID*/
4011 ueSetReq->protocolIEs.list.array[idx]->id = \
4012 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
4013 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4014 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4015 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
4016 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
4018 /*GNB DU UE F1AP ID*/
4020 ueSetReq->protocolIEs.list.array[idx]->id = \
4021 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
4022 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
4023 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4024 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
4025 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
4029 ueSetReq->protocolIEs.list.array[idx]->id = \
4030 ProtocolIE_ID_id_SpCell_ID;
4031 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4032 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4033 UEContextSetupRequestIEs__value_PR_NRCGI;
4034 BuildNrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
4035 if(BuildNrcgiret != ROK)
4040 /*Served Cell Index*/
4042 ueSetReq->protocolIEs.list.array[idx]->id = \
4043 ProtocolIE_ID_id_ServCellIndex;
4044 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4045 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4046 UEContextSetupRequestIEs__value_PR_ServCellIndex;
4047 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
4050 /*CellULConfigured*/
4052 ueSetReq->protocolIEs.list.array[idx]->id = \
4053 ProtocolIE_ID_id_SpCellULConfigured;
4054 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
4055 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4056 UEContextSetupRequestIEs__value_PR_CellULConfigured;
4057 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
4058 CellULConfigured_none;
4061 /*CUtoDURRCContainer*/
4063 ueSetReq->protocolIEs.list.array[idx]->id = \
4064 ProtocolIE_ID_id_CUtoDURRCInformation;
4065 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4066 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4067 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
4069 /*Special Cells to be SetupList*/
4071 ueSetReq->protocolIEs.list.array[idx]->id = \
4072 ProtocolIE_ID_id_SCell_ToBeSetup_List;
4073 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
4074 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4075 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
4076 BuildSplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
4077 if(BuildSplCellListret != ROK)
4081 /*SRBs To Be Setup List*/
4083 ueSetReq->protocolIEs.list.array[idx]->id = \
4084 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
4085 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4086 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4087 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
4088 BuildSRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
4089 if(BuildSRBSetupret != ROK)
4093 /*DRBs to Be Setup List*/
4095 ueSetReq->protocolIEs.list.array[idx]->id = \
4096 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
4097 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4098 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4099 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
4100 ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
4106 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4108 /* Encode the F1SetupRequest type as APER */
4109 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
4111 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
4113 /* Encode results */
4114 if(encRetVal.encoded == ENCODE_FAIL)
4116 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
4117 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4122 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
4123 for(int i=0; i< encBufSize; i++)
4125 printf("%x",encBuf[i]);
4130 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
4132 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
4138 if(f1apMsg != NULLP)
4140 if(f1apMsg->choice.initiatingMessage != NULLP)
4142 if(ueSetReq->protocolIEs.list.array != NULLP)
4144 if(idx1==elementCnt)
4146 if(BuildNrcgiret==ROK)
4148 if(BuildSplCellListret==ROK)
4150 if(BuildSRBSetupret == ROK)
4152 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.DRBs_ToBeSetup_List);
4154 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.SRBs_ToBeSetup_List);
4156 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
4159 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
4160 for(ieId=0; ieId<idx1; ieId++)
4162 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4167 for(ieId=0; ieId<idx; ieId++)
4169 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
4171 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4175 DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
4177 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4179 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
4185 }/* End of BuildAndSendUESetReq*/
4187 /*******************************************************************
4189 * @brief Handles received F1AP message and sends back response
4193 * Function : F1APMsgHdlr
4196 * - Decodes received F1AP control message
4197 * - Prepares response message, encodes and sends to SCTP
4200 * @return ROK - success
4203 * ****************************************************************/
4204 void F1APMsgHdlr(Buffer *mBuf)
4210 F1AP_PDU_t *f1apMsg;
4211 asn_dec_rval_t rval; /* Decoder return value */
4212 F1AP_PDU_t f1apasnmsg ;
4214 DU_LOG("\nF1AP : Received F1AP message buffer");
4215 SPrntMsg(mBuf, 0,0);
4217 /* Copy mBuf into char array to decode it */
4218 SFndLenMsg(mBuf, &recvBufLen);
4219 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
4221 DU_LOG("\nF1AP : Memory allocation failed");
4224 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
4226 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
4230 printf("\nF1AP : Received flat buffer to be decoded : ");
4231 for(i=0; i< recvBufLen; i++)
4233 printf("%x",recvBuf[i]);
4236 /* Decoding flat buffer into F1AP messsage */
4237 f1apMsg = &f1apasnmsg;
4238 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
4240 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
4241 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
4242 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
4244 DU_LOG("\nF1AP : ASN decode failed");
4248 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4250 switch(f1apMsg->present)
4252 case F1AP_PDU_PR_successfulOutcome:
4254 switch(f1apMsg->choice.successfulOutcome->value.present)
4256 case SuccessfulOutcome__value_PR_F1SetupResponse:
4258 #ifndef ODU_TEST_STUB
4259 procF1SetupRsp(f1apMsg);
4264 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
4266 procGNBDUCfgUpdAck(f1apMsg);
4272 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
4275 }/* End of switch(successfulOutcome) */
4278 case F1AP_PDU_PR_initiatingMessage:
4280 switch(f1apMsg->choice.initiatingMessage->value.present)
4282 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
4284 procDlRrcMsgTrans(f1apMsg);
4290 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
4291 f1apMsg->choice.initiatingMessage->value.present);
4294 }/* End of switch(initiatingMessage) */
4300 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
4304 }/* End of switch(f1apMsg->present) */
4306 } /* End of F1APMsgHdlr */
4308 /**********************************************************************
4310 **********************************************************************/