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"
27 #include "du_app_rlc_inf.h"
28 #include "du_mgr_main.h"
31 #include "FeatureSetUplinkPerCC.h"
32 #include "FeatureSetDownlinkPerCC.h"
33 #include "FeatureSets.h"
34 #include "UE-NR-Capability.h"
35 #include "UE-CapabilityRAT-Container.h"
36 #include "UE-CapabilityRAT-ContainerListRRC.h"
37 #include "GNB-DU-System-Information.h"
38 #include "CellGroupConfigRrc.h"
39 #include "MAC-CellGroupConfig.h"
40 #include "SchedulingRequestConfig.h"
41 #include "SchedulingRequestToAddMod.h"
42 #include "BSR-Config.h"
43 #include "TAG-Config.h"
45 #include "PHR-Config.h"
46 #include "RLC-Config.h"
47 #include "UL-AM-RLC.h"
48 #include "DL-AM-RLC.h"
49 #include "LogicalChannelConfig.h"
50 #include "RLC-BearerConfig.h"
51 #include "PhysicalCellGroupConfig.h"
52 #include "SpCellConfig.h"
53 #include "TDD-UL-DL-ConfigDedicated.h"
54 #include "ServingCellConfig.h"
55 #include "ControlResourceSet.h"
56 #include "SearchSpace.h"
57 #include "PDCCH-Config.h"
58 #include "PDSCH-TimeDomainResourceAllocation.h"
59 #include "PDSCH-TimeDomainResourceAllocationList.h"
60 #include "PDSCH-CodeBlockGroupTransmission.h"
61 #include "PDSCH-ServingCellConfig.h"
62 #include "DMRS-DownlinkConfig.h"
63 #include "PDSCH-Config.h"
64 #include "BWP-DownlinkDedicated.h"
65 #include "PUSCH-TimeDomainResourceAllocation.h"
66 #include "PUSCH-TimeDomainResourceAllocationList.h"
67 #include "DMRS-UplinkConfig.h"
68 #include "PUSCH-Config.h"
69 #include "SRS-ResourceId.h"
70 #include "SRS-Resource.h"
71 #include "SRS-ResourceSet.h"
72 #include "SRS-Config.h"
73 #include "BWP-UplinkDedicated.h"
74 #include "PUSCH-ServingCellConfig.h"
75 #include "UplinkConfig.h"
76 #include "DUtoCURRCContainer.h"
77 #include "GBR-QoSFlowInformation.h"
78 #include "QoSFlowLevelQoSParameters.h"
79 #include<ProtocolIE-Field.h>
80 #include "ProtocolExtensionField.h"
82 #include "odu_common_codec.h"
84 #include "du_cell_mgr.h"
85 #include "du_f1ap_msg_hdl.h"
87 DuCfgParams duCfgParam;
89 /*******************************************************************
91 * @brief Builds Uplink Info for NR
95 * Function : BuildULNRInfo
97 * Functionality: Building NR Uplink Info
99 * @params[in] NRFreqInfo_t *ulnrfreq
100 * @return ROK - success
103 * ****************************************************************/
104 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
107 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
108 fdd.ulNrFreqInfo.nrArfcn;
109 ulnrfreq->freqBandListNr.list.count = 1;
110 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
111 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
112 if(ulnrfreq->freqBandListNr.list.array == NULLP)
116 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
118 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
119 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
124 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
125 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
126 freqBand[0].nrFreqBand;
127 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
130 /*******************************************************************
132 * @brief Builds Downlink NR Info
136 * Function : BuildDLNRInfo
138 * Functionality: Building Downlink NR Info
140 * @params[in] NRFreqInfo_t *dlnrfreq
141 * @return ROK - success
144 * ****************************************************************/
145 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
148 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
149 fdd.dlNrFreqInfo.nrArfcn;
150 dlnrfreq->freqBandListNr.list.count = 1;
151 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
152 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
153 if(dlnrfreq->freqBandListNr.list.array == NULLP)
157 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
159 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
160 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
165 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
166 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
167 freqBand[0].nrFreqBand;
168 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
173 /*******************************************************************
175 * @brief Builds NRCell ID
179 * Function : BuildNrCellId
181 * Functionality: Building the NR Cell ID
183 * @params[in] BIT_STRING_t *nrcell
184 * @return ROK - success
187 * ****************************************************************/
189 S16 BuildNrCellId(BIT_STRING_t *nrcell)
191 memset(nrcell->buf, 0, nrcell->size);
193 nrcell->bits_unused = 4;
197 /*******************************************************************
199 * @brief Builds Nrcgi
203 * Function : BuildNrcgi
205 * Functionality: Building the PLMN ID and NR Cell id
207 * @params[in] NRCGI_t *nrcgi
208 * @return ROK - success
211 * ****************************************************************/
212 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
215 uint8_t byteSize = 5;
216 /* Allocate Buffer Memory */
217 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
218 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
219 if(nrcgi->pLMN_Identity.buf == NULLP)
223 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
224 nrcgi->pLMN_Identity.buf); // Building PLMN function
230 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
231 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
232 if(nrcgi->nRCellIdentity.buf == NULLP)
236 BuildNrCellId(&nrcgi->nRCellIdentity);
240 /*******************************************************************
242 * @brief Builds FiveGStac
246 * Function : BuildFiveGSTac
248 * Functionality: Building the FiveGSTac
250 * @params[in] OCTET_STRING_t *fivegsTac
251 * @return ROK - success
254 * ****************************************************************/
255 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
257 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
258 if(servcell->fiveGS_TAC == NULLP)
262 servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
263 DU_ALLOC(servcell->fiveGS_TAC->buf,\
264 sizeof(servcell->fiveGS_TAC->size));
265 if(servcell->fiveGS_TAC->buf == NULLP)
269 servcell->fiveGS_TAC->buf[0] = 0;
270 servcell->fiveGS_TAC->buf[1] = 0;
271 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
274 /*******************************************************************
276 * @brief Builds NR Mode
280 * Function : BuildNrMode
282 * Functionality: Building the NR Mode
284 * @params[in] NR_Mode_Info_t *fdd
285 * @return ROK - success
288 * ****************************************************************/
289 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
291 uint8_t BuildDLNRInforet=0;
292 uint8_t BuildULNRInforet=0;
294 mode->present = NR_Mode_Info_PR_fDD;
295 if(mode->present == NR_Mode_Info_PR_fDD)
297 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
298 if(mode->choice.fDD == NULLP)
302 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
303 if(BuildULNRInforet != ROK)
307 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
308 if(BuildDLNRInforet != ROK)
313 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
314 duCfgParam.srvdCellLst[0].duCellInfo.\
315 f1Mode.mode.fdd.ulTxBw.nrScs;
316 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
317 duCfgParam.srvdCellLst[0].duCellInfo.\
318 f1Mode.mode.fdd.ulTxBw.nrb;
319 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
320 duCfgParam.srvdCellLst[0].duCellInfo.\
321 f1Mode.mode.fdd.dlTxBw.nrScs;
322 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
323 duCfgParam.srvdCellLst[0].duCellInfo.\
324 f1Mode.mode.fdd.dlTxBw.nrb;
327 /*******************************************************************
329 * @brief Builds IE Extensions for Served PLMNs
333 * Function : BuildExtensions
335 * Functionality: Building the IE Extensions
337 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
338 * @return ROK - success
341 * ****************************************************************/
342 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
346 uint8_t extensionCnt=1;
349 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
350 if((*ieExtend) == NULLP)
354 (*ieExtend)->list.count = extensionCnt;
355 (*ieExtend)->list.size = \
356 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
357 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
358 if((*ieExtend)->list.array == NULLP)
362 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
364 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
365 sizeof(ServedPLMNs_ItemExtIEs_t));
366 if((*ieExtend)->list.array[plmnidx] == NULLP)
372 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
373 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
374 (*ieExtend)->list.array[idx]->extensionValue.present = \
375 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
376 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
378 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
379 list.size = sizeof(SliceSupportItem_t *);
380 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
381 list.array,sizeof(SliceSupportItem_t *));
382 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
387 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
388 list.array[sliceId],sizeof(SliceSupportItem_t));
389 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
390 list.array[sliceId] == NULLP)
394 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
395 list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
396 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
397 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
398 extensionValue.choice.SliceSupportList.\
399 list.array[sliceId]->sNSSAI.sST.size);
400 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
401 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
405 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
406 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
407 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
408 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
409 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
410 list.array[sliceId]->sNSSAI.sD == NULLP)
414 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
415 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
416 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
417 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
418 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
419 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
420 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
425 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
426 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
428 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
429 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
431 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
432 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
435 /*******************************************************************
437 * @brief Builds Served PLMN
441 * Function : BuildServedPlmn
443 * Functionality: Building the Served PLMN
445 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
446 * @return ROK - success
449 * ****************************************************************/
450 uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
453 uint8_t servPlmnCnt=1;
454 uint8_t buildPlmnIdret=0;
455 uint8_t BuildExtensionsret=0;
456 srvplmn->list.count = servPlmnCnt;
457 srvplmn->list.size = \
458 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
459 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
460 if(srvplmn->list.array == NULLP)
464 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
466 DU_ALLOC(srvplmn->list.array[plmnidx],\
467 sizeof(ServedPLMNs_Item_t));
468 if(srvplmn->list.array[plmnidx] == NULLP)
473 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
474 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
475 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
476 srvplmn->list.array[0]->pLMN_Identity.buf);
477 if(buildPlmnIdret!= ROK)
481 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
482 if(BuildExtensionsret!= ROK)
488 /*******************************************************************
490 * @brief Builds Served Cell List
494 * Function : BuildServedCellList
496 * Functionality: Building Served Cell List
498 * @params[in] PLMNID plmn
499 * @return ROK - success
502 * ****************************************************************/
504 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
506 uint8_t BuildNrcgiret=0;
507 uint8_t BuildFiveGSTacret=0;
508 uint8_t BuildServedPlmnret=0;
509 uint8_t BuildNrModeret=0;
513 GNB_DU_Served_Cells_Item_t *srvCellItem;
514 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
515 duServedCell->list.count = plmnCnt;
517 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
518 if(duServedCell->list.array == NULLP)
522 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
524 DU_ALLOC(duServedCell->list.array[plmnidx],\
525 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
526 if(duServedCell->list.array[plmnidx] == NULLP)
532 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
533 duServedCell->list.array[idx]->criticality = Criticality_reject;
534 duServedCell->list.array[idx]->value.present = \
535 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
537 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
539 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
540 if(BuildNrcgiret != ROK)
545 srvCellItem->served_Cell_Information.nRPCI = \
546 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
549 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
550 if(BuildFiveGSTacret != ROK)
555 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
556 if(BuildServedPlmnret !=ROK)
560 /*nR Mode Info with FDD*/
561 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
562 if(BuildNrModeret != ROK)
566 /*Measurement timing Config*/
567 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
568 size = sizeof(uint8_t);
569 DU_ALLOC(srvCellItem->served_Cell_Information.\
570 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
571 if(srvCellItem->served_Cell_Information.\
572 measurementTimingConfiguration.buf == NULLP)
576 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
577 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
579 /* GNB DU System Information */
580 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
581 sizeof(GNB_DU_System_Information_t));
582 if(!srvCellItem->gNB_DU_System_Information)
587 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
588 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
589 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
590 srvCellItem->gNB_DU_System_Information->mIB_message.size);
591 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
595 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
596 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
599 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
600 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
602 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
603 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
604 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
608 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
610 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
611 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
615 /*******************************************************************
617 * @brief Builds RRC Version
621 * Function : BuildRrcVer
623 * Functionality: Building RRC Version
625 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
626 * @return ROK - success
629 * ****************************************************************/
630 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
634 rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
635 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
636 if(rrcVer->latest_RRC_Version.buf == NULLP)
640 rrcVer->latest_RRC_Version.buf[0] = 0;
641 rrcVer->latest_RRC_Version.bits_unused = 5;
642 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
643 if(rrcVer->iE_Extensions == NULLP)
647 rrcVer->iE_Extensions->list.count = 1;
648 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
649 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
650 if(rrcVer->iE_Extensions->list.array == NULLP)
655 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
656 sizeof(RRC_Version_ExtIEs_t));
657 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
661 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
662 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
663 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
664 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
665 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
666 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
667 .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
668 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
669 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
670 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
671 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
672 .Latest_RRC_Version_Enhanced.buf == NULLP)
677 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
678 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
680 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
681 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
683 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
684 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
687 /*******************************************************************
689 * @brief Sends F1 msg over SCTP
693 * Function : SendF1APMsg
695 * Functionality: Sends F1 msg over SCTP
697 * @params[in] Region region
699 * @return ROK - success
702 * ****************************************************************/
703 uint8_t SendF1APMsg(Region region, Pool pool)
707 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
709 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
711 ODU_PRINT_MSG(mBuf, 0,0);
713 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
715 DU_LOG("\nF1AP : SCTP Send failed");
716 ODU_PUT_MSG_BUF(mBuf);
722 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
723 ODU_PUT_MSG_BUF(mBuf);
726 ODU_PUT_MSG_BUF(mBuf);
730 DU_LOG("\nF1AP : Failed to allocate memory");
736 /*******************************************************************
738 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
742 * Function : FreeRrcVer
744 * Functionality: deallocating the memory of function BuildRrcVer
746 * @params[in] RRC_Version_t *rrcVer
750 *****************************************************************/
751 void FreeRrcVer(RRC_Version_t *rrcVer)
753 if(rrcVer->latest_RRC_Version.buf != NULLP)
755 if(rrcVer->iE_Extensions != NULLP)
757 if(rrcVer->iE_Extensions->list.array != NULLP)
759 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
761 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
764 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
765 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
766 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
768 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
770 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
772 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
774 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
777 /*******************************************************************
779 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
783 * Function : FreeServedCellList
785 * Functionality: deallocating the memory of function BuildServedCellList
788 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
792 * ****************************************************************/
793 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
799 uint8_t extensionCnt=1;
801 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
802 if(duServedCell->list.array!=NULLP)
804 if(duServedCell->list.array[0]!=NULLP)
806 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
808 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
810 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
812 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
814 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
816 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
818 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
820 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
822 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
824 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
826 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
827 extensionValue.choice.SliceSupportList.list.array!=NULLP)
829 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
830 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
832 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
833 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
835 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
836 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
838 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
839 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
841 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
843 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
844 freqBandListNr.list.array!=NULLP)
846 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
847 freqBandListNr.list.array[0]!=NULLP)
849 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
850 freqBandListNr.list.array)
852 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
853 freqBandListNr.list.array[0]!=NULLP)
855 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
857 if(!srvCellItem->gNB_DU_System_Information)
859 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
861 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
863 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
864 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
865 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
866 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
868 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
869 srvCellItem->gNB_DU_System_Information->mIB_message.size);
870 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
871 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
873 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
875 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
876 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
878 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
879 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
881 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
882 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
884 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
885 list.array[0],sizeof(FreqBandNrItem_t));
887 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
888 list.array,sizeof(FreqBandNrItem_t*));
890 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
892 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
893 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
894 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
895 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
897 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
898 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
899 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
901 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
902 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
903 sNSSAI.sST.buf,sizeof(uint8_t));
905 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
906 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
908 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
909 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
911 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
912 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
914 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
915 array[servId]->iE_Extensions->list.array,\
916 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
918 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
919 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
921 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
922 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
923 servedPLMNs.list.array[servId]->pLMN_Identity.size
926 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
927 sizeof(ServedPLMNs_Item_t *));
929 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
930 sizeof(ServedPLMNs_Item_t *));
932 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
933 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
935 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
937 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
938 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
941 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
942 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
945 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
947 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
950 /*******************************************************************
952 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
956 * Function : FreeF1SetupReq
958 * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
960 * @params[in] F1AP_PDU_t *f1apMsg
964 * ****************************************************************/
965 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
967 uint8_t ieIdx, ieIdx2;
968 F1SetupRequest_t *f1SetupReq=NULLP;
972 if(f1apMsg->choice.initiatingMessage != NULLP)
974 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
975 if(f1SetupReq->protocolIEs.list.array != NULLP)
977 for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
979 if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP)
981 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
983 case ProtocolIE_ID_id_TransactionID:
985 case ProtocolIE_ID_id_gNB_DU_ID:
986 DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
987 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
989 case ProtocolIE_ID_id_gNB_DU_Name:
990 DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\
991 strlen((char *)duCfgParam.duName));
993 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
994 FreeServedCellList(&f1SetupReq->protocolIEs.list.\
995 array[ieIdx]->value.choice.GNB_DU_Served_Cells_List);
997 case ProtocolIE_ID_id_GNB_DU_RRC_Version:
998 FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version);
1001 DU_LOG("\nInvalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id);
1007 for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++)
1009 DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t));
1011 DU_FREE(f1SetupReq->protocolIEs.list.array,\
1012 f1SetupReq->protocolIEs.list.size);
1014 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1016 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1019 /*******************************************************************
1021 * @brief Builds and Send the F1SetupRequest
1025 * Function : BuildAndSendF1SetupReq
1027 * Functionality:Fills the F1SetupRequest
1029 * @return ROK - success
1032 ******************************************************************/
1033 uint8_t BuildAndSendF1SetupReq()
1035 uint8_t ret, ieIdx, elementCnt;
1036 F1AP_PDU_t *f1apMsg = NULLP;
1037 F1SetupRequest_t *f1SetupReq=NULLP;
1038 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1039 RRC_Version_t *rrcVer=NULLP;
1040 asn_enc_rval_t encRetVal; /* Encoder return value */
1043 DU_LOG("\nF1AP : Building F1 Setup Request\n");
1046 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1047 if(f1apMsg == NULLP)
1051 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1052 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1053 if(f1apMsg->choice.initiatingMessage == NULLP)
1057 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1058 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1059 f1apMsg->choice.initiatingMessage->value.present = \
1060 InitiatingMessage__value_PR_F1SetupRequest;
1062 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1064 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1066 f1SetupReq->protocolIEs.list.count = elementCnt;
1067 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1069 /* Initialize the F1Setup members */
1070 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1071 if(f1SetupReq->protocolIEs.list.array == NULLP)
1075 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
1077 DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\
1078 sizeof(F1SetupRequestIEs_t));
1079 if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP)
1087 f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID;
1088 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1089 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\
1090 F1SetupRequestIEs__value_PR_TransactionID;
1091 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \
1096 f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
1097 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1098 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1099 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1100 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\
1103 DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1104 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1105 if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \
1111 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\
1115 if(duCfgParam.duName != NULL)
1118 f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name;
1119 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
1120 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1121 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\
1122 strlen((char *)duCfgParam.duName);
1123 DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\
1124 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1125 if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\
1130 strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\
1131 choice.GNB_DU_Name.buf,
1132 (char*)&duCfgParam.duName);
1136 /*Served Cell list */
1138 f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1139 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1140 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1141 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1142 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1143 duServedCell = &f1SetupReq->protocolIEs.list.\
1144 array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
1145 if(BuildServedCellList(duServedCell))
1151 f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1152 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1153 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1154 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1155 F1SetupRequestIEs__value_PR_RRC_Version;
1156 rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
1157 if(BuildRrcVer(rrcVer))
1161 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1163 /* Encode the F1SetupRequest type as APER */
1164 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1166 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1169 /* Encode results */
1170 if(encRetVal.encoded == ENCODE_FAIL)
1172 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1173 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1178 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1179 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
1181 printf("%x",encBuf[ieIdx]);
1186 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1188 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1196 FreeF1SetupReq(f1apMsg);
1199 }/* End of BuildAndSendF1SetupReq */
1201 /*******************************************************************
1203 * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1207 * Function : FreeDUConfigUpdate
1209 * Functionality: Deallocating memory of variables allocated in
1210 * BuildAndSendDUConfigUpdate function
1212 * @params[in] F1AP_PDU_t *f1apDuCfg
1214 * @return ROK - void
1216 * ****************************************************************/
1217 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1221 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
1222 Served_Cells_To_Modify_List_t *cellsToModify;
1223 Served_Cells_To_Modify_Item_t *modifyItem;
1226 if(f1apDuCfg != NULLP)
1228 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1230 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1231 value.choice.GNBDUConfigurationUpdate;
1232 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1234 if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
1236 cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
1237 value.choice.Served_Cells_To_Modify_List;
1238 if(cellsToModify->list.array != NULLP)
1240 if(cellsToModify->list.array[idx] != NULLP)
1242 modifyItem=&cellsToModify->list.array[idx]->value.choice.\
1243 Served_Cells_To_Modify_Item;
1244 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1246 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1248 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1250 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1253 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1256 if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
1258 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1259 array[idx]->pLMN_Identity.buf != NULLP)
1261 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1262 array[idx]->iE_Extensions!= NULLP)
1264 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1265 array[idx]->iE_Extensions->list.array != NULLP)
1267 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1268 array[idx]->iE_Extensions->list.array[idx])
1270 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1271 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1274 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1275 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1276 list.array[idx]!=NULLP)
1278 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1279 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1280 list.array[idx]->sNSSAI.sST.buf!=NULLP)
1282 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1283 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1284 list.array[idx]->sNSSAI.sD != NULLP)
1286 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1287 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1288 list.array[idx]->sNSSAI.sD->buf!=NULLP)
1290 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1293 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1294 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1296 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1297 fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
1299 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1300 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1302 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1303 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1306 if(modifyItem->served_Cell_Information.\
1307 measurementTimingConfiguration.buf !=NULLP)
1310 if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
1311 choice.GNB_DU_ID.buf!=NULLP)
1313 DU_FREE(duCfgUpdate->protocolIEs.list.\
1314 array[idx]->value.choice.GNB_DU_ID.buf,\
1315 duCfgUpdate->protocolIEs.list.array[idx]->\
1316 value.choice.GNB_DU_ID.size);
1319 DU_FREE(modifyItem->served_Cell_Information.\
1320 measurementTimingConfiguration.\
1321 buf,modifyItem->served_Cell_Information.\
1322 measurementTimingConfiguration.size);
1324 DU_FREE(modifyItem->served_Cell_Information.\
1325 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1326 list.array[idx],sizeof(FreqBandNrItem_t));
1328 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1329 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1330 modifyItem->served_Cell_Information.nR_Mode_Info.\
1331 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1333 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1334 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1335 array[idx],sizeof(FreqBandNrItem_t));
1337 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1339 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1340 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1341 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1343 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1344 fDD,sizeof(FDD_Info_t));
1346 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1347 array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1349 list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1350 servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
1351 extensionValue.choice.SliceSupportList.list.array[idx]->\
1355 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1357 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1358 list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1360 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1361 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1362 list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
1364 list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1365 SliceSupportList.list.array[idx]->sNSSAI.sST.size);
1367 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1368 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1369 list.array[idx],sizeof(SliceSupportItem_t));
1371 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1372 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1374 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1375 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
1378 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
1379 array[idx]->iE_Extensions->list.count;i++)
1381 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1382 array[idx]->iE_Extensions->list.array[i],\
1383 sizeof(ServedPLMNs_ItemExtIEs_t ));
1385 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1386 array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1387 list.array[idx]->iE_Extensions->list.size);
1389 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1390 array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1392 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1393 array[idx]->pLMN_Identity.buf,
1394 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
1397 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1399 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
1402 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1403 sizeof(ServedPLMNs_Item_t));
1406 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1407 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1409 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1410 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1412 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1413 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1415 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1416 modifyItem->oldNRCGI.nRCellIdentity.size);
1418 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1419 modifyItem->oldNRCGI.pLMN_Identity.size);
1422 for(i=0; i<cellsToModify->list.count ;i++)
1424 if(cellsToModify->list.array[i] != NULLP)
1426 DU_FREE(cellsToModify->list.array[i],\
1427 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1430 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1433 for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
1435 if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
1437 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1438 sizeof(GNBDUConfigurationUpdateIEs_t));
1441 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1443 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1445 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1449 /*******************************************************************
1451 * @brief Fills Served Plmns required in ServCellInfo IE
1455 * Function : fillServedPlmns
1457 * Functionality: Fills Served Plmns required in ServCellInfo IE
1459 * @params[in] Pointer to ServedPLMNs_List_t *
1461 * @return ROK - success
1464 *****************************************************************/
1466 uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
1468 uint8_t ieIdx, ieListCnt;
1470 servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1471 DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\
1472 array[0]->pLMN_Identity.size);
1473 if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP)
1477 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1478 servedPlmn->list.array[0]->pLMN_Identity.buf);
1479 DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1480 if(servedPlmn->list.array[0]->iE_Extensions == NULLP)
1486 servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt;
1487 servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1488 DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\
1489 iE_Extensions->list.size);
1490 if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP)
1494 for(ieIdx=0;ieIdx<ieListCnt;ieIdx++)
1496 DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx],\
1497 sizeof(ServedPLMNs_ItemExtIEs_t));
1498 if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP)
1503 //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions;
1504 servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1505 servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1506 servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \
1507 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1508 servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1510 servedPlmn->list.array[0]->\
1511 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1512 list.size = sizeof(SliceSupportItem_t *);
1513 DU_ALLOC(servedPlmn->list.array[0]->\
1514 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1515 list.array,servedPlmn->list.array[0]->\
1516 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1517 if(servedPlmn->list.array[0]->\
1518 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1519 list.array == NULLP)
1524 DU_ALLOC(servedPlmn->list.array[0]->\
1525 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1526 list.array[0],sizeof( SliceSupportItem_t));
1527 if(servedPlmn->list.array[0]->\
1528 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1529 list.array[0] == NULLP)
1533 servedPlmn->list.array[0]->\
1534 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1535 list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1536 DU_ALLOC(servedPlmn->list.array[0]->\
1537 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1538 list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\
1539 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1540 if(servedPlmn->list.array[0]->\
1541 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1542 list.array[0]->sNSSAI.sST.buf == NULLP)
1546 servedPlmn->list.array[0]->\
1547 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1548 list.array[0]->sNSSAI.sST.buf[0] = 3;
1549 DU_ALLOC(servedPlmn->list.array[0]->\
1550 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1551 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1552 if(servedPlmn->list.array[0]->\
1553 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1554 list.array[0]->sNSSAI.sD == NULLP)
1558 servedPlmn->list.array[0]->\
1559 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1560 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1561 DU_ALLOC(servedPlmn->list.array[0]->\
1562 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1563 list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\
1564 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1565 list.array[0]->sNSSAI.sD->size);
1566 if(servedPlmn->list.array[0]->\
1567 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1568 list.array[0]->sNSSAI.sD->buf == NULLP)
1572 servedPlmn->list.array[0]->\
1573 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1574 list.array[0]->sNSSAI.sD->buf[0] = 3;
1575 servedPlmn->list.array[0]->\
1576 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1577 list.array[0]->sNSSAI.sD->buf[1] = 6;
1578 servedPlmn->list.array[0]->\
1579 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1580 list.array[0]->sNSSAI.sD->buf[2] = 9;
1584 /*******************************************************************
1586 * @brief Fills Nr Fdd Info required in ServCellInfo IE
1590 * Function : fillNrFddInfo
1592 * Functionality: Fills Nr Fdd Info required in ServCellInfo IE
1594 * @params[in] Pointer to NR_Mode_Info_t *
1596 * @return ROK - success
1599 *****************************************************************/
1601 uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd)
1603 nrFdd->choice.fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1604 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1605 nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1;
1606 nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1607 DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1608 array, nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1609 if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1613 DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \
1614 sizeof(FreqBandNrItem_t));
1615 if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1619 nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1620 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1621 freqBand[0].nrFreqBand;
1622 nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1623 nrFdd->choice.fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1624 dlNrFreqInfo.nrArfcn;
1625 nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1;
1626 nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1627 DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,nrFdd->\
1628 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1629 if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1633 DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0],\
1634 sizeof(FreqBandNrItem_t));
1635 if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1639 nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1640 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1641 freqBand[0].nrFreqBand;
1642 nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1644 /*Transmission Bandwidth*/
1645 nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1646 f1Mode.mode.fdd.ulTxBw.nrScs;
1647 nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1648 f1Mode.mode.fdd.ulTxBw.nrb;
1649 nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1650 f1Mode.mode.fdd.dlTxBw.nrScs;
1651 nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1652 f1Mode.mode.fdd.dlTxBw.nrb;
1657 /*******************************************************************
1659 * @brief Fills ServCellInfo IE
1663 * Function : fillServedCellInfo
1665 * Functionality: Fills ServCellInfo
1667 * @params[in] Pointer to Served_Cell_Information_t *
1669 * @return ROK - success
1672 *****************************************************************/
1674 uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo)
1676 uint8_t tmp, ieIdx, ieListCnt;
1679 srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1680 DU_ALLOC(srvCellInfo->nRCGI.pLMN_Identity.buf,\
1681 srvCellInfo->nRCGI.pLMN_Identity.size);
1682 if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP)
1686 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1687 srvCellInfo->nRCGI.pLMN_Identity.buf);
1688 srvCellInfo->nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1689 DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\
1690 srvCellInfo->nRCGI.nRCellIdentity.size);
1691 if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP)
1695 for (tmp = 0 ; tmp < srvCellInfo->\
1696 nRCGI.nRCellIdentity.size-1 ; tmp++)
1698 srvCellInfo->nRCGI.nRCellIdentity.buf[tmp] = 0;
1700 srvCellInfo->nRCGI.nRCellIdentity.buf[4] = 16;
1701 srvCellInfo->nRCGI.nRCellIdentity.bits_unused =4;
1704 srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1708 srvCellInfo->servedPLMNs.list.count = ieListCnt;
1709 srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *);
1710 DU_ALLOC(srvCellInfo->servedPLMNs.list.array,\
1711 srvCellInfo->servedPLMNs.list.size);
1712 if(srvCellInfo->servedPLMNs.list.array == NULLP)
1716 for(ieIdx=0; ieIdx < ieListCnt; ieIdx++)
1718 DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx],\
1719 sizeof(ServedPLMNs_Item_t));
1720 if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP)
1725 if(fillServedPlmns(&srvCellInfo->servedPLMNs))
1730 /*nR Mode Info with FDD*/
1731 srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD;
1732 DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD,\
1733 sizeof(FDD_Info_t));
1734 if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP)
1738 if(fillNrFddInfo(&srvCellInfo->nR_Mode_Info))
1741 /*Measurement timing Config*/
1742 srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t);
1743 DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\
1744 buf,srvCellInfo->measurementTimingConfiguration.size);
1745 if(srvCellInfo->measurementTimingConfiguration.buf == NULLP)
1749 srvCellInfo->measurementTimingConfiguration.\
1750 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1755 /*******************************************************************
1757 * @brief Fills ServCellToModItem IE
1761 * Function : fillServCellToModItem
1763 * Functionality: Fills ServCellToModItem IE
1765 * @params[in] Pointer to Served_Cells_To_Modify_Item_t *
1767 * @return ROK - success
1770 *****************************************************************/
1772 uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem)
1777 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1778 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1779 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1783 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1784 modifyItem->oldNRCGI.pLMN_Identity.buf);
1787 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1788 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1789 modifyItem->oldNRCGI.nRCellIdentity.size);
1790 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1794 for(ieIdx = 0; ieIdx < modifyItem->oldNRCGI.nRCellIdentity.size-1; ieIdx++)
1796 modifyItem->oldNRCGI.nRCellIdentity.buf[ieIdx] = 0;
1798 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1799 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1801 if(fillServedCellInfo(&modifyItem->served_Cell_Information))
1807 /*******************************************************************
1809 * @brief Builds ServCellToModList
1813 * Function : buildServCellToModList
1815 * Functionality: Builds the serv cell to Mod List
1817 * @params[in] Pointer to Served_Cells_To_Modify_List_t *
1819 * @return ROK - success
1822 *****************************************************************/
1824 uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify)
1826 uint8_t ieListCnt, ieIdx;
1827 Served_Cells_To_Modify_Item_t *modifyItem = NULLP;
1830 cellsToModify->list.count = ieListCnt;
1831 cellsToModify->list.size = ieListCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1832 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1833 if(cellsToModify->list.array == NULLP)
1837 for(ieIdx=0; ieIdx< ieListCnt; ieIdx++)
1839 DU_ALLOC(cellsToModify->list.array[ieIdx],sizeof(Served_Cells_To_Modify_ItemIEs_t));
1840 if(cellsToModify->list.array[ieIdx] == NULLP)
1845 cellsToModify->list.array[0]->id = ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1846 cellsToModify->list.array[0]->criticality = Criticality_reject;
1847 cellsToModify->list.array[0]->value.present =\
1848 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1849 modifyItem=&cellsToModify->list.array[0]->value.choice.Served_Cells_To_Modify_Item;
1851 if(fillServCellToModItem(modifyItem))
1857 /*******************************************************************
1859 * @brief Builds and sends the DUConfigUpdate
1863 * Function : BuildAndSendDUConfigUpdate
1865 * Functionality: Constructs the DU Update message and sends
1866 * it to the CU through SCTP.
1868 * @params[in] void **buf,Buffer to which encoded pattern is written into
1869 * @params[in] int *size,size of buffer
1871 * @return ROK - success
1874 * ****************************************************************/
1875 uint8_t BuildAndSendDUConfigUpdate()
1877 uint8_t ret, ieIdx, elementCnt;
1878 F1AP_PDU_t *f1apDuCfg = NULLP;
1879 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
1880 asn_enc_rval_t encRetVal; /* Encoder return value */
1881 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
1886 DU_LOG("\nF1AP : Building DU config update\n");
1887 /* Allocate the memory for F1DuCfg */
1888 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1889 if(f1apDuCfg == NULLP)
1891 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1895 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1896 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1897 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1899 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1903 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1904 ProcedureCode_id_gNBDUConfigurationUpdate;
1905 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1906 f1apDuCfg->choice.initiatingMessage->value.present = \
1907 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1908 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1909 choice.GNBDUConfigurationUpdate;
1911 duCfgUpdate->protocolIEs.list.count = elementCnt;
1912 duCfgUpdate->protocolIEs.list.size = \
1913 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1915 /* Initialize the F1Setup members */
1916 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1917 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1919 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1922 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
1924 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t));
1925 if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP)
1933 duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID;
1934 duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
1935 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
1936 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1937 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID;
1939 /*Served Cell to Modify */
1941 duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
1942 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1943 duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
1944 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
1945 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1946 if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
1947 Served_Cells_To_Modify_List))
1950 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1953 duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
1954 duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1955 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
1956 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1957 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t);
1958 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1959 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1960 if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP)
1964 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId;
1966 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1968 /* Encode the DU Config Update type as APER */
1969 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1971 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1973 /* Checking encode results */
1974 if(encRetVal.encoded == ENCODE_FAIL)
1976 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1981 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1982 for(ieIdx =0; ieIdx < encBufSize; ieIdx++)
1984 printf("%x",encBuf[ieIdx]);
1988 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1990 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1997 FreeDUConfigUpdate(f1apDuCfg);
2003 /*******************************************************************
2005 * @brief free the ULRRCMessageTransfer
2009 * Function : FreeULRRCMessageTransfer
2011 * Functionality: Deallocating the memory of variable allocated in
2012 * FreeULRRCMessageTransfer
2016 * @return ROK - void
2018 ******************************************************************/
2019 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
2022 ULRRCMessageTransfer_t *ulRRCMsg;
2024 if(f1apMsg != NULLP)
2026 if(f1apMsg->choice.initiatingMessage != NULLP)
2028 ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2029 if(ulRRCMsg->protocolIEs.list.array != NULLP)
2031 for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
2033 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
2035 if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
2036 ULRRCMessageTransferIEs__value_PR_RRCContainer)
2038 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2039 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2041 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
2044 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
2046 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2048 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2051 /*******************************************************************
2053 * @brief Builds and sends the ULRRCMessageTransfer
2057 * Function : BuildAndSendULRRCMessageTransfer
2059 * Functionality: Constructs the UL RRC Message Transfer and sends
2060 * it to the CU through SCTP.
2064 * @return ROK - success
2067 * ****************************************************************/
2068 uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \
2069 uint16_t msgLen, uint8_t *rrcMsg)
2074 F1AP_PDU_t *f1apMsg = NULL;
2075 ULRRCMessageTransfer_t *ulRRCMsg;
2076 asn_enc_rval_t encRetVal; /* Encoder return value */
2077 uint8_t ret =RFAILED;
2080 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
2082 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2083 if(f1apMsg == NULLP)
2085 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2089 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2090 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2091 if(f1apMsg->choice.initiatingMessage == NULLP)
2093 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2096 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
2097 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2098 f1apMsg->choice.initiatingMessage->value.present = \
2099 InitiatingMessage__value_PR_ULRRCMessageTransfer;
2101 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2103 ulRRCMsg->protocolIEs.list.count = elementCnt;
2104 ulRRCMsg->protocolIEs.list.size = \
2105 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
2107 /* Initialize the F1Setup members */
2108 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
2109 if(ulRRCMsg->protocolIEs.list.array == NULLP)
2111 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
2114 for(idx=0; idx<elementCnt; idx++)
2116 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
2117 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2125 /*GNB CU UE F1AP ID*/
2126 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2127 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2128 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2129 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2130 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
2132 /*GNB DU UE F1AP ID*/
2134 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2135 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2136 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2137 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2138 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
2142 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
2143 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2144 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2145 ULRRCMessageTransferIEs__value_PR_SRBID;
2146 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
2150 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCContainer;
2151 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2152 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2153 ULRRCMessageTransferIEs__value_PR_RRCContainer;
2154 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
2155 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2156 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
2157 if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
2159 DU_LOG(" F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
2162 memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
2163 rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2165 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2167 /* Encode the F1SetupRequest type as APER */
2168 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2170 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2172 /* Encode results */
2173 if(encRetVal.encoded == ENCODE_FAIL)
2175 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2176 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2181 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2182 for(int i=0; i< encBufSize; i++)
2184 printf("%x",encBuf[i]);
2189 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
2191 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
2197 FreeULRRCMessageTransfer(f1apMsg);
2200 }/* End of BuildAndSendULRRCMessageTransfer*/
2202 /*******************************************************************
2204 * @brief Builds tag config
2208 * Function : BuildTagConfig
2210 * Functionality: Builds tag config in MacCellGroupConfig
2212 * @params[in] TAG_Config *tag_Config
2214 * @return ROK - success
2217 * ****************************************************************/
2218 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2220 struct TAG_Config__tag_ToAddModList *tagList;
2221 uint8_t idx, elementCnt;
2223 tagConfig->tag_ToReleaseList = NULLP;
2224 tagConfig->tag_ToAddModList = NULLP;
2225 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2226 if(!tagConfig->tag_ToAddModList)
2228 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2232 elementCnt = 1; //ODU_VALUE_ONE;
2233 tagList = tagConfig->tag_ToAddModList;
2234 tagList->list.count = elementCnt;
2235 tagList->list.size = elementCnt * sizeof(struct TAG *);
2237 tagList->list.array = NULLP;
2238 DU_ALLOC(tagList->list.array, tagList->list.size);
2239 if(!tagList->list.array)
2241 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2245 for(idx=0; idx<tagList->list.count; idx++)
2247 tagList->list.array[idx] = NULLP;
2248 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2249 if(!tagList->list.array[idx])
2251 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2257 tagList->list.array[idx]->tag_Id = TAG_ID;
2258 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2263 /*******************************************************************
2265 * @brief Builds PHR Config
2269 * Function : BuildPhrConfig
2271 * Functionality: Builds phrConfig in MacCellGroupConfig
2273 * @params[in] PHR Config *
2275 * @return ROK - success
2278 * ****************************************************************/
2279 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2282 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2283 phrConfig->choice.setup = NULLP;
2284 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2285 if(!phrConfig->choice.setup)
2287 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2291 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2292 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2293 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2294 phrConfig->choice.setup->multiplePHR = false;
2295 phrConfig->choice.setup->dummy = false;
2296 phrConfig->choice.setup->phr_Type2OtherCell = false;
2297 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2302 /*******************************************************************
2304 * @brief Builds BSR Config
2308 * Function : BuildBsrConfig
2310 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2312 * @params[in] BSR_Config *bsrConfig
2314 * @return ROK - success
2317 * ****************************************************************/
2318 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2320 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2321 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2322 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2327 /*******************************************************************
2329 * @brief Builds scheduling request config
2333 * Function : BuildSchedulingReqConfig
2335 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2337 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2339 * @return ROK - success
2342 * ****************************************************************/
2343 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2345 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2346 uint8_t idx, elementCnt;
2348 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2349 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2350 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2351 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2353 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2357 elementCnt = 1; //ODU_VALUE_ONE;
2358 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2359 schReqList->list.count = elementCnt;
2360 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2362 schReqList->list.array = NULLP;
2363 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2364 if(!schReqList->list.array)
2366 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2370 for(idx=0;idx<schReqList->list.count; idx++)
2372 schReqList->list.array[idx] = NULLP;
2373 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2374 if(!schReqList->list.array[idx])
2376 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2382 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2384 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2385 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2386 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2388 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2391 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2392 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2393 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2398 /*******************************************************************
2400 * @brief Builds RLC Config
2404 * Function : BuildRlcConfig
2406 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
2408 * @params[in] RLC_Config *rlcConfig
2410 * @return ROK - success
2413 * ****************************************************************/
2414 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2417 rlcConfig->present = RLC_Config_PR_am;
2419 rlcConfig->choice.am = NULLP;
2420 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2421 if(!rlcConfig->choice.am)
2423 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2428 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2429 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2430 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2432 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2435 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2436 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2437 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2438 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2439 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
2442 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2443 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2444 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2446 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2449 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2450 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
2451 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
2456 /*******************************************************************
2458 * @brief Builds MAC LC Config
2462 * Function : BuildMacLCConfig
2464 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
2466 * @params[in] struct LogicalChannelConfig macLcConfig
2468 * @return ROK - success
2471 * ****************************************************************/
2472 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2475 macLcConfig->ul_SpecificParameters = NULLP;
2476 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2477 if(!macLcConfig->ul_SpecificParameters)
2479 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2483 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2484 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
2485 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
2486 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2487 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2488 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2489 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2491 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2492 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2493 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2495 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2498 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2500 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2501 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2502 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2504 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2507 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2509 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2510 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2511 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2516 /*******************************************************************
2518 * @brief Builds RLC Bearer to Add/Mod list
2522 * Function :BuildRlcBearerToAddModList
2524 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2526 * @params[in] rlc_BearerToAddModList
2528 * @return ROK - success
2531 * ****************************************************************/
2532 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2534 uint8_t idx, elementCnt;
2537 rlcBearerList->list.count = elementCnt;
2538 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
2540 rlcBearerList->list.array = NULLP;
2541 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2542 if(!rlcBearerList->list.array)
2544 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2548 for(idx=0; idx<rlcBearerList->list.count; idx++)
2550 rlcBearerList->list.array[idx] = NULLP;
2551 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2552 if(!rlcBearerList->list.array[idx])
2554 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2560 rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
2562 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \
2563 sizeof(struct RLC_BearerConfig__servedRadioBearer));
2564 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2566 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2570 rlcBearerList->list.array[idx]->servedRadioBearer->present = \
2571 RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2572 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \
2575 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2576 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2577 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2578 if(!rlcBearerList->list.array[idx]->rlc_Config)
2580 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2584 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2586 DU_LOG("\nF1AP : BuildRlcConfig failed");
2590 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2591 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \
2592 sizeof(struct LogicalChannelConfig));
2593 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2595 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2599 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2601 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2608 /*******************************************************************
2610 * @brief Build Control resource set to add/modify list
2614 * Function : BuildControlRSetToAddModList
2616 * Functionality: Build Control resource set to add/modify list
2619 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2621 * @return ROK - success
2624 * ****************************************************************/
2625 uint8_t BuildControlRSetToAddModList
2627 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2632 uint8_t numBytes, bitsUnused;
2633 struct ControlResourceSet *controlRSet;
2634 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2635 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2639 controlRSetList->list.count = elementCnt;
2640 controlRSetList->list.size = \
2641 elementCnt * sizeof(struct ControlResourceSet *);
2643 controlRSetList->list.array = NULLP;
2644 DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2645 if(!controlRSetList->list.array)
2647 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2651 for(idx = 0; idx < elementCnt; idx++)
2653 controlRSetList->list.array[idx] = NULLP;
2654 DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2655 if(!controlRSetList->list.array[idx])
2657 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2663 controlRSet = controlRSetList->list.array[idx];
2665 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2669 * Bit string stored ff0000000000
2673 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2675 controlRSet->frequencyDomainResources.buf = NULLP;
2676 DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2677 controlRSet->frequencyDomainResources.size);
2678 if(!controlRSet->frequencyDomainResources.buf)
2680 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2684 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2685 coreset0EndPrb = CORESET0_END_PRB;
2686 coreset1StartPrb = coreset0EndPrb + 6;
2687 coreset1NumPrb = CORESET1_NUM_PRB;
2688 /* calculate the PRBs */
2689 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2690 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2691 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2693 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2694 controlRSet->cce_REG_MappingType.present = \
2695 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2697 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2698 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2699 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2700 controlRSet->tci_PresentInDCI = NULLP;
2702 uint8_t tciStateIdx;
2704 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2705 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2706 if(!controlRset->tci_StatesPDCCH_ToAddList)
2708 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2713 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2714 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2715 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2716 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2717 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2719 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2723 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2725 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2726 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2728 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2735 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2737 DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2738 if(!controlRset->tci_PresentInDCI)
2740 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2744 *(controlRset->tci_PresentInDCI);
2747 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2748 DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2749 if(!controlRSet->pdcch_DMRS_ScramblingID)
2751 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2754 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2757 } /* End BuildControlRSetToAddModList */
2759 /*******************************************************************
2761 * @brief Build search space to add/modify list
2765 * Function : BuildSearchSpcToAddModList
2767 * Functionality: Build search space to add/modify list
2770 * @return ROK - success
2773 * ****************************************************************/
2774 uint8_t BuildSearchSpcToAddModList
2776 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2784 struct SearchSpace *searchSpc;
2787 searchSpcList->list.count = elementCnt;
2788 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2790 searchSpcList->list.array = NULLP;
2791 DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2792 if(!searchSpcList->list.array)
2794 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2798 for(idx = 0; idx < elementCnt; idx++)
2800 searchSpcList->list.array[idx] = NULLP;
2801 DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2802 if(!searchSpcList->list.array[idx])
2804 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2810 searchSpc = searchSpcList->list.array[idx];
2812 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2814 searchSpc->controlResourceSetId = NULLP;
2815 DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2816 if(!searchSpc->controlResourceSetId)
2818 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2821 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2823 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2824 DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2825 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2826 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2828 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2831 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2832 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2834 searchSpc->duration = NULLP;
2835 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2836 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2837 if(!searchSpc->monitoringSymbolsWithinSlot)
2839 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2843 /* Values taken from reference logs :
2846 * Bit string stores 8000
2851 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2852 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2853 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2854 searchSpc->monitoringSymbolsWithinSlot->size);
2855 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2857 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2862 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2863 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2864 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2865 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2867 searchSpc->nrofCandidates = NULLP;
2868 DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2869 if(!searchSpc->nrofCandidates)
2871 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2875 searchSpc->nrofCandidates->aggregationLevel1 = \
2876 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2877 searchSpc->nrofCandidates->aggregationLevel2 = \
2878 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2879 searchSpc->nrofCandidates->aggregationLevel4 = \
2880 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2881 searchSpc->nrofCandidates->aggregationLevel8 = \
2882 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2883 searchSpc->nrofCandidates->aggregationLevel16 = \
2884 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2886 searchSpc->searchSpaceType = NULLP;
2887 DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2888 if(!searchSpc->searchSpaceType)
2890 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2894 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2896 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
2897 DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
2898 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
2899 if(!searchSpc->searchSpaceType->choice.ue_Specific)
2901 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2904 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
2905 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
2908 }/* End BuildSearchSpcToAddModList */
2910 /*******************************************************************
2912 * @brief Builds BWP DL dedicated PDCCH config
2916 * Function : BuildBWPDlDedPdcchCfg
2918 * Functionality: Builds BWP DL dedicated PDCCH config
2920 * @params[in] struct PDCCH_Config *pdcchCfg
2922 * @return ROK - success
2925 * ****************************************************************/
2926 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
2928 pdcchCfg->controlResourceSetToAddModList = NULLP;
2929 DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
2930 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
2931 if(!pdcchCfg->controlResourceSetToAddModList)
2933 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2937 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
2942 pdcchCfg->controlResourceSetToReleaseList = NULLP;
2944 pdcchCfg->searchSpacesToAddModList = NULLP;
2945 DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
2946 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
2947 if(!pdcchCfg->searchSpacesToAddModList)
2949 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2953 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
2958 pdcchCfg->searchSpacesToReleaseList = NULLP;
2959 pdcchCfg->downlinkPreemption = NULLP;
2960 pdcchCfg->tpc_PUSCH = NULLP;
2961 pdcchCfg->tpc_PUCCH = NULLP;
2962 pdcchCfg->tpc_SRS = NULLP;
2967 /*******************************************************************
2969 * @brief Builds DMRS DL PDSCH Mapping type A
2973 * Function : BuildDMRSDLPdschMapTypeA
2975 * Functionality: Builds DMRS DL PDSCH Mapping type A
2978 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2979 * @return ROK - success
2982 * ****************************************************************/
2983 uint8_t BuildDMRSDLPdschMapTypeA
2985 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2988 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
2989 dmrsDlCfg->choice.setup = NULLP;
2990 DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
2991 if(!dmrsDlCfg->choice.setup)
2993 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
2997 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
2998 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
2999 DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3000 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3002 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3005 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3007 dmrsDlCfg->choice.setup->maxLength = NULLP;
3008 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3009 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3010 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3015 /*******************************************************************
3017 * @brief Builds TCI states to add/modify list
3021 * Function : BuildTCIStatesToAddModList
3023 * Functionality:Builds TCI states to add/modify list
3026 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3028 * @return ROK - success
3031 * ****************************************************************/
3032 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3037 /*******************************************************************
3039 * @brief Builds PDSCH time domain allocation list
3043 * Function : BuildPdschTimeDomAllocList
3045 * Functionality: Builds PDSCH time domain allocation list
3048 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3050 * @return ROK - success
3053 * ****************************************************************/
3054 uint8_t BuildPdschTimeDomAllocList
3056 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3061 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3063 timeDomAllocList->present = \
3064 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3066 timeDomAllocList->choice.setup = NULLP;
3067 DU_ALLOC(timeDomAllocList->choice.setup, \
3068 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3069 if(!timeDomAllocList->choice.setup)
3071 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3076 timeDomAllocList->choice.setup->list.count = elementCnt;
3077 timeDomAllocList->choice.setup->list.size = \
3078 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3080 timeDomAllocList->choice.setup->list.array = NULLP;
3081 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3082 timeDomAllocList->choice.setup->list.size);
3083 if(!timeDomAllocList->choice.setup->list.array)
3085 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3089 for(idx = 0; idx < elementCnt; idx++)
3091 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3092 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3093 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3094 if(!timeDomAllocList->choice.setup->list.array[idx])
3096 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3102 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3104 timeDomAlloc->k0 = NULLP;
3105 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3106 timeDomAlloc->startSymbolAndLength = \
3107 calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
3112 /*******************************************************************
3114 * @brief Builds PDSCH PRB Bundling type
3118 * Function : BuildPdschPrbBundlingType
3120 * Functionality: Builds PDSCH PRB Bundling type
3123 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3125 * @return ROK - success
3128 * ****************************************************************/
3129 uint8_t BuildPdschPrbBundlingType
3131 struct PDSCH_Config__prb_BundlingType *prbBndlType
3134 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3136 prbBndlType->choice.staticBundling = NULLP;
3137 DU_ALLOC(prbBndlType->choice.staticBundling, \
3138 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3139 if(!prbBndlType->choice.staticBundling)
3141 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3144 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3149 /*******************************************************************
3151 * @brief Builds BWP DL dedicated PDSCH config
3155 * Function : BuildBWPDlDedPdschCfg
3157 * Functionality: Builds BWP DL dedicated PDSCH config
3159 * @params[in] struct PDSCH_Config *pdschCfg
3161 * @return ROK - success
3164 * ****************************************************************/
3165 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3167 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3169 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3170 DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3171 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3172 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3174 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3178 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3183 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3184 pdschCfg->tci_StatesToAddModList = NULLP;
3185 pdschCfg->tci_StatesToReleaseList = NULLP;
3186 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3188 DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3189 if(!pdschCfg->tci_StatesToAddModList)
3191 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3194 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3200 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3202 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3203 DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3204 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3205 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3207 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3211 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3216 pdschCfg->pdsch_AggregationFactor = NULLP;
3217 pdschCfg->rateMatchPatternToAddModList = NULLP;
3218 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3219 pdschCfg->rateMatchPatternGroup1 = NULLP;
3220 pdschCfg->rateMatchPatternGroup2 = NULLP;
3221 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3222 pdschCfg->mcs_Table = NULLP;
3224 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3225 DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3226 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3228 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3231 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3233 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3238 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3239 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3240 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3241 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3242 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3243 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3244 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3249 /*******************************************************************
3251 * @brief Builds intitial DL BWP
3254 * Function : BuildInitialDlBWP
3256 * Functionality: Builds intitial DL BWP in spCellCfgDed
3258 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3260 * @return ROK - success
3263 * ****************************************************************/
3264 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3266 dlBwp->pdcch_Config = NULLP;
3267 DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3268 if(!dlBwp->pdcch_Config)
3270 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3273 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3275 dlBwp->pdcch_Config->choice.setup = NULLP;
3276 DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3277 if(!dlBwp->pdcch_Config->choice.setup)
3279 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3282 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3287 dlBwp->pdsch_Config = NULLP;
3288 DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3289 if(!dlBwp->pdsch_Config)
3291 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3294 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3296 dlBwp->pdsch_Config->choice.setup = NULLP;
3297 DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3298 if(!dlBwp->pdsch_Config->choice.setup)
3300 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3304 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3309 dlBwp->sps_Config = NULLP;
3310 dlBwp->radioLinkMonitoringConfig = NULLP;
3314 /*******************************************************************
3316 * @brief Builds DMRS UL Pusch Mapping type A
3320 * Function : BuildDMRSULPuschMapTypeA
3322 * Functionality: Builds DMRS UL Pusch Mapping type A
3325 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3326 * @return ROK - success
3329 * ****************************************************************/
3330 uint8_t BuildDMRSULPuschMapTypeA
3332 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3335 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3336 dmrsUlCfg->choice.setup= NULLP;
3337 DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3338 if(!dmrsUlCfg->choice.setup)
3340 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3344 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3345 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3346 DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3347 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3349 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3352 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3354 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3355 dmrsUlCfg->choice.setup->maxLength = NULLP;
3356 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3357 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3358 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3359 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3361 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3365 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3366 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3368 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3370 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3373 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3375 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3376 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3380 /*******************************************************************
3382 * @brief Build PUSCH time domain allocation list
3386 * Function : BuildPuschTimeDomAllocList
3388 * Functionality: Build PUSCH time domain allocation list
3391 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3393 * @return ROK - success
3396 * ****************************************************************/
3397 uint8_t BuildPuschTimeDomAllocList
3399 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3404 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3406 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3407 timeDomAllocList->choice.setup = NULLP;
3408 DU_ALLOC(timeDomAllocList->choice.setup, \
3409 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3410 if(!timeDomAllocList->choice.setup)
3412 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3417 timeDomAllocList->choice.setup->list.count = elementCnt;
3418 timeDomAllocList->choice.setup->list.size = \
3419 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3420 timeDomAllocList->choice.setup->list.array = NULLP;
3421 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3422 timeDomAllocList->choice.setup->list.size);
3423 if(!timeDomAllocList->choice.setup->list.array)
3425 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3429 for(idx = 0; idx < elementCnt; idx++)
3431 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3432 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3433 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3434 if(!timeDomAllocList->choice.setup->list.array[idx])
3436 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3442 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3443 DU_ALLOC(timeDomAlloc->k2, sizeof(long));
3444 if(!timeDomAlloc->k2)
3446 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3449 *(timeDomAlloc->k2) = PUSCH_K2;
3450 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3451 timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
3455 /*******************************************************************
3457 * @brief Builds BWP UL dedicated PUSCH Config
3461 * Function : BuildBWPUlDedPuschCfg
3464 * Builds BWP UL dedicated PUSCH Config
3466 * @params[in] : PUSCH_Config_t *puschCfg
3468 * @return ROK - success
3471 * ****************************************************************/
3472 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3474 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3475 DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3476 if(!puschCfg->dataScramblingIdentityPUSCH)
3478 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3481 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3483 puschCfg->txConfig = NULLP;
3484 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3485 DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3486 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3487 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3489 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3493 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3498 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3499 puschCfg->pusch_PowerControl = NULLP;
3500 puschCfg->frequencyHopping = NULLP;
3501 puschCfg->frequencyHoppingOffsetLists = NULLP;
3502 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3504 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3505 DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3506 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3507 if(!puschCfg->pusch_TimeDomainAllocationList)
3509 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3513 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3518 puschCfg->pusch_AggregationFactor = NULLP;
3519 puschCfg->mcs_Table = NULLP;
3520 puschCfg->mcs_TableTransformPrecoder = NULLP;
3521 puschCfg->transformPrecoder = NULLP;
3522 DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3523 if(!puschCfg->transformPrecoder)
3525 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3528 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3530 puschCfg->codebookSubset = NULLP;
3531 puschCfg->maxRank = NULLP;
3532 puschCfg->rbg_Size = NULLP;
3533 puschCfg->uci_OnPUSCH = NULLP;
3534 puschCfg->tp_pi2BPSK = NULLP;
3539 /*******************************************************************
3541 * @brief Fills SRS resource to add/modify list
3545 * Function : BuildSrsRsrcAddModList
3547 * Functionality: Fills SRS resource to add/modify list
3550 * @return ROK - success
3553 * ****************************************************************/
3554 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3560 resourceList->list.count = elementCnt;
3561 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3562 resourceList->list.array = NULLP;
3563 DU_ALLOC(resourceList->list.array, resourceList->list.size);
3564 if(!resourceList->list.array)
3566 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3570 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3572 DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3573 if(!resourceList->list.array[rsrcIdx])
3575 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3581 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3582 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3583 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3585 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3586 DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3587 sizeof(struct SRS_Resource__transmissionComb__n2));
3588 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3590 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3593 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3594 = SRS_COMB_OFFSET_N2;
3595 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3596 = SRS_CYCLIC_SHIFT_N2;
3598 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3600 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3601 SRS_Resource__resourceMapping__nrofSymbols_n1;
3602 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3603 SRS_Resource__resourceMapping__repetitionFactor_n1;
3605 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3606 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3607 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3608 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3609 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3610 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3611 SRS_Resource__groupOrSequenceHopping_neither;
3613 /* Setting resource type to aperiodic for intergration purposes */
3614 resourceList->list.array[rsrcIdx]->resourceType.present = \
3615 SRS_Resource__resourceType_PR_aperiodic;
3616 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3617 DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3618 sizeof(struct SRS_Resource__resourceType__aperiodic));
3619 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3621 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3624 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3629 /*******************************************************************
3631 * @brief Build SRS resource set Add/mod list
3635 * Function : BuildSrsRsrcSetAddModList
3637 * Functionality: Build SRS resource set Add/mod list
3640 * @return ROK - success
3643 * ****************************************************************/
3644 uint8_t BuildSrsRsrcSetAddModList
3646 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3652 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3655 rsrcSetList->list.count = elementCnt;
3656 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3657 rsrcSetList->list.array = NULLP;
3658 DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3659 if(!rsrcSetList->list.array)
3661 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3665 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3667 DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3668 if(!rsrcSetList->list.array[rSetIdx])
3670 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3676 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3678 /* Fill Resource Id list in resource set */
3679 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3680 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3681 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3682 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3684 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3689 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3690 rsrcIdList->list.count = elementCnt;
3691 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3692 rsrcIdList->list.array = NULLP;
3693 DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3694 if(!rsrcIdList->list.array)
3696 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3700 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3702 DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3703 if(!rsrcIdList->list.array[rsrcIdx])
3705 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3711 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3713 /* Fill resource type */
3714 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3715 SRS_ResourceSet__resourceType_PR_aperiodic;
3717 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3718 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3719 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3720 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3722 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3725 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3726 = APERIODIC_SRS_RESRC_TRIGGER;
3728 /* TODO : Fill values for below IEs as expected by Viavi */
3729 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3730 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3733 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3734 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3735 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3736 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3737 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3742 /*******************************************************************
3744 * @brief Builds BWP UL dedicated SRS Config
3748 * Function : BuildBWPUlDedSrsCfg
3750 * Functionality: Builds BWP UL dedicated SRS Config
3752 * @params[in] SRS Config
3753 * @return ROK - success
3756 * ****************************************************************/
3757 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3759 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3760 srsCfg->srs_ResourceSetToAddModList = NULLP;
3761 DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3762 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3763 if(!srsCfg->srs_ResourceSetToAddModList)
3765 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3768 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3773 srsCfg->srs_ResourceToReleaseList = NULLP;
3775 /* Resource to Add/Modify list */
3776 srsCfg->srs_ResourceToAddModList = NULLP;
3777 DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3778 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3779 if(!srsCfg->srs_ResourceToAddModList)
3781 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3785 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3790 srsCfg->tpc_Accumulation = NULLP;
3797 /*******************************************************************
3799 * @brief Builds Pusch Serving cell Config
3803 * Function : BuildPuschSrvCellCfg
3805 * Functionality: Builds Pusch Serving cell Config
3807 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3809 * @return ROK - success
3812 * ****************************************************************/
3813 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3815 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3816 puschCfg->choice.setup = NULLP;
3817 DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3818 if(!puschCfg->choice.setup)
3820 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3824 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3825 puschCfg->choice.setup->rateMatching = NULLP;
3826 puschCfg->choice.setup->xOverhead = NULLP;
3827 puschCfg->choice.setup->ext1 = NULLP;
3828 DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3829 if(!puschCfg->choice.setup->ext1)
3831 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3835 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
3836 DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
3837 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
3839 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3842 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
3844 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
3845 DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
3846 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
3848 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3851 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
3855 /*******************************************************************
3857 * @brief Builds inital UL BWP
3861 * Function : BuildInitialUlBWP
3863 * Functionality: Builds initial UL BWP
3865 * @params[in] BWP_UplinkDedicated_t *ulBwp
3866 * @return ROK - success
3869 * ****************************************************************/
3870 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3872 ulBwp->pucch_Config = NULLP;
3874 /* Fill BWP UL dedicated PUSCH config */
3875 ulBwp->pusch_Config = NULLP;
3876 DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3877 if(!ulBwp->pusch_Config)
3879 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3883 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3884 ulBwp->pusch_Config->choice.setup = NULLP;
3885 DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3886 if(!ulBwp->pusch_Config->choice.setup)
3888 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3892 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3897 ulBwp->configuredGrantConfig = NULLP;
3899 /* Fill BPW UL dedicated SRS config */
3900 ulBwp->srs_Config = NULLP;
3901 DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3902 if(!ulBwp->srs_Config)
3904 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3908 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3909 ulBwp->srs_Config->choice.setup = NULLP;
3910 DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3911 if(!ulBwp->srs_Config->choice.setup)
3913 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3917 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3922 ulBwp->beamFailureRecoveryConfig = NULLP;
3927 /*******************************************************************
3929 * @brief Builds UL config
3932 * Function : BuildUlCfg
3934 * Functionality: Builds UL config in spCellCfgDed
3936 * @params[in] UplinkConfig_t *ulCfg
3938 * @return ROK - success
3941 * ****************************************************************/
3942 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
3944 ulCfg->initialUplinkBWP = NULLP;
3945 DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
3946 if(!ulCfg->initialUplinkBWP)
3948 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3952 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
3957 ulCfg->uplinkBWP_ToReleaseList = NULLP;
3958 ulCfg->uplinkBWP_ToAddModList = NULLP;
3959 ulCfg->firstActiveUplinkBWP_Id = NULLP;
3960 DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
3961 if(!ulCfg->firstActiveUplinkBWP_Id)
3963 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3966 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
3968 ulCfg->pusch_ServingCellConfig = NULLP;
3969 DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
3970 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
3971 if(!ulCfg->pusch_ServingCellConfig)
3973 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3977 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
3982 ulCfg->carrierSwitching = NULLP;
3983 ulCfg->ext1 = NULLP;
3987 /*******************************************************************
3989 * @brief Builds PDSCH serving cell config
3992 * Function : BuildPdschSrvCellCfg
3994 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
3996 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
3998 * @return ROK - success
4001 * ****************************************************************/
4002 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4004 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4005 pdschCfg->choice.setup = NULLP;
4006 DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4007 if(!pdschCfg->choice.setup)
4009 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4013 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4014 pdschCfg->choice.setup->xOverhead = NULLP;
4015 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4016 DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4017 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4019 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4022 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4023 pdschCfg->choice.setup->pucch_Cell = NULLP;
4024 pdschCfg->choice.setup->ext1 = NULLP;
4029 /*******************************************************************
4031 * @brief Builds CSI Meas config
4034 * Function : BuildCsiMeasCfg
4036 * Functionality: Builds CSI Meas config in spCellCfgDed
4038 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4040 * @return ROK - success
4043 * ****************************************************************/
4044 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4050 /*******************************************************************
4052 * @brief Builds Spcell config dedicated
4055 * Function : BuildSpCellCfgDed
4057 * Functionality: Builds sp cell config dedicated in spCellCfg
4059 * @params[in] ServingCellConfig_t srvCellCfg
4061 * @return ROK - success
4064 * ****************************************************************/
4065 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4067 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4068 DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
4069 if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
4071 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4075 srvCellCfg->initialDownlinkBWP = NULLP;
4076 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4077 if(!srvCellCfg->initialDownlinkBWP)
4079 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4083 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4085 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
4088 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4089 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4091 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4092 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4093 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4095 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4098 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4100 srvCellCfg->bwp_InactivityTimer = NULLP;
4102 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4103 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4104 if(!srvCellCfg->defaultDownlinkBWP_Id)
4106 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4109 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4111 srvCellCfg->uplinkConfig = NULLP;
4112 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4113 if(!srvCellCfg->uplinkConfig)
4115 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4119 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4121 DU_LOG("\nF1AP : BuildUlCfg failed");
4124 srvCellCfg->supplementaryUplink = NULLP;
4125 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4127 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4128 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4129 if(!srvCellCfg->pdsch_ServingCellConfig)
4131 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4135 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4137 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4141 srvCellCfg->csi_MeasConfig = NULLP;
4143 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4144 if(!srvCellCfg->csi_MeasConfig)
4146 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4150 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4152 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4156 srvCellCfg->sCellDeactivationTimer = NULLP;
4157 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4158 srvCellCfg->tag_Id = TAG_ID;
4159 srvCellCfg->dummy = NULLP;
4160 srvCellCfg->pathlossReferenceLinking = NULLP;
4161 srvCellCfg->servingCellMO = NULLP;
4162 srvCellCfg->ext1 = NULLP;
4166 /*******************************************************************
4168 * @brief Builds Spcell config
4172 * Function : BuildSpCellCfg
4174 * Functionality: Builds sp cell config in DuToCuRrcContainer
4176 * @params[in] SpCellConfig_t spCellCfg
4178 * @return ROK - success
4181 * ****************************************************************/
4182 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4185 spCellCfg->servCellIndex = NULLP;
4186 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4187 if(!spCellCfg->servCellIndex)
4189 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4192 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4194 spCellCfg->reconfigurationWithSync = NULLP;
4195 spCellCfg->rlf_TimersAndConstants = NULLP;
4196 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4197 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4198 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4200 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4203 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4205 spCellCfg->spCellConfigDedicated = NULLP;
4206 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4207 if(!spCellCfg->spCellConfigDedicated)
4209 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4212 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4214 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4219 /*******************************************************************
4221 * @brief Builds Phy cell group config
4225 * Function : BuildPhyCellGrpCfg
4227 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4229 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4231 * @return ROK - success
4234 * ****************************************************************/
4235 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4237 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4238 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4240 phyCellGrpCfg->p_NR_FR1 = NULLP;
4241 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4242 if(!phyCellGrpCfg->p_NR_FR1)
4244 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4247 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4248 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4249 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4250 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4251 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4252 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4253 phyCellGrpCfg->cs_RNTI = NULLP;
4254 phyCellGrpCfg->ext1 = NULLP;
4255 phyCellGrpCfg->ext2 = NULLP;
4259 /*******************************************************************
4261 * @brief Builds Mac cell group config
4265 * Function : BuildMacCellGrpCfg
4267 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4269 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4271 * @return ROK - success
4274 * ****************************************************************/
4275 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4277 macCellGrpCfg->drx_Config = NULLP;
4278 macCellGrpCfg->schedulingRequestConfig = NULLP;
4279 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4280 if(!macCellGrpCfg->schedulingRequestConfig)
4282 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4286 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4288 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4292 macCellGrpCfg->bsr_Config = NULLP;
4293 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4294 if(!macCellGrpCfg->bsr_Config)
4296 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4300 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4302 DU_LOG("\nF1AP : BuildBsrConfig failed");
4306 macCellGrpCfg->tag_Config = NULLP;
4307 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4308 if(!macCellGrpCfg->tag_Config)
4310 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4314 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4316 DU_LOG("\nF1AP : BuildTagConfig failed");
4320 macCellGrpCfg->phr_Config = NULLP;
4321 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4322 if(!macCellGrpCfg->phr_Config)
4324 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4328 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4330 DU_LOG("\nF1AP : BuildPhrConfig failed");
4334 macCellGrpCfg->skipUplinkTxDynamic = false;
4335 macCellGrpCfg->ext1 = NULLP;
4339 /*******************************************************************
4341 * @brief Frees memeory allocated for SearchSpcToAddModList
4345 * Function : FreeSearchSpcToAddModList
4347 * Functionality: Deallocating memory of SearchSpcToAddModList
4349 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4353 4221 * ****************************************************************/
4354 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4358 struct SearchSpace *searchSpc=NULLP;
4360 if(searchSpcList->list.array)
4362 if(searchSpcList->list.array[idx2])
4364 searchSpc = searchSpcList->list.array[idx2];
4365 if(searchSpc->controlResourceSetId)
4367 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4369 if(searchSpc->monitoringSymbolsWithinSlot)
4371 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4373 if(searchSpc->nrofCandidates)
4375 if(searchSpc->searchSpaceType)
4377 DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4378 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4379 DU_FREE(searchSpc->searchSpaceType, sizeof(struct
4380 SearchSpace__searchSpaceType));
4382 DU_FREE(searchSpc->nrofCandidates,
4383 sizeof(struct SearchSpace__nrofCandidates));
4385 DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4386 searchSpc->monitoringSymbolsWithinSlot->size);
4388 DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4389 sizeof(BIT_STRING_t));
4391 DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4392 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4394 DU_FREE(searchSpc->controlResourceSetId,
4395 sizeof(ControlResourceSetId_t));
4398 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4400 DU_FREE(searchSpcList->list.array[idx1],
4401 sizeof(struct SearchSpace));
4403 DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4406 /*******************************************************************
4408 * @brief Frees memory allocated for PdschTimeDomAllocList
4412 * Function : FreePdschTimeDomAllocList
4414 * Functionality: Deallocating memory of PdschTimeDomAllocList
4416 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4420 4221 * ****************************************************************/
4421 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4425 if(timeDomAllocList->choice.setup)
4427 if(timeDomAllocList->choice.setup->list.array)
4429 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4431 DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4432 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4434 DU_FREE(timeDomAllocList->choice.setup->list.array, \
4435 timeDomAllocList->choice.setup->list.size);
4437 DU_FREE(timeDomAllocList->choice.setup,\
4438 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4441 /*******************************************************************
4443 * @brief Frees memory allocated for PuschTimeDomAllocList
4447 * Function : FreePuschTimeDomAllocList
4449 * Functionality: Deallocating memory of PuschTimeDomAllocList
4451 * @params[in] PUSCH_Config_t *puschCfg
4455 4221 * ****************************************************************/
4456 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4460 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4462 if(puschCfg->pusch_TimeDomainAllocationList)
4464 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4465 if(timeDomAllocList_t->choice.setup)
4467 if(timeDomAllocList_t->choice.setup->list.array)
4469 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4470 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4472 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4473 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4475 DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4476 timeDomAllocList_t->choice.setup->list.size);
4478 DU_FREE(timeDomAllocList_t->choice.setup, \
4479 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4481 DU_FREE(puschCfg->transformPrecoder, sizeof(long));
4482 DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4483 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4487 /*******************************************************************
4489 * @brief Frees memory allocated for InitialUlBWP
4493 * Function : FreeInitialUlBWP
4495 * Functionality: Deallocating memory of InitialUlBWP
4497 * @params[in] BWP_UplinkDedicated_t *ulBwp
4501 * ****************************************************************/
4502 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4504 uint8_t rSetIdx, rsrcIdx;
4505 SRS_Config_t *srsCfg = NULLP;
4506 PUSCH_Config_t *puschCfg = NULLP;
4507 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4508 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4509 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4510 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4512 if(ulBwp->pusch_Config)
4514 if(ulBwp->pusch_Config->choice.setup)
4516 puschCfg=ulBwp->pusch_Config->choice.setup;
4517 if(puschCfg->dataScramblingIdentityPUSCH)
4519 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4521 FreePuschTimeDomAllocList(puschCfg);
4522 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4523 if(dmrsUlCfg->choice.setup)
4525 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4527 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4529 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4531 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4532 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4534 DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4537 DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4539 DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4540 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4542 DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4544 DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4546 DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4548 /* Free SRS-Config */
4549 if(ulBwp->srs_Config)
4551 if(ulBwp->srs_Config->choice.setup)
4553 srsCfg = ulBwp->srs_Config->choice.setup;
4555 /* Free Resource Set to add/mod list */
4556 if(srsCfg->srs_ResourceSetToAddModList)
4558 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4559 if(rsrcSetList->list.array)
4563 /* Free SRS resource Id list in this SRS resource set */
4564 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4566 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4568 if(rsrcIdList->list.array)
4570 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4572 DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4574 DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4576 DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4577 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4580 /* Free resource type info for this SRS resource set */
4581 DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4582 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4584 /* Free memory for each resource set */
4585 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4587 DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4589 DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4591 DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4592 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4595 /* Free resource to add/modd list */
4596 if(srsCfg->srs_ResourceToAddModList)
4598 resourceList = srsCfg->srs_ResourceToAddModList;
4599 if(resourceList->list.array)
4602 DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4603 sizeof(struct SRS_Resource__transmissionComb__n2));
4604 DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4605 sizeof(struct SRS_Resource__resourceType__aperiodic));
4607 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4609 DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4611 DU_FREE(resourceList->list.array, resourceList->list.size);
4613 DU_FREE(srsCfg->srs_ResourceToAddModList, \
4614 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4617 DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4619 DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4623 /*******************************************************************
4625 * @brief Frees memory allocated for initialUplinkBWP
4629 * Function : FreeinitialUplinkBWP
4631 * Functionality: Deallocating memory of initialUplinkBWP
4633 * @params[in] UplinkConfig_t *ulCfg
4638 * ****************************************************************/
4639 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4641 BWP_UplinkDedicated_t *ulBwp=NULLP;
4642 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4644 if(ulCfg->initialUplinkBWP)
4646 ulBwp=ulCfg->initialUplinkBWP;
4647 if(ulCfg->firstActiveUplinkBWP_Id)
4649 if(ulCfg->pusch_ServingCellConfig)
4651 puschCfg=ulCfg->pusch_ServingCellConfig;
4652 if(puschCfg->choice.setup)
4654 if(puschCfg->choice.setup->ext1)
4656 DU_FREE(puschCfg->choice.setup->ext1->\
4657 processingType2Enabled,sizeof(BOOLEAN_t));
4658 DU_FREE(puschCfg->choice.setup->ext1->\
4659 maxMIMO_Layers,sizeof(long));
4660 DU_FREE(puschCfg->choice.setup->ext1, \
4661 sizeof(struct PUSCH_ServingCellConfig__ext1));
4663 DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4665 DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4667 DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4669 FreeInitialUlBWP(ulBwp);
4670 DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4673 /*******************************************************************
4675 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4679 * Function : FreeBWPDlDedPdschCfg
4681 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4683 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4688 * ****************************************************************/
4689 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4691 struct PDSCH_Config *pdschCfg=NULLP;
4692 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4693 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4694 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4696 if(dlBwp->pdsch_Config->choice.setup)
4698 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4699 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4701 if(pdschCfg->pdsch_TimeDomainAllocationList)
4703 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4704 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4706 prbBndlType=&pdschCfg->prb_BundlingType;
4707 DU_FREE(prbBndlType->choice.staticBundling,\
4708 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4709 DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4711 FreePdschTimeDomAllocList(timeDomAllocList);
4712 DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
4713 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4715 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
4716 if(dmrsDlCfg->choice.setup)
4718 DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
4720 DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
4722 DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4723 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4725 DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4728 /*******************************************************************
4730 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
4734 * Function : FreeBWPDlDedPdcchCfg
4736 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
4738 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4743 * ****************************************************************/
4744 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
4748 struct PDCCH_Config *pdcchCfg=NULLP;
4749 struct ControlResourceSet *controlRSet=NULLP;
4750 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
4752 if(dlBwp->pdcch_Config->choice.setup)
4754 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
4755 if(pdcchCfg->controlResourceSetToAddModList)
4757 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
4758 if(controlRSetList->list.array)
4760 controlRSet = controlRSetList->list.array[idx2];
4763 if(controlRSet->frequencyDomainResources.buf)
4765 if(controlRSet->pdcch_DMRS_ScramblingID)
4767 if(pdcchCfg->searchSpacesToAddModList)
4769 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
4770 DU_FREE(pdcchCfg->searchSpacesToAddModList, \
4771 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
4773 DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
4775 DU_FREE(controlRSet->frequencyDomainResources.buf, \
4776 controlRSet->frequencyDomainResources.size);
4779 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
4781 DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
4783 DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
4785 DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
4786 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
4788 DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4792 /*******************************************************************
4794 * @brief Frees emmory allocated for DUToCURRCContainer
4798 * Function : FreeMemDuToCuRrcCont
4800 * Functionality: Deallocating memory of DuToCuRrcContainer
4802 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
4804 * @return ROK - success
4807 * ****************************************************************/
4808 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
4811 SpCellConfig_t *spCellCfg=NULLP;
4812 ServingCellConfig_t *srvCellCfg=NULLP;
4813 BWP_DownlinkDedicated_t *dlBwp=NULLP;
4814 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
4815 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
4816 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
4817 struct RLC_Config *rlcConfig=NULLP;
4818 struct LogicalChannelConfig *macLcConfig=NULLP;
4819 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
4820 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
4821 struct TAG_Config *tagConfig=NULLP;
4822 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
4823 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
4824 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
4826 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
4829 if(rlcBearerList->list.array)
4831 for(idx=0; idx<rlcBearerList->list.count; idx++)
4833 if(rlcBearerList->list.array[idx])
4835 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
4836 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
4839 if(rlcConfig->choice.am)
4841 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4842 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4843 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
4845 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
4847 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
4850 if(macLcConfig->ul_SpecificParameters)
4852 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
4853 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
4854 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
4856 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
4858 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
4861 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
4863 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4866 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
4869 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
4870 if(schedulingRequestConfig)
4872 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4875 if(schReqList->list.array)
4877 for(idx=0;idx<schReqList->list.count; idx++)
4879 if(schReqList->list.array[idx])
4881 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4882 DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4885 DU_FREE(schReqList->list.array, schReqList->list.size);
4887 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
4888 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
4889 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4891 if(macCellGrpCfg->bsr_Config)
4893 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4895 tagConfig = macCellGrpCfg->tag_Config;
4898 tagList = tagConfig->tag_ToAddModList;
4901 if(tagList->list.array)
4903 for(idx=0; idx<tagList->list.count; idx++)
4905 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
4907 DU_FREE(tagList->list.array, tagList->list.size);
4909 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4911 DU_FREE(tagConfig, sizeof(struct TAG_Config));
4914 phrConfig = macCellGrpCfg->phr_Config;
4917 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
4918 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
4921 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
4924 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
4927 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4928 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
4931 spCellCfg = cellGrpCfg->spCellConfig;
4934 if(spCellCfg->servCellIndex)
4936 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
4938 if(spCellCfg->spCellConfigDedicated)
4940 srvCellCfg = spCellCfg->spCellConfigDedicated;
4941 if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
4943 if(srvCellCfg->initialDownlinkBWP)
4945 dlBwp = srvCellCfg->initialDownlinkBWP;
4946 if(srvCellCfg->firstActiveDownlinkBWP_Id)
4948 if(srvCellCfg->defaultDownlinkBWP_Id)
4950 if(srvCellCfg->uplinkConfig)
4952 if(srvCellCfg->pdsch_ServingCellConfig)
4954 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
4955 if(pdschCfg->choice.setup)
4957 DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
4958 DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4960 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
4961 ServingCellConfig__pdsch_ServingCellConfig));
4963 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
4964 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4966 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4968 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4970 if(dlBwp->pdcch_Config)
4972 if(dlBwp->pdsch_Config)
4974 FreeBWPDlDedPdschCfg(dlBwp);
4975 DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4977 FreeBWPDlDedPdcchCfg(dlBwp);
4978 DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4980 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4982 DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
4984 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4986 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4988 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
4990 DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
4994 /*******************************************************************
4996 * @brief Builds DU To CU RRC Container
5000 * Function : BuildDuToCuRrcContainer
5002 * Functionality: Builds DuToCuRrcContainer
5004 * @params[in] idx, index in F1AP msg
5005 * DuToCuRRCContainer, DuToCuRRCContainer
5007 * @return ROK - success
5010 * ****************************************************************/
5011 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
5014 CellGroupConfigRrc_t cellGrpCfg;
5015 asn_enc_rval_t encRetVal;
5016 memset(&cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
5017 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5021 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5023 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5024 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5025 if(!cellGrpCfg.rlc_BearerToAddModList)
5027 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5031 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5033 DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
5038 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5039 cellGrpCfg.mac_CellGroupConfig = NULLP;
5040 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5041 if(!cellGrpCfg.mac_CellGroupConfig)
5043 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5047 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5049 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
5054 cellGrpCfg.physicalCellGroupConfig = NULLP;
5055 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5056 if(!cellGrpCfg.physicalCellGroupConfig)
5058 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5062 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5064 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
5069 cellGrpCfg.spCellConfig = NULLP;
5070 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5071 if(!cellGrpCfg.spCellConfig)
5073 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5077 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5079 DU_LOG("\nF1AP : BuildSpCellCfg failed");
5084 cellGrpCfg.sCellToAddModList = NULLP;
5085 cellGrpCfg.sCellToReleaseList = NULLP;
5086 cellGrpCfg.ext1 = NULLP;
5088 /* encode cellGrpCfg into duToCuRrcContainer */
5089 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5090 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5092 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5093 /* Encode results */
5094 if(encRetVal.encoded == ENCODE_FAIL)
5096 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5097 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5103 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5104 for(int i=0; i< encBufSize; i++)
5106 printf("%x",encBuf[i]);
5110 duToCuRrcContainer->size = encBufSize;
5111 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
5112 if(!duToCuRrcContainer->buf)
5114 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5120 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
5124 FreeMemDuToCuRrcCont(&cellGrpCfg);
5128 /*******************************************************************
5130 * @brief Free memory allocated in InitialULRRCMessage
5134 * Function : freeInitUlRrcMsgTransfer
5136 * Functionality: Free memory allocated in InitialULRRCMessage
5138 * @params[in]F1AP_PDU_t *f1apMsg)
5140 * @return ROK - success
5143 * ****************************************************************/
5145 uint8_t freeInitUlRrcMsgTransfer(F1AP_PDU_t *f1apMsg)
5147 uint8_t ieIdx, arrIdx;
5148 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
5152 if(f1apMsg->choice.initiatingMessage)
5154 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.\
5155 choice.InitialULRRCMessageTransfer;
5156 if(initULRRCMsg->protocolIEs.list.array)
5158 for(ieIdx = 0; ieIdx < initULRRCMsg->protocolIEs.list.count; ieIdx++)
5160 switch(initULRRCMsg->protocolIEs.list.array[ieIdx]->id)
5162 case ProtocolIE_ID_id_NRCGI:
5164 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf)
5166 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf)
5168 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf,\
5169 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.size);
5171 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf,\
5172 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.size);
5176 case ProtocolIE_ID_id_RRCContainer:
5178 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5180 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
5181 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5185 case ProtocolIE_ID_id_DUtoCURRCContainer:
5187 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf)
5189 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf,
5190 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.size);
5198 for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
5200 if(initULRRCMsg->protocolIEs.list.array[arrIdx])
5202 DU_FREE(initULRRCMsg->protocolIEs.list.array[arrIdx],\
5203 sizeof(InitialULRRCMessageTransferIEs_t));
5206 DU_FREE(initULRRCMsg->protocolIEs.list.array, initULRRCMsg->protocolIEs.list.size);
5208 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5210 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
5214 DU_LOG("\nDU_APP : Recevied F1ap Pdu is null at freeInitUlRrcMsgTransfer()");
5220 /*******************************************************************
5222 * @brief Builds and sends the InitialULRRCMessage
5226 * Function : BuildAndSendInitialRrcMsgTransfer
5228 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
5229 * it to the CU through SCTP.
5233 * @return ROK - success
5236 * ****************************************************************/
5237 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
5238 uint16_t rrcContSize, uint8_t *rrcContainer)
5243 asn_enc_rval_t encRetVal;
5244 F1AP_PDU_t *f1apMsg = NULLP;
5245 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
5246 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5250 DU_LOG("\n F1AP : Building RRC Setup Request\n");
5251 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5252 if(f1apMsg == NULLP)
5254 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5257 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5258 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5259 if(f1apMsg->choice.initiatingMessage == NULLP)
5261 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5264 f1apMsg->choice.initiatingMessage->procedureCode =\
5265 ProcedureCode_id_InitialULRRCMessageTransfer;
5266 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
5267 f1apMsg->choice.initiatingMessage->value.present = \
5268 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
5270 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
5272 initULRRCMsg->protocolIEs.list.count = elementCnt;
5273 initULRRCMsg->protocolIEs.list.size = \
5274 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
5275 /* Initialize the F1Setup members */
5276 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5277 if(initULRRCMsg->protocolIEs.list.array == NULLP)
5279 DU_LOG(" F1AP : Memory allocation for\
5280 RRCSetupRequestMessageTransferIEs failed");
5283 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
5285 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx],\
5286 sizeof(InitialULRRCMessageTransferIEs_t));
5287 if(initULRRCMsg->protocolIEs.list.array[ieIdx] == NULLP)
5293 /*GNB DU UE F1AP ID*/
5294 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
5295 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5296 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5297 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
5298 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
5299 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
5304 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
5305 ProtocolIE_ID_id_NRCGI;
5306 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
5307 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
5308 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
5311 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
5319 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
5320 ProtocolIE_ID_id_C_RNTI;
5321 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5322 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5323 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
5324 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.C_RNTI = crnti;
5328 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
5329 ProtocolIE_ID_id_RRCContainer;
5330 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5331 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5332 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
5334 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = rrcContSize;
5335 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
5336 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size)
5337 if(!initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5339 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
5343 memcpy(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, rrcContainer,
5344 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5347 /*DUtoCURRCContainer*/
5349 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCContainer;
5350 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5351 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5352 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
5354 ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer);
5360 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5362 /* Encode the F1SetupRequest type as APER */
5363 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5365 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
5366 /* Encode results */
5367 if(encRetVal.encoded == ENCODE_FAIL)
5369 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
5370 structure (at %s)\n",encRetVal.failed_type ? \
5371 encRetVal.failed_type->name : "unknown");
5378 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
5379 Message transfer\n");
5380 for(int i=0; i< encBufSize; i++)
5382 printf("%x",encBuf[i]);
5386 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
5388 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
5394 freeInitUlRrcMsgTransfer(f1apMsg);
5396 }/* End of BuildAndSendInitialRrcMsgTransfer*/
5398 /***** UE SETUP REQUEST *****/
5400 /*******************************************************************
5402 * @brief Free Qos And Snssai Drb Info
5406 * Function : freeDrbQosAndSnssaiInfo
5408 * Functionality: Free Qos And Snssai Drb Info
5410 * @params[in] LcCfg *lcCfg,
5413 * ****************************************************************/
5414 void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
5418 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
5422 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
5426 /******************************************************************
5428 * @brief Function to delete the RLC Lc cfg from UE APP DB
5432 * Function : freeRlcLcCfg
5434 * Functionality: Function to delete the RLC Lc cfg from UE APP DB
5437 *****************************************************************/
5439 void freeRlcLcCfg(RlcBearerCfg *lcCfg)
5441 switch(lcCfg->rlcMode)
5447 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
5448 lcCfg->u.amCfg = NULLP;
5452 case RLC_UM_BI_DIRECTIONAL :
5454 if(lcCfg->u.umBiDirCfg)
5456 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
5457 lcCfg->u.umBiDirCfg = NULLP;
5461 case RLC_UM_UNI_DIRECTIONAL_UL :
5463 if(lcCfg->u.umUniDirUlCfg)
5465 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
5466 lcCfg->u.umUniDirUlCfg = NULLP;
5471 case RLC_UM_UNI_DIRECTIONAL_DL :
5473 if(lcCfg->u.umUniDirDlCfg)
5475 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
5476 lcCfg->u.umUniDirDlCfg = NULLP;
5481 DU_LOG("\nDU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode);
5484 memset(lcCfg, 0, sizeof(LcCfg));
5486 /*******************************************************************
5488 * @brief Function to free MacLcCfg
5492 * Function : freeMacLcCfg
5494 * Functionality: Function to free MacLcCfg
5496 * @params[in] LcCfg *lcCfg,
5499 * ****************************************************************/
5501 void freeMacLcCfg(LcCfg *lcCfg)
5503 /* Deleting DRBQOS */
5506 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
5507 lcCfg->drbQos = NULLP;
5509 /* Deleting SNSSAI */
5512 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
5513 lcCfg->snssai = NULLP;
5515 memset(lcCfg, 0, sizeof(LcCfg));
5518 /*******************************************************************
5520 * @brief Free UE NR Capability received in UE Context setup request
5524 * Function : freeUeNrCapability
5527 * Free UE NR Capability received in UE Context setup request
5530 * @return ROK - success
5533 * ****************************************************************/
5534 void freeUeNrCapability(void *ueNrCapability)
5537 FeatureSets_t *featureSets;
5538 UE_NR_Capability_t *ueNrCap = (UE_NR_Capability_t *)ueNrCapability;
5540 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5542 for(idx = 0; idx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; idx++)
5544 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx])
5545 free(ueNrCap->rf_Parameters.supportedBandListNR.list.array[idx]);
5547 free(ueNrCap->rf_Parameters.supportedBandListNR.list.array);
5550 if(ueNrCap->featureSets)
5552 featureSets = ueNrCap->featureSets;
5553 if(featureSets->featureSetsDownlinkPerCC)
5555 if(featureSets->featureSetsDownlinkPerCC->list.array)
5557 for(idx = 0; idx < featureSets->featureSetsDownlinkPerCC->list.count; idx++)
5559 if(featureSets->featureSetsDownlinkPerCC->list.array[idx])
5561 if(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL)
5562 free(featureSets->featureSetsDownlinkPerCC->list.array[idx]->supportedModulationOrderDL);
5563 free(featureSets->featureSetsDownlinkPerCC->list.array[idx]);
5566 free(featureSets->featureSetsDownlinkPerCC->list.array);
5568 free(featureSets->featureSetsDownlinkPerCC);
5570 if(featureSets->featureSetsUplinkPerCC)
5572 if(featureSets->featureSetsUplinkPerCC->list.array)
5574 for(idx = 0; idx < featureSets->featureSetsUplinkPerCC->list.count; idx++)
5576 if(featureSets->featureSetsUplinkPerCC->list.array[idx])
5578 if(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL)
5579 free(featureSets->featureSetsUplinkPerCC->list.array[idx]->supportedModulationOrderUL);
5580 free(featureSets->featureSetsUplinkPerCC->list.array[idx]);
5583 free(featureSets->featureSetsUplinkPerCC->list.array);
5585 free(featureSets->featureSetsUplinkPerCC);
5587 free(ueNrCap->featureSets);
5591 /*******************************************************************
5593 * @brief Function to free DuUeCfg
5597 * Function : freeDuUeCfg
5599 * Functionality: Function to free DuUeCfg
5601 * @params[in] DuUeCfg *ueCfg
5604 * ****************************************************************/
5605 void freeDuUeCfg(DuUeCfg *ueCfg)
5609 if(ueCfg->ueNrCapability)
5611 freeUeNrCapability(ueCfg->ueNrCapability);
5612 DU_FREE(ueCfg->ueNrCapability, sizeof(UE_NR_Capability_t));
5613 ueCfg->ueNrCapability = NULLP;
5615 if(ueCfg->cellGrpCfg)
5617 DU_FREE(ueCfg->cellGrpCfg, sizeof(CellGroupConfigRrc_t));
5618 ueCfg->cellGrpCfg = NULLP;
5622 memset(ueCfg->ambrCfg, 0, sizeof(AmbrCfg));
5623 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->ambrCfg, sizeof(AmbrCfg));
5625 for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++)
5627 freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]);
5629 for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
5631 freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
5635 /*******************************************************************
5637 * @brief Function to free UecontextSetupDb
5641 * Function : freeF1UeDb
5643 * Functionality: Function to free UecontextSetupDb
5645 * @params[in] UecontextSetupDb *
5648 * ****************************************************************/
5650 void freeF1UeDb(F1UeContextSetupDb *f1UeDb)
5653 if(f1UeDb->dlRrcMsg)
5655 if(f1UeDb->dlRrcMsg->rrcMsgPdu)
5657 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,\
5658 f1UeDb->dlRrcMsg->rrcMsgPdu, f1UeDb->dlRrcMsg->rrcMsgSize);
5660 memset(f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
5662 freeDuUeCfg(&f1UeDb->duUeCfg);
5663 memset(f1UeDb, 0, sizeof(F1UeContextSetupDb));
5664 DU_FREE(f1UeDb, sizeof(F1UeContextSetupDb));
5667 /*******************************************************************
5669 * @brief Function to build Am cfg Info
5673 * Function : extractRlcAmCfg
5675 * Functionality: Function to build Am cfg Info
5677 * @params[in] AmBearerCfg *
5680 * @return ROK/RFAILED
5682 * ****************************************************************/
5684 void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg)
5689 if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
5691 amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength);
5692 amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly;
5693 amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit;
5697 if(rlcAmCfg->ul_AM_RLC.sn_FieldLength)
5699 amCfgToSet->dlAmCfg.snLenDl = *(rlcAmCfg->ul_AM_RLC.sn_FieldLength);
5700 amCfgToSet->dlAmCfg.pollRetxTmr = rlcAmCfg->ul_AM_RLC.t_PollRetransmit;
5701 amCfgToSet->dlAmCfg.pollPdu = rlcAmCfg->ul_AM_RLC.pollPDU;
5702 amCfgToSet->dlAmCfg.pollByte = rlcAmCfg->ul_AM_RLC.pollByte;
5703 amCfgToSet->dlAmCfg.maxRetxTh = rlcAmCfg->ul_AM_RLC.maxRetxThreshold;
5708 /*******************************************************************
5710 * @brief Function to build Um Bi Info
5714 * Function : extractRlcUmBiCfg
5716 * Functionality: Function to build Um Bi Info
5718 * @params[in] UmBiDirBearerCfg *
5721 * @return ROK/RFAILED
5723 * ****************************************************************/
5725 void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_Directional *rlcBiCfg)
5729 /* UL UM BI DIR Cfg */
5730 if(rlcBiCfg->dl_UM_RLC.sn_FieldLength)
5732 umBiCfgToSet->ulUmCfg.snLenUlUm = *(rlcBiCfg->dl_UM_RLC.sn_FieldLength);
5733 umBiCfgToSet->ulUmCfg.reAssemTmr = rlcBiCfg->dl_UM_RLC.t_Reassembly;
5736 /* DL UM BI DIR Cfg */
5737 if(rlcBiCfg->ul_UM_RLC.sn_FieldLength)
5738 umBiCfgToSet->dlUmCfg.snLenDlUm = *(rlcBiCfg->ul_UM_RLC.sn_FieldLength);
5742 /*******************************************************************
5744 * @brief Function to build Um Ul Info
5748 * Function : extractRlcUmUlCfg
5750 * Functionality: Function to build Um Ul Info
5752 * @params[in] UmUniDirUlBearerCfg *
5755 * @return ROK/RFAILED
5757 * ****************************************************************/
5759 void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_Uni_Directional_DL *umUlCfg)
5763 if(umUlCfg->dl_UM_RLC.sn_FieldLength)
5765 umUlCfgToSet->ulUmCfg.snLenUlUm = *(umUlCfg->dl_UM_RLC.sn_FieldLength);
5766 umUlCfgToSet->ulUmCfg.reAssemTmr = umUlCfg->dl_UM_RLC.t_Reassembly;
5771 /*******************************************************************
5773 * @brief Function to build Um Uni Dl Info
5777 * Function : extractRlcUmDlCfg
5779 * Functionality: Function to build Um Uni Dl Info
5781 * @params[in] UmUniDirDlBearerCfg *
5784 * @return ROK/RFAILED
5786 * ****************************************************************/
5787 void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_Uni_Directional_UL *umDlCfg)
5791 if(umDlCfg->ul_UM_RLC.sn_FieldLength)
5792 umDlCfgToSet->dlUmCfg.snLenDlUm = *(umDlCfg->ul_UM_RLC.sn_FieldLength);
5796 /*******************************************************************
5798 * @brief Function to extractRlcModeCfg
5802 * Function : extractRlcModeCfg
5804 * Functionality: Function to extractRlcModeCfg
5806 * @params[in] RLC_Config_t *
5809 * @return ROK/RFAILED
5811 * ****************************************************************/
5812 void extractRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *rlcDbCfg, RLC_Config_t *lcCfg)
5820 if(lcCfg->choice.am)
5822 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
5823 if(rlcDbCfg->u.amCfg)
5824 extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
5828 case RLC_UM_BI_DIRECTIONAL :
5830 if(lcCfg->choice.um_Bi_Directional)
5832 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
5833 if(rlcDbCfg->u.umBiDirCfg)
5834 extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
5838 case RLC_UM_UNI_DIRECTIONAL_UL :
5840 if(lcCfg->choice.um_Uni_Directional_DL)
5842 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
5843 if(rlcDbCfg->u.umUniDirUlCfg)
5844 extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
5848 case RLC_UM_UNI_DIRECTIONAL_DL :
5850 if(lcCfg->choice.um_Uni_Directional_UL)
5852 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
5853 if(rlcDbCfg->u.umUniDirDlCfg)
5854 extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
5859 DU_LOG("\nDUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
5865 /*******************************************************************
5867 * @brief Function to extract extractUlLcCfg
5871 * Function : extractUlLcCfg
5873 * Functionality: Function to extract extractUlLcCfg
5875 * @params[in] UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg
5878 * ****************************************************************/
5880 void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg)
5884 if(ulLcCfg->ul_SpecificParameters)
5886 f1UlLcCfg->priority = \
5887 ulLcCfg->ul_SpecificParameters->priority;
5888 if(ulLcCfg->ul_SpecificParameters->logicalChannelGroup)
5890 f1UlLcCfg->lcGroup = \
5891 *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup);
5893 if(ulLcCfg->ul_SpecificParameters->schedulingRequestID)
5895 f1UlLcCfg->schReqId = \
5896 *(ulLcCfg->ul_SpecificParameters->schedulingRequestID);
5899 ulLcCfg->ul_SpecificParameters->prioritisedBitRate;
5901 ulLcCfg->ul_SpecificParameters->bucketSizeDuration;
5906 /*******************************************************************
5908 * @brief Function to procRlcLcCfg
5912 * Function : procRlcLcCfg
5914 * Functionality: Function to procRlcLcCfg
5916 * @params[in] rbId, lcId, rbType, rlcMod
5917 * RLC_Config_t *, RlcBearerCfg * ,
5920 * ****************************************************************/
5922 void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\
5923 uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg)
5927 lcCfg->configType = configType;
5929 if(rbType == RB_TYPE_SRB)
5931 lcCfg->rbType = RB_TYPE_SRB;
5933 lcCfg->lcType = LCH_DCCH;
5934 lcCfg->rlcMode = RLC_AM;
5936 else if(rbType == RB_TYPE_DRB)
5938 lcCfg->rbType = RB_TYPE_DRB;
5940 lcCfg->lcType = LCH_DTCH;
5941 lcCfg->rlcMode = rlcMode;
5943 if(f1RlcCfg) /* rlc mode config recived */
5945 extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg);
5951 /*******************************************************************
5953 * @brief Fills DrbQos Info received by CU
5957 * Function : extractQosInfo
5959 * Functionality: Fills DrbQos Info received by CU
5961 * @params[in] DrbQosInfo *qosToAdd,
5962 * QoSFlowLevelQoSParameters_t *qosFlowCfg
5965 * ****************************************************************/
5967 void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg)
5969 qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present;
5970 qosToAdd->u.nonDyn5Qi.fiveQi =\
5971 qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
5972 if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow)
5974 qosToAdd->u.nonDyn5Qi.avgWindow = \
5975 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
5977 qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \
5978 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
5979 if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel)
5981 qosToAdd->u.nonDyn5Qi.priorLevel = \
5982 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel);
5984 qosToAdd->ngRanRetPri.priorityLevel = \
5985 qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel;
5986 qosToAdd->ngRanRetPri.preEmptionCap = \
5987 qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability;
5988 qosToAdd->ngRanRetPri.preEmptionVul = \
5989 qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability;
5990 if(qosFlowCfg->gBR_QoS_Flow_Information)
5992 memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \
5993 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \
5994 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size);
5995 memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \
5996 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \
5997 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size);
5998 memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\
5999 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \
6000 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size);
6001 memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\
6002 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \
6003 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size);
6005 qosToAdd->pduSessionId = 0;
6006 qosToAdd->ulPduSessAggMaxBitRate = 0;
6009 uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd)
6011 DRB_Information_t *drbInfo = NULLP;
6013 if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
6015 if(drbItem->qoSInformation.choice.choice_extension->value.present ==
6016 QoSInformation_ExtIEs__value_PR_DRB_Information)
6018 drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
6020 if(!macLcToAdd->drbQos)
6022 DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
6023 if(macLcToAdd->drbQos == NULLP)
6025 DU_LOG("\n DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
6030 if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
6032 extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
6033 macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
6035 if(!macLcToAdd->snssai)
6037 DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
6038 if(macLcToAdd->snssai == NULLP)
6040 DU_LOG("\n DUAPP:Memory failed at allocating SNSSAI at extractDrbCfg()");
6044 memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
6045 drbInfo->sNSSAI.sST.size);
6046 if(drbInfo->sNSSAI.sD)
6048 memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
6049 drbInfo->sNSSAI.sD->size);
6051 }/*End of DRB Info*/
6056 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
6062 ret = extractDrbCfg(drbCfg, lcCfg);
6065 DU_LOG("F1AP: Failed to build Drb Qos at extractMacRbCfg()");
6071 lcCfg->drbQos = NULLP;
6072 lcCfg->snssai = NULLP;
6073 if(lcCfg->lcId == SRB2_LCID)
6074 lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
6076 lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
6080 lcCfg->ulLcCfgPres = true;
6081 extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
6084 lcCfg->ulLcCfgPres = false;
6088 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
6089 DRBs_ToBeSetup_Item_t *drbItem, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
6094 lcCfg->configType = configType;
6095 if(rbType == RB_TYPE_SRB)
6097 ret = extractMacRbCfg(lcId, NULL, ulLcCfg, lcCfg);
6099 else if(rbType == RB_TYPE_DRB)
6101 ret = extractMacRbCfg(lcId, drbItem, ulLcCfg, lcCfg);
6106 /*******************************************************************
6108 * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
6112 * Function : extractRlcCfgToAddMod
6114 * Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
6116 * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
6118 * @return ROK/RFAILED
6120 * ****************************************************************/
6122 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, \
6125 uint8_t ret, idx, rbId, lcId, rlcMode, rbType;
6126 RLC_Config_t *f1RlcCfg = NULLP;
6127 LogicalChannelConfig_t *macUlLcCfg = NULLP;
6129 for(idx = 0; idx < lcCfg->list.count; idx++)
6131 lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
6132 if(lcCfg->list.array[idx]->servedRadioBearer)
6134 /* RadioBearer for SRB/DRB */
6135 if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
6136 RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
6138 rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
6139 rbType = RB_TYPE_SRB;
6141 else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
6142 RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
6144 rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
6145 rbType = RB_TYPE_DRB;
6149 DU_LOG("\n No components present in Bearer config to ADD/MOD");
6152 /* MAC UL LC Config */
6153 if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
6155 macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
6160 DU_LOG("\nDUAPP: Received RadioBearer config is NULL");
6163 /* RLC Mode Config */
6164 if(lcCfg->list.array[idx]->rlc_Config)
6166 rlcMode = lcCfg->list.array[idx]->rlc_Config->present;
6167 f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
6170 /* Filling RLC/MAC Config*/
6171 memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
6172 memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
6173 procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
6174 ret = procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx]);
6177 DU_LOG("\nDUAPP: Failed while filling MAC LC config at extractRlcCfgToAddMod()");
6180 (ueCfgDb->numRlcLcs)++;
6181 (ueCfgDb->numMacLcs)++;
6183 //TODO: To send the failure cause in UeContextSetupRsp
6187 /*******************************************************************
6189 * @brief DeAlloc pdsch serv cell config info
6193 * Function : freeMacPdschServCellInfo
6195 * Functionality: DeAlloc pdsch serv cell config info
6197 * @params[in] PdschServCellCfg pointer
6200 * ****************************************************************/
6202 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
6204 if(pdsch->xOverhead)
6206 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(uint8_t));
6208 if(pdsch->codeBlkGrpFlushInd)
6210 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
6212 if(pdsch->maxCodeBlkGrpPerTb)
6214 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(uint8_t));
6216 if(pdsch->maxMimoLayers)
6218 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
6222 /*******************************************************************
6224 * @brief Free Serving cell Info
6228 * Function : freeMacServingCellInfo
6230 * Functionality: Free Serving cell Info
6232 * @params[in] ServCellCfgInfo *srvCellCfg
6235 * ****************************************************************/
6236 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
6238 freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
6239 if(srvCellCfg->bwpInactivityTmr)
6241 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
6245 /*******************************************************************
6247 * @brief Free cell Grp Cfg Info
6251 * Function : freeUeReCfgCellGrpInfo
6253 * Functionality: Free cell Grp Cfg Info
6255 * @params[in] MacUeCfg* duUeCfg
6258 * ****************************************************************/
6260 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
6262 freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
6265 /*******************************************************************
6267 * @brief Fills Reconfig SchReqReConfig
6271 * Function : extractSchReqReConfig
6273 * Functionality: Fills Reconfig SchReqReConfig
6275 * @params[in] SchedulingRequestConfig_t *cuSchedReq
6276 * SchedReqCfg* macSchedReq
6279 * ****************************************************************/
6280 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
6282 uint8_t schReqIdx = 0;
6283 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
6284 struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
6286 if(cuSchedReq->schedulingRequestToAddModList)
6288 schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
6289 if(schReqListToAdd->list.count)
6291 macSchedReq->addModListCount = schReqListToAdd->list.count;
6292 for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
6294 macSchedReq->addModList[schReqIdx].schedReqId = \
6295 schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
6296 macSchedReq->addModList[schReqIdx].srProhibitTmr = \
6297 *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
6298 macSchedReq->addModList[schReqIdx].srTransMax =\
6299 schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
6303 /* Scheduling Req To release */
6304 if(cuSchedReq->schedulingRequestToReleaseList)
6306 schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
6307 if(schReqListToRel->list.count)
6309 macSchedReq->relListCount = schReqListToRel->list.count;
6310 for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
6312 macSchedReq->relList[schReqIdx] = \
6313 *schReqListToRel->list.array[schReqIdx];
6319 /*******************************************************************
6321 * @brief Fills TagReconfig
6325 * Function : extractTagReconfig
6327 * Functionality: Fills extractTagReconfig
6329 * @params[in] TAG_Config_t *cuTagCfg
6333 * ****************************************************************/
6335 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
6338 struct TAG_Config__tag_ToAddModList *tagListToAddMod = NULLP;
6339 struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
6341 /* Tag config to AddMod */
6342 if(cuTagCfg->tag_ToAddModList)
6344 tagListToAddMod = cuTagCfg->tag_ToAddModList;
6345 if(tagListToAddMod->list.count)
6347 macTagCfg->addModListCount = tagListToAddMod->list.count;
6348 for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
6350 macTagCfg->addModList[tagIdx].tagId =\
6351 tagListToAddMod->list.array[tagIdx]->tag_Id;
6352 macTagCfg->addModList[tagIdx].timeAlignTimer = \
6354 tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
6358 /* Tag config to release */
6359 if(cuTagCfg->tag_ToReleaseList)
6361 tagListToRel = cuTagCfg->tag_ToReleaseList;
6362 if(tagListToRel->list.count)
6364 macTagCfg->relListCount = tagListToRel->list.count;
6365 for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
6367 macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];
6373 /*******************************************************************
6375 * @brief Fills PdcchCfg received by CU
6379 * Function : extractPdcchCfg
6381 * Functionality: Fills PdcchCfg received by CU
6383 * @params[in] PDCCH_Config_t *cuPdcchCfg,
6384 * PdcchConfig *duPdcchCfg
6387 * ****************************************************************/
6389 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
6391 uint8_t cRsetIdx = 0;
6392 uint8_t srchSpcIdx = 0;
6394 struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
6395 struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
6396 struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
6397 struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
6400 /* Control Resource Set To Add/Mod List */
6401 if(cuPdcchCfg->controlResourceSetToAddModList)
6403 cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
6404 if(cRsetToAddModList->list.count)
6406 macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
6407 for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
6409 macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
6410 cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
6411 bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
6412 macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
6413 macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
6414 cRsetToAddModList->list.array[cRsetIdx]->duration;
6416 macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
6417 cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;
6418 if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
6420 //TODO: handle the case for Interleaved
6422 macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
6423 cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
6424 if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
6426 macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
6427 *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
6433 /* Control Resource Set To Release List */
6434 if(cuPdcchCfg->controlResourceSetToReleaseList)
6436 cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
6437 if(cRsetToRelList->list.count)
6439 macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
6440 for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
6442 macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
6447 /* Search space To Add/Mod List */
6448 if(cuPdcchCfg->searchSpacesToAddModList)
6450 srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
6451 if(srchSpcToAddModList->list.count)
6453 macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
6454 for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
6456 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
6457 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
6458 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
6459 *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
6460 if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
6462 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
6463 srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
6465 if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
6467 bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
6468 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
6470 if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
6472 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
6473 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
6474 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
6475 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
6476 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
6477 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
6479 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
6480 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
6482 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
6483 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
6485 if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
6487 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
6488 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
6489 if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
6491 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
6492 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
6499 /* Search space To Rel List */
6500 if(cuPdcchCfg->searchSpacesToReleaseList)
6502 srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
6503 if(srchSpcToRelList->list.count)
6505 macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
6506 for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
6508 macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
6509 *(srchSpcToRelList->list.array[srchSpcIdx]);
6515 /*******************************************************************
6517 * @brief Fills PdschCfg received by CU
6521 * Function : extractPdschCfg
6523 * Functionality: Fills PdschCfg received by CU
6525 * @params[in] PDSCH_Config_t *cuPdschCfg,
6526 * PdschConfig *macPdschCfg
6529 * ****************************************************************/
6531 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
6534 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
6536 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6538 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
6539 PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
6541 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
6543 macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
6544 *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
6548 macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
6549 if(cuPdschCfg->pdsch_TimeDomainAllocationList)
6551 timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
6552 if(timeDomAlloc->present ==\
6553 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
6555 if(timeDomAlloc->choice.setup)
6557 macPdschCfg->numTimeDomRsrcAlloc = timeDomAlloc->choice.setup->list.count;
6558 for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
6560 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
6561 timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
6562 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
6563 timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
6568 macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
6569 if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
6570 macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
6571 if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
6573 macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
6574 if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
6576 if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
6578 macPdschCfg->bundlingInfo.StaticBundling.size = \
6579 *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
6583 else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
6585 macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
6590 /*******************************************************************
6592 * @brief Fills PdschServingCellCfg received by CU
6596 * Function : extractPdschServingCellCfg
6598 * Functionality: Fills PdschCfg received by CU
6600 * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
6601 * PdschServCellCfg *macUePdschSrvCellCfg
6602 * @return ROK/RFAILED
6604 * ****************************************************************/
6606 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
6608 if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
6610 if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
6612 if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
6614 *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb) = \
6615 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
6619 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(uint8_t));
6620 if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
6622 *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb) = \
6623 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
6627 DU_LOG("\nDUAPP: Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
6631 if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
6633 *(macUePdschSrvCellCfg->codeBlkGrpFlushInd) = \
6634 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
6638 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(bool));
6639 if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
6641 *(macUePdschSrvCellCfg->codeBlkGrpFlushInd) = \
6642 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
6646 DU_LOG("\nDUAPP: Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
6652 if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
6654 macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH);
6656 if(cuPdschSrvCellCfg->ext1)
6658 if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
6660 if(macUePdschSrvCellCfg->maxMimoLayers)
6662 *(macUePdschSrvCellCfg->maxMimoLayers) = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
6666 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
6667 if(macUePdschSrvCellCfg->maxMimoLayers)
6669 *(macUePdschSrvCellCfg->maxMimoLayers) = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
6673 DU_LOG("\nDUAPP: Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
6679 if(cuPdschSrvCellCfg->xOverhead)
6681 if(macUePdschSrvCellCfg->xOverhead)
6683 *(macUePdschSrvCellCfg->xOverhead) = *(cuPdschSrvCellCfg->xOverhead);
6687 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(uint8_t));
6688 if(macUePdschSrvCellCfg->xOverhead)
6690 *(macUePdschSrvCellCfg->xOverhead) = *(cuPdschSrvCellCfg->xOverhead);
6694 DU_LOG("\nDUAPP: Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
6702 /*******************************************************************
6704 * @brief Fills PuschCfg received by CU
6708 * Function : extractPuschCfg
6710 * Functionality: Fills PuschCfg received by CU
6712 * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
6713 * PuschCfg *macPuschCfg
6716 * ****************************************************************/
6718 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
6720 uint8_t timeDomIdx = 0;
6721 DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
6722 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
6724 if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
6726 if(cuPuschCfg->choice.setup)
6728 if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
6730 macPuschCfg->dataScramblingId = \
6731 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
6733 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
6735 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
6737 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
6739 dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
6740 if(dmrsUlCfg->dmrs_AdditionalPosition)
6742 macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
6743 *(dmrsUlCfg->dmrs_AdditionalPosition);
6745 if(dmrsUlCfg->transformPrecodingDisabled)
6747 if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
6749 macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
6750 *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
6756 /*Res Alloc Type for UL */
6757 if(cuPuschCfg->choice.setup->resourceAllocation)
6759 macPuschCfg->resourceAllocType = \
6760 cuPuschCfg->choice.setup->resourceAllocation;
6762 if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
6764 timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
6765 if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
6767 if(timeDomAllocList->choice.setup)
6769 macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
6770 for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
6772 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
6773 *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
6774 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
6775 timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
6776 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
6777 timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
6782 if(cuPuschCfg->choice.setup->transformPrecoder)
6783 macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
6787 /*******************************************************************
6789 * @brief Fills ServingCellReconfig received by CU
6793 * Function : extractServingCellReconfig
6795 * Functionality: Fills ServingCellReconfig received by CU
6797 * @params[in] ServingCellConfig_t *cuSrvCellCfg
6798 * ServCellCfgInfo *macSrvCellCfg
6799 * @return ROK/RFAILD
6801 * ****************************************************************/
6802 uint8_t extractServingCellReconfig(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg)
6805 BWP_DownlinkDedicated_t *dlBwp = NULLP;
6806 BWP_UplinkDedicated_t *ulBwp = NULLP;
6808 if(cuSrvCellCfg->initialDownlinkBWP)
6810 dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
6811 if(dlBwp->pdcch_Config)
6813 if(dlBwp->pdcch_Config->choice.setup)
6815 macSrvCellCfg->initDlBwp.pdcchPresent = true;
6816 extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
6819 if(dlBwp->pdsch_Config)
6821 if(dlBwp->pdsch_Config->choice.setup)
6823 macSrvCellCfg->initDlBwp.pdschPresent = true;
6824 extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg);
6828 if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
6829 macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
6830 if(cuSrvCellCfg->defaultDownlinkBWP_Id)
6831 macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
6832 if(cuSrvCellCfg->bwp_InactivityTimer)
6834 if(macSrvCellCfg->bwpInactivityTmr)
6836 memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
6840 macSrvCellCfg->bwpInactivityTmr = NULLP;
6841 DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
6842 if(macSrvCellCfg->bwpInactivityTmr)
6844 memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
6848 DU_LOG("\nMemory Alloc failed for bwpInactivityTmr at extractServingCellReconfig()");
6853 if(cuSrvCellCfg->pdsch_ServingCellConfig)
6855 if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
6857 ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
6860 DU_LOG("\nFailed at extractPdschServingCellCfg()");
6865 if(cuSrvCellCfg->uplinkConfig)
6867 if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
6869 ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
6870 if(ulBwp->pusch_Config)
6872 macSrvCellCfg->initUlBwp.puschPresent = true;
6873 extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
6875 if(ulBwp->pucch_Config)
6877 macSrvCellCfg->initUlBwp.pucchPresent = true;
6878 //extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg);
6881 if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
6882 macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
6887 /*******************************************************************
6889 * @brief Fills Reconfig Cell group Info received by CU
6893 * Function : extractUeReCfgCellInfo
6895 * Functionality: Fills Reconfig Cell group Info received by CU
6897 * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
6898 * MacUeCfg* macUeCfg
6899 * @return ROK/RFAILED
6901 * ****************************************************************/
6902 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg)
6905 MAC_CellGroupConfig_t *macCellGroup = NULLP;
6906 PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
6907 SpCellConfig_t *spcellCfg = NULLP;
6908 ServingCellConfig_t *servCellCfg = NULLP;
6912 /* Fill MacCell Group Reconfig */
6913 if(cellGrp->mac_CellGroupConfig)
6915 macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
6916 if(macCellGroup->schedulingRequestConfig)
6918 extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
6920 if(macCellGroup->tag_Config)
6922 extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
6924 if(macCellGroup->bsr_Config)
6926 macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
6927 macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer = macCellGroup->bsr_Config->retxBSR_Timer;
6928 if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
6930 macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer =\
6931 *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
6934 if(macCellGroup->phr_Config)
6936 if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
6938 macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
6939 if(macCellGroup->phr_Config->choice.setup)
6941 macUeCfg->macCellGrpCfg.phrCfg.periodicTimer = \
6942 macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
6943 macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer = \
6944 macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
6945 macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor = \
6946 macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
6947 macUeCfg->macCellGrpCfg.phrCfg.multiplePHR = \
6948 macCellGroup->phr_Config->choice.setup->multiplePHR;
6949 macUeCfg->macCellGrpCfg.phrCfg.dummy = \
6950 macCellGroup->phr_Config->choice.setup->dummy;
6951 macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
6952 macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
6953 macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG = \
6954 macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
6961 /* Fill Physical Cell Group Reconfig */
6962 if(cellGrp->physicalCellGroupConfig)
6964 phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
6965 if(phyCellGrpCfg->p_NR_FR1)
6967 if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
6968 macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
6970 macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
6972 /* Fill SpCell Reconfig */
6973 if(cellGrp->spCellConfig)
6975 spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));
6976 if(spcellCfg->servCellIndex)
6978 macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
6980 /* Fill Serving cell Reconfig info */
6981 if(cellGrp->spCellConfig->spCellConfigDedicated)
6983 servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
6984 ret = extractServingCellReconfig(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
6987 DU_LOG("\n Failed at extractServingCellReconfig()");
6995 /*******************************************************************
6997 * @brief builds Mac Cell Cfg
7001 * Function : procUeReCfgCellInfo
7003 * Functionality: builds Mac Cell Cfg
7005 * @params[in] MacUeCfg pointer
7010 * ****************************************************************/
7011 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, void *cellInfo)
7014 CellGroupConfigRrc_t *cellGrp = NULLP;
7018 cellGrp = (CellGroupConfigRrc_t *)cellInfo;
7019 ret = extractUeReCfgCellInfo(cellGrp, macUeCfg);
7021 DU_LOG("\nF1AP: Failed at procUeReCfgCellInfo()");
7025 freeUeReCfgCellGrpInfo(macUeCfg);
7030 /*******************************************************************
7032 * @brief Filling modulation info in mac ue cfg
7036 * Function : duFillModulationDetails
7038 * Functionality: Filling modulation info in mac ue cfg
7040 * @params[in] MAC UE Config to be updated
7041 * Current UE configuration
7042 * UE NR capability from CU
7043 * @return ROK - success
7046 * ****************************************************************/
7047 void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
7049 UE_NR_Capability_t *ueNrCap;
7052 ueNrCap = (UE_NR_Capability_t *)ueCap;
7054 /* Filling DL modulation info */
7055 if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
7056 ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
7057 ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
7059 switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
7061 case ModulationOrder_qpsk:
7063 ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
7066 case ModulationOrder_qam16:
7068 ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
7071 case ModulationOrder_qam64:
7073 ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
7074 ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
7075 ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
7078 case ModulationOrder_qam256:
7080 ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
7085 DU_LOG("\nDU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
7086 memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
7093 memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
7096 /* Filling UL modulation info */
7097 if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
7098 ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
7099 ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
7101 switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
7103 case ModulationOrder_qpsk:
7105 ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
7108 case ModulationOrder_qam16:
7110 ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
7111 ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
7112 ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
7115 case ModulationOrder_qam64:
7117 ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
7120 case ModulationOrder_qam256:
7122 ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
7127 DU_LOG("\nDU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
7128 memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
7135 memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
7139 /*******************************************************************
7141 * @brief Function to extract cellGrp Info present in cutoDu cont
7145 * Function : extractCellGrpInfo
7147 * Functionality: Function to extract cellGrp Info present
7150 * @params[in] ProtocolExtensionContainer_4624P16_t pointer
7152 * @return CellGroupConfigRrc_t *
7154 * ****************************************************************/
7156 CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
7161 uint16_t recvBufLen;
7162 CellGroupConfigRrc_t *cellGrpCfg = NULLP;
7163 CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
7164 asn_dec_rval_t rval; /* Decoder return value */
7165 memset(&rval, 0, sizeof(asn_dec_rval_t));
7169 for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++)
7171 extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2]));
7175 case ProtocolIE_ID_id_CellGroupConfig:
7177 recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
7178 /* decoding the CellGroup Buf received */
7179 DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
7182 memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
7183 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
7184 extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
7185 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7187 DU_LOG("\nF1AP : ASN decode failed at decodeCellGrpCfg()");
7190 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
7191 if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
7197 DU_LOG("\nF1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id);
7205 /*******************************************************************
7207 * @brief Fills Srb List received by CU
7211 * Function : procSrbListToSetup
7213 * Functionality: Fills Srb List received by CU
7215 * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
7217 * RlcBearerCfg pointer
7220 * ****************************************************************/
7221 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
7225 /* Filling RLC INFO */
7226 procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
7228 /* Filling MAC INFO */
7229 ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL, NULL, macLcToAdd);
7232 DU_LOG("\nF1AP:Failed at MAC LC Cfg in procSrbListToSetup()");
7240 /*******************************************************************
7242 * @brief extract Srb List received by CU
7246 * Function : extractSrbListToSetup
7248 * Functionality: extract Srb List received by CU
7249 * for both MAC and RLC
7251 * @params[in] SRBs_ToBeSetup_Item_t pointer
7253 * @return ROK/RFAIED
7255 * ****************************************************************/
7257 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
7259 uint8_t ret, srbIdx;
7260 SRBs_ToBeSetup_Item_t *srbItem = NULLP;
7264 for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
7266 srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
7267 if(ueCfgDb->numMacLcs > MAX_NUM_LC)
7269 DU_LOG("\nF1AP: MAX LC Reached in MAC");
7273 if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
7275 DU_LOG("\nF1AP: MAX LC Reached in RLC");
7279 memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
7280 memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
7281 ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
7282 &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
7283 ueCfgDb->numRlcLcs++;
7284 ueCfgDb->numMacLcs++;
7287 DU_LOG("\nF1AP: Failed at extractSrbListToSetup()");
7298 /*******************************************************************
7300 * @brief Fills Drb List received by CU
7304 * Function : procDrbListToSetup
7306 * Functionality: Fills Drb List received by CU
7307 * for both MAC and RLC
7309 * @params[in] SRBs_ToBeSetup_Item_t pointer
7311 * RlcBearerCfg pointer
7314 * ****************************************************************/
7316 uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
7320 /* Filling RLC INFO */
7321 procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
7323 /* Filling MAC INFO */
7324 ret = procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, macLcToAdd);
7327 DU_LOG("\nF1AP:Failed at RLC LC Cfg in extractDrbListToSetup()");
7334 /*******************************************************************
7336 * @brief extract Drb List received by CU
7340 * Function : extractDrbListToSetup
7342 * Functionality: extract Drb List received by CU
7343 * for both MAC and RLC
7345 * @params[in] DRBs_ToBeSetup_Item_t pointer
7347 * @return ROK/RFAIED
7349 * ****************************************************************/
7351 uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg, DuUeCfg *ueCfgDb)
7353 uint8_t ret, drbIdx;
7354 DRBs_ToBeSetup_Item_t *drbItem = NULLP;
7359 for(drbIdx = 0; drbIdx < drbCfg->list.count; drbIdx++)
7361 drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
7362 if(ueCfgDb->numMacLcs > MAX_NUM_LC)
7364 DU_LOG("\nF1AP: MAX LC Reached in MAC ");
7368 if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
7370 DU_LOG("\nF1AP: MAX LC Reached in RLC");
7374 memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
7375 memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
7376 ret = procDrbListToSetup(lcId, drbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
7377 &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
7378 ueCfgDb->numRlcLcs++;
7379 ueCfgDb->numMacLcs++;
7382 DU_LOG("\nF1AP: Failed at extractDrbListToSetup()");
7393 /*******************************************************************
7395 * @brief Function to extract Dl RRC Msg received from CU
7399 * Function : extractDlRrcMsg
7401 * Functionality: Function to extract Dl RRC Msg received from CU
7403 * @params[in] F1AP message
7404 * @return ROK - success
7407 * ****************************************************************/
7409 uint8_t extractDlRrcMsg(uint32_t gnbDuUeF1apId, uint32_t gnbCuUeF1apId, \
7410 F1DlRrcMsg *dlRrcMsg, RRCContainer_t *rrcContainer)
7413 dlRrcMsg->rrcMsgSize = rrcContainer->size;
7414 if(dlRrcMsg->rrcMsgSize > 0)
7416 DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
7417 if(!dlRrcMsg->rrcMsgPdu)
7419 DU_LOG("\nDU APP : Memory allocation failed for RRC Msg in procUeCtxtSetupReq");
7424 dlRrcMsg->gnbDuUeF1apId = gnbDuUeF1apId;
7425 dlRrcMsg->gnbCuUeF1apId = gnbCuUeF1apId;
7426 dlRrcMsg->srbId = SRB1_LCID;
7427 memcpy(dlRrcMsg->rrcMsgPdu, rrcContainer->buf, dlRrcMsg->rrcMsgSize);
7433 /*******************************************************************
7435 * @brief Extract UE capability info
7439 * Function : extractUeCapability
7441 * Functionality: Extract UE capability info and stores in ue Cb
7443 * @params[in] Octet string of UE capability RAT container list
7444 * @return ROK - success
7447 * ****************************************************************/
7448 UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf, DuUeCb *ueCb)
7451 uint16_t recvBufLen;
7452 asn_dec_rval_t rval;
7453 UE_NR_Capability_t *ueNrCap = NULLP;
7454 UE_CapabilityRAT_ContainerListRRC_t *ueCapRatContList = NULLP;
7456 /* Decoding UE Capability RAT Container List */
7457 recvBufLen = ueCapablityListBuf->size;
7458 DU_ALLOC(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
7459 if(!ueCapRatContList)
7461 DU_LOG("\nF1AP : Memory allocation failed in extractUeCapability");
7464 memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
7465 memset(&rval, 0, sizeof(asn_dec_rval_t));
7466 rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList,
7467 ueCapablityListBuf->buf, recvBufLen, 0, 0);
7468 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7470 DU_LOG("\nF1AP : ASN decode failed at decodeCellGrpCfg()");
7473 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, ueCapRatContList);
7475 /* Free encoded buffer after decoding */
7476 free(ueCapablityListBuf->buf);
7478 for(idx = 0; idx < ueCapRatContList->list.count; idx++)
7480 if(ueCapRatContList->list.array[idx]->rat_Type == RAT_Type_nr)
7482 /* Decoding UE NR Capability */
7483 recvBufLen = ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.size;
7484 DU_ALLOC(ueNrCap, sizeof(UE_NR_Capability_t));
7487 DU_LOG("\nF1AP : Memory allocation failed in extractUeCapability");
7488 DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
7491 memset(ueNrCap, 0, sizeof(UE_NR_Capability_t));
7492 memset(&rval, 0, sizeof(asn_dec_rval_t));
7493 rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap,
7494 ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0);
7495 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
7497 DU_LOG("\nF1AP : ASN decode failed at decodeCellGrpCfg()");
7500 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, ueNrCap);
7502 /* Free encoded buffer after decoding */
7503 free(ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf);
7505 free(ueCapRatContList->list.array[idx]);
7509 free(ueCapRatContList->list.array);
7510 DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
7514 /*******************************************************************
7516 * @brief Process UE context setup request from CU
7520 * Function : procF1UeContextSetupReq
7522 * Functionality: Process UE context setup request from CU
7524 * @params[in] F1AP message
7525 * @return ROK - success
7528 * ****************************************************************/
7529 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
7531 uint8_t ret, ieIdx, ueIdx, lcId, cellIdx;
7532 bool ueCbFound = false;
7533 uint32_t gnbCuUeF1apId, gnbDuUeF1apId, bitRateSize;
7534 DuUeCb *duUeCb = NULLP;
7535 UEContextSetupRequest_t *ueSetReq = NULLP;
7539 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
7540 for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
7542 switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
7544 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7546 gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
7549 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7551 gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
7554 case ProtocolIE_ID_id_ServCellIndex:
7556 cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
7557 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
7559 if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
7560 (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
7563 duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
7564 DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
7567 memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
7568 duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
7569 duUeCb->f1UeDb->cellIdx = cellIdx;
7573 DU_LOG("\nF1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
7583 DU_LOG("\nF1AP: DuUeCb is not found at procF1UeContextSetupReq()");
7588 case ProtocolIE_ID_id_SpCellULConfigured:
7589 /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL,
7590 UL, SUL or UL+SUL for the indicated cell for the UE */
7592 case ProtocolIE_ID_id_CUtoDURRCInformation:
7594 if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList)
7596 duUeCb->f1UeDb->duUeCfg.ueNrCapability = \
7597 extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
7598 uE_CapabilityRAT_ContainerList, duUeCb);
7600 if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
7602 duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
7603 value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
7604 if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
7606 DU_LOG("\n F1AP: Failed to extract cell Grp Info");
7607 //TODO: Update the failure cause in ue context Setup Response
7613 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
7615 DU_LOG("\nDU_APP: Received SCell to be added");
7616 DU_LOG("\nDU_APP: Not processing the SCell_ToBeSetup_List");
7619 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
7621 if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
7622 &duUeCb->f1UeDb->duUeCfg))
7624 DU_LOG("\nDU_APP: Failed at extractSrbListToSetup()");
7625 //TODO: Update the failure cause in ue context Setup Response
7630 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
7632 lcId = getDrbLcId(&duUeCb->drbBitMap);
7635 if(extractDrbListToSetup(lcId, &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List,\
7636 &duUeCb->f1UeDb->duUeCfg))
7638 DU_LOG("\nDU_APP: Failed at extractDrbListToSetup()");
7639 //TODO: Update the failure cause in ue context Setup Response
7647 case ProtocolIE_ID_id_RRCContainer:
7649 /* Filling Dl RRC Msg Info */
7650 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
7651 if(!duUeCb->f1UeDb->dlRrcMsg)
7653 DU_LOG("\nDU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
7658 memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
7659 ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
7660 &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
7664 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
7666 if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
7668 duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
7672 DU_LOG("\nIgnoring delivery report, since rrcContainer is not present");
7676 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL: {
7677 /* MaximumBitRate Uplink */
7678 bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
7681 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
7682 if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
7684 DU_LOG("\nDU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
7689 memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg));
7690 memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
7691 ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
7692 duUeCb->f1UeDb->duUeCfg.ambrCfg->dlBr = 0;
7707 /*TODO : Negative case*/
7708 // BuildAndSendUeContextSetupRsp(ueIdx, cellId);
7709 DU_LOG("F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()");
7712 ret = duProcUeContextSetupRequest(duUeCb);
7718 /*******************************************************************
7719 * @brief Free the memory allocated for UE Setup response
7723 * Function : FreeUeContextSetupRsp
7726 * Free the memory allocated for UE Setup response
7728 * @params[in] F1AP PDU for UE setup response
7729 * @return ROK - success
7732 * ****************************************************************/
7733 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
7736 UEContextSetupResponse_t *ueSetRsp = NULLP;
7740 if(f1apMsg->choice.successfulOutcome)
7742 ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
7743 UEContextSetupResponse;
7744 if(ueSetRsp->protocolIEs.list.array)
7746 for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
7748 if(ueSetRsp->protocolIEs.list.array[idx])
7750 switch(ueSetRsp->protocolIEs.list.array[idx]->id)
7752 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7754 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7756 case ProtocolIE_ID_id_DUtoCURRCInformation:
7758 CellGroupConfig_t *cellGrpCfg = NULLP;
7759 cellGrpCfg = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
7760 DUtoCURRCInformation.cellGroupConfig;
7761 if(cellGrpCfg->buf != NULLP)
7763 DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
7769 DU_LOG("\nDUAPP: Invalid Id %ld at FreeUeContextSetupRsp()", ueSetRsp->protocolIEs.list.array[idx]->id);
7772 DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
7773 sizeof(UEContextSetupResponseIEs_t));
7776 DU_FREE(ueSetRsp->protocolIEs.list.array, \
7777 ueSetRsp->protocolIEs.list.size);
7779 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7781 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7785 /*******************************************************************
7787 * @brief Builds Ue context Setup Rsp DU To CU Info
7791 * Function : EncodeUeCntxtDuToCuInfo
7793 * Functionality: Builds Ue context Setup Rsp DU To CU Info
7795 * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t *
7797 * @return ROK - success
7800 ******************************************************************/
7802 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
7804 asn_enc_rval_t encRetVal;
7806 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
7807 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7809 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
7810 /* Encode results */
7811 if(encRetVal.encoded == ENCODE_FAIL)
7813 DU_LOG( "\n F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
7814 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7819 DU_LOG("\n F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
7820 for(int i=0; i< encBufSize; i++)
7822 printf("%x",encBuf[i]);
7825 duToCuCellGrp->size = encBufSize;
7826 DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
7827 if(!duToCuCellGrp->buf)
7829 DU_LOG("\nF1AP : Memory allocation failed in UeCntxtDuToCuInfo");
7831 memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
7835 /*******************************************************************
7837 * @brief Builds and sends the UE Setup Response
7841 * Function : BuildAndSendUeContextSetupRsp
7843 * Functionality: Constructs the UE Setup Response and sends
7844 * it to the DU through SCTP.
7848 * @return ROK - success
7851 * ****************************************************************/
7852 uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId)
7854 uint8_t idx, ret, cellIdx, elementCnt;
7855 uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */
7856 uint32_t gnbDuUeF1apId; /* gNB-DU UE F1AP Id */
7857 asn_enc_rval_t encRetVal; /* Encoder return value */
7858 F1AP_PDU_t *f1apMsg = NULLP;
7859 UEContextSetupResponse_t *ueSetRsp = NULLP;
7860 CellGroupConfigRrc_t *cellGrpCfg = NULLP;
7861 DuUeCb *ueCb = NULLP;
7863 DU_LOG("\n F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
7867 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7868 if(f1apMsg == NULLP)
7870 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
7875 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7876 DU_ALLOC(f1apMsg->choice.successfulOutcome,
7877 sizeof(SuccessfulOutcome_t));
7878 if(f1apMsg->choice.successfulOutcome == NULLP)
7880 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
7885 f1apMsg->choice.successfulOutcome->procedureCode = \
7886 ProcedureCode_id_UEContextSetup;
7887 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7888 f1apMsg->choice.successfulOutcome->value.present = \
7889 SuccessfulOutcome__value_PR_UEContextSetupResponse;
7892 &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
7894 ueSetRsp->protocolIEs.list.count = elementCnt;
7895 ueSetRsp->protocolIEs.list.size = \
7896 elementCnt * sizeof(UEContextSetupResponse_t *);
7898 /* Initialize the UESetup members */
7899 DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
7900 ueSetRsp->protocolIEs.list.size);
7901 if(ueSetRsp->protocolIEs.list.array == NULLP)
7903 DU_LOG(" F1AP : Memory allocation for UE Setup Response failed");
7908 for(idx=0; idx<elementCnt; idx++)
7910 DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
7911 sizeof(UEContextSetupResponseIEs_t));
7912 if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
7914 DU_LOG(" F1AP : Memory allocation for UE Setup Response failed");
7919 /* Fetching Ue Cb Info*/
7920 GET_CELL_IDX(cellId, cellIdx);
7921 gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
7922 gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
7923 ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
7926 /*GNB CU UE F1AP ID*/
7927 ueSetRsp->protocolIEs.list.array[idx]->id = \
7928 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7929 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7930 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
7931 UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
7932 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
7934 /*GNB DU UE F1AP ID*/
7936 ueSetRsp->protocolIEs.list.array[idx]->id = \
7937 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7938 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7939 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
7940 UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
7941 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
7944 /*DUtoCURRC Information */
7946 ueSetRsp->protocolIEs.list.array[idx]->id = \
7947 ProtocolIE_ID_id_DUtoCURRCInformation;
7948 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7949 ueSetRsp->protocolIEs.list.array[idx]->value.present =\
7950 UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
7953 if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
7955 cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
7956 ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
7957 choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
7958 /* Free UeContext Db created during Ue context Req */
7959 freeF1UeDb(ueCb->f1UeDb);
7960 ueCb->f1UeDb = NULLP;
7965 DU_LOG("\nF1AP: Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
7971 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7973 /* Encode the UE context setup response type as APER */
7974 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7976 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7978 /* Encode results */
7979 if(encRetVal.encoded == ENCODE_FAIL)
7981 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
7982 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7988 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
7989 for(int i=0; i< encBufSize; i++)
7991 printf("%x",encBuf[i]);
7996 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
7998 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
8004 FreeUeContextSetupRsp(f1apMsg);
8006 }/* End of BuildAndSendUeContextSetupRsp */
8009 uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId)
8011 uint8_t cellIdx = 0, actionType = 0;
8013 GET_CELL_IDX(cellId, cellIdx);
8014 actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
8019 BuildAndSendUeContextSetupRsp(ueIdx, cellId);
8022 //TODO: Build Ue context Modification Rsp
8025 DU_LOG("F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
8032 /*******************************************************************
8034 * @brief deallocating the memory of F1reset msg
8038 * Function : FreeF1ResetReq
8041 * - freeing memory of F1reset request msg
8047 * ****************************************************************/
8048 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
8051 Reset_t *f1ResetMsg;
8055 if(f1apMsg->choice.initiatingMessage)
8057 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
8059 if(f1ResetMsg->protocolIEs.list.array)
8061 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
8063 if(f1ResetMsg->protocolIEs.list.array[idx])
8065 DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
8068 DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
8070 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8072 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8075 /*******************************************************************
8077 * @brief Build and Send F1reset request
8081 * Function : BuildAndSendF1ResetReq
8084 * - Build and Send F1reset request msg
8087 * @return ROK - success
8090 * ****************************************************************/
8091 uint8_t BuildAndSendF1ResetReq()
8093 uint8_t elementCnt=0;
8095 uint8_t ret= RFAILED;
8096 Reset_t *f1ResetMsg = NULLP;
8097 F1AP_PDU_t *f1apMsg = NULLP;
8098 asn_enc_rval_t encRetVal;
8099 DU_LOG("\nF1AP : Building F1 Reset request \n");
8102 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8103 if(f1apMsg == NULLP)
8107 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8108 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
8109 if(f1apMsg->choice.initiatingMessage == NULLP)
8113 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
8114 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
8115 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
8117 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
8120 f1ResetMsg->protocolIEs.list.count = elementCnt;
8121 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
8123 /* Initialize the F1Setup members */
8124 DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
8125 if(f1ResetMsg->protocolIEs.list.array == NULLP)
8129 for(idx=0; idx<elementCnt; idx++)
8131 DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
8132 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
8140 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
8141 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8142 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
8143 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
8147 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
8148 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
8149 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
8150 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
8151 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
8155 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
8156 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8157 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
8158 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
8159 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
8161 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8163 /* Encode the F1SetupRequest type as APER */
8164 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8166 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8169 /* Encode results */
8170 if(encRetVal.encoded == ENCODE_FAIL)
8172 DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
8173 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8178 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
8179 for(idx=0; idx< encBufSize; idx++)
8181 printf("%x",encBuf[idx]);
8185 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
8187 DU_LOG("\nF1AP : Sending F1 Reset request failed");
8195 FreeF1ResetReq(f1apMsg);
8198 /*******************************************************************
8200 * @brief Build And Send F1ResetAck
8204 * Function : BuildAndSendF1ResetAck
8207 * - Build And Send F1ResetRSP
8209 * @return ROK - success
8212 * ****************************************************************/
8213 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
8216 ResetAcknowledge_t *f1ResetAck;
8220 if(f1apMsg->choice.successfulOutcome)
8222 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
8224 if(f1ResetAck->protocolIEs.list.array)
8226 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
8228 if(f1ResetAck->protocolIEs.list.array[idx])
8230 DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
8233 DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
8235 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
8237 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
8241 /*******************************************************************
8243 * @brief Build And Send F1ResetAck
8247 * Function : BuildAndSendF1ResetAck
8250 * - Build And Send F1ResetRSP
8253 * @return ROK - success
8256 * ****************************************************************/
8257 uint8_t BuildAndSendF1ResetAck()
8260 uint8_t elementCnt = 0;
8261 uint8_t ret = RFAILED;
8262 F1AP_PDU_t *f1apMsg = NULL;
8263 ResetAcknowledge_t *f1ResetAck = NULLP;
8264 asn_enc_rval_t encRetVal;
8265 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
8268 /* Allocate the memory for F1ResetRequest_t */
8269 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8270 if(f1apMsg == NULLP)
8272 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
8276 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
8278 DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
8279 if(f1apMsg->choice.successfulOutcome == NULLP)
8281 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
8284 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
8285 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
8286 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
8290 f1ResetAck->protocolIEs.list.count = elementCnt;
8291 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
8293 DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
8294 if(f1ResetAck->protocolIEs.list.array == NULLP)
8296 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
8300 for(idx=0; idx<elementCnt; idx++)
8302 DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
8303 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
8310 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
8311 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
8312 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
8313 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
8315 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8317 /* Encode the F1SetupRequest type as UPER */
8318 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8320 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
8322 /* Check encode results */
8323 if(encRetVal.encoded == ENCODE_FAIL)
8325 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
8326 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8331 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck\n");
8332 for(int i=0; i< encBufSize; i++)
8334 printf("%x",encBuf[i]);
8338 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
8340 DU_LOG("\nF1AP : Sending F1 Reset Acknowledgement failed");
8348 FreeF1ResetAck(f1apMsg);
8352 /******************************************************************
8354 * @brief Processes DL RRC Message Transfer sent by CU
8358 * Function : procF1ResetReq
8360 * Functionality: Processes DL RRC Message Transfer sent by CU
8362 * @params[in] F1AP_PDU_t ASN decoded F1AP message
8363 * @return ROK - success
8366 * ****************************************************************/
8367 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
8369 /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
8372 Reset_t *f1ResetMsg = NULLP;
8374 DU_LOG("\nProcessing F1 reset request");
8375 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
8377 for(idx=0; idx<f1ResetMsg->protocolIEs.list.count; idx++)
8379 switch(f1ResetMsg->protocolIEs.list.array[idx]->id)
8381 case ProtocolIE_ID_id_TransactionID:
8384 case ProtocolIE_ID_id_Cause:
8387 case ProtocolIE_ID_id_ResetType:
8389 DU_LOG("\nReceived F1 Reset request");
8397 ret = BuildAndSendF1ResetAck();
8398 DU_LOG("\nUE release is not supported for now");
8402 /*******************************************************************
8404 * @brief free the RRC delivery report
8408 * Function : freeRrcDeliveryReport
8410 * Functionality: free the RRC delivery report
8413 * @return ROK - success
8416 * ****************************************************************/
8417 void freeRrcDeliveryReport(F1AP_PDU_t *f1apMsg )
8420 RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
8424 if(f1apMsg->choice.initiatingMessage)
8426 rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
8427 if(rrcDeliveryReport->protocolIEs.list.array)
8429 for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
8432 if(rrcDeliveryReport->protocolIEs.list.array[idx])
8434 DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
8435 sizeof(RRCDeliveryReportIEs_t));
8438 DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
8439 rrcDeliveryReport->protocolIEs.list.size);
8441 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
8444 sizeof(F1AP_PDU_t));
8448 /*******************************************************************
8450 * @brief Builds and sends the RRC delivery report
8454 * Function : BuildAndSendRrcDeliveryReport
8456 * Functionality: Builds and sends the RRC delivery report
8460 * @return ROK - success
8463 * ****************************************************************/
8464 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
8465 uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
8467 uint8_t ret = RFAILED;
8470 uint8_t elementCnt = 0;
8471 F1AP_PDU_t *f1apMsg = NULLP;
8472 asn_enc_rval_t encRetVal;
8473 RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
8477 DU_LOG("\nF1AP : Building RRC delivery Message Transfer Message\n");
8478 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8479 if(f1apMsg == NULLP)
8481 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
8484 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8485 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
8486 if(f1apMsg->choice.initiatingMessage == NULLP)
8488 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
8491 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
8492 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
8493 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
8495 rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
8497 rrcDeliveryReport->protocolIEs.list.count = elementCnt;
8498 rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
8500 /* Initialize the F1Setup members */
8501 DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
8502 if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
8504 DU_LOG(" F1AP : Memory allocation for RRC Delivery failed");
8507 for(idx =0 ;idx <elementCnt; idx++)
8509 DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
8510 if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
8518 /*GNB CU UE F1AP ID*/
8519 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8520 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
8521 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
8522 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
8524 /*GNB DU UE F1AP ID*/
8526 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8527 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
8528 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
8529 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
8531 /*RRC delivery status*/
8533 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
8534 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
8535 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
8536 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
8537 rrcDelivery->rrcDeliveryStatus.deliveryStatus;
8538 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
8539 rrcDelivery->rrcDeliveryStatus.triggeringMessage;
8543 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
8544 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
8545 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
8546 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID = rrcDelivery->srbId;
8548 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8550 /* Encode the RRC DELIVERY REPORT type as APER */
8551 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8553 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8556 /* Encode results */
8557 if(encRetVal.encoded == ENCODE_FAIL)
8559 DU_LOG("\nF1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
8560 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8565 DU_LOG("\nF1AP : Created APER encoded buffer for RRC Delivery Msg \n");
8566 for(idx=0; idx< encBufSize; idx++)
8568 printf("%x",encBuf[idx]);
8573 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
8575 DU_LOG("\nF1AP : Sending RRC delivery msg request failed");
8583 freeRrcDeliveryReport(f1apMsg);
8587 /*******************************************************************
8589 * @brief Processes cells to be activated
8593 * Function : extractCellsToBeActivated
8596 * - Processes cells to be activated list received in F1SetupRsp
8599 * @return ROK - success
8602 * ****************************************************************/
8604 uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
8607 uint16_t idx, nci, pci = 0;
8608 Cells_to_be_Activated_List_Item_t cell;
8610 for(idx=0; idx<cellsToActivate.list.count; idx++)
8613 cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
8614 bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
8620 ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
8625 /******************************************************************
8627 * @brief Processes F1 Setup Response sent by CU
8631 * Function : procF1SetupRsp
8633 * Functionality: Processes F1 Setup Response sent by CU
8635 * @params[in] F1AP_PDU_t ASN decoded F1AP message
8636 * @return ROK - success
8639 * ****************************************************************/
8640 uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
8644 F1SetupResponse_t *f1SetRspMsg = NULLP;
8645 GNB_CU_Name_t *cuName = NULLP;
8646 RRC_Version_t *rrc_Ver = NULLP;
8647 F1SetupRsp f1SetRspDb;
8648 memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
8650 DU_LOG("\nF1AP : F1 Setup Response received");
8651 f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
8653 for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
8655 switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
8657 case ProtocolIE_ID_id_Cells_to_be_Activated_List:
8659 extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
8660 value.choice.Cells_to_be_Activated_List);
8663 case ProtocolIE_ID_id_TransactionID:
8665 f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
8666 value.choice.TransactionID;
8669 case ProtocolIE_ID_id_gNB_CU_Name:
8671 cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
8672 value.choice.GNB_CU_Name;
8673 strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
8676 case ProtocolIE_ID_id_GNB_CU_RRC_Version:
8678 rrc_Ver = &f1SetRspMsg->protocolIEs.list.array[idx]->\
8679 value.choice.RRC_Version;
8680 strcpy(f1SetRspDb.rrcVersion.rrcVer,
8681 (const char*)rrc_Ver->latest_RRC_Version.buf);
8685 DU_LOG("\nDU_APP : Invalid IE received in F1SetupRsp:%ld",
8686 f1SetRspMsg->protocolIEs.list.array[idx]->id);
8693 /*******************************************************************
8695 * @brief Processes GNB DU config update ack
8699 * Function : procF1GNBDUCfgUpdAck
8701 * Functionality: Processes GNB DU config update ack
8703 * @params[in] F1AP_PDU_t ASN decoded F1AP message
8704 * @return ROK - success
8707 * ****************************************************************/
8708 uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
8710 uint8_t ieIdx, transId;
8711 GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
8713 gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
8715 for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
8717 switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
8719 case ProtocolIE_ID_id_TransactionID:
8720 transId = gnbDuAck->protocolIEs.list.array[ieIdx]->\
8721 value.choice.TransactionID;
8722 DU_LOG("\nF1AP : GNB-DU config update acknowledgment received for transId %d", transId);
8724 case ProtocolIE_ID_id_Cells_to_be_Activated_List:
8727 DU_LOG("\nF1AP: Invalid IE Received: %ld, at procF1GNBDUCfgUpdAck()", \
8728 gnbDuAck->protocolIEs.list.array[ieIdx]->id);
8732 duProcGnbDuCfgUpdAckMsg();
8734 if(BuildAndSendF1ResetReq() != ROK)
8742 /******************************************************************
8744 * @brief Processes DL RRC Message Transfer sent by CU
8748 * Function : procF1DlRrcMsgTrans
8750 * Functionality: Processes DL RRC Message Transfer sent by CU
8752 * @params[in] F1AP_PDU_t ASN decoded F1AP message
8753 * @return ROK - success
8756 * ****************************************************************/
8757 uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
8760 DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
8762 memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
8764 DU_LOG("\nDU_APP : DL RRC message transfer Recevied");
8765 f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
8769 for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
8771 switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
8773 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
8775 dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
8778 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
8780 dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
8783 case ProtocolIE_ID_id_SRBID:
8785 dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
8788 case ProtocolIE_ID_id_ExecuteDuplication:
8789 dlMsg.execDup = true;
8792 case ProtocolIE_ID_id_RRCContainer:
8794 if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
8796 dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
8797 DU_ALLOC(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
8800 memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
8805 DU_LOG("\nDU_APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
8811 DU_LOG("\nDU_APP : RRC Container Size is invalid:%ld",\
8812 f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
8817 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
8819 dlMsg.deliveryStatRpt = true;
8823 DU_LOG("\nDU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
8824 f1DlRrcMsg->protocolIEs.list.array[idx]->id);
8828 ret = duProcDlRrcMsg(&dlMsg);
8832 /*****************************************************************i
8834 * @brief Handles received F1AP message and sends back response
8838 * Function : F1APMsgHdlr
8841 * - Decodes received F1AP control message
8842 * - Prepares response message, encodes and sends to SCTP
8845 * @return ROK - success
8848 * ****************************************************************/
8849 void F1APMsgHdlr(Buffer *mBuf)
8855 F1AP_PDU_t *f1apMsg;
8856 asn_dec_rval_t rval; /* Decoder return value */
8857 F1AP_PDU_t f1apasnmsg ;
8859 DU_LOG("\nF1AP : Received F1AP message buffer");
8860 ODU_PRINT_MSG(mBuf, 0,0);
8862 /* Copy mBuf into char array to decode it */
8863 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8864 DU_ALLOC(recvBuf, (Size)recvBufLen);
8866 if(recvBuf == NULLP)
8868 DU_LOG("\nF1AP : Memory allocation failed");
8871 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8873 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
8877 printf("\nF1AP : Received flat buffer to be decoded : ");
8878 for(i=0; i< recvBufLen; i++)
8880 printf("%x",recvBuf[i]);
8883 /* Decoding flat buffer into F1AP messsage */
8884 f1apMsg = &f1apasnmsg;
8885 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
8887 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
8888 DU_FREE(recvBuf, (Size)recvBufLen);
8890 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8892 DU_LOG("\nF1AP : ASN decode failed");
8896 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8898 switch(f1apMsg->present)
8900 case F1AP_PDU_PR_successfulOutcome:
8902 switch(f1apMsg->choice.successfulOutcome->value.present)
8904 case SuccessfulOutcome__value_PR_ResetAcknowledge:
8906 DU_LOG("\nF1AP : F1ResetAcknowledge is received successfully ");
8909 case SuccessfulOutcome__value_PR_F1SetupResponse:
8911 #ifndef ODU_TEST_STUB
8912 procF1SetupRsp(f1apMsg);
8917 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
8919 procF1GNBDUCfgUpdAck(f1apMsg);
8925 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
8928 }/* End of switch(successfulOutcome) */
8931 case F1AP_PDU_PR_initiatingMessage:
8933 switch(f1apMsg->choice.initiatingMessage->value.present)
8935 case InitiatingMessage__value_PR_Reset:
8937 DU_LOG("\nF1AP : F1 reset request received");
8938 procF1ResetReq(f1apMsg);
8941 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
8943 procF1DlRrcMsgTrans(f1apMsg);
8946 case InitiatingMessage__value_PR_UEContextSetupRequest:
8948 procF1UeContextSetupReq(f1apMsg);
8954 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
8955 f1apMsg->choice.initiatingMessage->value.present);
8958 }/* End of switch(initiatingMessage) */
8964 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
8968 }/* End of switch(f1apMsg->present) */
8970 } /* End of F1APMsgHdlr */
8972 /**********************************************************************
8974 **********************************************************************/