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_ToReleaseList = NULLP;
2016 tagConfig->tag_ToAddModList = NULLP;
2017 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2018 if(!tagConfig->tag_ToAddModList)
2020 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2024 elementCnt = 1; //ODU_VALUE_ONE;
2025 tagList = tagConfig->tag_ToAddModList;
2026 tagList->list.count = elementCnt;
2027 tagList->list.size = elementCnt * sizeof(struct TAG *);
2029 tagList->list.array = NULLP;
2030 DU_ALLOC(tagList->list.array, tagList->list.size);
2031 if(!tagList->list.array)
2033 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2037 for(idx=0; idx<tagList->list.count; idx++)
2039 tagList->list.array[idx] = NULLP;
2040 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2041 if(!tagList->list.array[idx])
2043 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2049 tagList->list.array[idx]->tag_Id = TAG_ID;
2050 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2055 /*******************************************************************
2057 * @brief Builds PHR Config
2061 * Function : BuildPhrConfig
2063 * Functionality: Builds phrConfig in MacCellGroupConfig
2065 * @params[in] PHR Config *
2067 * @return ROK - success
2070 * ****************************************************************/
2071 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2074 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2075 phrConfig->choice.setup = NULLP;
2076 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2077 if(!phrConfig->choice.setup)
2079 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2083 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2084 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2085 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2086 phrConfig->choice.setup->multiplePHR = false;
2087 phrConfig->choice.setup->dummy = false;
2088 phrConfig->choice.setup->phr_Type2OtherCell = false;
2089 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2094 /*******************************************************************
2096 * @brief Builds BSR Config
2100 * Function : BuildBsrConfig
2102 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2104 * @params[in] BSR_Config *bsrConfig
2106 * @return ROK - success
2109 * ****************************************************************/
2110 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2112 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2113 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2114 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2119 /*******************************************************************
2121 * @brief Builds scheduling request config
2125 * Function : BuildSchedulingReqConfig
2127 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2129 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2131 * @return ROK - success
2134 * ****************************************************************/
2135 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2137 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2138 uint8_t idx, elementCnt;
2140 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2141 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2142 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2143 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2145 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2149 elementCnt = 1; //ODU_VALUE_ONE;
2150 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2151 schReqList->list.count = elementCnt;
2152 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2154 schReqList->list.array = NULLP;
2155 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2156 if(!schReqList->list.array)
2158 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2162 for(idx=0;idx<schReqList->list.count; idx++)
2164 schReqList->list.array[idx] = NULLP;
2165 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2166 if(!schReqList->list.array[idx])
2168 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2174 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2176 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2177 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2178 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2180 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2183 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2184 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2185 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2190 /*******************************************************************
2192 * @brief Builds RLC Config
2196 * Function : BuildRlcConfig
2198 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
2200 * @params[in] RLC_Config *rlcConfig
2202 * @return ROK - success
2205 * ****************************************************************/
2206 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2209 rlcConfig->present = RLC_Config_PR_am;
2211 rlcConfig->choice.am = NULLP;
2212 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2213 if(!rlcConfig->choice.am)
2215 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2220 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2221 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2222 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2224 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2227 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2228 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2229 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2230 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2231 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
2234 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2235 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2236 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2238 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2241 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2242 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
2243 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
2248 /*******************************************************************
2250 * @brief Builds MAC LC Config
2254 * Function : BuildMacLCConfig
2256 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
2258 * @params[in] struct LogicalChannelConfig macLcConfig
2260 * @return ROK - success
2263 * ****************************************************************/
2264 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2267 macLcConfig->ul_SpecificParameters = NULLP;
2268 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2269 if(!macLcConfig->ul_SpecificParameters)
2271 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2275 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2276 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
2277 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
2278 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2279 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2280 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2281 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2283 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2284 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2285 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2287 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2290 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2292 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2293 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2294 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2296 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2299 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2301 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2302 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2303 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2308 /*******************************************************************
2310 * @brief Builds RLC Bearer to Add/Mod list
2314 * Function :BuildRlcBearerToAddModList
2316 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2318 * @params[in] rlc_BearerToAddModList
2320 * @return ROK - success
2323 * ****************************************************************/
2324 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2326 uint8_t idx, elementCnt;
2329 rlcBearerList->list.count = elementCnt;
2330 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
2332 rlcBearerList->list.array = NULLP;
2333 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2334 if(!rlcBearerList->list.array)
2336 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2340 for(idx=0; idx<rlcBearerList->list.count; idx++)
2342 rlcBearerList->list.array[idx] = NULLP;
2343 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2344 if(!rlcBearerList->list.array[idx])
2346 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2352 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
2354 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2355 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2357 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2361 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2362 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
2364 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2365 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2366 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2367 if(!rlcBearerList->list.array[idx]->rlc_Config)
2369 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2373 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2375 DU_LOG("\nF1AP : BuildRlcConfig failed");
2379 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2380 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2381 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2383 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2387 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2389 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2396 /*******************************************************************
2398 * @brief Builds intitial DL BWP
2401 * Function : BuildInitialDlBWP
2403 * Functionality: Builds intitial DL BWP in spCellCfgDed
2405 * @params[in] BWP_DownlinkDedicated_t *dlBwp
2407 * @return ROK - success
2410 * ****************************************************************/
2411 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
2417 /*******************************************************************
2419 * @brief Builds UL config
2422 * Function : BuildUlCfg
2424 * Functionality: Builds UL config in spCellCfgDed
2426 * @params[in] UplinkConfig_t *ulCfg
2428 * @return ROK - success
2431 * ****************************************************************/
2432 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
2438 /*******************************************************************
2440 * @brief Builds PDSCH serving cell config
2443 * Function : BuildPdschSrvCellCfg
2445 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
2447 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
2449 * @return ROK - success
2452 * ****************************************************************/
2453 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
2459 /*******************************************************************
2461 * @brief Builds CSI Meas config
2464 * Function : BuildCsiMeasCfg
2466 * Functionality: Builds CSI Meas config in spCellCfgDed
2468 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
2470 * @return ROK - success
2473 * ****************************************************************/
2474 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
2480 /*******************************************************************
2482 * @brief Builds Spcell config dedicated
2485 * Function : BuildSpCellCfgDed
2487 * Functionality: Builds sp cell config dedicated in spCellCfg
2489 * @params[in] ServingCellConfig_t srvCellCfg
2491 * @return ROK - success
2494 * ****************************************************************/
2495 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
2498 srvCellCfg->initialDownlinkBWP = NULLP;
2499 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2500 if(!srvCellCfg->initialDownlinkBWP)
2502 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2506 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
2508 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
2512 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
2513 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2514 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
2516 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2519 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2521 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
2522 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2523 if(!srvCellCfg->defaultDownlinkBWP_Id)
2525 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2528 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2530 srvCellCfg->uplinkConfig = NULLP;
2531 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2532 if(!srvCellCfg->uplinkConfig)
2534 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2538 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
2540 DU_LOG("\nF1AP : BuildUlCfg failed");
2544 srvCellCfg->pdsch_ServingCellConfig = NULLP;
2545 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
2546 if(!srvCellCfg->pdsch_ServingCellConfig)
2548 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2552 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
2554 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
2558 srvCellCfg->csi_MeasConfig = NULLP;
2559 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
2560 if(!srvCellCfg->csi_MeasConfig)
2562 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2566 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
2568 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
2572 srvCellCfg->tag_Id = TAG_ID;
2576 /*******************************************************************
2578 * @brief Builds Spcell config
2582 * Function : BuildSpCellCfg
2584 * Functionality: Builds sp cell config in DuToCuRrcContainer
2586 * @params[in] SpCellConfig_t spCellCfg
2588 * @return ROK - success
2591 * ****************************************************************/
2592 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
2595 spCellCfg->servCellIndex = NULLP;
2596 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
2597 if(!spCellCfg->servCellIndex)
2599 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2602 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
2604 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
2605 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2606 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
2608 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2611 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
2613 spCellCfg->spCellConfigDedicated = NULLP;
2614 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2615 if(!spCellCfg->spCellConfigDedicated)
2617 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2620 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
2622 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
2627 /*******************************************************************
2629 * @brief Builds Phy cell group config
2633 * Function : BuildPhyCellGrpCfg
2635 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
2637 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
2639 * @return ROK - success
2642 * ****************************************************************/
2643 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
2645 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
2646 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
2648 phyCellGrpCfg->p_NR_FR1 = NULLP;
2649 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2650 if(!phyCellGrpCfg->p_NR_FR1)
2652 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
2655 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
2656 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
2657 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
2658 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
2659 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
2660 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
2661 phyCellGrpCfg->cs_RNTI = NULLP;
2662 phyCellGrpCfg->ext1 = NULLP;
2663 phyCellGrpCfg->ext2 = NULLP;
2667 /*******************************************************************
2669 * @brief Builds Mac cell group config
2673 * Function : BuildMacCellGrpCfg
2675 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
2677 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
2679 * @return ROK - success
2682 * ****************************************************************/
2683 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
2685 macCellGrpCfg->drx_Config = NULLP;
2686 macCellGrpCfg->schedulingRequestConfig = NULLP;
2687 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2688 if(!macCellGrpCfg->schedulingRequestConfig)
2690 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2694 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
2696 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
2700 macCellGrpCfg->bsr_Config = NULLP;
2701 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2702 if(!macCellGrpCfg->bsr_Config)
2704 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2708 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
2710 DU_LOG("\nF1AP : BuildBsrConfig failed");
2714 macCellGrpCfg->tag_Config = NULLP;
2715 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
2716 if(!macCellGrpCfg->tag_Config)
2718 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2722 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
2724 DU_LOG("\nF1AP : BuildTagConfig failed");
2728 macCellGrpCfg->phr_Config = NULLP;
2729 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
2730 if(!macCellGrpCfg->phr_Config)
2732 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2736 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
2738 DU_LOG("\nF1AP : BuildPhrConfig failed");
2742 macCellGrpCfg->skipUplinkTxDynamic = false;
2743 macCellGrpCfg->ext1 = NULLP;
2748 /*******************************************************************
2750 * @brief Frees emmory allocated for DUToCURRCContainer
2754 * Function : FreeMemDuToCuRrcCont
2756 * Functionality: Builds DuToCuRrcContainer
2758 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
2760 * @return ROK - success
2763 * ****************************************************************/
2764 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
2767 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList;
2768 struct RLC_Config *rlcConfig;
2769 struct LogicalChannelConfig *macLcConfig;
2770 MAC_CellGroupConfig_t *macCellGrpCfg;
2771 struct SchedulingRequestConfig *schedulingRequestConfig;
2772 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2773 struct TAG_Config *tagConfig;
2774 struct TAG_Config__tag_ToAddModList *tagList;
2775 struct MAC_CellGroupConfig__phr_Config *phrConfig;
2776 PhysicalCellGroupConfig_t *phyCellGrpCfg;
2777 SpCellConfig_t *spCellCfg;
2778 ServingCellConfig_t *srvCellCfg;
2780 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
2783 if(rlcBearerList->list.array)
2785 for(idx=0; idx<rlcBearerList->list.count; idx++)
2787 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
2788 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
2791 if(rlcConfig->choice.am)
2793 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2794 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2795 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2797 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
2799 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2802 if(macLcConfig->ul_SpecificParameters)
2804 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2805 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2806 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2808 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2810 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2812 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
2814 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2817 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
2820 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
2821 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2823 if(schedulingRequestConfig)
2827 if(schReqList->list.array)
2829 for(idx=0;idx<schReqList->list.count; idx++)
2831 if(schReqList->list.array[idx])
2833 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2834 DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2837 DU_FREE(schReqList->list.array, schReqList->list.size);
2839 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
2840 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
2841 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2844 if(macCellGrpCfg->bsr_Config)
2846 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2849 tagConfig = macCellGrpCfg->tag_Config;
2850 tagList = tagConfig->tag_ToAddModList;
2855 if(tagList->list.array)
2857 for(idx=0; idx<tagList->list.count; idx++)
2859 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
2861 DU_FREE(tagList->list.array, tagList->list.size);
2863 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2865 DU_FREE(tagConfig, sizeof(struct TAG_Config));
2868 phrConfig = macCellGrpCfg->phr_Config;
2871 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
2872 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
2875 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
2878 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
2881 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2882 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
2885 spCellCfg = cellGrpCfg->spCellConfig;
2888 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
2889 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2891 srvCellCfg = spCellCfg->spCellConfigDedicated;
2894 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2895 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2896 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2897 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2898 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
2899 DU_FREE(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig));
2900 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2902 DU_FREE(spCellCfg, sizeof(SpCellConfig_t));
2906 /*******************************************************************
2908 * @brief Builds DU To CU RRC Container
2912 * Function : BuildDuToCuRrcContainer
2914 * Functionality: Builds DuToCuRrcContainer
2916 * @params[in] idx, index in F1AP msg
2917 * DuToCuRRCContainer, DuToCuRRCContainer
2919 * @return ROK - success
2922 * ****************************************************************/
2923 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
2925 CellGroupConfigRrc_t cellGrpCfg;
2926 asn_enc_rval_t encRetVal;
2927 uint8_t ret = RFAILED;
2931 cellGrpCfg.cellGroupId = CELL_GRP_ID;
2933 cellGrpCfg.rlc_BearerToAddModList = NULLP;
2934 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2935 if(!cellGrpCfg.rlc_BearerToAddModList)
2937 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2940 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
2942 DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
2946 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
2947 cellGrpCfg.mac_CellGroupConfig = NULLP;
2948 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
2949 if(!cellGrpCfg.mac_CellGroupConfig)
2951 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2954 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
2956 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
2961 cellGrpCfg.physicalCellGroupConfig = NULLP;
2962 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
2963 if(!cellGrpCfg.physicalCellGroupConfig)
2965 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2968 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
2970 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
2974 cellGrpCfg.spCellConfig = NULLP;
2975 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
2976 if(!cellGrpCfg.spCellConfig)
2978 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2981 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
2983 DU_LOG("\nF1AP : BuildSpCellCfg failed");
2987 cellGrpCfg.sCellToAddModList = NULLP;
2988 cellGrpCfg.sCellToReleaseList = NULLP;
2989 cellGrpCfg.ext1 = NULLP;
2991 /* encode cellGrpCfg into duToCuRrcContainer */
2992 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
2993 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
2995 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
2996 /* Encode results */
2997 if(encRetVal.encoded == ENCODE_FAIL)
2999 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
3000 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3005 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
3006 for(int i=0; i< encBufSize; i++)
3008 printf("%x",encBuf[i]);
3012 duToCuRrcContainer->size = encBufSize;
3013 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
3014 if(!duToCuRrcContainer->buf)
3016 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
3019 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
3023 FreeMemDuToCuRrcCont(&cellGrpCfg);
3027 /*******************************************************************
3029 * @brief Builds and sends the InitialULRRCMessage
3033 * Function : BuildAndSendInitialRrcMsgTransfer
3035 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
3036 * it to the CU through SCTP.
3040 * @return ROK - success
3043 * ****************************************************************/
3044 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
3045 uint8_t *rrcContainer)
3052 F1AP_PDU_t *f1apMsg = NULLP;
3053 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
3054 asn_enc_rval_t encRetVal;
3055 bool checkvar=false;
3058 DU_LOG("\n F1AP : Building RRC Setup Request\n");
3059 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3060 if(f1apMsg == NULLP)
3062 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3065 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
3066 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3067 if(f1apMsg->choice.initiatingMessage == NULLP)
3069 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3072 f1apMsg->choice.initiatingMessage->procedureCode =\
3073 ProcedureCode_id_InitialULRRCMessageTransfer;
3074 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
3075 f1apMsg->choice.initiatingMessage->value.present = \
3076 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
3078 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
3080 initULRRCMsg->protocolIEs.list.count = elementCnt;
3081 initULRRCMsg->protocolIEs.list.size = \
3082 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
3083 /* Initialize the F1Setup members */
3084 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3085 if(initULRRCMsg->protocolIEs.list.array == NULLP)
3087 DU_LOG(" F1AP : Memory allocation for\
3088 RRCSetupRequestMessageTransferIEs failed");
3091 for(idx=0; idx<elementCnt; idx++)
3093 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
3094 sizeof(InitialULRRCMessageTransferIEs_t));
3095 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
3101 /*GNB DU UE F1AP ID*/
3102 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3103 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
3104 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3105 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3106 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
3107 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
3112 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3113 ProtocolIE_ID_id_NRCGI;
3114 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
3115 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3116 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
3119 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
3127 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3128 ProtocolIE_ID_id_C_RNTI;
3129 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3130 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3131 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
3132 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
3136 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3137 ProtocolIE_ID_id_RRCContainer;
3138 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3139 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3140 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
3142 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size =\
3143 strlen((const char*)rrcContainer);
3144 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3145 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3146 if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3148 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
3152 memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
3153 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
3156 /*DUtoCURRCContainer*/
3158 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
3159 ProtocolIE_ID_id_DUtoCURRCContainer;
3160 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3161 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3162 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
3164 ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
3170 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3172 /* Encode the F1SetupRequest type as APER */
3173 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3175 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
3176 /* Encode results */
3177 if(encRetVal.encoded == ENCODE_FAIL)
3179 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
3180 structure (at %s)\n",encRetVal.failed_type ? \
3181 encRetVal.failed_type->name : "unknown");
3187 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
3188 Message transfer\n");
3189 for(int i=0; i< encBufSize; i++)
3191 printf("%x",encBuf[i]);
3195 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
3197 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
3204 if(f1apMsg != NULLP)
3206 if(f1apMsg->choice.initiatingMessage != NULLP)
3208 if(initULRRCMsg->protocolIEs.list.array != NULLP)
3210 if(idx == elementCnt)
3213 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
3215 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
3217 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
3218 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
3220 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
3221 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
3225 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3227 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3228 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3232 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf)
3234 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf,
3235 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.size);
3237 for(ieId=0; ieId<elementCnt; ieId++)
3239 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3244 for(ieId=0; ieId<idx; ieId++)
3246 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3249 DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3251 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3253 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3259 }/* End of BuildAndSendInitialRrcMsgTransfer*/
3261 /*******************************************************************
3263 * @brief Builds Special cell list for UE Setup Request
3267 * Function : BuildSplCellList
3269 * Functionality: Constructs the Special Cell list for UESetReq
3271 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3273 * @return ROK - success
3276 * ****************************************************************/
3277 S16 BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3283 spCellLst->list.count = cellCnt;
3284 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
3285 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
3286 if(spCellLst->list.array == NULLP)
3290 for(idx=0; idx<cellCnt; idx++)
3292 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3293 if(spCellLst->list.array[idx] == NULLP)
3299 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
3300 spCellLst->list.array[idx]->criticality = Criticality_ignore;
3301 spCellLst->list.array[idx]->value.present =\
3302 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
3303 /* Special Cell ID -NRCGI */
3304 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3309 /*Special Cell Index*/
3310 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
3312 }/* End of BuildSplCellList*/
3314 /*******************************************************************
3316 * @brief Builds SRBS to be setup
3320 * Function : BuildSRBSetup
3322 * Functionality: Constructs the SRB's for UESetReq
3324 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3326 * @return ROK - success
3329 * ****************************************************************/
3330 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3335 srbSet->list.count = srbCnt;
3336 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
3337 DU_ALLOC(srbSet->list.array,srbSet->list.size);
3338 if(srbSet->list.array == NULLP)
3342 for(idx=0; idx<srbCnt; idx++)
3344 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3345 if(srbSet->list.array[idx] == NULLP)
3351 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
3352 srbSet->list.array[idx]->criticality = Criticality_ignore;
3353 srbSet->list.array[idx]->value.present = \
3354 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
3355 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
3357 }/* End of BuildSRBSetup*/
3359 /*******************************************************************
3361 * @brief Builds QOS Info for DRB Setum Item
3365 * Function : BuildQOSInfo
3367 * Functionality: Constructs the QOS Info for DRB Setup Item
3369 * @params[in] QoSInformation_t *qosinfo
3371 * @return ROK - success
3374 * ****************************************************************/
3375 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3377 /* NonDynamic5QIDescriptor */
3378 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
3379 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3380 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
3385 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
3387 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3388 sizeof(AveragingWindow_t));
3389 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
3394 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
3395 /*MaxDataBurstVolume*/
3396 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3397 sizeof(MaxDataBurstVolume_t));
3398 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
3403 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
3405 /*nRGRAN Allocation Retention Priority*/
3406 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
3407 PriorityLevel_highest;
3408 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
3409 Pre_emptionCapability_may_trigger_pre_emption;
3410 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
3411 Pre_emptionVulnerability_not_pre_emptable;
3413 /* TO DO: GBR_QoSFlowInformation */
3415 }/*End of BuildQOSInfo*/
3417 /*******************************************************************
3419 * @brief Builds SNSSAI
3423 * Function : BuildSNSSAI
3425 * Functionality: Constructs the SNSSAI For DRB list
3427 * @params[in] SNSSAI_t *snssai
3429 * @return ROK - success
3432 * ****************************************************************/
3433 S16 BuildSNSSAI(SNSSAI_t *snssai)
3437 snssai->sST.size = sizeof(U8);
3438 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
3439 if(snssai->sST.buf == NULLP)
3443 snssai->sST.buf[0] = 3;
3445 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
3446 if(snssai->sD == NULLP)
3450 snssai->sD->size = 3*sizeof(U8);
3451 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
3452 if(snssai->sD->buf == NULLP)
3456 snssai->sD->buf[0] = 3;
3457 snssai->sD->buf[1] = 6;
3458 snssai->sD->buf[2] = 9;
3460 }/*End of BuildSNSSAI*/
3462 /*******************************************************************
3464 * @brief Builds the flow map.
3468 * Function : BuildFlowsMap
3470 * Functionality: Constructs the flowmap For DRB list
3472 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
3474 * @return ROK - success
3477 * ****************************************************************/
3478 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
3484 flowMap->list.count = flowCnt;
3485 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
3486 DU_ALLOC(flowMap->list.array,flowMap->list.size);
3487 if(flowMap->list.array == NULLP)
3491 for(idx=0; idx<flowCnt; idx++)
3493 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
3494 if(flowMap->list.array[idx] == NULLP)
3500 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
3501 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
3507 }/*End of BuildFlowsMap*/
3509 /*******************************************************************
3511 * @brief Builds the Uplink Tunnel Info
3515 * Function : BuildULTnlInfo
3517 * Functionality: Constructs the UL TnlInfo For DRB list
3519 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3521 * @return ROK - success
3524 * ****************************************************************/
3525 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3530 ulInfo->list.count = ulCnt;
3531 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
3532 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
3533 if(ulInfo->list.array == NULLP)
3537 for(idx=0; idx<ulCnt; idx++)
3539 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3540 if(ulInfo->list.array[idx] == NULLP)
3546 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
3547 UPTransportLayerInformation_PR_gTPTunnel;
3549 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
3550 sizeof(GTPTunnel_t));
3551 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
3555 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3556 transportLayerAddress.size = 4*sizeof(U8);
3557 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3558 transportLayerAddress.buf,ulInfo->list.array[idx]->\
3559 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3560 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3561 transportLayerAddress.buf == NULLP)
3565 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3566 transportLayerAddress.buf[0] = 4;
3567 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3568 transportLayerAddress.buf[1] = 4;
3569 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3570 transportLayerAddress.buf[2] = 4;
3571 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3572 transportLayerAddress.buf[3] = 5;
3573 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3574 transportLayerAddress.bits_unused = 0;
3576 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
3578 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3579 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
3580 gTPTunnel->gTP_TEID.size);
3581 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3586 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3587 gTP_TEID.buf[0] = 11;
3588 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3589 gTP_TEID.buf[1] = 0;
3590 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3591 gTP_TEID.buf[2] = 0;
3592 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3593 gTP_TEID.buf[3] = 1;
3596 }/*End of BuildULTnlInfo*/
3598 /*******************************************************************
3600 * @brief Builds DRBS to be setup
3604 * Function : BuildDRBSetup
3606 * Functionality: Constructs the DRB's for UESetReq
3608 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3610 * @return ROK - success
3613 * ****************************************************************/
3614 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3616 S16 BuildQOSInforet;
3618 S16 BuildFlowsMapret;
3621 DRBs_ToBeSetup_Item_t *drbSetItem;
3623 drbSet->list.count = drbCnt;
3624 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
3625 DU_ALLOC(drbSet->list.array,drbSet->list.size);
3626 if(drbSet->list.array == NULLP)
3630 for(idx=0; idx<drbCnt; idx++)
3632 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3633 if(drbSet->list.array[idx] == NULLP)
3639 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
3640 drbSet->list.array[idx]->criticality = Criticality_ignore;
3641 drbSet->list.array[idx]->value.present = \
3642 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
3643 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
3645 drbSetItem->dRBID = 1;
3647 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
3648 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3649 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
3653 drbSetItem->qoSInformation.choice.choice_extension->id = \
3654 ProtocolIE_ID_id_DRB_Information;
3655 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
3657 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
3658 QoSInformation_ExtIEs__value_PR_DRB_Information;
3659 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
3660 choice_extension->value.choice.DRB_Information.dRB_QoS);
3661 if(BuildQOSInforet != ROK)
3666 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
3667 choice_extension->value.choice.DRB_Information.sNSSAI);
3668 if(BuildSNSSAIret != ROK)
3672 /*Flows mapped to DRB List*/
3673 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
3674 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
3675 if(BuildFlowsMapret != ROK)
3679 /*ULUPTNLInformation To Be Setup List*/
3680 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3681 if(BuildULTnlInforet != ROK)
3686 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3688 /*UL Configuration*/
3689 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3690 if(drbSetItem->uLConfiguration == NULLP)
3694 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
3696 }/* End of BuildDRBSetup*/
3697 /*******************************************************************
3699 * @brief Deallocating memory of function BuildAndSendUESetReq
3703 * Function : FreeNrcgi
3705 * Functionality: Deallocating memory for function BuildNrcgi
3707 * @params[in] NRCGI_t *nrcgi
3711 *******************************************************************/
3712 void FreeNrcgi(NRCGI_t *nrcgi)
3714 if(nrcgi->pLMN_Identity.buf != NULLP)
3716 if(nrcgi->nRCellIdentity.buf != NULLP)
3718 DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
3720 DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3723 /*******************************************************************
3725 * @brief Deallocating memory of function BuildAndSendUESetReq
3729 * Function : FreeSplCellList
3731 * Functionality: Deallocating memory for function BuildSplCellList
3733 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3738 * *****************************************************************/
3739 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3742 if(spCellLst->list.array != NULLP)
3744 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3746 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3748 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3750 if(spCellLst->list.array[cellidx]!=NULLP)
3752 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3755 DU_FREE(spCellLst->list.array,spCellLst->list.size);
3758 /*******************************************************************
3760 * @brief Deallocating memory of function BuildAndSendUESetReq
3764 * Function : FreeSRBSetup
3766 * Functionality: Deallocating memory for function BuildSRBSetup
3768 * @params[in] SRBs_ToBeSetup_List_t *srbSet
3773 * ******************************************************************/
3774 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3777 if(srbSet->list.array != NULLP)
3779 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3781 if(srbSet->list.array[srbidx]!=NULLP)
3783 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3786 DU_FREE(srbSet->list.array,srbSet->list.size);
3789 /*******************************************************************
3791 * @brief Deallocating memory of function BuildAndSendUESetReq
3795 * Function : FreeQOSInfo
3797 * Functionality: Deallocating memory for function BuildQOSInfo
3799 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3803 * ****************************************************************/
3804 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3806 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3808 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3810 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3812 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3813 sizeof(MaxDataBurstVolume_t));
3815 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3816 sizeof(AveragingWindow_t));
3818 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3819 sizeof(NonDynamic5QIDescriptor_t));
3822 /*******************************************************************
3824 * @brief Deallocating memory of function BuildAndSendUESetReq
3828 * Function : FreeULTnlInfo
3830 * Functionality: Deallocating memory for function BuildULTnlInfo
3832 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3837 * ****************************************************************/
3838 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3841 if(ulInfo->list.array != NULLP)
3843 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3845 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3847 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3849 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3850 transportLayerAddress.buf != NULLP)
3852 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3855 DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3856 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3857 gTPTunnel->gTP_TEID.size);
3859 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3860 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3861 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3863 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3864 sizeof(GTPTunnel_t));
3867 if(ulInfo->list.array[ulidx]!=NULLP)
3869 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3872 DU_FREE(ulInfo->list.array,ulInfo->list.size);
3875 /*******************************************************************
3877 * @brief Deallocating memory for BuildAndSendUESetReq
3881 * Function : FreeDRBSetup
3883 * Functionality: Deallocating memory for BuildDRBSetup
3885 * @params[in] DRBs_ToBeSetup_List_t *drbSet
3889 * ****************************************************************/
3890 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3892 DRBs_ToBeSetup_Item_t *drbSetItem;
3895 if(drbSet->list.array == NULLP)
3897 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3899 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
3901 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3902 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3904 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3905 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3907 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3908 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3910 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3911 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3913 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3915 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3917 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3919 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3920 flows_Mapped_To_DRB_List.list.array != NULLP)
3922 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3923 flows_Mapped_To_DRB_List.list.count; flowidx++)
3925 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3926 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3928 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3929 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3930 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3932 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3933 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3934 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3936 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3937 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3938 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3940 if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
3942 DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3944 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3945 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3946 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3947 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3948 sizeof(MaxDataBurstVolume_t));
3950 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3951 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3952 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3954 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3955 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3956 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3959 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3960 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3962 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3963 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3966 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3967 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3968 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3970 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3971 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3973 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3974 sizeof(OCTET_STRING_t));
3976 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3977 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3979 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3980 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3982 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3983 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3985 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3986 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3988 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3991 if(drbSet->list.array[drbidx]!=NULLP)
3993 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3996 DU_FREE(drbSet->list.array,drbSet->list.size);
3999 /*******************************************************************
4001 * @brief Builds and sends the UE Setup Request
4005 * Function : BuildAndSendUESetReq
4007 * Functionality: Constructs the UE Setup Request and sends
4008 * it to the CU through SCTP.
4012 * @return ROK - success
4015 * ****************************************************************/
4016 S16 BuildAndSendUESetReq()
4021 S16 BuildSplCellListret;
4022 S16 BuildSRBSetupret;
4026 F1AP_PDU_t *f1apMsg = NULL;
4027 UEContextSetupRequest_t *ueSetReq;
4028 asn_enc_rval_t encRetVal; /* Encoder return value */
4029 bool checkvar=false;
4032 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
4034 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
4035 if(f1apMsg == NULLP)
4037 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
4041 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
4042 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4043 if(f1apMsg->choice.initiatingMessage == NULLP)
4045 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
4049 f1apMsg->choice.initiatingMessage->procedureCode = \
4050 ProcedureCode_id_UEContextSetup;
4051 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
4052 f1apMsg->choice.initiatingMessage->value.present = \
4053 InitiatingMessage__value_PR_UEContextSetupRequest;
4055 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
4057 ueSetReq->protocolIEs.list.count = elementCnt;
4058 ueSetReq->protocolIEs.list.size = \
4059 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
4061 /* Initialize the UESetup members */
4062 DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
4064 if(ueSetReq->protocolIEs.list.array == NULLP)
4066 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
4070 for(idx1=0; idx1<elementCnt; idx1++)
4072 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
4073 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
4081 /*GNB CU UE F1AP ID*/
4082 ueSetReq->protocolIEs.list.array[idx]->id = \
4083 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
4084 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4085 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4086 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
4087 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
4089 /*GNB DU UE F1AP ID*/
4091 ueSetReq->protocolIEs.list.array[idx]->id = \
4092 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
4093 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
4094 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4095 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
4096 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
4100 ueSetReq->protocolIEs.list.array[idx]->id = \
4101 ProtocolIE_ID_id_SpCell_ID;
4102 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4103 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4104 UEContextSetupRequestIEs__value_PR_NRCGI;
4105 BuildNrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
4106 if(BuildNrcgiret != ROK)
4111 /*Served Cell Index*/
4113 ueSetReq->protocolIEs.list.array[idx]->id = \
4114 ProtocolIE_ID_id_ServCellIndex;
4115 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4116 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4117 UEContextSetupRequestIEs__value_PR_ServCellIndex;
4118 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
4121 /*CellULConfigured*/
4123 ueSetReq->protocolIEs.list.array[idx]->id = \
4124 ProtocolIE_ID_id_SpCellULConfigured;
4125 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
4126 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4127 UEContextSetupRequestIEs__value_PR_CellULConfigured;
4128 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
4129 CellULConfigured_none;
4132 /*CUtoDURRCContainer*/
4134 ueSetReq->protocolIEs.list.array[idx]->id = \
4135 ProtocolIE_ID_id_CUtoDURRCInformation;
4136 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4137 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4138 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
4140 /*Special Cells to be SetupList*/
4142 ueSetReq->protocolIEs.list.array[idx]->id = \
4143 ProtocolIE_ID_id_SCell_ToBeSetup_List;
4144 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
4145 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4146 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
4147 BuildSplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
4148 if(BuildSplCellListret != ROK)
4152 /*SRBs To Be Setup List*/
4154 ueSetReq->protocolIEs.list.array[idx]->id = \
4155 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
4156 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4157 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4158 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
4159 BuildSRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
4160 if(BuildSRBSetupret != ROK)
4164 /*DRBs to Be Setup List*/
4166 ueSetReq->protocolIEs.list.array[idx]->id = \
4167 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
4168 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
4169 ueSetReq->protocolIEs.list.array[idx]->value.present = \
4170 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
4171 ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
4177 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4179 /* Encode the F1SetupRequest type as APER */
4180 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
4182 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
4184 /* Encode results */
4185 if(encRetVal.encoded == ENCODE_FAIL)
4187 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
4188 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4193 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
4194 for(int i=0; i< encBufSize; i++)
4196 printf("%x",encBuf[i]);
4201 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
4203 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
4209 if(f1apMsg != NULLP)
4211 if(f1apMsg->choice.initiatingMessage != NULLP)
4213 if(ueSetReq->protocolIEs.list.array != NULLP)
4215 if(idx1==elementCnt)
4217 if(BuildNrcgiret==ROK)
4219 if(BuildSplCellListret==ROK)
4221 if(BuildSRBSetupret == ROK)
4223 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.DRBs_ToBeSetup_List);
4225 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.SRBs_ToBeSetup_List);
4227 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
4230 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
4231 for(ieId=0; ieId<idx1; ieId++)
4233 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4238 for(ieId=0; ieId<idx; ieId++)
4240 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
4242 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4246 DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
4248 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4250 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
4256 }/* End of BuildAndSendUESetReq*/
4258 /*******************************************************************
4260 * @brief Handles received F1AP message and sends back response
4264 * Function : F1APMsgHdlr
4267 * - Decodes received F1AP control message
4268 * - Prepares response message, encodes and sends to SCTP
4271 * @return ROK - success
4274 * ****************************************************************/
4275 void F1APMsgHdlr(Buffer *mBuf)
4281 F1AP_PDU_t *f1apMsg;
4282 asn_dec_rval_t rval; /* Decoder return value */
4283 F1AP_PDU_t f1apasnmsg ;
4285 DU_LOG("\nF1AP : Received F1AP message buffer");
4286 SPrntMsg(mBuf, 0,0);
4288 /* Copy mBuf into char array to decode it */
4289 SFndLenMsg(mBuf, &recvBufLen);
4290 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
4292 DU_LOG("\nF1AP : Memory allocation failed");
4295 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
4297 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
4301 printf("\nF1AP : Received flat buffer to be decoded : ");
4302 for(i=0; i< recvBufLen; i++)
4304 printf("%x",recvBuf[i]);
4307 /* Decoding flat buffer into F1AP messsage */
4308 f1apMsg = &f1apasnmsg;
4309 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
4311 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
4312 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
4313 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
4315 DU_LOG("\nF1AP : ASN decode failed");
4319 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4321 switch(f1apMsg->present)
4323 case F1AP_PDU_PR_successfulOutcome:
4325 switch(f1apMsg->choice.successfulOutcome->value.present)
4327 case SuccessfulOutcome__value_PR_F1SetupResponse:
4329 #ifndef ODU_TEST_STUB
4330 procF1SetupRsp(f1apMsg);
4335 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
4337 procGNBDUCfgUpdAck(f1apMsg);
4343 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
4346 }/* End of switch(successfulOutcome) */
4349 case F1AP_PDU_PR_initiatingMessage:
4351 switch(f1apMsg->choice.initiatingMessage->value.present)
4353 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
4355 procDlRrcMsgTrans(f1apMsg);
4361 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
4362 f1apMsg->choice.initiatingMessage->value.present);
4365 }/* End of switch(initiatingMessage) */
4371 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
4375 }/* End of switch(f1apMsg->present) */
4377 } /* End of F1APMsgHdlr */
4379 /**********************************************************************
4381 **********************************************************************/