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 "ControlResourceSet.h"
43 #include "SearchSpace.h"
44 #include "PDCCH-Config.h"
45 #include "PDSCH-TimeDomainResourceAllocation.h"
46 #include "PDSCH-TimeDomainResourceAllocationList.h"
47 #include "DMRS-DownlinkConfig.h"
48 #include "PDSCH-Config.h"
49 #include "BWP-DownlinkDedicated.h"
50 #include "PUSCH-TimeDomainResourceAllocation.h"
51 #include "PUSCH-TimeDomainResourceAllocationList.h"
52 #include "DMRS-UplinkConfig.h"
53 #include "PUSCH-Config.h"
54 #include "SRS-ResourceId.h"
55 #include "SRS-Resource.h"
56 #include "SRS-ResourceSet.h"
57 #include "SRS-Config.h"
58 #include "BWP-UplinkDedicated.h"
59 #include "PUSCH-ServingCellConfig.h"
60 #include "UplinkConfig.h"
61 #include "PDSCH-ServingCellConfig.h"
62 #include "DUtoCURRCContainer.h"
64 extern char encBuf[ENC_BUF_MAX_LEN];
65 extern DuCfgParams duCfgParam;
66 uint8_t BuildULTnlInforet=RFAILED;
67 uint8_t ServedCellListreturn=RFAILED;
68 S16 sctpSend(Buffer *mBuf, U8 itfType);
69 uint8_t Nrcgiret=RFAILED;
70 uint8_t SplCellListret=RFAILED;
71 uint8_t SRBSetupret=RFAILED;
72 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp);
74 /*******************************************************************
76 * @brief Builds Uplink Info for NR
80 * Function : BuildULNRInfo
82 * Functionality: Building NR Uplink Info
84 * @params[in] NRFreqInfo_t *ulnrfreq
85 * @return ROK - success
88 * ****************************************************************/
89 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
92 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
93 fdd.ulNrFreqInfo.nrArfcn;
94 ulnrfreq->freqBandListNr.list.count = 1;
95 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
96 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
97 if(ulnrfreq->freqBandListNr.list.array == NULLP)
101 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
103 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
104 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
109 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
110 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
111 freqBand[0].nrFreqBand;
112 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
115 /*******************************************************************
117 * @brief Builds Downlink NR Info
121 * Function : BuildDLNRInfo
123 * Functionality: Building Downlink NR Info
125 * @params[in] NRFreqInfo_t *dlnrfreq
126 * @return ROK - success
129 * ****************************************************************/
130 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
133 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
134 fdd.dlNrFreqInfo.nrArfcn;
135 dlnrfreq->freqBandListNr.list.count = 1;
136 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
137 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
138 if(dlnrfreq->freqBandListNr.list.array == NULLP)
142 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
144 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
145 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
150 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
151 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
152 freqBand[0].nrFreqBand;
153 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
158 /*******************************************************************
160 * @brief Builds Nrcgi
164 * Function : BuildNrcgi
166 * Functionality: Building the PLMN ID and NR Cell id
168 * @params[in] NRCGI_t *nrcgi
169 * @return ROK - success
172 * ****************************************************************/
173 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
177 uint8_t byteSize = 5;
179 /* Allocate Buffer Memory */
180 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
181 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
182 if(nrcgi->pLMN_Identity.buf == NULLP)
186 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
187 &nrcgi->pLMN_Identity); // Building PLMN function
193 //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
194 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
195 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
196 if(nrcgi->nRCellIdentity.buf == NULLP)
200 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
207 /*******************************************************************
209 * @brief Builds FiveGStac
213 * Function : BuildFiveGSTac
215 * Functionality: Building the FiveGSTac
217 * @params[in] OCTET_STRING_t *fivegsTac
218 * @return ROK - success
221 * ****************************************************************/
222 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
224 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
225 if(servcell->fiveGS_TAC == NULLP)
229 servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
230 DU_ALLOC(servcell->fiveGS_TAC->buf,\
231 sizeof(servcell->fiveGS_TAC->size));
232 if(servcell->fiveGS_TAC->buf == NULLP)
236 servcell->fiveGS_TAC->buf[0] = 0;
237 servcell->fiveGS_TAC->buf[1] = 0;
238 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
241 /*******************************************************************
243 * @brief Builds NR Mode
247 * Function : BuildNrMode
249 * Functionality: Building the NR Mode
251 * @params[in] NR_Mode_Info_t *fdd
252 * @return ROK - success
255 * ****************************************************************/
256 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
258 uint8_t BuildDLNRInforet=0;
259 uint8_t BuildULNRInforet=0;
261 mode->present = NR_Mode_Info_PR_fDD;
262 if(mode->present == NR_Mode_Info_PR_fDD)
264 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
265 if(mode->choice.fDD == NULLP)
269 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
270 if(BuildULNRInforet != ROK)
274 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
275 if(BuildDLNRInforet != ROK)
280 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
281 duCfgParam.srvdCellLst[0].duCellInfo.\
282 f1Mode.mode.fdd.ulTxBw.nrScs;
283 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
284 duCfgParam.srvdCellLst[0].duCellInfo.\
285 f1Mode.mode.fdd.ulTxBw.nrb;
286 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
287 duCfgParam.srvdCellLst[0].duCellInfo.\
288 f1Mode.mode.fdd.dlTxBw.nrScs;
289 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
290 duCfgParam.srvdCellLst[0].duCellInfo.\
291 f1Mode.mode.fdd.dlTxBw.nrb;
294 /*******************************************************************
296 * @brief Builds IE Extensions for Served PLMNs
300 * Function : BuildExtensions
302 * Functionality: Building the IE Extensions
304 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
305 * @return ROK - success
308 * ****************************************************************/
309 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
313 uint8_t extensionCnt=1;
316 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
317 if((*ieExtend) == NULLP)
321 (*ieExtend)->list.count = extensionCnt;
322 (*ieExtend)->list.size = \
323 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
324 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
325 if((*ieExtend)->list.array == NULLP)
329 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
331 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
332 sizeof(ServedPLMNs_ItemExtIEs_t));
333 if((*ieExtend)->list.array[plmnidx] == NULLP)
339 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
340 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
341 (*ieExtend)->list.array[idx]->extensionValue.present = \
342 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
343 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
345 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
346 list.size = sizeof(SliceSupportItem_t *);
347 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
348 list.array,sizeof(SliceSupportItem_t *));
349 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
354 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
355 list.array[sliceId],sizeof(SliceSupportItem_t));
356 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
357 list.array[sliceId] == NULLP)
361 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
362 list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
363 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
364 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
365 extensionValue.choice.SliceSupportList.\
366 list.array[sliceId]->sNSSAI.sST.size);
367 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
368 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
372 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
373 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
374 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
375 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
376 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
377 list.array[sliceId]->sNSSAI.sD == NULLP)
381 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
382 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
383 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
384 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
385 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
386 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
387 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
392 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
393 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
395 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
396 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
398 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
399 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
402 /*******************************************************************
404 * @brief Builds Served PLMN
408 * Function : BuildServedPlmn
410 * Functionality: Building the Served PLMN
412 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
413 * @return ROK - success
416 * ****************************************************************/
417 uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
420 uint8_t servPlmnCnt=1;
421 uint8_t buildPlmnIdret=0;
422 uint8_t BuildExtensionsret=0;
423 srvplmn->list.count = servPlmnCnt;
424 srvplmn->list.size = \
425 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
426 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
427 if(srvplmn->list.array == NULLP)
431 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
433 DU_ALLOC(srvplmn->list.array[plmnidx],\
434 sizeof(ServedPLMNs_Item_t));
435 if(srvplmn->list.array[plmnidx] == NULLP)
440 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
441 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
442 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
443 &srvplmn->list.array[0]->pLMN_Identity);
444 if(buildPlmnIdret!= ROK)
448 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
449 if(BuildExtensionsret!= ROK)
455 /*******************************************************************
457 * @brief Builds Served Cell List
461 * Function : BuildServedCellList
463 * Functionality: Building Served Cell List
465 * @params[in] PLMNID plmn
466 * @return ROK - success
469 * ****************************************************************/
471 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
473 uint8_t BuildNrcgiret=0;
474 uint8_t BuildFiveGSTacret=0;
475 uint8_t BuildServedPlmnret=0;
476 uint8_t BuildNrModeret=0;
480 GNB_DU_Served_Cells_Item_t *srvCellItem;
481 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
482 duServedCell->list.count = plmnCnt;
484 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
485 if(duServedCell->list.array == NULLP)
489 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
491 DU_ALLOC(duServedCell->list.array[plmnidx],\
492 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
493 if(duServedCell->list.array[plmnidx] == NULLP)
499 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
500 duServedCell->list.array[idx]->criticality = Criticality_reject;
501 duServedCell->list.array[idx]->value.present = \
502 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
504 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
506 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
507 if(BuildNrcgiret != ROK)
512 srvCellItem->served_Cell_Information.nRPCI = \
513 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
516 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
517 if(BuildFiveGSTacret != ROK)
522 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
523 if(BuildServedPlmnret !=ROK)
527 /*nR Mode Info with FDD*/
528 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
529 if(BuildNrModeret != ROK)
533 /*Measurement timing Config*/
534 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
535 size = sizeof(uint8_t);
536 DU_ALLOC(srvCellItem->served_Cell_Information.\
537 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
538 if(srvCellItem->served_Cell_Information.\
539 measurementTimingConfiguration.buf == NULLP)
543 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
544 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
546 /* GNB DU System Information */
547 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
548 sizeof(GNB_DU_System_Information_t));
549 if(!srvCellItem->gNB_DU_System_Information)
554 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
555 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
556 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
557 srvCellItem->gNB_DU_System_Information->mIB_message.size);
558 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
562 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
563 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
566 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
567 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
569 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
570 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
571 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
575 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
577 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
578 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
582 /*******************************************************************
584 * @brief Builds RRC Version
588 * Function : BuildRrcVer
590 * Functionality: Building RRC Version
592 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
593 * @return ROK - success
596 * ****************************************************************/
597 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
601 rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
602 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
603 if(rrcVer->latest_RRC_Version.buf == NULLP)
607 rrcVer->latest_RRC_Version.buf[0] = 0;
608 rrcVer->latest_RRC_Version.bits_unused = 5;
609 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
610 if(rrcVer->iE_Extensions == NULLP)
614 rrcVer->iE_Extensions->list.count = 1;
615 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
616 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
617 if(rrcVer->iE_Extensions->list.array == NULLP)
622 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
623 sizeof(RRC_Version_ExtIEs_t));
624 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
628 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
629 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
630 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
631 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
632 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
633 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
634 .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
635 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
636 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
637 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
638 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
639 .Latest_RRC_Version_Enhanced.buf == NULLP)
644 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
645 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
647 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
648 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
650 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
651 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
654 /*******************************************************************
656 * @brief Sends F1 msg over SCTP
660 * Function : SendF1APMsg
662 * Functionality: Sends F1 msg over SCTP
664 * @params[in] Region region
666 * @return ROK - success
669 * ****************************************************************/
670 uint8_t SendF1APMsg(Region region, Pool pool)
674 if(SGetMsg(region, pool, &mBuf) == ROK)
676 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
680 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
682 DU_LOG("\nF1AP : SCTP Send failed");
689 DU_LOG("\nF1AP : SAddPstMsgMult failed");
697 DU_LOG("\nF1AP : Failed to allocate memory");
703 /*******************************************************************
705 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
709 * Function : FreeRrcVer
711 * Functionality: deallocating the memory of function BuildRrcVer
713 * @params[in] RRC_Version_t *rrcVer
717 *****************************************************************/
718 void FreeRrcVer(RRC_Version_t *rrcVer)
720 if(rrcVer->latest_RRC_Version.buf != NULLP)
722 if(rrcVer->iE_Extensions != NULLP)
724 if(rrcVer->iE_Extensions->list.array != NULLP)
726 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
728 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
731 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
732 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
733 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
735 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
737 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
739 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
741 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
744 /*******************************************************************
746 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
750 * Function : FreeServedCellList
752 * Functionality: deallocating the memory of function BuildServedCellList
755 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
759 * ****************************************************************/
760 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
766 uint8_t extensionCnt=1;
768 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
769 if(duServedCell->list.array!=NULLP)
771 if(duServedCell->list.array[0]!=NULLP)
773 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
775 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
777 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
779 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
781 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
783 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
785 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
787 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
789 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
791 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
793 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
794 extensionValue.choice.SliceSupportList.list.array!=NULLP)
796 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
797 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
799 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
800 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
802 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
803 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
805 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
806 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
808 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
810 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
811 freqBandListNr.list.array!=NULLP)
813 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
814 freqBandListNr.list.array[0]!=NULLP)
816 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
817 freqBandListNr.list.array)
819 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
820 freqBandListNr.list.array[0]!=NULLP)
822 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
824 if(!srvCellItem->gNB_DU_System_Information)
826 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
828 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
830 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
831 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
832 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
833 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
835 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
836 srvCellItem->gNB_DU_System_Information->mIB_message.size);
837 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
838 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
840 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
842 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
843 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
845 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
846 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
848 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
849 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
851 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
852 list.array[0],sizeof(FreqBandNrItem_t));
854 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
855 list.array,sizeof(FreqBandNrItem_t*));
857 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
859 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
860 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
861 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
862 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
864 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
865 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
866 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
868 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
869 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
870 sNSSAI.sST.buf,sizeof(uint8_t));
872 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
873 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
875 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
876 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
878 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
879 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
881 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
882 array[servId]->iE_Extensions->list.array,\
883 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
885 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
886 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
888 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
889 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
890 servedPLMNs.list.array[servId]->pLMN_Identity.size
893 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
894 sizeof(ServedPLMNs_Item_t *));
896 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
897 sizeof(ServedPLMNs_Item_t *));
899 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
900 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
902 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
904 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
905 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
908 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
909 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
912 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
914 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
917 /*******************************************************************
919 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
923 * Function : FreeF1SetupReq
925 * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
927 * @params[in] F1AP_PDU_t *f1apMsg
931 * ****************************************************************/
932 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
936 F1SetupRequest_t *f1SetupReq=NULLP;
941 if(f1apMsg->choice.initiatingMessage != NULLP)
943 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
944 if(f1SetupReq->protocolIEs.list.array != NULLP)
946 if(f1SetupReq->protocolIEs.list.array[idx1]!=NULLP)
948 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf != NULLP)
951 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf != NULLP)
954 if(ServedCellListreturn == ROK)
956 FreeRrcVer(&f1SetupReq->protocolIEs.list.array[idx1]->value.choice.RRC_Version);
959 FreeServedCellList(&f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Served_Cells_List);
961 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf,
962 strlen((char *)duCfgParam.duName));
965 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
966 f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
969 for(idx=0; idx<f1SetupReq->protocolIEs.list.count; idx++)
971 if(f1SetupReq->protocolIEs.list.array[idx]!=NULLP)
973 DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
976 DU_FREE(f1SetupReq->protocolIEs.list.array,\
977 f1SetupReq->protocolIEs.list.size);
979 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
981 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
985 /*******************************************************************
987 * @brief Builds and Send the F1SetupRequest
991 * Function : BuildAndSendF1SetupReq
993 * Functionality:Fills the F1SetupRequest
995 * @return ROK - success
998 ******************************************************************/
999 uint8_t BuildAndSendF1SetupReq()
1004 uint8_t elementCnt=0;
1005 F1AP_PDU_t *f1apMsg = NULLP;
1006 F1SetupRequest_t *f1SetupReq=NULLP;
1007 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1008 RRC_Version_t *rrcVer=NULLP;
1009 asn_enc_rval_t encRetVal; /* Encoder return value */
1010 uint8_t ret= RFAILED;
1011 uint8_t BuildRrcVerreturn=0;
1013 DU_LOG("\nF1AP : Building F1 Setup Request\n");
1016 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1017 if(f1apMsg == NULLP)
1021 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1022 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1023 if(f1apMsg->choice.initiatingMessage == NULLP)
1027 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1028 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1029 f1apMsg->choice.initiatingMessage->value.present = \
1030 InitiatingMessage__value_PR_F1SetupRequest;
1032 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1034 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1036 f1SetupReq->protocolIEs.list.count = elementCnt;
1037 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1039 /* Initialize the F1Setup members */
1040 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1041 if(f1SetupReq->protocolIEs.list.array == NULLP)
1045 for(idx=0; idx<elementCnt; idx++)
1047 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
1048 sizeof(F1SetupRequestIEs_t));
1049 if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
1057 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
1058 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1059 f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
1060 F1SetupRequestIEs__value_PR_TransactionID;
1061 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
1066 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
1067 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1068 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1069 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1070 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
1073 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
1074 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
1075 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
1081 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
1085 if(duCfgParam.duName != NULL)
1088 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
1089 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
1090 f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1091 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
1092 strlen((char *)duCfgParam.duName);
1093 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
1094 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1095 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
1100 strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
1101 choice.GNB_DU_Name.buf,
1102 (char*)&duCfgParam.duName);
1106 /*Served Cell list */
1108 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1109 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1110 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1111 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1112 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1113 duServedCell = &f1SetupReq->protocolIEs.list.\
1114 array[idx2]->value.choice.GNB_DU_Served_Cells_List;
1115 ServedCellListreturn = BuildServedCellList(duServedCell);
1116 if(ServedCellListreturn != ROK)
1122 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1123 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1124 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1125 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1126 F1SetupRequestIEs__value_PR_RRC_Version;
1127 rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1128 BuildRrcVerreturn = BuildRrcVer(rrcVer);
1129 if(BuildRrcVerreturn != ROK)
1133 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1135 /* Encode the F1SetupRequest type as APER */
1136 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1138 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1141 /* Encode results */
1142 if(encRetVal.encoded == ENCODE_FAIL)
1144 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1145 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1150 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1151 for(i=0; i< encBufSize; i++)
1153 printf("%x",encBuf[i]);
1158 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1160 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1168 FreeF1SetupReq(f1apMsg);
1171 }/* End of BuildAndSendF1SetupReq */
1173 /*******************************************************************
1175 * @brief Builds and sends the DUConfigUpdate
1179 * Function : BuildAndSendDUConfigUpdate
1181 * Functionality: Constructs the DU Update message and sends
1182 * it to the CU through SCTP.
1184 * @params[in] void **buf,Buffer to which encoded pattern is written into
1185 * @params[in] int *size,size of buffer
1187 * @return ROK - success
1190 * ****************************************************************/
1191 uint8_t BuildAndSendDUConfigUpdate()
1200 uint8_t servPlmnCnt;
1201 uint8_t extensionCnt;
1202 asn_enc_rval_t encRetVal; /* Encoder return value */
1203 F1AP_PDU_t *f1apDuCfg = NULL;
1204 GNBDUConfigurationUpdate_t *duCfgUpdate;
1205 Served_Cells_To_Modify_List_t *cellsToModify;
1206 Served_Cells_To_Modify_Item_t *modifyItem;
1207 uint8_t ret= RFAILED;
1212 DU_LOG("\nF1AP : Building DU config update\n");
1213 /* Allocate the memory for F1DuCfg */
1214 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1215 if(f1apDuCfg == NULLP)
1217 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1221 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1222 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1223 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1225 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1229 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1230 ProcedureCode_id_gNBDUConfigurationUpdate;
1231 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1232 f1apDuCfg->choice.initiatingMessage->value.present = \
1233 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1234 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1235 choice.GNBDUConfigurationUpdate;
1237 duCfgUpdate->protocolIEs.list.count = elementCnt;
1238 duCfgUpdate->protocolIEs.list.size = \
1239 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1241 /* Initialize the F1Setup members */
1242 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1243 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1245 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1248 for(idx=0;idx<elementCnt;idx++)
1250 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1251 if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1259 duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1260 duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1261 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1262 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1263 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1266 /*Served Cell to Modify */
1268 duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1269 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1270 duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1271 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1272 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1273 cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1274 Served_Cells_To_Modify_List;
1276 cellsToModify->list.count = modifyCnt;
1277 cellsToModify->list.size = \
1278 modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1279 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1280 if(cellsToModify->list.array == NULLP)
1284 for(idy=0; idy<modifyCnt ;idy++)
1286 DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1287 Served_Cells_To_Modify_ItemIEs_t));
1288 if(cellsToModify->list.array[idy] == NULLP)
1293 cellsToModify->list.array[0]->id = \
1294 ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1295 cellsToModify->list.array[0]->criticality = Criticality_reject;
1296 cellsToModify->list.array[0]->value.present =\
1297 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1298 modifyItem=&cellsToModify->list.array[0]->value.choice.\
1299 Served_Cells_To_Modify_Item;
1302 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1303 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1304 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1308 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1309 &modifyItem->oldNRCGI.pLMN_Identity);
1312 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1313 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1314 modifyItem->oldNRCGI.nRCellIdentity.size);
1315 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1319 for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1321 modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1323 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1324 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1327 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1328 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1329 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1330 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1334 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1335 &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1336 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1337 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1338 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1339 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1343 for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1344 nRCGI.nRCellIdentity.size-1 ; tmp++)
1346 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1348 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1349 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1351 modifyItem->served_Cell_Information.nRPCI = \
1352 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1355 modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1356 modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1357 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1358 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1359 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1360 if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1364 for(idy1=0;idy1<servPlmnCnt;idy1++)
1366 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1367 sizeof(ServedPLMNs_Item_t));
1368 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1373 modifyItem->served_Cell_Information.servedPLMNs.list.\
1374 array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1375 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1376 array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1377 array[0]->pLMN_Identity.size);
1378 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1379 array[0]->pLMN_Identity.buf == NULLP)
1383 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1384 &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1385 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1386 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1387 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1388 array[0]->iE_Extensions == NULLP)
1393 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1394 iE_Extensions->list.count = extensionCnt;
1395 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1396 iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1397 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1398 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1399 iE_Extensions->list.size);
1400 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1401 array[0]->iE_Extensions->list.array == NULLP)
1405 for(idy2=0;idy2<extensionCnt;idy2++)
1407 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1408 array[0]->iE_Extensions->list.array[idy2],\
1409 sizeof(ServedPLMNs_ItemExtIEs_t));
1410 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1411 array[0]->iE_Extensions->list.array[idy2] == NULLP)
1416 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1417 iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1418 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1419 iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1420 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1421 iE_Extensions->list.array[0]->extensionValue.present = \
1422 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1423 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1424 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1426 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1427 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1428 list.size = sizeof(SliceSupportItem_t *);
1429 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1430 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1431 list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1432 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1433 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1434 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1435 list.array == NULLP)
1440 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1441 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1442 list.array[0],sizeof( SliceSupportItem_t));
1443 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1444 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1445 list.array[0] == NULLP)
1449 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1450 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1451 list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1452 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1453 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1454 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1455 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1456 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1457 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1458 list.array[0]->sNSSAI.sST.buf == NULLP)
1462 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1463 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1464 list.array[0]->sNSSAI.sST.buf[0] = 3;
1465 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1466 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1467 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1468 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1469 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1470 list.array[0]->sNSSAI.sD == NULLP)
1474 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1475 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1476 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1477 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1478 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1479 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1480 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1481 list.array[0]->sNSSAI.sD->size);
1482 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1483 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1484 list.array[0]->sNSSAI.sD->buf == NULLP)
1488 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1489 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1490 list.array[0]->sNSSAI.sD->buf[0] = 3;
1491 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1492 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1493 list.array[0]->sNSSAI.sD->buf[1] = 6;
1494 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1495 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1496 list.array[0]->sNSSAI.sD->buf[2] = 9;
1498 /*nR Mode Info with FDD*/
1499 modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1500 NR_Mode_Info_PR_fDD;
1501 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1502 sizeof(FDD_Info_t));
1503 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1507 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1508 uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1509 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1510 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1511 uL_NRFreqInfo.freqBandListNr.list.count = 1;
1512 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1513 uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1514 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1515 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1516 array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1517 uL_NRFreqInfo.freqBandListNr.list.size);
1518 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1519 fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1523 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1524 uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1525 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1526 uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1530 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1531 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1532 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1533 freqBand[0].nrFreqBand;
1534 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1535 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1536 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1537 nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1538 dlNrFreqInfo.nrArfcn;
1539 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1540 freqBandListNr.list.count = 1;
1541 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1542 freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1543 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1544 dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1545 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1546 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1547 dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1551 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1552 dL_NRFreqInfo.freqBandListNr.list.array[0],\
1553 sizeof(FreqBandNrItem_t));
1554 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1555 dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1559 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1560 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1561 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1562 freqBand[0].nrFreqBand;
1563 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1564 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1566 /*Transmission Bandwidth*/
1567 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1568 uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1569 f1Mode.mode.fdd.ulTxBw.nrScs;
1570 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1571 uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1572 f1Mode.mode.fdd.ulTxBw.nrb;
1573 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1574 dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1575 f1Mode.mode.fdd.dlTxBw.nrScs;
1576 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1577 dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1578 f1Mode.mode.fdd.dlTxBw.nrb;
1579 /*Measurement timing Config*/
1580 modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1582 DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1583 buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1584 if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1588 modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1589 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1591 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1594 duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1595 duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1596 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1597 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1598 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1600 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1601 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1602 if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1606 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1609 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1611 /* Encode the DU Config Update type as APER */
1612 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1614 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1616 /* Checking encode results */
1617 if(encRetVal.encoded == ENCODE_FAIL)
1619 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1624 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1625 for(i=0; i< encBufSize; i++)
1627 printf("%x",encBuf[i]);
1631 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1633 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1640 FreeDUConfigUpdate(f1apDuCfg);
1644 /*******************************************************************
1646 * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1650 * Function : FreeDUConfigUpdate
1652 * Functionality: Deallocating memory of variables allocated in
1653 * BuildAndSendDUConfigUpdate function
1655 * @params[in] F1AP_PDU_t *f1apDuCfg
1657 * @return ROK - void
1659 * ****************************************************************/
1660 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1664 GNBDUConfigurationUpdate_t *duCfgUpdate;
1665 Served_Cells_To_Modify_List_t *cellsToModify;
1666 Served_Cells_To_Modify_Item_t *modifyItem;
1669 if(f1apDuCfg != NULLP)
1671 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1673 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1674 value.choice.GNBDUConfigurationUpdate;
1675 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1677 if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
1679 cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
1680 value.choice.Served_Cells_To_Modify_List;
1681 if(cellsToModify->list.array != NULLP)
1683 if(cellsToModify->list.array[idx] != NULLP)
1685 modifyItem=&cellsToModify->list.array[idx]->value.choice.\
1686 Served_Cells_To_Modify_Item;
1687 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1689 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1691 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1693 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1696 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1699 if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
1701 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1702 array[idx]->pLMN_Identity.buf != NULLP)
1704 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1705 array[idx]->iE_Extensions!= NULLP)
1707 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1708 array[idx]->iE_Extensions->list.array != NULLP)
1710 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1711 array[idx]->iE_Extensions->list.array[idx])
1713 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1714 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1717 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1718 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1719 list.array[idx]!=NULLP)
1721 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1722 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1723 list.array[idx]->sNSSAI.sST.buf!=NULLP)
1725 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1726 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1727 list.array[idx]->sNSSAI.sD != NULLP)
1729 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1730 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1731 list.array[idx]->sNSSAI.sD->buf!=NULLP)
1733 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1736 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1737 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1739 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1740 fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
1742 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1743 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1745 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1746 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1749 if(modifyItem->served_Cell_Information.\
1750 measurementTimingConfiguration.buf !=NULLP)
1753 if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
1754 choice.GNB_DU_ID.buf!=NULLP)
1756 DU_FREE(duCfgUpdate->protocolIEs.list.\
1757 array[idx]->value.choice.GNB_DU_ID.buf,\
1758 duCfgUpdate->protocolIEs.list.array[idx]->\
1759 value.choice.GNB_DU_ID.size);
1762 DU_FREE(modifyItem->served_Cell_Information.\
1763 measurementTimingConfiguration.\
1764 buf,modifyItem->served_Cell_Information.\
1765 measurementTimingConfiguration.size);
1767 DU_FREE(modifyItem->served_Cell_Information.\
1768 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1769 list.array[idx],sizeof(FreqBandNrItem_t));
1771 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1772 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1773 modifyItem->served_Cell_Information.nR_Mode_Info.\
1774 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1776 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1777 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1778 array[idx],sizeof(FreqBandNrItem_t));
1780 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1782 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1783 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1784 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1786 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1787 fDD,sizeof(FDD_Info_t));
1789 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1790 array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1792 list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1793 servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
1794 extensionValue.choice.SliceSupportList.list.array[idx]->\
1798 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1800 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1801 list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1803 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1804 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1805 list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
1807 list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1808 SliceSupportList.list.array[idx]->sNSSAI.sST.size);
1810 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1811 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1812 list.array[idx],sizeof(SliceSupportItem_t));
1814 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1815 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1817 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1818 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
1821 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
1822 array[idx]->iE_Extensions->list.count;i++)
1824 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1825 array[idx]->iE_Extensions->list.array[i],\
1826 sizeof(ServedPLMNs_ItemExtIEs_t ));
1828 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1829 array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1830 list.array[idx]->iE_Extensions->list.size);
1832 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1833 array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1835 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1836 array[idx]->pLMN_Identity.buf,
1837 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
1840 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1842 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
1845 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1846 sizeof(ServedPLMNs_Item_t));
1849 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1850 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1852 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1853 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1855 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1856 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1858 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1859 modifyItem->oldNRCGI.nRCellIdentity.size);
1861 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1862 modifyItem->oldNRCGI.pLMN_Identity.size);
1865 for(i=0; i<cellsToModify->list.count ;i++)
1867 if(cellsToModify->list.array[i] != NULLP)
1869 DU_FREE(cellsToModify->list.array[i],\
1870 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1873 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1876 for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
1878 if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
1880 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1881 sizeof(GNBDUConfigurationUpdateIEs_t));
1884 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1886 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1888 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1891 /*******************************************************************
1893 * @brief free the ULRRCMessageTransfer
1897 * Function : FreeULRRCMessageTransfer
1899 * Functionality: Deallocating the memory of variable allocated in
1900 * FreeULRRCMessageTransfer
1904 * @return ROK - void
1906 ******************************************************************/
1907 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
1910 ULRRCMessageTransfer_t *ulRRCMsg;
1912 if(f1apMsg != NULLP)
1914 if(f1apMsg->choice.initiatingMessage != NULLP)
1916 ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1917 if(ulRRCMsg->protocolIEs.list.array != NULLP)
1919 for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
1921 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
1923 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
1926 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
1928 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1930 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1933 /*******************************************************************
1935 * @brief Builds and sends the ULRRCMessageTransfer
1939 * Function : BuildAndSendULRRCMessageTransfer
1941 * Functionality: Constructs the UL RRC Message Transfer and sends
1942 * it to the CU through SCTP.
1946 * @return ROK - success
1949 * ****************************************************************/
1950 uint8_t BuildAndSendULRRCMessageTransfer()
1955 F1AP_PDU_t *f1apMsg = NULL;
1956 ULRRCMessageTransfer_t *ulRRCMsg;
1957 asn_enc_rval_t encRetVal; /* Encoder return value */
1958 uint8_t ret =RFAILED;
1961 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1963 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1964 if(f1apMsg == NULLP)
1966 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1970 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1971 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1972 if(f1apMsg->choice.initiatingMessage == NULLP)
1974 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1977 f1apMsg->choice.initiatingMessage->procedureCode = \
1978 ProcedureCode_id_ULRRCMessageTransfer;
1979 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1980 f1apMsg->choice.initiatingMessage->value.present = \
1981 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1983 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1985 ulRRCMsg->protocolIEs.list.count = elementCnt;
1986 ulRRCMsg->protocolIEs.list.size = \
1987 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
1989 /* Initialize the F1Setup members */
1990 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
1991 if(ulRRCMsg->protocolIEs.list.array == NULLP)
1993 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
1996 for(idx=0; idx<elementCnt; idx++)
1998 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
1999 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2007 /*GNB CU UE F1AP ID*/
2008 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2009 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2010 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2011 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2012 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2013 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2015 /*GNB DU UE F1AP ID*/
2017 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2018 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2019 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2020 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2021 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2022 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2026 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2027 ProtocolIE_ID_id_SRBID;
2028 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2029 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2030 ULRRCMessageTransferIEs__value_PR_SRBID;
2031 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = UL_SRBID;
2036 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2038 /* Encode the F1SetupRequest type as APER */
2039 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2041 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2043 /* Encode results */
2044 if(encRetVal.encoded == ENCODE_FAIL)
2046 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2047 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2052 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2053 for(int i=0; i< encBufSize; i++)
2055 printf("%x",encBuf[i]);
2060 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
2062 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
2068 FreeULRRCMessageTransfer(f1apMsg);
2071 }/* End of BuildAndSendULRRCMessageTransfer*/
2073 /*******************************************************************
2075 * @brief Builds tag config
2079 * Function : BuildTagConfig
2081 * Functionality: Builds tag config in MacCellGroupConfig
2083 * @params[in] TAG_Config *tag_Config
2085 * @return ROK - success
2088 * ****************************************************************/
2089 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2091 struct TAG_Config__tag_ToAddModList *tagList;
2092 uint8_t idx, elementCnt;
2094 tagConfig->tag_ToReleaseList = NULLP;
2095 tagConfig->tag_ToAddModList = NULLP;
2096 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2097 if(!tagConfig->tag_ToAddModList)
2099 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2103 elementCnt = 1; //ODU_VALUE_ONE;
2104 tagList = tagConfig->tag_ToAddModList;
2105 tagList->list.count = elementCnt;
2106 tagList->list.size = elementCnt * sizeof(struct TAG *);
2108 tagList->list.array = NULLP;
2109 DU_ALLOC(tagList->list.array, tagList->list.size);
2110 if(!tagList->list.array)
2112 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2116 for(idx=0; idx<tagList->list.count; idx++)
2118 tagList->list.array[idx] = NULLP;
2119 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2120 if(!tagList->list.array[idx])
2122 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2128 tagList->list.array[idx]->tag_Id = TAG_ID;
2129 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2134 /*******************************************************************
2136 * @brief Builds PHR Config
2140 * Function : BuildPhrConfig
2142 * Functionality: Builds phrConfig in MacCellGroupConfig
2144 * @params[in] PHR Config *
2146 * @return ROK - success
2149 * ****************************************************************/
2150 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2153 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2154 phrConfig->choice.setup = NULLP;
2155 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2156 if(!phrConfig->choice.setup)
2158 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2162 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2163 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2164 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2165 phrConfig->choice.setup->multiplePHR = false;
2166 phrConfig->choice.setup->dummy = false;
2167 phrConfig->choice.setup->phr_Type2OtherCell = false;
2168 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2173 /*******************************************************************
2175 * @brief Builds BSR Config
2179 * Function : BuildBsrConfig
2181 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2183 * @params[in] BSR_Config *bsrConfig
2185 * @return ROK - success
2188 * ****************************************************************/
2189 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2191 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2192 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2193 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2198 /*******************************************************************
2200 * @brief Builds scheduling request config
2204 * Function : BuildSchedulingReqConfig
2206 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2208 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2210 * @return ROK - success
2213 * ****************************************************************/
2214 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2216 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2217 uint8_t idx, elementCnt;
2219 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2220 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2221 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2222 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2224 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2228 elementCnt = 1; //ODU_VALUE_ONE;
2229 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2230 schReqList->list.count = elementCnt;
2231 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2233 schReqList->list.array = NULLP;
2234 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2235 if(!schReqList->list.array)
2237 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2241 for(idx=0;idx<schReqList->list.count; idx++)
2243 schReqList->list.array[idx] = NULLP;
2244 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2245 if(!schReqList->list.array[idx])
2247 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2253 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2255 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2256 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2257 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2259 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2262 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2263 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2264 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2269 /*******************************************************************
2271 * @brief Builds RLC Config
2275 * Function : BuildRlcConfig
2277 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
2279 * @params[in] RLC_Config *rlcConfig
2281 * @return ROK - success
2284 * ****************************************************************/
2285 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2288 rlcConfig->present = RLC_Config_PR_am;
2290 rlcConfig->choice.am = NULLP;
2291 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2292 if(!rlcConfig->choice.am)
2294 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2299 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2300 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2301 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2303 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2306 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2307 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2308 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2309 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2310 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
2313 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2314 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2315 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2317 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2320 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2321 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
2322 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
2327 /*******************************************************************
2329 * @brief Builds MAC LC Config
2333 * Function : BuildMacLCConfig
2335 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
2337 * @params[in] struct LogicalChannelConfig macLcConfig
2339 * @return ROK - success
2342 * ****************************************************************/
2343 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2346 macLcConfig->ul_SpecificParameters = NULLP;
2347 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2348 if(!macLcConfig->ul_SpecificParameters)
2350 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2354 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2355 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
2356 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
2357 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2358 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2359 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2360 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2362 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2363 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2364 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2366 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2369 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2371 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2372 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2373 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2375 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2378 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2380 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2381 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2382 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2387 /*******************************************************************
2389 * @brief Builds RLC Bearer to Add/Mod list
2393 * Function :BuildRlcBearerToAddModList
2395 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2397 * @params[in] rlc_BearerToAddModList
2399 * @return ROK - success
2402 * ****************************************************************/
2403 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2405 uint8_t idx, elementCnt;
2408 rlcBearerList->list.count = elementCnt;
2409 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
2411 rlcBearerList->list.array = NULLP;
2412 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2413 if(!rlcBearerList->list.array)
2415 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2419 for(idx=0; idx<rlcBearerList->list.count; idx++)
2421 rlcBearerList->list.array[idx] = NULLP;
2422 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2423 if(!rlcBearerList->list.array[idx])
2425 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2431 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
2433 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2434 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2436 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2440 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2441 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
2443 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2444 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2445 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2446 if(!rlcBearerList->list.array[idx]->rlc_Config)
2448 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2452 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2454 DU_LOG("\nF1AP : BuildRlcConfig failed");
2458 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2459 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2460 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2462 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2466 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2468 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2475 /*******************************************************************
2477 * @brief Build Control resource set to add/modify list
2481 * Function : BuildControlRSetToAddModList
2483 * Functionality: Build Control resource set to add/modify list
2486 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2488 * @return ROK - success
2491 * ****************************************************************/
2492 uint8_t BuildControlRSetToAddModList
2494 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2502 struct ControlResourceSet *controlRSet;
2505 controlRSetList->list.count = elementCnt;
2506 controlRSetList->list.size = \
2507 elementCnt * sizeof(struct ControlResourceSet *);
2509 controlRSetList->list.array = NULLP;
2510 DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2511 if(!controlRSetList->list.array)
2513 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2517 for(idx = 0; idx < elementCnt; idx++)
2519 controlRSetList->list.array[idx] = NULLP;
2520 DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2521 if(!controlRSetList->list.array[idx])
2523 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2529 controlRSet = controlRSetList->list.array[idx];
2531 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2533 /* Values taken from reference logs :
2536 * Bit string stored ff0000000000
2540 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2542 controlRSet->frequencyDomainResources.buf = NULLP;
2543 DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2544 controlRSet->frequencyDomainResources.size);
2545 if(!controlRSet->frequencyDomainResources.buf)
2547 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2551 controlRSet->frequencyDomainResources.buf[byteIdx] = PDCCH_FREQ_DOM_RSRC; /* setting 8 MSBs i.e. ff */
2552 for(byteIdx = 1; byteIdx < numBytes; byteIdx++)
2554 controlRSet->frequencyDomainResources.buf[byteIdx] = 0;
2556 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2558 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2559 controlRSet->cce_REG_MappingType.present = \
2560 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2562 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2563 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2564 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2565 controlRSet->tci_PresentInDCI = NULLP;
2567 uint8_t tciStateIdx;
2569 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2570 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2571 if(!controlRset->tci_StatesPDCCH_ToAddList)
2573 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2578 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2579 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2580 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2581 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2582 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2584 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2588 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2590 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2591 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2593 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2600 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2602 DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2603 if(!controlRset->tci_PresentInDCI)
2605 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2609 *(controlRset->tci_PresentInDCI);
2612 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2613 DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2614 if(!controlRSet->pdcch_DMRS_ScramblingID)
2616 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2619 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2622 } /* End BuildControlRSetToAddModList */
2624 /*******************************************************************
2626 * @brief Build search space to add/modify list
2630 * Function : BuildSearchSpcToAddModList
2632 * Functionality: Build search space to add/modify list
2635 * @return ROK - success
2638 * ****************************************************************/
2639 uint8_t BuildSearchSpcToAddModList
2641 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2649 struct SearchSpace *searchSpc;
2652 searchSpcList->list.count = elementCnt;
2653 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2655 searchSpcList->list.array = NULLP;
2656 DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2657 if(!searchSpcList->list.array)
2659 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2663 for(idx = 0; idx < elementCnt; idx++)
2665 searchSpcList->list.array[idx] = NULLP;
2666 DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2667 if(!searchSpcList->list.array[idx])
2669 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2675 searchSpc = searchSpcList->list.array[idx];
2677 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2679 searchSpc->controlResourceSetId = NULLP;
2680 DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2681 if(!searchSpc->controlResourceSetId)
2683 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2686 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2688 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2689 DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2690 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2691 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2693 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2696 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2697 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2699 searchSpc->duration = NULLP;
2700 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2701 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2702 if(!searchSpc->monitoringSymbolsWithinSlot)
2704 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2708 /* Values taken from reference logs :
2711 * Bit string stores 8000
2716 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2717 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2718 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2719 searchSpc->monitoringSymbolsWithinSlot->size);
2720 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2722 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2727 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2728 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2729 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2730 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2732 searchSpc->nrofCandidates = NULLP;
2733 DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2734 if(!searchSpc->nrofCandidates)
2736 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2740 searchSpc->nrofCandidates->aggregationLevel1 = \
2741 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2742 searchSpc->nrofCandidates->aggregationLevel2 = \
2743 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2744 searchSpc->nrofCandidates->aggregationLevel4 = \
2745 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2746 searchSpc->nrofCandidates->aggregationLevel8 = \
2747 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2748 searchSpc->nrofCandidates->aggregationLevel16 = \
2749 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2751 searchSpc->searchSpaceType = NULLP;
2752 DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2753 if(!searchSpc->searchSpaceType)
2755 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2759 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2761 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
2762 DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
2763 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
2764 if(!searchSpc->searchSpaceType->choice.ue_Specific)
2766 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2769 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
2770 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
2773 }/* End BuildSearchSpcToAddModList */
2775 /*******************************************************************
2777 * @brief Builds BWP DL dedicated PDCCH config
2781 * Function : BuildBWPDlDedPdcchCfg
2783 * Functionality: Builds BWP DL dedicated PDCCH config
2785 * @params[in] struct PDCCH_Config *pdcchCfg
2787 * @return ROK - success
2790 * ****************************************************************/
2791 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
2793 pdcchCfg->controlResourceSetToAddModList = NULLP;
2794 DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
2795 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
2796 if(!pdcchCfg->controlResourceSetToAddModList)
2798 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2802 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
2807 pdcchCfg->controlResourceSetToReleaseList = NULLP;
2809 pdcchCfg->searchSpacesToAddModList = NULLP;
2810 DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
2811 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
2812 if(!pdcchCfg->searchSpacesToAddModList)
2814 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2818 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
2823 pdcchCfg->searchSpacesToReleaseList = NULLP;
2824 pdcchCfg->downlinkPreemption = NULLP;
2825 pdcchCfg->tpc_PUSCH = NULLP;
2826 pdcchCfg->tpc_PUCCH = NULLP;
2827 pdcchCfg->tpc_SRS = NULLP;
2832 /*******************************************************************
2834 * @brief Builds DMRS DL PDSCH Mapping type A
2838 * Function : BuildDMRSDLPdschMapTypeA
2840 * Functionality: Builds DMRS DL PDSCH Mapping type A
2843 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2844 * @return ROK - success
2847 * ****************************************************************/
2848 uint8_t BuildDMRSDLPdschMapTypeA
2850 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2853 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
2854 dmrsDlCfg->choice.setup = NULLP;
2855 DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
2856 if(!dmrsDlCfg->choice.setup)
2858 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
2862 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
2863 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
2864 DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
2865 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
2867 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
2870 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
2872 dmrsDlCfg->choice.setup->maxLength = NULLP;
2873 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
2874 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
2875 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
2880 /*******************************************************************
2882 * @brief Builds TCI states to add/modify list
2886 * Function : BuildTCIStatesToAddModList
2888 * Functionality:Builds TCI states to add/modify list
2891 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
2893 * @return ROK - success
2896 * ****************************************************************/
2897 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
2902 /*******************************************************************
2904 * @brief Builds PDSCH time domain allocation list
2908 * Function : BuildPdschTimeDomAllocList
2910 * Functionality: Builds PDSCH time domain allocation list
2913 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2915 * @return ROK - success
2918 * ****************************************************************/
2919 uint8_t BuildPdschTimeDomAllocList
2921 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2926 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
2928 timeDomAllocList->present = \
2929 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
2931 timeDomAllocList->choice.setup = NULLP;
2932 DU_ALLOC(timeDomAllocList->choice.setup, \
2933 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
2934 if(!timeDomAllocList->choice.setup)
2936 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2941 timeDomAllocList->choice.setup->list.count = elementCnt;
2942 timeDomAllocList->choice.setup->list.size = \
2943 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
2945 timeDomAllocList->choice.setup->list.array = NULLP;
2946 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
2947 timeDomAllocList->choice.setup->list.size);
2948 if(!timeDomAllocList->choice.setup->list.array)
2950 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2954 for(idx = 0; idx < elementCnt; idx++)
2956 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
2957 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
2958 sizeof(struct PDSCH_TimeDomainResourceAllocation));
2959 if(!timeDomAllocList->choice.setup->list.array[idx])
2961 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2967 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
2969 timeDomAlloc->k0 = NULLP;
2970 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
2971 timeDomAlloc->startSymbolAndLength = \
2972 calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
2977 /*******************************************************************
2979 * @brief Builds PDSCH PRB Bundling type
2983 * Function : BuildPdschPrbBundlingType
2985 * Functionality: Builds PDSCH PRB Bundling type
2988 * struct PDSCH_Config__prb_BundlingType *prbBndlType
2990 * @return ROK - success
2993 * ****************************************************************/
2994 uint8_t BuildPdschPrbBundlingType
2996 struct PDSCH_Config__prb_BundlingType *prbBndlType
2999 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3001 prbBndlType->choice.staticBundling = NULLP;
3002 DU_ALLOC(prbBndlType->choice.staticBundling, \
3003 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3004 if(!prbBndlType->choice.staticBundling)
3006 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3009 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3014 /*******************************************************************
3016 * @brief Builds BWP DL dedicated PDSCH config
3020 * Function : BuildBWPDlDedPdschCfg
3022 * Functionality: Builds BWP DL dedicated PDSCH config
3024 * @params[in] struct PDSCH_Config *pdschCfg
3026 * @return ROK - success
3029 * ****************************************************************/
3030 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3032 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3034 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3035 DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3036 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3037 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3039 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3043 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3048 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3049 pdschCfg->tci_StatesToAddModList = NULLP;
3050 pdschCfg->tci_StatesToReleaseList = NULLP;
3051 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3053 DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3054 if(!pdschCfg->tci_StatesToAddModList)
3056 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3059 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3065 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3067 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3068 DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3069 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3070 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3072 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3076 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3081 pdschCfg->pdsch_AggregationFactor = NULLP;
3082 pdschCfg->rateMatchPatternToAddModList = NULLP;
3083 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3084 pdschCfg->rateMatchPatternGroup1 = NULLP;
3085 pdschCfg->rateMatchPatternGroup2 = NULLP;
3086 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3087 pdschCfg->mcs_Table = NULLP;
3089 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3090 DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3091 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3093 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3096 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3098 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3103 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3104 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3105 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3106 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3107 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3108 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3109 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3114 /*******************************************************************
3116 * @brief Builds intitial DL BWP
3119 * Function : BuildInitialDlBWP
3121 * Functionality: Builds intitial DL BWP in spCellCfgDed
3123 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3125 * @return ROK - success
3128 * ****************************************************************/
3129 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3131 dlBwp->pdcch_Config = NULLP;
3132 DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3133 if(!dlBwp->pdcch_Config)
3135 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3138 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3140 dlBwp->pdcch_Config->choice.setup = NULLP;
3141 DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3142 if(!dlBwp->pdcch_Config->choice.setup)
3144 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3147 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3152 dlBwp->pdsch_Config = NULLP;
3153 DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3154 if(!dlBwp->pdsch_Config)
3156 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3159 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3161 dlBwp->pdsch_Config->choice.setup = NULLP;
3162 DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3163 if(!dlBwp->pdsch_Config->choice.setup)
3165 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3169 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3174 dlBwp->sps_Config = NULLP;
3175 dlBwp->radioLinkMonitoringConfig = NULLP;
3179 /*******************************************************************
3181 * @brief Builds DMRS UL Pusch Mapping type A
3185 * Function : BuildDMRSULPuschMapTypeA
3187 * Functionality: Builds DMRS UL Pusch Mapping type A
3190 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3191 * @return ROK - success
3194 * ****************************************************************/
3195 uint8_t BuildDMRSULPuschMapTypeA
3197 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3200 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3201 dmrsUlCfg->choice.setup= NULLP;
3202 DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3203 if(!dmrsUlCfg->choice.setup)
3205 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3209 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3210 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3211 DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3212 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3214 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3217 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3219 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3220 dmrsUlCfg->choice.setup->maxLength = NULLP;
3221 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3222 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3223 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3224 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3226 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3230 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3231 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3233 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3235 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3238 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3240 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3241 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3245 /*******************************************************************
3247 * @brief Build PUSCH time domain allocation list
3251 * Function : BuildPuschTimeDomAllocList
3253 * Functionality: Build PUSCH time domain allocation list
3256 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3258 * @return ROK - success
3261 * ****************************************************************/
3262 uint8_t BuildPuschTimeDomAllocList
3264 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3269 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3271 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3272 timeDomAllocList->choice.setup = NULLP;
3273 DU_ALLOC(timeDomAllocList->choice.setup, \
3274 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3275 if(!timeDomAllocList->choice.setup)
3277 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3282 timeDomAllocList->choice.setup->list.count = elementCnt;
3283 timeDomAllocList->choice.setup->list.size = \
3284 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3285 timeDomAllocList->choice.setup->list.array = NULLP;
3286 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3287 timeDomAllocList->choice.setup->list.size);
3288 if(!timeDomAllocList->choice.setup->list.array)
3290 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3294 for(idx = 0; idx < elementCnt; idx++)
3296 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3297 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3298 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3299 if(!timeDomAllocList->choice.setup->list.array[idx])
3301 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3307 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3308 DU_ALLOC(timeDomAlloc->k2, sizeof(long));
3309 if(!timeDomAlloc->k2)
3311 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3314 *(timeDomAlloc->k2) = PUSCH_K2;
3315 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3316 timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
3320 /*******************************************************************
3322 * @brief Builds BWP UL dedicated PUSCH Config
3326 * Function : BuildBWPUlDedPuschCfg
3329 * Builds BWP UL dedicated PUSCH Config
3331 * @params[in] : PUSCH_Config_t *puschCfg
3333 * @return ROK - success
3336 * ****************************************************************/
3337 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3339 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3340 DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3341 if(!puschCfg->dataScramblingIdentityPUSCH)
3343 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3346 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3348 puschCfg->txConfig = NULLP;
3349 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3350 DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3351 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3352 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3354 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3358 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3363 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3364 puschCfg->pusch_PowerControl = NULLP;
3365 puschCfg->frequencyHopping = NULLP;
3366 puschCfg->frequencyHoppingOffsetLists = NULLP;
3367 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3369 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3370 DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3371 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3372 if(!puschCfg->pusch_TimeDomainAllocationList)
3374 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3378 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3383 puschCfg->pusch_AggregationFactor = NULLP;
3384 puschCfg->mcs_Table = NULLP;
3385 puschCfg->mcs_TableTransformPrecoder = NULLP;
3386 puschCfg->transformPrecoder = NULLP;
3387 DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3388 if(!puschCfg->transformPrecoder)
3390 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3393 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3395 puschCfg->codebookSubset = NULLP;
3396 puschCfg->maxRank = NULLP;
3397 puschCfg->rbg_Size = NULLP;
3398 puschCfg->uci_OnPUSCH = NULLP;
3399 puschCfg->tp_pi2BPSK = NULLP;
3404 /*******************************************************************
3406 * @brief Fills SRS resource to add/modify list
3410 * Function : BuildSrsRsrcAddModList
3412 * Functionality: Fills SRS resource to add/modify list
3415 * @return ROK - success
3418 * ****************************************************************/
3419 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3425 resourceList->list.count = elementCnt;
3426 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3427 resourceList->list.array = NULLP;
3428 DU_ALLOC(resourceList->list.array, resourceList->list.size);
3429 if(!resourceList->list.array)
3431 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3435 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3437 DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3438 if(!resourceList->list.array[rsrcIdx])
3440 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3446 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3447 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3448 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3450 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3451 DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3452 sizeof(struct SRS_Resource__transmissionComb__n2));
3453 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3455 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3458 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3459 = SRS_COMB_OFFSET_N2;
3460 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3461 = SRS_CYCLIC_SHIFT_N2;
3463 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3465 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3466 SRS_Resource__resourceMapping__nrofSymbols_n1;
3467 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3468 SRS_Resource__resourceMapping__repetitionFactor_n1;
3470 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3471 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3472 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3473 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3474 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3475 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3476 SRS_Resource__groupOrSequenceHopping_neither;
3478 /* Setting resource type to aperiodic for intergration purposes */
3479 resourceList->list.array[rsrcIdx]->resourceType.present = \
3480 SRS_Resource__resourceType_PR_aperiodic;
3481 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3482 DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3483 sizeof(struct SRS_Resource__resourceType__aperiodic));
3484 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3486 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3489 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3494 /*******************************************************************
3496 * @brief Build SRS resource set Add/mod list
3500 * Function : BuildSrsRsrcSetAddModList
3502 * Functionality: Build SRS resource set Add/mod list
3505 * @return ROK - success
3508 * ****************************************************************/
3509 uint8_t BuildSrsRsrcSetAddModList
3511 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3517 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3520 rsrcSetList->list.count = elementCnt;
3521 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3522 rsrcSetList->list.array = NULLP;
3523 DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3524 if(!rsrcSetList->list.array)
3526 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3530 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3532 DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3533 if(!rsrcSetList->list.array[rSetIdx])
3535 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3541 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3543 /* Fill Resource Id list in resource set */
3544 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3545 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3546 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3547 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3549 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3554 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3555 rsrcIdList->list.count = elementCnt;
3556 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3557 rsrcIdList->list.array = NULLP;
3558 DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3559 if(!rsrcIdList->list.array)
3561 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3565 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3567 DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3568 if(!rsrcIdList->list.array[rsrcIdx])
3570 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3576 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3578 /* Fill resource type */
3579 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3580 SRS_ResourceSet__resourceType_PR_aperiodic;
3582 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3583 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3584 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3585 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3587 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3590 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3591 = APERIODIC_SRS_RESRC_TRIGGER;
3593 /* TODO : Fill values for below IEs as expected by Viavi */
3594 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3595 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3598 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3599 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3600 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3601 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3602 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3607 /*******************************************************************
3609 * @brief Builds BWP UL dedicated SRS Config
3613 * Function : BuildBWPUlDedSrsCfg
3615 * Functionality: Builds BWP UL dedicated SRS Config
3617 * @params[in] SRS Config
3618 * @return ROK - success
3621 * ****************************************************************/
3622 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3624 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3625 srsCfg->srs_ResourceSetToAddModList = NULLP;
3626 DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3627 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3628 if(!srsCfg->srs_ResourceSetToAddModList)
3630 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3633 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3638 srsCfg->srs_ResourceToReleaseList = NULLP;
3640 /* Resource to Add/Modify list */
3641 srsCfg->srs_ResourceToAddModList = NULLP;
3642 DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3643 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3644 if(!srsCfg->srs_ResourceToAddModList)
3646 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3650 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3655 srsCfg->tpc_Accumulation = NULLP;
3660 /*******************************************************************
3662 * @brief Builds inital UL BWP
3666 * Function : BuildInitialUlBWP
3668 * Functionality: Builds initial UL BWP
3670 * @params[in] BWP_UplinkDedicated_t *ulBwp
3671 * @return ROK - success
3674 * ****************************************************************/
3675 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3677 ulBwp->pucch_Config = NULLP;
3679 /* Fill BWP UL dedicated PUSCH config */
3680 ulBwp->pusch_Config = NULLP;
3681 DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3682 if(!ulBwp->pusch_Config)
3684 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3688 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3689 ulBwp->pusch_Config->choice.setup = NULLP;
3690 DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3691 if(!ulBwp->pusch_Config->choice.setup)
3693 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3697 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3702 ulBwp->configuredGrantConfig = NULLP;
3704 /* Fill BPW UL dedicated SRS config */
3705 ulBwp->srs_Config = NULLP;
3706 DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3707 if(!ulBwp->srs_Config)
3709 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3713 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3714 ulBwp->srs_Config->choice.setup = NULLP;
3715 DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3716 if(!ulBwp->srs_Config->choice.setup)
3718 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3722 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3727 ulBwp->beamFailureRecoveryConfig = NULLP;
3732 /*******************************************************************
3734 * @brief Builds Pusch Serving cell Config
3738 * Function : BuildPuschSrvCellCfg
3740 * Functionality: Builds Pusch Serving cell Config
3742 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3744 * @return ROK - success
3747 * ****************************************************************/
3748 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3750 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3751 puschCfg->choice.setup = NULLP;
3752 DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3753 if(!puschCfg->choice.setup)
3755 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3759 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3760 puschCfg->choice.setup->rateMatching = NULLP;
3761 puschCfg->choice.setup->xOverhead = NULLP;
3762 puschCfg->choice.setup->ext1 = NULLP;
3763 DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3764 if(!puschCfg->choice.setup->ext1)
3766 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3770 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
3771 DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
3772 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
3774 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3777 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
3779 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
3780 DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
3781 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
3783 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3786 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
3790 /*******************************************************************
3792 * @brief Builds UL config
3795 * Function : BuildUlCfg
3797 * Functionality: Builds UL config in spCellCfgDed
3799 * @params[in] UplinkConfig_t *ulCfg
3801 * @return ROK - success
3804 * ****************************************************************/
3805 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
3807 ulCfg->initialUplinkBWP = NULLP;
3808 DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
3809 if(!ulCfg->initialUplinkBWP)
3811 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3815 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
3820 ulCfg->uplinkBWP_ToReleaseList = NULLP;
3821 ulCfg->uplinkBWP_ToAddModList = NULLP;
3822 ulCfg->firstActiveUplinkBWP_Id = NULLP;
3823 DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
3824 if(!ulCfg->firstActiveUplinkBWP_Id)
3826 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3829 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
3831 ulCfg->pusch_ServingCellConfig = NULLP;
3832 DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
3833 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
3834 if(!ulCfg->pusch_ServingCellConfig)
3836 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3840 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
3845 ulCfg->carrierSwitching = NULLP;
3846 ulCfg->ext1 = NULLP;
3850 /*******************************************************************
3852 * @brief Builds PDSCH serving cell config
3855 * Function : BuildPdschSrvCellCfg
3857 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
3859 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
3861 * @return ROK - success
3864 * ****************************************************************/
3865 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
3867 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
3868 pdschCfg->choice.setup = NULLP;
3869 DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
3870 if(!pdschCfg->choice.setup)
3872 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3876 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3877 pdschCfg->choice.setup->xOverhead = NULLP;
3878 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
3879 DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
3880 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
3882 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3885 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
3886 pdschCfg->choice.setup->pucch_Cell = NULLP;
3887 pdschCfg->choice.setup->ext1 = NULLP;
3892 /*******************************************************************
3894 * @brief Builds CSI Meas config
3897 * Function : BuildCsiMeasCfg
3899 * Functionality: Builds CSI Meas config in spCellCfgDed
3901 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
3903 * @return ROK - success
3906 * ****************************************************************/
3907 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
3913 /*******************************************************************
3915 * @brief Builds Spcell config dedicated
3918 * Function : BuildSpCellCfgDed
3920 * Functionality: Builds sp cell config dedicated in spCellCfg
3922 * @params[in] ServingCellConfig_t srvCellCfg
3924 * @return ROK - success
3927 * ****************************************************************/
3928 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
3930 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
3932 srvCellCfg->initialDownlinkBWP = NULLP;
3933 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
3934 if(!srvCellCfg->initialDownlinkBWP)
3936 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3940 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
3942 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
3945 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
3946 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
3948 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
3949 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
3950 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
3952 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3955 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
3957 srvCellCfg->bwp_InactivityTimer = NULLP;
3959 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
3960 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
3961 if(!srvCellCfg->defaultDownlinkBWP_Id)
3963 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3966 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
3968 srvCellCfg->uplinkConfig = NULLP;
3969 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
3970 if(!srvCellCfg->uplinkConfig)
3972 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3976 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
3978 DU_LOG("\nF1AP : BuildUlCfg failed");
3981 srvCellCfg->supplementaryUplink = NULLP;
3982 srvCellCfg->pdcch_ServingCellConfig = NULLP;
3984 srvCellCfg->pdsch_ServingCellConfig = NULLP;
3985 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
3986 if(!srvCellCfg->pdsch_ServingCellConfig)
3988 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3992 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
3994 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
3998 srvCellCfg->csi_MeasConfig = NULLP;
4000 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4001 if(!srvCellCfg->csi_MeasConfig)
4003 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4007 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4009 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4013 srvCellCfg->sCellDeactivationTimer = NULLP;
4014 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4015 srvCellCfg->tag_Id = TAG_ID;
4016 srvCellCfg->dummy = NULLP;
4017 srvCellCfg->pathlossReferenceLinking = NULLP;
4018 srvCellCfg->servingCellMO = NULLP;
4019 srvCellCfg->ext1 = NULLP;
4023 /*******************************************************************
4025 * @brief Builds Spcell config
4029 * Function : BuildSpCellCfg
4031 * Functionality: Builds sp cell config in DuToCuRrcContainer
4033 * @params[in] SpCellConfig_t spCellCfg
4035 * @return ROK - success
4038 * ****************************************************************/
4039 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4042 spCellCfg->servCellIndex = NULLP;
4043 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4044 if(!spCellCfg->servCellIndex)
4046 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4049 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4051 spCellCfg->reconfigurationWithSync = NULLP;
4052 spCellCfg->rlf_TimersAndConstants = NULLP;
4053 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4054 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4055 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4057 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4060 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4062 spCellCfg->spCellConfigDedicated = NULLP;
4063 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4064 if(!spCellCfg->spCellConfigDedicated)
4066 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4069 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4071 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4076 /*******************************************************************
4078 * @brief Builds Phy cell group config
4082 * Function : BuildPhyCellGrpCfg
4084 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4086 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4088 * @return ROK - success
4091 * ****************************************************************/
4092 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4094 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4095 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4097 phyCellGrpCfg->p_NR_FR1 = NULLP;
4098 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4099 if(!phyCellGrpCfg->p_NR_FR1)
4101 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4104 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4105 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4106 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4107 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4108 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4109 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4110 phyCellGrpCfg->cs_RNTI = NULLP;
4111 phyCellGrpCfg->ext1 = NULLP;
4112 phyCellGrpCfg->ext2 = NULLP;
4116 /*******************************************************************
4118 * @brief Builds Mac cell group config
4122 * Function : BuildMacCellGrpCfg
4124 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4126 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4128 * @return ROK - success
4131 * ****************************************************************/
4132 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4134 macCellGrpCfg->drx_Config = NULLP;
4135 macCellGrpCfg->schedulingRequestConfig = NULLP;
4136 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4137 if(!macCellGrpCfg->schedulingRequestConfig)
4139 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4143 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4145 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4149 macCellGrpCfg->bsr_Config = NULLP;
4150 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4151 if(!macCellGrpCfg->bsr_Config)
4153 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4157 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4159 DU_LOG("\nF1AP : BuildBsrConfig failed");
4163 macCellGrpCfg->tag_Config = NULLP;
4164 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4165 if(!macCellGrpCfg->tag_Config)
4167 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4171 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4173 DU_LOG("\nF1AP : BuildTagConfig failed");
4177 macCellGrpCfg->phr_Config = NULLP;
4178 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4179 if(!macCellGrpCfg->phr_Config)
4181 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4185 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4187 DU_LOG("\nF1AP : BuildPhrConfig failed");
4191 macCellGrpCfg->skipUplinkTxDynamic = false;
4192 macCellGrpCfg->ext1 = NULLP;
4196 /*******************************************************************
4198 * @brief Frees memeory allocated for SearchSpcToAddModList
4202 * Function : FreeSearchSpcToAddModList
4204 * Functionality: Deallocating memory of SearchSpcToAddModList
4206 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4210 4221 * ****************************************************************/
4211 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4215 struct SearchSpace *searchSpc=NULLP;
4217 if(searchSpcList->list.array)
4219 if(searchSpcList->list.array[idx2])
4221 searchSpc = searchSpcList->list.array[idx2];
4222 if(searchSpc->controlResourceSetId)
4224 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4226 if(searchSpc->monitoringSymbolsWithinSlot)
4228 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4230 if(searchSpc->nrofCandidates)
4232 if(searchSpc->searchSpaceType)
4234 DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4235 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4236 DU_FREE(searchSpc->searchSpaceType, sizeof(struct
4237 SearchSpace__searchSpaceType));
4239 DU_FREE(searchSpc->nrofCandidates,
4240 sizeof(struct SearchSpace__nrofCandidates));
4242 DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4243 searchSpc->monitoringSymbolsWithinSlot->size);
4245 DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4246 sizeof(BIT_STRING_t));
4248 DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4249 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4251 DU_FREE(searchSpc->controlResourceSetId,
4252 sizeof(ControlResourceSetId_t));
4255 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4257 DU_FREE(searchSpcList->list.array[idx1],
4258 sizeof(struct SearchSpace));
4260 DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4263 /*******************************************************************
4265 * @brief Frees memory allocated for PdschTimeDomAllocList
4269 * Function : FreePdschTimeDomAllocList
4271 * Functionality: Deallocating memory of PdschTimeDomAllocList
4273 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4277 4221 * ****************************************************************/
4278 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4282 if(timeDomAllocList->choice.setup)
4284 if(timeDomAllocList->choice.setup->list.array)
4286 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4288 DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4289 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4291 DU_FREE(timeDomAllocList->choice.setup->list.array, \
4292 timeDomAllocList->choice.setup->list.size);
4294 DU_FREE(timeDomAllocList->choice.setup,\
4295 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4298 /*******************************************************************
4300 * @brief Frees memory allocated for PuschTimeDomAllocList
4304 * Function : FreePuschTimeDomAllocList
4306 * Functionality: Deallocating memory of PuschTimeDomAllocList
4308 * @params[in] PUSCH_Config_t *puschCfg
4312 4221 * ****************************************************************/
4313 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4317 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4319 if(puschCfg->pusch_TimeDomainAllocationList)
4321 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4322 if(timeDomAllocList_t->choice.setup)
4324 if(timeDomAllocList_t->choice.setup->list.array)
4326 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4327 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4329 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4330 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4332 DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4333 timeDomAllocList_t->choice.setup->list.size);
4335 DU_FREE(timeDomAllocList_t->choice.setup, \
4336 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4338 DU_FREE(puschCfg->transformPrecoder, sizeof(long));
4339 DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4340 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4344 /*******************************************************************
4346 * @brief Frees memory allocated for InitialUlBWP
4350 * Function : FreeInitialUlBWP
4352 * Functionality: Deallocating memory of InitialUlBWP
4354 * @params[in] BWP_UplinkDedicated_t *ulBwp
4358 * ****************************************************************/
4359 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4361 uint8_t rSetIdx, rsrcIdx;
4362 SRS_Config_t *srsCfg = NULLP;
4363 PUSCH_Config_t *puschCfg = NULLP;
4364 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4365 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4366 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4367 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4369 if(ulBwp->pusch_Config)
4371 if(ulBwp->pusch_Config->choice.setup)
4373 puschCfg=ulBwp->pusch_Config->choice.setup;
4374 if(puschCfg->dataScramblingIdentityPUSCH)
4376 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4378 FreePuschTimeDomAllocList(puschCfg);
4379 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4380 if(dmrsUlCfg->choice.setup)
4382 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4384 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4386 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4388 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4389 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4391 DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4394 DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4396 DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4397 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4399 DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4401 DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4403 DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4405 /* Free SRS-Config */
4406 if(ulBwp->srs_Config)
4408 if(ulBwp->srs_Config->choice.setup)
4410 srsCfg = ulBwp->srs_Config->choice.setup;
4412 /* Free Resource Set to add/mod list */
4413 if(srsCfg->srs_ResourceSetToAddModList)
4415 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4416 if(rsrcSetList->list.array)
4420 /* Free SRS resource Id list in this SRS resource set */
4421 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4423 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4425 if(rsrcIdList->list.array)
4427 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4429 DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4431 DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4433 DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4434 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4437 /* Free resource type info for this SRS resource set */
4438 DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4439 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4441 /* Free memory for each resource set */
4442 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4444 DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4446 DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4448 DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4449 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4452 /* Free resource to add/modd list */
4453 if(srsCfg->srs_ResourceToAddModList)
4455 resourceList = srsCfg->srs_ResourceToAddModList;
4456 if(resourceList->list.array)
4459 DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4460 sizeof(struct SRS_Resource__transmissionComb__n2));
4461 DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4462 sizeof(struct SRS_Resource__resourceType__aperiodic));
4464 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4466 DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4468 DU_FREE(resourceList->list.array, resourceList->list.size);
4470 DU_FREE(srsCfg->srs_ResourceToAddModList, \
4471 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4474 DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4476 DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4480 /*******************************************************************
4482 * @brief Frees memory allocated for initialUplinkBWP
4486 * Function : FreeinitialUplinkBWP
4488 * Functionality: Deallocating memory of initialUplinkBWP
4490 * @params[in] UplinkConfig_t *ulCfg
4495 * ****************************************************************/
4496 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4498 BWP_UplinkDedicated_t *ulBwp=NULLP;
4499 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4501 if(ulCfg->initialUplinkBWP)
4503 ulBwp=ulCfg->initialUplinkBWP;
4504 if(ulCfg->firstActiveUplinkBWP_Id)
4506 if(ulCfg->pusch_ServingCellConfig)
4508 puschCfg=ulCfg->pusch_ServingCellConfig;
4509 if(puschCfg->choice.setup)
4511 if(puschCfg->choice.setup->ext1)
4513 DU_FREE(puschCfg->choice.setup->ext1->\
4514 processingType2Enabled,sizeof(BOOLEAN_t));
4515 DU_FREE(puschCfg->choice.setup->ext1->\
4516 maxMIMO_Layers,sizeof(long));
4517 DU_FREE(puschCfg->choice.setup->ext1, \
4518 sizeof(struct PUSCH_ServingCellConfig__ext1));
4520 DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4522 DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4524 DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4526 FreeInitialUlBWP(ulBwp);
4527 DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4530 /*******************************************************************
4532 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4536 * Function : FreeBWPDlDedPdschCfg
4538 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4540 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4545 * ****************************************************************/
4546 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4548 struct PDSCH_Config *pdschCfg=NULLP;
4549 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4550 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4551 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4553 if(dlBwp->pdsch_Config->choice.setup)
4555 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4556 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4558 if(pdschCfg->pdsch_TimeDomainAllocationList)
4560 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4561 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4563 prbBndlType=&pdschCfg->prb_BundlingType;
4564 DU_FREE(prbBndlType->choice.staticBundling,\
4565 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4566 DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4568 FreePdschTimeDomAllocList(timeDomAllocList);
4569 DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
4570 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4572 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
4573 if(dmrsDlCfg->choice.setup)
4575 DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
4577 DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
4579 DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4580 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4582 DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4585 /*******************************************************************
4587 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
4591 * Function : FreeBWPDlDedPdcchCfg
4593 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
4595 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4600 * ****************************************************************/
4601 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
4605 struct PDCCH_Config *pdcchCfg=NULLP;
4606 struct ControlResourceSet *controlRSet=NULLP;
4607 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
4609 if(dlBwp->pdcch_Config->choice.setup)
4611 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
4612 if(pdcchCfg->controlResourceSetToAddModList)
4614 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
4615 if(controlRSetList->list.array)
4617 controlRSet = controlRSetList->list.array[idx2];
4620 if(controlRSet->frequencyDomainResources.buf)
4622 if(controlRSet->pdcch_DMRS_ScramblingID)
4624 if(pdcchCfg->searchSpacesToAddModList)
4626 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
4627 DU_FREE(pdcchCfg->searchSpacesToAddModList, \
4628 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
4630 DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
4632 DU_FREE(controlRSet->frequencyDomainResources.buf, \
4633 controlRSet->frequencyDomainResources.size);
4636 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
4638 DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
4640 DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
4642 DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
4643 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
4645 DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4649 /*******************************************************************
4651 * @brief Frees emmory allocated for DUToCURRCContainer
4655 * Function : FreeMemDuToCuRrcCont
4657 * Functionality: Deallocating memory of DuToCuRrcContainer
4659 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
4661 * @return ROK - success
4664 * ****************************************************************/
4665 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
4668 SpCellConfig_t *spCellCfg=NULLP;
4669 ServingCellConfig_t *srvCellCfg=NULLP;
4670 BWP_DownlinkDedicated_t *dlBwp=NULLP;
4671 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
4672 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
4673 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
4674 struct RLC_Config *rlcConfig=NULLP;
4675 struct LogicalChannelConfig *macLcConfig=NULLP;
4676 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
4677 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
4678 struct TAG_Config *tagConfig=NULLP;
4679 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
4680 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
4681 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
4683 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
4686 if(rlcBearerList->list.array)
4688 for(idx=0; idx<rlcBearerList->list.count; idx++)
4690 if(rlcBearerList->list.array[idx])
4692 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
4693 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
4696 if(rlcConfig->choice.am)
4698 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4699 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4700 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
4702 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
4704 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
4707 if(macLcConfig->ul_SpecificParameters)
4709 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
4710 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
4711 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
4713 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
4715 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
4718 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
4720 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4723 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
4726 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
4727 if(schedulingRequestConfig)
4729 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4732 if(schReqList->list.array)
4734 for(idx=0;idx<schReqList->list.count; idx++)
4736 if(schReqList->list.array[idx])
4738 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4739 DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4742 DU_FREE(schReqList->list.array, schReqList->list.size);
4744 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
4745 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
4746 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4748 if(macCellGrpCfg->bsr_Config)
4750 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4752 tagConfig = macCellGrpCfg->tag_Config;
4755 tagList = tagConfig->tag_ToAddModList;
4758 if(tagList->list.array)
4760 for(idx=0; idx<tagList->list.count; idx++)
4762 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
4764 DU_FREE(tagList->list.array, tagList->list.size);
4766 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4768 DU_FREE(tagConfig, sizeof(struct TAG_Config));
4771 phrConfig = macCellGrpCfg->phr_Config;
4774 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
4775 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
4778 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
4781 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
4784 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4785 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
4788 spCellCfg = cellGrpCfg->spCellConfig;
4791 if(spCellCfg->servCellIndex)
4793 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
4795 if(spCellCfg->spCellConfigDedicated)
4797 srvCellCfg = spCellCfg->spCellConfigDedicated;
4798 if(srvCellCfg->initialDownlinkBWP)
4800 dlBwp = srvCellCfg->initialDownlinkBWP;
4801 if(srvCellCfg->firstActiveDownlinkBWP_Id)
4803 if(srvCellCfg->defaultDownlinkBWP_Id)
4805 if(srvCellCfg->uplinkConfig)
4807 if(srvCellCfg->pdsch_ServingCellConfig)
4809 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
4810 if(pdschCfg->choice.setup)
4812 DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
4813 DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4815 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
4816 ServingCellConfig__pdsch_ServingCellConfig));
4818 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
4819 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4821 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4823 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4825 if(dlBwp->pdcch_Config)
4827 if(dlBwp->pdsch_Config)
4829 FreeBWPDlDedPdschCfg(dlBwp);
4830 DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4832 FreeBWPDlDedPdcchCfg(dlBwp);
4833 DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4835 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4837 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4839 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4841 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
4843 DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
4847 /*******************************************************************
4849 * @brief Builds DU To CU RRC Container
4853 * Function : BuildDuToCuRrcContainer
4855 * Functionality: Builds DuToCuRrcContainer
4857 * @params[in] idx, index in F1AP msg
4858 * DuToCuRRCContainer, DuToCuRRCContainer
4860 * @return ROK - success
4863 * ****************************************************************/
4864 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
4866 CellGroupConfigRrc_t cellGrpCfg;
4867 asn_enc_rval_t encRetVal;
4868 uint8_t ret = RFAILED;
4872 cellGrpCfg.cellGroupId = CELL_GRP_ID;
4874 cellGrpCfg.rlc_BearerToAddModList = NULLP;
4875 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4876 if(!cellGrpCfg.rlc_BearerToAddModList)
4878 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4881 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
4883 DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
4887 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
4888 cellGrpCfg.mac_CellGroupConfig = NULLP;
4889 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
4890 if(!cellGrpCfg.mac_CellGroupConfig)
4892 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4895 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
4897 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
4902 cellGrpCfg.physicalCellGroupConfig = NULLP;
4903 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
4904 if(!cellGrpCfg.physicalCellGroupConfig)
4906 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4909 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
4911 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
4915 cellGrpCfg.spCellConfig = NULLP;
4916 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
4917 if(!cellGrpCfg.spCellConfig)
4919 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4922 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
4924 DU_LOG("\nF1AP : BuildSpCellCfg failed");
4928 cellGrpCfg.sCellToAddModList = NULLP;
4929 cellGrpCfg.sCellToReleaseList = NULLP;
4930 cellGrpCfg.ext1 = NULLP;
4932 /* encode cellGrpCfg into duToCuRrcContainer */
4933 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
4934 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
4936 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
4937 /* Encode results */
4938 if(encRetVal.encoded == ENCODE_FAIL)
4940 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
4941 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4946 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
4947 for(int i=0; i< encBufSize; i++)
4949 printf("%x",encBuf[i]);
4953 duToCuRrcContainer->size = encBufSize;
4954 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
4955 if(!duToCuRrcContainer->buf)
4957 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
4960 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
4964 FreeMemDuToCuRrcCont(&cellGrpCfg);
4968 /*******************************************************************
4970 * @brief Builds and sends the InitialULRRCMessage
4974 * Function : BuildAndSendInitialRrcMsgTransfer
4976 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
4977 * it to the CU through SCTP.
4981 * @return ROK - success
4984 * ****************************************************************/
4985 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
4986 uint8_t *rrcContainer)
4993 F1AP_PDU_t *f1apMsg = NULLP;
4994 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
4995 asn_enc_rval_t encRetVal;
4996 bool checkvar=false;
4999 DU_LOG("\n F1AP : Building RRC Setup Request\n");
5000 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5001 if(f1apMsg == NULLP)
5003 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5006 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5007 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5008 if(f1apMsg->choice.initiatingMessage == NULLP)
5010 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5013 f1apMsg->choice.initiatingMessage->procedureCode =\
5014 ProcedureCode_id_InitialULRRCMessageTransfer;
5015 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
5016 f1apMsg->choice.initiatingMessage->value.present = \
5017 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
5019 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
5021 initULRRCMsg->protocolIEs.list.count = elementCnt;
5022 initULRRCMsg->protocolIEs.list.size = \
5023 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
5024 /* Initialize the F1Setup members */
5025 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5026 if(initULRRCMsg->protocolIEs.list.array == NULLP)
5028 DU_LOG(" F1AP : Memory allocation for\
5029 RRCSetupRequestMessageTransferIEs failed");
5032 for(idx=0; idx<elementCnt; idx++)
5034 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
5035 sizeof(InitialULRRCMessageTransferIEs_t));
5036 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
5042 /*GNB DU UE F1AP ID*/
5043 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5044 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5045 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5046 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
5047 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
5048 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
5053 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5054 ProtocolIE_ID_id_NRCGI;
5055 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
5056 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
5057 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
5060 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
5068 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5069 ProtocolIE_ID_id_C_RNTI;
5070 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5071 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5072 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
5073 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
5077 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5078 ProtocolIE_ID_id_RRCContainer;
5079 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5080 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5081 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
5083 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size =\
5084 strlen((const char*)rrcContainer);
5085 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
5086 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
5087 if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
5089 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
5093 memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
5094 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
5097 /*DUtoCURRCContainer*/
5099 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5100 ProtocolIE_ID_id_DUtoCURRCContainer;
5101 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5102 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5103 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
5105 ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
5111 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5113 /* Encode the F1SetupRequest type as APER */
5114 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5116 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
5117 /* Encode results */
5118 if(encRetVal.encoded == ENCODE_FAIL)
5120 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
5121 structure (at %s)\n",encRetVal.failed_type ? \
5122 encRetVal.failed_type->name : "unknown");
5128 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
5129 Message transfer\n");
5130 for(int i=0; i< encBufSize; i++)
5132 printf("%x",encBuf[i]);
5136 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
5138 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
5145 if(f1apMsg != NULLP)
5147 if(f1apMsg->choice.initiatingMessage != NULLP)
5149 if(initULRRCMsg->protocolIEs.list.array != NULLP)
5151 if(idx == elementCnt)
5154 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
5156 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
5158 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
5159 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
5161 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
5162 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
5166 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
5168 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
5169 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
5173 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf)
5175 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf,
5176 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.size);
5178 for(ieId=0; ieId<elementCnt; ieId++)
5180 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
5185 for(ieId=0; ieId<idx; ieId++)
5187 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
5190 DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5192 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5194 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
5200 }/* End of BuildAndSendInitialRrcMsgTransfer*/
5202 /*******************************************************************
5204 * @brief Builds Special cell list for UE Setup Request
5208 * Function : BuildSplCellList
5210 * Functionality: Constructs the Special Cell list for UESetReq
5212 * @params[in] SCell_ToBeSetup_List_t *spCellLst
5214 * @return ROK - success
5217 * ****************************************************************/
5218 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
5224 spCellLst->list.count = cellCnt;
5225 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
5226 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
5227 if(spCellLst->list.array == NULLP)
5231 for(idx=0; idx<cellCnt; idx++)
5233 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
5234 if(spCellLst->list.array[idx] == NULLP)
5240 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
5241 spCellLst->list.array[idx]->criticality = Criticality_ignore;
5242 spCellLst->list.array[idx]->value.present =\
5243 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
5244 /* Special Cell ID -NRCGI */
5245 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
5250 /*Special Cell Index*/
5251 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
5253 }/* End of BuildSplCellList*/
5255 /*******************************************************************
5257 * @brief Builds SRBS to be setup
5261 * Function : BuildSRBSetup
5263 * Functionality: Constructs the SRB's for UESetReq
5265 * @params[in] SRBs_ToBeSetup_List_t *srbSet
5267 * @return ROK - success
5270 * ****************************************************************/
5271 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
5276 srbSet->list.count = srbCnt;
5277 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
5278 DU_ALLOC(srbSet->list.array,srbSet->list.size);
5279 if(srbSet->list.array == NULLP)
5283 for(idx=0; idx<srbCnt; idx++)
5285 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
5286 if(srbSet->list.array[idx] == NULLP)
5292 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
5293 srbSet->list.array[idx]->criticality = Criticality_ignore;
5294 srbSet->list.array[idx]->value.present = \
5295 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
5296 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
5298 }/* End of BuildSRBSetup*/
5300 /*******************************************************************
5302 * @brief Builds QOS Info for DRB Setum Item
5306 * Function : BuildQOSInfo
5308 * Functionality: Constructs the QOS Info for DRB Setup Item
5310 * @params[in] QoSInformation_t *qosinfo
5312 * @return ROK - success
5315 * ****************************************************************/
5316 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
5318 /* NonDynamic5QIDescriptor */
5319 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
5320 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
5321 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
5326 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
5328 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
5329 sizeof(AveragingWindow_t));
5330 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
5335 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
5336 /*MaxDataBurstVolume*/
5337 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
5338 sizeof(MaxDataBurstVolume_t));
5339 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
5344 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
5346 /*nRGRAN Allocation Retention Priority*/
5347 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
5348 PriorityLevel_highest;
5349 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
5350 Pre_emptionCapability_may_trigger_pre_emption;
5351 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
5352 Pre_emptionVulnerability_not_pre_emptable;
5354 /* TO DO: GBR_QoSFlowInformation */
5356 }/*End of BuildQOSInfo*/
5358 /*******************************************************************
5360 * @brief Builds SNSSAI
5364 * Function : BuildSNSSAI
5366 * Functionality: Constructs the SNSSAI For DRB list
5368 * @params[in] SNSSAI_t *snssai
5370 * @return ROK - success
5373 * ****************************************************************/
5374 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
5378 snssai->sST.size = sizeof(uint8_t);
5379 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
5380 if(snssai->sST.buf == NULLP)
5384 snssai->sST.buf[0] = 3;
5386 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
5387 if(snssai->sD == NULLP)
5391 snssai->sD->size = 3*sizeof(uint8_t);
5392 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
5393 if(snssai->sD->buf == NULLP)
5397 snssai->sD->buf[0] = 3;
5398 snssai->sD->buf[1] = 6;
5399 snssai->sD->buf[2] = 9;
5401 }/*End of BuildSNSSAI*/
5403 /*******************************************************************
5405 * @brief Builds the flow map.
5409 * Function : BuildFlowsMap
5411 * Functionality: Constructs the flowmap For DRB list
5413 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
5415 * @return ROK - success
5418 * ****************************************************************/
5419 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
5425 flowMap->list.count = flowCnt;
5426 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
5427 DU_ALLOC(flowMap->list.array,flowMap->list.size);
5428 if(flowMap->list.array == NULLP)
5432 for(idx=0; idx<flowCnt; idx++)
5434 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
5435 if(flowMap->list.array[idx] == NULLP)
5441 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
5442 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
5448 }/*End of BuildFlowsMap*/
5450 /*******************************************************************
5452 * @brief Builds the Uplink Tunnel Info
5456 * Function : BuildULTnlInfo
5458 * Functionality: Constructs the UL TnlInfo For DRB list
5460 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
5462 * @return ROK - success
5465 * ****************************************************************/
5466 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
5471 ulInfo->list.count = ulCnt;
5472 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
5473 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
5474 if(ulInfo->list.array == NULLP)
5478 for(idx=0; idx<ulCnt; idx++)
5480 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
5481 if(ulInfo->list.array[idx] == NULLP)
5487 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
5488 UPTransportLayerInformation_PR_gTPTunnel;
5490 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
5491 sizeof(GTPTunnel_t));
5492 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
5496 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5497 transportLayerAddress.size = 4*sizeof(uint8_t);
5498 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5499 transportLayerAddress.buf,ulInfo->list.array[idx]->\
5500 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
5501 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5502 transportLayerAddress.buf == NULLP)
5506 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5507 transportLayerAddress.buf[0] = 4;
5508 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5509 transportLayerAddress.buf[1] = 4;
5510 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5511 transportLayerAddress.buf[2] = 4;
5512 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5513 transportLayerAddress.buf[3] = 5;
5514 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5515 transportLayerAddress.bits_unused = 0;
5517 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
5518 = 4 * sizeof(uint8_t);
5519 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5520 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
5521 gTPTunnel->gTP_TEID.size);
5522 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
5527 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5528 gTP_TEID.buf[0] = 11;
5529 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5530 gTP_TEID.buf[1] = 0;
5531 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5532 gTP_TEID.buf[2] = 0;
5533 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5534 gTP_TEID.buf[3] = 1;
5537 }/*End of BuildULTnlInfo*/
5539 /*******************************************************************
5541 * @brief Builds DRBS to be setup
5545 * Function : BuildDRBSetup
5547 * Functionality: Constructs the DRB's for UESetReq
5549 * @params[in] DRBs_ToBeSetup_List_t *drbSet
5551 * @return ROK - success
5554 * ****************************************************************/
5555 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
5557 uint8_t BuildQOSInforet;
5558 uint8_t BuildSNSSAIret;
5559 uint8_t BuildFlowsMapret;
5562 DRBs_ToBeSetup_Item_t *drbSetItem;
5564 drbSet->list.count = drbCnt;
5565 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
5566 DU_ALLOC(drbSet->list.array,drbSet->list.size);
5567 if(drbSet->list.array == NULLP)
5571 for(idx=0; idx<drbCnt; idx++)
5573 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
5574 if(drbSet->list.array[idx] == NULLP)
5580 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
5581 drbSet->list.array[idx]->criticality = Criticality_ignore;
5582 drbSet->list.array[idx]->value.present = \
5583 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
5584 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
5586 drbSetItem->dRBID = 1;
5588 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
5589 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
5590 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
5594 drbSetItem->qoSInformation.choice.choice_extension->id = \
5595 ProtocolIE_ID_id_DRB_Information;
5596 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
5598 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
5599 QoSInformation_ExtIEs__value_PR_DRB_Information;
5600 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
5601 choice_extension->value.choice.DRB_Information.dRB_QoS);
5602 if(BuildQOSInforet != ROK)
5607 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
5608 choice_extension->value.choice.DRB_Information.sNSSAI);
5609 if(BuildSNSSAIret != ROK)
5613 /*Flows mapped to DRB List*/
5614 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
5615 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
5616 if(BuildFlowsMapret != ROK)
5620 /*ULUPTNLInformation To Be Setup List*/
5621 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
5622 if(BuildULTnlInforet != ROK)
5627 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
5629 /*UL Configuration*/
5630 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
5631 if(drbSetItem->uLConfiguration == NULLP)
5635 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
5637 }/* End of BuildDRBSetup*/
5638 /*******************************************************************
5640 * @brief Deallocating memory of function BuildAndSendUESetReq
5644 * Function : FreeNrcgi
5646 * Functionality: Deallocating memory for function BuildNrcgi
5648 * @params[in] NRCGI_t *nrcgi
5652 *******************************************************************/
5653 void FreeNrcgi(NRCGI_t *nrcgi)
5655 if(nrcgi->pLMN_Identity.buf != NULLP)
5657 if(nrcgi->nRCellIdentity.buf != NULLP)
5659 DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
5661 DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
5664 /*******************************************************************
5666 * @brief Deallocating memory of function BuildAndSendUESetReq
5670 * Function : FreeSplCellList
5672 * Functionality: Deallocating memory for function BuildSplCellList
5674 * @params[in] SCell_ToBeSetup_List_t *spCellLst
5679 * *****************************************************************/
5680 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
5683 if(spCellLst->list.array != NULLP)
5685 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
5687 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
5689 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
5691 if(spCellLst->list.array[cellidx]!=NULLP)
5693 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
5696 DU_FREE(spCellLst->list.array,spCellLst->list.size);
5699 /*******************************************************************
5701 * @brief Deallocating memory of function BuildAndSendUESetReq
5705 * Function : FreeSRBSetup
5707 * Functionality: Deallocating memory for function BuildSRBSetup
5709 * @params[in] SRBs_ToBeSetup_List_t *srbSet
5714 * ******************************************************************/
5715 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
5718 if(srbSet->list.array != NULLP)
5720 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
5722 if(srbSet->list.array[srbidx]!=NULLP)
5724 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
5727 DU_FREE(srbSet->list.array,srbSet->list.size);
5730 /*******************************************************************
5732 * @brief Deallocating memory of function BuildAndSendUESetReq
5736 * Function : FreeQOSInfo
5738 * Functionality: Deallocating memory for function BuildQOSInfo
5740 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
5744 * ****************************************************************/
5745 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
5747 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
5749 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
5751 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5753 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
5754 sizeof(MaxDataBurstVolume_t));
5756 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
5757 sizeof(AveragingWindow_t));
5759 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
5760 sizeof(NonDynamic5QIDescriptor_t));
5763 /*******************************************************************
5765 * @brief Deallocating memory of function BuildAndSendUESetReq
5769 * Function : FreeULTnlInfo
5771 * Functionality: Deallocating memory for function BuildULTnlInfo
5773 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
5778 * ****************************************************************/
5779 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
5782 if(ulInfo->list.array != NULLP)
5784 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
5786 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
5788 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
5790 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5791 transportLayerAddress.buf != NULLP)
5793 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
5796 DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5797 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
5798 gTPTunnel->gTP_TEID.size);
5800 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5801 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
5802 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
5804 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
5805 sizeof(GTPTunnel_t));
5808 if(ulInfo->list.array[ulidx]!=NULLP)
5810 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
5813 DU_FREE(ulInfo->list.array,ulInfo->list.size);
5816 /*******************************************************************
5818 * @brief Deallocating memory for BuildAndSendUESetReq
5822 * Function : FreeDRBSetup
5824 * Functionality: Deallocating memory for BuildDRBSetup
5826 * @params[in] DRBs_ToBeSetup_List_t *drbSet
5830 * ****************************************************************/
5831 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
5833 DRBs_ToBeSetup_Item_t *drbSetItem;
5836 if(drbSet->list.array == NULLP)
5838 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
5840 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
5842 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
5843 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
5845 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5846 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
5848 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5849 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
5851 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5852 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5854 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
5856 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
5858 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
5860 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5861 flows_Mapped_To_DRB_List.list.array != NULLP)
5863 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5864 flows_Mapped_To_DRB_List.list.count; flowidx++)
5866 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5867 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
5869 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5870 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5871 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
5873 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5874 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5875 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
5877 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5878 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5879 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5881 if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
5883 DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
5885 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
5886 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5887 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5888 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
5889 sizeof(MaxDataBurstVolume_t));
5891 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5892 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5893 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
5895 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5896 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5897 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
5900 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5901 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
5903 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5904 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
5907 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5908 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
5909 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
5911 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
5912 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
5914 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
5915 sizeof(OCTET_STRING_t));
5917 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
5918 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
5920 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5921 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
5923 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5924 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
5926 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5927 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
5929 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
5932 if(drbSet->list.array[drbidx]!=NULLP)
5934 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
5937 DU_FREE(drbSet->list.array,drbSet->list.size);
5940 /*******************************************************************
5942 * @brief Free the UE Setup Request
5946 * Function : FreeUESetReq
5948 * Functionality: Deallocate the memory of BuildUESetReq
5950 * @params[in] F1AP_PDU_t *f1apMsg
5955 * ****************************************************************/
5956 void FreeUESetReq(F1AP_PDU_t *f1apMsg)
5960 UEContextSetupRequest_t *ueSetReq;
5962 if(f1apMsg != NULLP)
5964 if(f1apMsg->choice.initiatingMessage != NULLP)
5966 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5967 if(ueSetReq->protocolIEs.list.array != NULLP)
5969 if(ueSetReq->protocolIEs.list.array[idx])
5974 if(ueSetReq->protocolIEs.list.array[idx])
5976 if(SplCellListret==ROK)
5979 if(ueSetReq->protocolIEs.list.array[idx])
5981 if(SRBSetupret == ROK)
5984 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
5987 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
5991 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
5995 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
5997 for(ieId=0; ieId<ueSetReq->protocolIEs.list.count; ieId++)
5999 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
6001 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
6004 DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6006 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6008 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6012 /*******************************************************************
6014 * @brief Builds and sends the UE Setup Request
6018 * Function : BuildAndSendUESetReq
6020 * Functionality: Constructs the UE Setup Request and sends
6021 * it to the CU through SCTP.
6025 * @return ROK - success
6028 * ****************************************************************/
6029 uint8_t BuildAndSendUESetReq()
6035 F1AP_PDU_t *f1apMsg = NULL;
6036 UEContextSetupRequest_t *ueSetReq;
6037 asn_enc_rval_t encRetVal; /* Encoder return value */
6038 uint8_t ret= RFAILED;
6042 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
6044 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6045 if(f1apMsg == NULLP)
6047 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6051 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6052 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6053 if(f1apMsg->choice.initiatingMessage == NULLP)
6055 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6059 f1apMsg->choice.initiatingMessage->procedureCode = \
6060 ProcedureCode_id_UEContextSetup;
6061 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6062 f1apMsg->choice.initiatingMessage->value.present = \
6063 InitiatingMessage__value_PR_UEContextSetupRequest;
6065 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6067 ueSetReq->protocolIEs.list.count = elementCnt;
6068 ueSetReq->protocolIEs.list.size = \
6069 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6071 /* Initialize the UESetup members */
6072 DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6074 if(ueSetReq->protocolIEs.list.array == NULLP)
6076 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
6080 for(idx1=0; idx1<elementCnt; idx1++)
6082 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6083 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6091 /*GNB CU UE F1AP ID*/
6092 ueSetReq->protocolIEs.list.array[idx]->id = \
6093 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6094 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6095 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6096 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6097 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
6099 /*GNB DU UE F1AP ID*/
6101 ueSetReq->protocolIEs.list.array[idx]->id = \
6102 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6103 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6104 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6105 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6106 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
6110 ueSetReq->protocolIEs.list.array[idx]->id = \
6111 ProtocolIE_ID_id_SpCell_ID;
6112 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6113 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6114 UEContextSetupRequestIEs__value_PR_NRCGI;
6115 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6121 /*Served Cell Index*/
6123 ueSetReq->protocolIEs.list.array[idx]->id = \
6124 ProtocolIE_ID_id_ServCellIndex;
6125 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6126 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6127 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6128 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6131 /*CellULConfigured*/
6133 ueSetReq->protocolIEs.list.array[idx]->id = \
6134 ProtocolIE_ID_id_SpCellULConfigured;
6135 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6136 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6137 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6138 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6139 CellULConfigured_none;
6142 /*CUtoDURRCContainer*/
6144 ueSetReq->protocolIEs.list.array[idx]->id = \
6145 ProtocolIE_ID_id_CUtoDURRCInformation;
6146 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6147 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6148 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6150 /*Special Cells to be SetupList*/
6152 ueSetReq->protocolIEs.list.array[idx]->id = \
6153 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6154 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6155 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6156 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6157 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6158 if(SplCellListret != ROK)
6162 /*SRBs To Be Setup List*/
6164 ueSetReq->protocolIEs.list.array[idx]->id = \
6165 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6166 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6167 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6168 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6169 SRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6170 if(SRBSetupret != ROK)
6174 /*DRBs to Be Setup List*/
6176 ueSetReq->protocolIEs.list.array[idx]->id = \
6177 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6178 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6179 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6180 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6181 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6187 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6189 /* Encode the F1SetupRequest type as APER */
6190 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6192 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6194 /* Encode results */
6195 if(encRetVal.encoded == ENCODE_FAIL)
6197 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6198 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6203 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
6204 for(int i=0; i< encBufSize; i++)
6206 printf("%x",encBuf[i]);
6211 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
6213 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
6219 FreeUESetReq(f1apMsg);
6222 }/* End of BuildAndSendUESetReq*/
6224 /*******************************************************************
6226 * @brief Handles received F1AP message and sends back response
6230 * Function : F1APMsgHdlr
6233 * - Decodes received F1AP control message
6234 * - Prepares response message, encodes and sends to SCTP
6237 * @return ROK - success
6240 * ****************************************************************/
6241 void F1APMsgHdlr(Buffer *mBuf)
6247 F1AP_PDU_t *f1apMsg;
6248 asn_dec_rval_t rval; /* Decoder return value */
6249 F1AP_PDU_t f1apasnmsg ;
6251 DU_LOG("\nF1AP : Received F1AP message buffer");
6252 SPrntMsg(mBuf, 0,0);
6254 /* Copy mBuf into char array to decode it */
6255 SFndLenMsg(mBuf, &recvBufLen);
6256 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
6258 DU_LOG("\nF1AP : Memory allocation failed");
6261 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6263 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
6267 printf("\nF1AP : Received flat buffer to be decoded : ");
6268 for(i=0; i< recvBufLen; i++)
6270 printf("%x",recvBuf[i]);
6273 /* Decoding flat buffer into F1AP messsage */
6274 f1apMsg = &f1apasnmsg;
6275 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
6277 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
6278 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
6279 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6281 DU_LOG("\nF1AP : ASN decode failed");
6285 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6287 switch(f1apMsg->present)
6289 case F1AP_PDU_PR_successfulOutcome:
6291 switch(f1apMsg->choice.successfulOutcome->value.present)
6293 case SuccessfulOutcome__value_PR_F1SetupResponse:
6295 #ifndef ODU_TEST_STUB
6296 procF1SetupRsp(f1apMsg);
6301 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
6303 procGNBDUCfgUpdAck(f1apMsg);
6309 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
6312 }/* End of switch(successfulOutcome) */
6315 case F1AP_PDU_PR_initiatingMessage:
6317 switch(f1apMsg->choice.initiatingMessage->value.present)
6319 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
6321 procDlRrcMsgTrans(f1apMsg);
6327 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
6328 f1apMsg->choice.initiatingMessage->value.present);
6331 }/* End of switch(initiatingMessage) */
6337 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
6341 }/* End of switch(f1apMsg->present) */
6343 } /* End of F1APMsgHdlr */
6345 /**********************************************************************
6347 **********************************************************************/