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 */
20 #include "common_def.h"
25 #include "du_app_mac_inf.h"
28 #include "du_mgr_main.h"
30 #include "GNB-DU-System-Information.h"
31 #include "CellGroupConfigRrc.h"
32 #include "MAC-CellGroupConfig.h"
33 #include "SchedulingRequestConfig.h"
34 #include "SchedulingRequestToAddMod.h"
35 #include "BSR-Config.h"
36 #include "TAG-Config.h"
38 #include "PHR-Config.h"
39 #include "RLC-Config.h"
40 #include "UL-AM-RLC.h"
41 #include "DL-AM-RLC.h"
42 #include "LogicalChannelConfig.h"
43 #include "RLC-BearerConfig.h"
44 #include "PhysicalCellGroupConfig.h"
45 #include "SpCellConfig.h"
46 #include "ServingCellConfig.h"
47 #include "ControlResourceSet.h"
48 #include "SearchSpace.h"
49 #include "PDCCH-Config.h"
50 #include "PDSCH-TimeDomainResourceAllocation.h"
51 #include "PDSCH-TimeDomainResourceAllocationList.h"
52 #include "DMRS-DownlinkConfig.h"
53 #include "PDSCH-Config.h"
54 #include "BWP-DownlinkDedicated.h"
55 #include "PUSCH-TimeDomainResourceAllocation.h"
56 #include "PUSCH-TimeDomainResourceAllocationList.h"
57 #include "DMRS-UplinkConfig.h"
58 #include "PUSCH-Config.h"
59 #include "SRS-ResourceId.h"
60 #include "SRS-Resource.h"
61 #include "SRS-ResourceSet.h"
62 #include "SRS-Config.h"
63 #include "BWP-UplinkDedicated.h"
64 #include "PUSCH-ServingCellConfig.h"
65 #include "UplinkConfig.h"
66 #include "PDSCH-ServingCellConfig.h"
67 #include "DUtoCURRCContainer.h"
68 #include<ProtocolIE-Field.h>
69 #include "ProtocolExtensionField.h"
71 #include "odu_common_codec.h"
72 #include "du_f1ap_msg_hdl.h"
74 S16 procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg);
75 uint8_t procDlRrcMsgTrans(F1AP_PDU_t *f1apMsg);
76 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg);
77 extern char encBuf[ENC_BUF_MAX_LEN];
78 extern DuCfgParams duCfgParam;
79 uint8_t BuildULTnlInforet=RFAILED;
80 uint8_t ServedCellListreturn=RFAILED;
81 S16 sctpSend(Buffer *mBuf, U8 itfType);
82 uint8_t Nrcgiret=RFAILED;
83 uint8_t SplCellListret=RFAILED;
84 uint8_t SRBSetupret=RFAILED;
85 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp);
87 /*******************************************************************
89 * @brief Builds Uplink Info for NR
93 * Function : BuildULNRInfo
95 * Functionality: Building NR Uplink Info
97 * @params[in] NRFreqInfo_t *ulnrfreq
98 * @return ROK - success
101 * ****************************************************************/
102 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
105 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
106 fdd.ulNrFreqInfo.nrArfcn;
107 ulnrfreq->freqBandListNr.list.count = 1;
108 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
109 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
110 if(ulnrfreq->freqBandListNr.list.array == NULLP)
114 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
116 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
117 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
122 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
123 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
124 freqBand[0].nrFreqBand;
125 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
128 /*******************************************************************
130 * @brief Builds Downlink NR Info
134 * Function : BuildDLNRInfo
136 * Functionality: Building Downlink NR Info
138 * @params[in] NRFreqInfo_t *dlnrfreq
139 * @return ROK - success
142 * ****************************************************************/
143 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
146 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
147 fdd.dlNrFreqInfo.nrArfcn;
148 dlnrfreq->freqBandListNr.list.count = 1;
149 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
150 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
151 if(dlnrfreq->freqBandListNr.list.array == NULLP)
155 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
157 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
158 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
163 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
164 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
165 freqBand[0].nrFreqBand;
166 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
171 /*******************************************************************
173 * @brief Builds Nrcgi
177 * Function : BuildNrcgi
179 * Functionality: Building the PLMN ID and NR Cell id
181 * @params[in] NRCGI_t *nrcgi
182 * @return ROK - success
185 * ****************************************************************/
186 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
190 uint8_t byteSize = 5;
192 /* Allocate Buffer Memory */
193 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
194 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
195 if(nrcgi->pLMN_Identity.buf == NULLP)
199 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
200 &nrcgi->pLMN_Identity); // Building PLMN function
206 //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
207 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
208 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
209 if(nrcgi->nRCellIdentity.buf == NULLP)
213 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
220 /*******************************************************************
222 * @brief Builds FiveGStac
226 * Function : BuildFiveGSTac
228 * Functionality: Building the FiveGSTac
230 * @params[in] OCTET_STRING_t *fivegsTac
231 * @return ROK - success
234 * ****************************************************************/
235 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
237 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
238 if(servcell->fiveGS_TAC == NULLP)
242 servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
243 DU_ALLOC(servcell->fiveGS_TAC->buf,\
244 sizeof(servcell->fiveGS_TAC->size));
245 if(servcell->fiveGS_TAC->buf == NULLP)
249 servcell->fiveGS_TAC->buf[0] = 0;
250 servcell->fiveGS_TAC->buf[1] = 0;
251 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
254 /*******************************************************************
256 * @brief Builds NR Mode
260 * Function : BuildNrMode
262 * Functionality: Building the NR Mode
264 * @params[in] NR_Mode_Info_t *fdd
265 * @return ROK - success
268 * ****************************************************************/
269 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
271 uint8_t BuildDLNRInforet=0;
272 uint8_t BuildULNRInforet=0;
274 mode->present = NR_Mode_Info_PR_fDD;
275 if(mode->present == NR_Mode_Info_PR_fDD)
277 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
278 if(mode->choice.fDD == NULLP)
282 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
283 if(BuildULNRInforet != ROK)
287 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
288 if(BuildDLNRInforet != ROK)
293 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
294 duCfgParam.srvdCellLst[0].duCellInfo.\
295 f1Mode.mode.fdd.ulTxBw.nrScs;
296 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
297 duCfgParam.srvdCellLst[0].duCellInfo.\
298 f1Mode.mode.fdd.ulTxBw.nrb;
299 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
300 duCfgParam.srvdCellLst[0].duCellInfo.\
301 f1Mode.mode.fdd.dlTxBw.nrScs;
302 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
303 duCfgParam.srvdCellLst[0].duCellInfo.\
304 f1Mode.mode.fdd.dlTxBw.nrb;
307 /*******************************************************************
309 * @brief Builds IE Extensions for Served PLMNs
313 * Function : BuildExtensions
315 * Functionality: Building the IE Extensions
317 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
318 * @return ROK - success
321 * ****************************************************************/
322 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
326 uint8_t extensionCnt=1;
329 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
330 if((*ieExtend) == NULLP)
334 (*ieExtend)->list.count = extensionCnt;
335 (*ieExtend)->list.size = \
336 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
337 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
338 if((*ieExtend)->list.array == NULLP)
342 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
344 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
345 sizeof(ServedPLMNs_ItemExtIEs_t));
346 if((*ieExtend)->list.array[plmnidx] == NULLP)
352 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
353 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
354 (*ieExtend)->list.array[idx]->extensionValue.present = \
355 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
356 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
358 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
359 list.size = sizeof(SliceSupportItem_t *);
360 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
361 list.array,sizeof(SliceSupportItem_t *));
362 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
367 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
368 list.array[sliceId],sizeof(SliceSupportItem_t));
369 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
370 list.array[sliceId] == NULLP)
374 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
375 list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
376 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
377 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
378 extensionValue.choice.SliceSupportList.\
379 list.array[sliceId]->sNSSAI.sST.size);
380 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
381 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
385 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
386 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
387 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
388 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
389 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
390 list.array[sliceId]->sNSSAI.sD == NULLP)
394 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
395 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
396 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
397 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
398 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
399 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
400 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
405 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
406 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
408 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
409 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
411 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
412 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
415 /*******************************************************************
417 * @brief Builds Served PLMN
421 * Function : BuildServedPlmn
423 * Functionality: Building the Served PLMN
425 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
426 * @return ROK - success
429 * ****************************************************************/
430 uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
433 uint8_t servPlmnCnt=1;
434 uint8_t buildPlmnIdret=0;
435 uint8_t BuildExtensionsret=0;
436 srvplmn->list.count = servPlmnCnt;
437 srvplmn->list.size = \
438 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
439 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
440 if(srvplmn->list.array == NULLP)
444 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
446 DU_ALLOC(srvplmn->list.array[plmnidx],\
447 sizeof(ServedPLMNs_Item_t));
448 if(srvplmn->list.array[plmnidx] == NULLP)
453 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
454 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
455 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
456 &srvplmn->list.array[0]->pLMN_Identity);
457 if(buildPlmnIdret!= ROK)
461 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
462 if(BuildExtensionsret!= ROK)
468 /*******************************************************************
470 * @brief Builds Served Cell List
474 * Function : BuildServedCellList
476 * Functionality: Building Served Cell List
478 * @params[in] PLMNID plmn
479 * @return ROK - success
482 * ****************************************************************/
484 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
486 uint8_t BuildNrcgiret=0;
487 uint8_t BuildFiveGSTacret=0;
488 uint8_t BuildServedPlmnret=0;
489 uint8_t BuildNrModeret=0;
493 GNB_DU_Served_Cells_Item_t *srvCellItem;
494 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
495 duServedCell->list.count = plmnCnt;
497 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
498 if(duServedCell->list.array == NULLP)
502 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
504 DU_ALLOC(duServedCell->list.array[plmnidx],\
505 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
506 if(duServedCell->list.array[plmnidx] == NULLP)
512 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
513 duServedCell->list.array[idx]->criticality = Criticality_reject;
514 duServedCell->list.array[idx]->value.present = \
515 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
517 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
519 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
520 if(BuildNrcgiret != ROK)
525 srvCellItem->served_Cell_Information.nRPCI = \
526 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
529 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
530 if(BuildFiveGSTacret != ROK)
535 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
536 if(BuildServedPlmnret !=ROK)
540 /*nR Mode Info with FDD*/
541 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
542 if(BuildNrModeret != ROK)
546 /*Measurement timing Config*/
547 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
548 size = sizeof(uint8_t);
549 DU_ALLOC(srvCellItem->served_Cell_Information.\
550 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
551 if(srvCellItem->served_Cell_Information.\
552 measurementTimingConfiguration.buf == NULLP)
556 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
557 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
559 /* GNB DU System Information */
560 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
561 sizeof(GNB_DU_System_Information_t));
562 if(!srvCellItem->gNB_DU_System_Information)
567 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
568 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
569 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
570 srvCellItem->gNB_DU_System_Information->mIB_message.size);
571 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
575 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
576 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
579 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
580 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
582 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
583 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
584 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
588 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
590 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
591 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
595 /*******************************************************************
597 * @brief Builds RRC Version
601 * Function : BuildRrcVer
603 * Functionality: Building RRC Version
605 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
606 * @return ROK - success
609 * ****************************************************************/
610 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
614 rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
615 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
616 if(rrcVer->latest_RRC_Version.buf == NULLP)
620 rrcVer->latest_RRC_Version.buf[0] = 0;
621 rrcVer->latest_RRC_Version.bits_unused = 5;
622 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
623 if(rrcVer->iE_Extensions == NULLP)
627 rrcVer->iE_Extensions->list.count = 1;
628 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
629 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
630 if(rrcVer->iE_Extensions->list.array == NULLP)
635 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
636 sizeof(RRC_Version_ExtIEs_t));
637 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
641 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
642 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
643 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
644 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
645 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
646 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
647 .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
648 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
649 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
650 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
651 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
652 .Latest_RRC_Version_Enhanced.buf == NULLP)
657 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
658 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
660 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
661 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
663 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
664 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
667 /*******************************************************************
669 * @brief Sends F1 msg over SCTP
673 * Function : SendF1APMsg
675 * Functionality: Sends F1 msg over SCTP
677 * @params[in] Region region
679 * @return ROK - success
682 * ****************************************************************/
683 uint8_t SendF1APMsg(Region region, Pool pool)
687 if(SGetMsg(region, pool, &mBuf) == ROK)
689 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
693 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
695 DU_LOG("\nF1AP : SCTP Send failed");
702 DU_LOG("\nF1AP : SAddPstMsgMult failed");
710 DU_LOG("\nF1AP : Failed to allocate memory");
716 /*******************************************************************
718 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
722 * Function : FreeRrcVer
724 * Functionality: deallocating the memory of function BuildRrcVer
726 * @params[in] RRC_Version_t *rrcVer
730 *****************************************************************/
731 void FreeRrcVer(RRC_Version_t *rrcVer)
733 if(rrcVer->latest_RRC_Version.buf != NULLP)
735 if(rrcVer->iE_Extensions != NULLP)
737 if(rrcVer->iE_Extensions->list.array != NULLP)
739 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
741 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
744 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
745 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
746 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
748 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
750 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
752 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
754 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
757 /*******************************************************************
759 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
763 * Function : FreeServedCellList
765 * Functionality: deallocating the memory of function BuildServedCellList
768 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
772 * ****************************************************************/
773 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
779 uint8_t extensionCnt=1;
781 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
782 if(duServedCell->list.array!=NULLP)
784 if(duServedCell->list.array[0]!=NULLP)
786 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
788 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
790 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
792 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
794 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
796 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
798 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
800 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
802 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
804 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
806 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
807 extensionValue.choice.SliceSupportList.list.array!=NULLP)
809 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
810 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
812 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
813 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
815 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
816 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
818 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
819 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
821 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
823 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
824 freqBandListNr.list.array!=NULLP)
826 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
827 freqBandListNr.list.array[0]!=NULLP)
829 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
830 freqBandListNr.list.array)
832 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
833 freqBandListNr.list.array[0]!=NULLP)
835 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
837 if(!srvCellItem->gNB_DU_System_Information)
839 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
841 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
843 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
844 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
845 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
846 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
848 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
849 srvCellItem->gNB_DU_System_Information->mIB_message.size);
850 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
851 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
853 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
855 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
856 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
858 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
859 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
861 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
862 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
864 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
865 list.array[0],sizeof(FreqBandNrItem_t));
867 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
868 list.array,sizeof(FreqBandNrItem_t*));
870 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
872 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
873 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
874 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
875 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
877 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
878 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
879 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
881 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
882 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
883 sNSSAI.sST.buf,sizeof(uint8_t));
885 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
886 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
888 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
889 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
891 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
892 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
894 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
895 array[servId]->iE_Extensions->list.array,\
896 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
898 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
899 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
901 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
902 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
903 servedPLMNs.list.array[servId]->pLMN_Identity.size
906 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
907 sizeof(ServedPLMNs_Item_t *));
909 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
910 sizeof(ServedPLMNs_Item_t *));
912 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
913 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
915 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
917 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
918 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
921 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
922 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
925 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
927 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
930 /*******************************************************************
932 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
936 * Function : FreeF1SetupReq
938 * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
940 * @params[in] F1AP_PDU_t *f1apMsg
944 * ****************************************************************/
945 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
949 F1SetupRequest_t *f1SetupReq=NULLP;
954 if(f1apMsg->choice.initiatingMessage != NULLP)
956 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
957 if(f1SetupReq->protocolIEs.list.array != NULLP)
959 if(f1SetupReq->protocolIEs.list.array[idx1]!=NULLP)
961 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf != NULLP)
964 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf != NULLP)
967 if(ServedCellListreturn == ROK)
969 FreeRrcVer(&f1SetupReq->protocolIEs.list.array[idx1]->value.choice.RRC_Version);
972 FreeServedCellList(&f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Served_Cells_List);
974 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf,
975 strlen((char *)duCfgParam.duName));
978 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
979 f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
982 for(idx=0; idx<f1SetupReq->protocolIEs.list.count; idx++)
984 if(f1SetupReq->protocolIEs.list.array[idx]!=NULLP)
986 DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
989 DU_FREE(f1SetupReq->protocolIEs.list.array,\
990 f1SetupReq->protocolIEs.list.size);
992 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
994 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
998 /*******************************************************************
1000 * @brief Builds and Send the F1SetupRequest
1004 * Function : BuildAndSendF1SetupReq
1006 * Functionality:Fills the F1SetupRequest
1008 * @return ROK - success
1011 ******************************************************************/
1012 uint8_t BuildAndSendF1SetupReq()
1017 uint8_t elementCnt=0;
1018 F1AP_PDU_t *f1apMsg = NULLP;
1019 F1SetupRequest_t *f1SetupReq=NULLP;
1020 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1021 RRC_Version_t *rrcVer=NULLP;
1022 asn_enc_rval_t encRetVal; /* Encoder return value */
1023 uint8_t ret= RFAILED;
1024 uint8_t BuildRrcVerreturn=0;
1026 DU_LOG("\nF1AP : Building F1 Setup Request\n");
1029 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1030 if(f1apMsg == NULLP)
1034 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1035 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1036 if(f1apMsg->choice.initiatingMessage == NULLP)
1040 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1041 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1042 f1apMsg->choice.initiatingMessage->value.present = \
1043 InitiatingMessage__value_PR_F1SetupRequest;
1045 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1047 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1049 f1SetupReq->protocolIEs.list.count = elementCnt;
1050 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1052 /* Initialize the F1Setup members */
1053 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1054 if(f1SetupReq->protocolIEs.list.array == NULLP)
1058 for(idx=0; idx<elementCnt; idx++)
1060 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
1061 sizeof(F1SetupRequestIEs_t));
1062 if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
1070 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
1071 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1072 f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
1073 F1SetupRequestIEs__value_PR_TransactionID;
1074 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
1079 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
1080 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1081 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1082 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1083 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
1086 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
1087 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
1088 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
1094 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
1098 if(duCfgParam.duName != NULL)
1101 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
1102 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
1103 f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1104 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
1105 strlen((char *)duCfgParam.duName);
1106 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
1107 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1108 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
1113 strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
1114 choice.GNB_DU_Name.buf,
1115 (char*)&duCfgParam.duName);
1119 /*Served Cell list */
1121 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1122 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1123 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1124 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1125 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1126 duServedCell = &f1SetupReq->protocolIEs.list.\
1127 array[idx2]->value.choice.GNB_DU_Served_Cells_List;
1128 ServedCellListreturn = BuildServedCellList(duServedCell);
1129 if(ServedCellListreturn != ROK)
1135 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1136 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1137 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1138 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1139 F1SetupRequestIEs__value_PR_RRC_Version;
1140 rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1141 BuildRrcVerreturn = BuildRrcVer(rrcVer);
1142 if(BuildRrcVerreturn != ROK)
1146 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1148 /* Encode the F1SetupRequest type as APER */
1149 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1151 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1154 /* Encode results */
1155 if(encRetVal.encoded == ENCODE_FAIL)
1157 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1158 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1163 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1164 for(i=0; i< encBufSize; i++)
1166 printf("%x",encBuf[i]);
1171 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1173 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1181 FreeF1SetupReq(f1apMsg);
1184 }/* End of BuildAndSendF1SetupReq */
1186 /*******************************************************************
1188 * @brief Builds and sends the DUConfigUpdate
1192 * Function : BuildAndSendDUConfigUpdate
1194 * Functionality: Constructs the DU Update message and sends
1195 * it to the CU through SCTP.
1197 * @params[in] void **buf,Buffer to which encoded pattern is written into
1198 * @params[in] int *size,size of buffer
1200 * @return ROK - success
1203 * ****************************************************************/
1204 uint8_t BuildAndSendDUConfigUpdate()
1213 uint8_t servPlmnCnt;
1214 uint8_t extensionCnt;
1215 asn_enc_rval_t encRetVal; /* Encoder return value */
1216 F1AP_PDU_t *f1apDuCfg = NULL;
1217 GNBDUConfigurationUpdate_t *duCfgUpdate;
1218 Served_Cells_To_Modify_List_t *cellsToModify;
1219 Served_Cells_To_Modify_Item_t *modifyItem;
1220 uint8_t ret= RFAILED;
1225 DU_LOG("\nF1AP : Building DU config update\n");
1226 /* Allocate the memory for F1DuCfg */
1227 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1228 if(f1apDuCfg == NULLP)
1230 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1234 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1235 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1236 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1238 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1242 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1243 ProcedureCode_id_gNBDUConfigurationUpdate;
1244 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1245 f1apDuCfg->choice.initiatingMessage->value.present = \
1246 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1247 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1248 choice.GNBDUConfigurationUpdate;
1250 duCfgUpdate->protocolIEs.list.count = elementCnt;
1251 duCfgUpdate->protocolIEs.list.size = \
1252 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1254 /* Initialize the F1Setup members */
1255 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1256 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1258 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1261 for(idx=0;idx<elementCnt;idx++)
1263 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1264 if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1272 duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1273 duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1274 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1275 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1276 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1279 /*Served Cell to Modify */
1281 duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1282 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1283 duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1284 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1285 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1286 cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1287 Served_Cells_To_Modify_List;
1289 cellsToModify->list.count = modifyCnt;
1290 cellsToModify->list.size = \
1291 modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1292 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1293 if(cellsToModify->list.array == NULLP)
1297 for(idy=0; idy<modifyCnt ;idy++)
1299 DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1300 Served_Cells_To_Modify_ItemIEs_t));
1301 if(cellsToModify->list.array[idy] == NULLP)
1306 cellsToModify->list.array[0]->id = \
1307 ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1308 cellsToModify->list.array[0]->criticality = Criticality_reject;
1309 cellsToModify->list.array[0]->value.present =\
1310 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1311 modifyItem=&cellsToModify->list.array[0]->value.choice.\
1312 Served_Cells_To_Modify_Item;
1315 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1316 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1317 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1321 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1322 &modifyItem->oldNRCGI.pLMN_Identity);
1325 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1326 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1327 modifyItem->oldNRCGI.nRCellIdentity.size);
1328 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1332 for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1334 modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1336 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1337 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1340 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1341 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1342 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1343 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1347 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1348 &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1349 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1350 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1351 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1352 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1356 for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1357 nRCGI.nRCellIdentity.size-1 ; tmp++)
1359 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1361 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1362 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1364 modifyItem->served_Cell_Information.nRPCI = \
1365 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1368 modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1369 modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1370 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1371 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1372 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1373 if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1377 for(idy1=0;idy1<servPlmnCnt;idy1++)
1379 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1380 sizeof(ServedPLMNs_Item_t));
1381 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1386 modifyItem->served_Cell_Information.servedPLMNs.list.\
1387 array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1388 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1389 array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1390 array[0]->pLMN_Identity.size);
1391 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1392 array[0]->pLMN_Identity.buf == NULLP)
1396 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1397 &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1398 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1399 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1400 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1401 array[0]->iE_Extensions == NULLP)
1406 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1407 iE_Extensions->list.count = extensionCnt;
1408 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1409 iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1410 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1411 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1412 iE_Extensions->list.size);
1413 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1414 array[0]->iE_Extensions->list.array == NULLP)
1418 for(idy2=0;idy2<extensionCnt;idy2++)
1420 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1421 array[0]->iE_Extensions->list.array[idy2],\
1422 sizeof(ServedPLMNs_ItemExtIEs_t));
1423 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1424 array[0]->iE_Extensions->list.array[idy2] == NULLP)
1429 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1430 iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1431 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1432 iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1433 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1434 iE_Extensions->list.array[0]->extensionValue.present = \
1435 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1436 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1437 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1439 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1440 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1441 list.size = sizeof(SliceSupportItem_t *);
1442 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1443 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1444 list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1445 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1446 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1447 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1448 list.array == NULLP)
1453 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1454 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1455 list.array[0],sizeof( SliceSupportItem_t));
1456 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1457 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1458 list.array[0] == 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.size = sizeof(uint8_t);
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.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1468 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1469 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1470 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1471 list.array[0]->sNSSAI.sST.buf == NULLP)
1475 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1476 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1477 list.array[0]->sNSSAI.sST.buf[0] = 3;
1478 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1479 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1480 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1481 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1482 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1483 list.array[0]->sNSSAI.sD == NULLP)
1487 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1488 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1489 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1490 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1491 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1492 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1493 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1494 list.array[0]->sNSSAI.sD->size);
1495 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1496 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1497 list.array[0]->sNSSAI.sD->buf == NULLP)
1501 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1502 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1503 list.array[0]->sNSSAI.sD->buf[0] = 3;
1504 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1505 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1506 list.array[0]->sNSSAI.sD->buf[1] = 6;
1507 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1508 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1509 list.array[0]->sNSSAI.sD->buf[2] = 9;
1511 /*nR Mode Info with FDD*/
1512 modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1513 NR_Mode_Info_PR_fDD;
1514 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1515 sizeof(FDD_Info_t));
1516 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1520 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1521 uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1522 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1523 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1524 uL_NRFreqInfo.freqBandListNr.list.count = 1;
1525 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1526 uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1527 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1528 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1529 array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1530 uL_NRFreqInfo.freqBandListNr.list.size);
1531 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1532 fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1536 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1537 uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1538 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1539 uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1543 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1544 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1545 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1546 freqBand[0].nrFreqBand;
1547 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1548 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1549 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1550 nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1551 dlNrFreqInfo.nrArfcn;
1552 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1553 freqBandListNr.list.count = 1;
1554 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1555 freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1556 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1557 dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1558 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1559 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1560 dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1564 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1565 dL_NRFreqInfo.freqBandListNr.list.array[0],\
1566 sizeof(FreqBandNrItem_t));
1567 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1568 dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1572 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1573 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1574 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1575 freqBand[0].nrFreqBand;
1576 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1577 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1579 /*Transmission Bandwidth*/
1580 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1581 uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1582 f1Mode.mode.fdd.ulTxBw.nrScs;
1583 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1584 uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1585 f1Mode.mode.fdd.ulTxBw.nrb;
1586 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1587 dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1588 f1Mode.mode.fdd.dlTxBw.nrScs;
1589 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1590 dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1591 f1Mode.mode.fdd.dlTxBw.nrb;
1592 /*Measurement timing Config*/
1593 modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1595 DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1596 buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1597 if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1601 modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1602 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1604 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1607 duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1608 duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1609 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1610 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1611 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1613 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1614 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1615 if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1619 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1622 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1624 /* Encode the DU Config Update type as APER */
1625 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1627 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1629 /* Checking encode results */
1630 if(encRetVal.encoded == ENCODE_FAIL)
1632 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1637 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1638 for(i=0; i< encBufSize; i++)
1640 printf("%x",encBuf[i]);
1644 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1646 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1653 FreeDUConfigUpdate(f1apDuCfg);
1657 /*******************************************************************
1659 * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1663 * Function : FreeDUConfigUpdate
1665 * Functionality: Deallocating memory of variables allocated in
1666 * BuildAndSendDUConfigUpdate function
1668 * @params[in] F1AP_PDU_t *f1apDuCfg
1670 * @return ROK - void
1672 * ****************************************************************/
1673 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1677 GNBDUConfigurationUpdate_t *duCfgUpdate;
1678 Served_Cells_To_Modify_List_t *cellsToModify;
1679 Served_Cells_To_Modify_Item_t *modifyItem;
1682 if(f1apDuCfg != NULLP)
1684 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1686 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1687 value.choice.GNBDUConfigurationUpdate;
1688 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1690 if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
1692 cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
1693 value.choice.Served_Cells_To_Modify_List;
1694 if(cellsToModify->list.array != NULLP)
1696 if(cellsToModify->list.array[idx] != NULLP)
1698 modifyItem=&cellsToModify->list.array[idx]->value.choice.\
1699 Served_Cells_To_Modify_Item;
1700 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1702 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1704 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1706 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1709 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1712 if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
1714 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1715 array[idx]->pLMN_Identity.buf != NULLP)
1717 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1718 array[idx]->iE_Extensions!= NULLP)
1720 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1721 array[idx]->iE_Extensions->list.array != NULLP)
1723 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1724 array[idx]->iE_Extensions->list.array[idx])
1726 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1727 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1730 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1731 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1732 list.array[idx]!=NULLP)
1734 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1735 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1736 list.array[idx]->sNSSAI.sST.buf!=NULLP)
1738 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1739 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1740 list.array[idx]->sNSSAI.sD != NULLP)
1742 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1743 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1744 list.array[idx]->sNSSAI.sD->buf!=NULLP)
1746 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1749 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1750 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1752 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1753 fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
1755 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1756 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1758 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1759 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1762 if(modifyItem->served_Cell_Information.\
1763 measurementTimingConfiguration.buf !=NULLP)
1766 if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
1767 choice.GNB_DU_ID.buf!=NULLP)
1769 DU_FREE(duCfgUpdate->protocolIEs.list.\
1770 array[idx]->value.choice.GNB_DU_ID.buf,\
1771 duCfgUpdate->protocolIEs.list.array[idx]->\
1772 value.choice.GNB_DU_ID.size);
1775 DU_FREE(modifyItem->served_Cell_Information.\
1776 measurementTimingConfiguration.\
1777 buf,modifyItem->served_Cell_Information.\
1778 measurementTimingConfiguration.size);
1780 DU_FREE(modifyItem->served_Cell_Information.\
1781 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1782 list.array[idx],sizeof(FreqBandNrItem_t));
1784 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1785 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1786 modifyItem->served_Cell_Information.nR_Mode_Info.\
1787 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1789 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1790 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1791 array[idx],sizeof(FreqBandNrItem_t));
1793 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1795 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1796 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1797 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1799 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1800 fDD,sizeof(FDD_Info_t));
1802 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1803 array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1805 list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1806 servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
1807 extensionValue.choice.SliceSupportList.list.array[idx]->\
1811 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1813 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1814 list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1816 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1817 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1818 list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
1820 list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1821 SliceSupportList.list.array[idx]->sNSSAI.sST.size);
1823 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1824 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1825 list.array[idx],sizeof(SliceSupportItem_t));
1827 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1828 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1830 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1831 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
1834 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
1835 array[idx]->iE_Extensions->list.count;i++)
1837 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1838 array[idx]->iE_Extensions->list.array[i],\
1839 sizeof(ServedPLMNs_ItemExtIEs_t ));
1841 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1842 array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1843 list.array[idx]->iE_Extensions->list.size);
1845 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1846 array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1848 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1849 array[idx]->pLMN_Identity.buf,
1850 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
1853 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1855 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
1858 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1859 sizeof(ServedPLMNs_Item_t));
1862 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1863 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1865 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1866 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1868 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1869 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1871 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1872 modifyItem->oldNRCGI.nRCellIdentity.size);
1874 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1875 modifyItem->oldNRCGI.pLMN_Identity.size);
1878 for(i=0; i<cellsToModify->list.count ;i++)
1880 if(cellsToModify->list.array[i] != NULLP)
1882 DU_FREE(cellsToModify->list.array[i],\
1883 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1886 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1889 for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
1891 if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
1893 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1894 sizeof(GNBDUConfigurationUpdateIEs_t));
1897 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1899 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1901 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1904 /*******************************************************************
1906 * @brief free the ULRRCMessageTransfer
1910 * Function : FreeULRRCMessageTransfer
1912 * Functionality: Deallocating the memory of variable allocated in
1913 * FreeULRRCMessageTransfer
1917 * @return ROK - void
1919 ******************************************************************/
1920 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
1923 ULRRCMessageTransfer_t *ulRRCMsg;
1925 if(f1apMsg != NULLP)
1927 if(f1apMsg->choice.initiatingMessage != NULLP)
1929 ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1930 if(ulRRCMsg->protocolIEs.list.array != NULLP)
1932 for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
1934 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
1936 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
1939 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
1941 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1943 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1946 /*******************************************************************
1948 * @brief Builds and sends the ULRRCMessageTransfer
1952 * Function : BuildAndSendULRRCMessageTransfer
1954 * Functionality: Constructs the UL RRC Message Transfer and sends
1955 * it to the CU through SCTP.
1959 * @return ROK - success
1962 * ****************************************************************/
1963 uint8_t BuildAndSendULRRCMessageTransfer()
1968 F1AP_PDU_t *f1apMsg = NULL;
1969 ULRRCMessageTransfer_t *ulRRCMsg;
1970 asn_enc_rval_t encRetVal; /* Encoder return value */
1971 uint8_t ret =RFAILED;
1974 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1976 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1977 if(f1apMsg == NULLP)
1979 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1983 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1984 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1985 if(f1apMsg->choice.initiatingMessage == NULLP)
1987 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1990 f1apMsg->choice.initiatingMessage->procedureCode = \
1991 ProcedureCode_id_ULRRCMessageTransfer;
1992 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1993 f1apMsg->choice.initiatingMessage->value.present = \
1994 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1996 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1998 ulRRCMsg->protocolIEs.list.count = elementCnt;
1999 ulRRCMsg->protocolIEs.list.size = \
2000 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
2002 /* Initialize the F1Setup members */
2003 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
2004 if(ulRRCMsg->protocolIEs.list.array == NULLP)
2006 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
2009 for(idx=0; idx<elementCnt; idx++)
2011 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
2012 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2020 /*GNB CU UE F1AP ID*/
2021 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2022 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2023 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2024 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2025 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2026 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2028 /*GNB DU UE F1AP ID*/
2030 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2031 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2032 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2033 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2034 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2035 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2039 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2040 ProtocolIE_ID_id_SRBID;
2041 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2042 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2043 ULRRCMessageTransferIEs__value_PR_SRBID;
2044 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = UL_SRBID;
2049 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2051 /* Encode the F1SetupRequest type as APER */
2052 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2054 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2056 /* Encode results */
2057 if(encRetVal.encoded == ENCODE_FAIL)
2059 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2060 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2065 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2066 for(int i=0; i< encBufSize; i++)
2068 printf("%x",encBuf[i]);
2073 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
2075 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
2081 FreeULRRCMessageTransfer(f1apMsg);
2084 }/* End of BuildAndSendULRRCMessageTransfer*/
2086 /*******************************************************************
2088 * @brief Builds tag config
2092 * Function : BuildTagConfig
2094 * Functionality: Builds tag config in MacCellGroupConfig
2096 * @params[in] TAG_Config *tag_Config
2098 * @return ROK - success
2101 * ****************************************************************/
2102 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2104 struct TAG_Config__tag_ToAddModList *tagList;
2105 uint8_t idx, elementCnt;
2107 tagConfig->tag_ToReleaseList = NULLP;
2108 tagConfig->tag_ToAddModList = NULLP;
2109 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2110 if(!tagConfig->tag_ToAddModList)
2112 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2116 elementCnt = 1; //ODU_VALUE_ONE;
2117 tagList = tagConfig->tag_ToAddModList;
2118 tagList->list.count = elementCnt;
2119 tagList->list.size = elementCnt * sizeof(struct TAG *);
2121 tagList->list.array = NULLP;
2122 DU_ALLOC(tagList->list.array, tagList->list.size);
2123 if(!tagList->list.array)
2125 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2129 for(idx=0; idx<tagList->list.count; idx++)
2131 tagList->list.array[idx] = NULLP;
2132 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2133 if(!tagList->list.array[idx])
2135 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2141 tagList->list.array[idx]->tag_Id = TAG_ID;
2142 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2147 /*******************************************************************
2149 * @brief Builds PHR Config
2153 * Function : BuildPhrConfig
2155 * Functionality: Builds phrConfig in MacCellGroupConfig
2157 * @params[in] PHR Config *
2159 * @return ROK - success
2162 * ****************************************************************/
2163 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2166 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2167 phrConfig->choice.setup = NULLP;
2168 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2169 if(!phrConfig->choice.setup)
2171 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2175 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2176 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2177 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2178 phrConfig->choice.setup->multiplePHR = false;
2179 phrConfig->choice.setup->dummy = false;
2180 phrConfig->choice.setup->phr_Type2OtherCell = false;
2181 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2186 /*******************************************************************
2188 * @brief Builds BSR Config
2192 * Function : BuildBsrConfig
2194 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2196 * @params[in] BSR_Config *bsrConfig
2198 * @return ROK - success
2201 * ****************************************************************/
2202 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2204 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2205 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2206 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2211 /*******************************************************************
2213 * @brief Builds scheduling request config
2217 * Function : BuildSchedulingReqConfig
2219 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2221 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2223 * @return ROK - success
2226 * ****************************************************************/
2227 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2229 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2230 uint8_t idx, elementCnt;
2232 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2233 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2234 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2235 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2237 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2241 elementCnt = 1; //ODU_VALUE_ONE;
2242 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2243 schReqList->list.count = elementCnt;
2244 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2246 schReqList->list.array = NULLP;
2247 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2248 if(!schReqList->list.array)
2250 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2254 for(idx=0;idx<schReqList->list.count; idx++)
2256 schReqList->list.array[idx] = NULLP;
2257 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2258 if(!schReqList->list.array[idx])
2260 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2266 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2268 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2269 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2270 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2272 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2275 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2276 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2277 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2282 /*******************************************************************
2284 * @brief Builds RLC Config
2288 * Function : BuildRlcConfig
2290 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
2292 * @params[in] RLC_Config *rlcConfig
2294 * @return ROK - success
2297 * ****************************************************************/
2298 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2301 rlcConfig->present = RLC_Config_PR_am;
2303 rlcConfig->choice.am = NULLP;
2304 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2305 if(!rlcConfig->choice.am)
2307 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2312 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2313 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2314 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2316 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2319 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2320 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2321 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2322 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2323 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
2326 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2327 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2328 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2330 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2333 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2334 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
2335 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
2340 /*******************************************************************
2342 * @brief Builds MAC LC Config
2346 * Function : BuildMacLCConfig
2348 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
2350 * @params[in] struct LogicalChannelConfig macLcConfig
2352 * @return ROK - success
2355 * ****************************************************************/
2356 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2359 macLcConfig->ul_SpecificParameters = NULLP;
2360 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2361 if(!macLcConfig->ul_SpecificParameters)
2363 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2367 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2368 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
2369 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
2370 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2371 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2372 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2373 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2375 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2376 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2377 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2379 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2382 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2384 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2385 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2386 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2388 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2391 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2393 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2394 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2395 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2400 /*******************************************************************
2402 * @brief Builds RLC Bearer to Add/Mod list
2406 * Function :BuildRlcBearerToAddModList
2408 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2410 * @params[in] rlc_BearerToAddModList
2412 * @return ROK - success
2415 * ****************************************************************/
2416 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2418 uint8_t idx, elementCnt;
2421 rlcBearerList->list.count = elementCnt;
2422 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
2424 rlcBearerList->list.array = NULLP;
2425 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2426 if(!rlcBearerList->list.array)
2428 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2432 for(idx=0; idx<rlcBearerList->list.count; idx++)
2434 rlcBearerList->list.array[idx] = NULLP;
2435 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2436 if(!rlcBearerList->list.array[idx])
2438 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2444 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
2446 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2447 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2449 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2453 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2454 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
2456 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2457 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2458 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2459 if(!rlcBearerList->list.array[idx]->rlc_Config)
2461 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2465 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2467 DU_LOG("\nF1AP : BuildRlcConfig failed");
2471 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2472 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2473 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2475 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2479 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2481 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2488 /*******************************************************************
2490 * @brief Build Control resource set to add/modify list
2494 * Function : BuildControlRSetToAddModList
2496 * Functionality: Build Control resource set to add/modify list
2499 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2501 * @return ROK - success
2504 * ****************************************************************/
2505 uint8_t BuildControlRSetToAddModList
2507 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2515 struct ControlResourceSet *controlRSet;
2518 controlRSetList->list.count = elementCnt;
2519 controlRSetList->list.size = \
2520 elementCnt * sizeof(struct ControlResourceSet *);
2522 controlRSetList->list.array = NULLP;
2523 DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2524 if(!controlRSetList->list.array)
2526 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2530 for(idx = 0; idx < elementCnt; idx++)
2532 controlRSetList->list.array[idx] = NULLP;
2533 DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2534 if(!controlRSetList->list.array[idx])
2536 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2542 controlRSet = controlRSetList->list.array[idx];
2544 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2546 /* Values taken from reference logs :
2549 * Bit string stored ff0000000000
2553 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2555 controlRSet->frequencyDomainResources.buf = NULLP;
2556 DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2557 controlRSet->frequencyDomainResources.size);
2558 if(!controlRSet->frequencyDomainResources.buf)
2560 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2564 controlRSet->frequencyDomainResources.buf[byteIdx] = PDCCH_FREQ_DOM_RSRC; /* setting 8 MSBs i.e. ff */
2565 for(byteIdx = 1; byteIdx < numBytes; byteIdx++)
2567 controlRSet->frequencyDomainResources.buf[byteIdx] = 0;
2569 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2571 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2572 controlRSet->cce_REG_MappingType.present = \
2573 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2575 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2576 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2577 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2578 controlRSet->tci_PresentInDCI = NULLP;
2580 uint8_t tciStateIdx;
2582 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2583 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2584 if(!controlRset->tci_StatesPDCCH_ToAddList)
2586 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2591 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2592 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2593 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2594 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2595 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2597 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2601 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2603 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2604 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2606 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2613 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2615 DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2616 if(!controlRset->tci_PresentInDCI)
2618 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2622 *(controlRset->tci_PresentInDCI);
2625 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2626 DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2627 if(!controlRSet->pdcch_DMRS_ScramblingID)
2629 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2632 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2635 } /* End BuildControlRSetToAddModList */
2637 /*******************************************************************
2639 * @brief Build search space to add/modify list
2643 * Function : BuildSearchSpcToAddModList
2645 * Functionality: Build search space to add/modify list
2648 * @return ROK - success
2651 * ****************************************************************/
2652 uint8_t BuildSearchSpcToAddModList
2654 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2662 struct SearchSpace *searchSpc;
2665 searchSpcList->list.count = elementCnt;
2666 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2668 searchSpcList->list.array = NULLP;
2669 DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2670 if(!searchSpcList->list.array)
2672 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2676 for(idx = 0; idx < elementCnt; idx++)
2678 searchSpcList->list.array[idx] = NULLP;
2679 DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2680 if(!searchSpcList->list.array[idx])
2682 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2688 searchSpc = searchSpcList->list.array[idx];
2690 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2692 searchSpc->controlResourceSetId = NULLP;
2693 DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2694 if(!searchSpc->controlResourceSetId)
2696 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2699 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2701 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2702 DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2703 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2704 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2706 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2709 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2710 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2712 searchSpc->duration = NULLP;
2713 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2714 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2715 if(!searchSpc->monitoringSymbolsWithinSlot)
2717 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2721 /* Values taken from reference logs :
2724 * Bit string stores 8000
2729 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2730 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2731 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2732 searchSpc->monitoringSymbolsWithinSlot->size);
2733 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2735 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2740 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2741 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2742 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2743 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2745 searchSpc->nrofCandidates = NULLP;
2746 DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2747 if(!searchSpc->nrofCandidates)
2749 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2753 searchSpc->nrofCandidates->aggregationLevel1 = \
2754 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2755 searchSpc->nrofCandidates->aggregationLevel2 = \
2756 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2757 searchSpc->nrofCandidates->aggregationLevel4 = \
2758 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2759 searchSpc->nrofCandidates->aggregationLevel8 = \
2760 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2761 searchSpc->nrofCandidates->aggregationLevel16 = \
2762 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2764 searchSpc->searchSpaceType = NULLP;
2765 DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2766 if(!searchSpc->searchSpaceType)
2768 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2772 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2774 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
2775 DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
2776 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
2777 if(!searchSpc->searchSpaceType->choice.ue_Specific)
2779 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2782 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
2783 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
2786 }/* End BuildSearchSpcToAddModList */
2788 /*******************************************************************
2790 * @brief Builds BWP DL dedicated PDCCH config
2794 * Function : BuildBWPDlDedPdcchCfg
2796 * Functionality: Builds BWP DL dedicated PDCCH config
2798 * @params[in] struct PDCCH_Config *pdcchCfg
2800 * @return ROK - success
2803 * ****************************************************************/
2804 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
2806 pdcchCfg->controlResourceSetToAddModList = NULLP;
2807 DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
2808 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
2809 if(!pdcchCfg->controlResourceSetToAddModList)
2811 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2815 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
2820 pdcchCfg->controlResourceSetToReleaseList = NULLP;
2822 pdcchCfg->searchSpacesToAddModList = NULLP;
2823 DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
2824 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
2825 if(!pdcchCfg->searchSpacesToAddModList)
2827 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2831 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
2836 pdcchCfg->searchSpacesToReleaseList = NULLP;
2837 pdcchCfg->downlinkPreemption = NULLP;
2838 pdcchCfg->tpc_PUSCH = NULLP;
2839 pdcchCfg->tpc_PUCCH = NULLP;
2840 pdcchCfg->tpc_SRS = NULLP;
2845 /*******************************************************************
2847 * @brief Builds DMRS DL PDSCH Mapping type A
2851 * Function : BuildDMRSDLPdschMapTypeA
2853 * Functionality: Builds DMRS DL PDSCH Mapping type A
2856 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2857 * @return ROK - success
2860 * ****************************************************************/
2861 uint8_t BuildDMRSDLPdschMapTypeA
2863 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2866 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
2867 dmrsDlCfg->choice.setup = NULLP;
2868 DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
2869 if(!dmrsDlCfg->choice.setup)
2871 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
2875 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
2876 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
2877 DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
2878 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
2880 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
2883 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
2885 dmrsDlCfg->choice.setup->maxLength = NULLP;
2886 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
2887 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
2888 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
2893 /*******************************************************************
2895 * @brief Builds TCI states to add/modify list
2899 * Function : BuildTCIStatesToAddModList
2901 * Functionality:Builds TCI states to add/modify list
2904 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
2906 * @return ROK - success
2909 * ****************************************************************/
2910 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
2915 /*******************************************************************
2917 * @brief Builds PDSCH time domain allocation list
2921 * Function : BuildPdschTimeDomAllocList
2923 * Functionality: Builds PDSCH time domain allocation list
2926 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2928 * @return ROK - success
2931 * ****************************************************************/
2932 uint8_t BuildPdschTimeDomAllocList
2934 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2939 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
2941 timeDomAllocList->present = \
2942 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
2944 timeDomAllocList->choice.setup = NULLP;
2945 DU_ALLOC(timeDomAllocList->choice.setup, \
2946 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
2947 if(!timeDomAllocList->choice.setup)
2949 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2954 timeDomAllocList->choice.setup->list.count = elementCnt;
2955 timeDomAllocList->choice.setup->list.size = \
2956 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
2958 timeDomAllocList->choice.setup->list.array = NULLP;
2959 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
2960 timeDomAllocList->choice.setup->list.size);
2961 if(!timeDomAllocList->choice.setup->list.array)
2963 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2967 for(idx = 0; idx < elementCnt; idx++)
2969 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
2970 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
2971 sizeof(struct PDSCH_TimeDomainResourceAllocation));
2972 if(!timeDomAllocList->choice.setup->list.array[idx])
2974 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2980 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
2982 timeDomAlloc->k0 = NULLP;
2983 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
2984 timeDomAlloc->startSymbolAndLength = \
2985 calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
2990 /*******************************************************************
2992 * @brief Builds PDSCH PRB Bundling type
2996 * Function : BuildPdschPrbBundlingType
2998 * Functionality: Builds PDSCH PRB Bundling type
3001 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3003 * @return ROK - success
3006 * ****************************************************************/
3007 uint8_t BuildPdschPrbBundlingType
3009 struct PDSCH_Config__prb_BundlingType *prbBndlType
3012 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3014 prbBndlType->choice.staticBundling = NULLP;
3015 DU_ALLOC(prbBndlType->choice.staticBundling, \
3016 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3017 if(!prbBndlType->choice.staticBundling)
3019 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3022 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3027 /*******************************************************************
3029 * @brief Builds BWP DL dedicated PDSCH config
3033 * Function : BuildBWPDlDedPdschCfg
3035 * Functionality: Builds BWP DL dedicated PDSCH config
3037 * @params[in] struct PDSCH_Config *pdschCfg
3039 * @return ROK - success
3042 * ****************************************************************/
3043 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3045 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3047 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3048 DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3049 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3050 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3052 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3056 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3061 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3062 pdschCfg->tci_StatesToAddModList = NULLP;
3063 pdschCfg->tci_StatesToReleaseList = NULLP;
3064 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3066 DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3067 if(!pdschCfg->tci_StatesToAddModList)
3069 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3072 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3078 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3080 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3081 DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3082 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3083 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3085 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3089 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3094 pdschCfg->pdsch_AggregationFactor = NULLP;
3095 pdschCfg->rateMatchPatternToAddModList = NULLP;
3096 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3097 pdschCfg->rateMatchPatternGroup1 = NULLP;
3098 pdschCfg->rateMatchPatternGroup2 = NULLP;
3099 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3100 pdschCfg->mcs_Table = NULLP;
3102 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3103 DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3104 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3106 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3109 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3111 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3116 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3117 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3118 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3119 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3120 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3121 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3122 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3127 /*******************************************************************
3129 * @brief Builds intitial DL BWP
3132 * Function : BuildInitialDlBWP
3134 * Functionality: Builds intitial DL BWP in spCellCfgDed
3136 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3138 * @return ROK - success
3141 * ****************************************************************/
3142 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3144 dlBwp->pdcch_Config = NULLP;
3145 DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3146 if(!dlBwp->pdcch_Config)
3148 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3151 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3153 dlBwp->pdcch_Config->choice.setup = NULLP;
3154 DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3155 if(!dlBwp->pdcch_Config->choice.setup)
3157 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3160 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3165 dlBwp->pdsch_Config = NULLP;
3166 DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3167 if(!dlBwp->pdsch_Config)
3169 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3172 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3174 dlBwp->pdsch_Config->choice.setup = NULLP;
3175 DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3176 if(!dlBwp->pdsch_Config->choice.setup)
3178 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3182 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3187 dlBwp->sps_Config = NULLP;
3188 dlBwp->radioLinkMonitoringConfig = NULLP;
3192 /*******************************************************************
3194 * @brief Builds DMRS UL Pusch Mapping type A
3198 * Function : BuildDMRSULPuschMapTypeA
3200 * Functionality: Builds DMRS UL Pusch Mapping type A
3203 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3204 * @return ROK - success
3207 * ****************************************************************/
3208 uint8_t BuildDMRSULPuschMapTypeA
3210 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3213 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3214 dmrsUlCfg->choice.setup= NULLP;
3215 DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3216 if(!dmrsUlCfg->choice.setup)
3218 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3222 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3223 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3224 DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3225 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3227 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3230 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3232 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3233 dmrsUlCfg->choice.setup->maxLength = NULLP;
3234 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3235 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3236 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3237 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3239 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3243 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3244 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3246 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3248 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3251 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3253 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3254 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3258 /*******************************************************************
3260 * @brief Build PUSCH time domain allocation list
3264 * Function : BuildPuschTimeDomAllocList
3266 * Functionality: Build PUSCH time domain allocation list
3269 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3271 * @return ROK - success
3274 * ****************************************************************/
3275 uint8_t BuildPuschTimeDomAllocList
3277 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3282 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3284 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3285 timeDomAllocList->choice.setup = NULLP;
3286 DU_ALLOC(timeDomAllocList->choice.setup, \
3287 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3288 if(!timeDomAllocList->choice.setup)
3290 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3295 timeDomAllocList->choice.setup->list.count = elementCnt;
3296 timeDomAllocList->choice.setup->list.size = \
3297 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3298 timeDomAllocList->choice.setup->list.array = NULLP;
3299 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3300 timeDomAllocList->choice.setup->list.size);
3301 if(!timeDomAllocList->choice.setup->list.array)
3303 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3307 for(idx = 0; idx < elementCnt; idx++)
3309 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3310 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3311 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3312 if(!timeDomAllocList->choice.setup->list.array[idx])
3314 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3320 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3321 DU_ALLOC(timeDomAlloc->k2, sizeof(long));
3322 if(!timeDomAlloc->k2)
3324 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3327 *(timeDomAlloc->k2) = PUSCH_K2;
3328 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3329 timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
3333 /*******************************************************************
3335 * @brief Builds BWP UL dedicated PUSCH Config
3339 * Function : BuildBWPUlDedPuschCfg
3342 * Builds BWP UL dedicated PUSCH Config
3344 * @params[in] : PUSCH_Config_t *puschCfg
3346 * @return ROK - success
3349 * ****************************************************************/
3350 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3352 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3353 DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3354 if(!puschCfg->dataScramblingIdentityPUSCH)
3356 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3359 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3361 puschCfg->txConfig = NULLP;
3362 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3363 DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3364 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3365 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3367 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3371 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3376 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3377 puschCfg->pusch_PowerControl = NULLP;
3378 puschCfg->frequencyHopping = NULLP;
3379 puschCfg->frequencyHoppingOffsetLists = NULLP;
3380 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3382 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3383 DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3384 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3385 if(!puschCfg->pusch_TimeDomainAllocationList)
3387 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3391 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3396 puschCfg->pusch_AggregationFactor = NULLP;
3397 puschCfg->mcs_Table = NULLP;
3398 puschCfg->mcs_TableTransformPrecoder = NULLP;
3399 puschCfg->transformPrecoder = NULLP;
3400 DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3401 if(!puschCfg->transformPrecoder)
3403 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3406 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3408 puschCfg->codebookSubset = NULLP;
3409 puschCfg->maxRank = NULLP;
3410 puschCfg->rbg_Size = NULLP;
3411 puschCfg->uci_OnPUSCH = NULLP;
3412 puschCfg->tp_pi2BPSK = NULLP;
3417 /*******************************************************************
3419 * @brief Fills SRS resource to add/modify list
3423 * Function : BuildSrsRsrcAddModList
3425 * Functionality: Fills SRS resource to add/modify list
3428 * @return ROK - success
3431 * ****************************************************************/
3432 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3438 resourceList->list.count = elementCnt;
3439 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3440 resourceList->list.array = NULLP;
3441 DU_ALLOC(resourceList->list.array, resourceList->list.size);
3442 if(!resourceList->list.array)
3444 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3448 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3450 DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3451 if(!resourceList->list.array[rsrcIdx])
3453 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3459 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3460 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3461 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3463 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3464 DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3465 sizeof(struct SRS_Resource__transmissionComb__n2));
3466 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3468 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3471 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3472 = SRS_COMB_OFFSET_N2;
3473 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3474 = SRS_CYCLIC_SHIFT_N2;
3476 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3478 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3479 SRS_Resource__resourceMapping__nrofSymbols_n1;
3480 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3481 SRS_Resource__resourceMapping__repetitionFactor_n1;
3483 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3484 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3485 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3486 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3487 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3488 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3489 SRS_Resource__groupOrSequenceHopping_neither;
3491 /* Setting resource type to aperiodic for intergration purposes */
3492 resourceList->list.array[rsrcIdx]->resourceType.present = \
3493 SRS_Resource__resourceType_PR_aperiodic;
3494 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3495 DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3496 sizeof(struct SRS_Resource__resourceType__aperiodic));
3497 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3499 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3502 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3507 /*******************************************************************
3509 * @brief Build SRS resource set Add/mod list
3513 * Function : BuildSrsRsrcSetAddModList
3515 * Functionality: Build SRS resource set Add/mod list
3518 * @return ROK - success
3521 * ****************************************************************/
3522 uint8_t BuildSrsRsrcSetAddModList
3524 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3530 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3533 rsrcSetList->list.count = elementCnt;
3534 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3535 rsrcSetList->list.array = NULLP;
3536 DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3537 if(!rsrcSetList->list.array)
3539 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3543 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3545 DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3546 if(!rsrcSetList->list.array[rSetIdx])
3548 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3554 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3556 /* Fill Resource Id list in resource set */
3557 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3558 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3559 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3560 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3562 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3567 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3568 rsrcIdList->list.count = elementCnt;
3569 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3570 rsrcIdList->list.array = NULLP;
3571 DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3572 if(!rsrcIdList->list.array)
3574 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3578 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3580 DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3581 if(!rsrcIdList->list.array[rsrcIdx])
3583 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3589 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3591 /* Fill resource type */
3592 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3593 SRS_ResourceSet__resourceType_PR_aperiodic;
3595 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3596 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3597 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3598 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3600 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3603 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3604 = APERIODIC_SRS_RESRC_TRIGGER;
3606 /* TODO : Fill values for below IEs as expected by Viavi */
3607 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3608 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3611 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3612 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3613 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3614 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3615 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3620 /*******************************************************************
3622 * @brief Builds BWP UL dedicated SRS Config
3626 * Function : BuildBWPUlDedSrsCfg
3628 * Functionality: Builds BWP UL dedicated SRS Config
3630 * @params[in] SRS Config
3631 * @return ROK - success
3634 * ****************************************************************/
3635 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3637 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3638 srsCfg->srs_ResourceSetToAddModList = NULLP;
3639 DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3640 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3641 if(!srsCfg->srs_ResourceSetToAddModList)
3643 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3646 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3651 srsCfg->srs_ResourceToReleaseList = NULLP;
3653 /* Resource to Add/Modify list */
3654 srsCfg->srs_ResourceToAddModList = NULLP;
3655 DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3656 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3657 if(!srsCfg->srs_ResourceToAddModList)
3659 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3663 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3668 srsCfg->tpc_Accumulation = NULLP;
3673 /*******************************************************************
3675 * @brief Builds inital UL BWP
3679 * Function : BuildInitialUlBWP
3681 * Functionality: Builds initial UL BWP
3683 * @params[in] BWP_UplinkDedicated_t *ulBwp
3684 * @return ROK - success
3687 * ****************************************************************/
3688 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3690 ulBwp->pucch_Config = NULLP;
3692 /* Fill BWP UL dedicated PUSCH config */
3693 ulBwp->pusch_Config = NULLP;
3694 DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3695 if(!ulBwp->pusch_Config)
3697 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3701 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3702 ulBwp->pusch_Config->choice.setup = NULLP;
3703 DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3704 if(!ulBwp->pusch_Config->choice.setup)
3706 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3710 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3715 ulBwp->configuredGrantConfig = NULLP;
3717 /* Fill BPW UL dedicated SRS config */
3718 ulBwp->srs_Config = NULLP;
3719 DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3720 if(!ulBwp->srs_Config)
3722 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3726 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3727 ulBwp->srs_Config->choice.setup = NULLP;
3728 DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3729 if(!ulBwp->srs_Config->choice.setup)
3731 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3735 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3740 ulBwp->beamFailureRecoveryConfig = NULLP;
3745 /*******************************************************************
3747 * @brief Builds Pusch Serving cell Config
3751 * Function : BuildPuschSrvCellCfg
3753 * Functionality: Builds Pusch Serving cell Config
3755 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3757 * @return ROK - success
3760 * ****************************************************************/
3761 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3763 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3764 puschCfg->choice.setup = NULLP;
3765 DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3766 if(!puschCfg->choice.setup)
3768 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3772 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3773 puschCfg->choice.setup->rateMatching = NULLP;
3774 puschCfg->choice.setup->xOverhead = NULLP;
3775 puschCfg->choice.setup->ext1 = NULLP;
3776 DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3777 if(!puschCfg->choice.setup->ext1)
3779 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3783 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
3784 DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
3785 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
3787 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3790 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
3792 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
3793 DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
3794 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
3796 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3799 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
3803 /*******************************************************************
3805 * @brief Builds UL config
3808 * Function : BuildUlCfg
3810 * Functionality: Builds UL config in spCellCfgDed
3812 * @params[in] UplinkConfig_t *ulCfg
3814 * @return ROK - success
3817 * ****************************************************************/
3818 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
3820 ulCfg->initialUplinkBWP = NULLP;
3821 DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
3822 if(!ulCfg->initialUplinkBWP)
3824 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3828 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
3833 ulCfg->uplinkBWP_ToReleaseList = NULLP;
3834 ulCfg->uplinkBWP_ToAddModList = NULLP;
3835 ulCfg->firstActiveUplinkBWP_Id = NULLP;
3836 DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
3837 if(!ulCfg->firstActiveUplinkBWP_Id)
3839 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3842 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
3844 ulCfg->pusch_ServingCellConfig = NULLP;
3845 DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
3846 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
3847 if(!ulCfg->pusch_ServingCellConfig)
3849 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3853 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
3858 ulCfg->carrierSwitching = NULLP;
3859 ulCfg->ext1 = NULLP;
3863 /*******************************************************************
3865 * @brief Builds PDSCH serving cell config
3868 * Function : BuildPdschSrvCellCfg
3870 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
3872 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
3874 * @return ROK - success
3877 * ****************************************************************/
3878 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
3880 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
3881 pdschCfg->choice.setup = NULLP;
3882 DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
3883 if(!pdschCfg->choice.setup)
3885 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3889 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3890 pdschCfg->choice.setup->xOverhead = NULLP;
3891 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
3892 DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
3893 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
3895 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3898 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
3899 pdschCfg->choice.setup->pucch_Cell = NULLP;
3900 pdschCfg->choice.setup->ext1 = NULLP;
3905 /*******************************************************************
3907 * @brief Builds CSI Meas config
3910 * Function : BuildCsiMeasCfg
3912 * Functionality: Builds CSI Meas config in spCellCfgDed
3914 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
3916 * @return ROK - success
3919 * ****************************************************************/
3920 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
3926 /*******************************************************************
3928 * @brief Builds Spcell config dedicated
3931 * Function : BuildSpCellCfgDed
3933 * Functionality: Builds sp cell config dedicated in spCellCfg
3935 * @params[in] ServingCellConfig_t srvCellCfg
3937 * @return ROK - success
3940 * ****************************************************************/
3941 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
3943 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
3945 srvCellCfg->initialDownlinkBWP = NULLP;
3946 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
3947 if(!srvCellCfg->initialDownlinkBWP)
3949 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3953 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
3955 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
3958 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
3959 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
3961 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
3962 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
3963 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
3965 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3968 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
3970 srvCellCfg->bwp_InactivityTimer = NULLP;
3972 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
3973 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
3974 if(!srvCellCfg->defaultDownlinkBWP_Id)
3976 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3979 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
3981 srvCellCfg->uplinkConfig = NULLP;
3982 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
3983 if(!srvCellCfg->uplinkConfig)
3985 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3989 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
3991 DU_LOG("\nF1AP : BuildUlCfg failed");
3994 srvCellCfg->supplementaryUplink = NULLP;
3995 srvCellCfg->pdcch_ServingCellConfig = NULLP;
3997 srvCellCfg->pdsch_ServingCellConfig = NULLP;
3998 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
3999 if(!srvCellCfg->pdsch_ServingCellConfig)
4001 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4005 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4007 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4011 srvCellCfg->csi_MeasConfig = NULLP;
4013 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4014 if(!srvCellCfg->csi_MeasConfig)
4016 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4020 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4022 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4026 srvCellCfg->sCellDeactivationTimer = NULLP;
4027 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4028 srvCellCfg->tag_Id = TAG_ID;
4029 srvCellCfg->dummy = NULLP;
4030 srvCellCfg->pathlossReferenceLinking = NULLP;
4031 srvCellCfg->servingCellMO = NULLP;
4032 srvCellCfg->ext1 = NULLP;
4036 /*******************************************************************
4038 * @brief Builds Spcell config
4042 * Function : BuildSpCellCfg
4044 * Functionality: Builds sp cell config in DuToCuRrcContainer
4046 * @params[in] SpCellConfig_t spCellCfg
4048 * @return ROK - success
4051 * ****************************************************************/
4052 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4055 spCellCfg->servCellIndex = NULLP;
4056 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4057 if(!spCellCfg->servCellIndex)
4059 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4062 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4064 spCellCfg->reconfigurationWithSync = NULLP;
4065 spCellCfg->rlf_TimersAndConstants = NULLP;
4066 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4067 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4068 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4070 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4073 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4075 spCellCfg->spCellConfigDedicated = NULLP;
4076 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4077 if(!spCellCfg->spCellConfigDedicated)
4079 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4082 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4084 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4089 /*******************************************************************
4091 * @brief Builds Phy cell group config
4095 * Function : BuildPhyCellGrpCfg
4097 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4099 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4101 * @return ROK - success
4104 * ****************************************************************/
4105 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4107 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4108 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4110 phyCellGrpCfg->p_NR_FR1 = NULLP;
4111 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4112 if(!phyCellGrpCfg->p_NR_FR1)
4114 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4117 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4118 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4119 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4120 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4121 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4122 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4123 phyCellGrpCfg->cs_RNTI = NULLP;
4124 phyCellGrpCfg->ext1 = NULLP;
4125 phyCellGrpCfg->ext2 = NULLP;
4129 /*******************************************************************
4131 * @brief Builds Mac cell group config
4135 * Function : BuildMacCellGrpCfg
4137 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4139 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4141 * @return ROK - success
4144 * ****************************************************************/
4145 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4147 macCellGrpCfg->drx_Config = NULLP;
4148 macCellGrpCfg->schedulingRequestConfig = NULLP;
4149 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4150 if(!macCellGrpCfg->schedulingRequestConfig)
4152 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4156 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4158 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4162 macCellGrpCfg->bsr_Config = NULLP;
4163 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4164 if(!macCellGrpCfg->bsr_Config)
4166 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4170 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4172 DU_LOG("\nF1AP : BuildBsrConfig failed");
4176 macCellGrpCfg->tag_Config = NULLP;
4177 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4178 if(!macCellGrpCfg->tag_Config)
4180 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4184 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4186 DU_LOG("\nF1AP : BuildTagConfig failed");
4190 macCellGrpCfg->phr_Config = NULLP;
4191 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4192 if(!macCellGrpCfg->phr_Config)
4194 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4198 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4200 DU_LOG("\nF1AP : BuildPhrConfig failed");
4204 macCellGrpCfg->skipUplinkTxDynamic = false;
4205 macCellGrpCfg->ext1 = NULLP;
4209 /*******************************************************************
4211 * @brief Frees memeory allocated for SearchSpcToAddModList
4215 * Function : FreeSearchSpcToAddModList
4217 * Functionality: Deallocating memory of SearchSpcToAddModList
4219 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4223 4221 * ****************************************************************/
4224 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4228 struct SearchSpace *searchSpc=NULLP;
4230 if(searchSpcList->list.array)
4232 if(searchSpcList->list.array[idx2])
4234 searchSpc = searchSpcList->list.array[idx2];
4235 if(searchSpc->controlResourceSetId)
4237 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4239 if(searchSpc->monitoringSymbolsWithinSlot)
4241 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4243 if(searchSpc->nrofCandidates)
4245 if(searchSpc->searchSpaceType)
4247 DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4248 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4249 DU_FREE(searchSpc->searchSpaceType, sizeof(struct
4250 SearchSpace__searchSpaceType));
4252 DU_FREE(searchSpc->nrofCandidates,
4253 sizeof(struct SearchSpace__nrofCandidates));
4255 DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4256 searchSpc->monitoringSymbolsWithinSlot->size);
4258 DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4259 sizeof(BIT_STRING_t));
4261 DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4262 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4264 DU_FREE(searchSpc->controlResourceSetId,
4265 sizeof(ControlResourceSetId_t));
4268 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4270 DU_FREE(searchSpcList->list.array[idx1],
4271 sizeof(struct SearchSpace));
4273 DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4276 /*******************************************************************
4278 * @brief Frees memory allocated for PdschTimeDomAllocList
4282 * Function : FreePdschTimeDomAllocList
4284 * Functionality: Deallocating memory of PdschTimeDomAllocList
4286 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4290 4221 * ****************************************************************/
4291 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4295 if(timeDomAllocList->choice.setup)
4297 if(timeDomAllocList->choice.setup->list.array)
4299 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4301 DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4302 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4304 DU_FREE(timeDomAllocList->choice.setup->list.array, \
4305 timeDomAllocList->choice.setup->list.size);
4307 DU_FREE(timeDomAllocList->choice.setup,\
4308 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4311 /*******************************************************************
4313 * @brief Frees memory allocated for PuschTimeDomAllocList
4317 * Function : FreePuschTimeDomAllocList
4319 * Functionality: Deallocating memory of PuschTimeDomAllocList
4321 * @params[in] PUSCH_Config_t *puschCfg
4325 4221 * ****************************************************************/
4326 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4330 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4332 if(puschCfg->pusch_TimeDomainAllocationList)
4334 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4335 if(timeDomAllocList_t->choice.setup)
4337 if(timeDomAllocList_t->choice.setup->list.array)
4339 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4340 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4342 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4343 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4345 DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4346 timeDomAllocList_t->choice.setup->list.size);
4348 DU_FREE(timeDomAllocList_t->choice.setup, \
4349 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4351 DU_FREE(puschCfg->transformPrecoder, sizeof(long));
4352 DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4353 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4357 /*******************************************************************
4359 * @brief Frees memory allocated for InitialUlBWP
4363 * Function : FreeInitialUlBWP
4365 * Functionality: Deallocating memory of InitialUlBWP
4367 * @params[in] BWP_UplinkDedicated_t *ulBwp
4371 * ****************************************************************/
4372 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4374 uint8_t rSetIdx, rsrcIdx;
4375 SRS_Config_t *srsCfg = NULLP;
4376 PUSCH_Config_t *puschCfg = NULLP;
4377 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4378 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4379 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4380 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4382 if(ulBwp->pusch_Config)
4384 if(ulBwp->pusch_Config->choice.setup)
4386 puschCfg=ulBwp->pusch_Config->choice.setup;
4387 if(puschCfg->dataScramblingIdentityPUSCH)
4389 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4391 FreePuschTimeDomAllocList(puschCfg);
4392 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4393 if(dmrsUlCfg->choice.setup)
4395 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4397 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4399 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4401 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4402 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4404 DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4407 DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4409 DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4410 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4412 DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4414 DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4416 DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4418 /* Free SRS-Config */
4419 if(ulBwp->srs_Config)
4421 if(ulBwp->srs_Config->choice.setup)
4423 srsCfg = ulBwp->srs_Config->choice.setup;
4425 /* Free Resource Set to add/mod list */
4426 if(srsCfg->srs_ResourceSetToAddModList)
4428 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4429 if(rsrcSetList->list.array)
4433 /* Free SRS resource Id list in this SRS resource set */
4434 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4436 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4438 if(rsrcIdList->list.array)
4440 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4442 DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4444 DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4446 DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4447 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4450 /* Free resource type info for this SRS resource set */
4451 DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4452 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4454 /* Free memory for each resource set */
4455 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4457 DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4459 DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4461 DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4462 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4465 /* Free resource to add/modd list */
4466 if(srsCfg->srs_ResourceToAddModList)
4468 resourceList = srsCfg->srs_ResourceToAddModList;
4469 if(resourceList->list.array)
4472 DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4473 sizeof(struct SRS_Resource__transmissionComb__n2));
4474 DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4475 sizeof(struct SRS_Resource__resourceType__aperiodic));
4477 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4479 DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4481 DU_FREE(resourceList->list.array, resourceList->list.size);
4483 DU_FREE(srsCfg->srs_ResourceToAddModList, \
4484 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4487 DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4489 DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4493 /*******************************************************************
4495 * @brief Frees memory allocated for initialUplinkBWP
4499 * Function : FreeinitialUplinkBWP
4501 * Functionality: Deallocating memory of initialUplinkBWP
4503 * @params[in] UplinkConfig_t *ulCfg
4508 * ****************************************************************/
4509 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4511 BWP_UplinkDedicated_t *ulBwp=NULLP;
4512 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4514 if(ulCfg->initialUplinkBWP)
4516 ulBwp=ulCfg->initialUplinkBWP;
4517 if(ulCfg->firstActiveUplinkBWP_Id)
4519 if(ulCfg->pusch_ServingCellConfig)
4521 puschCfg=ulCfg->pusch_ServingCellConfig;
4522 if(puschCfg->choice.setup)
4524 if(puschCfg->choice.setup->ext1)
4526 DU_FREE(puschCfg->choice.setup->ext1->\
4527 processingType2Enabled,sizeof(BOOLEAN_t));
4528 DU_FREE(puschCfg->choice.setup->ext1->\
4529 maxMIMO_Layers,sizeof(long));
4530 DU_FREE(puschCfg->choice.setup->ext1, \
4531 sizeof(struct PUSCH_ServingCellConfig__ext1));
4533 DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4535 DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4537 DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4539 FreeInitialUlBWP(ulBwp);
4540 DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4543 /*******************************************************************
4545 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4549 * Function : FreeBWPDlDedPdschCfg
4551 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4553 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4558 * ****************************************************************/
4559 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4561 struct PDSCH_Config *pdschCfg=NULLP;
4562 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4563 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4564 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4566 if(dlBwp->pdsch_Config->choice.setup)
4568 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4569 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4571 if(pdschCfg->pdsch_TimeDomainAllocationList)
4573 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4574 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4576 prbBndlType=&pdschCfg->prb_BundlingType;
4577 DU_FREE(prbBndlType->choice.staticBundling,\
4578 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4579 DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4581 FreePdschTimeDomAllocList(timeDomAllocList);
4582 DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
4583 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4585 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
4586 if(dmrsDlCfg->choice.setup)
4588 DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
4590 DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
4592 DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4593 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4595 DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4598 /*******************************************************************
4600 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
4604 * Function : FreeBWPDlDedPdcchCfg
4606 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
4608 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4613 * ****************************************************************/
4614 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
4618 struct PDCCH_Config *pdcchCfg=NULLP;
4619 struct ControlResourceSet *controlRSet=NULLP;
4620 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
4622 if(dlBwp->pdcch_Config->choice.setup)
4624 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
4625 if(pdcchCfg->controlResourceSetToAddModList)
4627 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
4628 if(controlRSetList->list.array)
4630 controlRSet = controlRSetList->list.array[idx2];
4633 if(controlRSet->frequencyDomainResources.buf)
4635 if(controlRSet->pdcch_DMRS_ScramblingID)
4637 if(pdcchCfg->searchSpacesToAddModList)
4639 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
4640 DU_FREE(pdcchCfg->searchSpacesToAddModList, \
4641 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
4643 DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
4645 DU_FREE(controlRSet->frequencyDomainResources.buf, \
4646 controlRSet->frequencyDomainResources.size);
4649 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
4651 DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
4653 DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
4655 DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
4656 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
4658 DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4662 /*******************************************************************
4664 * @brief Frees emmory allocated for DUToCURRCContainer
4668 * Function : FreeMemDuToCuRrcCont
4670 * Functionality: Deallocating memory of DuToCuRrcContainer
4672 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
4674 * @return ROK - success
4677 * ****************************************************************/
4678 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
4681 SpCellConfig_t *spCellCfg=NULLP;
4682 ServingCellConfig_t *srvCellCfg=NULLP;
4683 BWP_DownlinkDedicated_t *dlBwp=NULLP;
4684 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
4685 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
4686 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
4687 struct RLC_Config *rlcConfig=NULLP;
4688 struct LogicalChannelConfig *macLcConfig=NULLP;
4689 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
4690 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
4691 struct TAG_Config *tagConfig=NULLP;
4692 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
4693 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
4694 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
4696 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
4699 if(rlcBearerList->list.array)
4701 for(idx=0; idx<rlcBearerList->list.count; idx++)
4703 if(rlcBearerList->list.array[idx])
4705 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
4706 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
4709 if(rlcConfig->choice.am)
4711 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4712 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4713 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
4715 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
4717 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
4720 if(macLcConfig->ul_SpecificParameters)
4722 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
4723 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
4724 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
4726 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
4728 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
4731 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
4733 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4736 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
4739 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
4740 if(schedulingRequestConfig)
4742 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4745 if(schReqList->list.array)
4747 for(idx=0;idx<schReqList->list.count; idx++)
4749 if(schReqList->list.array[idx])
4751 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4752 DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4755 DU_FREE(schReqList->list.array, schReqList->list.size);
4757 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
4758 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
4759 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4761 if(macCellGrpCfg->bsr_Config)
4763 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4765 tagConfig = macCellGrpCfg->tag_Config;
4768 tagList = tagConfig->tag_ToAddModList;
4771 if(tagList->list.array)
4773 for(idx=0; idx<tagList->list.count; idx++)
4775 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
4777 DU_FREE(tagList->list.array, tagList->list.size);
4779 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4781 DU_FREE(tagConfig, sizeof(struct TAG_Config));
4784 phrConfig = macCellGrpCfg->phr_Config;
4787 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
4788 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
4791 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
4794 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
4797 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4798 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
4801 spCellCfg = cellGrpCfg->spCellConfig;
4804 if(spCellCfg->servCellIndex)
4806 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
4808 if(spCellCfg->spCellConfigDedicated)
4810 srvCellCfg = spCellCfg->spCellConfigDedicated;
4811 if(srvCellCfg->initialDownlinkBWP)
4813 dlBwp = srvCellCfg->initialDownlinkBWP;
4814 if(srvCellCfg->firstActiveDownlinkBWP_Id)
4816 if(srvCellCfg->defaultDownlinkBWP_Id)
4818 if(srvCellCfg->uplinkConfig)
4820 if(srvCellCfg->pdsch_ServingCellConfig)
4822 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
4823 if(pdschCfg->choice.setup)
4825 DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
4826 DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4828 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
4829 ServingCellConfig__pdsch_ServingCellConfig));
4831 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
4832 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4834 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4836 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4838 if(dlBwp->pdcch_Config)
4840 if(dlBwp->pdsch_Config)
4842 FreeBWPDlDedPdschCfg(dlBwp);
4843 DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4845 FreeBWPDlDedPdcchCfg(dlBwp);
4846 DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4848 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4850 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4852 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4854 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
4856 DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
4860 /*******************************************************************
4862 * @brief Builds DU To CU RRC Container
4866 * Function : BuildDuToCuRrcContainer
4868 * Functionality: Builds DuToCuRrcContainer
4870 * @params[in] idx, index in F1AP msg
4871 * DuToCuRRCContainer, DuToCuRRCContainer
4873 * @return ROK - success
4876 * ****************************************************************/
4877 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
4879 CellGroupConfigRrc_t cellGrpCfg;
4880 asn_enc_rval_t encRetVal;
4881 uint8_t ret = RFAILED;
4885 cellGrpCfg.cellGroupId = CELL_GRP_ID;
4887 cellGrpCfg.rlc_BearerToAddModList = NULLP;
4888 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4889 if(!cellGrpCfg.rlc_BearerToAddModList)
4891 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4894 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
4896 DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
4900 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
4901 cellGrpCfg.mac_CellGroupConfig = NULLP;
4902 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
4903 if(!cellGrpCfg.mac_CellGroupConfig)
4905 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4908 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
4910 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
4915 cellGrpCfg.physicalCellGroupConfig = NULLP;
4916 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
4917 if(!cellGrpCfg.physicalCellGroupConfig)
4919 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4922 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
4924 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
4928 cellGrpCfg.spCellConfig = NULLP;
4929 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
4930 if(!cellGrpCfg.spCellConfig)
4932 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4935 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
4937 DU_LOG("\nF1AP : BuildSpCellCfg failed");
4941 cellGrpCfg.sCellToAddModList = NULLP;
4942 cellGrpCfg.sCellToReleaseList = NULLP;
4943 cellGrpCfg.ext1 = NULLP;
4945 /* encode cellGrpCfg into duToCuRrcContainer */
4946 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
4947 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
4949 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
4950 /* Encode results */
4951 if(encRetVal.encoded == ENCODE_FAIL)
4953 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
4954 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4959 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
4960 for(int i=0; i< encBufSize; i++)
4962 printf("%x",encBuf[i]);
4966 duToCuRrcContainer->size = encBufSize;
4967 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
4968 if(!duToCuRrcContainer->buf)
4970 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
4973 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
4977 FreeMemDuToCuRrcCont(&cellGrpCfg);
4981 /*******************************************************************
4983 * @brief Builds and sends the InitialULRRCMessage
4987 * Function : BuildAndSendInitialRrcMsgTransfer
4989 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
4990 * it to the CU through SCTP.
4994 * @return ROK - success
4997 * ****************************************************************/
4998 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
4999 uint8_t *rrcContainer)
5006 F1AP_PDU_t *f1apMsg = NULLP;
5007 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
5008 asn_enc_rval_t encRetVal;
5009 bool checkvar=false;
5012 DU_LOG("\n F1AP : Building RRC Setup Request\n");
5013 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5014 if(f1apMsg == NULLP)
5016 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5019 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5020 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5021 if(f1apMsg->choice.initiatingMessage == NULLP)
5023 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5026 f1apMsg->choice.initiatingMessage->procedureCode =\
5027 ProcedureCode_id_InitialULRRCMessageTransfer;
5028 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
5029 f1apMsg->choice.initiatingMessage->value.present = \
5030 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
5032 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
5034 initULRRCMsg->protocolIEs.list.count = elementCnt;
5035 initULRRCMsg->protocolIEs.list.size = \
5036 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
5037 /* Initialize the F1Setup members */
5038 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5039 if(initULRRCMsg->protocolIEs.list.array == NULLP)
5041 DU_LOG(" F1AP : Memory allocation for\
5042 RRCSetupRequestMessageTransferIEs failed");
5045 for(idx=0; idx<elementCnt; idx++)
5047 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
5048 sizeof(InitialULRRCMessageTransferIEs_t));
5049 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
5055 /*GNB DU UE F1AP ID*/
5056 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5057 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5058 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5059 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
5060 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
5061 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
5066 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5067 ProtocolIE_ID_id_NRCGI;
5068 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
5069 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
5070 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
5073 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
5081 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5082 ProtocolIE_ID_id_C_RNTI;
5083 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5084 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5085 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
5086 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
5090 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5091 ProtocolIE_ID_id_RRCContainer;
5092 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5093 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5094 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
5096 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size =\
5097 strlen((const char*)rrcContainer);
5098 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
5099 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
5100 if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
5102 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
5106 memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
5107 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
5110 /*DUtoCURRCContainer*/
5112 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5113 ProtocolIE_ID_id_DUtoCURRCContainer;
5114 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5115 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5116 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
5118 ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
5124 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5126 /* Encode the F1SetupRequest type as APER */
5127 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5129 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
5130 /* Encode results */
5131 if(encRetVal.encoded == ENCODE_FAIL)
5133 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
5134 structure (at %s)\n",encRetVal.failed_type ? \
5135 encRetVal.failed_type->name : "unknown");
5141 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
5142 Message transfer\n");
5143 for(int i=0; i< encBufSize; i++)
5145 printf("%x",encBuf[i]);
5149 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
5151 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
5158 if(f1apMsg != NULLP)
5160 if(f1apMsg->choice.initiatingMessage != NULLP)
5162 if(initULRRCMsg->protocolIEs.list.array != NULLP)
5164 if(idx == elementCnt)
5167 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
5169 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
5171 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
5172 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
5174 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
5175 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
5179 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
5181 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
5182 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
5186 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf)
5188 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf,
5189 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.size);
5191 for(ieId=0; ieId<elementCnt; ieId++)
5193 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
5198 for(ieId=0; ieId<idx; ieId++)
5200 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
5203 DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5205 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5207 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
5213 }/* End of BuildAndSendInitialRrcMsgTransfer*/
5215 /*******************************************************************
5217 * @brief Builds Special cell list for UE Setup Request
5221 * Function : BuildSplCellList
5223 * Functionality: Constructs the Special Cell list for UESetReq
5225 * @params[in] SCell_ToBeSetup_List_t *spCellLst
5227 * @return ROK - success
5230 * ****************************************************************/
5231 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
5237 spCellLst->list.count = cellCnt;
5238 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
5239 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
5240 if(spCellLst->list.array == NULLP)
5244 for(idx=0; idx<cellCnt; idx++)
5246 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
5247 if(spCellLst->list.array[idx] == NULLP)
5253 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
5254 spCellLst->list.array[idx]->criticality = Criticality_ignore;
5255 spCellLst->list.array[idx]->value.present =\
5256 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
5257 /* Special Cell ID -NRCGI */
5258 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
5263 /*Special Cell Index*/
5264 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
5266 }/* End of BuildSplCellList*/
5268 /*******************************************************************
5270 * @brief Builds SRBS to be setup
5274 * Function : BuildSRBSetup
5276 * Functionality: Constructs the SRB's for UESetReq
5278 * @params[in] SRBs_ToBeSetup_List_t *srbSet
5280 * @return ROK - success
5283 * ****************************************************************/
5284 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
5289 srbSet->list.count = srbCnt;
5290 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
5291 DU_ALLOC(srbSet->list.array,srbSet->list.size);
5292 if(srbSet->list.array == NULLP)
5296 for(idx=0; idx<srbCnt; idx++)
5298 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
5299 if(srbSet->list.array[idx] == NULLP)
5305 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
5306 srbSet->list.array[idx]->criticality = Criticality_ignore;
5307 srbSet->list.array[idx]->value.present = \
5308 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
5309 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
5311 }/* End of BuildSRBSetup*/
5313 /*******************************************************************
5315 * @brief Builds QOS Info for DRB Setum Item
5319 * Function : BuildQOSInfo
5321 * Functionality: Constructs the QOS Info for DRB Setup Item
5323 * @params[in] QoSInformation_t *qosinfo
5325 * @return ROK - success
5328 * ****************************************************************/
5329 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
5331 /* NonDynamic5QIDescriptor */
5332 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
5333 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
5334 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
5339 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
5341 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
5342 sizeof(AveragingWindow_t));
5343 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
5348 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
5349 /*MaxDataBurstVolume*/
5350 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
5351 sizeof(MaxDataBurstVolume_t));
5352 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
5357 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
5359 /*nRGRAN Allocation Retention Priority*/
5360 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
5361 PriorityLevel_highest;
5362 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
5363 Pre_emptionCapability_may_trigger_pre_emption;
5364 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
5365 Pre_emptionVulnerability_not_pre_emptable;
5367 /* TO DO: GBR_QoSFlowInformation */
5369 }/*End of BuildQOSInfo*/
5371 /*******************************************************************
5373 * @brief Builds SNSSAI
5377 * Function : BuildSNSSAI
5379 * Functionality: Constructs the SNSSAI For DRB list
5381 * @params[in] SNSSAI_t *snssai
5383 * @return ROK - success
5386 * ****************************************************************/
5387 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
5391 snssai->sST.size = sizeof(uint8_t);
5392 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
5393 if(snssai->sST.buf == NULLP)
5397 snssai->sST.buf[0] = 3;
5399 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
5400 if(snssai->sD == NULLP)
5404 snssai->sD->size = 3*sizeof(uint8_t);
5405 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
5406 if(snssai->sD->buf == NULLP)
5410 snssai->sD->buf[0] = 3;
5411 snssai->sD->buf[1] = 6;
5412 snssai->sD->buf[2] = 9;
5414 }/*End of BuildSNSSAI*/
5416 /*******************************************************************
5418 * @brief Builds the flow map.
5422 * Function : BuildFlowsMap
5424 * Functionality: Constructs the flowmap For DRB list
5426 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
5428 * @return ROK - success
5431 * ****************************************************************/
5432 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
5438 flowMap->list.count = flowCnt;
5439 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
5440 DU_ALLOC(flowMap->list.array,flowMap->list.size);
5441 if(flowMap->list.array == NULLP)
5445 for(idx=0; idx<flowCnt; idx++)
5447 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
5448 if(flowMap->list.array[idx] == NULLP)
5454 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
5455 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
5461 }/*End of BuildFlowsMap*/
5463 /*******************************************************************
5465 * @brief Builds the Uplink Tunnel Info
5469 * Function : BuildULTnlInfo
5471 * Functionality: Constructs the UL TnlInfo For DRB list
5473 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
5475 * @return ROK - success
5478 * ****************************************************************/
5479 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
5484 ulInfo->list.count = ulCnt;
5485 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
5486 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
5487 if(ulInfo->list.array == NULLP)
5491 for(idx=0; idx<ulCnt; idx++)
5493 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
5494 if(ulInfo->list.array[idx] == NULLP)
5500 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
5501 UPTransportLayerInformation_PR_gTPTunnel;
5503 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
5504 sizeof(GTPTunnel_t));
5505 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
5509 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5510 transportLayerAddress.size = 4*sizeof(uint8_t);
5511 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5512 transportLayerAddress.buf,ulInfo->list.array[idx]->\
5513 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
5514 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5515 transportLayerAddress.buf == NULLP)
5519 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5520 transportLayerAddress.buf[0] = 4;
5521 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5522 transportLayerAddress.buf[1] = 4;
5523 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5524 transportLayerAddress.buf[2] = 4;
5525 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5526 transportLayerAddress.buf[3] = 5;
5527 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5528 transportLayerAddress.bits_unused = 0;
5530 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
5531 = 4 * sizeof(uint8_t);
5532 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5533 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
5534 gTPTunnel->gTP_TEID.size);
5535 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
5540 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5541 gTP_TEID.buf[0] = 11;
5542 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5543 gTP_TEID.buf[1] = 0;
5544 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5545 gTP_TEID.buf[2] = 0;
5546 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
5547 gTP_TEID.buf[3] = 1;
5550 }/*End of BuildULTnlInfo*/
5552 /*******************************************************************
5554 * @brief Builds DRBS to be setup
5558 * Function : BuildDRBSetup
5560 * Functionality: Constructs the DRB's for UESetReq
5562 * @params[in] DRBs_ToBeSetup_List_t *drbSet
5564 * @return ROK - success
5567 * ****************************************************************/
5568 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
5570 uint8_t BuildQOSInforet;
5571 uint8_t BuildSNSSAIret;
5572 uint8_t BuildFlowsMapret;
5575 DRBs_ToBeSetup_Item_t *drbSetItem;
5577 drbSet->list.count = drbCnt;
5578 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
5579 DU_ALLOC(drbSet->list.array,drbSet->list.size);
5580 if(drbSet->list.array == NULLP)
5584 for(idx=0; idx<drbCnt; idx++)
5586 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
5587 if(drbSet->list.array[idx] == NULLP)
5593 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
5594 drbSet->list.array[idx]->criticality = Criticality_ignore;
5595 drbSet->list.array[idx]->value.present = \
5596 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
5597 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
5599 drbSetItem->dRBID = 1;
5601 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
5602 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
5603 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
5607 drbSetItem->qoSInformation.choice.choice_extension->id = \
5608 ProtocolIE_ID_id_DRB_Information;
5609 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
5611 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
5612 QoSInformation_ExtIEs__value_PR_DRB_Information;
5613 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
5614 choice_extension->value.choice.DRB_Information.dRB_QoS);
5615 if(BuildQOSInforet != ROK)
5620 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
5621 choice_extension->value.choice.DRB_Information.sNSSAI);
5622 if(BuildSNSSAIret != ROK)
5626 /*Flows mapped to DRB List*/
5627 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
5628 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
5629 if(BuildFlowsMapret != ROK)
5633 /*ULUPTNLInformation To Be Setup List*/
5634 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
5635 if(BuildULTnlInforet != ROK)
5640 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
5642 /*UL Configuration*/
5643 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
5644 if(drbSetItem->uLConfiguration == NULLP)
5648 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
5650 }/* End of BuildDRBSetup*/
5651 /*******************************************************************
5653 * @brief Deallocating memory of function BuildAndSendUESetReq
5657 * Function : FreeNrcgi
5659 * Functionality: Deallocating memory for function BuildNrcgi
5661 * @params[in] NRCGI_t *nrcgi
5665 *******************************************************************/
5666 void FreeNrcgi(NRCGI_t *nrcgi)
5668 if(nrcgi->pLMN_Identity.buf != NULLP)
5670 if(nrcgi->nRCellIdentity.buf != NULLP)
5672 DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
5674 DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
5677 /*******************************************************************
5679 * @brief Deallocating memory of function BuildAndSendUESetReq
5683 * Function : FreeSplCellList
5685 * Functionality: Deallocating memory for function BuildSplCellList
5687 * @params[in] SCell_ToBeSetup_List_t *spCellLst
5692 * *****************************************************************/
5693 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
5696 if(spCellLst->list.array != NULLP)
5698 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
5700 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
5702 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
5704 if(spCellLst->list.array[cellidx]!=NULLP)
5706 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
5709 DU_FREE(spCellLst->list.array,spCellLst->list.size);
5712 /*******************************************************************
5714 * @brief Deallocating memory of function BuildAndSendUESetReq
5718 * Function : FreeSRBSetup
5720 * Functionality: Deallocating memory for function BuildSRBSetup
5722 * @params[in] SRBs_ToBeSetup_List_t *srbSet
5727 * ******************************************************************/
5728 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
5731 if(srbSet->list.array != NULLP)
5733 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
5735 if(srbSet->list.array[srbidx]!=NULLP)
5737 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
5740 DU_FREE(srbSet->list.array,srbSet->list.size);
5743 /*******************************************************************
5745 * @brief Deallocating memory of function BuildAndSendUESetReq
5749 * Function : FreeQOSInfo
5751 * Functionality: Deallocating memory for function BuildQOSInfo
5753 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
5757 * ****************************************************************/
5758 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
5760 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
5762 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
5764 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5766 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
5767 sizeof(MaxDataBurstVolume_t));
5769 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
5770 sizeof(AveragingWindow_t));
5772 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
5773 sizeof(NonDynamic5QIDescriptor_t));
5776 /*******************************************************************
5778 * @brief Deallocating memory of function BuildAndSendUESetReq
5782 * Function : FreeULTnlInfo
5784 * Functionality: Deallocating memory for function BuildULTnlInfo
5786 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
5791 * ****************************************************************/
5792 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
5795 if(ulInfo->list.array != NULLP)
5797 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
5799 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
5801 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
5803 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5804 transportLayerAddress.buf != NULLP)
5806 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
5809 DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5810 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
5811 gTPTunnel->gTP_TEID.size);
5813 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5814 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
5815 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
5817 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
5818 sizeof(GTPTunnel_t));
5821 if(ulInfo->list.array[ulidx]!=NULLP)
5823 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
5826 DU_FREE(ulInfo->list.array,ulInfo->list.size);
5829 /*******************************************************************
5831 * @brief Deallocating memory for BuildAndSendUESetReq
5835 * Function : FreeDRBSetup
5837 * Functionality: Deallocating memory for BuildDRBSetup
5839 * @params[in] DRBs_ToBeSetup_List_t *drbSet
5843 * ****************************************************************/
5844 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
5846 DRBs_ToBeSetup_Item_t *drbSetItem;
5849 if(drbSet->list.array == NULLP)
5851 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
5853 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
5855 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
5856 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
5858 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5859 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
5861 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5862 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
5864 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5865 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5867 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
5869 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
5871 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
5873 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5874 flows_Mapped_To_DRB_List.list.array != NULLP)
5876 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5877 flows_Mapped_To_DRB_List.list.count; flowidx++)
5879 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5880 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
5882 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5883 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5884 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
5886 if(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->averagingWindow!=NULLP)
5890 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5891 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5892 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5894 if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
5896 DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
5898 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
5899 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5900 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5901 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
5902 sizeof(MaxDataBurstVolume_t));
5904 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5905 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5906 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
5908 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5909 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5910 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
5913 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5914 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
5916 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5917 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
5920 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5921 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
5922 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
5924 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
5925 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
5927 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
5928 sizeof(OCTET_STRING_t));
5930 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
5931 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
5933 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5934 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
5936 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5937 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
5939 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5940 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
5942 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
5945 if(drbSet->list.array[drbidx]!=NULLP)
5947 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
5950 DU_FREE(drbSet->list.array,drbSet->list.size);
5953 /*******************************************************************
5955 * @brief Free the UE Setup Request
5959 * Function : FreeUESetReq
5961 * Functionality: Deallocate the memory of BuildUESetReq
5963 * @params[in] F1AP_PDU_t *f1apMsg
5968 * ****************************************************************/
5969 void FreeUESetReq(F1AP_PDU_t *f1apMsg)
5973 UEContextSetupRequest_t *ueSetReq;
5975 if(f1apMsg != NULLP)
5977 if(f1apMsg->choice.initiatingMessage != NULLP)
5979 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5980 if(ueSetReq->protocolIEs.list.array != NULLP)
5982 if(ueSetReq->protocolIEs.list.array[idx])
5987 if(ueSetReq->protocolIEs.list.array[idx])
5989 if(SplCellListret==ROK)
5992 if(ueSetReq->protocolIEs.list.array[idx])
5994 if(SRBSetupret == ROK)
5997 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6000 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6004 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6008 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6010 for(ieId=0; ieId<ueSetReq->protocolIEs.list.count; ieId++)
6012 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
6014 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
6017 DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6019 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6021 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6025 /*******************************************************************
6027 * @brief Builds and sends the UE Setup Request
6031 * Function : BuildAndSendUESetReq
6033 * Functionality: Constructs the UE Setup Request and sends
6034 * it to the CU through SCTP.
6038 * @return ROK - success
6041 * ****************************************************************/
6042 uint8_t BuildAndSendUESetReq()
6048 F1AP_PDU_t *f1apMsg = NULL;
6049 UEContextSetupRequest_t *ueSetReq;
6050 asn_enc_rval_t encRetVal; /* Encoder return value */
6051 uint8_t ret= RFAILED;
6055 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
6057 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6058 if(f1apMsg == NULLP)
6060 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6064 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6065 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6066 if(f1apMsg->choice.initiatingMessage == NULLP)
6068 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
6072 f1apMsg->choice.initiatingMessage->procedureCode = \
6073 ProcedureCode_id_UEContextSetup;
6074 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
6075 f1apMsg->choice.initiatingMessage->value.present = \
6076 InitiatingMessage__value_PR_UEContextSetupRequest;
6078 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
6080 ueSetReq->protocolIEs.list.count = elementCnt;
6081 ueSetReq->protocolIEs.list.size = \
6082 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
6084 /* Initialize the UESetup members */
6085 DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
6087 if(ueSetReq->protocolIEs.list.array == NULLP)
6089 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
6093 for(idx1=0; idx1<elementCnt; idx1++)
6095 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
6096 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
6104 /*GNB CU UE F1AP ID*/
6105 ueSetReq->protocolIEs.list.array[idx]->id = \
6106 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
6107 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6108 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6109 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
6110 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
6112 /*GNB DU UE F1AP ID*/
6114 ueSetReq->protocolIEs.list.array[idx]->id = \
6115 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6116 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6117 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6118 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
6119 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
6123 ueSetReq->protocolIEs.list.array[idx]->id = \
6124 ProtocolIE_ID_id_SpCell_ID;
6125 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6126 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6127 UEContextSetupRequestIEs__value_PR_NRCGI;
6128 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
6134 /*Served Cell Index*/
6136 ueSetReq->protocolIEs.list.array[idx]->id = \
6137 ProtocolIE_ID_id_ServCellIndex;
6138 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6139 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6140 UEContextSetupRequestIEs__value_PR_ServCellIndex;
6141 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
6144 /*CellULConfigured*/
6146 ueSetReq->protocolIEs.list.array[idx]->id = \
6147 ProtocolIE_ID_id_SpCellULConfigured;
6148 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6149 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6150 UEContextSetupRequestIEs__value_PR_CellULConfigured;
6151 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
6152 CellULConfigured_none;
6155 /*CUtoDURRCContainer*/
6157 ueSetReq->protocolIEs.list.array[idx]->id = \
6158 ProtocolIE_ID_id_CUtoDURRCInformation;
6159 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6160 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6161 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
6163 /*Special Cells to be SetupList*/
6165 ueSetReq->protocolIEs.list.array[idx]->id = \
6166 ProtocolIE_ID_id_SCell_ToBeSetup_List;
6167 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
6168 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6169 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
6170 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
6171 if(SplCellListret != ROK)
6175 /*SRBs To Be Setup List*/
6177 ueSetReq->protocolIEs.list.array[idx]->id = \
6178 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
6179 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6180 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6181 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
6182 SRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
6183 if(SRBSetupret != ROK)
6187 /*DRBs to Be Setup List*/
6189 ueSetReq->protocolIEs.list.array[idx]->id = \
6190 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
6191 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6192 ueSetReq->protocolIEs.list.array[idx]->value.present = \
6193 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
6194 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
6200 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6202 /* Encode the F1SetupRequest type as APER */
6203 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
6205 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
6207 /* Encode results */
6208 if(encRetVal.encoded == ENCODE_FAIL)
6210 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
6211 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6216 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
6217 for(int i=0; i< encBufSize; i++)
6219 printf("%x",encBuf[i]);
6224 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
6226 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
6232 FreeUESetReq(f1apMsg);
6235 }/* End of BuildAndSendUESetReq*/
6237 /*******************************************************************
6239 * @brief Handles received F1AP message and sends back response
6243 * Function : F1APMsgHdlr
6246 * - Decodes received F1AP control message
6247 * - Prepares response message, encodes and sends to SCTP
6250 * @return ROK - success
6253 * ****************************************************************/
6254 void F1APMsgHdlr(Buffer *mBuf)
6260 F1AP_PDU_t *f1apMsg;
6261 asn_dec_rval_t rval; /* Decoder return value */
6262 F1AP_PDU_t f1apasnmsg ;
6264 DU_LOG("\nF1AP : Received F1AP message buffer");
6265 SPrntMsg(mBuf, 0,0);
6267 /* Copy mBuf into char array to decode it */
6268 SFndLenMsg(mBuf, &recvBufLen);
6269 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
6271 DU_LOG("\nF1AP : Memory allocation failed");
6274 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6276 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
6280 printf("\nF1AP : Received flat buffer to be decoded : ");
6281 for(i=0; i< recvBufLen; i++)
6283 printf("%x",recvBuf[i]);
6286 /* Decoding flat buffer into F1AP messsage */
6287 f1apMsg = &f1apasnmsg;
6288 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
6290 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
6291 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
6292 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6294 DU_LOG("\nF1AP : ASN decode failed");
6298 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6300 switch(f1apMsg->present)
6302 case F1AP_PDU_PR_successfulOutcome:
6304 switch(f1apMsg->choice.successfulOutcome->value.present)
6306 case SuccessfulOutcome__value_PR_F1SetupResponse:
6308 #ifndef ODU_TEST_STUB
6309 procF1SetupRsp(f1apMsg);
6314 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
6316 procGNBDUCfgUpdAck(f1apMsg);
6322 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
6325 }/* End of switch(successfulOutcome) */
6328 case F1AP_PDU_PR_initiatingMessage:
6330 switch(f1apMsg->choice.initiatingMessage->value.present)
6332 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
6334 procDlRrcMsgTrans(f1apMsg);
6340 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
6341 f1apMsg->choice.initiatingMessage->value.present);
6344 }/* End of switch(initiatingMessage) */
6350 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
6354 }/* End of switch(f1apMsg->present) */
6356 } /* End of F1APMsgHdlr */
6358 /**********************************************************************
6360 **********************************************************************/