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"
30 #include "GNB-DU-System-Information.h"
31 #include "CellGroupConfigRrc.h"
32 #include "MAC-CellGroupConfig.h"
33 #include "SchedulingRequestConfig.h"
34 #include "SchedulingRequestToAddMod.h"
35 #include "BSR-Config.h"
36 #include "TAG-Config.h"
38 #include "PHR-Config.h"
39 #include "RLC-Config.h"
40 #include "UL-AM-RLC.h"
41 #include "DL-AM-RLC.h"
42 #include "LogicalChannelConfig.h"
43 #include "RLC-BearerConfig.h"
44 #include "PhysicalCellGroupConfig.h"
45 #include "SpCellConfig.h"
46 #include "TDD-UL-DL-ConfigDedicated.h"
47 #include "ServingCellConfig.h"
48 #include "ControlResourceSet.h"
49 #include "SearchSpace.h"
50 #include "PDCCH-Config.h"
51 #include "PDSCH-TimeDomainResourceAllocation.h"
52 #include "PDSCH-TimeDomainResourceAllocationList.h"
53 #include "PDSCH-CodeBlockGroupTransmission.h"
54 #include "PDSCH-ServingCellConfig.h"
55 #include "DMRS-DownlinkConfig.h"
56 #include "PDSCH-Config.h"
57 #include "BWP-DownlinkDedicated.h"
58 #include "PUSCH-TimeDomainResourceAllocation.h"
59 #include "PUSCH-TimeDomainResourceAllocationList.h"
60 #include "DMRS-UplinkConfig.h"
61 #include "PUSCH-Config.h"
62 #include "SRS-ResourceId.h"
63 #include "SRS-Resource.h"
64 #include "SRS-ResourceSet.h"
65 #include "SRS-Config.h"
66 #include "BWP-UplinkDedicated.h"
67 #include "PUSCH-ServingCellConfig.h"
68 #include "UplinkConfig.h"
69 #include "DUtoCURRCContainer.h"
70 #include "GBR-QoSFlowInformation.h"
71 #include "QoSFlowLevelQoSParameters.h"
72 #include<ProtocolIE-Field.h>
73 #include "ProtocolExtensionField.h"
75 #include "odu_common_codec.h"
77 #include "du_f1ap_msg_hdl.h"
79 extern DuCfgParams duCfgParam;
81 uint8_t procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg);
82 uint8_t procDlRrcMsgTrans(F1AP_PDU_t *f1apMsg);
83 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg);
84 uint8_t sctpSend(Buffer *mBuf, uint8_t itfType);
85 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp);
87 /*******************************************************************
89 * @brief Builds Uplink Info for NR
93 * Function : BuildULNRInfo
95 * Functionality: Building NR Uplink Info
97 * @params[in] NRFreqInfo_t *ulnrfreq
98 * @return ROK - success
101 * ****************************************************************/
102 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
105 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
106 fdd.ulNrFreqInfo.nrArfcn;
107 ulnrfreq->freqBandListNr.list.count = 1;
108 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
109 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
110 if(ulnrfreq->freqBandListNr.list.array == NULLP)
114 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
116 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
117 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
122 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
123 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
124 freqBand[0].nrFreqBand;
125 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
128 /*******************************************************************
130 * @brief Builds Downlink NR Info
134 * Function : BuildDLNRInfo
136 * Functionality: Building Downlink NR Info
138 * @params[in] NRFreqInfo_t *dlnrfreq
139 * @return ROK - success
142 * ****************************************************************/
143 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
146 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
147 fdd.dlNrFreqInfo.nrArfcn;
148 dlnrfreq->freqBandListNr.list.count = 1;
149 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
150 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
151 if(dlnrfreq->freqBandListNr.list.array == NULLP)
155 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
157 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
158 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
163 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
164 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
165 freqBand[0].nrFreqBand;
166 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
171 /*******************************************************************
173 * @brief Builds Nrcgi
177 * Function : BuildNrcgi
179 * Functionality: Building the PLMN ID and NR Cell id
181 * @params[in] NRCGI_t *nrcgi
182 * @return ROK - success
185 * ****************************************************************/
186 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
190 uint8_t byteSize = 5;
192 /* Allocate Buffer Memory */
193 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
194 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
195 if(nrcgi->pLMN_Identity.buf == NULLP)
199 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
200 nrcgi->pLMN_Identity.buf); // Building PLMN function
206 //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
207 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
208 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
209 if(nrcgi->nRCellIdentity.buf == NULLP)
213 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
220 /*******************************************************************
222 * @brief Builds FiveGStac
226 * Function : BuildFiveGSTac
228 * Functionality: Building the FiveGSTac
230 * @params[in] OCTET_STRING_t *fivegsTac
231 * @return ROK - success
234 * ****************************************************************/
235 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
237 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
238 if(servcell->fiveGS_TAC == NULLP)
242 servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
243 DU_ALLOC(servcell->fiveGS_TAC->buf,\
244 sizeof(servcell->fiveGS_TAC->size));
245 if(servcell->fiveGS_TAC->buf == NULLP)
249 servcell->fiveGS_TAC->buf[0] = 0;
250 servcell->fiveGS_TAC->buf[1] = 0;
251 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
254 /*******************************************************************
256 * @brief Builds NR Mode
260 * Function : BuildNrMode
262 * Functionality: Building the NR Mode
264 * @params[in] NR_Mode_Info_t *fdd
265 * @return ROK - success
268 * ****************************************************************/
269 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
271 uint8_t BuildDLNRInforet=0;
272 uint8_t BuildULNRInforet=0;
274 mode->present = NR_Mode_Info_PR_fDD;
275 if(mode->present == NR_Mode_Info_PR_fDD)
277 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
278 if(mode->choice.fDD == NULLP)
282 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
283 if(BuildULNRInforet != ROK)
287 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
288 if(BuildDLNRInforet != ROK)
293 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
294 duCfgParam.srvdCellLst[0].duCellInfo.\
295 f1Mode.mode.fdd.ulTxBw.nrScs;
296 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
297 duCfgParam.srvdCellLst[0].duCellInfo.\
298 f1Mode.mode.fdd.ulTxBw.nrb;
299 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
300 duCfgParam.srvdCellLst[0].duCellInfo.\
301 f1Mode.mode.fdd.dlTxBw.nrScs;
302 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
303 duCfgParam.srvdCellLst[0].duCellInfo.\
304 f1Mode.mode.fdd.dlTxBw.nrb;
307 /*******************************************************************
309 * @brief Builds IE Extensions for Served PLMNs
313 * Function : BuildExtensions
315 * Functionality: Building the IE Extensions
317 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
318 * @return ROK - success
321 * ****************************************************************/
322 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
326 uint8_t extensionCnt=1;
329 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
330 if((*ieExtend) == NULLP)
334 (*ieExtend)->list.count = extensionCnt;
335 (*ieExtend)->list.size = \
336 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
337 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
338 if((*ieExtend)->list.array == NULLP)
342 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
344 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
345 sizeof(ServedPLMNs_ItemExtIEs_t));
346 if((*ieExtend)->list.array[plmnidx] == NULLP)
352 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
353 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
354 (*ieExtend)->list.array[idx]->extensionValue.present = \
355 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
356 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
358 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
359 list.size = sizeof(SliceSupportItem_t *);
360 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
361 list.array,sizeof(SliceSupportItem_t *));
362 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
367 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
368 list.array[sliceId],sizeof(SliceSupportItem_t));
369 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
370 list.array[sliceId] == NULLP)
374 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
375 list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
376 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
377 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
378 extensionValue.choice.SliceSupportList.\
379 list.array[sliceId]->sNSSAI.sST.size);
380 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
381 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
385 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
386 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
387 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
388 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
389 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
390 list.array[sliceId]->sNSSAI.sD == NULLP)
394 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
395 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
396 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
397 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
398 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
399 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
400 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
405 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
406 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
408 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
409 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
411 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
412 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
415 /*******************************************************************
417 * @brief Builds Served PLMN
421 * Function : BuildServedPlmn
423 * Functionality: Building the Served PLMN
425 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
426 * @return ROK - success
429 * ****************************************************************/
430 uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
433 uint8_t servPlmnCnt=1;
434 uint8_t buildPlmnIdret=0;
435 uint8_t BuildExtensionsret=0;
436 srvplmn->list.count = servPlmnCnt;
437 srvplmn->list.size = \
438 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
439 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
440 if(srvplmn->list.array == NULLP)
444 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
446 DU_ALLOC(srvplmn->list.array[plmnidx],\
447 sizeof(ServedPLMNs_Item_t));
448 if(srvplmn->list.array[plmnidx] == NULLP)
453 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
454 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
455 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
456 srvplmn->list.array[0]->pLMN_Identity.buf);
457 if(buildPlmnIdret!= ROK)
461 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
462 if(BuildExtensionsret!= ROK)
468 /*******************************************************************
470 * @brief Builds Served Cell List
474 * Function : BuildServedCellList
476 * Functionality: Building Served Cell List
478 * @params[in] PLMNID plmn
479 * @return ROK - success
482 * ****************************************************************/
484 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
486 uint8_t BuildNrcgiret=0;
487 uint8_t BuildFiveGSTacret=0;
488 uint8_t BuildServedPlmnret=0;
489 uint8_t BuildNrModeret=0;
493 GNB_DU_Served_Cells_Item_t *srvCellItem;
494 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
495 duServedCell->list.count = plmnCnt;
497 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
498 if(duServedCell->list.array == NULLP)
502 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
504 DU_ALLOC(duServedCell->list.array[plmnidx],\
505 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
506 if(duServedCell->list.array[plmnidx] == NULLP)
512 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
513 duServedCell->list.array[idx]->criticality = Criticality_reject;
514 duServedCell->list.array[idx]->value.present = \
515 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
517 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
519 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
520 if(BuildNrcgiret != ROK)
525 srvCellItem->served_Cell_Information.nRPCI = \
526 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
529 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
530 if(BuildFiveGSTacret != ROK)
535 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
536 if(BuildServedPlmnret !=ROK)
540 /*nR Mode Info with FDD*/
541 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
542 if(BuildNrModeret != ROK)
546 /*Measurement timing Config*/
547 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
548 size = sizeof(uint8_t);
549 DU_ALLOC(srvCellItem->served_Cell_Information.\
550 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
551 if(srvCellItem->served_Cell_Information.\
552 measurementTimingConfiguration.buf == NULLP)
556 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
557 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
559 /* GNB DU System Information */
560 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
561 sizeof(GNB_DU_System_Information_t));
562 if(!srvCellItem->gNB_DU_System_Information)
567 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
568 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
569 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
570 srvCellItem->gNB_DU_System_Information->mIB_message.size);
571 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
575 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
576 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
579 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
580 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
582 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
583 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
584 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
588 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
590 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
591 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
595 /*******************************************************************
597 * @brief Builds RRC Version
601 * Function : BuildRrcVer
603 * Functionality: Building RRC Version
605 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
606 * @return ROK - success
609 * ****************************************************************/
610 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
614 rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
615 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
616 if(rrcVer->latest_RRC_Version.buf == NULLP)
620 rrcVer->latest_RRC_Version.buf[0] = 0;
621 rrcVer->latest_RRC_Version.bits_unused = 5;
622 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
623 if(rrcVer->iE_Extensions == NULLP)
627 rrcVer->iE_Extensions->list.count = 1;
628 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
629 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
630 if(rrcVer->iE_Extensions->list.array == NULLP)
635 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
636 sizeof(RRC_Version_ExtIEs_t));
637 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
641 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
642 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
643 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
644 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
645 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
646 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
647 .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
648 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
649 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
650 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
651 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
652 .Latest_RRC_Version_Enhanced.buf == NULLP)
657 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
658 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
660 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
661 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
663 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
664 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
667 /*******************************************************************
669 * @brief Sends F1 msg over SCTP
673 * Function : SendF1APMsg
675 * Functionality: Sends F1 msg over SCTP
677 * @params[in] Region region
679 * @return ROK - success
682 * ****************************************************************/
683 uint8_t SendF1APMsg(Region region, Pool pool)
687 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
689 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
691 ODU_PRINT_MSG(mBuf, 0,0);
693 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
695 DU_LOG("\nF1AP : SCTP Send failed");
696 ODU_PUT_MSG_BUF(mBuf);
702 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
703 ODU_PUT_MSG_BUF(mBuf);
706 ODU_PUT_MSG_BUF(mBuf);
710 DU_LOG("\nF1AP : Failed to allocate memory");
716 /*******************************************************************
718 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
722 * Function : FreeRrcVer
724 * Functionality: deallocating the memory of function BuildRrcVer
726 * @params[in] RRC_Version_t *rrcVer
730 *****************************************************************/
731 void FreeRrcVer(RRC_Version_t *rrcVer)
733 if(rrcVer->latest_RRC_Version.buf != NULLP)
735 if(rrcVer->iE_Extensions != NULLP)
737 if(rrcVer->iE_Extensions->list.array != NULLP)
739 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
741 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
744 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
745 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
746 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
748 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
750 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
752 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
754 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
757 /*******************************************************************
759 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
763 * Function : FreeServedCellList
765 * Functionality: deallocating the memory of function BuildServedCellList
768 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
772 * ****************************************************************/
773 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
779 uint8_t extensionCnt=1;
781 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
782 if(duServedCell->list.array!=NULLP)
784 if(duServedCell->list.array[0]!=NULLP)
786 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
788 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
790 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
792 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
794 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
796 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
798 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
800 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
802 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
804 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
806 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
807 extensionValue.choice.SliceSupportList.list.array!=NULLP)
809 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
810 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
812 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
813 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
815 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
816 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
818 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
819 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
821 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
823 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
824 freqBandListNr.list.array!=NULLP)
826 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
827 freqBandListNr.list.array[0]!=NULLP)
829 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
830 freqBandListNr.list.array)
832 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
833 freqBandListNr.list.array[0]!=NULLP)
835 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
837 if(!srvCellItem->gNB_DU_System_Information)
839 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
841 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
843 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
844 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
845 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
846 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
848 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
849 srvCellItem->gNB_DU_System_Information->mIB_message.size);
850 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
851 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
853 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
855 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
856 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
858 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
859 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
861 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
862 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
864 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
865 list.array[0],sizeof(FreqBandNrItem_t));
867 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
868 list.array,sizeof(FreqBandNrItem_t*));
870 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
872 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
873 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
874 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
875 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
877 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
878 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
879 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
881 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
882 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
883 sNSSAI.sST.buf,sizeof(uint8_t));
885 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
886 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
888 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
889 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
891 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
892 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
894 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
895 array[servId]->iE_Extensions->list.array,\
896 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
898 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
899 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
901 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
902 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
903 servedPLMNs.list.array[servId]->pLMN_Identity.size
906 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
907 sizeof(ServedPLMNs_Item_t *));
909 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
910 sizeof(ServedPLMNs_Item_t *));
912 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
913 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
915 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
917 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
918 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
921 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
922 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
925 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
927 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
930 /*******************************************************************
932 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
936 * Function : FreeF1SetupReq
938 * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
940 * @params[in] F1AP_PDU_t *f1apMsg
944 * ****************************************************************/
945 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
949 F1SetupRequest_t *f1SetupReq=NULLP;
954 if(f1apMsg->choice.initiatingMessage != NULLP)
956 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
957 if(f1SetupReq->protocolIEs.list.array != NULLP)
959 if(f1SetupReq->protocolIEs.list.array[idx1]!=NULLP)
961 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf != NULLP)
963 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
964 f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
966 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf != NULLP)
968 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf,
969 strlen((char *)duCfgParam.duName));
972 FreeServedCellList(&f1SetupReq->protocolIEs.list.array[idx1]->value.\
973 choice.GNB_DU_Served_Cells_List);
976 FreeRrcVer(&f1SetupReq->protocolIEs.list.array[idx1]->value.choice.RRC_Version);
980 for(idx=0; idx<f1SetupReq->protocolIEs.list.count; idx++)
982 if(f1SetupReq->protocolIEs.list.array[idx]!=NULLP)
984 DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
987 DU_FREE(f1SetupReq->protocolIEs.list.array,\
988 f1SetupReq->protocolIEs.list.size);
990 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
992 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
996 /*******************************************************************
998 * @brief Builds and Send the F1SetupRequest
1002 * Function : BuildAndSendF1SetupReq
1004 * Functionality:Fills the F1SetupRequest
1006 * @return ROK - success
1009 ******************************************************************/
1010 uint8_t BuildAndSendF1SetupReq()
1015 uint8_t elementCnt=0;
1016 F1AP_PDU_t *f1apMsg = NULLP;
1017 F1SetupRequest_t *f1SetupReq=NULLP;
1018 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1019 RRC_Version_t *rrcVer=NULLP;
1020 asn_enc_rval_t encRetVal; /* Encoder return value */
1021 uint8_t ret= RFAILED;
1022 uint8_t BuildRrcVerreturn=0;
1024 DU_LOG("\nF1AP : Building F1 Setup Request\n");
1027 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1028 if(f1apMsg == NULLP)
1032 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1033 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1034 if(f1apMsg->choice.initiatingMessage == NULLP)
1038 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1039 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1040 f1apMsg->choice.initiatingMessage->value.present = \
1041 InitiatingMessage__value_PR_F1SetupRequest;
1043 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1045 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1047 f1SetupReq->protocolIEs.list.count = elementCnt;
1048 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1050 /* Initialize the F1Setup members */
1051 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1052 if(f1SetupReq->protocolIEs.list.array == NULLP)
1056 for(idx=0; idx<elementCnt; idx++)
1058 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
1059 sizeof(F1SetupRequestIEs_t));
1060 if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
1068 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
1069 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1070 f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
1071 F1SetupRequestIEs__value_PR_TransactionID;
1072 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
1077 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
1078 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1079 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1080 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1081 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
1084 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
1085 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
1086 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
1092 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
1096 if(duCfgParam.duName != NULL)
1099 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
1100 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
1101 f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1102 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
1103 strlen((char *)duCfgParam.duName);
1104 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
1105 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1106 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
1111 strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
1112 choice.GNB_DU_Name.buf,
1113 (char*)&duCfgParam.duName);
1117 /*Served Cell list */
1119 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1120 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1121 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1122 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1123 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1124 duServedCell = &f1SetupReq->protocolIEs.list.\
1125 array[idx2]->value.choice.GNB_DU_Served_Cells_List;
1126 if((BuildServedCellList(duServedCell)) != ROK)
1132 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1133 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1134 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1135 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1136 F1SetupRequestIEs__value_PR_RRC_Version;
1137 rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1138 BuildRrcVerreturn = BuildRrcVer(rrcVer);
1139 if(BuildRrcVerreturn != ROK)
1143 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1145 /* Encode the F1SetupRequest type as APER */
1146 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1148 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1151 /* Encode results */
1152 if(encRetVal.encoded == ENCODE_FAIL)
1154 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1155 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1160 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1161 for(i=0; i< encBufSize; i++)
1163 printf("%x",encBuf[i]);
1168 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1170 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1178 FreeF1SetupReq(f1apMsg);
1181 }/* End of BuildAndSendF1SetupReq */
1183 /*******************************************************************
1185 * @brief Builds and sends the DUConfigUpdate
1189 * Function : BuildAndSendDUConfigUpdate
1191 * Functionality: Constructs the DU Update message and sends
1192 * it to the CU through SCTP.
1194 * @params[in] void **buf,Buffer to which encoded pattern is written into
1195 * @params[in] int *size,size of buffer
1197 * @return ROK - success
1200 * ****************************************************************/
1201 uint8_t BuildAndSendDUConfigUpdate()
1210 uint8_t servPlmnCnt;
1211 uint8_t extensionCnt;
1212 asn_enc_rval_t encRetVal; /* Encoder return value */
1213 F1AP_PDU_t *f1apDuCfg = NULL;
1214 GNBDUConfigurationUpdate_t *duCfgUpdate;
1215 Served_Cells_To_Modify_List_t *cellsToModify;
1216 Served_Cells_To_Modify_Item_t *modifyItem;
1217 uint8_t ret= RFAILED;
1222 DU_LOG("\nF1AP : Building DU config update\n");
1223 /* Allocate the memory for F1DuCfg */
1224 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1225 if(f1apDuCfg == NULLP)
1227 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1231 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1232 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1233 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1235 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1239 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1240 ProcedureCode_id_gNBDUConfigurationUpdate;
1241 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1242 f1apDuCfg->choice.initiatingMessage->value.present = \
1243 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1244 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1245 choice.GNBDUConfigurationUpdate;
1247 duCfgUpdate->protocolIEs.list.count = elementCnt;
1248 duCfgUpdate->protocolIEs.list.size = \
1249 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1251 /* Initialize the F1Setup members */
1252 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1253 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1255 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1258 for(idx=0;idx<elementCnt;idx++)
1260 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1261 if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1269 duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1270 duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1271 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1272 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1273 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1276 /*Served Cell to Modify */
1278 duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1279 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1280 duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1281 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1282 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1283 cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1284 Served_Cells_To_Modify_List;
1286 cellsToModify->list.count = modifyCnt;
1287 cellsToModify->list.size = \
1288 modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1289 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1290 if(cellsToModify->list.array == NULLP)
1294 for(idy=0; idy<modifyCnt ;idy++)
1296 DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1297 Served_Cells_To_Modify_ItemIEs_t));
1298 if(cellsToModify->list.array[idy] == NULLP)
1303 cellsToModify->list.array[0]->id = \
1304 ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1305 cellsToModify->list.array[0]->criticality = Criticality_reject;
1306 cellsToModify->list.array[0]->value.present =\
1307 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1308 modifyItem=&cellsToModify->list.array[0]->value.choice.\
1309 Served_Cells_To_Modify_Item;
1312 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1313 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1314 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1318 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1319 modifyItem->oldNRCGI.pLMN_Identity.buf);
1322 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1323 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1324 modifyItem->oldNRCGI.nRCellIdentity.size);
1325 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1329 for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1331 modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1333 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1334 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1337 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1338 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1339 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1340 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1344 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1345 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf);
1346 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1347 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1348 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1349 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1353 for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1354 nRCGI.nRCellIdentity.size-1 ; tmp++)
1356 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1358 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1359 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1361 modifyItem->served_Cell_Information.nRPCI = \
1362 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1365 modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1366 modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1367 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1368 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1369 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1370 if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1374 for(idy1=0;idy1<servPlmnCnt;idy1++)
1376 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1377 sizeof(ServedPLMNs_Item_t));
1378 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1383 modifyItem->served_Cell_Information.servedPLMNs.list.\
1384 array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1385 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1386 array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1387 array[0]->pLMN_Identity.size);
1388 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1389 array[0]->pLMN_Identity.buf == NULLP)
1393 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1394 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity.buf);
1395 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1396 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1397 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1398 array[0]->iE_Extensions == NULLP)
1403 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1404 iE_Extensions->list.count = extensionCnt;
1405 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1406 iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1407 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1408 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1409 iE_Extensions->list.size);
1410 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1411 array[0]->iE_Extensions->list.array == NULLP)
1415 for(idy2=0;idy2<extensionCnt;idy2++)
1417 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1418 array[0]->iE_Extensions->list.array[idy2],\
1419 sizeof(ServedPLMNs_ItemExtIEs_t));
1420 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1421 array[0]->iE_Extensions->list.array[idy2] == NULLP)
1426 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1427 iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1428 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1429 iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1430 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1431 iE_Extensions->list.array[0]->extensionValue.present = \
1432 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1433 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1434 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1436 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1437 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1438 list.size = sizeof(SliceSupportItem_t *);
1439 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1440 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1441 list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1442 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1443 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1444 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1445 list.array == NULLP)
1450 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1451 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1452 list.array[0],sizeof( SliceSupportItem_t));
1453 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1454 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1455 list.array[0] == NULLP)
1459 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1460 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1461 list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1462 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1463 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1464 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1465 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1466 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1467 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1468 list.array[0]->sNSSAI.sST.buf == NULLP)
1472 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1473 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1474 list.array[0]->sNSSAI.sST.buf[0] = 3;
1475 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1476 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1477 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1478 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1479 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1480 list.array[0]->sNSSAI.sD == NULLP)
1484 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1485 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1486 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1487 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1488 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1489 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1490 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1491 list.array[0]->sNSSAI.sD->size);
1492 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1493 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1494 list.array[0]->sNSSAI.sD->buf == NULLP)
1498 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1499 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1500 list.array[0]->sNSSAI.sD->buf[0] = 3;
1501 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1502 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1503 list.array[0]->sNSSAI.sD->buf[1] = 6;
1504 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1505 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1506 list.array[0]->sNSSAI.sD->buf[2] = 9;
1508 /*nR Mode Info with FDD*/
1509 modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1510 NR_Mode_Info_PR_fDD;
1511 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1512 sizeof(FDD_Info_t));
1513 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1517 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1518 uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1519 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1520 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1521 uL_NRFreqInfo.freqBandListNr.list.count = 1;
1522 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1523 uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1524 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1525 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1526 array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1527 uL_NRFreqInfo.freqBandListNr.list.size);
1528 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1529 fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1533 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1534 uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1535 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1536 uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1540 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1541 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1542 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1543 freqBand[0].nrFreqBand;
1544 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1545 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1546 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1547 nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1548 dlNrFreqInfo.nrArfcn;
1549 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1550 freqBandListNr.list.count = 1;
1551 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1552 freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1553 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1554 dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1555 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1556 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1557 dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1561 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1562 dL_NRFreqInfo.freqBandListNr.list.array[0],\
1563 sizeof(FreqBandNrItem_t));
1564 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1565 dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1569 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1570 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1571 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1572 freqBand[0].nrFreqBand;
1573 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1574 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1576 /*Transmission Bandwidth*/
1577 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1578 uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1579 f1Mode.mode.fdd.ulTxBw.nrScs;
1580 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1581 uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1582 f1Mode.mode.fdd.ulTxBw.nrb;
1583 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1584 dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1585 f1Mode.mode.fdd.dlTxBw.nrScs;
1586 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1587 dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1588 f1Mode.mode.fdd.dlTxBw.nrb;
1589 /*Measurement timing Config*/
1590 modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1592 DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1593 buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1594 if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1598 modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1599 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1601 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1604 duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1605 duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1606 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1607 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1608 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1610 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1611 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1612 if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1616 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1619 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1621 /* Encode the DU Config Update type as APER */
1622 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1624 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1626 /* Checking encode results */
1627 if(encRetVal.encoded == ENCODE_FAIL)
1629 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1634 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1635 for(i=0; i< encBufSize; i++)
1637 printf("%x",encBuf[i]);
1641 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1643 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1650 FreeDUConfigUpdate(f1apDuCfg);
1654 /*******************************************************************
1656 * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1660 * Function : FreeDUConfigUpdate
1662 * Functionality: Deallocating memory of variables allocated in
1663 * BuildAndSendDUConfigUpdate function
1665 * @params[in] F1AP_PDU_t *f1apDuCfg
1667 * @return ROK - void
1669 * ****************************************************************/
1670 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1674 GNBDUConfigurationUpdate_t *duCfgUpdate;
1675 Served_Cells_To_Modify_List_t *cellsToModify;
1676 Served_Cells_To_Modify_Item_t *modifyItem;
1679 if(f1apDuCfg != NULLP)
1681 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1683 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1684 value.choice.GNBDUConfigurationUpdate;
1685 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1687 if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
1689 cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
1690 value.choice.Served_Cells_To_Modify_List;
1691 if(cellsToModify->list.array != NULLP)
1693 if(cellsToModify->list.array[idx] != NULLP)
1695 modifyItem=&cellsToModify->list.array[idx]->value.choice.\
1696 Served_Cells_To_Modify_Item;
1697 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1699 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1701 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1703 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1706 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1709 if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
1711 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1712 array[idx]->pLMN_Identity.buf != NULLP)
1714 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1715 array[idx]->iE_Extensions!= NULLP)
1717 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1718 array[idx]->iE_Extensions->list.array != NULLP)
1720 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1721 array[idx]->iE_Extensions->list.array[idx])
1723 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1724 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1727 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1728 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1729 list.array[idx]!=NULLP)
1731 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1732 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1733 list.array[idx]->sNSSAI.sST.buf!=NULLP)
1735 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1736 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1737 list.array[idx]->sNSSAI.sD != NULLP)
1739 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1740 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1741 list.array[idx]->sNSSAI.sD->buf!=NULLP)
1743 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1746 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1747 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1749 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1750 fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
1752 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1753 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1755 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1756 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1759 if(modifyItem->served_Cell_Information.\
1760 measurementTimingConfiguration.buf !=NULLP)
1763 if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
1764 choice.GNB_DU_ID.buf!=NULLP)
1766 DU_FREE(duCfgUpdate->protocolIEs.list.\
1767 array[idx]->value.choice.GNB_DU_ID.buf,\
1768 duCfgUpdate->protocolIEs.list.array[idx]->\
1769 value.choice.GNB_DU_ID.size);
1772 DU_FREE(modifyItem->served_Cell_Information.\
1773 measurementTimingConfiguration.\
1774 buf,modifyItem->served_Cell_Information.\
1775 measurementTimingConfiguration.size);
1777 DU_FREE(modifyItem->served_Cell_Information.\
1778 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1779 list.array[idx],sizeof(FreqBandNrItem_t));
1781 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1782 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1783 modifyItem->served_Cell_Information.nR_Mode_Info.\
1784 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1786 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1787 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1788 array[idx],sizeof(FreqBandNrItem_t));
1790 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1792 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1793 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1794 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1796 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1797 fDD,sizeof(FDD_Info_t));
1799 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1800 array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1802 list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1803 servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
1804 extensionValue.choice.SliceSupportList.list.array[idx]->\
1808 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1810 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1811 list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1813 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1814 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1815 list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
1817 list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1818 SliceSupportList.list.array[idx]->sNSSAI.sST.size);
1820 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1821 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1822 list.array[idx],sizeof(SliceSupportItem_t));
1824 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1825 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1827 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1828 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
1831 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
1832 array[idx]->iE_Extensions->list.count;i++)
1834 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1835 array[idx]->iE_Extensions->list.array[i],\
1836 sizeof(ServedPLMNs_ItemExtIEs_t ));
1838 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1839 array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1840 list.array[idx]->iE_Extensions->list.size);
1842 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1843 array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1845 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1846 array[idx]->pLMN_Identity.buf,
1847 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
1850 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1852 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
1855 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1856 sizeof(ServedPLMNs_Item_t));
1859 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1860 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1862 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1863 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1865 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1866 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1868 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1869 modifyItem->oldNRCGI.nRCellIdentity.size);
1871 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1872 modifyItem->oldNRCGI.pLMN_Identity.size);
1875 for(i=0; i<cellsToModify->list.count ;i++)
1877 if(cellsToModify->list.array[i] != NULLP)
1879 DU_FREE(cellsToModify->list.array[i],\
1880 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1883 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1886 for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
1888 if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
1890 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1891 sizeof(GNBDUConfigurationUpdateIEs_t));
1894 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1896 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1898 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1901 /*******************************************************************
1903 * @brief free the ULRRCMessageTransfer
1907 * Function : FreeULRRCMessageTransfer
1909 * Functionality: Deallocating the memory of variable allocated in
1910 * FreeULRRCMessageTransfer
1914 * @return ROK - void
1916 ******************************************************************/
1917 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
1920 ULRRCMessageTransfer_t *ulRRCMsg;
1922 if(f1apMsg != NULLP)
1924 if(f1apMsg->choice.initiatingMessage != NULLP)
1926 ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1927 if(ulRRCMsg->protocolIEs.list.array != NULLP)
1929 for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
1931 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
1933 if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
1934 ULRRCMessageTransferIEs__value_PR_RRCContainer)
1936 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
1937 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
1939 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
1942 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
1944 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1946 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1949 /*******************************************************************
1951 * @brief Builds and sends the ULRRCMessageTransfer
1955 * Function : BuildAndSendULRRCMessageTransfer
1957 * Functionality: Constructs the UL RRC Message Transfer and sends
1958 * it to the CU through SCTP.
1962 * @return ROK - success
1965 * ****************************************************************/
1966 uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \
1967 uint16_t msgLen, uint8_t *rrcMsg)
1972 F1AP_PDU_t *f1apMsg = NULL;
1973 ULRRCMessageTransfer_t *ulRRCMsg;
1974 asn_enc_rval_t encRetVal; /* Encoder return value */
1975 uint8_t ret =RFAILED;
1978 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1980 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1981 if(f1apMsg == NULLP)
1983 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1987 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1988 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1989 if(f1apMsg->choice.initiatingMessage == NULLP)
1991 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1994 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
1995 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1996 f1apMsg->choice.initiatingMessage->value.present = \
1997 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1999 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2001 ulRRCMsg->protocolIEs.list.count = elementCnt;
2002 ulRRCMsg->protocolIEs.list.size = \
2003 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
2005 /* Initialize the F1Setup members */
2006 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
2007 if(ulRRCMsg->protocolIEs.list.array == NULLP)
2009 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
2012 for(idx=0; idx<elementCnt; idx++)
2014 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
2015 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2023 /*GNB CU UE F1AP ID*/
2024 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2025 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2026 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2027 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2028 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
2030 /*GNB DU UE F1AP ID*/
2032 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2033 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2034 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2035 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2036 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
2040 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
2041 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2042 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2043 ULRRCMessageTransferIEs__value_PR_SRBID;
2044 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
2048 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCContainer;
2049 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2050 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2051 ULRRCMessageTransferIEs__value_PR_RRCContainer;
2052 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
2053 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2054 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
2055 if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
2057 DU_LOG(" F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
2060 memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
2061 rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2063 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2065 /* Encode the F1SetupRequest type as APER */
2066 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2068 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2070 /* Encode results */
2071 if(encRetVal.encoded == ENCODE_FAIL)
2073 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2074 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2079 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2080 for(int i=0; i< encBufSize; i++)
2082 printf("%x",encBuf[i]);
2087 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
2089 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
2095 FreeULRRCMessageTransfer(f1apMsg);
2098 }/* End of BuildAndSendULRRCMessageTransfer*/
2100 /*******************************************************************
2102 * @brief Builds tag config
2106 * Function : BuildTagConfig
2108 * Functionality: Builds tag config in MacCellGroupConfig
2110 * @params[in] TAG_Config *tag_Config
2112 * @return ROK - success
2115 * ****************************************************************/
2116 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2118 struct TAG_Config__tag_ToAddModList *tagList;
2119 uint8_t idx, elementCnt;
2121 tagConfig->tag_ToReleaseList = NULLP;
2122 tagConfig->tag_ToAddModList = NULLP;
2123 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2124 if(!tagConfig->tag_ToAddModList)
2126 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2130 elementCnt = 1; //ODU_VALUE_ONE;
2131 tagList = tagConfig->tag_ToAddModList;
2132 tagList->list.count = elementCnt;
2133 tagList->list.size = elementCnt * sizeof(struct TAG *);
2135 tagList->list.array = NULLP;
2136 DU_ALLOC(tagList->list.array, tagList->list.size);
2137 if(!tagList->list.array)
2139 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2143 for(idx=0; idx<tagList->list.count; idx++)
2145 tagList->list.array[idx] = NULLP;
2146 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2147 if(!tagList->list.array[idx])
2149 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2155 tagList->list.array[idx]->tag_Id = TAG_ID;
2156 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2161 /*******************************************************************
2163 * @brief Builds PHR Config
2167 * Function : BuildPhrConfig
2169 * Functionality: Builds phrConfig in MacCellGroupConfig
2171 * @params[in] PHR Config *
2173 * @return ROK - success
2176 * ****************************************************************/
2177 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2180 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2181 phrConfig->choice.setup = NULLP;
2182 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2183 if(!phrConfig->choice.setup)
2185 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2189 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2190 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2191 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2192 phrConfig->choice.setup->multiplePHR = false;
2193 phrConfig->choice.setup->dummy = false;
2194 phrConfig->choice.setup->phr_Type2OtherCell = false;
2195 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2200 /*******************************************************************
2202 * @brief Builds BSR Config
2206 * Function : BuildBsrConfig
2208 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2210 * @params[in] BSR_Config *bsrConfig
2212 * @return ROK - success
2215 * ****************************************************************/
2216 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2218 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2219 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2220 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2225 /*******************************************************************
2227 * @brief Builds scheduling request config
2231 * Function : BuildSchedulingReqConfig
2233 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2235 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2237 * @return ROK - success
2240 * ****************************************************************/
2241 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2243 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2244 uint8_t idx, elementCnt;
2246 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2247 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2248 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2249 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2251 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2255 elementCnt = 1; //ODU_VALUE_ONE;
2256 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2257 schReqList->list.count = elementCnt;
2258 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2260 schReqList->list.array = NULLP;
2261 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2262 if(!schReqList->list.array)
2264 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2268 for(idx=0;idx<schReqList->list.count; idx++)
2270 schReqList->list.array[idx] = NULLP;
2271 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2272 if(!schReqList->list.array[idx])
2274 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2280 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2282 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2283 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2284 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2286 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2289 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2290 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2291 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2296 /*******************************************************************
2298 * @brief Builds RLC Config
2302 * Function : BuildRlcConfig
2304 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
2306 * @params[in] RLC_Config *rlcConfig
2308 * @return ROK - success
2311 * ****************************************************************/
2312 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2315 rlcConfig->present = RLC_Config_PR_am;
2317 rlcConfig->choice.am = NULLP;
2318 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2319 if(!rlcConfig->choice.am)
2321 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2326 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2327 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2328 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2330 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2333 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2334 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2335 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2336 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2337 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
2340 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2341 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2342 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2344 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2347 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2348 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
2349 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
2354 /*******************************************************************
2356 * @brief Builds MAC LC Config
2360 * Function : BuildMacLCConfig
2362 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
2364 * @params[in] struct LogicalChannelConfig macLcConfig
2366 * @return ROK - success
2369 * ****************************************************************/
2370 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2373 macLcConfig->ul_SpecificParameters = NULLP;
2374 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2375 if(!macLcConfig->ul_SpecificParameters)
2377 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2381 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2382 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
2383 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
2384 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2385 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2386 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2387 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2389 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2390 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2391 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2393 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2396 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2398 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2399 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2400 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2402 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2405 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2407 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2408 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2409 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2414 /*******************************************************************
2416 * @brief Builds RLC Bearer to Add/Mod list
2420 * Function :BuildRlcBearerToAddModList
2422 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2424 * @params[in] rlc_BearerToAddModList
2426 * @return ROK - success
2429 * ****************************************************************/
2430 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2432 uint8_t idx, elementCnt;
2435 rlcBearerList->list.count = elementCnt;
2436 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
2438 rlcBearerList->list.array = NULLP;
2439 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2440 if(!rlcBearerList->list.array)
2442 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2446 for(idx=0; idx<rlcBearerList->list.count; idx++)
2448 rlcBearerList->list.array[idx] = NULLP;
2449 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2450 if(!rlcBearerList->list.array[idx])
2452 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2458 rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
2460 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \
2461 sizeof(struct RLC_BearerConfig__servedRadioBearer));
2462 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2464 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2468 rlcBearerList->list.array[idx]->servedRadioBearer->present = \
2469 RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2470 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \
2473 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2474 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2475 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2476 if(!rlcBearerList->list.array[idx]->rlc_Config)
2478 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2482 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2484 DU_LOG("\nF1AP : BuildRlcConfig failed");
2488 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2489 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \
2490 sizeof(struct LogicalChannelConfig));
2491 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2493 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2497 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2499 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2506 /*******************************************************************
2508 * @brief Build Control resource set to add/modify list
2512 * Function : BuildControlRSetToAddModList
2514 * Functionality: Build Control resource set to add/modify list
2517 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2519 * @return ROK - success
2522 * ****************************************************************/
2523 uint8_t BuildControlRSetToAddModList
2525 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2530 uint8_t numBytes, bitsUnused;
2531 struct ControlResourceSet *controlRSet;
2532 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2533 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2537 controlRSetList->list.count = elementCnt;
2538 controlRSetList->list.size = \
2539 elementCnt * sizeof(struct ControlResourceSet *);
2541 controlRSetList->list.array = NULLP;
2542 DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2543 if(!controlRSetList->list.array)
2545 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2549 for(idx = 0; idx < elementCnt; idx++)
2551 controlRSetList->list.array[idx] = NULLP;
2552 DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2553 if(!controlRSetList->list.array[idx])
2555 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2561 controlRSet = controlRSetList->list.array[idx];
2563 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2567 * Bit string stored ff0000000000
2571 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2573 controlRSet->frequencyDomainResources.buf = NULLP;
2574 DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2575 controlRSet->frequencyDomainResources.size);
2576 if(!controlRSet->frequencyDomainResources.buf)
2578 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2582 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2583 coreset0EndPrb = CORESET0_END_PRB;
2584 coreset1StartPrb = coreset0EndPrb + 6;
2585 coreset1NumPrb = CORESET1_NUM_PRB;
2586 /* calculate the PRBs */
2587 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2588 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2589 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2591 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2592 controlRSet->cce_REG_MappingType.present = \
2593 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2595 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2596 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2597 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2598 controlRSet->tci_PresentInDCI = NULLP;
2600 uint8_t tciStateIdx;
2602 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2603 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2604 if(!controlRset->tci_StatesPDCCH_ToAddList)
2606 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2611 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2612 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2613 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2614 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2615 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2617 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2621 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2623 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2624 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2626 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2633 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2635 DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2636 if(!controlRset->tci_PresentInDCI)
2638 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2642 *(controlRset->tci_PresentInDCI);
2645 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2646 DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2647 if(!controlRSet->pdcch_DMRS_ScramblingID)
2649 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2652 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2655 } /* End BuildControlRSetToAddModList */
2657 /*******************************************************************
2659 * @brief Build search space to add/modify list
2663 * Function : BuildSearchSpcToAddModList
2665 * Functionality: Build search space to add/modify list
2668 * @return ROK - success
2671 * ****************************************************************/
2672 uint8_t BuildSearchSpcToAddModList
2674 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2682 struct SearchSpace *searchSpc;
2685 searchSpcList->list.count = elementCnt;
2686 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2688 searchSpcList->list.array = NULLP;
2689 DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2690 if(!searchSpcList->list.array)
2692 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2696 for(idx = 0; idx < elementCnt; idx++)
2698 searchSpcList->list.array[idx] = NULLP;
2699 DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2700 if(!searchSpcList->list.array[idx])
2702 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2708 searchSpc = searchSpcList->list.array[idx];
2710 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2712 searchSpc->controlResourceSetId = NULLP;
2713 DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2714 if(!searchSpc->controlResourceSetId)
2716 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2719 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2721 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2722 DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2723 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2724 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2726 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2729 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2730 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2732 searchSpc->duration = NULLP;
2733 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2734 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2735 if(!searchSpc->monitoringSymbolsWithinSlot)
2737 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2741 /* Values taken from reference logs :
2744 * Bit string stores 8000
2749 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2750 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2751 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2752 searchSpc->monitoringSymbolsWithinSlot->size);
2753 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2755 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2760 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2761 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2762 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2763 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2765 searchSpc->nrofCandidates = NULLP;
2766 DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2767 if(!searchSpc->nrofCandidates)
2769 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2773 searchSpc->nrofCandidates->aggregationLevel1 = \
2774 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2775 searchSpc->nrofCandidates->aggregationLevel2 = \
2776 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2777 searchSpc->nrofCandidates->aggregationLevel4 = \
2778 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2779 searchSpc->nrofCandidates->aggregationLevel8 = \
2780 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2781 searchSpc->nrofCandidates->aggregationLevel16 = \
2782 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2784 searchSpc->searchSpaceType = NULLP;
2785 DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2786 if(!searchSpc->searchSpaceType)
2788 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2792 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2794 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
2795 DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
2796 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
2797 if(!searchSpc->searchSpaceType->choice.ue_Specific)
2799 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2802 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
2803 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
2806 }/* End BuildSearchSpcToAddModList */
2808 /*******************************************************************
2810 * @brief Builds BWP DL dedicated PDCCH config
2814 * Function : BuildBWPDlDedPdcchCfg
2816 * Functionality: Builds BWP DL dedicated PDCCH config
2818 * @params[in] struct PDCCH_Config *pdcchCfg
2820 * @return ROK - success
2823 * ****************************************************************/
2824 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
2826 pdcchCfg->controlResourceSetToAddModList = NULLP;
2827 DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
2828 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
2829 if(!pdcchCfg->controlResourceSetToAddModList)
2831 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2835 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
2840 pdcchCfg->controlResourceSetToReleaseList = NULLP;
2842 pdcchCfg->searchSpacesToAddModList = NULLP;
2843 DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
2844 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
2845 if(!pdcchCfg->searchSpacesToAddModList)
2847 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2851 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
2856 pdcchCfg->searchSpacesToReleaseList = NULLP;
2857 pdcchCfg->downlinkPreemption = NULLP;
2858 pdcchCfg->tpc_PUSCH = NULLP;
2859 pdcchCfg->tpc_PUCCH = NULLP;
2860 pdcchCfg->tpc_SRS = NULLP;
2865 /*******************************************************************
2867 * @brief Builds DMRS DL PDSCH Mapping type A
2871 * Function : BuildDMRSDLPdschMapTypeA
2873 * Functionality: Builds DMRS DL PDSCH Mapping type A
2876 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2877 * @return ROK - success
2880 * ****************************************************************/
2881 uint8_t BuildDMRSDLPdschMapTypeA
2883 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2886 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
2887 dmrsDlCfg->choice.setup = NULLP;
2888 DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
2889 if(!dmrsDlCfg->choice.setup)
2891 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
2895 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
2896 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
2897 DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
2898 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
2900 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
2903 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
2905 dmrsDlCfg->choice.setup->maxLength = NULLP;
2906 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
2907 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
2908 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
2913 /*******************************************************************
2915 * @brief Builds TCI states to add/modify list
2919 * Function : BuildTCIStatesToAddModList
2921 * Functionality:Builds TCI states to add/modify list
2924 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
2926 * @return ROK - success
2929 * ****************************************************************/
2930 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
2935 /*******************************************************************
2937 * @brief Builds PDSCH time domain allocation list
2941 * Function : BuildPdschTimeDomAllocList
2943 * Functionality: Builds PDSCH time domain allocation list
2946 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2948 * @return ROK - success
2951 * ****************************************************************/
2952 uint8_t BuildPdschTimeDomAllocList
2954 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2959 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
2961 timeDomAllocList->present = \
2962 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
2964 timeDomAllocList->choice.setup = NULLP;
2965 DU_ALLOC(timeDomAllocList->choice.setup, \
2966 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
2967 if(!timeDomAllocList->choice.setup)
2969 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2974 timeDomAllocList->choice.setup->list.count = elementCnt;
2975 timeDomAllocList->choice.setup->list.size = \
2976 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
2978 timeDomAllocList->choice.setup->list.array = NULLP;
2979 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
2980 timeDomAllocList->choice.setup->list.size);
2981 if(!timeDomAllocList->choice.setup->list.array)
2983 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2987 for(idx = 0; idx < elementCnt; idx++)
2989 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
2990 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
2991 sizeof(struct PDSCH_TimeDomainResourceAllocation));
2992 if(!timeDomAllocList->choice.setup->list.array[idx])
2994 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3000 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3002 timeDomAlloc->k0 = NULLP;
3003 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3004 timeDomAlloc->startSymbolAndLength = \
3005 calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
3010 /*******************************************************************
3012 * @brief Builds PDSCH PRB Bundling type
3016 * Function : BuildPdschPrbBundlingType
3018 * Functionality: Builds PDSCH PRB Bundling type
3021 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3023 * @return ROK - success
3026 * ****************************************************************/
3027 uint8_t BuildPdschPrbBundlingType
3029 struct PDSCH_Config__prb_BundlingType *prbBndlType
3032 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3034 prbBndlType->choice.staticBundling = NULLP;
3035 DU_ALLOC(prbBndlType->choice.staticBundling, \
3036 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3037 if(!prbBndlType->choice.staticBundling)
3039 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3042 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3047 /*******************************************************************
3049 * @brief Builds BWP DL dedicated PDSCH config
3053 * Function : BuildBWPDlDedPdschCfg
3055 * Functionality: Builds BWP DL dedicated PDSCH config
3057 * @params[in] struct PDSCH_Config *pdschCfg
3059 * @return ROK - success
3062 * ****************************************************************/
3063 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3065 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3067 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3068 DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3069 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3070 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3072 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3076 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3081 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3082 pdschCfg->tci_StatesToAddModList = NULLP;
3083 pdschCfg->tci_StatesToReleaseList = NULLP;
3084 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3086 DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3087 if(!pdschCfg->tci_StatesToAddModList)
3089 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3092 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3098 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3100 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3101 DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3102 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3103 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3105 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3109 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3114 pdschCfg->pdsch_AggregationFactor = NULLP;
3115 pdschCfg->rateMatchPatternToAddModList = NULLP;
3116 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3117 pdschCfg->rateMatchPatternGroup1 = NULLP;
3118 pdschCfg->rateMatchPatternGroup2 = NULLP;
3119 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3120 pdschCfg->mcs_Table = NULLP;
3122 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3123 DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3124 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3126 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3129 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3131 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3136 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3137 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3138 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3139 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3140 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3141 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3142 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3147 /*******************************************************************
3149 * @brief Builds intitial DL BWP
3152 * Function : BuildInitialDlBWP
3154 * Functionality: Builds intitial DL BWP in spCellCfgDed
3156 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3158 * @return ROK - success
3161 * ****************************************************************/
3162 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3164 dlBwp->pdcch_Config = NULLP;
3165 DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3166 if(!dlBwp->pdcch_Config)
3168 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3171 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3173 dlBwp->pdcch_Config->choice.setup = NULLP;
3174 DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3175 if(!dlBwp->pdcch_Config->choice.setup)
3177 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3180 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3185 dlBwp->pdsch_Config = NULLP;
3186 DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3187 if(!dlBwp->pdsch_Config)
3189 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3192 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3194 dlBwp->pdsch_Config->choice.setup = NULLP;
3195 DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3196 if(!dlBwp->pdsch_Config->choice.setup)
3198 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3202 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3207 dlBwp->sps_Config = NULLP;
3208 dlBwp->radioLinkMonitoringConfig = NULLP;
3212 /*******************************************************************
3214 * @brief Builds DMRS UL Pusch Mapping type A
3218 * Function : BuildDMRSULPuschMapTypeA
3220 * Functionality: Builds DMRS UL Pusch Mapping type A
3223 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3224 * @return ROK - success
3227 * ****************************************************************/
3228 uint8_t BuildDMRSULPuschMapTypeA
3230 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3233 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3234 dmrsUlCfg->choice.setup= NULLP;
3235 DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3236 if(!dmrsUlCfg->choice.setup)
3238 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3242 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3243 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3244 DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3245 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3247 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3250 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3252 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3253 dmrsUlCfg->choice.setup->maxLength = NULLP;
3254 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3255 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3256 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3257 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3259 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3263 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3264 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3266 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3268 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3271 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3273 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3274 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3278 /*******************************************************************
3280 * @brief Build PUSCH time domain allocation list
3284 * Function : BuildPuschTimeDomAllocList
3286 * Functionality: Build PUSCH time domain allocation list
3289 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3291 * @return ROK - success
3294 * ****************************************************************/
3295 uint8_t BuildPuschTimeDomAllocList
3297 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3302 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3304 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3305 timeDomAllocList->choice.setup = NULLP;
3306 DU_ALLOC(timeDomAllocList->choice.setup, \
3307 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3308 if(!timeDomAllocList->choice.setup)
3310 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3315 timeDomAllocList->choice.setup->list.count = elementCnt;
3316 timeDomAllocList->choice.setup->list.size = \
3317 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3318 timeDomAllocList->choice.setup->list.array = NULLP;
3319 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3320 timeDomAllocList->choice.setup->list.size);
3321 if(!timeDomAllocList->choice.setup->list.array)
3323 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3327 for(idx = 0; idx < elementCnt; idx++)
3329 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3330 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3331 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3332 if(!timeDomAllocList->choice.setup->list.array[idx])
3334 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3340 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3341 DU_ALLOC(timeDomAlloc->k2, sizeof(long));
3342 if(!timeDomAlloc->k2)
3344 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3347 *(timeDomAlloc->k2) = PUSCH_K2;
3348 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3349 timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
3353 /*******************************************************************
3355 * @brief Builds BWP UL dedicated PUSCH Config
3359 * Function : BuildBWPUlDedPuschCfg
3362 * Builds BWP UL dedicated PUSCH Config
3364 * @params[in] : PUSCH_Config_t *puschCfg
3366 * @return ROK - success
3369 * ****************************************************************/
3370 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3372 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3373 DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3374 if(!puschCfg->dataScramblingIdentityPUSCH)
3376 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3379 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3381 puschCfg->txConfig = NULLP;
3382 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3383 DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3384 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3385 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3387 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3391 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3396 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3397 puschCfg->pusch_PowerControl = NULLP;
3398 puschCfg->frequencyHopping = NULLP;
3399 puschCfg->frequencyHoppingOffsetLists = NULLP;
3400 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3402 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3403 DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3404 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3405 if(!puschCfg->pusch_TimeDomainAllocationList)
3407 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3411 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3416 puschCfg->pusch_AggregationFactor = NULLP;
3417 puschCfg->mcs_Table = NULLP;
3418 puschCfg->mcs_TableTransformPrecoder = NULLP;
3419 puschCfg->transformPrecoder = NULLP;
3420 DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3421 if(!puschCfg->transformPrecoder)
3423 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3426 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3428 puschCfg->codebookSubset = NULLP;
3429 puschCfg->maxRank = NULLP;
3430 puschCfg->rbg_Size = NULLP;
3431 puschCfg->uci_OnPUSCH = NULLP;
3432 puschCfg->tp_pi2BPSK = NULLP;
3437 /*******************************************************************
3439 * @brief Fills SRS resource to add/modify list
3443 * Function : BuildSrsRsrcAddModList
3445 * Functionality: Fills SRS resource to add/modify list
3448 * @return ROK - success
3451 * ****************************************************************/
3452 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3458 resourceList->list.count = elementCnt;
3459 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3460 resourceList->list.array = NULLP;
3461 DU_ALLOC(resourceList->list.array, resourceList->list.size);
3462 if(!resourceList->list.array)
3464 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3468 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3470 DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3471 if(!resourceList->list.array[rsrcIdx])
3473 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3479 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3480 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3481 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3483 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3484 DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3485 sizeof(struct SRS_Resource__transmissionComb__n2));
3486 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3488 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3491 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3492 = SRS_COMB_OFFSET_N2;
3493 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3494 = SRS_CYCLIC_SHIFT_N2;
3496 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3498 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3499 SRS_Resource__resourceMapping__nrofSymbols_n1;
3500 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3501 SRS_Resource__resourceMapping__repetitionFactor_n1;
3503 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3504 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3505 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3506 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3507 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3508 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3509 SRS_Resource__groupOrSequenceHopping_neither;
3511 /* Setting resource type to aperiodic for intergration purposes */
3512 resourceList->list.array[rsrcIdx]->resourceType.present = \
3513 SRS_Resource__resourceType_PR_aperiodic;
3514 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3515 DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3516 sizeof(struct SRS_Resource__resourceType__aperiodic));
3517 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3519 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3522 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3527 /*******************************************************************
3529 * @brief Build SRS resource set Add/mod list
3533 * Function : BuildSrsRsrcSetAddModList
3535 * Functionality: Build SRS resource set Add/mod list
3538 * @return ROK - success
3541 * ****************************************************************/
3542 uint8_t BuildSrsRsrcSetAddModList
3544 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3550 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3553 rsrcSetList->list.count = elementCnt;
3554 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3555 rsrcSetList->list.array = NULLP;
3556 DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3557 if(!rsrcSetList->list.array)
3559 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3563 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3565 DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3566 if(!rsrcSetList->list.array[rSetIdx])
3568 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3574 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3576 /* Fill Resource Id list in resource set */
3577 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3578 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3579 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3580 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3582 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3587 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3588 rsrcIdList->list.count = elementCnt;
3589 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3590 rsrcIdList->list.array = NULLP;
3591 DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3592 if(!rsrcIdList->list.array)
3594 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3598 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3600 DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3601 if(!rsrcIdList->list.array[rsrcIdx])
3603 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3609 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3611 /* Fill resource type */
3612 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3613 SRS_ResourceSet__resourceType_PR_aperiodic;
3615 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3616 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3617 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3618 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3620 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3623 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3624 = APERIODIC_SRS_RESRC_TRIGGER;
3626 /* TODO : Fill values for below IEs as expected by Viavi */
3627 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3628 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3631 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3632 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3633 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3634 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3635 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3640 /*******************************************************************
3642 * @brief Builds BWP UL dedicated SRS Config
3646 * Function : BuildBWPUlDedSrsCfg
3648 * Functionality: Builds BWP UL dedicated SRS Config
3650 * @params[in] SRS Config
3651 * @return ROK - success
3654 * ****************************************************************/
3655 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3657 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3658 srsCfg->srs_ResourceSetToAddModList = NULLP;
3659 DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3660 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3661 if(!srsCfg->srs_ResourceSetToAddModList)
3663 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3666 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3671 srsCfg->srs_ResourceToReleaseList = NULLP;
3673 /* Resource to Add/Modify list */
3674 srsCfg->srs_ResourceToAddModList = NULLP;
3675 DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3676 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3677 if(!srsCfg->srs_ResourceToAddModList)
3679 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3683 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3688 srsCfg->tpc_Accumulation = NULLP;
3693 /*******************************************************************
3695 * @brief Builds inital UL BWP
3699 * Function : BuildInitialUlBWP
3701 * Functionality: Builds initial UL BWP
3703 * @params[in] BWP_UplinkDedicated_t *ulBwp
3704 * @return ROK - success
3707 * ****************************************************************/
3708 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3710 ulBwp->pucch_Config = NULLP;
3712 /* Fill BWP UL dedicated PUSCH config */
3713 ulBwp->pusch_Config = NULLP;
3714 DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3715 if(!ulBwp->pusch_Config)
3717 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3721 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3722 ulBwp->pusch_Config->choice.setup = NULLP;
3723 DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3724 if(!ulBwp->pusch_Config->choice.setup)
3726 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3730 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3735 ulBwp->configuredGrantConfig = NULLP;
3737 /* Fill BPW UL dedicated SRS config */
3738 ulBwp->srs_Config = NULLP;
3739 DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3740 if(!ulBwp->srs_Config)
3742 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3746 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3747 ulBwp->srs_Config->choice.setup = NULLP;
3748 DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3749 if(!ulBwp->srs_Config->choice.setup)
3751 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3755 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3760 ulBwp->beamFailureRecoveryConfig = NULLP;
3765 /*******************************************************************
3767 * @brief Builds Pusch Serving cell Config
3771 * Function : BuildPuschSrvCellCfg
3773 * Functionality: Builds Pusch Serving cell Config
3775 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3777 * @return ROK - success
3780 * ****************************************************************/
3781 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3783 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3784 puschCfg->choice.setup = NULLP;
3785 DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3786 if(!puschCfg->choice.setup)
3788 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3792 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3793 puschCfg->choice.setup->rateMatching = NULLP;
3794 puschCfg->choice.setup->xOverhead = NULLP;
3795 puschCfg->choice.setup->ext1 = NULLP;
3796 DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3797 if(!puschCfg->choice.setup->ext1)
3799 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3803 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
3804 DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
3805 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
3807 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3810 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
3812 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
3813 DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
3814 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
3816 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3819 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
3823 /*******************************************************************
3825 * @brief Builds UL config
3828 * Function : BuildUlCfg
3830 * Functionality: Builds UL config in spCellCfgDed
3832 * @params[in] UplinkConfig_t *ulCfg
3834 * @return ROK - success
3837 * ****************************************************************/
3838 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
3840 ulCfg->initialUplinkBWP = NULLP;
3841 DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
3842 if(!ulCfg->initialUplinkBWP)
3844 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3848 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
3853 ulCfg->uplinkBWP_ToReleaseList = NULLP;
3854 ulCfg->uplinkBWP_ToAddModList = NULLP;
3855 ulCfg->firstActiveUplinkBWP_Id = NULLP;
3856 DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
3857 if(!ulCfg->firstActiveUplinkBWP_Id)
3859 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3862 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
3864 ulCfg->pusch_ServingCellConfig = NULLP;
3865 DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
3866 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
3867 if(!ulCfg->pusch_ServingCellConfig)
3869 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3873 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
3878 ulCfg->carrierSwitching = NULLP;
3879 ulCfg->ext1 = NULLP;
3883 /*******************************************************************
3885 * @brief Builds PDSCH serving cell config
3888 * Function : BuildPdschSrvCellCfg
3890 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
3892 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
3894 * @return ROK - success
3897 * ****************************************************************/
3898 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
3900 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
3901 pdschCfg->choice.setup = NULLP;
3902 DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
3903 if(!pdschCfg->choice.setup)
3905 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3909 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3910 pdschCfg->choice.setup->xOverhead = NULLP;
3911 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
3912 DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
3913 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
3915 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3918 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
3919 pdschCfg->choice.setup->pucch_Cell = NULLP;
3920 pdschCfg->choice.setup->ext1 = NULLP;
3925 /*******************************************************************
3927 * @brief Builds CSI Meas config
3930 * Function : BuildCsiMeasCfg
3932 * Functionality: Builds CSI Meas config in spCellCfgDed
3934 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
3936 * @return ROK - success
3939 * ****************************************************************/
3940 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
3946 /*******************************************************************
3948 * @brief Builds Spcell config dedicated
3951 * Function : BuildSpCellCfgDed
3953 * Functionality: Builds sp cell config dedicated in spCellCfg
3955 * @params[in] ServingCellConfig_t srvCellCfg
3957 * @return ROK - success
3960 * ****************************************************************/
3961 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
3963 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
3964 DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
3965 if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
3967 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3971 srvCellCfg->initialDownlinkBWP = NULLP;
3972 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
3973 if(!srvCellCfg->initialDownlinkBWP)
3975 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3979 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
3981 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
3984 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
3985 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
3987 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
3988 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
3989 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
3991 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3994 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
3996 srvCellCfg->bwp_InactivityTimer = NULLP;
3998 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
3999 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4000 if(!srvCellCfg->defaultDownlinkBWP_Id)
4002 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4005 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4007 srvCellCfg->uplinkConfig = NULLP;
4008 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4009 if(!srvCellCfg->uplinkConfig)
4011 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4015 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4017 DU_LOG("\nF1AP : BuildUlCfg failed");
4020 srvCellCfg->supplementaryUplink = NULLP;
4021 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4023 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4024 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4025 if(!srvCellCfg->pdsch_ServingCellConfig)
4027 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4031 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4033 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4037 srvCellCfg->csi_MeasConfig = NULLP;
4039 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4040 if(!srvCellCfg->csi_MeasConfig)
4042 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4046 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4048 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4052 srvCellCfg->sCellDeactivationTimer = NULLP;
4053 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4054 srvCellCfg->tag_Id = TAG_ID;
4055 srvCellCfg->dummy = NULLP;
4056 srvCellCfg->pathlossReferenceLinking = NULLP;
4057 srvCellCfg->servingCellMO = NULLP;
4058 srvCellCfg->ext1 = NULLP;
4062 /*******************************************************************
4064 * @brief Builds Spcell config
4068 * Function : BuildSpCellCfg
4070 * Functionality: Builds sp cell config in DuToCuRrcContainer
4072 * @params[in] SpCellConfig_t spCellCfg
4074 * @return ROK - success
4077 * ****************************************************************/
4078 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4081 spCellCfg->servCellIndex = NULLP;
4082 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4083 if(!spCellCfg->servCellIndex)
4085 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4088 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4090 spCellCfg->reconfigurationWithSync = NULLP;
4091 spCellCfg->rlf_TimersAndConstants = NULLP;
4092 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4093 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4094 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4096 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4099 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4101 spCellCfg->spCellConfigDedicated = NULLP;
4102 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4103 if(!spCellCfg->spCellConfigDedicated)
4105 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4108 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4110 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4115 /*******************************************************************
4117 * @brief Builds Phy cell group config
4121 * Function : BuildPhyCellGrpCfg
4123 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4125 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4127 * @return ROK - success
4130 * ****************************************************************/
4131 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4133 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4134 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4136 phyCellGrpCfg->p_NR_FR1 = NULLP;
4137 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4138 if(!phyCellGrpCfg->p_NR_FR1)
4140 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4143 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4144 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4145 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4146 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4147 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4148 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4149 phyCellGrpCfg->cs_RNTI = NULLP;
4150 phyCellGrpCfg->ext1 = NULLP;
4151 phyCellGrpCfg->ext2 = NULLP;
4155 /*******************************************************************
4157 * @brief Builds Mac cell group config
4161 * Function : BuildMacCellGrpCfg
4163 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4165 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4167 * @return ROK - success
4170 * ****************************************************************/
4171 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4173 macCellGrpCfg->drx_Config = NULLP;
4174 macCellGrpCfg->schedulingRequestConfig = NULLP;
4175 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4176 if(!macCellGrpCfg->schedulingRequestConfig)
4178 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4182 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4184 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4188 macCellGrpCfg->bsr_Config = NULLP;
4189 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4190 if(!macCellGrpCfg->bsr_Config)
4192 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4196 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4198 DU_LOG("\nF1AP : BuildBsrConfig failed");
4202 macCellGrpCfg->tag_Config = NULLP;
4203 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4204 if(!macCellGrpCfg->tag_Config)
4206 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4210 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4212 DU_LOG("\nF1AP : BuildTagConfig failed");
4216 macCellGrpCfg->phr_Config = NULLP;
4217 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4218 if(!macCellGrpCfg->phr_Config)
4220 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4224 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4226 DU_LOG("\nF1AP : BuildPhrConfig failed");
4230 macCellGrpCfg->skipUplinkTxDynamic = false;
4231 macCellGrpCfg->ext1 = NULLP;
4235 /*******************************************************************
4237 * @brief Frees memeory allocated for SearchSpcToAddModList
4241 * Function : FreeSearchSpcToAddModList
4243 * Functionality: Deallocating memory of SearchSpcToAddModList
4245 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4249 4221 * ****************************************************************/
4250 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4254 struct SearchSpace *searchSpc=NULLP;
4256 if(searchSpcList->list.array)
4258 if(searchSpcList->list.array[idx2])
4260 searchSpc = searchSpcList->list.array[idx2];
4261 if(searchSpc->controlResourceSetId)
4263 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4265 if(searchSpc->monitoringSymbolsWithinSlot)
4267 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4269 if(searchSpc->nrofCandidates)
4271 if(searchSpc->searchSpaceType)
4273 DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4274 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4275 DU_FREE(searchSpc->searchSpaceType, sizeof(struct
4276 SearchSpace__searchSpaceType));
4278 DU_FREE(searchSpc->nrofCandidates,
4279 sizeof(struct SearchSpace__nrofCandidates));
4281 DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4282 searchSpc->monitoringSymbolsWithinSlot->size);
4284 DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4285 sizeof(BIT_STRING_t));
4287 DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4288 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4290 DU_FREE(searchSpc->controlResourceSetId,
4291 sizeof(ControlResourceSetId_t));
4294 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4296 DU_FREE(searchSpcList->list.array[idx1],
4297 sizeof(struct SearchSpace));
4299 DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4302 /*******************************************************************
4304 * @brief Frees memory allocated for PdschTimeDomAllocList
4308 * Function : FreePdschTimeDomAllocList
4310 * Functionality: Deallocating memory of PdschTimeDomAllocList
4312 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4316 4221 * ****************************************************************/
4317 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4321 if(timeDomAllocList->choice.setup)
4323 if(timeDomAllocList->choice.setup->list.array)
4325 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4327 DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4328 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4330 DU_FREE(timeDomAllocList->choice.setup->list.array, \
4331 timeDomAllocList->choice.setup->list.size);
4333 DU_FREE(timeDomAllocList->choice.setup,\
4334 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4337 /*******************************************************************
4339 * @brief Frees memory allocated for PuschTimeDomAllocList
4343 * Function : FreePuschTimeDomAllocList
4345 * Functionality: Deallocating memory of PuschTimeDomAllocList
4347 * @params[in] PUSCH_Config_t *puschCfg
4351 4221 * ****************************************************************/
4352 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4356 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4358 if(puschCfg->pusch_TimeDomainAllocationList)
4360 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4361 if(timeDomAllocList_t->choice.setup)
4363 if(timeDomAllocList_t->choice.setup->list.array)
4365 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4366 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4368 DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4369 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4371 DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4372 timeDomAllocList_t->choice.setup->list.size);
4374 DU_FREE(timeDomAllocList_t->choice.setup, \
4375 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4377 DU_FREE(puschCfg->transformPrecoder, sizeof(long));
4378 DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4379 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4383 /*******************************************************************
4385 * @brief Frees memory allocated for InitialUlBWP
4389 * Function : FreeInitialUlBWP
4391 * Functionality: Deallocating memory of InitialUlBWP
4393 * @params[in] BWP_UplinkDedicated_t *ulBwp
4397 * ****************************************************************/
4398 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4400 uint8_t rSetIdx, rsrcIdx;
4401 SRS_Config_t *srsCfg = NULLP;
4402 PUSCH_Config_t *puschCfg = NULLP;
4403 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4404 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4405 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4406 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4408 if(ulBwp->pusch_Config)
4410 if(ulBwp->pusch_Config->choice.setup)
4412 puschCfg=ulBwp->pusch_Config->choice.setup;
4413 if(puschCfg->dataScramblingIdentityPUSCH)
4415 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4417 FreePuschTimeDomAllocList(puschCfg);
4418 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4419 if(dmrsUlCfg->choice.setup)
4421 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4423 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4425 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4427 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4428 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4430 DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4433 DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4435 DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4436 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4438 DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4440 DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4442 DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4444 /* Free SRS-Config */
4445 if(ulBwp->srs_Config)
4447 if(ulBwp->srs_Config->choice.setup)
4449 srsCfg = ulBwp->srs_Config->choice.setup;
4451 /* Free Resource Set to add/mod list */
4452 if(srsCfg->srs_ResourceSetToAddModList)
4454 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4455 if(rsrcSetList->list.array)
4459 /* Free SRS resource Id list in this SRS resource set */
4460 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4462 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4464 if(rsrcIdList->list.array)
4466 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4468 DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4470 DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4472 DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4473 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4476 /* Free resource type info for this SRS resource set */
4477 DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4478 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4480 /* Free memory for each resource set */
4481 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4483 DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4485 DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4487 DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4488 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4491 /* Free resource to add/modd list */
4492 if(srsCfg->srs_ResourceToAddModList)
4494 resourceList = srsCfg->srs_ResourceToAddModList;
4495 if(resourceList->list.array)
4498 DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4499 sizeof(struct SRS_Resource__transmissionComb__n2));
4500 DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4501 sizeof(struct SRS_Resource__resourceType__aperiodic));
4503 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4505 DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4507 DU_FREE(resourceList->list.array, resourceList->list.size);
4509 DU_FREE(srsCfg->srs_ResourceToAddModList, \
4510 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4513 DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4515 DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4519 /*******************************************************************
4521 * @brief Frees memory allocated for initialUplinkBWP
4525 * Function : FreeinitialUplinkBWP
4527 * Functionality: Deallocating memory of initialUplinkBWP
4529 * @params[in] UplinkConfig_t *ulCfg
4534 * ****************************************************************/
4535 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4537 BWP_UplinkDedicated_t *ulBwp=NULLP;
4538 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4540 if(ulCfg->initialUplinkBWP)
4542 ulBwp=ulCfg->initialUplinkBWP;
4543 if(ulCfg->firstActiveUplinkBWP_Id)
4545 if(ulCfg->pusch_ServingCellConfig)
4547 puschCfg=ulCfg->pusch_ServingCellConfig;
4548 if(puschCfg->choice.setup)
4550 if(puschCfg->choice.setup->ext1)
4552 DU_FREE(puschCfg->choice.setup->ext1->\
4553 processingType2Enabled,sizeof(BOOLEAN_t));
4554 DU_FREE(puschCfg->choice.setup->ext1->\
4555 maxMIMO_Layers,sizeof(long));
4556 DU_FREE(puschCfg->choice.setup->ext1, \
4557 sizeof(struct PUSCH_ServingCellConfig__ext1));
4559 DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4561 DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4563 DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4565 FreeInitialUlBWP(ulBwp);
4566 DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4569 /*******************************************************************
4571 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4575 * Function : FreeBWPDlDedPdschCfg
4577 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4579 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4584 * ****************************************************************/
4585 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4587 struct PDSCH_Config *pdschCfg=NULLP;
4588 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4589 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4590 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4592 if(dlBwp->pdsch_Config->choice.setup)
4594 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4595 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4597 if(pdschCfg->pdsch_TimeDomainAllocationList)
4599 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4600 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4602 prbBndlType=&pdschCfg->prb_BundlingType;
4603 DU_FREE(prbBndlType->choice.staticBundling,\
4604 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4605 DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4607 FreePdschTimeDomAllocList(timeDomAllocList);
4608 DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
4609 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4611 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
4612 if(dmrsDlCfg->choice.setup)
4614 DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
4616 DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
4618 DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4619 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4621 DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4624 /*******************************************************************
4626 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
4630 * Function : FreeBWPDlDedPdcchCfg
4632 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
4634 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4639 * ****************************************************************/
4640 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
4644 struct PDCCH_Config *pdcchCfg=NULLP;
4645 struct ControlResourceSet *controlRSet=NULLP;
4646 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
4648 if(dlBwp->pdcch_Config->choice.setup)
4650 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
4651 if(pdcchCfg->controlResourceSetToAddModList)
4653 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
4654 if(controlRSetList->list.array)
4656 controlRSet = controlRSetList->list.array[idx2];
4659 if(controlRSet->frequencyDomainResources.buf)
4661 if(controlRSet->pdcch_DMRS_ScramblingID)
4663 if(pdcchCfg->searchSpacesToAddModList)
4665 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
4666 DU_FREE(pdcchCfg->searchSpacesToAddModList, \
4667 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
4669 DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
4671 DU_FREE(controlRSet->frequencyDomainResources.buf, \
4672 controlRSet->frequencyDomainResources.size);
4675 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
4677 DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
4679 DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
4681 DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
4682 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
4684 DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4688 /*******************************************************************
4690 * @brief Frees emmory allocated for DUToCURRCContainer
4694 * Function : FreeMemDuToCuRrcCont
4696 * Functionality: Deallocating memory of DuToCuRrcContainer
4698 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
4700 * @return ROK - success
4703 * ****************************************************************/
4704 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
4707 SpCellConfig_t *spCellCfg=NULLP;
4708 ServingCellConfig_t *srvCellCfg=NULLP;
4709 BWP_DownlinkDedicated_t *dlBwp=NULLP;
4710 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
4711 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
4712 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
4713 struct RLC_Config *rlcConfig=NULLP;
4714 struct LogicalChannelConfig *macLcConfig=NULLP;
4715 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
4716 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
4717 struct TAG_Config *tagConfig=NULLP;
4718 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
4719 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
4720 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
4722 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
4725 if(rlcBearerList->list.array)
4727 for(idx=0; idx<rlcBearerList->list.count; idx++)
4729 if(rlcBearerList->list.array[idx])
4731 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
4732 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
4735 if(rlcConfig->choice.am)
4737 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4738 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
4739 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
4741 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
4743 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
4746 if(macLcConfig->ul_SpecificParameters)
4748 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
4749 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
4750 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
4752 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
4754 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
4757 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
4759 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4762 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
4765 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
4766 if(schedulingRequestConfig)
4768 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4771 if(schReqList->list.array)
4773 for(idx=0;idx<schReqList->list.count; idx++)
4775 if(schReqList->list.array[idx])
4777 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4778 DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4781 DU_FREE(schReqList->list.array, schReqList->list.size);
4783 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
4784 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
4785 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4787 if(macCellGrpCfg->bsr_Config)
4789 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4791 tagConfig = macCellGrpCfg->tag_Config;
4794 tagList = tagConfig->tag_ToAddModList;
4797 if(tagList->list.array)
4799 for(idx=0; idx<tagList->list.count; idx++)
4801 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
4803 DU_FREE(tagList->list.array, tagList->list.size);
4805 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4807 DU_FREE(tagConfig, sizeof(struct TAG_Config));
4810 phrConfig = macCellGrpCfg->phr_Config;
4813 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
4814 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
4817 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
4820 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
4823 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4824 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
4827 spCellCfg = cellGrpCfg->spCellConfig;
4830 if(spCellCfg->servCellIndex)
4832 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
4834 if(spCellCfg->spCellConfigDedicated)
4836 srvCellCfg = spCellCfg->spCellConfigDedicated;
4837 if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
4839 if(srvCellCfg->initialDownlinkBWP)
4841 dlBwp = srvCellCfg->initialDownlinkBWP;
4842 if(srvCellCfg->firstActiveDownlinkBWP_Id)
4844 if(srvCellCfg->defaultDownlinkBWP_Id)
4846 if(srvCellCfg->uplinkConfig)
4848 if(srvCellCfg->pdsch_ServingCellConfig)
4850 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
4851 if(pdschCfg->choice.setup)
4853 DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
4854 DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4856 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
4857 ServingCellConfig__pdsch_ServingCellConfig));
4859 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
4860 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4862 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4864 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4866 if(dlBwp->pdcch_Config)
4868 if(dlBwp->pdsch_Config)
4870 FreeBWPDlDedPdschCfg(dlBwp);
4871 DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4873 FreeBWPDlDedPdcchCfg(dlBwp);
4874 DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4876 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4878 DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
4880 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4882 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4884 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
4886 DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
4890 /*******************************************************************
4892 * @brief Builds DU To CU RRC Container
4896 * Function : BuildDuToCuRrcContainer
4898 * Functionality: Builds DuToCuRrcContainer
4900 * @params[in] idx, index in F1AP msg
4901 * DuToCuRRCContainer, DuToCuRRCContainer
4903 * @return ROK - success
4906 * ****************************************************************/
4907 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
4909 CellGroupConfigRrc_t cellGrpCfg;
4910 asn_enc_rval_t encRetVal;
4911 uint8_t ret = RFAILED;
4915 cellGrpCfg.cellGroupId = CELL_GRP_ID;
4917 cellGrpCfg.rlc_BearerToAddModList = NULLP;
4918 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4919 if(!cellGrpCfg.rlc_BearerToAddModList)
4921 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4924 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
4926 DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
4930 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
4931 cellGrpCfg.mac_CellGroupConfig = NULLP;
4932 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
4933 if(!cellGrpCfg.mac_CellGroupConfig)
4935 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4938 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
4940 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
4945 cellGrpCfg.physicalCellGroupConfig = NULLP;
4946 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
4947 if(!cellGrpCfg.physicalCellGroupConfig)
4949 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4952 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
4954 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
4958 cellGrpCfg.spCellConfig = NULLP;
4959 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
4960 if(!cellGrpCfg.spCellConfig)
4962 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4965 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
4967 DU_LOG("\nF1AP : BuildSpCellCfg failed");
4971 cellGrpCfg.sCellToAddModList = NULLP;
4972 cellGrpCfg.sCellToReleaseList = NULLP;
4973 cellGrpCfg.ext1 = NULLP;
4975 /* encode cellGrpCfg into duToCuRrcContainer */
4976 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
4977 memset(encBuf, 0, ENC_BUF_MAX_LEN);
4979 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
4980 /* Encode results */
4981 if(encRetVal.encoded == ENCODE_FAIL)
4983 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
4984 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4989 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
4990 for(int i=0; i< encBufSize; i++)
4992 printf("%x",encBuf[i]);
4996 duToCuRrcContainer->size = encBufSize;
4997 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
4998 if(!duToCuRrcContainer->buf)
5000 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5003 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
5007 FreeMemDuToCuRrcCont(&cellGrpCfg);
5011 /*******************************************************************
5013 * @brief Builds and sends the InitialULRRCMessage
5017 * Function : BuildAndSendInitialRrcMsgTransfer
5019 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
5020 * it to the CU through SCTP.
5024 * @return ROK - success
5027 * ****************************************************************/
5028 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
5029 uint16_t rrcContSize, uint8_t *rrcContainer)
5036 F1AP_PDU_t *f1apMsg = NULLP;
5037 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
5038 asn_enc_rval_t encRetVal;
5039 bool checkvar=false;
5042 DU_LOG("\n F1AP : Building RRC Setup Request\n");
5043 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5044 if(f1apMsg == NULLP)
5046 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5049 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5050 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5051 if(f1apMsg->choice.initiatingMessage == NULLP)
5053 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5056 f1apMsg->choice.initiatingMessage->procedureCode =\
5057 ProcedureCode_id_InitialULRRCMessageTransfer;
5058 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
5059 f1apMsg->choice.initiatingMessage->value.present = \
5060 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
5062 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
5064 initULRRCMsg->protocolIEs.list.count = elementCnt;
5065 initULRRCMsg->protocolIEs.list.size = \
5066 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
5067 /* Initialize the F1Setup members */
5068 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5069 if(initULRRCMsg->protocolIEs.list.array == NULLP)
5071 DU_LOG(" F1AP : Memory allocation for\
5072 RRCSetupRequestMessageTransferIEs failed");
5075 for(idx=0; idx<elementCnt; idx++)
5077 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
5078 sizeof(InitialULRRCMessageTransferIEs_t));
5079 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
5085 /*GNB DU UE F1AP ID*/
5086 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5087 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5088 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5089 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
5090 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
5091 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
5096 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5097 ProtocolIE_ID_id_NRCGI;
5098 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
5099 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
5100 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
5103 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
5111 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5112 ProtocolIE_ID_id_C_RNTI;
5113 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5114 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5115 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
5116 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
5120 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5121 ProtocolIE_ID_id_RRCContainer;
5122 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5123 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5124 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
5126 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = rrcContSize;
5127 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
5128 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
5129 if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
5131 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
5135 memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
5136 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
5139 /*DUtoCURRCContainer*/
5141 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
5142 ProtocolIE_ID_id_DUtoCURRCContainer;
5143 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
5144 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
5145 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
5147 ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
5153 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5155 /* Encode the F1SetupRequest type as APER */
5156 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5158 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
5159 /* Encode results */
5160 if(encRetVal.encoded == ENCODE_FAIL)
5162 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
5163 structure (at %s)\n",encRetVal.failed_type ? \
5164 encRetVal.failed_type->name : "unknown");
5170 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
5171 Message transfer\n");
5172 for(int i=0; i< encBufSize; i++)
5174 printf("%x",encBuf[i]);
5178 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
5180 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
5187 if(f1apMsg != NULLP)
5189 if(f1apMsg->choice.initiatingMessage != NULLP)
5191 if(initULRRCMsg->protocolIEs.list.array != NULLP)
5193 if(idx == elementCnt)
5196 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
5198 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
5200 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
5201 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
5203 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
5204 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
5208 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
5210 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
5211 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
5215 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf)
5217 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf,
5218 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.size);
5220 for(ieId=0; ieId<elementCnt; ieId++)
5222 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
5227 for(ieId=0; ieId<idx; ieId++)
5229 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
5232 DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5234 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5236 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
5242 }/* End of BuildAndSendInitialRrcMsgTransfer*/
5244 /***** UE SETUP REQUEST *****/
5246 /*******************************************************************
5248 * @brief Free Qos And Snssai Drb Info
5252 * Function : freeDrbQosAndSnssaiInfo
5254 * Functionality: Free Qos And Snssai Drb Info
5256 * @params[in] LcCfg *lcCfg,
5259 * ****************************************************************/
5260 void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
5264 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
5268 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
5272 /******************************************************************
5274 * @brief Function to delete the RLC Lc cfg from UE APP DB
5278 * Function : freeRlcLcCfg
5280 * Functionality: Function to delete the RLC Lc cfg from UE APP DB
5283 *****************************************************************/
5285 void freeRlcLcCfg(RlcBearerCfg *lcCfg)
5287 switch(lcCfg->rlcMode)
5293 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
5294 lcCfg->u.amCfg = NULLP;
5298 case RLC_UM_BI_DIRECTIONAL :
5300 if(lcCfg->u.umBiDirCfg)
5302 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
5303 lcCfg->u.umBiDirCfg = NULLP;
5307 case RLC_UM_UNI_DIRECTIONAL_UL :
5309 if(lcCfg->u.umUniDirUlCfg)
5311 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
5312 lcCfg->u.umUniDirUlCfg = NULLP;
5317 case RLC_UM_UNI_DIRECTIONAL_DL :
5319 if(lcCfg->u.umUniDirDlCfg)
5321 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
5322 lcCfg->u.umUniDirDlCfg = NULLP;
5327 DU_LOG("\nDU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode);
5330 memset(lcCfg, 0, sizeof(LcCfg));
5332 /*******************************************************************
5334 * @brief Function to free MacLcCfg
5338 * Function : freeMacLcCfg
5340 * Functionality: Function to free MacLcCfg
5342 * @params[in] LcCfg *lcCfg,
5345 * ****************************************************************/
5347 void freeMacLcCfg(LcCfg *lcCfg)
5349 /* Deleting DRBQOS */
5352 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
5353 lcCfg->drbQos = NULLP;
5355 /* Deleting SNSSAI */
5358 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
5359 lcCfg->snssai = NULLP;
5361 memset(lcCfg, 0, sizeof(LcCfg));
5364 /*******************************************************************
5366 * @brief Function to free DuUeCfg
5370 * Function : freeDuUeCfg
5372 * Functionality: Function to free DuUeCfg
5374 * @params[in] DuUeCfg *ueCfg
5377 * ****************************************************************/
5378 void freeDuUeCfg(DuUeCfg *ueCfg)
5382 for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++)
5384 freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]);
5386 for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
5388 freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
5390 if(ueCfg->maxAggrBitRate)
5392 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->maxAggrBitRate, sizeof(MaxAggrBitRate));
5396 /*******************************************************************
5398 * @brief Function to free UecontextSetupDb
5402 * Function : freeF1UeDb
5404 * Functionality: Function to free UecontextSetupDb
5406 * @params[in] UecontextSetupDb *
5409 * ****************************************************************/
5411 void freeF1UeDb(UeContextSetupDb *f1UeDb)
5413 if(f1UeDb->cellGrpCfg)
5415 DU_FREE(f1UeDb->cellGrpCfg, sizeof(CellGroupConfigRrc_t));
5416 f1UeDb->cellGrpCfg = NULLP;
5420 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1UeDb->rrcMsg, f1UeDb->rrcMsgLen);
5423 freeDuUeCfg(&f1UeDb->duUeCfg);
5424 memset(f1UeDb, 0, sizeof(UeContextSetupDb));
5428 /*******************************************************************
5430 * @brief Function to build Am cfg Info
5434 * Function : extractRlcAmCfg
5436 * Functionality: Function to build Am cfg Info
5438 * @params[in] AmBearerCfg *
5441 * @return ROK/RFAILED
5443 * ****************************************************************/
5445 void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg)
5450 if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
5452 amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength);
5453 amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly;
5454 amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit;
5458 if(rlcAmCfg->ul_AM_RLC.sn_FieldLength)
5460 amCfgToSet->dlAmCfg.snLenDl = *(rlcAmCfg->ul_AM_RLC.sn_FieldLength);
5461 amCfgToSet->dlAmCfg.pollRetxTmr = rlcAmCfg->ul_AM_RLC.t_PollRetransmit;
5462 amCfgToSet->dlAmCfg.pollPdu = rlcAmCfg->ul_AM_RLC.pollPDU;
5463 amCfgToSet->dlAmCfg.pollByte = rlcAmCfg->ul_AM_RLC.pollByte;
5464 amCfgToSet->dlAmCfg.maxRetxTh = rlcAmCfg->ul_AM_RLC.maxRetxThreshold;
5469 /*******************************************************************
5471 * @brief Function to build Um Bi Info
5475 * Function : extractRlcUmBiCfg
5477 * Functionality: Function to build Um Bi Info
5479 * @params[in] UmBiDirBearerCfg *
5482 * @return ROK/RFAILED
5484 * ****************************************************************/
5486 void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_Directional *rlcBiCfg)
5490 /* UL UM BI DIR Cfg */
5491 if(rlcBiCfg->dl_UM_RLC.sn_FieldLength)
5493 umBiCfgToSet->ulUmCfg.snLenUlUm = *(rlcBiCfg->dl_UM_RLC.sn_FieldLength);
5494 umBiCfgToSet->ulUmCfg.reAssemTmr = rlcBiCfg->dl_UM_RLC.t_Reassembly;
5497 /* DL UM BI DIR Cfg */
5498 if(rlcBiCfg->ul_UM_RLC.sn_FieldLength)
5499 umBiCfgToSet->dlUmCfg.snLenDlUm = *(rlcBiCfg->ul_UM_RLC.sn_FieldLength);
5503 /*******************************************************************
5505 * @brief Function to build Um Ul Info
5509 * Function : extractRlcUmUlCfg
5511 * Functionality: Function to build Um Ul Info
5513 * @params[in] UmUniDirUlBearerCfg *
5516 * @return ROK/RFAILED
5518 * ****************************************************************/
5520 void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_Uni_Directional_DL *umUlCfg)
5524 if(umUlCfg->dl_UM_RLC.sn_FieldLength)
5526 umUlCfgToSet->ulUmCfg.snLenUlUm = *(umUlCfg->dl_UM_RLC.sn_FieldLength);
5527 umUlCfgToSet->ulUmCfg.reAssemTmr = umUlCfg->dl_UM_RLC.t_Reassembly;
5532 /*******************************************************************
5534 * @brief Function to build Um Uni Dl Info
5538 * Function : extractRlcUmDlCfg
5540 * Functionality: Function to build Um Uni Dl Info
5542 * @params[in] UmUniDirDlBearerCfg *
5545 * @return ROK/RFAILED
5547 * ****************************************************************/
5548 void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_Uni_Directional_UL *umDlCfg)
5552 if(umDlCfg->ul_UM_RLC.sn_FieldLength)
5553 umDlCfgToSet->dlUmCfg.snLenDlUm = *(umDlCfg->ul_UM_RLC.sn_FieldLength);
5557 /*******************************************************************
5559 * @brief Function to extractRlcModeCfg
5563 * Function : extractRlcModeCfg
5565 * Functionality: Function to extractRlcModeCfg
5567 * @params[in] RLC_Config_t *
5570 * @return ROK/RFAILED
5572 * ****************************************************************/
5573 void extractRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *rlcDbCfg, RLC_Config_t *lcCfg)
5581 if(lcCfg->choice.am)
5583 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
5584 if(rlcDbCfg->u.amCfg)
5585 extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
5589 case RLC_UM_BI_DIRECTIONAL :
5591 if(lcCfg->choice.um_Bi_Directional)
5593 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
5594 if(rlcDbCfg->u.umBiDirCfg)
5595 extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
5599 case RLC_UM_UNI_DIRECTIONAL_UL :
5601 if(lcCfg->choice.um_Uni_Directional_DL)
5603 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
5604 if(rlcDbCfg->u.umUniDirUlCfg)
5605 extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
5609 case RLC_UM_UNI_DIRECTIONAL_DL :
5611 if(lcCfg->choice.um_Uni_Directional_UL)
5613 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
5614 if(rlcDbCfg->u.umUniDirDlCfg)
5615 extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
5620 DU_LOG("\nDUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
5626 /*******************************************************************
5628 * @brief Function to extract extractUlLcCfg
5632 * Function : extractUlLcCfg
5634 * Functionality: Function to extract extractUlLcCfg
5636 * @params[in] UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg
5639 * ****************************************************************/
5641 void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg)
5645 if(ulLcCfg->ul_SpecificParameters)
5647 f1UlLcCfg->priority = \
5648 ulLcCfg->ul_SpecificParameters->priority;
5649 if(ulLcCfg->ul_SpecificParameters->logicalChannelGroup)
5651 f1UlLcCfg->lcGroup = \
5652 *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup);
5654 if(ulLcCfg->ul_SpecificParameters->schedulingRequestID)
5656 f1UlLcCfg->schReqId = \
5657 *(ulLcCfg->ul_SpecificParameters->schedulingRequestID);
5660 ulLcCfg->ul_SpecificParameters->prioritisedBitRate;
5662 ulLcCfg->ul_SpecificParameters->bucketSizeDuration;
5667 /*******************************************************************
5669 * @brief Function to procRlcLcCfg
5673 * Function : procRlcLcCfg
5675 * Functionality: Function to procRlcLcCfg
5677 * @params[in] rbId, lcId, rbType, rlcMod
5678 * RLC_Config_t *, RlcBearerCfg * ,
5681 * ****************************************************************/
5683 void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\
5684 uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg)
5688 lcCfg->configType = configType;
5690 if(rbType == RB_TYPE_SRB)
5692 lcCfg->rbType = RB_TYPE_SRB;
5694 lcCfg->lcType = LCH_DCCH;
5695 lcCfg->rlcMode = RLC_AM;
5697 else if(rbType == RB_TYPE_DRB)
5699 lcCfg->rbType = RB_TYPE_DRB;
5701 lcCfg->lcType = LCH_DTCH;
5702 lcCfg->rlcMode = rlcMode;
5704 if(f1RlcCfg) /* rlc mode config recived */
5706 extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg);
5712 /*******************************************************************
5714 * @brief Fills DrbQos Info received by CU
5718 * Function : extractQosInfo
5720 * Functionality: Fills DrbQos Info received by CU
5722 * @params[in] DrbQosInfo *qosToAdd,
5723 * QoSFlowLevelQoSParameters_t *qosFlowCfg
5726 * ****************************************************************/
5728 void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg)
5730 qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present;
5731 qosToAdd->u.nonDyn5Qi.fiveQi =\
5732 qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
5733 if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow)
5735 qosToAdd->u.nonDyn5Qi.avgWindow = \
5736 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
5738 qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \
5739 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
5740 if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel)
5742 qosToAdd->u.nonDyn5Qi.priorLevel = \
5743 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel);
5745 qosToAdd->ngRanRetPri.priorityLevel = \
5746 qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel;
5747 qosToAdd->ngRanRetPri.preEmptionCap = \
5748 qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability;
5749 qosToAdd->ngRanRetPri.preEmptionVul = \
5750 qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability;
5751 if(qosFlowCfg->gBR_QoS_Flow_Information)
5753 memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \
5754 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \
5755 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size);
5756 memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \
5757 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \
5758 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size);
5759 memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\
5760 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \
5761 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size);
5762 memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\
5763 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \
5764 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size);
5766 qosToAdd->pduSessionId = 0;
5767 qosToAdd->ulPduSessAggMaxBitRate = 0;
5770 uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd)
5772 DRB_Information_t *drbInfo = NULLP;
5774 if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
5776 if(drbItem->qoSInformation.choice.choice_extension->value.present ==
5777 QoSInformation_ExtIEs__value_PR_DRB_Information)
5779 drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
5781 if(!macLcToAdd->drbQos)
5783 DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
5784 if(macLcToAdd->drbQos == NULLP)
5786 DU_LOG("\n DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
5791 if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
5793 extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
5794 macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
5796 if(!macLcToAdd->snssai)
5798 DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
5799 if(macLcToAdd->snssai == NULLP)
5801 DU_LOG("\n DUAPP:Memory failed at allocating SNSSAI at extractDrbCfg()");
5805 memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
5806 drbInfo->sNSSAI.sST.size);
5807 if(drbInfo->sNSSAI.sD)
5809 memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
5810 drbInfo->sNSSAI.sD->size);
5812 }/*End of DRB Info*/
5817 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
5823 ret = extractDrbCfg(drbCfg, lcCfg);
5826 DU_LOG("F1AP: Failed to build Drb Qos at extractMacRbCfg()");
5832 lcCfg->drbQos = NULLP;
5833 lcCfg->snssai = NULLP;
5834 if(lcCfg->lcId == SRB2_LCID)
5835 lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
5837 lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
5841 lcCfg->ulLcCfgPres = true;
5842 extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
5845 lcCfg->ulLcCfgPres = false;
5849 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
5850 DRBs_ToBeSetup_Item_t *drbItem, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
5855 lcCfg->configType = configType;
5856 if(rbType == RB_TYPE_SRB)
5858 ret = extractMacRbCfg(lcId, NULL, ulLcCfg, lcCfg);
5860 else if(rbType == RB_TYPE_DRB)
5862 ret = extractMacRbCfg(lcId, drbItem, ulLcCfg, lcCfg);
5867 /*******************************************************************
5869 * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
5873 * Function : extractRlcCfgToAddMod
5875 * Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
5877 * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
5879 * @return ROK/RFAILED
5881 * ****************************************************************/
5883 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, \
5886 uint8_t ret, idx, rbId, lcId, rlcMode, rbType;
5887 RLC_Config_t *f1RlcCfg = NULLP;
5888 LogicalChannelConfig_t *macUlLcCfg = NULLP;
5890 for(idx = 0; idx < lcCfg->list.count; idx++)
5892 lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
5893 if(lcCfg->list.array[idx]->servedRadioBearer)
5895 /* RadioBearer for SRB/DRB */
5896 if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
5897 RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
5899 rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
5900 rbType = RB_TYPE_SRB;
5902 else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
5903 RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
5905 rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
5906 rbType = RB_TYPE_DRB;
5910 DU_LOG("\n No components present in Bearer config to ADD/MOD");
5913 /* MAC UL LC Config */
5914 if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
5916 macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
5921 DU_LOG("\nDUAPP: Received RadioBearer config is NULL");
5924 /* RLC Mode Config */
5925 if(lcCfg->list.array[idx]->rlc_Config)
5927 rlcMode = lcCfg->list.array[idx]->rlc_Config->present;
5928 f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
5931 /* Filling RLC/MAC Config*/
5932 memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
5933 memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
5934 procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
5935 ret = procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx]);
5938 DU_LOG("\nDUAPP: Failed while filling MAC LC config at extractRlcCfgToAddMod()");
5941 (ueCfgDb->numRlcLcs)++;
5942 (ueCfgDb->numMacLcs)++;
5944 //TODO: To send the failure cause in UeContextSetupRsp
5948 /*******************************************************************
5950 * @brief DeAlloc pdsch serv cell config info
5954 * Function : freeMacPdschServCellInfo
5956 * Functionality: DeAlloc pdsch serv cell config info
5958 * @params[in] PdschServCellCfg pointer
5961 * ****************************************************************/
5963 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
5965 if(pdsch->xOverhead)
5967 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(uint8_t));
5969 if(pdsch->codeBlkGrpFlushInd)
5971 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
5973 if(pdsch->maxCodeBlkGrpPerTb)
5975 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(uint8_t));
5977 if(pdsch->maxMimoLayers)
5979 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
5983 /*******************************************************************
5985 * @brief Free Serving cell Info
5989 * Function : freeMacServingCellInfo
5991 * Functionality: Free Serving cell Info
5993 * @params[in] ServCellCfgInfo *srvCellCfg
5996 * ****************************************************************/
5997 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
5999 freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
6000 if(srvCellCfg->bwpInactivityTmr)
6002 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
6006 /*******************************************************************
6008 * @brief Free cell Grp Cfg Info
6012 * Function : freeUeReCfgCellGrpInfo
6014 * Functionality: Free cell Grp Cfg Info
6016 * @params[in] MacUeCfg* duUeCfg
6019 * ****************************************************************/
6021 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
6023 freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
6026 /*******************************************************************
6028 * @brief Fills Reconfig SchReqReConfig
6032 * Function : extractSchReqReConfig
6034 * Functionality: Fills Reconfig SchReqReConfig
6036 * @params[in] SchedulingRequestConfig_t *cuSchedReq
6037 * SchedReqCfg* macSchedReq
6040 * ****************************************************************/
6041 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
6043 uint8_t schReqIdx = 0;
6044 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
6045 struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
6047 if(cuSchedReq->schedulingRequestToAddModList)
6049 schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
6050 if(schReqListToAdd->list.count)
6052 macSchedReq->addModListCount = schReqListToAdd->list.count;
6053 for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
6055 macSchedReq->addModList[schReqIdx].schedReqId = \
6056 schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
6057 macSchedReq->addModList[schReqIdx].srProhibitTmr = \
6058 *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
6059 macSchedReq->addModList[schReqIdx].srTransMax =\
6060 schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
6064 /* Scheduling Req To release */
6065 if(cuSchedReq->schedulingRequestToReleaseList)
6067 schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
6068 if(schReqListToRel->list.count)
6070 macSchedReq->relListCount = schReqListToRel->list.count;
6071 for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
6073 macSchedReq->relList[schReqIdx] = \
6074 *schReqListToRel->list.array[schReqIdx];
6080 /*******************************************************************
6082 * @brief Fills TagReconfig
6086 * Function : extractTagReconfig
6088 * Functionality: Fills extractTagReconfig
6090 * @params[in] TAG_Config_t *cuTagCfg
6094 * ****************************************************************/
6096 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
6099 struct TAG_Config__tag_ToAddModList *tagListToAddMod = NULLP;
6100 struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
6102 /* Tag config to AddMod */
6103 if(cuTagCfg->tag_ToAddModList)
6105 tagListToAddMod = cuTagCfg->tag_ToAddModList;
6106 if(tagListToAddMod->list.count)
6108 macTagCfg->addModListCount = tagListToAddMod->list.count;
6109 for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
6111 macTagCfg->addModList[tagIdx].tagId =\
6112 tagListToAddMod->list.array[tagIdx]->tag_Id;
6113 macTagCfg->addModList[tagIdx].timeAlignTimer = \
6115 tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
6119 /* Tag config to release */
6120 if(cuTagCfg->tag_ToReleaseList)
6122 tagListToRel = cuTagCfg->tag_ToReleaseList;
6123 if(tagListToRel->list.count)
6125 macTagCfg->relListCount = tagListToRel->list.count;
6126 for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
6128 macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];
6134 /*******************************************************************
6136 * @brief Fills PdcchCfg received by CU
6140 * Function : extractPdcchCfg
6142 * Functionality: Fills PdcchCfg received by CU
6144 * @params[in] PDCCH_Config_t *cuPdcchCfg,
6145 * PdcchConfig *duPdcchCfg
6148 * ****************************************************************/
6150 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
6152 uint8_t cRsetIdx = 0;
6153 uint8_t srchSpcIdx = 0;
6155 struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
6156 struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
6157 struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
6158 struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
6161 /* Control Resource Set To Add/Mod List */
6162 if(cuPdcchCfg->controlResourceSetToAddModList)
6164 cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
6165 if(cRsetToAddModList->list.count)
6167 macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
6168 for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
6170 macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
6171 cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
6172 bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
6173 macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
6174 macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
6175 cRsetToAddModList->list.array[cRsetIdx]->duration;
6177 macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
6178 cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;
6179 if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
6181 //TODO: handle the case for Interleaved
6183 macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
6184 cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
6185 if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
6187 macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
6188 *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
6194 /* Control Resource Set To Release List */
6195 if(cuPdcchCfg->controlResourceSetToReleaseList)
6197 cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
6198 if(cRsetToRelList->list.count)
6200 macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
6201 for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
6203 macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
6208 /* Search space To Add/Mod List */
6209 if(cuPdcchCfg->searchSpacesToAddModList)
6211 srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
6212 if(srchSpcToAddModList->list.count)
6214 macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
6215 for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
6217 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
6218 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
6219 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
6220 *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
6221 if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
6223 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
6224 srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
6226 if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
6228 bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
6229 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
6231 if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
6233 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
6234 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
6235 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
6236 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
6237 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
6238 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
6240 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
6241 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
6243 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
6244 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
6246 if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
6248 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
6249 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
6250 if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
6252 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
6253 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
6260 /* Search space To Rel List */
6261 if(cuPdcchCfg->searchSpacesToReleaseList)
6263 srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
6264 if(srchSpcToRelList->list.count)
6266 macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
6267 for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
6269 macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
6270 *(srchSpcToRelList->list.array[srchSpcIdx]);
6276 /*******************************************************************
6278 * @brief Fills PdschCfg received by CU
6282 * Function : extractPdschCfg
6284 * Functionality: Fills PdschCfg received by CU
6286 * @params[in] PDSCH_Config_t *cuPdschCfg,
6287 * PdschConfig *macPdschCfg
6290 * ****************************************************************/
6292 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
6295 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
6297 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6299 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
6300 PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
6302 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
6304 macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
6305 *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
6309 macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
6310 if(cuPdschCfg->pdsch_TimeDomainAllocationList)
6312 timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
6313 if(timeDomAlloc->present ==\
6314 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
6316 if(timeDomAlloc->choice.setup)
6318 macPdschCfg->numTimeDomRsrcAlloc = timeDomAlloc->choice.setup->list.count;
6319 for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
6321 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
6322 timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
6323 //macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbol = \
6325 //macPdschCfg->timeDomRsrcAllociList[timeDomIdx].symbolLength;
6326 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
6327 timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
6332 macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
6333 if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
6334 macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
6335 if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
6337 macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
6338 if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
6340 if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
6342 macPdschCfg->bundlingInfo.StaticBundling.size = \
6343 *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
6347 else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
6349 macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
6354 /*******************************************************************
6356 * @brief Fills PdschServingCellCfg received by CU
6360 * Function : extractPdschServingCellCfg
6362 * Functionality: Fills PdschCfg received by CU
6364 * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
6365 * PdschServCellCfg *macUePdschSrvCellCfg
6366 * @return ROK/RFAILED
6368 * ****************************************************************/
6370 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
6372 if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
6374 if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
6376 if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
6378 *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb) = \
6379 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
6383 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(uint8_t));
6384 if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
6386 *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb) = \
6387 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
6391 DU_LOG("\nDUAPP: Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
6395 if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
6397 *(macUePdschSrvCellCfg->codeBlkGrpFlushInd) = \
6398 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
6402 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(bool));
6403 if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
6405 *(macUePdschSrvCellCfg->codeBlkGrpFlushInd) = \
6406 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
6410 DU_LOG("\nDUAPP: Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
6416 if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
6418 macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH);
6420 if(cuPdschSrvCellCfg->ext1)
6422 if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
6424 if(macUePdschSrvCellCfg->maxMimoLayers)
6426 *(macUePdschSrvCellCfg->maxMimoLayers) = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
6430 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
6431 if(macUePdschSrvCellCfg->maxMimoLayers)
6433 *(macUePdschSrvCellCfg->maxMimoLayers) = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
6437 DU_LOG("\nDUAPP: Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
6443 if(cuPdschSrvCellCfg->xOverhead)
6445 if(macUePdschSrvCellCfg->xOverhead)
6447 *(macUePdschSrvCellCfg->xOverhead) = *(cuPdschSrvCellCfg->xOverhead);
6451 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(uint8_t));
6452 if(macUePdschSrvCellCfg->xOverhead)
6454 *(macUePdschSrvCellCfg->xOverhead) = *(cuPdschSrvCellCfg->xOverhead);
6458 DU_LOG("\nDUAPP: Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
6466 /*******************************************************************
6468 * @brief Fills PuschCfg received by CU
6472 * Function : extractPuschCfg
6474 * Functionality: Fills PuschCfg received by CU
6476 * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
6477 * PuschCfg *macPuschCfg
6480 * ****************************************************************/
6482 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
6484 uint8_t timeDomIdx = 0;
6485 DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
6486 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
6488 if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
6490 if(cuPuschCfg->choice.setup)
6492 if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
6494 macPuschCfg->dataScramblingId = \
6495 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
6497 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
6499 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
6501 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
6503 dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
6504 if(dmrsUlCfg->dmrs_AdditionalPosition)
6506 macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
6507 *(dmrsUlCfg->dmrs_AdditionalPosition);
6509 if(dmrsUlCfg->transformPrecodingDisabled)
6511 if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
6513 macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
6514 *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
6520 /*Res Alloc Type for UL */
6521 if(cuPuschCfg->choice.setup->resourceAllocation)
6523 macPuschCfg->resourceAllocType = \
6524 cuPuschCfg->choice.setup->resourceAllocation;
6526 if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
6528 timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
6529 if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
6531 if(timeDomAllocList->choice.setup)
6533 macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
6534 for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
6536 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
6537 *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
6538 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
6539 timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
6540 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
6541 timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
6542 //macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbol = \
6543 timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbol;
6544 //macPuschCfg->timeDomRsrcAllocList[timeDomIdx].symbolLen = \
6545 timeDomAllocList->choice.setup->list.array[timeDomIdx]->symbolLen;
6550 if(cuPuschCfg->choice.setup->transformPrecoder)
6551 macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
6555 /*******************************************************************
6557 * @brief Fills ServingCellReconfig received by CU
6561 * Function : extractServingCellReconfig
6563 * Functionality: Fills ServingCellReconfig received by CU
6565 * @params[in] ServingCellConfig_t *cuSrvCellCfg
6566 * ServCellCfgInfo *macSrvCellCfg
6567 * @return ROK/RFAILD
6569 * ****************************************************************/
6570 uint8_t extractServingCellReconfig(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg)
6573 BWP_DownlinkDedicated_t *dlBwp = NULLP;
6574 BWP_UplinkDedicated_t *ulBwp = NULLP;
6576 if(cuSrvCellCfg->initialDownlinkBWP)
6578 dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
6579 if(dlBwp->pdcch_Config)
6581 if(dlBwp->pdcch_Config->choice.setup)
6583 extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
6586 if(dlBwp->pdsch_Config)
6588 if(dlBwp->pdsch_Config->choice.setup)
6590 extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg);
6594 if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
6595 macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
6596 if(cuSrvCellCfg->defaultDownlinkBWP_Id)
6597 macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
6598 if(cuSrvCellCfg->bwp_InactivityTimer)
6600 if(macSrvCellCfg->bwpInactivityTmr)
6602 memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
6606 macSrvCellCfg->bwpInactivityTmr = NULLP;
6607 DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
6608 if(macSrvCellCfg->bwpInactivityTmr)
6610 memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
6614 DU_LOG("\nMemory Alloc failed for bwpInactivityTmr at extractServingCellReconfig()");
6619 if(cuSrvCellCfg->pdsch_ServingCellConfig)
6621 if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
6623 ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
6626 DU_LOG("\nFailed at extractPdschServingCellCfg()");
6631 if(cuSrvCellCfg->uplinkConfig)
6633 if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
6635 ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
6636 if(ulBwp->pusch_Config)
6638 macSrvCellCfg->initUlBwp.puschPresent = true;
6639 extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
6641 if(ulBwp->pucch_Config)
6643 macSrvCellCfg->initUlBwp.pucchPresent = true;
6644 //extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg);
6647 if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
6648 macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
6653 /*******************************************************************
6655 * @brief Fills Reconfig Cell group Info received by CU
6659 * Function : extractUeReCfgCellInfo
6661 * Functionality: Fills Reconfig Cell group Info received by CU
6663 * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
6664 * MacUeCfg* macUeCfg
6665 * @return ROK/RFAILED
6667 * ****************************************************************/
6668 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg)
6671 MAC_CellGroupConfig_t *macCellGroup = NULLP;
6672 PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
6673 SpCellConfig_t *spcellCfg = NULLP;
6674 ServingCellConfig_t *servCellCfg = NULLP;
6678 /* Fill MacCell Group Reconfig */
6679 if(cellGrp->mac_CellGroupConfig)
6681 macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
6682 if(macCellGroup->schedulingRequestConfig)
6684 extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
6686 if(macCellGroup->tag_Config)
6688 extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
6691 /* Fill Physical Cell Group Reconfig */
6692 if(cellGrp->physicalCellGroupConfig)
6694 phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
6695 if(phyCellGrpCfg->p_NR_FR1)
6697 if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
6698 macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
6700 macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
6702 /* Fill SpCell Reconfig */
6703 if(cellGrp->spCellConfig)
6705 spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));
6706 if(spcellCfg->servCellIndex)
6708 macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
6710 /* Fill Serving cell Reconfig info */
6711 if(cellGrp->spCellConfig->spCellConfigDedicated)
6713 servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
6714 ret = extractServingCellReconfig(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
6717 DU_LOG("\n Failed at extractServingCellReconfig()");
6725 /*******************************************************************
6727 * @brief builds Mac Cell Cfg
6731 * Function : procUeReCfgCellInfo
6733 * Functionality: builds Mac Cell Cfg
6735 * @params[in] MacUeCfg pointer
6740 * ****************************************************************/
6741 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, void *cellInfo)
6744 CellGroupConfigRrc_t *cellGrp = NULLP;
6748 cellGrp = (CellGroupConfigRrc_t *)cellInfo;
6749 ret = extractUeReCfgCellInfo(cellGrp, macUeCfg);
6751 DU_LOG("\nF1AP: Failed at procUeReCfgCellInfo()");
6755 freeUeReCfgCellGrpInfo(macUeCfg);
6760 /*******************************************************************
6762 * @brief Function to extract cellGrp Info present in cutoDu cont
6766 * Function : extractCellGrpInfo
6768 * Functionality: Function to extract cellGrp Info present
6771 * @params[in] ProtocolExtensionContainer_4624P16_t pointer
6773 * @return CellGroupConfigRrc_t *
6775 * ****************************************************************/
6777 CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
6782 uint16_t recvBufLen;
6783 CellGroupConfigRrc_t *cellGrpCfg = NULLP;
6784 CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
6785 asn_dec_rval_t rval; /* Decoder return value */
6786 memset(&rval, 0, sizeof(asn_dec_rval_t));
6790 for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++)
6792 extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2]));
6796 case ProtocolIE_ID_id_CellGroupConfig:
6798 recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
6799 /* decoding the CellGroup Buf received */
6800 DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
6803 memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
6804 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
6805 extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
6806 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6808 DU_LOG("\nF1AP : ASN decode failed at decodeCellGrpCfg()");
6811 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
6812 if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
6818 DU_LOG("\nF1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id);
6826 /*******************************************************************
6828 * @brief Fills Srb List received by CU
6832 * Function : procSrbListToSetup
6834 * Functionality: Fills Srb List received by CU
6836 * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
6838 * RlcBearerCfg pointer
6841 * ****************************************************************/
6842 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
6846 /* Filling RLC INFO */
6847 procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
6849 /* Filling MAC INFO */
6850 ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL, NULL, macLcToAdd);
6853 DU_LOG("\nF1AP:Failed at MAC LC Cfg in procSrbListToSetup()");
6861 /*******************************************************************
6863 * @brief extract Srb List received by CU
6867 * Function : extractSrbListToSetup
6869 * Functionality: extract Srb List received by CU
6870 * for both MAC and RLC
6872 * @params[in] SRBs_ToBeSetup_Item_t pointer
6874 * @return ROK/RFAIED
6876 * ****************************************************************/
6878 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
6880 uint8_t ret, srbIdx;
6881 SRBs_ToBeSetup_Item_t *srbItem = NULLP;
6885 for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
6887 srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
6888 if(ueCfgDb->numMacLcs > MAX_NUM_LC)
6890 DU_LOG("\nF1AP: MAX LC Reached in MAC");
6894 if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
6896 DU_LOG("\nF1AP: MAX LC Reached in RLC");
6900 memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
6901 memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
6902 ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
6903 &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
6904 ueCfgDb->numRlcLcs++;
6905 ueCfgDb->numMacLcs++;
6908 DU_LOG("\nF1AP: Failed at extractSrbListToSetup()");
6919 /*******************************************************************
6921 * @brief Fills Drb List received by CU
6925 * Function : procDrbListToSetup
6927 * Functionality: Fills Drb List received by CU
6928 * for both MAC and RLC
6930 * @params[in] SRBs_ToBeSetup_Item_t pointer
6932 * RlcBearerCfg pointer
6935 * ****************************************************************/
6937 uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
6941 /* Filling RLC INFO */
6942 procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
6944 /* Filling MAC INFO */
6945 ret = procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, macLcToAdd);
6948 DU_LOG("\nF1AP:Failed at RLC LC Cfg in extractDrbListToSetup()");
6955 /*******************************************************************
6957 * @brief extract Drb List received by CU
6961 * Function : extractDrbListToSetup
6963 * Functionality: extract Drb List received by CU
6964 * for both MAC and RLC
6966 * @params[in] DRBs_ToBeSetup_Item_t pointer
6968 * @return ROK/RFAIED
6970 * ****************************************************************/
6972 uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg, DuUeCfg *ueCfgDb)
6974 uint8_t ret, drbIdx;
6975 DRBs_ToBeSetup_Item_t *drbItem = NULLP;
6980 for(drbIdx = 0; drbIdx < drbCfg->list.count; drbIdx++)
6982 drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
6983 if(ueCfgDb->numMacLcs > MAX_NUM_LC)
6985 DU_LOG("\nF1AP: MAX LC Reached in MAC ");
6989 if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
6991 DU_LOG("\nF1AP: MAX LC Reached in RLC");
6995 memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
6996 memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
6997 ret = procDrbListToSetup(lcId, drbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
6998 &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
6999 ueCfgDb->numRlcLcs++;
7000 ueCfgDb->numMacLcs++;
7003 DU_LOG("\nF1AP: Failed at extractDrbListToSetup()");
7014 /*******************************************************************
7016 * @brief Process UE context setup request from CU
7020 * Function : procF1UeContextSetupReq
7022 * Functionality: Process UE context setup request from CU
7024 * @params[in] F1AP message
7025 * @return ROK - success
7028 * ****************************************************************/
7029 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
7031 uint8_t ret, ieIdx, ueIdx, lcId, cellIdx;
7032 bool ueCbFound = false;
7033 uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
7034 DuUeCb *duUeCb = NULLP;
7035 UEContextSetupRequest_t *ueSetReq = NULLP;
7039 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
7040 for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
7042 switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
7044 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7046 gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
7049 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7051 gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
7054 case ProtocolIE_ID_id_ServCellIndex:
7056 cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
7057 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
7059 if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
7060 (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
7063 duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
7064 DU_ALLOC(duUeCb->f1UeDb, sizeof(UeContextSetupDb));
7067 memset(duUeCb->f1UeDb, 0, sizeof(UeContextSetupDb));
7068 duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
7069 duUeCb->f1UeDb->cellIdx = cellIdx;
7073 DU_LOG("\nF1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
7083 DU_LOG("\nF1AP: DuUeCb is not found at procF1UeContextSetupReq()");
7088 case ProtocolIE_ID_id_SpCellULConfigured:
7089 /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL,
7090 UL, SUL or UL+SUL for the indicated cell for the UE */
7092 case ProtocolIE_ID_id_CUtoDURRCInformation:
7094 if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
7096 duUeCb->f1UeDb->cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
7097 value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
7098 if(!duUeCb->f1UeDb->cellGrpCfg)
7100 DU_LOG("\n F1AP: Failed to extract cell Grp Info");
7101 //TODO: Update the failure cause in ue context Setup Response
7107 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
7109 DU_LOG("\nDU_APP: Received SCell to be added");
7110 DU_LOG("\nDU_APP: Not processing the SCell_ToBeSetup_List");
7113 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
7115 if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
7116 &duUeCb->f1UeDb->duUeCfg))
7118 DU_LOG("\nDU_APP: Failed at extractSrbListToSetup()");
7119 //TODO: Update the failure cause in ue context Setup Response
7124 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
7126 lcId = getDrbLcId(&duUeCb->drbBitMap);
7129 if(extractDrbListToSetup(lcId, &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List,\
7130 &duUeCb->f1UeDb->duUeCfg))
7132 DU_LOG("\nDU_APP: Failed at extractDrbListToSetup()");
7133 //TODO: Update the failure cause in ue context Setup Response
7141 case ProtocolIE_ID_id_RRCContainer:
7143 duUeCb->f1UeDb->rrcMsgLen = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size;
7144 if(duUeCb->f1UeDb->rrcMsgLen > 0)
7146 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->rrcMsg, duUeCb->f1UeDb->rrcMsgLen);
7147 if(!duUeCb->f1UeDb->rrcMsg)
7149 DU_LOG("\nDU APP : Memory allocation failed for RRC Msg in procUeCtxtSetupReq");
7154 memcpy(duUeCb->f1UeDb->rrcMsg, ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
7155 duUeCb->f1UeDb->rrcMsgLen);
7162 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
7164 duUeCb->f1UeDb->deliveryStaReq = true;
7167 //TODO: To handle maxAggrBitRate case,
7168 // Dependency: The protocolIE is not specified in ASN
7170 case ProtocolIE_ID_id_ULPDUSessionAggregateMaximumBitRate: {
7171 /* MaximumBitRate Uplink */
7172 bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
7175 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.maxAggrBitRate, bitRateSize);
7176 if(!duUeCb->f1UeDb->duUeCfg.maxAggrBitRate)
7178 DU_LOG("\nDU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
7183 duUeCb->f1UeDb->duUeCfg.maxAggrBitRate->ulBits =\
7184 *ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf;
7185 duUeCb->f1UeDb->duUeCfg.maxAggrBitRate->dlBits = 0;
7201 /*TODO : Negative case*/
7202 // BuildAndSendUeContextSetupRsp(ueIdx, cellId);
7203 DU_LOG("F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()");
7206 ret = duProcUeContextSetupRequest(duUeCb);
7212 /*******************************************************************
7213 * @brief Free the memory allocated for UE Setup response
7217 * Function : FreeUeContextSetupRsp
7220 * Free the memory allocated for UE Setup response
7222 * @params[in] F1AP PDU for UE setup response
7223 * @return ROK - success
7226 * ****************************************************************/
7227 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
7230 UEContextSetupResponse_t *ueSetRsp = NULLP;
7234 if(f1apMsg->choice.successfulOutcome)
7236 ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
7237 UEContextSetupResponse;
7238 if(ueSetRsp->protocolIEs.list.array)
7240 for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
7242 if(ueSetRsp->protocolIEs.list.array[idx])
7244 switch(ueSetRsp->protocolIEs.list.array[idx]->id)
7246 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
7248 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
7250 case ProtocolIE_ID_id_DUtoCURRCInformation:
7252 CellGroupConfig_t *cellGrpCfg = NULLP;
7253 cellGrpCfg = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
7254 DUtoCURRCInformation.cellGroupConfig;
7255 if(cellGrpCfg->buf != NULLP)
7257 DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
7263 DU_LOG("\nDUAPP: Invalid Id %ld at FreeUeContextSetupRsp()", ueSetRsp->protocolIEs.list.array[idx]->id);
7266 DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
7267 sizeof(UEContextSetupResponseIEs_t));
7270 DU_FREE(ueSetRsp->protocolIEs.list.array, \
7271 ueSetRsp->protocolIEs.list.size);
7273 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7275 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7279 /*******************************************************************
7281 * @brief Builds Ue context Setup Rsp DU To CU Info
7285 * Function : EncodeUeCntxtDuToCuInfo
7287 * Functionality: Builds Ue context Setup Rsp DU To CU Info
7289 * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t *
7291 * @return ROK - success
7294 ******************************************************************/
7296 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
7298 asn_enc_rval_t encRetVal;
7300 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
7301 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7303 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
7304 /* Encode results */
7305 if(encRetVal.encoded == ENCODE_FAIL)
7307 DU_LOG( "\n F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
7308 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7313 DU_LOG("\n F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
7314 for(int i=0; i< encBufSize; i++)
7316 printf("%x",encBuf[i]);
7319 duToCuCellGrp->size = encBufSize;
7320 DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
7321 if(!duToCuCellGrp->buf)
7323 DU_LOG("\nF1AP : Memory allocation failed in UeCntxtDuToCuInfo");
7325 memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
7329 /*******************************************************************
7331 * @brief Builds and sends the UE Setup Response
7335 * Function : BuildAndSendUeContextSetupRsp
7337 * Functionality: Constructs the UE Setup Response and sends
7338 * it to the DU through SCTP.
7342 * @return ROK - success
7345 * ****************************************************************/
7346 uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId)
7348 uint8_t idx, ret, cellIdx, elementCnt;
7349 uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */
7350 uint32_t gnbDuUeF1apId; /* gNB-DU UE F1AP Id */
7351 asn_enc_rval_t encRetVal; /* Encoder return value */
7352 F1AP_PDU_t *f1apMsg = NULLP;
7353 UEContextSetupResponse_t *ueSetRsp = NULLP;
7354 CellGroupConfigRrc_t *cellGrpCfg = NULLP;
7355 DuUeCb *ueCb = NULLP;
7357 DU_LOG("\n F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
7361 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7362 if(f1apMsg == NULLP)
7364 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
7369 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7370 DU_ALLOC(f1apMsg->choice.successfulOutcome,
7371 sizeof(SuccessfulOutcome_t));
7372 if(f1apMsg->choice.successfulOutcome == NULLP)
7374 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
7379 f1apMsg->choice.successfulOutcome->procedureCode = \
7380 ProcedureCode_id_UEContextSetup;
7381 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7382 f1apMsg->choice.successfulOutcome->value.present = \
7383 SuccessfulOutcome__value_PR_UEContextSetupResponse;
7386 &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
7388 ueSetRsp->protocolIEs.list.count = elementCnt;
7389 ueSetRsp->protocolIEs.list.size = \
7390 elementCnt * sizeof(UEContextSetupResponse_t *);
7392 /* Initialize the UESetup members */
7393 DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
7394 ueSetRsp->protocolIEs.list.size);
7395 if(ueSetRsp->protocolIEs.list.array == NULLP)
7397 DU_LOG(" F1AP : Memory allocation for UE Setup Response failed");
7402 for(idx=0; idx<elementCnt; idx++)
7404 DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
7405 sizeof(UEContextSetupResponseIEs_t));
7406 if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
7408 DU_LOG(" F1AP : Memory allocation for UE Setup Response failed");
7413 /* Fetching Ue Cb Info*/
7414 GET_CELL_IDX(cellId, cellIdx);
7415 gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
7416 gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
7417 ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
7420 /*GNB CU UE F1AP ID*/
7421 ueSetRsp->protocolIEs.list.array[idx]->id = \
7422 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
7423 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7424 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
7425 UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
7426 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
7428 /*GNB DU UE F1AP ID*/
7430 ueSetRsp->protocolIEs.list.array[idx]->id = \
7431 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7432 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7433 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
7434 UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
7435 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
7438 /*DUtoCURRC Information */
7440 ueSetRsp->protocolIEs.list.array[idx]->id = \
7441 ProtocolIE_ID_id_DUtoCURRCInformation;
7442 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7443 ueSetRsp->protocolIEs.list.array[idx]->value.present =\
7444 UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
7447 if(ueCb->f1UeDb->cellGrpCfg)
7449 cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->cellGrpCfg;
7450 ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
7451 choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
7452 /* Free UeContext Db created during Ue context Req */
7453 freeF1UeDb(ueCb->f1UeDb);
7458 DU_LOG("\nF1AP: Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
7464 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7466 /* Encode the UE context setup response type as APER */
7467 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
7469 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7471 /* Encode results */
7472 if(encRetVal.encoded == ENCODE_FAIL)
7474 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
7475 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7481 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
7482 for(int i=0; i< encBufSize; i++)
7484 printf("%x",encBuf[i]);
7489 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
7491 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
7497 FreeUeContextSetupRsp(f1apMsg);
7499 }/* End of BuildAndSendUeContextSetupRsp */
7502 uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId)
7504 uint8_t cellIdx = 0, actionType = 0;
7506 GET_CELL_IDX(cellId, cellIdx);
7507 actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
7512 BuildAndSendUeContextSetupRsp(ueIdx, cellId);
7515 //TODO: Build Ue context Modification Rsp
7518 DU_LOG("F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
7525 /*******************************************************************
7527 * @brief deallocating the memory of F1reset msg
7531 * Function : FreeF1ResetReq
7534 * - freeing memory of F1reset request msg
7540 * ****************************************************************/
7541 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
7544 Reset_t *f1ResetMsg;
7548 if(f1apMsg->choice.initiatingMessage)
7550 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
7552 if(f1ResetMsg->protocolIEs.list.array)
7554 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
7556 if(f1ResetMsg->protocolIEs.list.array[idx])
7558 DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
7561 DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
7563 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7565 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7568 /*******************************************************************
7570 * @brief Build and Send F1reset request
7574 * Function : BuildAndSendF1ResetReq
7577 * - Build and Send F1reset request msg
7580 * @return ROK - success
7583 * ****************************************************************/
7584 uint8_t BuildAndSendF1ResetReq()
7586 uint8_t elementCnt=0;
7588 uint8_t ret= RFAILED;
7589 Reset_t *f1ResetMsg = NULLP;
7590 F1AP_PDU_t *f1apMsg = NULLP;
7591 asn_enc_rval_t encRetVal;
7592 DU_LOG("\nF1AP : Building F1 Reset request \n");
7595 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7596 if(f1apMsg == NULLP)
7600 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7601 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
7602 if(f1apMsg->choice.initiatingMessage == NULLP)
7606 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
7607 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
7608 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
7610 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
7613 f1ResetMsg->protocolIEs.list.count = elementCnt;
7614 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
7616 /* Initialize the F1Setup members */
7617 DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
7618 if(f1ResetMsg->protocolIEs.list.array == NULLP)
7622 for(idx=0; idx<elementCnt; idx++)
7624 DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
7625 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
7633 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
7634 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7635 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
7636 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
7640 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
7641 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
7642 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
7643 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
7644 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
7648 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
7649 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7650 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
7651 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
7652 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
7654 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7656 /* Encode the F1SetupRequest type as APER */
7657 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7659 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
7662 /* Encode results */
7663 if(encRetVal.encoded == ENCODE_FAIL)
7665 DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
7666 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7671 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
7672 for(idx=0; idx< encBufSize; idx++)
7674 printf("%x",encBuf[idx]);
7678 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
7680 DU_LOG("\nF1AP : Sending F1 Reset request failed");
7688 FreeF1ResetReq(f1apMsg);
7691 /*******************************************************************
7693 * @brief Build And Send F1ResetAck
7697 * Function : BuildAndSendF1ResetAck
7700 * - Build And Send F1ResetRSP
7702 * @return ROK - success
7705 * ****************************************************************/
7706 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
7709 ResetAcknowledge_t *f1ResetAck;
7713 if(f1apMsg->choice.successfulOutcome)
7715 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7717 if(f1ResetAck->protocolIEs.list.array)
7719 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
7721 if(f1ResetAck->protocolIEs.list.array[idx])
7723 DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7726 DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7728 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7730 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7734 /*******************************************************************
7736 * @brief Build And Send F1ResetAck
7740 * Function : BuildAndSendF1ResetAck
7743 * - Build And Send F1ResetRSP
7746 * @return ROK - success
7749 * ****************************************************************/
7750 uint8_t BuildAndSendF1ResetAck()
7753 uint8_t elementCnt = 0;
7754 uint8_t ret = RFAILED;
7755 F1AP_PDU_t *f1apMsg = NULL;
7756 ResetAcknowledge_t *f1ResetAck = NULLP;
7757 asn_enc_rval_t encRetVal;
7758 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
7761 /* Allocate the memory for F1ResetRequest_t */
7762 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7763 if(f1apMsg == NULLP)
7765 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
7769 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
7771 DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
7772 if(f1apMsg->choice.successfulOutcome == NULLP)
7774 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
7777 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
7778 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
7779 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
7783 f1ResetAck->protocolIEs.list.count = elementCnt;
7784 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
7786 DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
7787 if(f1ResetAck->protocolIEs.list.array == NULLP)
7789 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
7793 for(idx=0; idx<elementCnt; idx++)
7795 DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
7796 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
7803 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
7804 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
7805 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
7806 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
7808 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7810 /* Encode the F1SetupRequest type as UPER */
7811 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7813 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
7815 /* Check encode results */
7816 if(encRetVal.encoded == ENCODE_FAIL)
7818 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
7819 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7824 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
7825 for(int i=0; i< encBufSize; i++)
7827 printf("%x",encBuf[i]);
7831 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
7833 DU_LOG("\nF1AP : Sending F1 Reset Acknowledgement failed");
7841 FreeF1ResetAck(f1apMsg);
7845 /*******************************************************************
7847 * @brief Processes GNB DU config update ack
7851 * Function : procGNBDUCfgUpdAck
7853 * Functionality: Processes GNB DU config update ack
7855 * @params[in] F1AP_PDU_t ASN decoded F1AP message
7856 * @return ROK - success
7859 * ****************************************************************/
7860 uint8_t procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
7862 DU_LOG("\nF1AP : GNB-DU config update acknowledgment received");
7864 if(BuildAndSendF1ResetReq() != ROK)
7869 /* TODO :Check the deallocation */
7872 DU_FREE(gNBDuCfgAck->protocolIEs.list.array,(Size)elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
7873 DU_FREE(f1apMsg->choice.successfulOutcome,(Size)sizeof(SuccessfulOutcome_t));
7874 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
7878 /******************************************************************
7880 * @brief Processes DL RRC Message Transfer sent by CU
7884 * Function : procDlRrcMsgTrans
7886 * Functionality: Processes DL RRC Message Transfer sent by CU
7888 * @params[in] F1AP_PDU_t ASN decoded F1AP message
7889 * @return ROK - success
7892 * ****************************************************************/
7893 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
7895 /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
7898 Reset_t *f1ResetMsg = NULLP;
7900 DU_LOG("\nProcessing F1 reset request");
7901 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
7903 for(idx=0; idx<f1ResetMsg->protocolIEs.list.count; idx++)
7905 switch(f1ResetMsg->protocolIEs.list.array[idx]->id)
7907 case ProtocolIE_ID_id_TransactionID:
7910 case ProtocolIE_ID_id_Cause:
7913 case ProtocolIE_ID_id_ResetType:
7915 DU_LOG("\nReceived F1 Reset request");
7923 ret = BuildAndSendF1ResetAck();
7924 DU_LOG("\nUE release is not supported for now");
7928 /*******************************************************************
7930 * @brief free the RRC delivery report
7934 * Function : freeRrcDeliveryReport
7936 * Functionality: free the RRC delivery report
7939 * @return ROK - success
7942 * ****************************************************************/
7943 void freeRrcDeliveryReport(F1AP_PDU_t *f1apMsg )
7946 RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
7950 if(f1apMsg->choice.initiatingMessage)
7952 rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
7953 if(rrcDeliveryReport->protocolIEs.list.array)
7955 for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
7958 if(rrcDeliveryReport->protocolIEs.list.array[idx])
7960 DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
7961 sizeof(RRCDeliveryReportIEs_t));
7964 DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
7965 rrcDeliveryReport->protocolIEs.list.size);
7967 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
7970 sizeof(F1AP_PDU_t));
7974 /*******************************************************************
7976 * @brief Builds and sends the RRC delivery report
7980 * Function : BuildAndSendRrcDeliveryReport
7982 * Functionality: Builds and sends the RRC delivery report
7986 * @return ROK - success
7989 * ****************************************************************/
7990 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, uint32_t gnbDuUeF1apId, RrcDeliveryReport
7993 uint8_t ret = RFAILED;
7996 uint8_t elementCnt = 0;
7997 F1AP_PDU_t *f1apMsg = NULLP;
7998 asn_enc_rval_t encRetVal;
7999 RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
8003 DU_LOG("\nF1AP : Building RRC delivery Message Transfer Message\n");
8004 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
8005 if(f1apMsg == NULLP)
8007 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
8010 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
8011 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
8012 if(f1apMsg->choice.initiatingMessage == NULLP)
8014 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
8017 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
8018 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
8019 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
8021 rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
8023 rrcDeliveryReport->protocolIEs.list.count = elementCnt;
8024 rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
8026 /* Initialize the F1Setup members */
8027 DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
8028 if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
8030 DU_LOG(" F1AP : Memory allocation for RRC Delivery failed");
8033 for(idx =0 ;idx <elementCnt; idx++)
8035 DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
8036 if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
8044 /*GNB CU UE F1AP ID*/
8045 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
8046 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
8047 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
8048 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
8050 /*GNB DU UE F1AP ID*/
8052 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
8053 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
8054 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
8055 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
8057 /*RRC delivery status*/
8059 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
8060 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
8061 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
8062 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =
8063 rrcDelivery->rrcDeliveryStatus.deliveryStatus;
8064 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =
8065 rrcDelivery->rrcDeliveryStatus.triggeringMessage;
8069 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
8070 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
8071 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
8072 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID = rrcDelivery->srbId;
8074 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8076 /* Encode the RRC DELIVERY REPORT type as APER */
8077 memset(encBuf, 0, ENC_BUF_MAX_LEN);
8079 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
8082 /* Encode results */
8083 if(encRetVal.encoded == ENCODE_FAIL)
8085 DU_LOG("\nF1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
8086 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
8091 DU_LOG("\nF1AP : Created APER encoded buffer for RRC Delivery Msg \n");
8092 for(idx=0; idx< encBufSize; idx++)
8094 printf("%x",encBuf[idx]);
8099 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
8101 DU_LOG("\nF1AP : Sending RRC delivery msg request failed");
8109 freeRrcDeliveryReport(f1apMsg);
8113 /*****************************************************************i
8115 * @brief Handles received F1AP message and sends back response
8119 * Function : F1APMsgHdlr
8122 * - Decodes received F1AP control message
8123 * - Prepares response message, encodes and sends to SCTP
8126 * @return ROK - success
8129 * ****************************************************************/
8130 void F1APMsgHdlr(Buffer *mBuf)
8136 F1AP_PDU_t *f1apMsg;
8137 asn_dec_rval_t rval; /* Decoder return value */
8138 F1AP_PDU_t f1apasnmsg ;
8140 DU_LOG("\nF1AP : Received F1AP message buffer");
8141 ODU_PRINT_MSG(mBuf, 0,0);
8143 /* Copy mBuf into char array to decode it */
8144 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
8145 DU_ALLOC(recvBuf, (Size)recvBufLen);
8147 if(recvBuf == NULLP)
8149 DU_LOG("\nF1AP : Memory allocation failed");
8152 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
8154 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
8158 printf("\nF1AP : Received flat buffer to be decoded : ");
8159 for(i=0; i< recvBufLen; i++)
8161 printf("%x",recvBuf[i]);
8164 /* Decoding flat buffer into F1AP messsage */
8165 f1apMsg = &f1apasnmsg;
8166 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
8168 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
8169 DU_FREE(recvBuf, (Size)recvBufLen);
8171 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
8173 DU_LOG("\nF1AP : ASN decode failed");
8177 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
8179 switch(f1apMsg->present)
8181 case F1AP_PDU_PR_successfulOutcome:
8183 switch(f1apMsg->choice.successfulOutcome->value.present)
8185 case SuccessfulOutcome__value_PR_ResetAcknowledge:
8187 DU_LOG("\nF1AP : F1ResetAcknowledge is received successfully ");
8190 case SuccessfulOutcome__value_PR_F1SetupResponse:
8192 #ifndef ODU_TEST_STUB
8193 procF1SetupRsp(f1apMsg);
8198 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
8200 procGNBDUCfgUpdAck(f1apMsg);
8206 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
8209 }/* End of switch(successfulOutcome) */
8212 case F1AP_PDU_PR_initiatingMessage:
8214 switch(f1apMsg->choice.initiatingMessage->value.present)
8216 case InitiatingMessage__value_PR_Reset:
8218 DU_LOG("\nF1AP : F1 reset request received");
8219 procF1ResetReq(f1apMsg);
8222 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
8224 procDlRrcMsgTrans(f1apMsg);
8227 case InitiatingMessage__value_PR_UEContextSetupRequest:
8229 procF1UeContextSetupReq(f1apMsg);
8235 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
8236 f1apMsg->choice.initiatingMessage->value.present);
8239 }/* End of switch(initiatingMessage) */
8245 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
8249 }/* End of switch(f1apMsg->present) */
8251 } /* End of F1APMsgHdlr */
8253 /**********************************************************************
8255 **********************************************************************/