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"
31 #include "du_app_mac_inf.h"
33 #include "du_app_rlc_inf.h"
34 #include "du_mgr_main.h"
37 #include "du_ue_mgr.h"
39 #include "FeatureSetUplinkPerCC.h"
40 #include "FeatureSetDownlinkPerCC.h"
41 #include "FeatureSets.h"
42 #include "UE-NR-Capability.h"
43 #include "UE-CapabilityRAT-Container.h"
44 #include "UE-CapabilityRAT-ContainerListRRC.h"
45 #include "GNB-DU-System-Information.h"
46 #include "CellGroupConfigRrc.h"
47 #include "MAC-CellGroupConfig.h"
48 #include "SchedulingRequestConfig.h"
49 #include "SchedulingRequestToAddMod.h"
50 #include "BSR-Config.h"
51 #include "TAG-Config.h"
53 #include "PHR-Config.h"
54 #include "RLC-Config.h"
55 #include "UL-AM-RLC.h"
56 #include "DL-AM-RLC.h"
57 #include "LogicalChannelConfig.h"
58 #include "RLC-BearerConfig.h"
59 #include "PhysicalCellGroupConfig.h"
60 #include "SpCellConfig.h"
61 #include "TDD-UL-DL-ConfigDedicated.h"
62 #include "ServingCellConfig.h"
63 #include "ControlResourceSet.h"
64 #include "SearchSpace.h"
65 #include "PDCCH-Config.h"
66 #include "PDSCH-TimeDomainResourceAllocation.h"
67 #include "PDSCH-TimeDomainResourceAllocationList.h"
68 #include "PDSCH-CodeBlockGroupTransmission.h"
69 #include "PDSCH-ServingCellConfig.h"
70 #include "DMRS-DownlinkConfig.h"
71 #include "PDSCH-Config.h"
72 #include "BWP-DownlinkDedicated.h"
73 #include "BWP-Downlink.h"
74 #include "PUSCH-TimeDomainResourceAllocation.h"
75 #include "PUSCH-TimeDomainResourceAllocationList.h"
76 #include "DMRS-UplinkConfig.h"
77 #include "PUSCH-Config.h"
78 #include "SRS-ResourceId.h"
79 #include "SRS-Resource.h"
80 #include "SRS-ResourceSet.h"
81 #include "SRS-Config.h"
82 #include "BWP-UplinkDedicated.h"
83 #include "PUSCH-ServingCellConfig.h"
84 #include "UplinkConfig.h"
85 #include "DUtoCURRCContainer.h"
86 #include "GBR-QoSFlowInformation.h"
87 #include "QoSFlowLevelQoSParameters.h"
88 #include "PUCCH-Config.h"
89 #include "PUCCH-ResourceSet.h"
90 #include "PUCCH-Resource.h"
91 #include "PUCCH-PowerControl.h"
93 #include "PUCCH-PathlossReferenceRS.h"
94 #include "PUCCH-format0.h"
95 #include "PUCCH-format1.h"
96 #include "PUCCH-format2.h"
97 #include "PUCCH-format3.h"
98 #include "PUCCH-format4.h"
99 #include "PUCCH-FormatConfig.h"
100 #include "SchedulingRequestResourceConfig.h"
101 #include<ProtocolIE-Field.h>
102 #include "ProtocolExtensionField.h"
103 #include "odu_common_codec.h"
105 #include "du_cell_mgr.h"
106 #include "du_f1ap_msg_hdl.h"
107 #include "DRBs-Setup-Item.h"
108 #include "DLUPTNLInformation-ToBeSetup-List.h"
109 #include "DLUPTNLInformation-ToBeSetup-Item.h"
110 #include "UPTransportLayerInformation.h"
111 #include "GTPTunnel.h"
112 #include "SupportedSULFreqBandItem.h"
113 #include "du_sys_info_hdl.h"
114 #include "du_e2ap_msg_hdl.h"
115 #include "du_f1ap_conversions.h"
116 #include "CNUEPagingIdentity.h"
117 #include "PCCH-Config.h"
120 #include "CmInterface.h"
121 extern StartupConfig g_cfg;
124 DuCfgParams duCfgParam;
126 /******************************************************************
128 * @brief Function to fetch lcId based on DRB Id
132 * Function : fetchLcId
136 * Functionality: Function to fetch lcId based on DRB Id
138 * Returns: lcId - SUCCESS
140 *****************************************************************/
142 uint8_t fetchLcId(uint8_t drbId)
144 uint8_t cellIdx = 0, ueIdx = 0, lcIdx = 0, numLcs = 0, lcId = 0;
146 for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
148 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
150 if(duCb.actvCellLst[cellIdx] != NULLP)
152 numLcs = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.numLcs;
153 for(lcIdx = 0; lcIdx < numLcs; lcIdx++)
155 if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].rbId == drbId && \
156 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].rbType == RB_TYPE_DRB)
158 lcId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg.rlcLcCfg[lcIdx].lcId;
165 DU_LOG("\nERROR --> DU_APP: fetchLcId() failed for drbId %d", drbId);
169 /*******************************************************************
171 * @brief Adding F1AP pdu to reserved pdu list
175 * Function : addToReservedF1apPduList
177 * Functionality: Adding F1AP pdu to reserved pdu list.
178 * These pdu are awaiting aknowledgment from CU
180 * @params[in] uint8_t transId, F1AP_PDU_t *f1apMsg
182 * @return ROK - success
185 * ****************************************************************/
186 void addToReservedF1apPduList(uint8_t transId, F1AP_PDU_t *f1apPdu)
188 CmLList *node = NULLP;
189 ReservedF1apPduInfo *pduInfo = NULLP;
190 DU_ALLOC(pduInfo, sizeof(ReservedF1apPduInfo));
193 DU_ALLOC(node, sizeof(CmLList));
196 pduInfo->transId = transId;
197 pduInfo->f1apMsg = (void*) f1apPdu;
199 node->node = (PTR)pduInfo;
200 cmLListAdd2Tail(&duCb.reservedF1apPduList, node);
205 /*******************************************************************
207 * @brief searching for F1AP pdu from ReservedF1apPduList
211 * Function : searchFromReservedF1apPduList
213 * Functionality: searching for F1AP pdu information
215 * @params[in] uint8_t transId
217 * @return pointer to F1AP_PDU_t
219 * ****************************************************************/
221 CmLList *searchFromReservedF1apPduList(uint8_t transId)
224 ReservedF1apPduInfo *f1apPdu;
225 if(duCb.reservedF1apPduList.count)
227 CM_LLIST_FIRST_NODE(&duCb.reservedF1apPduList, node);
230 f1apPdu = (ReservedF1apPduInfo*)node->node;
231 if(f1apPdu->transId == transId)
241 /*******************************************************************
243 * @brief deleting F1AP pdu information from ReservedF1apPduList
247 * Function : deleteFromReservedF1apPduList
249 * Functionality: deleting pdu information from ReservedF1apPduList
251 * @params[in] CmLList *node
255 * ****************************************************************/
257 void deleteFromReservedF1apPduList(CmLList *node)
259 ReservedF1apPduInfo *f1apPdu;
263 f1apPdu = (ReservedF1apPduInfo *)node->node;
264 cmLListDelFrm(&duCb.reservedF1apPduList, node);
265 DU_FREE(f1apPdu, sizeof(ReservedF1apPduInfo));
266 DU_FREE(node, sizeof(CmLList));
271 /*******************************************************************
273 * @brief Builds Uplink Info for NR
277 * Function : BuildULNRInfo
279 * Functionality: Building NR Uplink Info
281 * @params[in] NRFreqInfo_t *ulnrfreq
282 * @return ROK - success
285 * ****************************************************************/
286 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
289 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
290 fdd.ulNrFreqInfo.nrArfcn;
291 ulnrfreq->freqBandListNr.list.count = 1;
292 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
293 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
294 if(ulnrfreq->freqBandListNr.list.array == NULLP)
298 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
300 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
301 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
306 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
307 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
308 freqBand[0].nrFreqBand;
309 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
312 /*******************************************************************
314 * @brief Builds Downlink NR Info
318 * Function : BuildDLNRInfo
320 * Functionality: Building Downlink NR Info
322 * @params[in] NRFreqInfo_t *dlnrfreq
323 * @return ROK - success
326 * ****************************************************************/
327 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
330 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
331 fdd.dlNrFreqInfo.nrArfcn;
332 dlnrfreq->freqBandListNr.list.count = 1;
333 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
334 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
335 if(dlnrfreq->freqBandListNr.list.array == NULLP)
339 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
341 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
342 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
347 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
348 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
349 freqBand[0].nrFreqBand;
350 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
355 /*******************************************************************
357 * @brief Builds NRCell ID
361 * Function : BuildNrCellId
363 * Functionality: Building the NR Cell ID
365 * @params[in] BIT_STRING_t *nrcell
366 * @return ROK - success
369 * ****************************************************************/
371 S16 BuildNrCellId(BIT_STRING_t *nrcell)
373 memset(nrcell->buf, 0, nrcell->size);
374 nrcell->buf[4] = duCfgParam.sib1Params.cellIdentity;
375 nrcell->bits_unused = 4;
379 /*******************************************************************
381 * @brief Builds Nrcgi
385 * Function : BuildNrcgi
387 * Functionality: Building the PLMN ID and NR Cell id
389 * @params[in] NRCGI_t *nrcgi
390 * @return ROK - success
393 * ****************************************************************/
394 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
397 uint8_t byteSize = 5;
398 /* Allocate Buffer Memory */
399 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
400 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
401 if(nrcgi->pLMN_Identity.buf == NULLP)
405 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
406 nrcgi->pLMN_Identity.buf); // Building PLMN function
412 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
413 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
414 if(nrcgi->nRCellIdentity.buf == NULLP)
418 BuildNrCellId(&nrcgi->nRCellIdentity);
422 /*******************************************************************
424 * @brief Builds FiveGStac
428 * Function : BuildFiveGSTac
430 * Functionality: Building the FiveGSTac
432 * @params[in] OCTET_STRING_t *fivegsTac
433 * @return ROK - success
436 * ****************************************************************/
437 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
439 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
440 if(servcell->fiveGS_TAC == NULLP)
444 servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
445 DU_ALLOC(servcell->fiveGS_TAC->buf,\
446 sizeof(servcell->fiveGS_TAC->size));
447 if(servcell->fiveGS_TAC->buf == NULLP)
451 servcell->fiveGS_TAC->buf[0] = 0;
452 servcell->fiveGS_TAC->buf[1] = 0;
453 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
457 /*******************************************************************
459 * @brief fill nr frequency information
463 * Function : fillNrTddInfo
465 * Functionality: fill nr frequency information
467 * @params[in] NRFreqInfo_t freqInfo
468 * @return ROK - success
471 * ****************************************************************/
472 uint8_t fillNrTddInfo(TDD_Info_t *tddInfo)
474 uint8_t elementCnt = 1, freqBandListIdx = 0, supportedBandIdx = 0;
475 NRFreqInfo_t *freqInfo = NULLP;
479 DU_LOG("\nERROR --> DU APP : Null pointer received at fillNrTddInfo");
483 freqInfo = &tddInfo->nRFreqInfo;
484 freqInfo->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn;
486 freqInfo->freqBandListNr.list.count = elementCnt;
487 freqInfo->freqBandListNr.list.size = freqInfo->freqBandListNr.list.count * sizeof(FreqBandNrItem_t *);
488 DU_ALLOC(freqInfo->freqBandListNr.list.array, freqInfo->freqBandListNr.list.size );
489 if(!freqInfo->freqBandListNr.list.array)
491 DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo");
495 for(freqBandListIdx = 0; freqBandListIdx<freqInfo->freqBandListNr.list.count; freqBandListIdx++)
497 DU_ALLOC(freqInfo->freqBandListNr.list.array[freqBandListIdx], sizeof(FreqBandNrItem_t ));
498 if(!freqInfo->freqBandListNr.list.array[freqBandListIdx])
500 DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo");
504 freqInfo->freqBandListNr.list.array[freqBandListIdx]->freqBandIndicatorNr = duCfgParam.srvdCellLst[0].duCellInfo.\
505 f1Mode.mode.tdd.nrFreqInfo.freqBand[0].nrFreqBand;
506 freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.count = elementCnt;
507 freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.size = freqInfo->freqBandListNr.list.array[freqBandListIdx]->\
508 supportedSULBandList.list.count * sizeof(SupportedSULFreqBandItem_t*);
510 DU_ALLOC(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array,\
511 freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.size);
512 if(!freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array)
514 DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo");
518 for(supportedBandIdx = 0; supportedBandIdx<freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.count; supportedBandIdx++)
520 DU_ALLOC(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx],\
521 sizeof(SupportedSULFreqBandItem_t));
522 if(!freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx])
524 DU_LOG("\nERROR --> DU APP : Memory allocation failed at fillNrTddInfo");
528 freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx]->freqBandIndicatorNr =\
529 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[0].sulBand[0];
533 tddInfo->transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs;
534 tddInfo->transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb;
539 /*******************************************************************
541 * @brief Builds NR Mode
545 * Function : BuildNrMode
547 * Functionality: Building the NR Mode
549 * @params[in] NR_Mode_Info_t *fdd
550 * @return ROK - success
553 * ****************************************************************/
554 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
556 uint8_t BuildDLNRInforet=0;
557 uint8_t BuildULNRInforet=0;
560 mode->present = NR_Mode_Info_PR_tDD;
562 mode->present = NR_Mode_Info_PR_fDD;
565 if(mode->present == NR_Mode_Info_PR_fDD)
567 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
568 if(mode->choice.fDD == NULLP)
570 DU_LOG("\nERROR --> Memory allocation failed in BuildNrMode");
573 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
574 if(BuildULNRInforet != ROK)
576 DU_LOG("\nERROR --> Failed to build UlNrFreqInfo");
579 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
580 if(BuildDLNRInforet != ROK)
582 DU_LOG("\nERROR --> Failed to build DlNrFreqInfo");
585 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
586 duCfgParam.srvdCellLst[0].duCellInfo.\
587 f1Mode.mode.fdd.ulTxBw.nrScs;
588 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
589 duCfgParam.srvdCellLst[0].duCellInfo.\
590 f1Mode.mode.fdd.ulTxBw.nrb;
591 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
592 duCfgParam.srvdCellLst[0].duCellInfo.\
593 f1Mode.mode.fdd.dlTxBw.nrScs;
594 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
595 duCfgParam.srvdCellLst[0].duCellInfo.\
596 f1Mode.mode.fdd.dlTxBw.nrb;
598 else if(mode->present == NR_Mode_Info_PR_tDD)
600 DU_ALLOC(mode->choice.tDD,sizeof(TDD_Info_t));
601 if(mode->choice.tDD == NULLP)
603 DU_LOG("\nERROR --> Memory allocation failed in BuildNrMode");
607 if(fillNrTddInfo(mode->choice.tDD) != ROK)
609 DU_LOG("\nERROR --> Failed to fill Nr TDD information");
617 /*******************************************************************
619 * @brief Builds IE Extensions for Served PLMNs
623 * Function : BuildExtensions
625 * Functionality: Building the IE Extensions
627 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
628 * @return ROK - success
631 * ****************************************************************/
632 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
634 uint8_t idx=0, plmnidx=0, sliceLstIdx=0;
635 uint8_t elementCnt=0, extensionCnt=0;
637 extensionCnt=IE_EXTENSION_LIST_COUNT;
638 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
639 if((*ieExtend) == NULLP)
641 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
644 (*ieExtend)->list.count = extensionCnt;
645 (*ieExtend)->list.size = \
646 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
647 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
648 if((*ieExtend)->list.array == NULLP)
650 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
653 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
655 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
656 sizeof(ServedPLMNs_ItemExtIEs_t));
657 if((*ieExtend)->list.array[plmnidx] == NULLP)
659 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
664 elementCnt = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].taiSliceSuppLst.numSupportedSlices;
666 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
667 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
668 (*ieExtend)->list.array[idx]->extensionValue.present = \
669 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
670 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
671 list.count = elementCnt;
672 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
673 list.size = (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
674 list.count * sizeof(SliceSupportItem_t *);
676 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
677 list.array, elementCnt * sizeof(SliceSupportItem_t *));
678 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
681 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
685 for(sliceLstIdx =0; sliceLstIdx<elementCnt; sliceLstIdx++)
687 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
688 list.array[sliceLstIdx],sizeof(SliceSupportItem_t));
689 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
690 list.array[sliceLstIdx] == NULLP)
692 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
695 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
696 list.array[sliceLstIdx]->sNSSAI.sST.size = sizeof(uint8_t);
697 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
698 .list.array[sliceLstIdx]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
699 extensionValue.choice.SliceSupportList.\
700 list.array[sliceLstIdx]->sNSSAI.sST.size);
701 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
702 .list.array[sliceLstIdx]->sNSSAI.sST.buf == NULLP)
704 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
707 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
708 list.array[sliceLstIdx]->sNSSAI.sST.buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.\
709 cellInfo.srvdPlmn[0].taiSliceSuppLst.snssai[sliceLstIdx]->sst;
711 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
712 list.array[sliceLstIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
713 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
714 list.array[sliceLstIdx]->sNSSAI.sD == NULLP)
716 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
719 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
720 list.array[sliceLstIdx]->sNSSAI.sD->size = 3 * sizeof(uint8_t);
721 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
722 list.array[sliceLstIdx]->sNSSAI.sD->buf, (*ieExtend)->list.array[idx]->extensionValue.choice.\
723 SliceSupportList.list.array[sliceLstIdx]->sNSSAI.sD->size);
724 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
725 list.array[sliceLstIdx]->sNSSAI.sD->buf == NULLP)
727 DU_LOG("ERROR --> DU_APP : BuildExtensions(): Memory allocation failed");
730 memcpy((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
731 list.array[sliceLstIdx]->sNSSAI.sD->buf, duCfgParam.srvdCellLst[0].duCellInfo.\
732 cellInfo.srvdPlmn[0].taiSliceSuppLst.snssai[sliceLstIdx]->sd, (*ieExtend)->list.array[idx]->\
733 extensionValue.choice.SliceSupportList.list.array[sliceLstIdx]->sNSSAI.sD->size);
737 /*******************************************************************
739 * @brief Builds Served PLMN
743 * Function : BuildServedPlmn
745 * Functionality: Building the Served PLMN
747 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
748 * @return ROK - success
751 * ****************************************************************/
752 uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
755 uint8_t servPlmnCnt=1;
756 uint8_t buildPlmnIdret=0;
757 uint8_t BuildExtensionsret=0;
758 srvplmn->list.count = servPlmnCnt;
759 srvplmn->list.size = \
760 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
761 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
762 if(srvplmn->list.array == NULLP)
766 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
768 DU_ALLOC(srvplmn->list.array[plmnidx],\
769 sizeof(ServedPLMNs_Item_t));
770 if(srvplmn->list.array[plmnidx] == NULLP)
775 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
776 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
777 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
778 srvplmn->list.array[0]->pLMN_Identity.buf);
779 if(buildPlmnIdret!= ROK)
783 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
784 if(BuildExtensionsret!= ROK)
790 /*******************************************************************
792 * @brief Builds Served Cell List
796 * Function : BuildServedCellList
798 * Functionality: Building Served Cell List
800 * @params[in] PLMNID plmn
801 * @return ROK - success
804 * ****************************************************************/
806 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
808 uint8_t BuildNrcgiret=0;
809 uint8_t BuildFiveGSTacret=0;
810 uint8_t BuildServedPlmnret=0;
811 uint8_t BuildNrModeret=0;
815 GNB_DU_Served_Cells_Item_t *srvCellItem;
816 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
817 duServedCell->list.count = plmnCnt;
819 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
820 if(duServedCell->list.array == NULLP)
824 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
826 DU_ALLOC(duServedCell->list.array[plmnidx],\
827 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
828 if(duServedCell->list.array[plmnidx] == NULLP)
834 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
835 duServedCell->list.array[idx]->criticality = Criticality_reject;
836 duServedCell->list.array[idx]->value.present = \
837 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
839 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
841 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
842 if(BuildNrcgiret != ROK)
847 srvCellItem->served_Cell_Information.nRPCI = \
848 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
851 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
852 if(BuildFiveGSTacret != ROK)
857 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
858 if(BuildServedPlmnret !=ROK)
862 /*nR Mode Info with FDD*/
863 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
864 if(BuildNrModeret != ROK)
868 /*Measurement timing Config*/
869 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
870 size = sizeof(uint8_t);
871 DU_ALLOC(srvCellItem->served_Cell_Information.\
872 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
873 if(srvCellItem->served_Cell_Information.\
874 measurementTimingConfiguration.buf == NULLP)
878 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
879 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
881 /* GNB DU System Information */
882 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
883 sizeof(GNB_DU_System_Information_t));
884 if(!srvCellItem->gNB_DU_System_Information)
889 srvCellItem->gNB_DU_System_Information->mIB_message.size = duCfgParam.srvdCellLst[0].duSysInfo.mibLen;
890 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
891 srvCellItem->gNB_DU_System_Information->mIB_message.size);
892 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
896 memcpy(srvCellItem->gNB_DU_System_Information->mIB_message.buf, duCfgParam.srvdCellLst[0].duSysInfo.mibMsg, \
897 srvCellItem->gNB_DU_System_Information->mIB_message.size);
900 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
901 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
903 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
904 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
905 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
909 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
911 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
912 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
916 /*******************************************************************
918 * @brief Builds RRC Version
922 * Function : BuildRrcVer
924 * Functionality: Building RRC Version
926 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
927 * @return ROK - success
930 * ****************************************************************/
931 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
935 rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
936 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
937 if(rrcVer->latest_RRC_Version.buf == NULLP)
941 rrcVer->latest_RRC_Version.buf[0] = 0;
942 rrcVer->latest_RRC_Version.bits_unused = 5;
943 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
944 if(rrcVer->iE_Extensions == NULLP)
948 rrcVer->iE_Extensions->list.count = 1;
949 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
950 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
951 if(rrcVer->iE_Extensions->list.array == NULLP)
956 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
957 sizeof(RRC_Version_ExtIEs_t));
958 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
962 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
963 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
964 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
965 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
966 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
967 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
968 .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
969 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
970 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
971 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
972 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
973 .Latest_RRC_Version_Enhanced.buf == NULLP)
978 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
979 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
981 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
982 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
984 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
985 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
988 /*******************************************************************
990 * @brief Sends F1 msg over SCTP
994 * Function : sendF1APMsg
996 * Functionality: Sends F1 msg over SCTP
998 * @params[in] Region region
1000 * @return ROK - success
1003 * ****************************************************************/
1004 uint8_t sendF1APMsg()
1006 Buffer *mBuf = NULLP;
1008 if(ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &mBuf) == ROK)
1010 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
1012 ODU_PRINT_MSG(mBuf, 0,0);
1014 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
1016 DU_LOG("\nERROR --> F1AP : SCTP Send failed");
1017 ODU_PUT_MSG_BUF(mBuf);
1023 DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
1024 ODU_PUT_MSG_BUF(mBuf);
1027 ODU_PUT_MSG_BUF(mBuf);
1031 DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
1037 /*******************************************************************
1039 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
1043 * Function : FreeRrcVer
1045 * Functionality: deallocating the memory of function BuildRrcVer
1047 * @params[in] RRC_Version_t *rrcVer
1051 *****************************************************************/
1052 void FreeRrcVer(RRC_Version_t *rrcVer)
1054 if(rrcVer->latest_RRC_Version.buf != NULLP)
1056 if(rrcVer->iE_Extensions != NULLP)
1058 if(rrcVer->iE_Extensions->list.array != NULLP)
1060 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
1062 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
1065 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
1066 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
1067 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
1069 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
1071 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
1073 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
1075 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
1079 /*******************************************************************
1081 * @brief Deallocating memory of TDD NrFreqInfo
1085 * Function : freeTddNrFreqInfo
1087 * Functionality: freeTddNrFreqInfo
1089 * @params[in] F1AP_PDU_t *f1apDuCfg
1091 * @return ROK - void
1093 * ****************************************************************/
1094 void freeTddNrFreqInfo(NRFreqInfo_t *freqInfo)
1096 uint8_t freqBandListIdx = 0, supportedBandIdx = 0;
1098 if(freqInfo->freqBandListNr.list.array)
1100 for(freqBandListIdx = 0; freqBandListIdx<freqInfo->freqBandListNr.list.count; freqBandListIdx++)
1102 if(freqInfo->freqBandListNr.list.array[freqBandListIdx])
1104 if(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array)
1106 for(supportedBandIdx = 0; supportedBandIdx<freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.count; supportedBandIdx++)
1108 DU_FREE(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array[supportedBandIdx],\
1109 sizeof(SupportedSULFreqBandItem_t));
1111 DU_FREE(freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.array,\
1112 freqInfo->freqBandListNr.list.array[freqBandListIdx]->supportedSULBandList.list.size);
1115 DU_FREE(freqInfo->freqBandListNr.list.array[freqBandListIdx], sizeof(FreqBandNrItem_t ));
1118 DU_FREE(freqInfo->freqBandListNr.list.array, freqInfo->freqBandListNr.list.size );
1122 /*******************************************************************
1124 * @brief Deallocating memory allocated for Nr fdd frequencey mode
1128 * Function : freeFddNrFreqInfo
1130 * Functionality:Free memory allocated for Nr fdd frequencey mode
1134 * @return ROK - void
1136 * ****************************************************************/
1137 void freeFddNrFreqInfo(FDD_Info_t *fDD)
1143 if(fDD->uL_NRFreqInfo.freqBandListNr.list.array != NULLP)
1145 DU_FREE(fDD->uL_NRFreqInfo.freqBandListNr.list.\
1146 array[arrIdx], sizeof(FreqBandNrItem_t));
1147 DU_FREE(fDD->uL_NRFreqInfo.freqBandListNr.list.array, \
1148 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1151 if(fDD->dL_NRFreqInfo.freqBandListNr.list.array != NULLP)
1153 DU_FREE(fDD->dL_NRFreqInfo.freqBandListNr.list.\
1154 array[arrIdx], sizeof(FreqBandNrItem_t));
1155 DU_FREE(fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1156 fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1158 DU_FREE(fDD,sizeof(FDD_Info_t));
1162 /*******************************************************************
1164 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
1168 * Function : FreeServedCellList
1170 * Functionality: deallocating the memory of function BuildServedCellList
1173 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
1177 * ****************************************************************/
1178 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
1180 uint8_t plmnCnt=MAX_PLMN;
1181 uint8_t extensionCnt=IE_EXTENSION_LIST_COUNT;
1182 uint8_t plmnIdx=0, sliceIdx=0;
1183 GNB_DU_Served_Cells_Item_t *srvCellItem;
1184 ServedPLMNs_Item_t *servedPlmnItem;
1185 SliceSupportItem_t *sliceSupportItem;
1187 if(duServedCell->list.array!=NULLP)
1189 if(duServedCell->list.array[0]!=NULLP)
1191 srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
1193 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1194 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size * sizeof(uint8_t));
1195 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1196 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size * sizeof(uint8_t));
1198 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
1200 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
1201 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
1202 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
1205 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
1207 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx] != NULLP)
1209 servedPlmnItem = srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx];
1210 DU_FREE(servedPlmnItem->pLMN_Identity.buf, servedPlmnItem->pLMN_Identity.size);
1212 if(servedPlmnItem->iE_Extensions != NULLP)
1214 if(servedPlmnItem->iE_Extensions->list.array != NULLP)
1216 if(servedPlmnItem->iE_Extensions->list.array[0] != NULLP)
1218 if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
1219 SliceSupportList.list.array != NULLP)
1221 for(sliceIdx =0; sliceIdx<servedPlmnItem->iE_Extensions->list.array[0]->\
1222 extensionValue.choice.SliceSupportList.list.count; sliceIdx++)
1224 if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
1225 SliceSupportList.list.array[sliceIdx] != NULLP)
1227 sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[0]->\
1228 extensionValue.choice.SliceSupportList.list.array[sliceIdx];
1230 DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sizeof(uint8_t));
1232 if(sliceSupportItem->sNSSAI.sD != NULLP)
1234 DU_FREE(sliceSupportItem->sNSSAI.sD->buf,\
1235 sliceSupportItem->sNSSAI.sD->size);
1236 DU_FREE(sliceSupportItem->sNSSAI.sD, sizeof(OCTET_STRING_t));
1239 DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.\
1240 choice.SliceSupportList.list.array[sliceIdx], sizeof(SliceSupportItem_t));
1243 DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
1244 SliceSupportList.list.array, servedPlmnItem->iE_Extensions->list.array[0]->\
1245 extensionValue.choice.SliceSupportList.list.size);
1247 DU_FREE(servedPlmnItem->iE_Extensions->list.array[0],\
1248 sizeof(ServedPLMNs_ItemExtIEs_t));
1250 DU_FREE(servedPlmnItem->iE_Extensions->list.array,\
1251 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
1253 DU_FREE(servedPlmnItem->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P3_t));
1255 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx],\
1256 sizeof(ServedPLMNs_Item_t));
1258 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
1259 sizeof(ServedPLMNs_Item_t *));
1262 if(srvCellItem->served_Cell_Information.nR_Mode_Info.present == NR_Mode_Info_PR_fDD)
1264 freeFddNrFreqInfo(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD);
1268 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.tDD != NULLP)
1270 freeTddNrFreqInfo(&srvCellItem->served_Cell_Information.nR_Mode_Info.choice.tDD->nRFreqInfo);
1271 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.tDD, sizeof(TDD_Info_t));
1275 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
1276 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
1278 if(srvCellItem->gNB_DU_System_Information != NULLP)
1280 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf != NULLP)
1282 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
1283 srvCellItem->gNB_DU_System_Information->mIB_message.size);
1286 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf != NULLP)
1288 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
1289 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1292 DU_FREE(srvCellItem->gNB_DU_System_Information, sizeof(GNB_DU_System_Information_t));
1295 DU_FREE(duServedCell->list.array[0], sizeof(GNB_DU_Served_Cells_ItemIEs_t));
1297 DU_FREE(duServedCell->list.array, plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
1301 /*******************************************************************
1303 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
1307 * Function : FreeF1SetupReq
1309 * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
1311 * @params[in] F1AP_PDU_t *f1apMsg
1315 * ****************************************************************/
1316 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
1318 uint8_t ieIdx, ieIdx2;
1319 F1SetupRequest_t *f1SetupReq=NULLP;
1321 if(f1apMsg != NULLP)
1323 if(f1apMsg->choice.initiatingMessage != NULLP)
1325 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1326 if(f1SetupReq->protocolIEs.list.array != NULLP)
1328 for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
1330 if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP)
1332 switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
1334 case ProtocolIE_ID_id_TransactionID:
1336 case ProtocolIE_ID_id_gNB_DU_ID:
1337 DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1338 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1340 case ProtocolIE_ID_id_gNB_DU_Name:
1341 DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\
1342 strlen((char *)duCfgParam.duName));
1344 case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
1345 FreeServedCellList(&f1SetupReq->protocolIEs.list.\
1346 array[ieIdx]->value.choice.GNB_DU_Served_Cells_List);
1348 case ProtocolIE_ID_id_GNB_DU_RRC_Version:
1349 FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version);
1352 DU_LOG("\nERROR --> Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id);
1357 for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++)
1359 DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t));
1361 DU_FREE(f1SetupReq->protocolIEs.list.array,\
1362 f1SetupReq->protocolIEs.list.size);
1364 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1366 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1369 /*******************************************************************
1371 * @brief Builds and Send the F1SetupRequest
1375 * Function : BuildAndSendF1SetupReq
1377 * Functionality:Fills the F1SetupRequest
1379 * @return ROK - success
1382 ******************************************************************/
1383 uint8_t BuildAndSendF1SetupReq()
1385 uint8_t ret, ieIdx, elementCnt;
1386 F1AP_PDU_t *f1apMsg = NULLP;
1387 F1SetupRequest_t *f1SetupReq=NULLP;
1388 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1389 RRC_Version_t *rrcVer=NULLP;
1390 asn_enc_rval_t encRetVal; /* Encoder return value */
1393 DU_LOG("\nINFO --> F1AP : Building F1 Setup Request\n");
1396 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1397 if(f1apMsg == NULLP)
1401 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1402 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1403 if(f1apMsg->choice.initiatingMessage == NULLP)
1407 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1408 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1409 f1apMsg->choice.initiatingMessage->value.present = \
1410 InitiatingMessage__value_PR_F1SetupRequest;
1412 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1414 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1416 f1SetupReq->protocolIEs.list.count = elementCnt;
1417 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1419 /* Initialize the F1Setup members */
1420 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1421 if(f1SetupReq->protocolIEs.list.array == NULLP)
1425 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
1427 DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\
1428 sizeof(F1SetupRequestIEs_t));
1429 if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP)
1437 f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID;
1438 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1439 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\
1440 F1SetupRequestIEs__value_PR_TransactionID;
1441 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \
1446 f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
1447 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1448 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1449 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1450 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\
1453 DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1454 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1455 if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \
1461 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\
1465 if(duCfgParam.duName != NULL)
1468 f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name;
1469 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
1470 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1471 f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\
1472 strlen((char *)duCfgParam.duName);
1473 DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\
1474 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1475 if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\
1480 strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\
1481 choice.GNB_DU_Name.buf,
1482 (char*)&duCfgParam.duName);
1486 /*Served Cell list */
1488 f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1489 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1490 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1491 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1492 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1493 duServedCell = &f1SetupReq->protocolIEs.list.\
1494 array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
1495 if(BuildServedCellList(duServedCell))
1501 f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1502 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1503 f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1504 f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1505 F1SetupRequestIEs__value_PR_RRC_Version;
1506 rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
1507 if(BuildRrcVer(rrcVer))
1511 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1513 /* Encode the F1SetupRequest type as APER */
1514 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1516 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1519 /* Encode results */
1520 if(encRetVal.encoded == ENCODE_FAIL)
1522 DU_LOG("\nERROR --> F1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1523 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1528 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n");
1529 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
1531 printf("%x",encBuf[ieIdx]);
1534 duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize = encBufSize;
1535 DU_ALLOC(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, encBufSize);
1536 if(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf == NULLP)
1538 DU_LOG("\nERROR --> F1AP : Memory allocation failed to store the encoding of f1setup req");
1541 memcpy(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf, &encBuf, duCb.f1SetupReqAndRspMsg.f1MsgReqBufSize);
1545 if(sendF1APMsg() != ROK)
1547 DU_LOG("\nERROR --> F1AP : Sending F1 Setup request failed");
1555 FreeF1SetupReq(f1apMsg);
1558 }/* End of BuildAndSendF1SetupReq */
1560 /*******************************************************************
1562 * @brief Deallocating memory allocated for Served_Cells_To_Modify_Item_t
1566 * Function : freeCellsToModifyItem
1568 * Functionality: Deallocating memory of variables allocated in
1569 * BuildAndSendDUConfigUpdate function
1571 * @params[in] Served_Cells_To_Modify_Item_t *modifyItem
1573 * @return ROK - void
1575 * ****************************************************************/
1577 void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem)
1579 uint8_t arrIdx=0, servedPlmnIdx=0, sliceLstIdx=0;
1580 ServedPLMNs_Item_t *servedPlmnItem = NULLP;
1581 SliceSupportItem_t *sliceSupportItem = NULLP;
1583 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf, modifyItem->oldNRCGI.pLMN_Identity.size);
1584 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf, modifyItem->oldNRCGI.nRCellIdentity.size);
1586 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1587 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1588 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1589 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1591 if(modifyItem->served_Cell_Information.servedPLMNs.list.array != NULLP)
1593 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx] != NULLP)
1595 servedPlmnItem = modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx];
1597 DU_FREE(servedPlmnItem->pLMN_Identity.buf,servedPlmnItem->pLMN_Identity.size);
1599 if(servedPlmnItem->iE_Extensions != NULLP)
1601 if(servedPlmnItem->iE_Extensions->list.array != NULLP)
1603 if(servedPlmnItem->iE_Extensions->list.array[arrIdx] != NULLP)
1605 if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
1606 list.array != NULLP)
1608 for(sliceLstIdx =0; sliceLstIdx<servedPlmnItem->iE_Extensions->list.array[arrIdx]->\
1609 extensionValue.choice.SliceSupportList.list.count; sliceLstIdx++)
1611 if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
1612 list.array[sliceLstIdx] != NULLP)
1615 sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
1616 SliceSupportList.list.array[sliceLstIdx];
1618 DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sliceSupportItem->sNSSAI.sST.size);
1619 if(sliceSupportItem->sNSSAI.sD != NULLP)
1621 DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size);
1622 DU_FREE(sliceSupportItem->sNSSAI.sD,sizeof(OCTET_STRING_t));
1624 DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
1625 SliceSupportList.list.array[sliceLstIdx], sizeof(SliceSupportItem_t));
1628 DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.\
1629 choice.SliceSupportList.list.array,\
1630 servedPlmnItem->iE_Extensions->list.array[arrIdx]->\
1631 extensionValue.choice.SliceSupportList.list.size);
1634 for(servedPlmnIdx=0; servedPlmnIdx< servedPlmnItem->iE_Extensions->list.count ; servedPlmnIdx++)
1636 DU_FREE(servedPlmnItem->iE_Extensions->list.array[servedPlmnIdx], sizeof(ServedPLMNs_ItemExtIEs_t ));
1638 DU_FREE(servedPlmnItem->iE_Extensions->list.array, servedPlmnItem->iE_Extensions->list.size);
1640 DU_FREE(servedPlmnItem->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1643 for(servedPlmnIdx=0; servedPlmnIdx<modifyItem->served_Cell_Information.servedPLMNs.list.count; servedPlmnIdx++)
1645 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[servedPlmnIdx], sizeof(ServedPLMNs_Item_t));
1647 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1648 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1651 if(modifyItem->served_Cell_Information.nR_Mode_Info.present == NR_Mode_Info_PR_fDD)
1653 freeFddNrFreqInfo(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD);
1657 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.tDD)
1659 freeTddNrFreqInfo(&modifyItem->served_Cell_Information.nR_Mode_Info.choice.tDD->nRFreqInfo);
1660 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.tDD, sizeof(TDD_Info_t));
1663 DU_FREE(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf,\
1664 modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1667 /*******************************************************************
1669 * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1673 * Function : FreeDUConfigUpdate
1675 * Functionality: Deallocating memory of variables allocated in
1676 * BuildAndSendDUConfigUpdate function
1678 * @params[in] F1AP_PDU_t *f1apDuCfg
1680 * @return ROK - void
1682 * ****************************************************************/
1683 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1685 uint8_t ieIdx=0, cellModifyIdx=0, cellDeleteIdx=0;
1686 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
1687 Served_Cells_To_Modify_List_t *cellsToModify=NULLP;
1688 Served_Cells_To_Delete_List_t *cellsToDelete=NULLP;
1689 Served_Cells_To_Delete_Item_t *deleteItem = NULLP;
1690 Served_Cells_To_Delete_ItemIEs_t *deleteItemIe = NULLP;
1692 if(f1apDuCfg != NULLP)
1694 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1696 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1697 value.choice.GNBDUConfigurationUpdate;
1698 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1700 for(ieIdx=0; ieIdx<duCfgUpdate->protocolIEs.list.count; ieIdx++)
1702 if(duCfgUpdate->protocolIEs.list.array[ieIdx] != NULLP)
1704 switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
1706 case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
1708 cellsToModify = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\
1709 value.choice.Served_Cells_To_Modify_List;
1710 if(cellsToModify->list.array != NULLP)
1712 for(cellModifyIdx=0; cellModifyIdx<cellsToModify->list.count ;cellModifyIdx++)
1714 if(cellsToModify->list.array[cellModifyIdx] != NULLP)
1716 freeCellsToModifyItem(&cellsToModify->list.array[cellModifyIdx]->value.choice.\
1717 Served_Cells_To_Modify_Item);
1718 DU_FREE(cellsToModify->list.array[cellModifyIdx],\
1719 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1722 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1726 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
1728 cellsToDelete = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\
1729 value.choice.Served_Cells_To_Delete_List;
1730 if(cellsToDelete->list.array != NULLP)
1732 for(cellDeleteIdx=0; cellDeleteIdx<cellsToDelete->list.count ;cellDeleteIdx++)
1734 if(cellsToDelete->list.array[cellDeleteIdx] != NULLP)
1736 deleteItemIe = ((Served_Cells_To_Delete_ItemIEs_t*)\
1737 cellsToDelete->list.array[cellDeleteIdx]);
1738 deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
1739 DU_FREE(deleteItem->oldNRCGI.pLMN_Identity.buf,\
1740 deleteItem->oldNRCGI.pLMN_Identity.size);
1741 DU_FREE(deleteItem->oldNRCGI.nRCellIdentity.buf,\
1742 deleteItem->oldNRCGI.nRCellIdentity.size);
1743 DU_FREE(cellsToDelete->list.array[cellDeleteIdx],\
1744 sizeof(Served_Cells_To_Delete_ItemIEs_t));
1747 DU_FREE(cellsToDelete->list.array,cellsToDelete->list.size);
1752 case ProtocolIE_ID_id_gNB_DU_ID:
1754 DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1755 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1759 DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx],\
1760 sizeof(GNBDUConfigurationUpdateIEs_t));
1763 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1765 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1767 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1771 /*******************************************************************
1773 * @brief Fills Served Plmns required in ServCellInfo IE
1777 * Function : fillServedPlmns
1779 * Functionality: Fills Served Plmns required in ServCellInfo IE
1781 * @params[in] Pointer to ServedPLMNs_List_t *
1783 * @return ROK - success
1786 *****************************************************************/
1788 uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
1790 uint8_t ieIdx=0, arrayIdx=0, ieListCnt=0, elementCnt=0, sliceLstIdx=0;
1792 servedPlmn->list.array[arrayIdx]->pLMN_Identity.size = 3*sizeof(uint8_t);
1793 DU_ALLOC(servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf, servedPlmn->list.\
1794 array[arrayIdx]->pLMN_Identity.size);
1795 if(servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf == NULLP)
1797 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1800 buildPlmnId(duCfgParam.srvdCellLst[arrayIdx].duCellInfo.cellInfo.srvdPlmn[arrayIdx].plmn,\
1801 servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf);
1802 DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1803 if(servedPlmn->list.array[arrayIdx]->iE_Extensions == NULLP)
1805 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1810 servedPlmn->list.array[arrayIdx]->iE_Extensions->list.count = ieListCnt;
1811 servedPlmn->list.array[arrayIdx]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1812 DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array,servedPlmn->list.array[arrayIdx]->\
1813 iE_Extensions->list.size);
1814 if(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array == NULLP)
1816 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1819 for(ieIdx=arrayIdx;ieIdx<ieListCnt;ieIdx++)
1821 DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx],\
1822 sizeof(ServedPLMNs_ItemExtIEs_t));
1823 if(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx] == NULLP)
1825 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1831 elementCnt = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].taiSliceSuppLst.numSupportedSlices;
1832 servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->id =ProtocolIE_ID_id_TAISliceSupportList;
1833 servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->criticality = Criticality_ignore;
1834 servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.present = \
1835 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1836 servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1837 list.count = elementCnt;
1838 servedPlmn->list.array[arrayIdx]->\
1839 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1840 list.size = elementCnt * sizeof(SliceSupportItem_t *);
1841 DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
1842 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1843 list.array,servedPlmn->list.array[arrayIdx]->\
1844 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.list.size);
1845 if(servedPlmn->list.array[arrayIdx]->\
1846 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1847 list.array == NULLP)
1849 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1853 for(sliceLstIdx =0; sliceLstIdx< elementCnt; sliceLstIdx++)
1855 DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
1856 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1857 list.array[sliceLstIdx],sizeof( SliceSupportItem_t));
1858 if(servedPlmn->list.array[arrayIdx]->\
1859 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1860 list.array[sliceLstIdx] == NULLP)
1862 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1866 servedPlmn->list.array[arrayIdx]->\
1867 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1868 list.array[sliceLstIdx]->sNSSAI.sST.size = sizeof(uint8_t);
1869 DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
1870 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1871 list.array[sliceLstIdx]->sNSSAI.sST.buf,servedPlmn->list.array[arrayIdx]->\
1872 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.list.array[sliceLstIdx]->\
1875 if(servedPlmn->list.array[arrayIdx]->\
1876 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1877 list.array[sliceLstIdx]->sNSSAI.sST.buf == NULLP)
1879 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1882 servedPlmn->list.array[arrayIdx]->\
1883 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1884 list.array[sliceLstIdx]->sNSSAI.sST.buf[arrayIdx] = duCfgParam.srvdCellLst[arrayIdx].duCellInfo.\
1885 cellInfo.srvdPlmn[arrayIdx].taiSliceSuppLst.snssai[sliceLstIdx]->sst;
1887 DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
1888 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1889 list.array[sliceLstIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1890 if(servedPlmn->list.array[arrayIdx]->\
1891 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1892 list.array[sliceLstIdx]->sNSSAI.sD == NULLP)
1894 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1897 servedPlmn->list.array[arrayIdx]->\
1898 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1899 list.array[sliceLstIdx]->sNSSAI.sD->size = 3 * sizeof(uint8_t);
1900 DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
1901 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1902 list.array[sliceLstIdx]->sNSSAI.sD->buf,servedPlmn->list.array[arrayIdx]->\
1903 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1904 list.array[sliceLstIdx]->sNSSAI.sD->size);
1905 if(servedPlmn->list.array[arrayIdx]->\
1906 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1907 list.array[sliceLstIdx]->sNSSAI.sD->buf == NULLP)
1909 DU_LOG("ERROR --> DU_APP : fillServedPlmns(): Memory allocation failed");
1912 memcpy(servedPlmn->list.array[arrayIdx]->\
1913 iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1914 list.array[sliceLstIdx]->sNSSAI.sD->buf, duCfgParam.srvdCellLst[arrayIdx].duCellInfo.\
1915 cellInfo.srvdPlmn[arrayIdx].taiSliceSuppLst.snssai[sliceLstIdx]->sd,\
1916 servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
1917 list.array[sliceLstIdx]->sNSSAI.sD->size);
1922 /*******************************************************************
1924 * @brief Fills Nr Fdd Info required in ServCellInfo IE
1928 * Function : fillNrFddInfo
1930 * Functionality: Fills Nr Fdd Info required in ServCellInfo IE
1932 * @params[in] FDD_Info_t *fDD
1934 * @return ROK - success
1937 *****************************************************************/
1939 uint8_t fillNrFddInfo(FDD_Info_t *fDD)
1941 fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1942 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1943 fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1;
1944 fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1945 DU_ALLOC(fDD->uL_NRFreqInfo.freqBandListNr.list.\
1946 array, fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1947 if(fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1949 DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo");
1953 DU_ALLOC(fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \
1954 sizeof(FreqBandNrItem_t));
1955 if(fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1957 DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo");
1961 fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1962 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1963 freqBand[0].nrFreqBand;
1964 fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1965 fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1966 dlNrFreqInfo.nrArfcn;
1967 fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1;
1968 fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1969 DU_ALLOC(fDD->dL_NRFreqInfo.freqBandListNr.list.array, fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1970 if(fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1972 DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo");
1976 DU_ALLOC(fDD->dL_NRFreqInfo.freqBandListNr.list.array[0], sizeof(FreqBandNrItem_t));
1977 if(fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1979 DU_LOG("\nERROR --> Memory allocation failed in fillNrFddInfo");
1983 fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1984 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1985 freqBand[0].nrFreqBand;
1986 fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1988 /*Transmission Bandwidth*/
1989 fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1990 f1Mode.mode.fdd.ulTxBw.nrScs;
1991 fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1992 f1Mode.mode.fdd.ulTxBw.nrb;
1993 fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1994 f1Mode.mode.fdd.dlTxBw.nrScs;
1995 fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1996 f1Mode.mode.fdd.dlTxBw.nrb;
2001 /*******************************************************************
2003 * @brief Fills ServCellInfo IE
2007 * Function : fillServedCellInfo
2009 * Functionality: Fills ServCellInfo
2011 * @params[in] Pointer to Served_Cell_Information_t *
2013 * @return ROK - success
2016 *****************************************************************/
2018 uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo)
2020 uint8_t ieIdx, ieListCnt;
2023 srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
2024 DU_ALLOC(srvCellInfo->nRCGI.pLMN_Identity.buf,\
2025 srvCellInfo->nRCGI.pLMN_Identity.size);
2026 if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP)
2028 DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo");
2031 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2032 srvCellInfo->nRCGI.pLMN_Identity.buf);
2033 srvCellInfo->nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
2034 DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\
2035 srvCellInfo->nRCGI.nRCellIdentity.size);
2036 if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP)
2038 DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo");
2042 fillBitString(&srvCellInfo->nRCGI.nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity);
2044 srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
2048 srvCellInfo->servedPLMNs.list.count = ieListCnt;
2049 srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *);
2050 DU_ALLOC(srvCellInfo->servedPLMNs.list.array, srvCellInfo->servedPLMNs.list.size);
2051 if(srvCellInfo->servedPLMNs.list.array == NULLP)
2053 DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo");
2056 for(ieIdx=0; ieIdx < ieListCnt; ieIdx++)
2058 DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx], sizeof(ServedPLMNs_Item_t));
2059 if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP)
2061 DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo");
2065 if(fillServedPlmns(&srvCellInfo->servedPLMNs))
2067 DU_LOG("\nERROR --> Failed to fill Served Plmn info");
2072 /*nR Mode Info with FDD*/
2073 srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD;
2074 DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD, sizeof(FDD_Info_t));
2075 if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP)
2077 DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo");
2080 if(fillNrFddInfo(srvCellInfo->nR_Mode_Info.choice.fDD))
2082 DU_LOG("\nERROR --> Failed to fill the Nr FDD information");
2086 srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_tDD;
2087 DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.tDD, sizeof(TDD_Info_t));
2088 if(srvCellInfo->nR_Mode_Info.choice.tDD == NULLP)
2090 DU_LOG("\nERROR --> Memory allocation failed in fillServedCellInfo");
2093 if(fillNrTddInfo(srvCellInfo->nR_Mode_Info.choice.tDD) != ROK)
2095 DU_LOG("\nERROR --> Failed to fill the Nr TDD information");
2100 /*Measurement timing Config*/
2101 srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t);
2102 DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\
2103 buf,srvCellInfo->measurementTimingConfiguration.size);
2104 if(srvCellInfo->measurementTimingConfiguration.buf == NULLP)
2108 srvCellInfo->measurementTimingConfiguration.\
2109 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
2114 /*******************************************************************
2116 * @brief Fills ServCellToModItem IE
2120 * Function : fillServCellToModItem
2122 * Functionality: Fills ServCellToModItem IE
2124 * @params[in] Pointer to Served_Cells_To_Modify_Item_t *
2126 * @return ROK - success
2129 *****************************************************************/
2131 uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem)
2134 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
2135 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
2136 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
2140 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2141 modifyItem->oldNRCGI.pLMN_Identity.buf);
2144 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
2145 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
2146 modifyItem->oldNRCGI.nRCellIdentity.size);
2147 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
2151 fillBitString(&modifyItem->oldNRCGI.nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity);
2153 if(fillServedCellInfo(&modifyItem->served_Cell_Information))
2159 /*******************************************************************
2161 * @brief Builds ServCellToModList
2165 * Function : buildServCellToModList
2167 * Functionality: Builds the serv cell to Mod List
2169 * @params[in] Pointer to Served_Cells_To_Modify_List_t *
2171 * @return ROK - success
2174 *****************************************************************/
2176 uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify)
2178 uint8_t ieListCnt, ieIdx;
2179 Served_Cells_To_Modify_Item_t *modifyItem = NULLP;
2182 cellsToModify->list.count = ieListCnt;
2183 cellsToModify->list.size = ieListCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
2184 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
2185 if(cellsToModify->list.array == NULLP)
2189 for(ieIdx=0; ieIdx< ieListCnt; ieIdx++)
2191 DU_ALLOC(cellsToModify->list.array[ieIdx],sizeof(Served_Cells_To_Modify_ItemIEs_t));
2192 if(cellsToModify->list.array[ieIdx] == NULLP)
2197 cellsToModify->list.array[0]->id = ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
2198 cellsToModify->list.array[0]->criticality = Criticality_reject;
2199 cellsToModify->list.array[0]->value.present =\
2200 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
2201 modifyItem=&cellsToModify->list.array[0]->value.choice.Served_Cells_To_Modify_Item;
2203 if(fillServCellToModItem(modifyItem))
2208 /*******************************************************************
2210 * @brief filling the DeleteItemList
2214 * Function : fillCellToDeleteItem
2216 * Functionality: Filling the DeleteItemIe
2218 * @params[in] Pointer to Served_Cells_To_Delete_ItemIEs_t
2220 * @return ROK - success
2223 *****************************************************************/
2224 uint8_t fillCellToDeleteItem(struct Served_Cells_To_Delete_ItemIEs *deleteItemIe)
2226 Served_Cells_To_Delete_Item_t *deleteItem=NULLP;
2228 deleteItemIe->id = ProtocolIE_ID_id_Served_Cells_To_Delete_Item;
2229 deleteItemIe->criticality = Criticality_reject;
2230 deleteItemIe->value.present =\
2231 Served_Cells_To_Delete_ItemIEs__value_PR_Served_Cells_To_Delete_Item;
2232 deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
2235 deleteItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
2236 DU_ALLOC(deleteItem->oldNRCGI.pLMN_Identity.buf,deleteItem->oldNRCGI.pLMN_Identity.size);
2237 if(deleteItem->oldNRCGI.pLMN_Identity.buf == NULLP)
2239 DU_LOG("ERROR --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory");
2242 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2243 deleteItem->oldNRCGI.pLMN_Identity.buf);
2246 deleteItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
2247 DU_ALLOC(deleteItem->oldNRCGI.nRCellIdentity.buf,\
2248 deleteItem->oldNRCGI.nRCellIdentity.size);
2249 if(deleteItem->oldNRCGI.nRCellIdentity.buf == NULLP)
2251 DU_LOG("ERROR --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory");
2254 fillBitString(&deleteItem->oldNRCGI.nRCellIdentity, ODU_VALUE_FOUR, ODU_VALUE_FIVE, duCfgParam.sib1Params.cellIdentity);
2257 /*******************************************************************
2259 * @brief Builds ServCellToDeleteList
2263 * Function : buildServCellToDeleteList
2265 * Functionality: Builds the serv cell to delete List
2267 * @params[in] Pointer to Served_Cells_To_Delete_List_t *
2269 * @return ROK - success
2272 *****************************************************************/
2274 uint8_t buildServCellToDeleteList(Served_Cells_To_Delete_List_t *cellsToDelete)
2276 uint8_t ieListCnt, arrIdx;
2279 cellsToDelete->list.count = ieListCnt;
2280 cellsToDelete->list.size = ieListCnt*sizeof(Served_Cells_To_Delete_ItemIEs_t *);
2282 DU_ALLOC(cellsToDelete->list.array,cellsToDelete->list.size);
2283 if(cellsToDelete->list.array == NULLP)
2285 DU_LOG("\nERROR --> F1AP : buildServCellToDeleteList(): Memory allocation failed");
2289 for(arrIdx=0; arrIdx< ieListCnt; arrIdx++)
2291 DU_ALLOC(cellsToDelete->list.array[arrIdx],sizeof(Served_Cells_To_Delete_ItemIEs_t));
2292 if(cellsToDelete->list.array[arrIdx] == NULLP)
2294 DU_LOG("\nERROR --> F1AP : buildServCellToDeleteList(): Memory allocation failed");
2300 if(fillCellToDeleteItem((Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx]) !=ROK)
2302 DU_LOG("\nERROR --> F1AP: buildServCellToDeleteList(): failed to fill Served_Cells_To_Delete_ItemIEs");
2308 /*******************************************************************
2310 * @brief Builds and sends the DUConfigUpdate
2314 * Function : BuildAndSendDUConfigUpdate
2316 * Functionality: Constructs the DU Update message and sends
2317 * it to the CU through SCTP.
2319 * @params[in] void **buf,Buffer to which encoded pattern is written into
2320 * @params[in] int *size,size of buffer
2322 * @return ROK - success
2325 * ****************************************************************/
2326 uint8_t BuildAndSendDUConfigUpdate(ServCellAction servCellAction)
2328 uint8_t ret =0, ieIdx=0, elementCnt=0;
2329 bool memAlloctionFailure = false;
2330 F1AP_PDU_t *f1apDuCfg = NULLP;
2331 GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
2332 asn_enc_rval_t encRetVal; /* Encoder return value */
2334 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2339 DU_LOG("\nINFO --> F1AP : Building DU config update\n");
2340 /* Allocate the memory for F1DuCfg */
2341 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
2342 if(f1apDuCfg == NULLP)
2344 DU_LOG("\nERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed");
2348 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
2349 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2350 if(f1apDuCfg->choice.initiatingMessage == NULLP)
2352 DU_LOG("\nERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed");
2356 f1apDuCfg->choice.initiatingMessage->procedureCode = \
2357 ProcedureCode_id_gNBDUConfigurationUpdate;
2358 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
2359 f1apDuCfg->choice.initiatingMessage->value.present = \
2360 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
2361 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
2362 choice.GNBDUConfigurationUpdate;
2364 duCfgUpdate->protocolIEs.list.count = elementCnt;
2365 duCfgUpdate->protocolIEs.list.size = \
2366 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
2368 /* Initialize the F1Setup members */
2369 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
2370 if(duCfgUpdate->protocolIEs.list.array == NULLP)
2372 DU_LOG("ERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed");
2375 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
2377 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t));
2378 if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP)
2380 DU_LOG("ERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed");
2381 memAlloctionFailure = true;
2386 if(memAlloctionFailure == true)
2392 duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID;
2393 duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
2394 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2395 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
2396 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID;
2399 if(servCellAction == SERV_CELL_TO_MODIFY)
2401 /*Served Cell to Modify */
2402 duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
2403 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
2404 duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
2405 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2406 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
2407 if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
2408 Served_Cells_To_Modify_List))
2410 DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToModList");
2416 /*Served Cell to Delete */
2417 duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
2418 ProtocolIE_ID_id_Served_Cells_To_Delete_List;
2419 duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
2420 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2421 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Delete_List;
2422 if(buildServCellToDeleteList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
2423 Served_Cells_To_Delete_List)!=ROK)
2425 DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToDeleteList");
2430 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
2433 duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
2434 duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
2435 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2436 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
2437 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t);
2438 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
2439 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
2440 if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP)
2442 DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): Memory allocation failed for GNB_DU_ID");
2445 duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId;
2447 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
2449 /* Encode the DU Config Update type as APER */
2450 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2452 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
2454 /* Checking encode results */
2455 if(encRetVal.encoded == ENCODE_FAIL)
2457 DU_LOG("ERROR --> F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\
2458 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2463 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DUConfigUpdate\n");
2464 for(ieIdx =0; ieIdx < encBufSize; ieIdx++)
2466 printf("%x",encBuf[ieIdx]);
2470 if(sendF1APMsg() != ROK)
2472 DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update failed");
2480 addToReservedF1apPduList(TRANS_ID,f1apDuCfg);
2485 /*******************************************************************
2487 * @brief free the ULRRCMessageTransfer
2491 * Function : FreeULRRCMessageTransfer
2493 * Functionality: Deallocating the memory of variable allocated in
2494 * FreeULRRCMessageTransfer
2498 * @return ROK - void
2500 ******************************************************************/
2501 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
2504 ULRRCMessageTransfer_t *ulRRCMsg;
2506 if(f1apMsg != NULLP)
2508 if(f1apMsg->choice.initiatingMessage != NULLP)
2510 ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2511 if(ulRRCMsg->protocolIEs.list.array != NULLP)
2513 for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
2515 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
2517 if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
2518 ULRRCMessageTransferIEs__value_PR_RRCContainer)
2520 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2521 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2523 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
2526 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
2528 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2530 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2533 /*******************************************************************
2535 * @brief Builds and sends the ULRRCMessageTransfer
2539 * Function : BuildAndSendULRRCMessageTransfer
2541 * Functionality: Constructs the UL RRC Message Transfer and sends
2542 * it to the CU through SCTP.
2546 * @return ROK - success
2549 * ****************************************************************/
2550 uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \
2551 uint16_t msgLen, uint8_t *rrcMsg)
2553 uint8_t elementCnt =0;
2556 F1AP_PDU_t *f1apMsg = NULLP;
2557 ULRRCMessageTransfer_t *ulRRCMsg = NULLP;
2558 asn_enc_rval_t encRetVal; /* Encoder return value */
2559 uint8_t ret =RFAILED;
2561 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2565 DU_LOG("\n INFO --> F1AP : Building UL RRC Message Transfer Message\n");
2567 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2568 if(f1apMsg == NULLP)
2570 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
2573 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2574 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2575 if(f1apMsg->choice.initiatingMessage == NULLP)
2577 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
2580 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
2581 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2582 f1apMsg->choice.initiatingMessage->value.present = \
2583 InitiatingMessage__value_PR_ULRRCMessageTransfer;
2585 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2587 ulRRCMsg->protocolIEs.list.count = elementCnt;
2588 ulRRCMsg->protocolIEs.list.size = \
2589 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
2591 /* Initialize the F1Setup members */
2592 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
2593 if(ulRRCMsg->protocolIEs.list.array == NULLP)
2595 DU_LOG(" ERROR --> F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
2598 for(idx=0; idx<elementCnt; idx++)
2600 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
2601 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2609 /*GNB CU UE F1AP ID*/
2610 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2611 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2612 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2613 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2614 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
2616 /*GNB DU UE F1AP ID*/
2618 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2619 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2620 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2621 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2622 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
2626 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
2627 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2628 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2629 ULRRCMessageTransferIEs__value_PR_SRBID;
2630 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
2634 ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCContainer;
2635 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2636 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2637 ULRRCMessageTransferIEs__value_PR_RRCContainer;
2638 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
2639 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2640 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
2641 if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
2643 DU_LOG(" ERROR --> F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
2646 memset(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, 0, msgLen);
2647 memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
2648 rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2650 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2652 /* Encode the F1SetupRequest type as APER */
2653 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2655 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2657 /* Encode results */
2658 if(encRetVal.encoded == ENCODE_FAIL)
2660 DU_LOG( "\nERROR --> F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2661 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2666 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2667 for(int i=0; i< encBufSize; i++)
2669 printf("%x",encBuf[i]);
2674 if(sendF1APMsg() != ROK)
2676 DU_LOG("\nERROR --> F1AP : Sending UL RRC Message Transfer Failed");
2682 FreeULRRCMessageTransfer(f1apMsg);
2685 }/* End of BuildAndSendULRRCMessageTransfer*/
2687 /*******************************************************************
2689 * @brief Builds tag config
2693 * Function : BuildTagConfig
2695 * Functionality: Builds tag config in MacCellGroupConfig
2697 * @params[in] TAG_Config *tag_Config
2699 * @return ROK - success
2702 * ****************************************************************/
2703 uint8_t BuildTagConfig(DuUeCb *ueCb, struct TAG_Config *tagConfig)
2705 struct TAG_Config__tag_ToAddModList *tagList;
2706 uint8_t idx, elementCnt;
2708 tagConfig->tag_ToReleaseList = NULLP;
2709 tagConfig->tag_ToAddModList = NULLP;
2710 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2711 if(!tagConfig->tag_ToAddModList)
2713 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
2718 elementCnt = ODU_VALUE_ONE;
2720 elementCnt = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModListCount;
2722 tagList = tagConfig->tag_ToAddModList;
2723 tagList->list.count = elementCnt;
2724 tagList->list.size = elementCnt * sizeof(struct TAG *);
2726 tagList->list.array = NULLP;
2727 DU_ALLOC(tagList->list.array, tagList->list.size);
2728 if(!tagList->list.array)
2730 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
2734 for(idx=0; idx<tagList->list.count; idx++)
2736 tagList->list.array[idx] = NULLP;
2737 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2738 if(!tagList->list.array[idx])
2740 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
2748 tagList->list.array[idx]->tag_Id = TAG_ID;
2749 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2753 for(idx=0; idx<tagList->list.count; idx++)
2755 tagList->list.array[idx]->tag_Id = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModList[idx].tagId;
2756 tagList->list.array[idx]->timeAlignmentTimer = ueCb->macUeCfg.macCellGrpCfg.tagCfg.addModList[idx].timeAlignTimer;
2763 /*******************************************************************
2765 * @brief Builds PHR Config
2769 * Function : BuildPhrConfig
2771 * Functionality: Builds phrConfig in MacCellGroupConfig
2773 * @params[in] PHR Config *
2775 * @return ROK - success
2778 * ****************************************************************/
2779 uint8_t BuildPhrConfig(DuUeCb *ueCb, struct MAC_CellGroupConfig__phr_Config *phrConfig)
2782 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2783 phrConfig->choice.setup = NULLP;
2784 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2785 if(!phrConfig->choice.setup)
2787 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
2793 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2794 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2795 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2796 phrConfig->choice.setup->multiplePHR = false;
2797 phrConfig->choice.setup->dummy = false;
2798 phrConfig->choice.setup->phr_Type2OtherCell = false;
2799 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2803 phrConfig->choice.setup->phr_PeriodicTimer = ueCb->macUeCfg.macCellGrpCfg.phrCfg.periodicTimer;
2804 phrConfig->choice.setup->phr_ProhibitTimer = ueCb->macUeCfg.macCellGrpCfg.phrCfg.prohibitTimer;
2805 phrConfig->choice.setup->phr_Tx_PowerFactorChange = ueCb->macUeCfg.macCellGrpCfg.phrCfg.txPowerFactor;
2806 phrConfig->choice.setup->multiplePHR = ueCb->macUeCfg.macCellGrpCfg.phrCfg.multiplePHR;
2807 phrConfig->choice.setup->dummy = ueCb->macUeCfg.macCellGrpCfg.phrCfg.dummy;
2808 phrConfig->choice.setup->phr_Type2OtherCell = ueCb->macUeCfg.macCellGrpCfg.phrCfg.phrType2OtherCell;
2809 phrConfig->choice.setup->phr_ModeOtherCG = ueCb->macUeCfg.macCellGrpCfg.phrCfg.phrOtherCG;
2815 /*******************************************************************
2817 * @brief Builds BSR Config
2821 * Function : BuildBsrConfig
2823 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2825 * @params[in] BSR_Config *bsrConfig
2827 * @return ROK - success
2830 * ****************************************************************/
2831 uint8_t BuildBsrConfig(DuUeCb *ueCb, struct BSR_Config *bsrConfig)
2835 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2836 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2837 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2841 bsrConfig->periodicBSR_Timer = convertBsrPeriodicTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.periodicTimer);
2842 bsrConfig->retxBSR_Timer = convertBsrRetxTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.retxTimer);
2844 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2845 DU_ALLOC(bsrConfig->logicalChannelSR_DelayTimer, sizeof(long));
2846 if(bsrConfig->logicalChannelSR_DelayTimer == NULLP)
2848 DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildBsrConfig");
2851 *(bsrConfig->logicalChannelSR_DelayTimer) = convertLcSrDelayTmrValueToEnum(ueCb->macUeCfg.macCellGrpCfg.bsrTmrCfg.srDelayTimer);
2857 /*******************************************************************
2859 * @brief Builds scheduling request config
2863 * Function : BuildSchedulingReqConfig
2865 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2867 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2869 * @return ROK - success
2872 * ****************************************************************/
2873 uint8_t BuildSchedulingReqConfig(DuUeCb *ueCb, struct SchedulingRequestConfig *schedulingRequestConfig)
2875 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2876 uint8_t idx, elementCnt;
2878 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2879 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2880 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2881 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2883 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2888 elementCnt = ODU_VALUE_ONE;
2890 elementCnt = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModListCount;
2892 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2893 schReqList->list.count = elementCnt;
2894 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2896 schReqList->list.array = NULLP;
2897 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2898 if(!schReqList->list.array)
2900 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2904 for(idx=0; idx<schReqList->list.count; idx++)
2906 schReqList->list.array[idx] = NULLP;
2907 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2908 if(!schReqList->list.array[idx])
2910 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2918 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2920 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2921 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2922 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2924 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2927 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2928 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2932 for(idx=0; idx<schReqList->list.count; idx++)
2934 schReqList->list.array[idx]->schedulingRequestId = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].schedReqId;
2936 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2937 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2938 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2940 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2943 *(schReqList->list.array[idx]->sr_ProhibitTimer) = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srProhibitTmr;
2944 schReqList->list.array[idx]->sr_TransMax = ueCb->macUeCfg.macCellGrpCfg.schReqCfg.addModList[idx].srTransMax;
2948 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2953 /*******************************************************************
2955 * @brief Builds RLC Configuration for AM mode
2959 * Function : BuildRlcConfigAm
2962 * Builds AM mode RLC Config in BuildRlcBearerToAddModList
2964 * @params[in] AmBearerCfg *amCfg
2965 * RLC_Config_t *rlcConfig
2967 * @return ROK - success
2970 * ****************************************************************/
2971 uint8_t BuildRlcConfigAm(AmBearerCfg *amCfg, struct RLC_Config *rlcConfig)
2973 rlcConfig->choice.am = NULLP;
2974 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2975 if(!rlcConfig->choice.am)
2977 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigAm");
2981 /* Fill AM UL configuration */
2982 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2983 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2984 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2986 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigAm");
2990 /* Fill default AM UL configuration if input pointer to DU database is NULL */
2993 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2994 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2995 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2996 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2997 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
3001 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = covertAmSnLenFromIntEnumToRrcEnum(amCfg->dlAmCfg.snLenDl);
3002 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = covertPollRetxTmrValueToEnum(amCfg->dlAmCfg.pollRetxTmr);
3003 rlcConfig->choice.am->ul_AM_RLC.pollPDU = covertPollPduValueToEnum(amCfg->dlAmCfg.pollPdu);
3004 rlcConfig->choice.am->ul_AM_RLC.pollByte = covertPollByteValueToEnum(amCfg->dlAmCfg.pollByte);
3005 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = covertMaxRetxValueToEnum(amCfg->dlAmCfg.maxRetxTh);
3008 /* Fill AM DL configuraion */
3009 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
3010 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
3011 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
3013 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigAm");
3017 /* Fill default AM DL configuration if input pointer to DU database is NULL */
3020 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
3021 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
3022 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
3024 else /* Fill AM configuration from DU database */
3026 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = covertAmSnLenFromIntEnumToRrcEnum(amCfg->ulAmCfg.snLenUl);
3027 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = convertReasmblTmrValueToEnum(amCfg->ulAmCfg.reAssemTmr);
3028 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = convertProhibitTmrValueToEnum(amCfg->ulAmCfg.statProhTmr);
3033 /*******************************************************************
3035 * @brief Builds RLC Config for UM Bidirection
3039 * Function : BuildRlcConfig UmBiDir
3042 * Builds RLC Config for UM Bidirection in BuildRlcBearerToAddModList
3044 * @params[in] UmBiDirBearerCfg *umBiDirCfg
3045 * RLC_Config_t *rlcConfig
3047 * @return ROK - success
3050 * ****************************************************************/
3051 uint8_t BuildRlcConfigUmBiDir(UmBiDirBearerCfg *umBiDirCfg, struct RLC_Config *rlcConfig)
3053 rlcConfig->choice.um_Bi_Directional = NULLP;
3054 DU_ALLOC(rlcConfig->choice.um_Bi_Directional, sizeof(struct RLC_Config__um_Bi_Directional));
3055 if(rlcConfig->choice.um_Bi_Directional == NULLP)
3057 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmBiDir");
3061 /* Fill UM Bidirectional UL configuration */
3062 rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NULLP;
3063 DU_ALLOC(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
3064 if(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength == NULLP)
3066 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmBiDir");
3070 if(umBiDirCfg != NULLP)
3072 *(rlcConfig->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umBiDirCfg->dlUmCfg.snLenDlUm);
3075 /* Fill UM Bidirectional DL configuration */
3076 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NULLP;
3077 DU_ALLOC(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
3078 if(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength == NULLP)
3080 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmBiDir");
3084 if(umBiDirCfg != NULLP)
3086 *(rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umBiDirCfg->ulUmCfg.snLenUlUm);
3087 rlcConfig->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = convertReasmblTmrValueToEnum(umBiDirCfg->ulUmCfg.reAssemTmr);
3093 /*******************************************************************
3095 * @brief Builds RLC Config for UM Uni directional UL
3099 * Function : BuildRlcConfigUmUniDirUl
3102 * Builds RLC Config for UM Unidirection UL in BuildRlcBearerToAddModList
3104 * @params[in] UmUniDirDlBearerCfg *umUniDirDlCfg
3105 * RLC_Config_t *rlcConfig
3107 * @return ROK - success
3110 * ****************************************************************/
3111 uint8_t BuildRlcConfigUmUniDirUl(UmUniDirDlBearerCfg *umUniDirDlCfg, RLC_Config_t *rlcConfig)
3113 rlcConfig->choice.um_Uni_Directional_UL = NULLP;
3114 DU_ALLOC(rlcConfig->choice.um_Uni_Directional_UL , sizeof(struct RLC_Config__um_Uni_Directional_UL));
3115 if(rlcConfig->choice.um_Uni_Directional_UL == NULLP)
3117 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirUl");
3121 rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength = NULLP;
3122 DU_ALLOC(rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
3123 if(rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength == NULLP)
3125 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirUl");
3129 if(umUniDirDlCfg != NULLP)
3131 *(rlcConfig->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umUniDirDlCfg->dlUmCfg.snLenDlUm);
3137 /*******************************************************************
3139 * @brief Builds RLC Config for UM Uni directional DL
3143 * Function : BuildRlcConfigUmUniDirDl
3146 * Builds RLC Config for UM Unidirection DL in BuildRlcBearerToAddModList
3148 * @params[in] UmUniDirUlBearerCfg *umUniDirUlCfg
3149 * RLC_Config_t *rlcConfig
3151 * @return ROK - success
3154 * ****************************************************************/
3155 uint8_t BuildRlcConfigUmUniDirDl(UmUniDirUlBearerCfg *umUniDirUlCfg, RLC_Config_t *rlcConfig)
3157 rlcConfig->choice.um_Uni_Directional_DL = NULLP;
3158 DU_ALLOC(rlcConfig->choice.um_Uni_Directional_DL , sizeof(struct RLC_Config__um_Uni_Directional_DL));
3159 if(rlcConfig->choice.um_Uni_Directional_DL == NULLP)
3161 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirDl");
3165 rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength = NULLP;
3166 DU_ALLOC(rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength, sizeof(SN_FieldLengthUM_t));
3167 if(rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength == NULLP)
3169 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfigUmUniDirDl");
3173 if(umUniDirUlCfg != NULLP)
3175 *(rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength) = covertUmSnLenFromIntEnumToRrcEnum(umUniDirUlCfg->ulUmCfg.snLenUlUm);
3176 rlcConfig->choice.um_Uni_Directional_DL->dl_UM_RLC.t_Reassembly = convertReasmblTmrValueToEnum(umUniDirUlCfg->ulUmCfg.reAssemTmr);
3182 /*******************************************************************
3184 * @brief Builds RLC Config
3188 * Function : BuildRlcConfig
3190 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
3192 * @params[in] RLC_Config_t *rlcConfig
3194 * @return ROK - success
3197 * ****************************************************************/
3198 uint8_t BuildRlcConfig(RlcBearerCfg *rbCfg, struct RLC_Config *rlcConfig)
3201 /* Fill default values if rbCfg is NULL */
3204 rlcConfig->present = RLC_Config_PR_am;
3205 BuildRlcConfigAm(NULLP, rlcConfig);
3207 /* If RbCfg is present, fill RLC configurations from DU Database */
3210 rlcConfig->present = covertRlcModeFromIntEnumToRrcEnum(rbCfg->rlcMode);
3211 switch(rlcConfig->present)
3213 case RLC_Config_PR_am:
3214 BuildRlcConfigAm(rbCfg->u.amCfg, rlcConfig);
3216 case RLC_Config_PR_um_Bi_Directional:
3217 BuildRlcConfigUmBiDir(rbCfg->u.umBiDirCfg, rlcConfig);
3219 case RLC_Config_PR_um_Uni_Directional_UL:
3220 BuildRlcConfigUmUniDirUl(rbCfg->u.umUniDirDlCfg, rlcConfig);
3222 case RLC_Config_PR_um_Uni_Directional_DL:
3223 BuildRlcConfigUmUniDirDl(rbCfg->u.umUniDirUlCfg, rlcConfig);
3225 case RLC_Config_PR_NOTHING:
3234 /*******************************************************************
3236 * @brief Builds MAC LC Config
3240 * Function : BuildMacLCConfig
3242 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
3244 * @params[in] struct LogicalChannelConfig macLcConfig
3246 * @return ROK - success
3249 * ****************************************************************/
3250 uint8_t BuildMacLCConfig(LcCfg *lcCfgDb, struct LogicalChannelConfig *macLcConfig)
3252 macLcConfig->ul_SpecificParameters = NULLP;
3253 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
3254 if(!macLcConfig->ul_SpecificParameters)
3256 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
3260 if(lcCfgDb == NULLP)
3262 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
3263 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
3264 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
3268 macLcConfig->ul_SpecificParameters->priority = lcCfgDb->ulLcCfg.priority;
3269 macLcConfig->ul_SpecificParameters->prioritisedBitRate = lcCfgDb->ulLcCfg.pbr;
3270 macLcConfig->ul_SpecificParameters->bucketSizeDuration = lcCfgDb->ulLcCfg.bsd;
3273 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
3274 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
3275 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
3276 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
3278 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
3279 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
3280 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
3282 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
3286 if(lcCfgDb == NULLP)
3287 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
3289 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = lcCfgDb->ulLcCfg.lcGroup;
3291 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
3292 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
3293 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
3295 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
3299 if(lcCfgDb == NULLP)
3300 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
3302 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = lcCfgDb->ulLcCfg.schReqId;
3304 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
3305 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
3306 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
3311 /*******************************************************************
3313 * @brief Builds RLC Bearer to Add/Mod list
3317 * Function :BuildRlcBearerToAddModList
3319 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
3321 * @params[in] rlc_BearerToAddModList
3323 * @return ROK - success
3326 * ****************************************************************/
3327 uint8_t BuildRlcBearerToAddModList(DuUeCb *ueCb, struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
3329 uint8_t idx = 0, lcIdx=0, macLcIdx = 0, elementCnt = 0;
3333 else if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
3334 elementCnt = ueCb->rlcUeCfg.numLcs;
3337 for(lcIdx = 0; lcIdx<ueCb->rlcUeCfg.numLcs; lcIdx++)
3339 if(ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent == false)
3343 rlcBearerList->list.count = elementCnt;
3344 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
3346 rlcBearerList->list.array = NULLP;
3347 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
3348 if(!rlcBearerList->list.array)
3350 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3354 for(idx=0; idx<rlcBearerList->list.count; idx++)
3356 rlcBearerList->list.array[idx] = NULLP;
3357 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
3358 if(!rlcBearerList->list.array[idx])
3360 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3368 rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
3369 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
3370 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
3372 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3375 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
3376 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB1_LCID;
3377 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
3379 /* Fill RLC related Configurations for this Radio Bearer */
3380 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
3381 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
3382 if(!rlcBearerList->list.array[idx]->rlc_Config)
3384 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3387 if(BuildRlcConfig(NULLP, rlcBearerList->list.array[idx]->rlc_Config) != ROK)
3389 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
3393 /* Fill MAC related configurations for this Radio Bearer */
3394 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
3395 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
3396 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
3398 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3401 if(BuildMacLCConfig(NULLP, rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
3403 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
3410 for(lcIdx=0; lcIdx<ueCb->rlcUeCfg.numLcs; lcIdx++)
3412 if((ueCb->f1UeDb->actionType != UE_CTXT_CFG_QUERY) && (ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent == true))
3415 /* Fill Logical channel identity */
3416 rlcBearerList->list.array[idx]->logicalChannelIdentity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId;
3418 /* Fill Radio Bearer Id and type (DRB/SRB) for this logical channel */
3419 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
3420 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
3422 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3425 rlcBearerList->list.array[idx]->servedRadioBearer->present = \
3426 covertRbTypeFromIntEnumToRrcEnum(ueCb->rlcUeCfg.rlcLcCfg[lcIdx].rbType);
3427 switch(rlcBearerList->list.array[idx]->servedRadioBearer->present)
3429 case RLC_BearerConfig__servedRadioBearer_PR_srb_Identity:
3430 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].rbId;
3432 case RLC_BearerConfig__servedRadioBearer_PR_drb_Identity:
3433 rlcBearerList->list.array[idx]->servedRadioBearer->choice.drb_Identity = ueCb->rlcUeCfg.rlcLcCfg[lcIdx].rbId;
3435 case RLC_BearerConfig__servedRadioBearer_PR_NOTHING:
3439 ueCb->rlcUeCfg.rlcLcCfg[lcIdx].isLcAddModRspSent = true;
3441 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
3443 /* Fill RLC related Configurations for this Radio Bearer */
3444 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
3445 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
3446 if(!rlcBearerList->list.array[idx]->rlc_Config)
3448 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3451 if(BuildRlcConfig(&ueCb->rlcUeCfg.rlcLcCfg[lcIdx], rlcBearerList->list.array[idx]->rlc_Config) != ROK)
3453 DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
3457 /* Fill MAC related configurations for this Radio Bearer */
3458 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
3459 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
3460 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
3462 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3465 for(macLcIdx = 0; macLcIdx < ueCb->macUeCfg.numLcs; macLcIdx++)
3467 if(ueCb->macUeCfg.lcCfgList[macLcIdx].lcId == ueCb->rlcUeCfg.rlcLcCfg[lcIdx].lcId)
3469 if(BuildMacLCConfig(&ueCb->macUeCfg.lcCfgList[macLcIdx], rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
3471 DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
3484 /*******************************************************************
3486 * @brief Build Control resource set to add/modify list
3490 * Function : BuildControlRSetToAddModList
3492 * Functionality: Build Control resource set to add/modify list
3495 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3497 * @return ROK - success
3500 * ****************************************************************/
3501 uint8_t BuildControlRSetToAddModList(PdcchConfig *pdcchCfg, struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList)
3505 uint8_t numBytes, bitsUnused;
3506 struct ControlResourceSet *controlRSet;
3507 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3508 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3510 if(pdcchCfg == NULLP)
3513 elementCnt = pdcchCfg->numCRsetToAddMod;
3515 controlRSetList->list.count = elementCnt;
3516 controlRSetList->list.size = elementCnt * sizeof(struct ControlResourceSet *);
3518 controlRSetList->list.array = NULLP;
3519 DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3520 if(!controlRSetList->list.array)
3522 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3526 for(idx = 0; idx < elementCnt; idx++)
3528 controlRSetList->list.array[idx] = NULLP;
3529 DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3530 if(!controlRSetList->list.array[idx])
3532 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3537 for(idx = 0; idx < elementCnt; idx++)
3539 controlRSet = controlRSetList->list.array[idx];
3541 if(pdcchCfg == NULLP)
3542 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3544 controlRSet->controlResourceSetId = pdcchCfg->cRSetToAddModList[idx].cRSetId;
3548 * Bit string stored ff0000000000
3552 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3554 controlRSet->frequencyDomainResources.buf = NULLP;
3555 DU_ALLOC(controlRSet->frequencyDomainResources.buf, controlRSet->frequencyDomainResources.size);
3556 if(!controlRSet->frequencyDomainResources.buf)
3558 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3562 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3564 if(pdcchCfg == NULLP)
3566 coreset0EndPrb = CORESET0_END_PRB;
3567 coreset1StartPrb = coreset0EndPrb + 6;
3568 coreset1NumPrb = CORESET1_NUM_PRB;
3569 /* calculate the PRBs */
3570 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3571 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3572 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3574 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3575 controlRSet->cce_REG_MappingType.present = ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3576 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3580 memcpy(controlRSet->frequencyDomainResources.buf, pdcchCfg->cRSetToAddModList[idx].freqDomainRsrc, FREQ_DOM_RSRC_SIZE);
3581 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3582 controlRSet->duration = pdcchCfg->cRSetToAddModList[idx].duration;
3583 controlRSet->cce_REG_MappingType.present = pdcchCfg->cRSetToAddModList[idx].cceRegMappingType;
3584 controlRSet->precoderGranularity = pdcchCfg->cRSetToAddModList[idx].precoderGranularity;
3586 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3587 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3588 controlRSet->tci_PresentInDCI = NULLP;
3591 uint8_t tciStateIdx;
3593 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3594 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3595 if(!controlRset->tci_StatesPDCCH_ToAddList)
3597 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3602 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3603 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3604 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3605 controlRset->tci_StatesPDCCH_ToAddList->list.size)
3606 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3608 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3612 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3614 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3615 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3617 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3624 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3626 DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3627 if(!controlRset->tci_PresentInDCI)
3629 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3633 *(controlRset->tci_PresentInDCI);
3636 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3637 DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3638 if(!controlRSet->pdcch_DMRS_ScramblingID)
3640 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3643 if(pdcchCfg == NULLP)
3644 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3646 *(controlRSet->pdcch_DMRS_ScramblingID) = pdcchCfg->cRSetToAddModList[idx].dmrsScramblingId;
3649 } /* End BuildControlRSetToAddModList */
3651 /*******************************************************************
3653 * @brief Build search space to add/modify list
3657 * Function : BuildSearchSpcToAddModList
3659 * Functionality: Build search space to add/modify list
3662 * @return ROK - success
3665 * ****************************************************************/
3666 uint8_t BuildSearchSpcToAddModList(PdcchConfig *pdcchCfg, struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
3673 struct SearchSpace *searchSpc;
3675 if(pdcchCfg == NULLP)
3678 elementCnt = pdcchCfg->numSearchSpcToAddMod;
3680 searchSpcList->list.count = elementCnt;
3681 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3683 searchSpcList->list.array = NULLP;
3684 DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3685 if(!searchSpcList->list.array)
3687 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3691 for(idx = 0; idx < elementCnt; idx++)
3693 searchSpcList->list.array[idx] = NULLP;
3694 DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3695 if(!searchSpcList->list.array[idx])
3697 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3702 for(idx = 0; idx < elementCnt; idx++)
3704 searchSpc = searchSpcList->list.array[idx];
3706 if(pdcchCfg == NULLP)
3707 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3709 searchSpc->searchSpaceId = pdcchCfg->searchSpcToAddModList[idx].searchSpaceId;
3711 searchSpc->controlResourceSetId = NULLP;
3712 DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3713 if(!searchSpc->controlResourceSetId)
3715 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3718 if(pdcchCfg == NULLP)
3719 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3721 *(searchSpc->controlResourceSetId) = pdcchCfg->searchSpcToAddModList[idx].cRSetId;
3723 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3724 DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3725 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3727 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3730 if(pdcchCfg == NULLP)
3731 searchSpc->monitoringSlotPeriodicityAndOffset->present = SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3733 searchSpc->monitoringSlotPeriodicityAndOffset->present = pdcchCfg->searchSpcToAddModList[idx].mSlotPeriodicityAndOffset;
3735 searchSpc->duration = NULLP;
3736 searchSpc->monitoringSymbolsWithinSlot = NULLP;
3737 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3738 if(!searchSpc->monitoringSymbolsWithinSlot)
3740 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3744 /* Values taken from reference logs :
3747 * Bit string stores 8000
3751 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3752 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3753 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, searchSpc->monitoringSymbolsWithinSlot->size);
3754 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3756 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3759 if(pdcchCfg == NULLP)
3762 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3763 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3766 memcpy(searchSpc->monitoringSymbolsWithinSlot->buf, pdcchCfg->searchSpcToAddModList[idx].mSymbolsWithinSlot, numBytes);
3767 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3769 searchSpc->nrofCandidates = NULLP;
3770 DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3771 if(!searchSpc->nrofCandidates)
3773 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3777 if(pdcchCfg == NULLP)
3779 searchSpc->nrofCandidates->aggregationLevel1 = PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3780 searchSpc->nrofCandidates->aggregationLevel2 = PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3781 searchSpc->nrofCandidates->aggregationLevel4 = PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3782 searchSpc->nrofCandidates->aggregationLevel8 = PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3783 searchSpc->nrofCandidates->aggregationLevel16 = PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3787 searchSpc->nrofCandidates->aggregationLevel1 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel1;
3788 searchSpc->nrofCandidates->aggregationLevel2 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel2;
3789 searchSpc->nrofCandidates->aggregationLevel4 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel4;
3790 searchSpc->nrofCandidates->aggregationLevel8 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel8;
3791 searchSpc->nrofCandidates->aggregationLevel16 = pdcchCfg->searchSpcToAddModList[idx].numCandidatesAggLevel16;
3794 searchSpc->searchSpaceType = NULLP;
3795 DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3796 if(!searchSpc->searchSpaceType)
3798 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3801 if(pdcchCfg == NULLP)
3802 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3804 searchSpc->searchSpaceType->present = pdcchCfg->searchSpcToAddModList[idx].searchSpaceType;
3806 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3807 DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3808 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3810 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3813 if(pdcchCfg == NULLP)
3814 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3816 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = pdcchCfg->searchSpcToAddModList[idx].ueSpecificDciFormat;
3819 }/* End BuildSearchSpcToAddModList */
3821 /*******************************************************************
3823 * @brief Builds BWP DL dedicated PDCCH config
3827 * Function : BuildBWPDlDedPdcchCfg
3829 * Functionality: Builds BWP DL dedicated PDCCH config
3831 * @params[in] struct PDCCH_Config *pdcchCfg
3833 * @return ROK - success
3836 * ****************************************************************/
3837 uint8_t BuildBWPDlDedPdcchCfg(PdcchConfig *pdcchCfgDb, struct PDCCH_Config *pdcchCfg)
3839 pdcchCfg->controlResourceSetToAddModList = NULLP;
3840 DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3841 if(!pdcchCfg->controlResourceSetToAddModList)
3843 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3847 if(BuildControlRSetToAddModList(pdcchCfgDb, pdcchCfg->controlResourceSetToAddModList) != ROK)
3849 DU_LOG("\nERROR --> F1AP : Failed in BuildControlRSetToAddModList()");
3853 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3855 pdcchCfg->searchSpacesToAddModList = NULLP;
3856 DU_ALLOC(pdcchCfg->searchSpacesToAddModList, sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3857 if(!pdcchCfg->searchSpacesToAddModList)
3859 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3863 if(BuildSearchSpcToAddModList(pdcchCfgDb, pdcchCfg->searchSpacesToAddModList) != ROK)
3865 DU_LOG("\nERROR --> F1AP : Failed in BuildSearchSpcToAddModList()");
3869 pdcchCfg->searchSpacesToReleaseList = NULLP;
3870 pdcchCfg->downlinkPreemption = NULLP;
3871 pdcchCfg->tpc_PUSCH = NULLP;
3872 pdcchCfg->tpc_PUCCH = NULLP;
3873 pdcchCfg->tpc_SRS = NULLP;
3878 /*******************************************************************
3880 * @brief Builds DMRS DL PDSCH Mapping type A
3884 * Function : BuildDMRSDLPdschMapTypeA
3886 * Functionality: Builds DMRS DL PDSCH Mapping type A
3889 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3890 * @return ROK - success
3893 * ****************************************************************/
3894 uint8_t BuildDMRSDLPdschMapTypeA(PdschConfig *pdschCfg, struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg)
3896 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3897 dmrsDlCfg->choice.setup = NULLP;
3898 DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3899 if(!dmrsDlCfg->choice.setup)
3901 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3905 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3906 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3907 DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3908 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3910 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3913 if(pdschCfg == NULLP)
3914 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3916 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = pdschCfg->dmrsDlCfgForPdschMapTypeA.addPos;
3918 dmrsDlCfg->choice.setup->maxLength = NULLP;
3919 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3920 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3921 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3926 /*******************************************************************
3928 * @brief Builds TCI states to add/modify list
3932 * Function : BuildTCIStatesToAddModList
3934 * Functionality:Builds TCI states to add/modify list
3937 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3939 * @return ROK - success
3942 * ****************************************************************/
3943 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3948 /*******************************************************************
3950 * @brief Builds PDSCH time domain allocation list
3954 * Function : BuildPdschTimeDomAllocList
3956 * Functionality: Builds PDSCH time domain allocation list
3959 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3961 * @return ROK - success
3964 * ****************************************************************/
3965 uint8_t BuildPdschTimeDomAllocList(PdschConfig *pdschCfg, struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
3969 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3971 timeDomAllocList->present = PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3973 timeDomAllocList->choice.setup = NULLP;
3974 DU_ALLOC(timeDomAllocList->choice.setup, sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3975 if(!timeDomAllocList->choice.setup)
3977 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3981 if(pdschCfg == NULLP)
3984 elementCnt = pdschCfg->numTimeDomRsrcAlloc;
3985 timeDomAllocList->choice.setup->list.count = elementCnt;
3986 timeDomAllocList->choice.setup->list.size = elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3988 timeDomAllocList->choice.setup->list.array = NULLP;
3989 DU_ALLOC(timeDomAllocList->choice.setup->list.array, timeDomAllocList->choice.setup->list.size);
3990 if(!timeDomAllocList->choice.setup->list.array)
3992 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3996 for(idx = 0; idx < elementCnt; idx++)
3998 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3999 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
4000 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4001 if(!timeDomAllocList->choice.setup->list.array[idx])
4003 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4008 if(pdschCfg == NULLP)
4011 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4012 DU_ALLOC(timeDomAlloc->k0, sizeof(long));
4013 if(!timeDomAlloc->k0)
4015 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4018 *(timeDomAlloc->k0) = 0;
4019 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4020 timeDomAlloc->startSymbolAndLength = \
4021 calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
4024 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4025 DU_ALLOC(timeDomAlloc->k0, sizeof(long));
4026 if(!timeDomAlloc->k0)
4028 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4031 *(timeDomAlloc->k0) = 1;
4032 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
4033 timeDomAlloc->startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
4037 for(idx = 0; idx < elementCnt; idx++)
4039 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4040 DU_ALLOC(timeDomAlloc->k0, sizeof(long));
4041 if(!timeDomAlloc->k0)
4043 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
4046 if(pdschCfg->timeDomRsrcAllociList[idx].k0)
4047 *(timeDomAlloc->k0) = *(pdschCfg->timeDomRsrcAllociList[idx].k0);
4048 timeDomAlloc->mappingType = pdschCfg->timeDomRsrcAllociList[idx].mappingType;
4049 timeDomAlloc->startSymbolAndLength = pdschCfg->timeDomRsrcAllociList[idx].startSymbolAndLength;
4056 /*******************************************************************
4058 * @brief Builds PDSCH PRB Bundling type
4062 * Function : BuildPdschPrbBundlingType
4064 * Functionality: Builds PDSCH PRB Bundling type
4067 * struct PDSCH_Config__prb_BundlingType *prbBndlType
4069 * @return ROK - success
4072 * ****************************************************************/
4073 uint8_t BuildPdschPrbBundlingType(PdschConfig *pdschCfg, struct PDSCH_Config__prb_BundlingType *prbBndlType)
4075 if(pdschCfg == NULLP)
4076 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
4078 prbBndlType->present = pdschCfg->bundlingType;
4080 prbBndlType->choice.staticBundling = NULLP;
4081 DU_ALLOC(prbBndlType->choice.staticBundling, \
4082 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4083 if(!prbBndlType->choice.staticBundling)
4085 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
4088 prbBndlType->choice.staticBundling->bundleSize = NULLP;
4093 /*******************************************************************
4095 * @brief Builds BWP DL dedicated PDSCH config
4099 * Function : BuildBWPDlDedPdschCfg
4101 * Functionality: Builds BWP DL dedicated PDSCH config
4103 * @params[in] struct PDSCH_Config *pdschCfg
4105 * @return ROK - success
4108 * ****************************************************************/
4109 uint8_t BuildBWPDlDedPdschCfg(PdschConfig *pdschCfgDb, struct PDSCH_Config *pdschCfg)
4111 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
4113 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
4114 DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4115 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4117 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4121 if(BuildDMRSDLPdschMapTypeA(pdschCfgDb, pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
4126 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
4127 pdschCfg->tci_StatesToAddModList = NULLP;
4128 pdschCfg->tci_StatesToReleaseList = NULLP;
4129 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
4131 DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
4132 if(!pdschCfg->tci_StatesToAddModList)
4134 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4137 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
4143 if(pdschCfgDb == NULLP)
4144 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
4146 pdschCfg->resourceAllocation = pdschCfgDb->resourceAllocType;
4148 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
4149 DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4150 if(!pdschCfg->pdsch_TimeDomainAllocationList)
4152 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4155 if(BuildPdschTimeDomAllocList(pdschCfgDb, pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
4160 pdschCfg->pdsch_AggregationFactor = NULLP;
4161 pdschCfg->rateMatchPatternToAddModList = NULLP;
4162 pdschCfg->rateMatchPatternToReleaseList = NULLP;
4163 pdschCfg->rateMatchPatternGroup1 = NULLP;
4164 pdschCfg->rateMatchPatternGroup2 = NULLP;
4165 if(pdschCfgDb == NULLP)
4166 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
4168 pdschCfg->rbg_Size = pdschCfgDb->rbgSize;
4169 pdschCfg->mcs_Table = NULLP;
4171 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
4172 DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4173 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
4175 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
4178 if(pdschCfgDb == NULLP)
4179 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
4181 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = pdschCfgDb->numCodeWordsSchByDci;
4183 if(BuildPdschPrbBundlingType(pdschCfgDb, &pdschCfg->prb_BundlingType) != ROK)
4188 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
4189 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
4190 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4191 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4192 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
4193 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
4194 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
4199 /*******************************************************************
4201 * @brief Builds intitial DL BWP
4204 * Function : BuildInitialDlBWP
4206 * Functionality: Builds intitial DL BWP in spCellCfgDed
4208 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4210 * @return ROK - success
4213 * ****************************************************************/
4214 uint8_t BuildInitialDlBWP(InitialDlBwp *initiDlBwp, BWP_DownlinkDedicated_t *dlBwp)
4216 PdcchConfig *pdcchCfg = NULLP;
4217 PdschConfig *pdschCfg = NULLP;
4221 if(initiDlBwp->pdcchPresent)
4222 pdcchCfg = &initiDlBwp->pdcchCfg;
4223 if(initiDlBwp->pdschPresent)
4224 pdschCfg = &initiDlBwp->pdschCfg;
4227 dlBwp->pdcch_Config = NULLP;
4228 DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
4229 if(!dlBwp->pdcch_Config)
4231 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4234 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
4236 dlBwp->pdcch_Config->choice.setup = NULLP;
4237 DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
4238 if(!dlBwp->pdcch_Config->choice.setup)
4240 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4243 if(BuildBWPDlDedPdcchCfg(pdcchCfg, dlBwp->pdcch_Config->choice.setup) != ROK)
4248 dlBwp->pdsch_Config = NULLP;
4249 DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
4250 if(!dlBwp->pdsch_Config)
4252 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4255 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
4257 dlBwp->pdsch_Config->choice.setup = NULLP;
4258 DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4259 if(!dlBwp->pdsch_Config->choice.setup)
4261 DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
4265 if(BuildBWPDlDedPdschCfg(pdschCfg, dlBwp->pdsch_Config->choice.setup) != ROK)
4270 dlBwp->sps_Config = NULLP;
4271 dlBwp->radioLinkMonitoringConfig = NULLP;
4275 /*******************************************************************
4277 * @brief Builds DMRS UL Pusch Mapping type A
4281 * Function : BuildDMRSULPuschMapTypeA
4283 * Functionality: Builds DMRS UL Pusch Mapping type A
4286 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4287 * @return ROK - success
4290 * ****************************************************************/
4291 uint8_t BuildDMRSULPuschMapTypeA(DmrsUlCfg *ulDmrsCfgDb, struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg)
4293 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4294 dmrsUlCfg->choice.setup= NULLP;
4295 DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4296 if(!dmrsUlCfg->choice.setup)
4298 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4302 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4303 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4304 DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4305 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4307 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4310 if(ulDmrsCfgDb == NULLP)
4311 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
4313 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = ulDmrsCfgDb->addPos;
4315 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4316 dmrsUlCfg->choice.setup->maxLength = NULLP;
4317 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4318 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4319 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4321 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4325 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4326 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4328 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4330 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4333 if(ulDmrsCfgDb == NULLP)
4334 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4336 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = ulDmrsCfgDb->transPrecodDisabled.scramblingId0;
4338 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4339 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4343 /*******************************************************************
4345 * @brief Build PUSCH time domain allocation list
4349 * Function : BuildPuschTimeDomAllocList
4351 * Functionality: Build PUSCH time domain allocation list
4354 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4356 * @return ROK - success
4359 * ****************************************************************/
4360 uint8_t BuildPuschTimeDomAllocList(PuschCfg *puschCfgDb, struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList)
4364 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
4366 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4367 timeDomAllocList->choice.setup = NULLP;
4368 DU_ALLOC(timeDomAllocList->choice.setup, sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4369 if(!timeDomAllocList->choice.setup)
4371 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4375 if(puschCfgDb == NULLP)
4378 elementCnt = puschCfgDb->numTimeDomRsrcAlloc;
4380 timeDomAllocList->choice.setup->list.count = elementCnt;
4381 timeDomAllocList->choice.setup->list.size = elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4382 timeDomAllocList->choice.setup->list.array = NULLP;
4383 DU_ALLOC(timeDomAllocList->choice.setup->list.array, timeDomAllocList->choice.setup->list.size);
4384 if(!timeDomAllocList->choice.setup->list.array)
4386 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4390 for(idx = 0; idx < elementCnt; idx++)
4392 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4393 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], sizeof(PUSCH_TimeDomainResourceAllocation_t));
4394 if(!timeDomAllocList->choice.setup->list.array[idx])
4396 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4401 for(idx = 0; idx < elementCnt; idx++)
4403 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4404 DU_ALLOC(timeDomAlloc->k2, sizeof(long));
4405 if(!timeDomAlloc->k2)
4407 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4410 if(puschCfgDb == NULLP)
4413 *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4415 *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4417 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4418 timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
4422 *(timeDomAlloc->k2) = puschCfgDb->timeDomRsrcAllocList[idx].k2;
4423 timeDomAlloc->mappingType = puschCfgDb->timeDomRsrcAllocList[idx].mappingType;
4424 timeDomAlloc->startSymbolAndLength = puschCfgDb->timeDomRsrcAllocList[idx].startSymbolAndLength;
4431 /*******************************************************************
4433 * @brief Builds BWP UL dedicated PUSCH Config
4437 * Function : BuildBWPUlDedPuschCfg
4440 * Builds BWP UL dedicated PUSCH Config
4442 * @params[in] : PUSCH_Config_t *puschCfg
4444 * @return ROK - success
4447 * ****************************************************************/
4448 uint8_t BuildBWPUlDedPuschCfg(PuschCfg *puschCfgDb, PUSCH_Config_t *puschCfg)
4450 DmrsUlCfg *ulDmrsCfg = NULLP;
4453 ulDmrsCfg = &puschCfgDb->dmrsUlCfgForPuschMapTypeA;
4455 puschCfg->dataScramblingIdentityPUSCH = NULLP;
4456 DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4457 if(!puschCfg->dataScramblingIdentityPUSCH)
4459 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4462 if(puschCfgDb == NULLP)
4463 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4465 *(puschCfg->dataScramblingIdentityPUSCH) = puschCfgDb->dataScramblingId;
4467 puschCfg->txConfig = NULLP;
4468 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4469 DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4470 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4472 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4476 if(BuildDMRSULPuschMapTypeA(ulDmrsCfg, puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4481 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4482 puschCfg->pusch_PowerControl = NULLP;
4483 puschCfg->frequencyHopping = NULLP;
4484 puschCfg->frequencyHoppingOffsetLists = NULLP;
4486 if(puschCfgDb == NULLP)
4487 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4489 puschCfg->resourceAllocation = puschCfgDb->resourceAllocType;
4491 puschCfg->pusch_TimeDomainAllocationList = NULLP;
4492 DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4493 if(!puschCfg->pusch_TimeDomainAllocationList)
4495 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4499 if(BuildPuschTimeDomAllocList(puschCfgDb, puschCfg->pusch_TimeDomainAllocationList) != ROK)
4504 puschCfg->pusch_AggregationFactor = NULLP;
4505 puschCfg->mcs_Table = NULLP;
4506 puschCfg->mcs_TableTransformPrecoder = NULLP;
4507 puschCfg->transformPrecoder = NULLP;
4508 DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4509 if(!puschCfg->transformPrecoder)
4511 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4514 if(puschCfgDb == NULLP)
4515 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4517 *(puschCfg->transformPrecoder) = puschCfgDb->transformPrecoder;
4519 puschCfg->codebookSubset = NULLP;
4520 puschCfg->maxRank = NULLP;
4521 puschCfg->rbg_Size = NULLP;
4522 puschCfg->uci_OnPUSCH = NULLP;
4523 puschCfg->tp_pi2BPSK = NULLP;
4528 /*******************************************************************
4530 * @brief Builds PUCCH resource set add/modify list
4534 * Function : BuildPucchRsrcSetAddModList
4537 * Builds PUCCH resource set add/modify list
4539 * @params[in] : PucchResrcSetCfg *rsrcSetCfgDb
4540 * struct PUCCH_Config__resourceSetToAddModList *rsrcSetAddModList
4542 * @return ROK - success
4545 * ****************************************************************/
4546 uint8_t BuildPucchRsrcSetAddModList(PucchResrcSetCfg *rsrcSetCfgDb, \
4547 struct PUCCH_Config__resourceSetToAddModList *resourceSetToAddModList)
4549 uint8_t elementCnt = 0, rsrcSetIdx = 0, rsrcIdx = 0;
4550 PUCCH_ResourceSet_t *rsrcSet = NULLP;
4552 if(rsrcSetCfgDb == NULLP)
4555 elementCnt = rsrcSetCfgDb->resrcSetToAddModListCount;
4557 resourceSetToAddModList->list.count = elementCnt;
4558 resourceSetToAddModList->list.size = elementCnt * sizeof(PUCCH_ResourceSet_t *);
4559 DU_ALLOC(resourceSetToAddModList->list.array, resourceSetToAddModList->list.size);
4560 if(resourceSetToAddModList->list.array == NULLP)
4562 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList");
4565 for(rsrcSetIdx=0; rsrcSetIdx < resourceSetToAddModList->list.count; rsrcSetIdx++)
4567 DU_ALLOC(resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
4568 if(resourceSetToAddModList->list.array[rsrcSetIdx] == NULLP)
4570 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList");
4575 for(rsrcSetIdx=0; rsrcSetIdx < resourceSetToAddModList->list.count; rsrcSetIdx++)
4577 rsrcSet = resourceSetToAddModList->list.array[rsrcSetIdx];
4579 /* Resource set Id */
4580 if(rsrcSetCfgDb == NULLP)
4581 rsrcSet->pucch_ResourceSetId = 1;
4583 rsrcSet->pucch_ResourceSetId = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].resrcSetId;
4585 /* Resource list of a resource set */
4586 if(rsrcSetCfgDb == NULLP)
4589 elementCnt = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].resrcListCount;
4590 rsrcSet->resourceList.list.count = elementCnt;
4591 rsrcSet->resourceList.list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
4592 DU_ALLOC(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
4593 if(rsrcSet->resourceList.list.array == NULLP)
4595 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList");
4599 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4601 DU_ALLOC(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
4602 if(rsrcSet->resourceList.list.array[rsrcIdx] == NULLP)
4604 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList");
4608 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
4610 if(rsrcSetCfgDb == NULLP)
4611 *(rsrcSet->resourceList.list.array[rsrcIdx]) = 1;
4613 *(rsrcSet->resourceList.list.array[rsrcIdx]) = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].resrcList[rsrcIdx];
4616 /* Max payload size (minus 1) in a Resource set */
4617 rsrcSet->maxPayloadMinus1 = NULLP;
4618 if(rsrcSetCfgDb && rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].maxPayLoadSize)
4620 DU_ALLOC(rsrcSet->maxPayloadMinus1, sizeof(long));
4621 if(rsrcSet->maxPayloadMinus1 == NULLP)
4623 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcSetAddModList");
4626 *(rsrcSet->maxPayloadMinus1) = rsrcSetCfgDb->resrcSetToAddModList[rsrcSetIdx].maxPayLoadSize;
4632 /*******************************************************************
4634 * @brief Builds PUCCH resource add/modify list
4638 * Function : BuildPucchRsrcAdddModList
4641 * Builds PUCCH resource add/modify list
4643 * @params[in] : PucchResrcCfg *rsrcSetCfgDb
4644 * struct PUCCH_Config__resourceSetToAddModList *rsrcSetAddModList
4646 * @return ROK - success
4649 * ****************************************************************/
4650 uint8_t BuildPucchRsrcAddModList(PucchResrcCfg *rsrcCfgDb, struct PUCCH_Config__resourceToAddModList *resourceToAddModList)
4652 uint8_t elementCnt = 0, rsrcIdx = 0;
4653 PUCCH_Resource_t *rsrc = NULLP;
4655 if(rsrcCfgDb == NULLP)
4658 elementCnt = rsrcCfgDb->resrcToAddModListCount;
4659 resourceToAddModList->list.count = elementCnt;
4660 resourceToAddModList->list.size = elementCnt * sizeof(PUCCH_Resource_t *);
4661 DU_ALLOC(resourceToAddModList->list.array, resourceToAddModList->list.size);
4662 if(resourceToAddModList->list.array == NULLP)
4664 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4667 for(rsrcIdx=0; rsrcIdx < resourceToAddModList->list.count; rsrcIdx++)
4669 DU_ALLOC(resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
4670 if(resourceToAddModList->list.array[rsrcIdx] == NULLP)
4672 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4677 for(rsrcIdx=0; rsrcIdx < resourceToAddModList->list.count; rsrcIdx++)
4679 rsrc = resourceToAddModList->list.array[rsrcIdx];
4681 if(rsrcCfgDb == NULLP)
4683 rsrc->pucch_ResourceId = 1;
4684 rsrc->startingPRB = 0;
4685 rsrc->format.present = PUCCH_Resource__format_PR_format1;
4686 DU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4687 if(rsrc->format.choice.format1 == NULLP)
4689 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4692 rsrc->format.choice.format1->initialCyclicShift = 0;
4693 rsrc->format.choice.format1->nrofSymbols = 4;
4694 rsrc->format.choice.format1->startingSymbolIndex = 0;
4695 rsrc->format.choice.format1->timeDomainOCC = 0;
4699 rsrc->pucch_ResourceId = rsrcCfgDb->resrcToAddModList[rsrcIdx].resrcId;
4700 rsrc->startingPRB = rsrcCfgDb->resrcToAddModList[rsrcIdx].startPrb;
4701 if(rsrcCfgDb->resrcToAddModList[rsrcIdx].intraFreqHop)
4703 DU_ALLOC(rsrc->intraSlotFrequencyHopping, sizeof(long));
4704 if(rsrc->intraSlotFrequencyHopping == NULLP)
4706 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4709 *(rsrc->intraSlotFrequencyHopping) = rsrcCfgDb->resrcToAddModList[rsrcIdx].intraFreqHop;
4712 rsrc->intraSlotFrequencyHopping = NULLP;
4714 if(rsrcCfgDb->resrcToAddModList[rsrcIdx].secondPrbHop)
4716 DU_ALLOC(rsrc->secondHopPRB, sizeof(PRB_Id_t));
4717 if(rsrc->secondHopPRB == NULLP)
4719 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4722 *(rsrc->secondHopPRB) = rsrcCfgDb->resrcToAddModList[rsrcIdx].secondPrbHop;
4725 rsrc->secondHopPRB = NULLP;
4726 rsrc->format.present = covertPucchFormatIntEnumToRrcEnum(rsrcCfgDb->resrcToAddModList[rsrcIdx].pucchFormat);
4728 switch(rsrc->format.present)
4730 case PUCCH_Resource__format_PR_NOTHING:
4732 case PUCCH_Resource__format_PR_format0:
4734 DU_ALLOC(rsrc->format.choice.format0, sizeof(PUCCH_format0_t));
4735 if(rsrc->format.choice.format0 == NULLP)
4737 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4740 rsrc->format.choice.format0->initialCyclicShift = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format0->initialCyclicShift;
4741 rsrc->format.choice.format0->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format0->numSymbols;
4742 rsrc->format.choice.format0->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format0->startSymbolIdx;
4746 case PUCCH_Resource__format_PR_format1:
4748 DU_ALLOC(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
4749 if(rsrc->format.choice.format1 == NULLP)
4751 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4754 rsrc->format.choice.format1->initialCyclicShift = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->initialCyclicShift;
4755 rsrc->format.choice.format1->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->numSymbols;
4756 rsrc->format.choice.format1->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->startSymbolIdx;
4757 rsrc->format.choice.format1->timeDomainOCC = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format1->timeDomOCC;
4761 case PUCCH_Resource__format_PR_format2:
4763 DU_ALLOC(rsrc->format.choice.format2, sizeof(PUCCH_format2_t));
4764 if(rsrc->format.choice.format2 == NULLP)
4766 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4769 rsrc->format.choice.format2->nrofPRBs = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format2->numPrbs;
4770 rsrc->format.choice.format2->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format2->numSymbols;
4771 rsrc->format.choice.format2->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format2->startSymbolIdx;
4775 case PUCCH_Resource__format_PR_format3:
4777 DU_ALLOC(rsrc->format.choice.format3, sizeof(PUCCH_format3_t));
4778 if(rsrc->format.choice.format3 == NULLP)
4780 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4783 rsrc->format.choice.format3->nrofPRBs = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format3->numPrbs;
4784 rsrc->format.choice.format3->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format3->numSymbols;
4785 rsrc->format.choice.format3->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format3->startSymbolIdx;
4789 case PUCCH_Resource__format_PR_format4:
4791 DU_ALLOC(rsrc->format.choice.format4, sizeof(PUCCH_format4_t));
4792 if(rsrc->format.choice.format4 == NULLP)
4794 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchRsrcAddModList");
4797 rsrc->format.choice.format4->nrofSymbols = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->numSymbols;
4798 rsrc->format.choice.format4->occ_Length = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->occLen;
4799 rsrc->format.choice.format4->occ_Index = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->occIdx;
4800 rsrc->format.choice.format4->startingSymbolIndex = rsrcCfgDb->resrcToAddModList[rsrcIdx].PucchFormat.format4->startSymbolIdx;
4809 /*******************************************************************
4811 * @brief Builds PUCCH format config
4815 * Function : BuildPucchFormat
4817 * Functionality: Builds PUCCH format config
4819 * @params[in] : PucchFormatCfg *formatDb
4820 * PUCCH_FormatConfig_t *format
4822 * @return ROK - success
4825 * ****************************************************************/
4826 uint8_t BuildPucchFormat(PucchFormatCfg *formatDb, PUCCH_FormatConfig_t *format)
4828 /* Inter Slot Fequency hopping */
4829 format->interslotFrequencyHopping = NULLP;
4830 if((formatDb != NULLP) && (formatDb->interSlotFreqHop == true))
4832 DU_ALLOC(format->interslotFrequencyHopping, sizeof(long));
4833 if(format->interslotFrequencyHopping)
4835 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat");
4838 *(format->interslotFrequencyHopping) = PUCCH_FormatConfig__interslotFrequencyHopping_enabled;
4841 /* Additional DMRS */
4842 format->additionalDMRS = NULLP;
4843 if((formatDb != NULLP) && (formatDb->addDmrs == true))
4845 DU_ALLOC(format->additionalDMRS, sizeof(long));
4846 if(format->additionalDMRS)
4848 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat");
4851 *(format->additionalDMRS) = PUCCH_FormatConfig__additionalDMRS_true;
4854 /* Maximum code rate */
4855 format->maxCodeRate = NULLP;
4856 if((formatDb != NULLP) && (formatDb->maxCodeRate != 0))
4858 DU_ALLOC(format->maxCodeRate, sizeof(long));
4859 if(format->maxCodeRate)
4861 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat");
4864 *(format->maxCodeRate) = formatDb->maxCodeRate;
4867 /* Number of slots */
4868 format->nrofSlots = NULLP;
4869 if((formatDb == NULLP) || ((formatDb != NULLP) && (formatDb->numSlots != 0)))
4871 DU_ALLOC(format->nrofSlots, sizeof(long));
4872 if(format->nrofSlots == NULLP)
4874 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat");
4877 if(formatDb == NULLP)
4878 *(format->nrofSlots) = PUCCH_FormatConfig__nrofSlots_n4;
4880 *(format->nrofSlots) = formatDb->numSlots;
4884 format->pi2BPSK = NULLP;
4885 if((formatDb != NULLP) && (formatDb->pi2BPSK == true))
4887 DU_ALLOC(format->pi2BPSK, sizeof(long));
4890 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat");
4893 *(format->pi2BPSK) = PUCCH_FormatConfig__pi2BPSK_enabled;
4896 /* Simultaneous HARQ ACK and CSI */
4897 format->simultaneousHARQ_ACK_CSI = NULLP;
4898 if((formatDb != NULLP) && (formatDb->harqAckCSI == true))
4900 DU_ALLOC(format->simultaneousHARQ_ACK_CSI, sizeof(long));
4901 if(format->simultaneousHARQ_ACK_CSI)
4903 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPucchFormat");
4906 *(format->simultaneousHARQ_ACK_CSI) = PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true;
4913 /*******************************************************************
4915 * @brief Builds PUCCH scheduling request list
4919 * Function : BuildPucchSchReqAddModList
4922 * Builds PUCCH scheduling request list
4924 * @params[in] : PucchSchedReqCfg *schReqDb
4925 * struct PUCCH_Config__schedulingRequestResourceToAddModList *schReqRsrcToAddModList
4927 * @return ROK - success
4930 * ****************************************************************/
4931 uint8_t BuildPucchSchReqAddModList(PucchSchedReqCfg *schReqDb, \
4932 struct PUCCH_Config__schedulingRequestResourceToAddModList *schReqRsrcToAddModList)
4934 uint8_t elementCnt = 0, schReqIdx = 0;
4935 SchedulingRequestResourceConfig_t *schReqRsrc;
4937 elementCnt = schReqDb->schedAddModListCount;
4938 schReqRsrcToAddModList->list.count = elementCnt;
4939 schReqRsrcToAddModList->list.size = elementCnt *sizeof(struct SchedulingRequestResourceConfig *);
4941 schReqRsrcToAddModList->list.array = NULLP;
4942 DU_ALLOC(schReqRsrcToAddModList->list.array, schReqRsrcToAddModList->list.size);
4943 if(schReqRsrcToAddModList->list.array == NULLP)
4945 DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList");
4949 for(schReqIdx = 0; schReqIdx < schReqRsrcToAddModList->list.count; schReqIdx++)
4951 DU_ALLOC(schReqRsrcToAddModList->list.array[schReqIdx], schReqRsrcToAddModList->list.size);
4952 if(schReqRsrcToAddModList->list.array[schReqIdx] == NULLP)
4954 DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList");
4959 for(schReqIdx = 0; schReqIdx < schReqRsrcToAddModList->list.count; schReqIdx++)
4961 schReqRsrc = schReqRsrcToAddModList->list.array[schReqIdx];
4962 schReqRsrc->schedulingRequestResourceId = schReqDb->schedAddModList[schReqIdx].resrcId;
4963 schReqRsrc->schedulingRequestID = schReqDb->schedAddModList[schReqIdx].requestId;
4965 if(schReqDb->schedAddModList[schReqIdx].periodicity)
4967 schReqRsrc->periodicityAndOffset = NULLP;
4968 DU_ALLOC(schReqRsrc->periodicityAndOffset, sizeof(struct SchedulingRequestResourceConfig__periodicityAndOffset));
4969 if(schReqRsrc->periodicityAndOffset == NULLP)
4971 DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList");
4975 schReqRsrc->periodicityAndOffset->present = schReqDb->schedAddModList[schReqIdx].periodicity;
4976 switch(schReqRsrc->periodicityAndOffset->present)
4978 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_NOTHING:
4980 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2:
4981 schReqRsrc->periodicityAndOffset->choice.sym2 = schReqDb->schedAddModList[schReqIdx].offset;
4983 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7:
4984 schReqRsrc->periodicityAndOffset->choice.sym6or7 = schReqDb->schedAddModList[schReqIdx].offset;
4986 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
4987 schReqRsrc->periodicityAndOffset->choice.sl1 = schReqDb->schedAddModList[schReqIdx].offset;
4989 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
4990 schReqRsrc->periodicityAndOffset->choice.sl2 = schReqDb->schedAddModList[schReqIdx].offset;
4992 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
4993 schReqRsrc->periodicityAndOffset->choice.sl4 = schReqDb->schedAddModList[schReqIdx].offset;
4995 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
4996 schReqRsrc->periodicityAndOffset->choice.sl5 = schReqDb->schedAddModList[schReqIdx].offset;
4998 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
4999 schReqRsrc->periodicityAndOffset->choice.sl8 = schReqDb->schedAddModList[schReqIdx].offset;
5001 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
5002 schReqRsrc->periodicityAndOffset->choice.sl10 = schReqDb->schedAddModList[schReqIdx].offset;
5004 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
5005 schReqRsrc->periodicityAndOffset->choice.sl16 = schReqDb->schedAddModList[schReqIdx].offset;
5007 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
5008 schReqRsrc->periodicityAndOffset->choice.sl20 = schReqDb->schedAddModList[schReqIdx].offset;
5010 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
5011 schReqRsrc->periodicityAndOffset->choice.sl40 = schReqDb->schedAddModList[schReqIdx].offset;
5013 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
5014 schReqRsrc->periodicityAndOffset->choice.sl80 = schReqDb->schedAddModList[schReqIdx].offset;
5016 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
5017 schReqRsrc->periodicityAndOffset->choice.sl160 = schReqDb->schedAddModList[schReqIdx].offset;
5019 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
5020 schReqRsrc->periodicityAndOffset->choice.sl320 = schReqDb->schedAddModList[schReqIdx].offset;
5022 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
5023 schReqRsrc->periodicityAndOffset->choice.sl640 = schReqDb->schedAddModList[schReqIdx].offset;
5028 if(schReqDb->schedAddModList[schReqIdx].resrc)
5030 schReqRsrc->resource = NULLP;
5031 DU_ALLOC(schReqRsrc->resource, sizeof(PUCCH_ResourceId_t));
5032 if(schReqRsrc->resource == NULLP)
5034 DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchSchReqAddModList");
5037 *(schReqRsrc->resource) = schReqDb->schedAddModList[schReqIdx].resrc;
5044 /*******************************************************************
5046 * @brief Builds PUCCH multi csi resource list
5050 * Function : BuildPucchMultiCsiRsrcList
5053 * Builds PUCCH multi csi resource list
5055 * @params[in] : PucchMultiCsiCfg *multiCsiDb
5056 * struct PUCCH_Config__multi_CSI_PUCCH_ResourceList *multiCsiRsrcList
5058 * @return ROK - success
5061 * ****************************************************************/
5062 uint8_t BuildPucchMultiCsiRsrcList(PucchMultiCsiCfg *multiCsiDb, struct PUCCH_Config__multi_CSI_PUCCH_ResourceList *multiCsiRsrcList)
5064 uint8_t elementCnt = 0, rsrcIdx = 0;
5066 elementCnt = multiCsiDb->multiCsiResrcListCount;
5067 multiCsiRsrcList->list.count = elementCnt;
5068 multiCsiRsrcList->list.size = elementCnt * sizeof(PUCCH_ResourceId_t *);
5069 multiCsiRsrcList->list.array = NULLP;
5070 DU_ALLOC(multiCsiRsrcList->list.array, multiCsiRsrcList->list.size);
5071 if(multiCsiRsrcList->list.array == NULLP)
5073 DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchMultiCsiRsrcList");
5077 for(rsrcIdx = 0; rsrcIdx<multiCsiRsrcList->list.count; rsrcIdx++)
5079 DU_ALLOC(multiCsiRsrcList->list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
5080 if(multiCsiRsrcList->list.array[rsrcIdx] == NULLP)
5082 DU_LOG("\nERROR --> DU APP: Memory allocation failed in BuildPucchMultiCsiRsrcList");
5087 for(rsrcIdx = 0; rsrcIdx<multiCsiRsrcList->list.count; rsrcIdx++)
5089 *(multiCsiRsrcList->list.array[rsrcIdx]) = multiCsiDb->multiCsiResrcList[rsrcIdx];
5094 /*******************************************************************
5096 * @brief Builds DL data -to- Ul Ack list
5100 * Function : BuildDlDataToUlAckList
5102 * Functionality: Builds DL data -to- Ul Ack list
5104 * @params[in] : PucchDlDataToUlAck *dlDataToUlAckDb
5105 * struct PUCCH_Config__dl_DataToUL_ACK * dlDataToUlACKList
5107 * @return ROK - success
5110 * ****************************************************************/
5111 uint8_t BuildDlDataToUlAckList(PucchDlDataToUlAck *dlDataToUlAckDb, struct PUCCH_Config__dl_DataToUL_ACK * dlDataToUlACKList)
5113 uint8_t elementCnt = 0, arrIdx = 0;
5115 if(dlDataToUlAckDb == NULLP)
5118 elementCnt = dlDataToUlAckDb->dlDataToUlAckListCount;
5120 dlDataToUlACKList->list.count = elementCnt;
5121 dlDataToUlACKList->list.size = elementCnt * sizeof(long *);
5122 DU_ALLOC(dlDataToUlACKList->list.array, dlDataToUlACKList->list.size);
5123 if(dlDataToUlACKList->list.array == NULLP)
5125 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDlDataToUlAckList");
5129 for(arrIdx = 0; arrIdx < dlDataToUlACKList->list.count; arrIdx++)
5131 DU_ALLOC(dlDataToUlACKList->list.array[arrIdx], sizeof(long));
5132 if(dlDataToUlACKList->list.array[arrIdx] == NULLP)
5134 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDlDataToUlAckList");
5139 if(dlDataToUlAckDb == NULLP)
5142 *(dlDataToUlACKList->list.array[arrIdx++]) = 1;
5143 *(dlDataToUlACKList->list.array[arrIdx]) = 2;
5147 for(arrIdx = 0; arrIdx < dlDataToUlACKList->list.count; arrIdx++)
5149 *(dlDataToUlACKList->list.array[arrIdx]) = dlDataToUlAckDb->dlDataToUlAckList[arrIdx];
5155 /*******************************************************************
5157 * @brief Builds BWP UL dedicated PUCCH Config
5161 * Function : BuildBWPUlDedPucchCfg
5164 * Builds BWP UL dedicated PUCCH Config
5166 * @params[in] : PUCCH_Config_t *pucchCfg
5168 * @return ROK - success
5171 * ****************************************************************/
5172 uint8_t BuildBWPUlDedPucchCfg(PucchCfg *pucchCfgDb, PUCCH_Config_t *pucchCfg)
5174 PucchResrcSetCfg *rsrcSetCfgDb = NULLP;
5175 PucchResrcCfg *rsrcCfgDb = NULLP;
5176 PucchFormatCfg *format1Db = NULLP;
5177 PucchFormatCfg *format2Db = NULLP;
5178 PucchFormatCfg *format3Db = NULLP;
5179 PucchFormatCfg *format4Db = NULLP;
5180 PucchSchedReqCfg *schReqDb = NULLP;
5181 PucchMultiCsiCfg *multiCsiDb = NULLP;
5182 PucchDlDataToUlAck *dlDataToUlAckDb = NULLP;
5186 rsrcSetCfgDb = pucchCfgDb->resrcSet;
5187 rsrcCfgDb = pucchCfgDb->resrc;
5188 format1Db = pucchCfgDb->format1;
5189 format2Db = pucchCfgDb->format2;
5190 format3Db = pucchCfgDb->format3;
5191 format4Db = pucchCfgDb->format4;
5192 schReqDb = pucchCfgDb->schedReq;
5193 multiCsiDb = pucchCfgDb->multiCsiCfg;
5194 dlDataToUlAckDb = pucchCfgDb->dlDataToUlAck;
5198 DU_ALLOC(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
5199 if(pucchCfg->resourceSetToAddModList == NULL)
5201 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5205 if(BuildPucchRsrcSetAddModList(rsrcSetCfgDb, pucchCfg->resourceSetToAddModList) != ROK)
5207 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5211 /* PUCCH RESOURCE */
5212 DU_ALLOC(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
5213 if(pucchCfg->resourceToAddModList == NULLP)
5215 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5219 if(BuildPucchRsrcAddModList(rsrcCfgDb, pucchCfg->resourceToAddModList) != ROK)
5221 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5225 /* PUCCH Format 1 */
5226 DU_ALLOC(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
5227 if(pucchCfg->format1 == NULLP)
5229 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5233 pucchCfg->format1->present = PUCCH_Config__format1_PR_setup;
5234 DU_ALLOC(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
5235 if(pucchCfg->format1->choice.setup == NULLP)
5237 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5241 if(BuildPucchFormat(format1Db, pucchCfg->format1->choice.setup) != ROK)
5243 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5247 /* PUCCH Format 2 */
5250 DU_ALLOC(pucchCfg->format2, sizeof(struct PUCCH_Config__format2));
5251 if(pucchCfg->format2 == NULLP)
5253 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5257 pucchCfg->format2->present = PUCCH_Config__format2_PR_setup;
5258 DU_ALLOC(pucchCfg->format2->choice.setup, sizeof(PUCCH_FormatConfig_t));
5259 if(pucchCfg->format2->choice.setup == NULLP)
5261 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5265 if(BuildPucchFormat(format2Db, pucchCfg->format2->choice.setup) != ROK)
5267 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5272 /* PUCCH Format 3 */
5275 DU_ALLOC(pucchCfg->format3, sizeof(struct PUCCH_Config__format3));
5276 if(pucchCfg->format3 == NULLP)
5278 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5282 pucchCfg->format3->present = PUCCH_Config__format3_PR_setup;
5283 DU_ALLOC(pucchCfg->format3->choice.setup, sizeof(PUCCH_FormatConfig_t));
5284 if(pucchCfg->format3->choice.setup == NULLP)
5286 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5290 if(BuildPucchFormat(format3Db, pucchCfg->format3->choice.setup) != ROK)
5292 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5297 /* PUCCH Format 4 */
5300 DU_ALLOC(pucchCfg->format4, sizeof(struct PUCCH_Config__format4));
5301 if(pucchCfg->format4 == NULLP)
5303 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5307 pucchCfg->format4->present = PUCCH_Config__format4_PR_setup;
5308 DU_ALLOC(pucchCfg->format4->choice.setup, sizeof(PUCCH_FormatConfig_t));
5309 if(pucchCfg->format4->choice.setup == NULLP)
5311 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5315 if(BuildPucchFormat(format4Db, pucchCfg->format4->choice.setup) != ROK)
5317 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5322 /* Scheduling Request */
5323 if(schReqDb && (schReqDb->schedAddModListCount != 0))
5325 pucchCfg->schedulingRequestResourceToAddModList = NULLP;
5326 DU_ALLOC(pucchCfg->schedulingRequestResourceToAddModList, sizeof(struct PUCCH_Config__schedulingRequestResourceToAddModList));
5327 if(pucchCfg->schedulingRequestResourceToAddModList == NULLP)
5329 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5333 if(BuildPucchSchReqAddModList(schReqDb, pucchCfg->schedulingRequestResourceToAddModList) != ROK)
5335 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5341 if(multiCsiDb && (multiCsiDb->multiCsiResrcListCount != 0))
5343 pucchCfg->multi_CSI_PUCCH_ResourceList = NULLP;
5344 DU_ALLOC(pucchCfg->multi_CSI_PUCCH_ResourceList, sizeof(struct PUCCH_Config__multi_CSI_PUCCH_ResourceList));
5345 if(pucchCfg->multi_CSI_PUCCH_ResourceList == NULLP)
5347 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5351 if(BuildPucchMultiCsiRsrcList(multiCsiDb, pucchCfg->multi_CSI_PUCCH_ResourceList) != ROK)
5353 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5358 /* DL DATA TO UL ACK */
5359 DU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5360 if(pucchCfg->dl_DataToUL_ACK == NULLP)
5362 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5366 if(BuildDlDataToUlAckList(dlDataToUlAckDb, pucchCfg->dl_DataToUL_ACK) != ROK)
5368 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
5372 /* TODO : spatial relation info add/mod list and power control*/
5377 /*******************************************************************
5379 * @brief Fills SRS resource to add/modify list
5383 * Function : BuildSrsRsrcAddModList
5385 * Functionality: Fills SRS resource to add/modify list
5388 * @return ROK - success
5391 * ****************************************************************/
5392 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
5398 resourceList->list.count = elementCnt;
5399 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
5400 resourceList->list.array = NULLP;
5401 DU_ALLOC(resourceList->list.array, resourceList->list.size);
5402 if(!resourceList->list.array)
5404 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
5408 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5410 DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5411 if(!resourceList->list.array[rsrcIdx])
5413 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
5419 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
5420 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
5421 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
5423 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
5424 DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
5425 sizeof(struct SRS_Resource__transmissionComb__n2));
5426 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
5428 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
5431 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
5432 = SRS_COMB_OFFSET_N2;
5433 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
5434 = SRS_CYCLIC_SHIFT_N2;
5436 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
5438 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
5439 SRS_Resource__resourceMapping__nrofSymbols_n1;
5440 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
5441 SRS_Resource__resourceMapping__repetitionFactor_n1;
5443 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
5444 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
5445 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
5446 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
5447 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
5448 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
5449 SRS_Resource__groupOrSequenceHopping_neither;
5451 /* Setting resource type to aperiodic for intergration purposes */
5452 resourceList->list.array[rsrcIdx]->resourceType.present = \
5453 SRS_Resource__resourceType_PR_aperiodic;
5454 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
5455 DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
5456 sizeof(struct SRS_Resource__resourceType__aperiodic));
5457 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
5459 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
5462 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
5467 /*******************************************************************
5469 * @brief Build SRS resource set Add/mod list
5473 * Function : BuildSrsRsrcSetAddModList
5475 * Functionality: Build SRS resource set Add/mod list
5478 * @return ROK - success
5481 * ****************************************************************/
5482 uint8_t BuildSrsRsrcSetAddModList
5484 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
5490 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
5493 rsrcSetList->list.count = elementCnt;
5494 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
5495 rsrcSetList->list.array = NULLP;
5496 DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
5497 if(!rsrcSetList->list.array)
5499 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
5503 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5505 DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5506 if(!rsrcSetList->list.array[rSetIdx])
5508 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
5514 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
5516 /* Fill Resource Id list in resource set */
5517 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
5518 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5519 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5520 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5522 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
5527 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5528 rsrcIdList->list.count = elementCnt;
5529 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
5530 rsrcIdList->list.array = NULLP;
5531 DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
5532 if(!rsrcIdList->list.array)
5534 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
5538 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5540 DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5541 if(!rsrcIdList->list.array[rsrcIdx])
5543 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
5549 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
5551 /* Fill resource type */
5552 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
5553 SRS_ResourceSet__resourceType_PR_aperiodic;
5555 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
5556 DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5557 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5558 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
5560 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
5563 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
5564 = APERIODIC_SRS_RESRC_TRIGGER;
5566 /* TODO : Fill values for below IEs as expected by Viavi */
5567 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
5568 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
5571 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
5572 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
5573 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
5574 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
5575 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
5580 /*******************************************************************
5582 * @brief Builds BWP UL dedicated SRS Config
5586 * Function : BuildBWPUlDedSrsCfg
5588 * Functionality: Builds BWP UL dedicated SRS Config
5590 * @params[in] SRS Config
5591 * @return ROK - success
5594 * ****************************************************************/
5595 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
5597 srsCfg->srs_ResourceSetToReleaseList = NULLP;
5598 srsCfg->srs_ResourceSetToAddModList = NULLP;
5599 DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
5600 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5601 if(!srsCfg->srs_ResourceSetToAddModList)
5603 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
5606 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
5611 srsCfg->srs_ResourceToReleaseList = NULLP;
5613 /* Resource to Add/Modify list */
5614 srsCfg->srs_ResourceToAddModList = NULLP;
5615 DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
5616 sizeof(struct SRS_Config__srs_ResourceToAddModList));
5617 if(!srsCfg->srs_ResourceToAddModList)
5619 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
5623 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
5628 srsCfg->tpc_Accumulation = NULLP;
5635 /*******************************************************************
5637 * @brief Builds Pusch Serving cell Config
5641 * Function : BuildPuschSrvCellCfg
5643 * Functionality: Builds Pusch Serving cell Config
5645 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
5647 * @return ROK - success
5650 * ****************************************************************/
5651 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
5653 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
5654 puschCfg->choice.setup = NULLP;
5655 DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5656 if(!puschCfg->choice.setup)
5658 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5662 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5663 puschCfg->choice.setup->rateMatching = NULLP;
5664 puschCfg->choice.setup->xOverhead = NULLP;
5665 puschCfg->choice.setup->ext1 = NULLP;
5666 DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
5667 if(!puschCfg->choice.setup->ext1)
5669 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5673 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
5674 DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
5675 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
5677 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5680 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
5682 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
5683 DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
5684 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
5686 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
5689 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
5693 /*******************************************************************
5695 * @brief Builds inital UL BWP
5699 * Function : BuildInitialUlBWP
5701 * Functionality: Builds initial UL BWP
5703 * @params[in] BWP_UplinkDedicated_t *ulBwp
5704 * @return ROK - success
5707 * ****************************************************************/
5708 uint8_t BuildInitialUlBWP(InitialUlBwp *initUlBwp, BWP_UplinkDedicated_t *ulBwp)
5710 PucchCfg *pucchCfg = NULLP;
5711 PuschCfg *puschCfg = NULLP;
5715 if(initUlBwp->pucchPresent)
5716 pucchCfg = &initUlBwp->pucchCfg;
5717 if(initUlBwp->puschPresent)
5718 puschCfg = &initUlBwp->puschCfg;
5721 ulBwp->pucch_Config = NULLP;
5722 DU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5723 if(!ulBwp->pucch_Config)
5725 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
5729 ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
5730 ulBwp->pucch_Config->choice.setup = NULLP;
5731 DU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
5732 if(!ulBwp->pucch_Config->choice.setup)
5734 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
5738 if(BuildBWPUlDedPucchCfg(pucchCfg, ulBwp->pucch_Config->choice.setup) != ROK)
5743 /* Fill BWP UL dedicated PUSCH config */
5744 ulBwp->pusch_Config = NULLP;
5745 DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5746 if(!ulBwp->pusch_Config)
5748 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
5752 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
5753 ulBwp->pusch_Config->choice.setup = NULLP;
5754 DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5755 if(!ulBwp->pusch_Config->choice.setup)
5757 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
5761 if(BuildBWPUlDedPuschCfg(puschCfg, ulBwp->pusch_Config->choice.setup) != ROK)
5766 ulBwp->configuredGrantConfig = NULLP;
5768 /* Fill BPW UL dedicated SRS config */
5769 ulBwp->srs_Config = NULLP;
5770 DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5771 if(!ulBwp->srs_Config)
5773 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
5777 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
5778 ulBwp->srs_Config->choice.setup = NULLP;
5779 DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5780 if(!ulBwp->srs_Config->choice.setup)
5782 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
5786 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
5791 ulBwp->beamFailureRecoveryConfig = NULLP;
5796 /*******************************************************************
5798 * @brief Builds UL config
5801 * Function : BuildUlCfg
5803 * Functionality: Builds UL config in spCellCfgDed
5805 * @params[in] UplinkConfig_t *ulCfg
5807 * @return ROK - success
5810 * ****************************************************************/
5811 uint8_t BuildUlCfg(ServCellCfgInfo *servCellCfg, UplinkConfig_t *ulCfg)
5813 InitialUlBwp *initUlBwp = NULLP;
5817 initUlBwp = &servCellCfg->initUlBwp;
5820 ulCfg->initialUplinkBWP = NULLP;
5821 DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5822 if(!ulCfg->initialUplinkBWP)
5824 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5828 if(BuildInitialUlBWP(initUlBwp, ulCfg->initialUplinkBWP) != ROK)
5833 ulCfg->uplinkBWP_ToReleaseList = NULLP;
5834 ulCfg->uplinkBWP_ToAddModList = NULLP;
5835 ulCfg->firstActiveUplinkBWP_Id = NULLP;
5836 DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5837 if(!ulCfg->firstActiveUplinkBWP_Id)
5839 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5842 if(servCellCfg == NULLP)
5843 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
5845 *(ulCfg->firstActiveUplinkBWP_Id) = servCellCfg->firstActvUlBwpId;
5847 ulCfg->pusch_ServingCellConfig = NULLP;
5848 DU_ALLOC(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5849 if(!ulCfg->pusch_ServingCellConfig)
5851 DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
5855 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
5860 ulCfg->carrierSwitching = NULLP;
5861 ulCfg->ext1 = NULLP;
5865 /*******************************************************************
5867 * @brief Builds PDSCH serving cell config
5870 * Function : BuildPdschSrvCellCfg
5872 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
5874 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
5876 * @return ROK - success
5879 * ****************************************************************/
5880 uint8_t BuildPdschSrvCellCfg(PdschServCellCfg *pdschServCellDb, struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
5882 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
5883 pdschCfg->choice.setup = NULLP;
5884 DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5885 if(!pdschCfg->choice.setup)
5887 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5891 /* Code Block Group Transmission */
5892 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
5893 if(pdschServCellDb && (pdschServCellDb->maxCodeBlkGrpPerTb || pdschServCellDb->codeBlkGrpFlushInd))
5895 DU_ALLOC(pdschCfg->choice.setup->codeBlockGroupTransmission, sizeof(struct PDSCH_ServingCellConfig__codeBlockGroupTransmission));
5896 if(pdschCfg->choice.setup->codeBlockGroupTransmission == NULLP)
5898 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5902 pdschCfg->choice.setup->codeBlockGroupTransmission->present = PDSCH_ServingCellConfig__codeBlockGroupTransmission_PR_setup;
5903 pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup = NULLP;
5904 DU_ALLOC(pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup, sizeof(struct PDSCH_CodeBlockGroupTransmission ));
5905 if(pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup == NULLP)
5907 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5911 pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock = \
5912 *(pdschServCellDb->maxCodeBlkGrpPerTb);
5913 pdschCfg->choice.setup->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator = \
5914 *(pdschServCellDb->codeBlkGrpFlushInd);
5918 pdschCfg->choice.setup->xOverhead = NULLP;
5919 if(pdschServCellDb && pdschServCellDb->xOverhead)
5921 DU_ALLOC(pdschCfg->choice.setup->xOverhead, sizeof(long));
5922 if(pdschCfg->choice.setup->xOverhead == NULLP)
5924 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5927 *(pdschCfg->choice.setup->xOverhead) = *(pdschServCellDb->xOverhead);
5930 /* Number of HARQ processes */
5931 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
5932 DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
5933 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
5935 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5939 if(pdschServCellDb == NULLP)
5940 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH) = PDSCH_NUM_HARQ_PROC;
5942 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH) = pdschServCellDb->numHarqProcForPdsch;
5944 pdschCfg->choice.setup->pucch_Cell = NULLP;
5947 pdschCfg->choice.setup->ext1 = NULLP;
5948 if(pdschServCellDb && pdschServCellDb->maxMimoLayers)
5950 DU_ALLOC(pdschCfg->choice.setup->ext1, sizeof(struct PDSCH_ServingCellConfig__ext1));
5951 if(pdschCfg->choice.setup->ext1 == NULLP)
5953 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5957 DU_ALLOC(pdschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
5958 if(pdschCfg->choice.setup->ext1->maxMIMO_Layers == NULLP)
5960 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
5963 *(pdschCfg->choice.setup->ext1->maxMIMO_Layers) = *(pdschServCellDb->maxMimoLayers);
5969 /*******************************************************************
5971 * @brief Builds CSI Meas config
5974 * Function : BuildCsiMeasCfg
5976 * Functionality: Builds CSI Meas config in spCellCfgDed
5978 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
5980 * @return ROK - success
5983 * ****************************************************************/
5984 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
5990 /*******************************************************************
5992 * @brief Builds DL BWP to add/modify list
5995 * Function : BuildDlBwpToAddModList
5997 * Functionality: Builds DL BWP to add/modify list
5999 * @params[in] ServCellCfgInfo *servCellCfg,
6000 * struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList
6002 * @return ROK - success
6005 * ****************************************************************/
6006 uint8_t BuildDlBwpToAddModList(ServCellCfgInfo *servCellCfg, struct ServingCellConfig__downlinkBWP_ToAddModList *dlBwpAddModList)
6008 uint8_t elementCnt, idx;
6010 elementCnt = servCellCfg->numDlBwpToAdd;
6011 dlBwpAddModList->list.count = elementCnt;
6012 dlBwpAddModList->list.size = elementCnt * sizeof(struct BWP_Downlink *);
6013 dlBwpAddModList->list.array = NULLP;
6014 DU_ALLOC(dlBwpAddModList->list.array, dlBwpAddModList->list.size);
6015 if(dlBwpAddModList->list.array == NULLP)
6017 DU_LOG("\nERROR --> DU APP: Memory allocation failure in BuildDlBwpToAddModList");
6021 for(idx=0; idx<dlBwpAddModList->list.count; idx++)
6023 DU_ALLOC(dlBwpAddModList->list.array[idx], sizeof(BWP_Downlink_t));
6024 if(dlBwpAddModList->list.array[idx] == NULLP)
6026 DU_LOG("\nERROR --> DU APP: Memory allocation failure in BuildDlBwpToAddModList");
6031 for(idx=0; idx<dlBwpAddModList->list.count; idx++)
6033 dlBwpAddModList->list.array[idx]->bwp_Id = servCellCfg->DlBwpToAddList[idx].bwpId;
6034 dlBwpAddModList->list.array[idx]->bwp_Common = NULLP;
6035 dlBwpAddModList->list.array[idx]->bwp_Dedicated = NULLP;
6040 /*******************************************************************
6042 * @brief Builds Spcell config dedicated
6045 * Function : BuildSpCellCfgDed
6047 * Functionality: Builds sp cell config dedicated in spCellCfg
6049 * @params[in] ServingCellConfig_t srvCellCfg
6051 * @return ROK - success
6054 * ****************************************************************/
6055 uint8_t BuildSpCellCfgDed(DuUeCb *ueCb, ServingCellConfig_t *srvCellCfg)
6057 ServCellCfgInfo *servCellCfg = NULLP;
6058 InitialDlBwp *initDlBwp = NULLP;
6059 PdschServCellCfg *pdschServCellDb = NULLP;
6063 servCellCfg = &ueCb->macUeCfg.spCellCfg.servCellCfg;
6064 initDlBwp = &servCellCfg->initDlBwp;
6065 pdschServCellDb = &servCellCfg->pdschServCellCfg;
6068 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
6069 DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
6070 if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
6072 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6076 srvCellCfg->initialDownlinkBWP = NULLP;
6077 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
6078 if(!srvCellCfg->initialDownlinkBWP)
6080 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6084 if(BuildInitialDlBWP(initDlBwp, srvCellCfg->initialDownlinkBWP) != ROK)
6086 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
6090 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
6092 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
6093 if(ueCb && ueCb->macUeCfg.spCellCfg.servCellCfg.numDlBwpToAdd)
6095 DU_ALLOC(srvCellCfg->downlinkBWP_ToAddModList, sizeof(struct ServingCellConfig__downlinkBWP_ToAddModList));
6096 if(srvCellCfg->downlinkBWP_ToAddModList == NULLP)
6098 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6102 if(BuildDlBwpToAddModList(&ueCb->macUeCfg.spCellCfg.servCellCfg, srvCellCfg->downlinkBWP_ToAddModList) != ROK)
6104 DU_LOG("\nERROR --> F1AP : BuildInitialDlBWP failed");
6109 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
6110 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
6111 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
6113 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6117 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
6119 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.firstActvDlBwpId;
6121 srvCellCfg->bwp_InactivityTimer = NULLP;
6123 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
6124 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
6125 if(!srvCellCfg->defaultDownlinkBWP_Id)
6127 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6131 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
6133 *(srvCellCfg->defaultDownlinkBWP_Id) = ueCb->macUeCfg.spCellCfg.servCellCfg.defaultDlBwpId;
6135 srvCellCfg->uplinkConfig = NULLP;
6136 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
6137 if(!srvCellCfg->uplinkConfig)
6139 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6143 if(BuildUlCfg(servCellCfg, srvCellCfg->uplinkConfig) != ROK)
6145 DU_LOG("\nERROR --> F1AP : BuildUlCfg failed");
6148 srvCellCfg->supplementaryUplink = NULLP;
6149 srvCellCfg->pdcch_ServingCellConfig = NULLP;
6151 srvCellCfg->pdsch_ServingCellConfig = NULLP;
6152 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
6153 if(!srvCellCfg->pdsch_ServingCellConfig)
6155 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6159 if(BuildPdschSrvCellCfg(pdschServCellDb, srvCellCfg->pdsch_ServingCellConfig) != ROK)
6161 DU_LOG("\nERROR --> F1AP : BuildPdschSrvCellCfg failed");
6165 srvCellCfg->csi_MeasConfig = NULLP;
6167 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
6168 if(!srvCellCfg->csi_MeasConfig)
6170 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
6174 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
6176 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
6180 srvCellCfg->sCellDeactivationTimer = NULLP;
6181 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
6182 srvCellCfg->tag_Id = TAG_ID;
6183 srvCellCfg->dummy = NULLP;
6184 srvCellCfg->pathlossReferenceLinking = NULLP;
6185 srvCellCfg->servingCellMO = NULLP;
6186 srvCellCfg->ext1 = NULLP;
6190 /*******************************************************************
6192 * @brief Builds Spcell config
6196 * Function : BuildSpCellCfg
6198 * Functionality: Builds sp cell config in DuToCuRrcContainer
6200 * @params[in] SpCellConfig_t spCellCfg
6202 * @return ROK - success
6205 * ****************************************************************/
6206 uint8_t BuildSpCellCfg(DuUeCb *ueCb, SpCellConfig_t *spCellCfg)
6208 spCellCfg->servCellIndex = NULLP;
6209 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
6210 if(!spCellCfg->servCellIndex)
6212 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
6217 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
6219 *(spCellCfg->servCellIndex) = ueCb->macUeCfg.spCellCfg.servCellIdx;
6221 spCellCfg->reconfigurationWithSync = NULLP;
6222 spCellCfg->rlf_TimersAndConstants = NULLP;
6223 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
6225 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
6226 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
6228 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
6231 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
6233 spCellCfg->spCellConfigDedicated = NULLP;
6234 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
6235 if(!spCellCfg->spCellConfigDedicated)
6237 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
6240 if(BuildSpCellCfgDed(ueCb, spCellCfg->spCellConfigDedicated) != ROK)
6242 DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
6249 /*******************************************************************
6251 * @brief Builds Phy cell group config
6255 * Function : BuildPhyCellGrpCfg
6257 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
6259 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
6261 * @return ROK - success
6264 * ****************************************************************/
6265 uint8_t BuildPhyCellGrpCfg(DuUeCb *ueCb, PhysicalCellGroupConfig_t *phyCellGrpCfg)
6267 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
6268 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
6270 phyCellGrpCfg->p_NR_FR1 = NULLP;
6271 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
6272 if(!phyCellGrpCfg->p_NR_FR1)
6274 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
6280 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
6281 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
6285 *(phyCellGrpCfg->p_NR_FR1) = ueCb->macUeCfg.phyCellGrpCfg.pNrFr1;
6286 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->macUeCfg.phyCellGrpCfg.pdschHarqAckCodebook;
6289 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
6290 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
6291 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
6292 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
6293 phyCellGrpCfg->cs_RNTI = NULLP;
6294 phyCellGrpCfg->ext1 = NULLP;
6295 phyCellGrpCfg->ext2 = NULLP;
6300 /*******************************************************************
6302 * @brief Builds Mac cell group config
6306 * Function : BuildMacCellGrpCfg
6308 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
6310 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
6312 * @return ROK - success
6315 * ****************************************************************/
6316 uint8_t BuildMacCellGrpCfg(DuUeCb *ueCb, MAC_CellGroupConfig_t *macCellGrpCfg)
6318 macCellGrpCfg->drx_Config = NULLP;
6319 macCellGrpCfg->schedulingRequestConfig = NULLP;
6320 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
6321 if(!macCellGrpCfg->schedulingRequestConfig)
6323 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
6327 if(BuildSchedulingReqConfig(ueCb, macCellGrpCfg->schedulingRequestConfig) != ROK)
6329 DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
6333 macCellGrpCfg->bsr_Config = NULLP;
6334 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
6335 if(!macCellGrpCfg->bsr_Config)
6337 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
6341 if(BuildBsrConfig(ueCb, macCellGrpCfg->bsr_Config) != ROK)
6343 DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
6347 macCellGrpCfg->tag_Config = NULLP;
6348 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
6349 if(!macCellGrpCfg->tag_Config)
6351 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
6355 if(BuildTagConfig(ueCb, macCellGrpCfg->tag_Config) != ROK)
6357 DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
6361 macCellGrpCfg->phr_Config = NULLP;
6362 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
6363 if(!macCellGrpCfg->phr_Config)
6365 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
6369 if(BuildPhrConfig(ueCb, macCellGrpCfg->phr_Config) != ROK)
6371 DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
6375 macCellGrpCfg->skipUplinkTxDynamic = false;
6376 macCellGrpCfg->ext1 = NULLP;
6380 /*******************************************************************
6382 * @brief Frees memeory allocated for SearchSpcToAddModList
6386 * Function : FreeSearchSpcToAddModList
6388 * Functionality: Deallocating memory of SearchSpcToAddModList
6390 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
6394 4221 * ****************************************************************/
6395 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
6399 struct SearchSpace *searchSpc=NULLP;
6401 if(searchSpcList->list.array)
6403 if(searchSpcList->list.array[idx2])
6405 searchSpc = searchSpcList->list.array[idx2];
6406 if(searchSpc->controlResourceSetId)
6408 if(searchSpc->monitoringSlotPeriodicityAndOffset)
6410 if(searchSpc->monitoringSymbolsWithinSlot)
6412 if(searchSpc->monitoringSymbolsWithinSlot->buf)
6414 if(searchSpc->nrofCandidates)
6416 if(searchSpc->searchSpaceType)
6418 DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
6419 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
6420 DU_FREE(searchSpc->searchSpaceType, sizeof(struct
6421 SearchSpace__searchSpaceType));
6423 DU_FREE(searchSpc->nrofCandidates,
6424 sizeof(struct SearchSpace__nrofCandidates));
6426 DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
6427 searchSpc->monitoringSymbolsWithinSlot->size);
6429 DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
6430 sizeof(BIT_STRING_t));
6432 DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
6433 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
6435 DU_FREE(searchSpc->controlResourceSetId,
6436 sizeof(ControlResourceSetId_t));
6439 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
6441 DU_FREE(searchSpcList->list.array[idx1],
6442 sizeof(struct SearchSpace));
6444 DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
6447 /*******************************************************************
6449 * @brief Frees memory allocated for PdschTimeDomAllocList
6453 * Function : FreePdschTimeDomAllocList
6455 * Functionality: Deallocating memory of PdschTimeDomAllocList
6457 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
6461 * ****************************************************************/
6462 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
6466 if(timeDomAllocList->choice.setup)
6468 if(timeDomAllocList->choice.setup->list.array)
6470 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
6472 DU_FREE(timeDomAllocList->choice.setup->list.array[idx1]->k0, sizeof(long));
6473 DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
6474 sizeof(struct PDSCH_TimeDomainResourceAllocation));
6476 DU_FREE(timeDomAllocList->choice.setup->list.array, \
6477 timeDomAllocList->choice.setup->list.size);
6479 DU_FREE(timeDomAllocList->choice.setup,\
6480 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
6483 /*******************************************************************
6485 * @brief Frees memory allocated for PuschTimeDomAllocList
6489 * Function : FreePuschTimeDomAllocList
6491 * Functionality: Deallocating memory of PuschTimeDomAllocList
6493 * @params[in] PUSCH_Config_t *puschCfg
6497 * ****************************************************************/
6498 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
6500 uint8_t rsrcListIdx=0;
6501 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
6503 if(puschCfg->pusch_TimeDomainAllocationList)
6505 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
6506 if(timeDomAllocList_t->choice.setup)
6508 if(timeDomAllocList_t->choice.setup->list.array)
6510 for(rsrcListIdx = 0; rsrcListIdx<timeDomAllocList_t->choice.setup->list.count; rsrcListIdx++)
6512 DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx]->k2, sizeof(long));
6513 DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx],\
6514 sizeof(PUSCH_TimeDomainResourceAllocation_t));
6516 DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
6517 timeDomAllocList_t->choice.setup->list.size);
6519 DU_FREE(timeDomAllocList_t->choice.setup, \
6520 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
6522 DU_FREE(puschCfg->transformPrecoder, sizeof(long));
6523 DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
6524 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
6529 /*******************************************************************
6531 * @brief Frees memory allocated for Dedicated PUCCH config
6535 * Function : FreeBWPUlDedPucchCfg
6537 * Functionality: Deallocating memory of Dedicated PUCCH cfg
6539 * @params[in] BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg
6543 * ****************************************************************/
6544 void FreeBWPUlDedPucchCfg(struct BWP_UplinkDedicated__pucch_Config *ulBwpPucchCfg)
6546 uint8_t k1Idx, rsrcIdx, rsrcSetIdx;
6547 PUCCH_Config_t *pucchCfg = NULLP;
6548 PUCCH_ResourceSet_t *rsrcSet = NULLP;
6549 PUCCH_Resource_t *rsrc = NULLP;
6553 if(ulBwpPucchCfg->choice.setup)
6555 pucchCfg = ulBwpPucchCfg->choice.setup;
6557 //Free resource set list
6558 if(pucchCfg->resourceSetToAddModList)
6560 if(pucchCfg->resourceSetToAddModList->list.array)
6562 for(rsrcSetIdx=0; rsrcSetIdx < pucchCfg->resourceSetToAddModList->list.count; rsrcSetIdx++)
6564 rsrcSet = pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx];
6565 if(rsrcSet->resourceList.list.array)
6567 for(rsrcIdx=0; rsrcIdx < rsrcSet->resourceList.list.count; rsrcIdx++)
6569 DU_FREE(rsrcSet->resourceList.list.array[rsrcIdx], sizeof(PUCCH_ResourceId_t));
6571 DU_FREE(rsrcSet->resourceList.list.array, rsrcSet->resourceList.list.size);
6573 DU_FREE(pucchCfg->resourceSetToAddModList->list.array[rsrcSetIdx], sizeof(PUCCH_ResourceSet_t));
6575 DU_FREE(pucchCfg->resourceSetToAddModList->list.array, pucchCfg->resourceSetToAddModList->list.size);
6577 DU_FREE(pucchCfg->resourceSetToAddModList, sizeof(struct PUCCH_Config__resourceSetToAddModList));
6580 //Free resource list
6581 if(pucchCfg->resourceToAddModList)
6583 if(pucchCfg->resourceToAddModList->list.array)
6585 for(rsrcIdx=0; rsrcIdx < pucchCfg->resourceToAddModList->list.count; rsrcIdx++)
6587 rsrc = pucchCfg->resourceToAddModList->list.array[rsrcIdx];
6588 DU_FREE(rsrc->format.choice.format1, sizeof(PUCCH_format1_t));
6589 DU_FREE(pucchCfg->resourceToAddModList->list.array[rsrcIdx], sizeof(PUCCH_Resource_t));
6591 DU_FREE(pucchCfg->resourceToAddModList->list.array, pucchCfg->resourceToAddModList->list.size);
6593 DU_FREE(pucchCfg->resourceToAddModList, sizeof(struct PUCCH_Config__resourceToAddModList));
6597 if(pucchCfg->format1)
6599 if(pucchCfg->format1->choice.setup)
6601 DU_FREE(pucchCfg->format1->choice.setup->nrofSlots, sizeof(long));
6602 DU_FREE(pucchCfg->format1->choice.setup, sizeof(PUCCH_FormatConfig_t));
6604 DU_FREE(pucchCfg->format1, sizeof(struct PUCCH_Config__format1));
6608 if(pucchCfg->dl_DataToUL_ACK)
6610 if(pucchCfg->dl_DataToUL_ACK->list.array)
6612 for(k1Idx = 0; k1Idx < pucchCfg->dl_DataToUL_ACK->list.count; k1Idx++)
6614 DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[k1Idx], sizeof(long));
6616 DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
6618 DU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
6621 DU_FREE(ulBwpPucchCfg->choice.setup, sizeof(PUCCH_Config_t));
6623 DU_FREE(ulBwpPucchCfg, sizeof(struct BWP_UplinkDedicated__pucch_Config));
6627 /*******************************************************************
6629 * @brief Frees memory allocated for InitialUlBWP
6633 * Function : FreeInitialUlBWP
6635 * Functionality: Deallocating memory of InitialUlBWP
6637 * @params[in] BWP_UplinkDedicated_t *ulBwp
6641 * ****************************************************************/
6642 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
6644 uint8_t rSetIdx, rsrcIdx;
6645 SRS_Config_t *srsCfg = NULLP;
6646 PUSCH_Config_t *puschCfg = NULLP;
6647 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
6648 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
6649 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
6650 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
6652 FreeBWPUlDedPucchCfg(ulBwp->pucch_Config);
6654 if(ulBwp->pusch_Config)
6656 if(ulBwp->pusch_Config->choice.setup)
6658 puschCfg=ulBwp->pusch_Config->choice.setup;
6659 if(puschCfg->dataScramblingIdentityPUSCH)
6661 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
6663 FreePuschTimeDomAllocList(puschCfg);
6664 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
6665 if(dmrsUlCfg->choice.setup)
6667 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
6669 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
6671 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
6673 DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
6674 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
6676 DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
6679 DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
6681 DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
6682 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
6684 DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
6686 DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
6688 DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
6690 /* Free SRS-Config */
6691 if(ulBwp->srs_Config)
6693 if(ulBwp->srs_Config->choice.setup)
6695 srsCfg = ulBwp->srs_Config->choice.setup;
6697 /* Free Resource Set to add/mod list */
6698 if(srsCfg->srs_ResourceSetToAddModList)
6700 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
6701 if(rsrcSetList->list.array)
6705 /* Free SRS resource Id list in this SRS resource set */
6706 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
6708 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
6710 if(rsrcIdList->list.array)
6712 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
6714 DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
6716 DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
6718 DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
6719 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
6722 /* Free resource type info for this SRS resource set */
6723 DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
6724 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
6726 /* Free memory for each resource set */
6727 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
6729 DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
6731 DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
6733 DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
6734 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
6737 /* Free resource to add/modd list */
6738 if(srsCfg->srs_ResourceToAddModList)
6740 resourceList = srsCfg->srs_ResourceToAddModList;
6741 if(resourceList->list.array)
6744 DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
6745 sizeof(struct SRS_Resource__transmissionComb__n2));
6746 DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
6747 sizeof(struct SRS_Resource__resourceType__aperiodic));
6749 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
6751 DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
6753 DU_FREE(resourceList->list.array, resourceList->list.size);
6755 DU_FREE(srsCfg->srs_ResourceToAddModList, \
6756 sizeof(struct SRS_Config__srs_ResourceToAddModList));
6759 DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
6761 DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
6765 /*******************************************************************
6767 * @brief Frees memory allocated for initialUplinkBWP
6771 * Function : FreeinitialUplinkBWP
6773 * Functionality: Deallocating memory of initialUplinkBWP
6775 * @params[in] UplinkConfig_t *ulCfg
6780 * ****************************************************************/
6781 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
6783 BWP_UplinkDedicated_t *ulBwp=NULLP;
6784 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6786 if(ulCfg->initialUplinkBWP)
6788 ulBwp=ulCfg->initialUplinkBWP;
6789 if(ulCfg->firstActiveUplinkBWP_Id)
6791 if(ulCfg->pusch_ServingCellConfig)
6793 puschCfg=ulCfg->pusch_ServingCellConfig;
6794 if(puschCfg->choice.setup)
6796 if(puschCfg->choice.setup->ext1)
6798 DU_FREE(puschCfg->choice.setup->ext1->\
6799 processingType2Enabled,sizeof(BOOLEAN_t));
6800 DU_FREE(puschCfg->choice.setup->ext1->\
6801 maxMIMO_Layers,sizeof(long));
6802 DU_FREE(puschCfg->choice.setup->ext1, \
6803 sizeof(struct PUSCH_ServingCellConfig__ext1));
6805 DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
6807 DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
6809 DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
6811 FreeInitialUlBWP(ulBwp);
6812 DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
6815 /*******************************************************************
6817 * @brief Frees emmory allocated for BWPDlDedPdschCfg
6821 * Function : FreeBWPDlDedPdschCfg
6823 * Functionality: Deallocating memory of BWPDlDedPdschCfg
6825 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6830 * ****************************************************************/
6831 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
6833 struct PDSCH_Config *pdschCfg=NULLP;
6834 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6835 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6836 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6838 if(dlBwp->pdsch_Config->choice.setup)
6840 pdschCfg=dlBwp->pdsch_Config->choice.setup;
6841 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6843 if(pdschCfg->pdsch_TimeDomainAllocationList)
6845 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6846 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6848 prbBndlType=&pdschCfg->prb_BundlingType;
6849 DU_FREE(prbBndlType->choice.staticBundling,\
6850 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
6851 DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
6853 FreePdschTimeDomAllocList(timeDomAllocList);
6854 DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
6855 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
6857 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6858 if(dmrsDlCfg->choice.setup)
6860 DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
6862 DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
6864 DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
6865 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
6867 DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
6870 /*******************************************************************
6872 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
6876 * Function : FreeBWPDlDedPdcchCfg
6878 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
6880 * @params[in] BWP_DownlinkDedicated_t *dlBwp
6885 * ****************************************************************/
6886 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
6890 struct PDCCH_Config *pdcchCfg=NULLP;
6891 struct ControlResourceSet *controlRSet=NULLP;
6892 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6894 if(dlBwp->pdcch_Config->choice.setup)
6896 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6897 if(pdcchCfg->controlResourceSetToAddModList)
6899 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6900 if(controlRSetList->list.array)
6902 controlRSet = controlRSetList->list.array[idx2];
6905 if(controlRSet->frequencyDomainResources.buf)
6907 if(controlRSet->pdcch_DMRS_ScramblingID)
6909 if(pdcchCfg->searchSpacesToAddModList)
6911 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6912 DU_FREE(pdcchCfg->searchSpacesToAddModList, \
6913 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
6915 DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
6917 DU_FREE(controlRSet->frequencyDomainResources.buf, \
6918 controlRSet->frequencyDomainResources.size);
6921 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
6923 DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
6925 DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
6927 DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
6928 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
6930 DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
6934 /*******************************************************************
6936 * @brief Frees emmory allocated for DUToCURRCContainer
6940 * Function : FreeMemDuToCuRrcCont
6942 * Functionality: Deallocating memory of DuToCuRrcContainer
6944 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
6946 * @return ROK - success
6949 * ****************************************************************/
6950 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
6953 SpCellConfig_t *spCellCfg=NULLP;
6954 ServingCellConfig_t *srvCellCfg=NULLP;
6955 BWP_DownlinkDedicated_t *dlBwp=NULLP;
6956 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
6957 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
6958 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
6959 struct RLC_Config *rlcConfig=NULLP;
6960 struct LogicalChannelConfig *macLcConfig=NULLP;
6961 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
6962 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
6963 struct TAG_Config *tagConfig=NULLP;
6964 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
6965 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
6966 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
6968 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6971 if(rlcBearerList->list.array)
6973 for(idx=0; idx<rlcBearerList->list.count; idx++)
6975 if(rlcBearerList->list.array[idx])
6977 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
6978 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
6981 if(rlcConfig->choice.am)
6983 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6984 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
6985 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
6987 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
6989 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
6992 if(macLcConfig->ul_SpecificParameters)
6994 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
6995 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
6996 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
6998 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
7000 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
7003 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
7005 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
7008 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
7011 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
7012 if(schedulingRequestConfig)
7014 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
7017 if(schReqList->list.array)
7019 for(idx=0;idx<schReqList->list.count; idx++)
7021 if(schReqList->list.array[idx])
7023 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
7024 DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
7027 DU_FREE(schReqList->list.array, schReqList->list.size);
7029 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
7030 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
7031 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
7033 if(macCellGrpCfg->bsr_Config)
7035 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
7037 tagConfig = macCellGrpCfg->tag_Config;
7040 tagList = tagConfig->tag_ToAddModList;
7043 if(tagList->list.array)
7045 for(idx=0; idx<tagList->list.count; idx++)
7047 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
7049 DU_FREE(tagList->list.array, tagList->list.size);
7051 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
7053 DU_FREE(tagConfig, sizeof(struct TAG_Config));
7056 phrConfig = macCellGrpCfg->phr_Config;
7059 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
7060 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
7063 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
7066 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
7069 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
7070 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
7073 spCellCfg = cellGrpCfg->spCellConfig;
7076 if(spCellCfg->servCellIndex)
7078 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
7080 if(spCellCfg->spCellConfigDedicated)
7082 srvCellCfg = spCellCfg->spCellConfigDedicated;
7083 if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
7085 if(srvCellCfg->initialDownlinkBWP)
7087 dlBwp = srvCellCfg->initialDownlinkBWP;
7088 if(srvCellCfg->firstActiveDownlinkBWP_Id)
7090 if(srvCellCfg->defaultDownlinkBWP_Id)
7092 if(srvCellCfg->uplinkConfig)
7094 if(srvCellCfg->pdsch_ServingCellConfig)
7096 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
7097 if(pdschCfg->choice.setup)
7099 DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
7100 DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
7102 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
7103 ServingCellConfig__pdsch_ServingCellConfig));
7105 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
7106 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
7108 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
7110 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
7112 if(dlBwp->pdcch_Config)
7114 if(dlBwp->pdsch_Config)
7116 FreeBWPDlDedPdschCfg(dlBwp);
7117 DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
7119 FreeBWPDlDedPdcchCfg(dlBwp);
7120 DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
7122 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
7124 DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
7126 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
7128 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
7130 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
7132 DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
7137 /*******************************************************************
7139 * @brief Builds CellGroupConfigRrc for DU To CU RRC Container
7143 * Function : BuildCellGroupConfigRrc
7145 * Functionality: Builds and copied Cell group config buffer into
7146 * DuToCuRrcContainer
7148 * @params[in] idx, index in F1AP msg
7149 * DuToCuRRCContainer, DuToCuRRCContainer
7151 * @return ROK - success
7154 * ****************************************************************/
7155 uint8_t BuildCellGroupConfigRrc(DuUeCb *ueCb, OCTET_STRING_t *duToCuRrcContainer)
7158 CellGroupConfigRrc_t cellGrpCfg;
7159 asn_enc_rval_t encRetVal;
7160 memset(&cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
7161 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
7165 cellGrpCfg.cellGroupId = CELL_GRP_ID;
7167 cellGrpCfg.rlc_BearerToAddModList = NULLP;
7168 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
7169 if(!cellGrpCfg.rlc_BearerToAddModList)
7171 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
7175 if(BuildRlcBearerToAddModList(ueCb, cellGrpCfg.rlc_BearerToAddModList) != ROK)
7177 DU_LOG("\nERROR --> F1AP : BuildRlcBearerToAddModList failed");
7182 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
7183 cellGrpCfg.mac_CellGroupConfig = NULLP;
7184 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
7185 if(!cellGrpCfg.mac_CellGroupConfig)
7187 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
7191 if(BuildMacCellGrpCfg(ueCb, cellGrpCfg.mac_CellGroupConfig) != ROK)
7193 DU_LOG("\nERROR --> F1AP : BuildMacCellGrpCfg failed");
7198 cellGrpCfg.physicalCellGroupConfig = NULLP;
7199 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
7200 if(!cellGrpCfg.physicalCellGroupConfig)
7202 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
7206 if(BuildPhyCellGrpCfg(ueCb, cellGrpCfg.physicalCellGroupConfig) != ROK)
7208 DU_LOG("\nERROR --> F1AP : BuildPhyCellGrpCfg failed");
7213 cellGrpCfg.spCellConfig = NULLP;
7214 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
7215 if(!cellGrpCfg.spCellConfig)
7217 DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
7221 if(BuildSpCellCfg(ueCb, cellGrpCfg.spCellConfig) != ROK)
7223 DU_LOG("\nERROR --> F1AP : BuildSpCellCfg failed");
7228 cellGrpCfg.sCellToAddModList = NULLP;
7229 cellGrpCfg.sCellToReleaseList = NULLP;
7230 cellGrpCfg.ext1 = NULLP;
7232 /* encode cellGrpCfg into duToCuRrcContainer */
7233 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
7234 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7236 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
7237 /* Encode results */
7238 if(encRetVal.encoded == ENCODE_FAIL)
7240 DU_LOG( "\nERROR --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
7241 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
7247 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
7248 for(int i=0; i< encBufSize; i++)
7250 printf("%x",encBuf[i]);
7254 duToCuRrcContainer->size = encBufSize;
7255 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
7256 if(!duToCuRrcContainer->buf)
7258 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
7264 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
7268 FreeMemDuToCuRrcCont(&cellGrpCfg);
7272 /*******************************************************************
7274 * @brief Free memory allocated in InitialULRRCMessage
7278 * Function : freeInitUlRrcMsgTransfer
7280 * Functionality: Free memory allocated in InitialULRRCMessage
7282 * @params[in]F1AP_PDU_t *f1apMsg)
7284 * @return ROK - success
7287 * ****************************************************************/
7289 uint8_t freeInitUlRrcMsgTransfer(F1AP_PDU_t *f1apMsg)
7291 uint8_t ieIdx, arrIdx;
7292 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
7296 if(f1apMsg->choice.initiatingMessage)
7298 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.\
7299 choice.InitialULRRCMessageTransfer;
7300 if(initULRRCMsg->protocolIEs.list.array)
7302 for(ieIdx = 0; ieIdx < initULRRCMsg->protocolIEs.list.count; ieIdx++)
7304 switch(initULRRCMsg->protocolIEs.list.array[ieIdx]->id)
7306 case ProtocolIE_ID_id_NRCGI:
7308 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf)
7310 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf)
7312 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf,\
7313 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.size);
7315 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf,\
7316 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.size);
7320 case ProtocolIE_ID_id_RRCContainer:
7322 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
7324 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
7325 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
7329 case ProtocolIE_ID_id_DUtoCURRCContainer:
7331 if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf)
7333 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf,
7334 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.size);
7342 for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
7344 if(initULRRCMsg->protocolIEs.list.array[arrIdx])
7346 DU_FREE(initULRRCMsg->protocolIEs.list.array[arrIdx],\
7347 sizeof(InitialULRRCMessageTransferIEs_t));
7350 DU_FREE(initULRRCMsg->protocolIEs.list.array, initULRRCMsg->protocolIEs.list.size);
7352 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
7354 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
7358 DU_LOG("\nERROR --> DU_APP : Recevied F1ap Pdu is null at freeInitUlRrcMsgTransfer()");
7364 /*******************************************************************
7366 * @brief Builds and sends the InitialULRRCMessage
7370 * Function : BuildAndSendInitialRrcMsgTransfer
7372 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
7373 * it to the CU through SCTP.
7377 * @return ROK - success
7380 * ****************************************************************/
7381 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
7382 uint16_t rrcContSize, uint8_t *rrcContainer)
7386 uint8_t ieIdx, cellIdx, ueIdx;
7387 DuUeCb *duUeCb = NULLP;
7388 asn_enc_rval_t encRetVal;
7389 F1AP_PDU_t *f1apMsg = NULLP;
7390 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
7391 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
7395 DU_LOG("\n INFO --> F1AP : Building RRC Setup Request\n");
7396 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
7397 if(f1apMsg == NULLP)
7399 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7402 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
7403 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
7404 if(f1apMsg->choice.initiatingMessage == NULLP)
7406 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
7409 f1apMsg->choice.initiatingMessage->procedureCode =\
7410 ProcedureCode_id_InitialULRRCMessageTransfer;
7411 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
7412 f1apMsg->choice.initiatingMessage->value.present = \
7413 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
7415 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
7417 initULRRCMsg->protocolIEs.list.count = elementCnt;
7418 initULRRCMsg->protocolIEs.list.size = \
7419 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
7420 /* Initialize the F1Setup members */
7421 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
7422 if(initULRRCMsg->protocolIEs.list.array == NULLP)
7424 DU_LOG(" ERROR --> F1AP : Memory allocation for\
7425 RRCSetupRequestMessageTransferIEs failed");
7428 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
7430 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx],\
7431 sizeof(InitialULRRCMessageTransferIEs_t));
7432 if(initULRRCMsg->protocolIEs.list.array[ieIdx] == NULLP)
7438 /*GNB DU UE F1AP ID*/
7439 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
7440 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
7441 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7442 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
7443 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
7444 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
7449 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
7450 ProtocolIE_ID_id_NRCGI;
7451 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
7452 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
7453 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
7456 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
7464 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
7465 ProtocolIE_ID_id_C_RNTI;
7466 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7467 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
7468 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
7469 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.C_RNTI = crnti;
7473 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = \
7474 ProtocolIE_ID_id_RRCContainer;
7475 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7476 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
7477 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
7479 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = rrcContSize;
7480 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
7481 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size)
7482 if(!initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
7484 DU_LOG(" ERROR --> F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
7488 memcpy(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, rrcContainer,
7489 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
7492 /*DUtoCURRCContainer*/
7494 initULRRCMsg->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCContainer;
7495 initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
7496 initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
7497 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
7499 for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
7501 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
7503 if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
7504 (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti == crnti))
7506 duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
7511 ret = BuildCellGroupConfigRrc(duUeCb, &initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer);
7517 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
7519 /* Encode the Intial UL RRC Message transfer as APER */
7520 memset(encBuf, 0, ENC_BUF_MAX_LEN);
7522 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
7523 /* Encode results */
7524 if(encRetVal.encoded == ENCODE_FAIL)
7526 DU_LOG( "\nERROR --> F1AP : Could not encode Initial UL RRC Message Transfer\
7527 structure (at %s)\n",encRetVal.failed_type ? \
7528 encRetVal.failed_type->name : "unknown");
7535 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for Initial UL RRC\
7536 Message transfer\n");
7537 for(int i=0; i< encBufSize; i++)
7539 printf("%x",encBuf[i]);
7543 if(sendF1APMsg() != ROK)
7545 DU_LOG("\nERROR --> F1AP : Sending Initial UL RRC Message Transfer Failed");
7551 freeInitUlRrcMsgTransfer(f1apMsg);
7553 }/* End of BuildAndSendInitialRrcMsgTransfer*/
7555 /***** UE SETUP REQUEST *****/
7557 /*******************************************************************
7559 * @brief Free Qos And Snssai Drb Info
7563 * Function : freeDrbQosAndSnssaiInfo
7565 * Functionality: Free Qos And Snssai Drb Info
7567 * @params[in] LcCfg *lcCfg,
7570 * ****************************************************************/
7571 void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
7575 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
7579 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
7583 /******************************************************************
7585 * @brief Function to delete the RLC Lc cfg from UE APP DB
7589 * Function : freeRlcLcCfg
7591 * Functionality: Function to delete the RLC Lc cfg from UE APP DB
7594 *****************************************************************/
7596 void freeRlcLcCfg(RlcBearerCfg *lcCfg)
7598 switch(lcCfg->rlcMode)
7604 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
7608 case RLC_UM_BI_DIRECTIONAL :
7610 if(lcCfg->u.umBiDirCfg)
7612 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
7616 case RLC_UM_UNI_DIRECTIONAL_UL :
7618 if(lcCfg->u.umUniDirUlCfg)
7620 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
7625 case RLC_UM_UNI_DIRECTIONAL_DL :
7627 if(lcCfg->u.umUniDirDlCfg)
7629 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
7634 DU_LOG("\nERROR --> DU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode);
7637 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
7640 /*******************************************************************
7642 * @brief Function to free MacLcCfg
7646 * Function : freeMacLcCfg
7648 * Functionality: Function to free MacLcCfg
7650 * @params[in] LcCfg *lcCfg,
7653 * ****************************************************************/
7655 void freeMacLcCfg(LcCfg *lcCfg)
7657 /* Deleting DRBQOS */
7660 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
7662 /* Deleting SNSSAI */
7665 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
7668 /*******************************************************************
7670 * @brief Free UE NR Capability received in UE Context setup request
7674 * Function : freeAperDecodeUeNrCapability
7677 * Free UE NR Capability received in UE Context setup request
7680 * @return ROK - success
7683 * ****************************************************************/
7684 void freeAperDecodeUeNrCapability(void *ueNrCapability)
7687 FeatureSets_t *featureSets =NULLP;
7688 UE_NR_Capability_t *ueNrCap = (UE_NR_Capability_t *)ueNrCapability;
7690 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
7692 for(arrIdx = 0; arrIdx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; arrIdx++)
7694 if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx])
7695 free(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx]);
7697 free(ueNrCap->rf_Parameters.supportedBandListNR.list.array);
7700 if(ueNrCap->featureSets)
7702 featureSets = ueNrCap->featureSets;
7703 if(featureSets->featureSetsDownlinkPerCC)
7705 if(featureSets->featureSetsDownlinkPerCC->list.array)
7707 for(arrIdx = 0; arrIdx < featureSets->featureSetsDownlinkPerCC->list.count; arrIdx++)
7709 if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx])
7711 if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL)
7712 free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL);
7713 free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]);
7716 free(featureSets->featureSetsDownlinkPerCC->list.array);
7718 free(featureSets->featureSetsDownlinkPerCC);
7720 if(featureSets->featureSetsUplinkPerCC)
7722 if(featureSets->featureSetsUplinkPerCC->list.array)
7724 for(arrIdx = 0; arrIdx < featureSets->featureSetsUplinkPerCC->list.count; arrIdx++)
7726 if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx])
7728 if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL)
7729 free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL);
7730 free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]);
7733 free(featureSets->featureSetsUplinkPerCC->list.array);
7735 free(featureSets->featureSetsUplinkPerCC);
7737 free(ueNrCap->featureSets);
7741 /*******************************************************************
7743 * @brief Function to free PdcchSearchSpcToAddModList
7744 where memory allocated by aper_decoder
7748 * Function : freeAperDecodePdcchSearchSpcToAddModList
7750 * Functionality: Function to free PdcchSearchSpcToAddModList
7752 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
7755 * ****************************************************************/
7757 void freeAperDecodePdcchSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
7759 uint8_t searchSpcArrIdx=0;
7760 uint8_t searchSpcArrIdx1=0;
7761 struct SearchSpace *searchSpc=NULLP;
7764 if(searchSpcList->list.array)
7766 if(searchSpcList->list.array[searchSpcArrIdx1])
7768 searchSpc = searchSpcList->list.array[searchSpcArrIdx1];
7769 if(searchSpc->controlResourceSetId)
7771 if(searchSpc->monitoringSlotPeriodicityAndOffset)
7773 if(searchSpc->monitoringSymbolsWithinSlot)
7775 if(searchSpc->monitoringSymbolsWithinSlot->buf)
7777 if(searchSpc->nrofCandidates)
7779 if(searchSpc->searchSpaceType)
7781 free(searchSpc->searchSpaceType->choice.ue_Specific);
7782 free(searchSpc->searchSpaceType);
7784 free(searchSpc->nrofCandidates);
7786 free(searchSpc->monitoringSymbolsWithinSlot->buf);
7788 free(searchSpc->monitoringSymbolsWithinSlot);
7790 free(searchSpc->monitoringSlotPeriodicityAndOffset);
7792 free(searchSpc->controlResourceSetId);
7795 for(searchSpcArrIdx = 0; searchSpcArrIdx < searchSpcList->list.count; searchSpcArrIdx++)
7797 free(searchSpcList->list.array[searchSpcArrIdx]);
7799 free(searchSpcList->list.array);
7802 /*******************************************************************
7804 * @brief Function for free part for the memory allocated by aper_decoder
7808 * Function : freeAperDecodeBWPDlDedPdcchConfig
7810 * Functionality: Function to free BWPDlDedPdcchConfig
7815 * ****************************************************************/
7818 void freeAperDecodeBWPDlDedPdcchConfig(BWP_DownlinkDedicated_t *dlBwp)
7822 struct PDCCH_Config *pdcchCfg=NULLP;
7823 struct ControlResourceSet *controlRSet=NULLP;
7824 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
7826 if(dlBwp->pdcch_Config->choice.setup)
7828 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
7829 if(pdcchCfg->controlResourceSetToAddModList)
7831 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
7832 if(controlRSetList->list.array)
7834 controlRSet = controlRSetList->list.array[arrIdx2];
7837 if(controlRSet->frequencyDomainResources.buf)
7839 if(controlRSet->pdcch_DMRS_ScramblingID)
7841 if(pdcchCfg->searchSpacesToAddModList)
7843 freeAperDecodePdcchSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
7844 free(pdcchCfg->searchSpacesToAddModList);
7846 free(controlRSet->pdcch_DMRS_ScramblingID);
7848 free(controlRSet->frequencyDomainResources.buf);
7851 for(arrIdx1 = 0; arrIdx1 <controlRSetList->list.count; arrIdx1++)
7853 free(controlRSetList->list.array[arrIdx1]);
7855 free(controlRSetList->list.array);
7857 free(pdcchCfg->controlResourceSetToAddModList);
7859 free(dlBwp->pdcch_Config->choice.setup);
7862 /*******************************************************************
7864 * @brief Function to free PdschTimeDomAllocationList
7865 * where the memory allocated by aper_decoder
7869 * Function : freeAperDecodePdschTimeDomAllocationList
7871 * Functionality: Function to free PdschTimeDomAllocationList
7873 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
7876 * ****************************************************************/
7879 void freeAperDecodePdschTimeDomAllocationList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
7883 if(timeDomAllocList->choice.setup)
7885 if(timeDomAllocList->choice.setup->list.array)
7887 for(arrIdx = 0; arrIdx <timeDomAllocList->choice.setup->list.count ; arrIdx++)
7889 free(timeDomAllocList->choice.setup->list.array[arrIdx]);
7891 free(timeDomAllocList->choice.setup->list.array);
7893 free(timeDomAllocList->choice.setup);
7897 /*******************************************************************
7899 * @brief Function to free BWPDlDedPdschConfig
7900 * where the memory allocated by aper_decoder
7904 * Function : freeAperDecodeBWPDlDedPdschConfig
7906 * Functionality: Function to free BWPDlDedPdschConfig
7908 * @params[in] BWP_DownlinkDedicated_t *dlBwp
7911 * ****************************************************************/
7914 void freeAperDecodeBWPDlDedPdschConfig(BWP_DownlinkDedicated_t *dlBwp)
7916 struct PDSCH_Config *pdschCfg=NULLP;
7917 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
7918 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
7919 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
7921 if(dlBwp->pdsch_Config->choice.setup)
7923 pdschCfg=dlBwp->pdsch_Config->choice.setup;
7924 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
7926 if(pdschCfg->pdsch_TimeDomainAllocationList)
7928 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
7929 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
7931 prbBndlType=&pdschCfg->prb_BundlingType;
7932 free(prbBndlType->choice.staticBundling);
7933 free(pdschCfg->maxNrofCodeWordsScheduledByDCI);
7935 freeAperDecodePdschTimeDomAllocationList(timeDomAllocList);
7936 free(pdschCfg->pdsch_TimeDomainAllocationList);
7938 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
7939 if(dmrsDlCfg->choice.setup)
7941 free(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition);
7942 free(dmrsDlCfg->choice.setup);
7944 free(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA);
7946 free(dlBwp->pdsch_Config->choice.setup);
7949 /*******************************************************************
7951 * @brief Function to free PuschTimeDomAllocListCfg
7952 where the memory allocated by aper_decoder
7956 * Function : freeAperDecodePuschTimeDomAllocListCfg
7958 * Functionality: Function to free PuschTimeDomAllocListCfg
7960 * @params[in] PUSCH_Config_t *puschCfg
7963 * ****************************************************************/
7966 void freeAperDecodePuschTimeDomAllocListCfg(PUSCH_Config_t *puschCfg)
7970 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
7972 if(puschCfg->pusch_TimeDomainAllocationList)
7974 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
7975 if(timeDomAllocList_t->choice.setup)
7977 if(timeDomAllocList_t->choice.setup->list.array)
7979 free(timeDomAllocList_t->choice.setup->list.array[arrIdx1]->k2);
7980 for(arrIdx = 0; arrIdx<timeDomAllocList_t->choice.setup->list.count; arrIdx++)
7982 free(timeDomAllocList_t->choice.setup->list.array[arrIdx]);
7984 free(timeDomAllocList_t->choice.setup->list.array);
7986 free(timeDomAllocList_t->choice.setup);
7988 free(puschCfg->transformPrecoder);
7989 free(puschCfg->pusch_TimeDomainAllocationList);
7992 /*******************************************************************
7994 * @brief Function to free InitialUlBWPConfig where memory allocated by aper_decoder
7998 * Function : freeAperDecodeInitialUlBWPConfig
8000 * Functionality: Function to free InitialUlBWPConfig
8002 * @params[in] BWP_UplinkDedicated_t *ulBwp
8005 * ****************************************************************/
8008 void freeAperDecodeInitialUlBWPConfig(BWP_UplinkDedicated_t *ulBwp)
8012 SRS_Config_t *srsCfg = NULLP;
8013 PUSCH_Config_t *puschCfg = NULLP;
8014 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
8015 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
8016 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
8017 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
8019 if(ulBwp->pusch_Config)
8021 if(ulBwp->pusch_Config->choice.setup)
8023 puschCfg=ulBwp->pusch_Config->choice.setup;
8024 if(puschCfg->dataScramblingIdentityPUSCH)
8026 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
8028 freeAperDecodePuschTimeDomAllocListCfg(puschCfg);
8029 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
8030 if(dmrsUlCfg->choice.setup)
8032 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
8034 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
8036 free(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0);
8037 free(dmrsUlCfg->choice.setup->transformPrecodingDisabled);
8039 free(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition);
8041 free(dmrsUlCfg->choice.setup);
8043 free(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA);
8045 free(puschCfg->dataScramblingIdentityPUSCH);
8047 free(ulBwp->pusch_Config->choice.setup);
8049 free(ulBwp->pusch_Config);
8051 /* Free SRS-Config */
8052 if(ulBwp->srs_Config)
8054 if(ulBwp->srs_Config->choice.setup)
8056 srsCfg = ulBwp->srs_Config->choice.setup;
8058 /* Free Resource Set to add/mod list */
8059 if(srsCfg->srs_ResourceSetToAddModList)
8061 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
8062 if(rsrcSetList->list.array)
8066 /* Free SRS resource Id list in this SRS resource set */
8067 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
8070 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
8072 if(rsrcIdList->list.array)
8074 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count;
8077 free(rsrcIdList->list.array[rsrcIdx]);
8079 free(rsrcIdList->list.array);
8081 free(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList);
8084 /* Free resource type info for this SRS resource set */
8086 free(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic);
8088 /* Free memory for each resource set */
8089 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
8091 free(rsrcSetList->list.array[rSetIdx]);
8093 free(rsrcSetList->list.array);
8095 free(srsCfg->srs_ResourceSetToAddModList);
8098 /* Free resource to add/modd list */
8099 if(srsCfg->srs_ResourceToAddModList)
8101 resourceList = srsCfg->srs_ResourceToAddModList;
8102 if(resourceList->list.array)
8106 free(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2);
8107 free(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic);
8109 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
8111 free(resourceList->list.array[rsrcIdx]);
8113 free(resourceList->list.array);
8115 free(srsCfg->srs_ResourceToAddModList);
8118 free(ulBwp->srs_Config->choice.setup);
8120 free(ulBwp->srs_Config);
8124 /*******************************************************************
8126 * @brief Function to free initialUplinkBWPConfig where memory allocated by aper_decoder
8130 * Function : freeAperDecodeinitialUplinkBWPConfig
8132 * Functionality: Function to free initialUplinkBWPConfig
8134 * @params[in] UplinkConfig_t *ulCfg
8137 * ****************************************************************/
8140 void freeAperDecodeinitialUplinkBWPConfig(UplinkConfig_t *ulCfg)
8142 BWP_UplinkDedicated_t *ulBwp=NULLP;
8143 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
8145 if(ulCfg->initialUplinkBWP)
8147 ulBwp=ulCfg->initialUplinkBWP;
8148 if(ulCfg->firstActiveUplinkBWP_Id)
8150 if(ulCfg->pusch_ServingCellConfig)
8152 puschCfg=ulCfg->pusch_ServingCellConfig;
8153 if(puschCfg->choice.setup)
8155 if(puschCfg->choice.setup->ext1)
8157 free(puschCfg->choice.setup->ext1->processingType2Enabled);
8158 free(puschCfg->choice.setup->ext1->maxMIMO_Layers);
8159 free(puschCfg->choice.setup->ext1);
8161 free(puschCfg->choice.setup);
8163 free(ulCfg->pusch_ServingCellConfig);
8165 free(ulCfg->firstActiveUplinkBWP_Id);
8167 freeAperDecodeInitialUlBWPConfig(ulBwp);
8168 free(ulCfg->initialUplinkBWP);
8172 /*******************************************************************
8174 * @brief Function to free DuUeCfg
8178 * Function : freeDuUeCfg
8180 * Functionality: Function to free DuUeCfg
8182 * @params[in] DuUeCfg *ueCfg
8185 * ****************************************************************/
8186 void freeDuUeCfg(DuUeCfg *ueCfg)
8190 SpCellConfig_t *spCellCfg = NULLP;
8191 ServingCellConfig_t *srvCellCfg = NULLP;
8192 BWP_DownlinkDedicated_t *dlBwp = NULLP;
8193 MAC_CellGroupConfig_t *macCellGrpCfg = NULLP;
8194 PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
8195 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList = NULLP;
8196 struct RLC_Config *rlcConfig = NULLP;
8197 struct LogicalChannelConfig *macLcConfig = NULLP;
8198 struct SchedulingRequestConfig *schedulingRequestConfig = NULLP;
8199 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList = NULLP;
8200 struct TAG_Config *tagConfig = NULLP;
8201 struct TAG_Config__tag_ToAddModList *tagList = NULLP;
8202 struct MAC_CellGroupConfig__phr_Config *phrConfig = NULLP;
8203 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg = NULLP;
8204 CellGroupConfigRrc_t *cellGrpCfg = ueCfg->cellGrpCfg;
8206 if(ueCfg->ueNrCapability)
8208 freeAperDecodeUeNrCapability(ueCfg->ueNrCapability);
8209 DU_FREE(ueCfg->ueNrCapability, sizeof(UE_NR_Capability_t));
8210 ueCfg->ueNrCapability = NULLP;
8213 if(ueCfg->cellGrpCfg)
8216 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
8219 if(rlcBearerList->list.array)
8221 for(arrIdx=0; arrIdx<rlcBearerList->list.count; arrIdx++)
8223 if(rlcBearerList->list.array[arrIdx])
8225 rlcConfig = rlcBearerList->list.array[arrIdx]->rlc_Config;
8226 macLcConfig = rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig;
8228 if(rlcBearerList->list.array[arrIdx]->servedRadioBearer)
8230 free(rlcBearerList->list.array[arrIdx]->servedRadioBearer);
8234 if(rlcConfig->choice.am)
8236 free(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength);
8237 free(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength);
8238 free(rlcConfig->choice.am);
8240 free(rlcBearerList->list.array[arrIdx]->rlc_Config);
8244 if(macLcConfig->ul_SpecificParameters)
8246 free(macLcConfig->ul_SpecificParameters->schedulingRequestID);
8247 free(macLcConfig->ul_SpecificParameters->logicalChannelGroup);
8248 free(macLcConfig->ul_SpecificParameters);
8250 free(rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig);
8252 free(rlcBearerList->list.array[arrIdx]);
8255 free(rlcBearerList->list.array);
8257 free(cellGrpCfg->rlc_BearerToAddModList);
8260 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
8263 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
8264 if(schedulingRequestConfig)
8266 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
8269 if(schReqList->list.array)
8271 for(arrIdx=0;arrIdx<schReqList->list.count; arrIdx++)
8273 if(schReqList->list.array[arrIdx])
8275 free(schReqList->list.array[arrIdx]->sr_ProhibitTimer);
8276 free(schReqList->list.array[arrIdx]);
8279 free(schReqList->list.array);
8281 free(schedulingRequestConfig->schedulingRequestToAddModList);
8283 free(macCellGrpCfg->schedulingRequestConfig);
8285 if(macCellGrpCfg->bsr_Config)
8287 free(macCellGrpCfg->bsr_Config);
8289 tagConfig = macCellGrpCfg->tag_Config;
8292 tagList = tagConfig->tag_ToAddModList;
8295 if(tagList->list.array)
8297 for(arrIdx=0; arrIdx<tagList->list.count; arrIdx++)
8299 free(tagList->list.array[arrIdx]);
8301 free(tagList->list.array);
8303 free(tagConfig->tag_ToAddModList);
8308 phrConfig = macCellGrpCfg->phr_Config;
8311 free(phrConfig->choice.setup);
8315 free(macCellGrpCfg);
8318 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
8321 free(phyCellGrpCfg->p_NR_FR1);
8322 free(phyCellGrpCfg);
8325 spCellCfg = cellGrpCfg->spCellConfig;
8328 if(spCellCfg->servCellIndex)
8330 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
8332 if(spCellCfg->spCellConfigDedicated)
8334 srvCellCfg = spCellCfg->spCellConfigDedicated;
8335 if(srvCellCfg->initialDownlinkBWP)
8337 dlBwp = srvCellCfg->initialDownlinkBWP;
8338 if(srvCellCfg->firstActiveDownlinkBWP_Id)
8340 if(srvCellCfg->defaultDownlinkBWP_Id)
8342 if(srvCellCfg->uplinkConfig)
8345 if(srvCellCfg->pdsch_ServingCellConfig)
8348 srvCellCfg->pdsch_ServingCellConfig;
8349 if(pdschCfg->choice.setup)
8352 free(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH);
8353 free(pdschCfg->choice.setup);
8356 free(srvCellCfg->pdsch_ServingCellConfig);
8359 freeAperDecodeinitialUplinkBWPConfig(srvCellCfg->uplinkConfig);
8360 free(srvCellCfg->uplinkConfig);
8362 free(srvCellCfg->defaultDownlinkBWP_Id);
8365 free(srvCellCfg->firstActiveDownlinkBWP_Id);
8367 if(dlBwp->pdcch_Config)
8369 if(dlBwp->pdsch_Config)
8371 freeAperDecodeBWPDlDedPdschConfig(dlBwp);
8372 free(dlBwp->pdsch_Config);
8374 freeAperDecodeBWPDlDedPdcchConfig(dlBwp);
8375 free(dlBwp->pdcch_Config);
8377 free(srvCellCfg->initialDownlinkBWP);
8380 free(spCellCfg->spCellConfigDedicated);
8382 free(spCellCfg->rlmInSyncOutOfSyncThreshold);
8384 free(spCellCfg->servCellIndex);
8388 DU_FREE(ueCfg->cellGrpCfg, sizeof(CellGroupConfigRrc_t));
8389 ueCfg->cellGrpCfg = NULLP;
8393 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->ambrCfg, sizeof(AmbrCfg));
8395 for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++)
8397 freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]);
8399 for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
8401 freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
8403 for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++)
8405 DU_FREE(ueCfg->upTnlInfo[lcIdx].tnlCfg1, sizeof(GtpTnlCfg));
8409 /*******************************************************************
8411 * @brief Function to free UecontextSetupDb
8415 * Function : freeF1UeDb
8417 * Functionality: Function to free UecontextSetupDb
8419 * @params[in] UecontextSetupDb *
8422 * ****************************************************************/
8424 void freeF1UeDb(F1UeContextSetupDb *f1UeDb)
8427 if(f1UeDb->dlRrcMsg)
8429 if(f1UeDb->dlRrcMsg->rrcMsgPdu)
8431 //DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,\
8432 f1UeDb->dlRrcMsg->rrcMsgPdu, f1UeDb->dlRrcMsg->rrcMsgSize);
8434 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
8436 freeDuUeCfg(&f1UeDb->duUeCfg);
8437 memset(f1UeDb, 0, sizeof(F1UeContextSetupDb));
8438 DU_FREE(f1UeDb, sizeof(F1UeContextSetupDb));
8441 /*******************************************************************
8443 * @brief Function to build Am cfg Info
8447 * Function : extractRlcAmCfg
8449 * Functionality: Function to build Am cfg Info
8451 * @params[in] AmBearerCfg *
8454 * @return ROK/RFAILED
8456 * ****************************************************************/
8458 void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg)
8463 if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
8465 amCfgToSet->ulAmCfg.snLenUl = covertAmSnLenFromRrcEnumToIntEnum(*(rlcAmCfg->dl_AM_RLC.sn_FieldLength));
8466 /*TODO: Check the timer value when sent by real CU */
8467 amCfgToSet->ulAmCfg.reAssemTmr = convertReasmblTmrEnumToValue(rlcAmCfg->dl_AM_RLC.t_Reassembly);
8468 amCfgToSet->ulAmCfg.statProhTmr = convertProhibitTmrEnumToValue(rlcAmCfg->dl_AM_RLC.t_StatusProhibit);
8472 if(rlcAmCfg->ul_AM_RLC.sn_FieldLength)
8474 amCfgToSet->dlAmCfg.snLenDl = covertAmSnLenFromRrcEnumToIntEnum(*(rlcAmCfg->ul_AM_RLC.sn_FieldLength));
8475 amCfgToSet->dlAmCfg.pollRetxTmr = covertPollRetxTmrEnumToValue(rlcAmCfg->ul_AM_RLC.t_PollRetransmit);
8476 amCfgToSet->dlAmCfg.pollPdu = covertPollPduEnumToValue(rlcAmCfg->ul_AM_RLC.pollPDU);
8477 amCfgToSet->dlAmCfg.pollByte = covertPollByteEnumToValue(rlcAmCfg->ul_AM_RLC.pollByte);
8478 amCfgToSet->dlAmCfg.maxRetxTh = covertMaxRetxEnumToValue(rlcAmCfg->ul_AM_RLC.maxRetxThreshold);
8483 /*******************************************************************
8485 * @brief Function to build Um Bi Info
8489 * Function : extractRlcUmBiCfg
8491 * Functionality: Function to build Um Bi Info
8493 * @params[in] UmBiDirBearerCfg *
8496 * @return ROK/RFAILED
8498 * ****************************************************************/
8500 void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_Directional *rlcBiCfg)
8504 /* UL UM BI DIR Cfg */
8505 if(rlcBiCfg->dl_UM_RLC.sn_FieldLength)
8507 umBiCfgToSet->ulUmCfg.snLenUlUm = covertUmSnLenFromRrcEnumToIntEnum(*(rlcBiCfg->dl_UM_RLC.sn_FieldLength));
8508 umBiCfgToSet->ulUmCfg.reAssemTmr = convertReasmblTmrEnumToValue(rlcBiCfg->dl_UM_RLC.t_Reassembly);
8511 /* DL UM BI DIR Cfg */
8512 if(rlcBiCfg->ul_UM_RLC.sn_FieldLength)
8513 umBiCfgToSet->dlUmCfg.snLenDlUm = covertUmSnLenFromRrcEnumToIntEnum(*(rlcBiCfg->ul_UM_RLC.sn_FieldLength));
8517 /*******************************************************************
8519 * @brief Function to build Um Ul Info
8523 * Function : extractRlcUmUlCfg
8525 * Functionality: Function to build Um Ul Info
8527 * @params[in] UmUniDirUlBearerCfg *
8530 * @return ROK/RFAILED
8532 * ****************************************************************/
8534 void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_Uni_Directional_DL *umUlCfg)
8538 if(umUlCfg->dl_UM_RLC.sn_FieldLength)
8540 umUlCfgToSet->ulUmCfg.snLenUlUm = covertUmSnLenFromRrcEnumToIntEnum(*(umUlCfg->dl_UM_RLC.sn_FieldLength));
8541 umUlCfgToSet->ulUmCfg.reAssemTmr = convertReasmblTmrEnumToValue(umUlCfg->dl_UM_RLC.t_Reassembly);
8546 /*******************************************************************
8548 * @brief Function to build Um Uni Dl Info
8552 * Function : extractRlcUmDlCfg
8554 * Functionality: Function to build Um Uni Dl Info
8556 * @params[in] UmUniDirDlBearerCfg *
8559 * @return ROK/RFAILED
8561 * ****************************************************************/
8562 void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_Uni_Directional_UL *umDlCfg)
8566 if(umDlCfg->ul_UM_RLC.sn_FieldLength)
8567 umDlCfgToSet->dlUmCfg.snLenDlUm = covertUmSnLenFromRrcEnumToIntEnum(*(umDlCfg->ul_UM_RLC.sn_FieldLength));
8571 /*******************************************************************
8573 * @brief Function to extractRlcModeCfg
8577 * Function : extractRlcModeCfg
8579 * Functionality: Function to extractRlcModeCfg
8581 * @params[in] RLC_Config_t *
8584 * @return ROK/RFAILED
8586 * ****************************************************************/
8587 void extractRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *rlcDbCfg, RLC_Config_t *lcCfg)
8595 if(lcCfg->choice.am)
8597 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
8598 if(rlcDbCfg->u.amCfg)
8599 extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
8603 case RLC_UM_BI_DIRECTIONAL :
8605 if(lcCfg->choice.um_Bi_Directional)
8607 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
8608 if(rlcDbCfg->u.umBiDirCfg)
8609 extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
8613 case RLC_UM_UNI_DIRECTIONAL_UL :
8615 if(lcCfg->choice.um_Uni_Directional_DL)
8617 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
8618 if(rlcDbCfg->u.umUniDirUlCfg)
8619 extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
8623 case RLC_UM_UNI_DIRECTIONAL_DL :
8625 if(lcCfg->choice.um_Uni_Directional_UL)
8627 DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
8628 if(rlcDbCfg->u.umUniDirDlCfg)
8629 extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
8634 DU_LOG("\nERROR --> DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
8640 /*******************************************************************
8642 * @brief Function to extract extractUlLcCfg
8646 * Function : extractUlLcCfg
8648 * Functionality: Function to extract extractUlLcCfg
8650 * @params[in] UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg
8653 * ****************************************************************/
8655 void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg)
8659 if(ulLcCfg->ul_SpecificParameters)
8661 f1UlLcCfg->priority = \
8662 ulLcCfg->ul_SpecificParameters->priority;
8663 if(ulLcCfg->ul_SpecificParameters->logicalChannelGroup)
8665 f1UlLcCfg->lcGroup = \
8666 *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup);
8668 if(ulLcCfg->ul_SpecificParameters->schedulingRequestID)
8670 f1UlLcCfg->schReqId = \
8671 *(ulLcCfg->ul_SpecificParameters->schedulingRequestID);
8674 ulLcCfg->ul_SpecificParameters->prioritisedBitRate;
8676 ulLcCfg->ul_SpecificParameters->bucketSizeDuration;
8681 /*******************************************************************
8683 * @brief Function to extract Snssai Cfg Info from CU
8687 * Function : extractDrbSnssaiCfg
8689 * Functionality: Function to extract Drb Snssai Cfg Info from CU
8691 * @params[in] DRB_Information_t *drbInfo, Snssai *snssai
8692 * @return ROK/RFAILED
8694 * ****************************************************************/
8696 uint8_t extractDrbSnssaiCfg(SNSSAI_t *RecvSnssai, Snssai **snssaiToBeShared)
8698 if(!(*snssaiToBeShared))
8700 DU_ALLOC_SHRABL_BUF((*snssaiToBeShared), sizeof(Snssai));
8701 if(snssaiToBeShared == NULLP)
8703 DU_LOG("\nERROR --> DUAPP : extractDrbSnssaiCfg(): Memory failed at allocating for SNSSAI ");
8709 memcpy(&(*snssaiToBeShared)->sst, RecvSnssai->sST.buf, RecvSnssai->sST.size);
8712 memcpy((*snssaiToBeShared)->sd, RecvSnssai->sD->buf, RecvSnssai->sD->size);
8716 DU_LOG("\nERROR --> DUAPP : extractDrbSnssaiCfg(): Received Null pointer of Snssai->SD");
8723 /*******************************************************************
8725 * @brief Function to procRlcLcCfg
8729 * Function : procRlcLcCfg
8731 * Functionality: Function to procRlcLcCfg
8733 * @params[in] rbId, lcId, rbType, rlcMod
8734 * RLC_Config_t *, RlcBearerCfg * ,
8737 * ****************************************************************/
8739 void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\
8740 uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg, QoSInformation_t *qoSInformation)
8742 DRB_Information_t *drbInfo;
8745 lcCfg->configType = configType;
8747 if(rbType == RB_TYPE_SRB)
8749 lcCfg->rbType = RB_TYPE_SRB;
8751 lcCfg->lcType = LCH_DCCH;
8752 lcCfg->rlcMode = RLC_AM;
8754 else if(rbType == RB_TYPE_DRB)
8756 lcCfg->rbType = RB_TYPE_DRB;
8758 lcCfg->lcType = LCH_DTCH;
8759 lcCfg->rlcMode = rlcMode;
8761 if(f1RlcCfg) /* rlc mode config recived */
8763 extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg);
8765 if(qoSInformation != NULLP)
8767 if(qoSInformation->present == QoSInformation_PR_choice_extension)
8769 if(qoSInformation->choice.choice_extension->value.present ==\
8770 QoSInformation_ExtIEs__value_PR_DRB_Information)
8772 drbInfo = &qoSInformation->choice.choice_extension->value.choice.DRB_Information;
8773 if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &lcCfg->snssai) != ROK)
8775 DU_LOG("\nERROR --> DUAPP: Unable to extract Snssai information at procRlcLcCfg()");
8783 /*******************************************************************
8785 * @brief Fills DrbQos Info received by CU
8789 * Function : extractQosInfo
8791 * Functionality: Fills DrbQos Info received by CU
8793 * @params[in] DrbQosInfo *qosToAdd,
8794 * QoSFlowLevelQoSParameters_t *qosFlowCfg
8797 * ****************************************************************/
8799 void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg)
8801 uint8_t qosCntIdx = 0;
8802 ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
8804 qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present;
8805 qosToAdd->u.nonDyn5Qi.fiveQi =\
8806 qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
8807 if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow)
8809 qosToAdd->u.nonDyn5Qi.avgWindow = \
8810 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
8813 if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume)
8815 qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \
8816 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
8819 if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel)
8821 qosToAdd->u.nonDyn5Qi.priorLevel = \
8822 *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel);
8824 qosToAdd->ngRanRetPri.priorityLevel = \
8825 qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel;
8826 qosToAdd->ngRanRetPri.preEmptionCap = \
8827 qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability;
8828 qosToAdd->ngRanRetPri.preEmptionVul = \
8829 qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability;
8830 if(qosFlowCfg->gBR_QoS_Flow_Information)
8832 memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \
8833 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \
8834 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size);
8835 memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \
8836 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \
8837 qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size);
8838 memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\
8839 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \
8840 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size);
8841 memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\
8842 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \
8843 qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size);
8845 /*Extracting PDU_SESSION_ID*/
8846 qosIeExt = (ProtocolExtensionContainer_4624P74_t *)qosFlowCfg->iE_Extensions;
8849 for(qosCntIdx = 0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
8851 if(qosIeExt->list.array[qosCntIdx]->extensionValue.present == \
8852 QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID)
8854 qosToAdd->pduSessionId = qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID;
8855 DU_LOG("\nDEBUG --> DU_F1AP : extractQosInfo: PDU SessionID:%d",qosToAdd->pduSessionId);
8859 qosToAdd->ulPduSessAggMaxBitRate = 0;
8862 /*******************************************************************
8864 * @brief Function to extract GTP Tunnel Info from CU
8868 * Function : extractUpTnlInfo
8870 * Functionality: Function to extract GTP Tunnel Info from CU
8872 * @params[in] F1AP message
8873 * @return ROK/RFAILED
8875 * ****************************************************************/
8877 uint8_t extractUpTnlInfo(uint8_t drbId, uint8_t configType,\
8878 ULUPTNLInformation_ToBeSetup_List_t *tnlInfo, UpTnlCfg *upTnlInfo)
8881 uint32_t ipv4_du = 0;
8882 GTPTunnel_t *gtpTunnel = NULLP;
8884 upTnlInfo->drbId = drbId;
8885 upTnlInfo->configType = configType;
8887 cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du);
8889 cmInetAddr((char *)DU_IP_V4_ADDR, &ipv4_du);
8892 for(tnlIdx=0; tnlIdx < tnlInfo->list.count; tnlIdx++)
8894 if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
8896 if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel)
8898 gtpTunnel = tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel;
8899 DU_ALLOC(upTnlInfo->tnlCfg1, sizeof(GtpTnlCfg));
8900 if(upTnlInfo->tnlCfg1 == NULLP)
8902 DU_LOG("\nERROR --> F1AP : extractUpTnlInfo: Failed to allocate mmeory for tunnel cfg 1");
8905 bitStringToInt(>pTunnel->transportLayerAddress, &upTnlInfo->tnlCfg1->ulTnlAddress);
8906 upTnlInfo->tnlCfg1->dlTnlAddress = ipv4_du;
8907 if(gtpTunnel->gTP_TEID.size > 0)
8909 teIdStringToInt(gtpTunnel->gTP_TEID.buf, &upTnlInfo->tnlCfg1->teId);
8918 /*******************************************************************
8920 * @brief Function to extract Drb Qos Cfg Info from CU
8924 * Function : extractDrbQosCfg
8926 * Functionality: Function to extract Drb Qos Cfg Info from CU
8928 * @params[in] DRB_Information_t *drbInfo, LcCfg *macLcToAdd
8929 * @return ROK/RFAILED
8931 * ****************************************************************/
8933 uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd )
8935 if(!macLcToAdd->drbQos)
8937 DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
8938 if(macLcToAdd->drbQos == NULLP)
8940 DU_LOG("\nERROR --> DUAPP:Memory failed at allocating DrbQos at extractDrbQosCfg()");
8945 if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
8947 extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
8948 macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
8950 if(extractDrbSnssaiCfg(&drbInfo->sNSSAI, &macLcToAdd->snssai) != ROK)
8952 DU_LOG("\nERROR --> DUAPP: Unable to extract Snssai information at extractDrbQosCfg()");
8957 /*******************************************************************
8959 * @brief Function to extract DRB info received from CU
8963 * Function : extractDrbCfg
8965 * Functionality: Function to extract DRB info received from CU
8967 * @params[in] F1AP message
8970 * ****************************************************************/
8971 uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\
8972 DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo)
8974 DRB_Information_t *drbInfo = NULLP;
8976 if(drbItem != NULLP)
8978 if(extractUpTnlInfo(drbItem->dRBID, CONFIG_ADD, &drbItem->uLUPTNLInformation_ToBeSetup_List, upTnlInfo) != ROK)
8980 DU_LOG("\nERROR --> DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
8983 if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
8985 if(drbItem->qoSInformation.choice.choice_extension->value.present == QoSInformation_ExtIEs__value_PR_DRB_Information)
8987 drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
8988 if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
8990 DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
8996 else if(drbSetupModItem != NULLP)
8998 if(extractUpTnlInfo(drbSetupModItem->dRBID, CONFIG_ADD, &drbSetupModItem->uLUPTNLInformation_ToBeSetup_List,\
9001 DU_LOG("\nERROR --> DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
9004 if(drbSetupModItem->qoSInformation.present == QoSInformation_PR_choice_extension)
9006 if(drbSetupModItem->qoSInformation.choice.choice_extension->value.present ==\
9007 QoSInformation_ExtIEs__value_PR_DRB_Information)
9009 drbInfo = &drbSetupModItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
9010 if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
9012 DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
9019 else if(drbModItem != NULLP)
9021 if(extractUpTnlInfo(drbModItem->dRBID, CONFIG_MOD, &drbModItem->uLUPTNLInformation_ToBeSetup_List,\
9024 DU_LOG("\nERROR --> DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
9027 if(drbModItem->qoSInformation != NULLP)
9029 if(drbModItem->qoSInformation->present == QoSInformation_PR_choice_extension)
9031 if(drbModItem->qoSInformation->choice.choice_extension->value.present ==\
9032 QoSInformation_ExtIEs__value_PR_DRB_Information)
9034 drbInfo = &drbModItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information;
9035 if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
9037 DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
9048 /*******************************************************************
9050 * @brief Function to extract RB info received from CU
9054 * Function : extractMacRbCfg
9056 * Functionality: Function to extract RB info received from CU
9058 * @params[in] F1AP message
9059 * @return ROK/RFAILED
9061 * ****************************************************************/
9063 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\
9064 DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, DRBs_ToBeModified_Item_t *drbModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
9068 if(extractDrbCfg(drbCfg, NULL, NULL, lcCfg, upTnlInfo) != ROK)
9070 DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()");
9074 else if(drbSetupModCfg != NULLP)
9076 if(extractDrbCfg(NULL, drbSetupModCfg, NULL, lcCfg, upTnlInfo) != ROK)
9078 DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()");
9082 else if(drbModCfg != NULLP)
9084 if(extractDrbCfg(NULL, NULL, drbModCfg, lcCfg, upTnlInfo) != ROK)
9086 DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()");
9092 lcCfg->drbQos = NULLP;
9093 lcCfg->snssai = NULLP;
9094 if(lcCfg->lcId == SRB2_LCID)
9095 lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
9097 lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
9101 lcCfg->ulLcCfgPres = true;
9102 extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
9105 lcCfg->ulLcCfgPres = false;
9109 /*******************************************************************
9111 * @brief Function processing LC config info received from CU
9115 * Function : procMacLcCfg
9117 * Functionality: Function processing LC config info received from CU
9119 * @params[in] F1AP message
9120 * @return ROK/RFAILED
9122 * ****************************************************************/
9124 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType, DRBs_ToBeSetup_Item_t *drbItem,\
9125 DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LogicalChannelConfig_t *ulLcCfg,\
9126 LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
9131 lcCfg->configType = configType;
9132 if(rbType == RB_TYPE_SRB)
9134 ret = extractMacRbCfg(lcId, NULL, NULL, NULL, ulLcCfg, lcCfg, NULL);
9136 else if(rbType == RB_TYPE_DRB)
9139 ret = extractMacRbCfg(lcId, drbItem, NULL, NULL, ulLcCfg, lcCfg, upTnlInfo);
9140 else if(drbSetupModItem != NULL)
9141 ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, NULL, ulLcCfg, lcCfg, upTnlInfo);
9142 else if(drbModItem != NULL)
9143 ret = extractMacRbCfg(lcId, NULL, NULL, drbModItem, ulLcCfg, lcCfg, upTnlInfo);
9148 /*******************************************************************
9150 * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
9154 * Function : extractRlcCfgToAddMod
9156 * Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
9158 * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
9160 * @return ROK/RFAILED
9162 * ****************************************************************/
9164 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, DuUeCfg *ueCfgDb)
9166 uint8_t idx, rbId, lcId, rlcMode, rbType;
9167 RLC_Config_t *f1RlcCfg = NULLP;
9168 LogicalChannelConfig_t *macUlLcCfg = NULLP;
9170 for(idx = 0; idx < lcCfg->list.count; idx++)
9172 lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
9173 if(lcCfg->list.array[idx]->servedRadioBearer)
9175 /* RadioBearer for SRB/DRB */
9176 if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
9177 RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
9179 rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
9180 rbType = RB_TYPE_SRB;
9182 else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
9183 RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
9185 rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
9186 rbType = RB_TYPE_DRB;
9190 DU_LOG("\nERROR --> No components present in Bearer config to ADD/MOD");
9193 /* MAC UL LC Config */
9194 if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
9196 macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
9201 DU_LOG("\nERROR --> DUAPP: Received RadioBearer config is NULL");
9204 /* RLC Mode Config */
9205 if(lcCfg->list.array[idx]->rlc_Config)
9207 rlcMode = lcCfg->list.array[idx]->rlc_Config->present;
9208 f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
9211 /* Filling RLC/MAC Config*/
9212 memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
9213 memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
9214 procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]), NULLP);
9215 if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK)
9217 DU_LOG("\nERROR --> DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()");
9220 (ueCfgDb->numRlcLcs)++;
9221 (ueCfgDb->numMacLcs)++;
9222 DU_LOG("\nDEBUG -> DUAPP: extractRlcCfgToAddMod:RBType:%d, DrbID: %d,lcId:%d, [RLC,MAC,NumDrb]:[%x,%x,%x]",\
9223 rbType, rbId, lcId, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb);
9225 //TODO: To send the failure cause in UeContextSetupRsp
9229 /*******************************************************************
9231 * @brief DeAlloc pdsch serv cell config info
9235 * Function : freeMacPdschServCellInfo
9237 * Functionality: DeAlloc pdsch serv cell config info
9239 * @params[in] PdschServCellCfg pointer
9242 * ****************************************************************/
9244 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
9246 if(pdsch->xOverhead)
9248 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(PdschXOverhead));
9250 if(pdsch->codeBlkGrpFlushInd)
9252 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
9254 if(pdsch->maxCodeBlkGrpPerTb)
9256 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB));
9258 if(pdsch->maxMimoLayers)
9260 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
9264 /*******************************************************************
9266 * @brief Free Serving cell Info
9270 * Function : freeMacServingCellInfo
9272 * Functionality: Free Serving cell Info
9274 * @params[in] ServCellCfgInfo *srvCellCfg
9277 * ****************************************************************/
9278 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
9280 uint8_t timeDomRsrcIdx;
9282 if(srvCellCfg->initDlBwp.pdschPresent)
9284 for(timeDomRsrcIdx = 0; timeDomRsrcIdx < srvCellCfg->initDlBwp.pdschCfg.numTimeDomRsrcAlloc; timeDomRsrcIdx++)
9286 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, \
9287 srvCellCfg->initDlBwp.pdschCfg.timeDomRsrcAllociList[timeDomRsrcIdx].k0, sizeof(uint8_t));
9291 freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
9292 if(srvCellCfg->bwpInactivityTmr)
9294 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
9297 if(srvCellCfg->initUlBwp.pucchPresent)
9299 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->initUlBwp.pucchCfg.dlDataToUlAck, sizeof(PucchDlDataToUlAck));
9303 /*******************************************************************
9305 * @brief Free cell Grp Cfg Info
9309 * Function : freeUeReCfgCellGrpInfo
9311 * Functionality: Free cell Grp Cfg Info
9313 * @params[in] MacUeCfg* duUeCfg
9316 * ****************************************************************/
9318 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
9320 freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
9323 /*******************************************************************
9325 * @brief Fills Reconfig SchReqReConfig
9329 * Function : extractSchReqReConfig
9331 * Functionality: Fills Reconfig SchReqReConfig
9333 * @params[in] SchedulingRequestConfig_t *cuSchedReq
9334 * SchedReqCfg* macSchedReq
9337 * ****************************************************************/
9338 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
9340 uint8_t schReqIdx = 0;
9341 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
9342 struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
9344 if(cuSchedReq->schedulingRequestToAddModList)
9346 schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
9347 if(schReqListToAdd->list.count)
9349 macSchedReq->addModListCount = schReqListToAdd->list.count;
9350 for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
9352 macSchedReq->addModList[schReqIdx].schedReqId = \
9353 schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
9354 macSchedReq->addModList[schReqIdx].srProhibitTmr = \
9355 *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
9356 macSchedReq->addModList[schReqIdx].srTransMax =\
9357 schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
9361 /* Scheduling Req To release */
9362 if(cuSchedReq->schedulingRequestToReleaseList)
9364 schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
9365 if(schReqListToRel->list.count)
9367 macSchedReq->relListCount = schReqListToRel->list.count;
9368 for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
9370 macSchedReq->relList[schReqIdx] = \
9371 *schReqListToRel->list.array[schReqIdx];
9377 /*******************************************************************
9379 * @brief Fills TagReconfig
9383 * Function : extractTagReconfig
9385 * Functionality: Fills extractTagReconfig
9387 * @params[in] TAG_Config_t *cuTagCfg
9391 * ****************************************************************/
9393 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
9396 struct TAG_Config__tag_ToAddModList *tagListToAddMod = NULLP;
9397 struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
9399 /* Tag config to AddMod */
9400 if(cuTagCfg->tag_ToAddModList)
9402 tagListToAddMod = cuTagCfg->tag_ToAddModList;
9403 if(tagListToAddMod->list.count)
9405 macTagCfg->addModListCount = tagListToAddMod->list.count;
9406 for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
9408 macTagCfg->addModList[tagIdx].tagId =\
9409 tagListToAddMod->list.array[tagIdx]->tag_Id;
9410 macTagCfg->addModList[tagIdx].timeAlignTimer = \
9412 tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
9416 /* Tag config to release */
9417 if(cuTagCfg->tag_ToReleaseList)
9419 tagListToRel = cuTagCfg->tag_ToReleaseList;
9420 if(tagListToRel->list.count)
9422 macTagCfg->relListCount = tagListToRel->list.count;
9423 for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
9425 macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];
9431 /*******************************************************************
9433 * @brief Fills PdcchCfg received by CU
9437 * Function : extractPdcchCfg
9439 * Functionality: Fills PdcchCfg received by CU
9441 * @params[in] PDCCH_Config_t *cuPdcchCfg,
9442 * PdcchConfig *duPdcchCfg
9445 * ****************************************************************/
9447 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
9449 uint8_t cRsetIdx = 0;
9450 uint8_t srchSpcIdx = 0;
9452 struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
9453 struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
9454 struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
9455 struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
9458 /* Control Resource Set To Add/Mod List */
9459 if(cuPdcchCfg->controlResourceSetToAddModList)
9461 cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
9462 if(cRsetToAddModList->list.count)
9464 macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
9465 for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
9467 macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
9468 cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
9469 //freqDomRsrcBitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
9470 macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
9471 memcpy(macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc, \
9472 cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.buf,
9473 cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.size);
9475 macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
9476 cRsetToAddModList->list.array[cRsetIdx]->duration;
9478 macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
9479 cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;
9480 if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
9482 //TODO: handle the case for Interleaved
9484 macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
9485 cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
9486 if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
9488 macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
9489 *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
9494 /* Control Resource Set To Release List */
9495 if(cuPdcchCfg->controlResourceSetToReleaseList)
9497 cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
9498 if(cRsetToRelList->list.count)
9500 macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
9501 for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
9503 macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
9508 /* Search space To Add/Mod List */
9509 if(cuPdcchCfg->searchSpacesToAddModList)
9511 srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
9512 if(srchSpcToAddModList->list.count)
9514 macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
9515 for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
9517 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
9518 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
9519 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
9520 *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
9521 if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
9523 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
9524 srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
9526 if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
9528 bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
9529 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
9531 if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
9533 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
9534 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
9535 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
9536 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
9537 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
9538 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
9540 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
9541 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
9543 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
9544 srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
9546 if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
9548 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
9549 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
9550 if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
9552 macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
9553 srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
9560 /* Search space To Rel List */
9561 if(cuPdcchCfg->searchSpacesToReleaseList)
9563 srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
9564 if(srchSpcToRelList->list.count)
9566 macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
9567 for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
9569 macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
9570 *(srchSpcToRelList->list.array[srchSpcIdx]);
9576 /*******************************************************************
9578 * @brief Fills PdschCfg received by CU
9582 * Function : extractPdschCfg
9584 * Functionality: Fills PdschCfg received by CU
9586 * @params[in] PDSCH_Config_t *cuPdschCfg = Information which is send by CU,
9587 * which we have stored in F1UeContextSetupDb,
9588 * PdschConfig *macPdschCfg = Used to Store the information which
9589 * needs to send in other layer, as well as this can be the variable
9590 * which stores the information in DuCb,
9591 * PdschConfig *storedPdschCfg = Null in case of sending the
9592 * information to other layer else it will have stored pdsch
9593 * configuration in copyOfmacUeCfg.
9596 * ****************************************************************/
9598 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg, PdschConfig *storedPdschCfg)
9601 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
9603 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
9605 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
9606 PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
9608 if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
9610 macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
9611 *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
9615 macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
9616 if(cuPdschCfg->pdsch_TimeDomainAllocationList)
9618 timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
9619 if(timeDomAlloc->present ==\
9620 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
9622 if(timeDomAlloc->choice.setup)
9624 macPdschCfg->numTimeDomRsrcAlloc = timeDomAlloc->choice.setup->list.count;
9625 for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
9627 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 = NULLP;
9628 if(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0)
9630 if(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 == NULL)
9634 if(storedPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0)
9636 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 =\
9637 storedPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0;
9641 DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
9646 DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
9648 if(!macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0)
9650 DU_LOG("\nERROR --> DU APP : Memory allocation failed for k0 at extractPdschCfg()");
9654 *(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0) = \
9655 *(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0);
9657 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
9658 timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
9659 macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
9660 timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
9665 macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
9666 if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
9667 macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
9668 if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
9670 macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
9671 if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
9673 if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
9675 macPdschCfg->bundlingInfo.StaticBundling.size = \
9676 *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
9680 else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
9682 macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
9687 /*******************************************************************
9689 * @brief Fills PdschServingCellCfg received by CU
9693 * Function : extractPdschServingCellCfg
9695 * Functionality: Fills PdschCfg received by CU
9697 * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
9698 * PdschServCellCfg *macUePdschSrvCellCfg
9699 * @return ROK/RFAILED
9701 * ****************************************************************/
9703 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
9705 if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
9707 if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
9709 if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
9711 *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb) = \
9712 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
9716 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB));
9717 if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
9719 *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb) = \
9720 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
9724 DU_LOG("\nERROR --> DU APP : Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
9728 if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
9730 *(macUePdschSrvCellCfg->codeBlkGrpFlushInd) = \
9731 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
9735 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->codeBlkGrpFlushInd , sizeof(bool));
9736 if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
9738 *(macUePdschSrvCellCfg->codeBlkGrpFlushInd) = \
9739 cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
9743 DU_LOG("\nERROR --> DU APP : Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
9749 if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
9751 macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH);
9753 if(cuPdschSrvCellCfg->ext1)
9755 if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
9757 if(macUePdschSrvCellCfg->maxMimoLayers)
9759 *(macUePdschSrvCellCfg->maxMimoLayers) = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
9763 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
9764 if(macUePdschSrvCellCfg->maxMimoLayers)
9766 *(macUePdschSrvCellCfg->maxMimoLayers) = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
9770 DU_LOG("\nERROR --> DU APP : Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
9776 if(cuPdschSrvCellCfg->xOverhead)
9778 if(macUePdschSrvCellCfg->xOverhead)
9780 *(macUePdschSrvCellCfg->xOverhead) = *(cuPdschSrvCellCfg->xOverhead);
9784 DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(PdschXOverhead));
9785 if(macUePdschSrvCellCfg->xOverhead)
9787 *(macUePdschSrvCellCfg->xOverhead) = *(cuPdschSrvCellCfg->xOverhead);
9791 DU_LOG("\nERROR --> DU APP : Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
9799 /*******************************************************************
9801 * @brief Fills PuschCfg received by CU
9805 * Function : extractPuschCfg
9807 * Functionality: Fills PuschCfg received by CU
9809 * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
9810 * PuschCfg *macPuschCfg
9813 * ****************************************************************/
9815 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
9817 uint8_t timeDomIdx = 0;
9818 DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
9819 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
9821 if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
9823 if(cuPuschCfg->choice.setup)
9825 if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
9827 macPuschCfg->dataScramblingId = \
9828 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
9830 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
9832 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
9834 if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
9836 dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
9837 if(dmrsUlCfg->dmrs_AdditionalPosition)
9839 macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
9840 *(dmrsUlCfg->dmrs_AdditionalPosition);
9842 if(dmrsUlCfg->transformPrecodingDisabled)
9844 if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
9846 macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
9847 *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
9853 /*Res Alloc Type for UL */
9854 if(cuPuschCfg->choice.setup->resourceAllocation)
9856 macPuschCfg->resourceAllocType = \
9857 cuPuschCfg->choice.setup->resourceAllocation;
9859 if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
9861 timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
9862 if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
9864 if(timeDomAllocList->choice.setup)
9866 macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
9867 for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
9869 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
9870 *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
9871 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
9872 timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
9873 macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
9874 timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
9879 if(cuPuschCfg->choice.setup->transformPrecoder)
9880 macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
9885 /*******************************************************************
9887 * @brief Function to fill pucch Power Control
9891 * Function : extractPucchPowerControl
9893 * Functionality: Function to fill pucch Power Control
9895 * @params[in] PucchPowerControl *pwrCtrl,
9896 * struct PUCCH_PowerControl *cuPwrCtrlCfg
9899 * ****************************************************************/
9901 void extractPucchPowerControl(PucchPowerControl *pwrCtrl, struct PUCCH_PowerControl *cuPwrCtrlCfg)
9905 if(cuPwrCtrlCfg->deltaF_PUCCH_f0)
9906 pwrCtrl->deltaF_Format0 = *cuPwrCtrlCfg->deltaF_PUCCH_f0;
9907 if(cuPwrCtrlCfg->deltaF_PUCCH_f1)
9908 pwrCtrl->deltaF_Format1 = *cuPwrCtrlCfg->deltaF_PUCCH_f1;
9909 if(cuPwrCtrlCfg->deltaF_PUCCH_f2)
9910 pwrCtrl->deltaF_Format2 = *cuPwrCtrlCfg->deltaF_PUCCH_f2;
9911 if(cuPwrCtrlCfg->deltaF_PUCCH_f3)
9912 pwrCtrl->deltaF_Format3 = *cuPwrCtrlCfg->deltaF_PUCCH_f3;
9913 if(cuPwrCtrlCfg->deltaF_PUCCH_f4)
9914 pwrCtrl->deltaF_Format4 = *cuPwrCtrlCfg->deltaF_PUCCH_f4;
9915 if(cuPwrCtrlCfg->p0_Set)
9917 pwrCtrl->p0SetCount = cuPwrCtrlCfg->p0_Set->list.count;
9918 for(arrIdx=0; arrIdx < pwrCtrl->p0SetCount; arrIdx++)
9920 pwrCtrl->p0Set[arrIdx].p0PucchId =\
9921 cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Id;
9922 pwrCtrl->p0Set[arrIdx].p0PucchVal =\
9923 cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Value;
9926 if(cuPwrCtrlCfg->pathlossReferenceRSs)
9928 pwrCtrl->pathLossRefRSListCount = cuPwrCtrlCfg->pathlossReferenceRSs->list.count;
9929 for(arrIdx = 0; arrIdx < pwrCtrl->pathLossRefRSListCount; arrIdx++)
9931 pwrCtrl->pathLossRefRSList[arrIdx].pathLossRefRSId =\
9932 cuPwrCtrlCfg->pathlossReferenceRSs->list.array[arrIdx]->pucch_PathlossReferenceRS_Id;
9937 /*******************************************************************
9939 * @brief Function to extractResrcSetToAddModList sent by CU
9943 * Function : extractResrcSetToAddModList
9945 * Functionality: Fucntion to extractResrcSetToAddModList
9947 * @params[in] PucchResrcSetCfg pointer,
9948 * struct PUCCH_Config__resourceSetToAddModList pointer
9951 * ****************************************************************/
9953 void extractResrcSetToAddModList(PucchResrcSetCfg *macRsrcSetList, struct PUCCH_Config__resourceSetToAddModList *cuRsrcSetList)
9955 uint8_t arrIdx, rsrcListIdx;
9957 macRsrcSetList->resrcSetToAddModListCount = cuRsrcSetList->list.count;
9958 for(arrIdx = 0; arrIdx < macRsrcSetList->resrcSetToAddModListCount; arrIdx++)
9960 macRsrcSetList->resrcSetToAddModList[arrIdx].resrcSetId =\
9961 cuRsrcSetList->list.array[arrIdx]->pucch_ResourceSetId;
9962 macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount =\
9963 cuRsrcSetList->list.array[arrIdx]->resourceList.list.count;
9964 for(rsrcListIdx = 0; rsrcListIdx < macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount; rsrcListIdx++)
9966 macRsrcSetList->resrcSetToAddModList[arrIdx].resrcList[rsrcListIdx] =\
9967 *cuRsrcSetList->list.array[arrIdx]->resourceList.list.array[rsrcListIdx];
9970 if(cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1)
9972 macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\
9973 *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1;
9977 macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize = 0;
9980 }/* End of extractResrcSetToAddModList */
9982 /*******************************************************************
9984 * @brief Fills extractResrcToAddModList sent by CU
9988 * Function : extractResrcToAddModList
9990 * Functionality: Fills extractResrcToAddModList
9992 * @params[in] PucchResrcCfg pointer,
9993 * struct PUCCH_Config__resourceToAddModList pointer
9994 * @return ROk/RFAILED
9996 * ****************************************************************/
9998 uint8_t extractResrcToAddModList(PucchResrcCfg *macResrcList, struct PUCCH_Config__resourceToAddModList *cuResrcList)
10002 macResrcList->resrcToAddModListCount = cuResrcList->list.count;
10003 for(arrIdx = 0; arrIdx < macResrcList->resrcToAddModListCount; arrIdx++)
10005 macResrcList->resrcToAddModList[arrIdx].resrcId =\
10006 cuResrcList->list.array[arrIdx]->pucch_ResourceId;
10007 macResrcList->resrcToAddModList[arrIdx].startPrb =\
10008 cuResrcList->list.array[arrIdx]->startingPRB;
10009 if(cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping)
10011 macResrcList->resrcToAddModList[arrIdx].intraFreqHop =\
10012 *cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping;
10014 if(cuResrcList->list.array[arrIdx]->secondHopPRB)
10016 macResrcList->resrcToAddModList[arrIdx].secondPrbHop =\
10017 *cuResrcList->list.array[arrIdx]->secondHopPRB;
10019 /* PUCCH RSRC FORMAT */
10020 if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format0)
10022 macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_0;
10023 if(cuResrcList->list.array[arrIdx]->format.choice.format0)
10025 DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0, sizeof(PucchFormat0));
10026 if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0 == NULLP)
10028 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Format0 in extractResrcToAddModList()");
10031 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->initialCyclicShift =\
10032 cuResrcList->list.array[arrIdx]->format.choice.format0->initialCyclicShift;
10033 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->numSymbols =\
10034 cuResrcList->list.array[arrIdx]->format.choice.format0->nrofSymbols;
10035 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->startSymbolIdx =\
10036 cuResrcList->list.array[arrIdx]->format.choice.format0->startingSymbolIndex;
10039 else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format1)
10041 macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_1;
10042 if(cuResrcList->list.array[arrIdx]->format.choice.format1)
10044 DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1, sizeof(PucchFormat1));
10045 if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1 == NULLP)
10047 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Format1 in extractResrcToAddModList()");
10050 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->initialCyclicShift =\
10051 cuResrcList->list.array[arrIdx]->format.choice.format1->initialCyclicShift;
10052 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->numSymbols =\
10053 cuResrcList->list.array[arrIdx]->format.choice.format1->nrofSymbols;
10054 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->startSymbolIdx =\
10055 cuResrcList->list.array[arrIdx]->format.choice.format1->startingSymbolIndex;
10056 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->timeDomOCC =\
10057 cuResrcList->list.array[arrIdx]->format.choice.format1->timeDomainOCC;
10060 else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format2)
10062 macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_2;
10063 if(cuResrcList->list.array[arrIdx]->format.choice.format2)
10065 DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2, sizeof(PucchFormat2_3));
10066 if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2 == NULLP)
10068 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Format2 in extractResrcToAddModList()");
10071 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numPrbs =\
10072 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofPRBs;
10073 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numSymbols =\
10074 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofSymbols;
10075 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->startSymbolIdx =\
10076 cuResrcList->list.array[arrIdx]->format.choice.format2->startingSymbolIndex;
10079 else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format3)
10081 macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_3;
10082 if(cuResrcList->list.array[arrIdx]->format.choice.format3)
10084 DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3, sizeof(PucchFormat2_3));
10085 if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3 == NULLP)
10087 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Format3 in extractResrcToAddModList()");
10090 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numPrbs =\
10091 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofPRBs;
10092 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numSymbols =\
10093 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofSymbols;
10094 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->startSymbolIdx =\
10095 cuResrcList->list.array[arrIdx]->format.choice.format3->startingSymbolIndex;
10098 else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format4)
10100 macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_4;
10101 if(cuResrcList->list.array[arrIdx]->format.choice.format4)
10103 DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4, sizeof(PucchFormat4));
10104 if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4 == NULLP)
10106 DU_LOG("\nERROR --> F1AP : Failed to allocate memory for Format4 in extractResrcToAddModList()");
10109 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->numSymbols =\
10110 cuResrcList->list.array[arrIdx]->format.choice.format4->nrofSymbols;
10111 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occLen =\
10112 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Length;
10113 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occIdx =\
10114 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Index;
10115 macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->startSymbolIdx =\
10116 cuResrcList->list.array[arrIdx]->format.choice.format4->startingSymbolIndex;
10122 }/* End of extractResrcToAddModList */
10124 /*******************************************************************
10126 * @brief Fills fillPucchSchedReqPeriodAndOffset sent by CU
10130 * Function : fillPucchSchedReqPeriodAndOffset
10132 * Functionality: To fillPucchSchedReqPeriodAndOffset
10134 * @params[in] macPeriodicty,
10135 * SchedulingRequestResourceConfig__periodicityAndOffset pointer
10138 * ****************************************************************/
10140 void fillPucchSchedReqPeriodAndOffset(uint8_t macPeriodicty, uint16_t macOffset,\
10141 struct SchedulingRequestResourceConfig__periodicityAndOffset *cuPeriodicty)
10143 macPeriodicty = cuPeriodicty->present;
10144 switch(macPeriodicty)
10146 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2:
10148 macOffset = cuPeriodicty->choice.sym2;
10151 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7:
10153 macOffset = cuPeriodicty->choice.sym6or7;
10156 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
10158 macOffset = cuPeriodicty->choice.sl1;
10161 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
10163 macOffset = cuPeriodicty->choice.sl2;
10166 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
10168 macOffset = cuPeriodicty->choice.sl4;
10171 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
10173 macOffset = cuPeriodicty->choice.sl5;
10176 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
10178 macOffset = cuPeriodicty->choice.sl8;
10181 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
10183 macOffset = cuPeriodicty->choice.sl10;
10186 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
10188 macOffset = cuPeriodicty->choice.sl16;
10191 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
10193 macOffset = cuPeriodicty->choice.sl20;
10196 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
10198 macOffset = cuPeriodicty->choice.sl40;
10201 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
10203 macOffset = cuPeriodicty->choice.sl80;
10206 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
10208 macOffset = cuPeriodicty->choice.sl160;
10211 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
10213 macOffset = cuPeriodicty->choice.sl320;
10216 case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
10218 macOffset = cuPeriodicty->choice.sl640;
10222 DU_LOG("\nERROR --> F1AP : Invalid periodicity %d", macPeriodicty);
10226 /*******************************************************************
10228 * @brief Function to extractPucchFormatCfg sent by CU
10232 * Function : extractPucchFormatCfg
10234 * Functionality: Function to extractPucchFormatCfg
10236 * @params[in] PucchFormatCfg pointer,
10237 * PUCCH_FormatConfig_t pointer
10240 * ****************************************************************/
10242 void extractPucchFormatCfg(PucchFormatCfg *macFormatCfg, PUCCH_FormatConfig_t *cuFormatCfg)
10244 if(cuFormatCfg->interslotFrequencyHopping)
10245 macFormatCfg->interSlotFreqHop = *cuFormatCfg->interslotFrequencyHopping;
10246 if(cuFormatCfg->additionalDMRS)
10247 macFormatCfg->addDmrs = *cuFormatCfg->additionalDMRS;
10248 if(cuFormatCfg->maxCodeRate)
10249 macFormatCfg->maxCodeRate = *cuFormatCfg->maxCodeRate;
10250 if(cuFormatCfg->nrofSlots)
10251 macFormatCfg->numSlots = *cuFormatCfg->nrofSlots;
10252 if(cuFormatCfg->pi2BPSK)
10253 macFormatCfg->pi2BPSK = *cuFormatCfg->pi2BPSK;
10254 if(cuFormatCfg->simultaneousHARQ_ACK_CSI)
10255 macFormatCfg->harqAckCSI = *cuFormatCfg->simultaneousHARQ_ACK_CSI;
10256 }/* End of extractPucchFormatCfg */
10258 /*******************************************************************
10260 * @brief Function to extractSchedReqCfgToAddMod sent by CU
10264 * Function : extractSchedReqCfgToAddMod
10266 * Functionality: Function to extractSchedReqCfgToAddMod
10268 * @params[in] PucchSchedReqCfg pointer,
10269 * PUCCH_Config__schedulingRequestResourceToAddModList pointer
10272 * ****************************************************************/
10274 void extractSchedReqCfgToAddMod(PucchSchedReqCfg *macSchedReqCfg, struct PUCCH_Config__schedulingRequestResourceToAddModList *cuSchedReqList)
10278 macSchedReqCfg->schedAddModListCount = cuSchedReqList->list.count;
10279 for(arrIdx = 0; arrIdx < macSchedReqCfg->schedAddModListCount; arrIdx++)
10281 macSchedReqCfg->schedAddModList[arrIdx].resrcId =\
10282 cuSchedReqList->list.array[arrIdx]->schedulingRequestResourceId;
10283 macSchedReqCfg->schedAddModList[arrIdx].requestId =\
10284 cuSchedReqList->list.array[arrIdx]->schedulingRequestID;
10285 if(cuSchedReqList->list.array[arrIdx]->periodicityAndOffset)
10287 fillPucchSchedReqPeriodAndOffset(macSchedReqCfg->schedAddModList[arrIdx].periodicity,\
10288 macSchedReqCfg->schedAddModList[arrIdx].offset, cuSchedReqList->list.array[arrIdx]->periodicityAndOffset);
10290 if(cuSchedReqList->list.array[arrIdx]->resource)
10292 macSchedReqCfg->schedAddModList[arrIdx].resrc =\
10293 *cuSchedReqList->list.array[arrIdx]->resource;
10297 }/* End of extractSchedReqCfgToAddMod */
10299 /*******************************************************************
10301 * @brief Fills PucchCfg received by CU
10305 * Function : extractPucchCfg
10307 * Functionality: Fills PucchCfg received by CU
10309 * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg = Information which
10310 * is send by CU, which we have stored in F1UeContextSetupDb,
10311 * PucchCfg *macPucchCfg = Used to Store the information which
10312 * needs to send in other layer, as well as this can be the variable
10313 * which stores the information in DuCb,
10314 * PucchCfg *storedPucchCfg = Null in case of sending the
10315 * information to other layer else it will have Pucch Cfg which
10316 * we have stored in copyOfmacUeCfg.
10317 * @return ROK/RFAILED
10319 * ****************************************************************/
10321 uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg,\
10322 PucchCfg *storedPucchCfg)
10326 if(cuPucchCfg->present == BWP_UplinkDedicated__pucch_Config_PR_setup)
10328 if(cuPucchCfg->choice.setup)
10330 /* Resource Set Cfg */
10331 if(cuPucchCfg->choice.setup->resourceSetToAddModList)
10333 DU_ALLOC_SHRABL_BUF(macPucchCfg->resrcSet, sizeof(PucchResrcSetCfg));
10334 if(macPucchCfg->resrcSet == NULLP)
10336 DU_LOG("\nERROR --> F1AP : Failed to extract Resrc set List in extractPucchCfg()");
10339 memset(macPucchCfg->resrcSet, 0, sizeof(PucchResrcSetCfg));
10340 extractResrcSetToAddModList(macPucchCfg->resrcSet, cuPucchCfg->choice.setup->resourceSetToAddModList);
10344 if(cuPucchCfg->choice.setup->resourceToAddModList)
10346 DU_ALLOC_SHRABL_BUF(macPucchCfg->resrc, sizeof(PucchResrcCfg));
10347 if(macPucchCfg->resrc == NULLP)
10349 DU_LOG("\nERROR --> F1AP : Failed to extract Resrc List in extractPucchCfg()");
10352 memset(macPucchCfg->resrc, 0, sizeof(PucchResrcCfg));
10353 extractResrcToAddModList(macPucchCfg->resrc, cuPucchCfg->choice.setup->resourceToAddModList);
10357 if(cuPucchCfg->choice.setup->format1)
10359 DU_ALLOC_SHRABL_BUF(macPucchCfg->format1, sizeof(PucchFormatCfg));
10360 if(macPucchCfg->format1 == NULLP)
10362 DU_LOG("\nERROR --> F1AP : Failed to extract format 1 Cfg in extractPucchCfg()");
10365 memset(macPucchCfg->format1, 0, sizeof(PucchFormatCfg));
10366 extractPucchFormatCfg(macPucchCfg->format1,\
10367 cuPucchCfg->choice.setup->format1->choice.setup);
10371 if(cuPucchCfg->choice.setup->format2)
10373 DU_ALLOC_SHRABL_BUF(macPucchCfg->format2, sizeof(PucchFormatCfg));
10374 if(macPucchCfg->format2 == NULLP)
10376 DU_LOG("\nERROR --> F1AP : Failed to extract format 2 Cfg in extractPucchCfg()");
10379 memset(macPucchCfg->format2, 0, sizeof(PucchFormatCfg));
10380 extractPucchFormatCfg(macPucchCfg->format2,\
10381 cuPucchCfg->choice.setup->format2->choice.setup);
10385 if(cuPucchCfg->choice.setup->format3)
10387 DU_ALLOC_SHRABL_BUF(macPucchCfg->format3, sizeof(PucchFormatCfg));
10388 if(macPucchCfg->format3 == NULLP)
10390 DU_LOG("\nERROR --> F1AP : Failed to extract format 3 Cfg in extractPucchCfg()");
10393 memset(macPucchCfg->format3, 0, sizeof(PucchFormatCfg));
10394 extractPucchFormatCfg(macPucchCfg->format3,\
10395 cuPucchCfg->choice.setup->format3->choice.setup);
10399 if(cuPucchCfg->choice.setup->format4)
10401 DU_ALLOC_SHRABL_BUF(macPucchCfg->format4, sizeof(PucchFormatCfg));
10402 if(macPucchCfg->format4 == NULLP)
10404 DU_LOG("\nERROR --> F1AP : Failed to extract format 4 Cfg in extractPucchCfg()");
10407 memset(macPucchCfg->format4, 0, sizeof(PucchFormatCfg));
10408 extractPucchFormatCfg(macPucchCfg->format4,\
10409 cuPucchCfg->choice.setup->format4->choice.setup);
10412 /* Sched Req List */
10413 if(cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList)
10415 DU_ALLOC_SHRABL_BUF(macPucchCfg->schedReq, sizeof(PucchSchedReqCfg));
10416 if(macPucchCfg->schedReq == NULLP)
10418 DU_LOG("\nERROR --> F1AP : Failed to extract schedReqCfg in extractPucchCfg()");
10421 memset(macPucchCfg->schedReq, 0, sizeof(PucchSchedReqCfg));
10422 extractSchedReqCfgToAddMod(macPucchCfg->schedReq,\
10423 cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList);
10426 /*TODO: Add support for Spatial Info */
10429 if(cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList)
10431 DU_ALLOC_SHRABL_BUF(macPucchCfg->multiCsiCfg, sizeof(PucchMultiCsiCfg));
10432 if(macPucchCfg->multiCsiCfg == NULLP)
10434 DU_LOG("\nERROR --> F1AP : Failed to extract multiCsiCfg in extractPucchCfg()");
10437 memset(macPucchCfg->multiCsiCfg, 0, sizeof(PucchMultiCsiCfg));
10438 macPucchCfg->multiCsiCfg->multiCsiResrcListCount = cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.count;
10439 for(arrIdx =0; arrIdx < macPucchCfg->multiCsiCfg->multiCsiResrcListCount; arrIdx++)
10441 macPucchCfg->multiCsiCfg->multiCsiResrcList[arrIdx] =\
10442 *cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.array[arrIdx];
10446 /* Dl_DataToUL_ACK */
10447 if(cuPucchCfg->choice.setup->dl_DataToUL_ACK)
10451 if(storedPucchCfg->dlDataToUlAck)
10453 macPucchCfg->dlDataToUlAck = storedPucchCfg->dlDataToUlAck;
10457 DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
10462 DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
10464 if(macPucchCfg->dlDataToUlAck == NULLP)
10466 DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
10469 memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
10470 macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
10471 for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
10473 macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
10474 *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
10478 /* Power Control */
10479 if(cuPucchCfg->choice.setup->pucch_PowerControl)
10481 DU_ALLOC_SHRABL_BUF(macPucchCfg->powerControl, sizeof(PucchPowerControl));
10482 if(macPucchCfg->powerControl == NULLP)
10484 DU_LOG("\nERROR --> F1AP : Failed to extract power control in extractPucchCfg()");
10487 extractPucchPowerControl(macPucchCfg->powerControl,\
10488 cuPucchCfg->choice.setup->pucch_PowerControl);
10495 /*******************************************************************
10497 * @brief Fills ServingCellReconfig received by CU
10501 * Function : extractSpCellDedicatedCfg
10503 * Functionality: Fills ServingCellReconfig received by CU
10505 * @params[in] ServingCellConfig_t *cuSrvCellCfg = Information which is send by
10506 * CU, which we have stored in F1UeContextSetupDb,
10507 * ServCellCfgInfo *macSrvCellCfg = Used to Store the information
10508 * which needs to send in other layer, as well as this can be the
10509 * variable which stores the information in DuCb,
10510 * ServCellCfgInfo *storedSrvCellCfg = Null in case of sending the
10511 * information to other layer else it will have ServCellCfgInfo which
10512 * we have stored in copyOfmacUeCfg.
10513 * @return ROK/RFAILD
10515 * ****************************************************************/
10516 uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg,\
10517 ServCellCfgInfo *storedSrvCellCfg)
10520 BWP_DownlinkDedicated_t *dlBwp = NULLP;
10521 BWP_UplinkDedicated_t *ulBwp = NULLP;
10523 if(cuSrvCellCfg->initialDownlinkBWP)
10525 dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
10526 if(dlBwp->pdcch_Config)
10528 if(dlBwp->pdcch_Config->choice.setup)
10530 macSrvCellCfg->initDlBwp.pdcchPresent = true;
10531 if(storedSrvCellCfg)
10533 if(!storedSrvCellCfg->initDlBwp.pdcchPresent)
10535 extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
10539 extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
10544 extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
10548 if(dlBwp->pdsch_Config)
10550 if(dlBwp->pdsch_Config->choice.setup)
10552 macSrvCellCfg->initDlBwp.pdschPresent = true;
10554 if(storedSrvCellCfg)
10556 if(!storedSrvCellCfg->initDlBwp.pdschPresent)
10558 extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg, NULL);
10562 extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg,\
10563 &storedSrvCellCfg->initDlBwp.pdschCfg);
10568 extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg, NULL);
10573 if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
10574 macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
10575 if(cuSrvCellCfg->defaultDownlinkBWP_Id)
10576 macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
10577 if(cuSrvCellCfg->bwp_InactivityTimer)
10579 if(macSrvCellCfg->bwpInactivityTmr)
10581 memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
10585 macSrvCellCfg->bwpInactivityTmr = NULLP;
10586 DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
10587 if(macSrvCellCfg->bwpInactivityTmr)
10589 memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
10593 DU_LOG("\nERROR --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
10598 if(cuSrvCellCfg->pdsch_ServingCellConfig)
10600 if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
10602 ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
10605 DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
10610 if(cuSrvCellCfg->uplinkConfig)
10612 if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
10614 ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
10615 if(ulBwp->pusch_Config)
10617 macSrvCellCfg->initUlBwp.puschPresent = true;
10618 extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
10620 if(ulBwp->pucch_Config)
10622 macSrvCellCfg->initUlBwp.pucchPresent = true;
10623 memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
10624 if(storedSrvCellCfg)
10626 if(!storedSrvCellCfg->initUlBwp.pucchPresent)
10627 extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg, NULL);
10629 extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg,\
10630 &storedSrvCellCfg->initUlBwp.pucchCfg);
10634 extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg, NULL);
10638 if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
10639 macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
10643 /*******************************************************************
10645 * @brief Fills Reconfig Cell group Info received by CU
10649 * Function : extractUeReCfgCellInfo
10651 * Functionality: Fills Reconfig Cell group Info received by CU
10653 * @params[in] CellGroupConfigRrc_t *cellGrp = CellGroupConfigRrc_t information which
10654 * is send by CU, which we have stored in F1UeContextSetupDb
10655 * MacUeCfg *MacUeCfg = Used to Store the information,
10656 * which needs to send in other layer, as well as this can be
10657 * the variable which stores the information in DuCb,
10658 * MacUeCfg *storedMacUeCfg = Null in case of sending the
10659 * information to other layer else it will have copyOfmacUeCfg
10660 * which we have stored in F1UeContextSetupDb.
10662 * @return ROK/RFAILED
10664 * ****************************************************************/
10665 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg, MacUeCfg *storedMacUeCfg)
10668 MAC_CellGroupConfig_t *macCellGroup = NULLP;
10669 PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
10670 SpCellConfig_t *spcellCfg = NULLP;
10671 ServingCellConfig_t *servCellCfg = NULLP;
10675 /* Fill MacCell Group Reconfig */
10676 if(cellGrp->mac_CellGroupConfig)
10678 macUeCfg->macCellGrpCfgPres = true;
10679 macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
10680 if(macCellGroup->schedulingRequestConfig)
10682 extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
10684 if(macCellGroup->tag_Config)
10686 extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
10688 if(macCellGroup->bsr_Config)
10690 macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
10691 macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer = macCellGroup->bsr_Config->retxBSR_Timer;
10692 if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
10694 macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer =\
10695 *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
10698 if(macCellGroup->phr_Config)
10700 if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
10702 macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
10703 if(macCellGroup->phr_Config->choice.setup)
10705 macUeCfg->macCellGrpCfg.phrCfg.periodicTimer = \
10706 macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
10707 macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer = \
10708 macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
10709 macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor = \
10710 macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
10711 macUeCfg->macCellGrpCfg.phrCfg.multiplePHR = \
10712 macCellGroup->phr_Config->choice.setup->multiplePHR;
10713 macUeCfg->macCellGrpCfg.phrCfg.dummy = \
10714 macCellGroup->phr_Config->choice.setup->dummy;
10715 macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
10716 macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
10717 macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG = \
10718 macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
10723 /* Fill Physical Cell Group Reconfig */
10724 if(cellGrp->physicalCellGroupConfig)
10726 macUeCfg->phyCellGrpCfgPres = true;
10727 phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
10728 if(phyCellGrpCfg->p_NR_FR1)
10730 if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
10731 macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
10733 macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
10735 /* Fill SpCell Reconfig */
10736 if(cellGrp->spCellConfig)
10738 macUeCfg->spCellCfgPres = true;
10739 spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));
10740 if(spcellCfg->servCellIndex)
10742 macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
10744 /* Fill Serving cell Reconfig info */
10745 if(cellGrp->spCellConfig->spCellConfigDedicated)
10747 servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
10750 if(!storedMacUeCfg->spCellCfgPres)
10751 ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg, NULL);
10753 ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg,\
10754 &storedMacUeCfg->spCellCfg.servCellCfg);
10758 ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg, NULL);
10762 DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
10769 /*******************************************************************
10771 * @brief free the memory allocated by decoder
10775 * Function : freeAperDecodeNrcgi
10777 * Functionality: Free Nrcgi values
10779 * @params[in] NRCGI_t *nrcgi
10782 * ****************************************************************/
10785 void freeAperDecodeNrcgi(NRCGI_t *nrcgi)
10787 if(nrcgi->pLMN_Identity.buf != NULLP)
10789 free(nrcgi->pLMN_Identity.buf);
10791 if(nrcgi->nRCellIdentity.buf != NULLP)
10793 free(nrcgi->nRCellIdentity.buf);
10796 /*******************************************************************
10798 * @brief free the memory allocated by decoder
10802 * Function : freeAperDecodeCuToDuInfo
10804 * Functionality: Free Cu To Du Information
10806 * @params[in] CUtoDURRCInformation_t *rrcMsg
10809 * ****************************************************************/
10812 void freeAperDecodeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
10817 if(rrcMsg->uE_CapabilityRAT_ContainerList)
10819 if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
10820 free(rrcMsg->uE_CapabilityRAT_ContainerList->buf);
10821 free(rrcMsg->uE_CapabilityRAT_ContainerList);
10824 if(rrcMsg->iE_Extensions)
10826 if(rrcMsg->iE_Extensions->list.array)
10828 for(ieIdx= 0; ieIdx < rrcMsg->iE_Extensions->list.count; ieIdx++)
10830 if(rrcMsg->iE_Extensions->list.array[ieIdx])
10832 switch(rrcMsg->iE_Extensions->list.array[ieIdx]->id)
10834 case ProtocolIE_ID_id_CellGroupConfig:
10835 if(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
10837 free(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf);
10841 DU_LOG("\nERROR --> F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
10842 rrcMsg->iE_Extensions->list.array[ieIdx]->id);
10847 for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
10849 free(rrcMsg->iE_Extensions->list.array[arrIdx]);
10851 free(rrcMsg->iE_Extensions->list.array);
10855 free(rrcMsg->iE_Extensions);
10858 /*******************************************************************
10860 * @brief free the memory allocated by decoder
10864 * Function : freeAperDecodeSplCellList
10866 * Functionality: Free Spl Cell List
10867 where memory allocated by aper_decoder
10869 * @params[in] SCell_ToBeSetup_List_t *spCellLst
10872 * ****************************************************************/
10875 void freeAperDecodeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
10877 uint8_t cellIdx =0;
10879 if(spCellLst->list.array != NULLP)
10881 for(cellIdx=0; cellIdx<spCellLst->list.count; cellIdx++)
10883 if(cellIdx==0&&spCellLst->list.array[cellIdx]!=NULLP)
10885 freeAperDecodeNrcgi(&spCellLst->list.array[cellIdx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
10887 if(spCellLst->list.array[cellIdx]!=NULLP)
10889 free(spCellLst->list.array[cellIdx]);
10892 free(spCellLst->list.array);
10895 /*******************************************************************
10897 * @brief free the memory allocated by decoder
10901 * Function : freeAperDecodeSRBSetup
10903 * Functionality: added free part for the memory allocated by aper_decoder
10905 * @params[in] SRBs_ToBeSetup_List_t *srbSet
10908 ****************************************************************/
10911 void freeAperDecodeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
10914 if(srbSet->list.array != NULLP)
10916 for(srbIdx=0; srbIdx<srbSet->list.count; srbIdx++)
10918 if(srbSet->list.array[srbIdx]!=NULLP)
10920 free(srbSet->list.array[srbIdx]);
10923 free(srbSet->list.array);
10927 /*******************************************************************
10929 * @brief free the memory allocated by decoder
10933 * Function : freeAperDecodeULTnlInfo
10935 * Functionality: added free part for the memory allocated by aper_decoder
10937 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
10940 * ****************************************************************/
10943 void freeAperDecodeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
10946 if(ulInfo->list.array != NULLP)
10948 for(ulIdx=0; ulIdx<ulInfo->list.count; ulIdx++)
10950 if(ulIdx==0&&ulInfo->list.array[ulIdx]!=NULLP)
10952 if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
10954 if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10955 transportLayerAddress.buf != NULLP)
10957 if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
10960 free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf);
10962 free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
10963 transportLayerAddress.buf);
10965 free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel);
10968 if(ulInfo->list.array[ulIdx]!=NULLP)
10970 free(ulInfo->list.array[ulIdx]);
10973 free(ulInfo->list.array);
10976 /*******************************************************************
10978 * @brief free the memory allocated by decoder
10982 * Function : freeAperDecodeDRBSetup
10984 * Functionality: free DRBSetup which is allocated by decoder
10986 * @params[in] DRBs_ToBeSetup_List_t *drbSet
10989 * ****************************************************************/
10991 void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
10993 DRBs_ToBeSetup_Item_t *drbSetItem = NULLP;
10994 uint8_t flowIdx =0;
10997 if(drbSet->list.array != NULLP)
10999 for(drbIdx=0; drbIdx<drbSet->list.count; drbIdx++)
11001 if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
11003 drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
11004 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
11006 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
11007 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
11009 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
11010 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
11012 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
11013 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
11016 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
11019 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
11022 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
11026 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
11027 flows_Mapped_To_DRB_List.list.array != NULLP)
11030 for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11031 DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
11034 if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11035 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
11037 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11038 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
11039 qoSFlowLevelQoSParameters.\
11040 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
11042 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11043 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
11044 qoSFlowLevelQoSParameters.\
11045 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
11048 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11049 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
11050 qoSFlowLevelQoSParameters.\
11051 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
11055 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11056 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
11057 qoSFlowLevelQoSParameters.\
11058 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
11061 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11062 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
11063 qoSFlowLevelQoSParameters.\
11064 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
11067 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11069 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
11070 qoSFlowLevelQoSParameters.\
11071 qoS_Characteristics.choice.non_Dynamic_5QI);
11074 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11075 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
11078 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11079 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
11083 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11084 DRB_Information.flows_Mapped_To_DRB_List.list.array);
11087 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
11088 DRB_Information.sNSSAI.sD->buf);
11091 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
11094 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
11098 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
11100 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
11103 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
11104 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
11107 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
11108 qoS_Characteristics.choice.non_Dynamic_5QI);
11110 free(drbSetItem->qoSInformation.choice.choice_extension);
11112 freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
11113 if(drbSetItem->uLConfiguration)
11115 free(drbSetItem->uLConfiguration);
11118 if(drbSet->list.array[drbIdx]!=NULLP)
11120 free(drbSet->list.array[drbIdx]);
11123 free(drbSet->list.array);
11128 /*******************************************************************
11130 * @brief builds Mac Cell Cfg
11134 * Function : procUeReCfgCellInfo
11136 * Functionality: builds Mac Cell Cfg
11138 * @params[in] MacUeCfg *macUeCfgToSend = Used to Store the information which
11139 * needs to send in other layer, as well as this can be
11140 * the variable which stores the information in DuCb.
11141 * MacUeCfg *storedMacUeCfg = Null in case of sending the
11142 * information to other layer else it will have copyOfmacUeCfg
11143 * which we have stored in F1UeContextSetupDb
11144 * void *cellInfo = CellGroupConfigRrc_t information which is send
11145 * by CU, which we have stored in F1UeContextSetupDb
11149 * ****************************************************************/
11150 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, MacUeCfg *storedMacUeCfg, void *cellInfo)
11153 CellGroupConfigRrc_t *cellGrp = NULLP;
11157 cellGrp = (CellGroupConfigRrc_t *)cellInfo;
11158 ret = extractUeReCfgCellInfo(cellGrp, macUeCfgToSend, storedMacUeCfg);
11160 DU_LOG("\nERROR --> F1AP : Failed at procUeReCfgCellInfo()");
11164 freeUeReCfgCellGrpInfo(macUeCfgToSend);
11169 /*******************************************************************
11171 * @brief Filling modulation info in mac ue cfg
11175 * Function : duFillModulationDetails
11177 * Functionality: Filling modulation info in mac ue cfg
11179 * @params[in] MAC UE Config to be updated
11180 * Current UE configuration
11181 * UE NR capability from CU
11182 * @return ROK - success
11183 * RFAILED - failure
11185 * ****************************************************************/
11186 void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
11188 UE_NR_Capability_t *ueNrCap=NULLP;
11190 if(!ueCap && oldUeCfg)
11192 memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
11193 memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
11197 ueNrCap = (UE_NR_Capability_t *)ueCap;
11199 /* Filling DL modulation info */
11200 if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
11201 ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
11202 ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
11204 switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
11206 case ModulationOrder_qpsk:
11208 ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
11211 case ModulationOrder_qam16:
11213 ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
11216 case ModulationOrder_qam64:
11218 ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
11219 ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
11220 ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
11223 case ModulationOrder_qam256:
11225 ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
11230 DU_LOG("\nERROR --> DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
11232 memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
11240 memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
11243 /* Filling UL modulation info */
11244 if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
11245 ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
11246 ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
11248 switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
11250 case ModulationOrder_qpsk:
11252 ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
11255 case ModulationOrder_qam16:
11257 ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
11258 ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
11259 ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
11262 case ModulationOrder_qam64:
11264 ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
11267 case ModulationOrder_qam256:
11269 ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
11274 DU_LOG("\nERROR --> DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
11276 memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
11284 memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
11289 /*******************************************************************
11291 * @brief Function to extract info from CU to DU RRC container extension
11295 * Function : extractCuToDuRrcInfoExt
11297 * Functionality: Function to extract info from CU to DU RRC container
11300 * @params[in] ProtocolExtensionContainer_4624P16_t pointer
11305 * ****************************************************************/
11306 uint8_t extractCuToDuRrcInfoExt(ProtocolExtensionContainer_4624P16_t *protocolIeExtn, DuUeCfg *ueCfgDb)
11309 uint16_t recvBufLen =0;
11310 CellGroupConfigRrc_t *cellGrpCfg = NULLP;
11311 CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
11312 asn_dec_rval_t rval; /* Decoder return value */
11313 memset(&rval, 0, sizeof(asn_dec_rval_t));
11317 for(ieIdx = 0; ieIdx < protocolIeExtn->list.count; ieIdx++)
11319 extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[ieIdx]));
11320 switch(extIeInfo->id)
11322 case ProtocolIE_ID_id_CellGroupConfig:
11324 /* decoding the CellGroup Buf received */
11325 recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
11326 DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
11329 memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
11330 rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
11331 extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
11332 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
11334 DU_LOG("\nERROR --> F1AP : ASN decode failed at decodeCellGrpCfg()");
11337 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
11339 if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
11341 ueCfgDb->cellGrpCfg = cellGrpCfg;
11346 case ProtocolIE_ID_id_HandoverPreparationInformation:
11348 DU_LOG("\nINFO --> F1AP : Received HANDOVER PREPARATION INFO in UE CONTEXT SETUP REQUEST");
11353 DU_LOG("\nERROR --> F1AP : Invalid IE received CUtoDURRCInformation: %ld at decodeCellGrpCfg()", extIeInfo->id);
11361 /*******************************************************************
11363 * @brief Fills Srb List received by CU
11367 * Function : procSrbListToSetup
11369 * Functionality: Fills Srb List received by CU
11371 * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
11373 * RlcBearerCfg pointer
11376 * ****************************************************************/
11377 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
11380 /* Filling RLC INFO */
11381 procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd, NULL);
11383 /* Filling MAC INFO */
11384 if(procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, NULL, macLcToAdd, NULL) != ROK)
11386 DU_LOG("\nERROR --> F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
11395 /*******************************************************************
11397 * @brief extract Srb List received by CU
11401 * Function : extractSrbListToSetup
11403 * Functionality: extract Srb List received by CU
11404 * for both MAC and RLC
11406 * @params[in] SRBs_ToBeSetup_Item_t pointer
11408 * @return ROK/RFAIED
11410 * ****************************************************************/
11412 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
11414 uint8_t ret = ROK, srbIdx = 0, rlcLcIdx = 0;
11415 SRBs_ToBeSetup_Item_t *srbItem = NULLP;
11416 LcCfg *macLcCtxt = NULLP;
11417 RlcBearerCfg *rlcLcCtxt = NULLP;
11421 for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
11426 srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
11427 if(ueCfgDb->numMacLcs > MAX_NUM_LC)
11429 DU_LOG("\nERROR --> F1AP: MAX LC Reached in MAC");
11433 if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
11435 DU_LOG("\nERROR --> F1AP: MAX LC Reached in RLC");
11440 for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numMacLcs; rlcLcIdx++)
11442 if(ueCfgDb->rlcLcCfg[rlcLcIdx].rbId == srbItem->sRBID && ueCfgDb->rlcLcCfg[rlcLcIdx].rbType == RB_TYPE_SRB)
11444 macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx];
11445 rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx];
11451 memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
11452 macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs];
11453 ueCfgDb->numMacLcs++;
11457 memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
11458 rlcLcCtxt = &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs];
11459 ueCfgDb->numRlcLcs++;
11462 ret = procSrbListToSetup(srbItem, macLcCtxt, rlcLcCtxt);
11464 DU_LOG("\nDEBUG --> DUAPP: extractSrbListToSetup: SRBID: %ld [RLC,MAC,NumDrb]:[%x,%x,%x]",\
11465 srbItem->sRBID, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb);
11468 DU_LOG("\nERROR --> F1AP: Failed at extractSrbListToSetup()");
11479 /*******************************************************************
11481 * @brief Fills Drb List received by CU
11485 * Function : procDrbListToSetupMod
11487 * Functionality: Fills Drb List received by CU
11488 * for both MAC and RLC
11490 * @params[in] DRBs_ToBeSetup_Item_t , DRBs_ToBeSetupMod_Item_t,
11491 * DRBs_ToBeModified_Item_t , lcId, LcCfg pointer,
11492 * RlcBearerCfg , UpTnlCfg, RlcUeCfg
11495 * ****************************************************************/
11497 uint8_t procDrbListToSetupMod(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\
11498 DRBs_ToBeSetupMod_Item_t *drbSetupModItem, DRBs_ToBeModified_Item_t *drbModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo, RlcUeCfg *storedRlcUeCfg)
11500 uint8_t cfgIdx = 0;
11501 RlcMode rlcModeInfo;
11503 if(drbItem != NULLP)
11505 /* Filling RLC INFO */
11506 procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd, &drbItem->\
11509 /* Filling MAC INFO */
11510 if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, NULL, macLcToAdd, upTnlInfo) != ROK)
11512 DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()");
11516 else if(drbSetupModItem != NULLP)
11518 procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd,
11519 &drbSetupModItem->qoSInformation);
11521 if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK)
11523 DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()");
11527 else if(drbModItem != NULLP)
11529 /* Drb to Mod IEs doesnot have rlcMode to be modified
11530 * in ASN. Hence no change in RLC configurations */
11531 if(storedRlcUeCfg != NULLP)
11533 for(cfgIdx = 0; cfgIdx < storedRlcUeCfg->numLcs; cfgIdx++)
11535 if(storedRlcUeCfg->rlcLcCfg[cfgIdx].lcId == lcId)
11537 rlcModeInfo = storedRlcUeCfg->rlcLcCfg[cfgIdx].rlcMode;
11543 procRlcLcCfg(drbModItem->dRBID, lcId, RB_TYPE_DRB, rlcModeInfo, CONFIG_MOD, NULL, rlcLcToAdd, drbModItem->qoSInformation);
11544 if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_MOD, NULL, NULL, drbModItem, NULL, macLcToAdd, upTnlInfo) != ROK)
11546 DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetupMod()");
11553 /*******************************************************************
11555 * @brief extract Drb List received by CU
11559 * Function : extractDrbListToSetupMod
11561 * Functionality: extract Drb List received by CU
11562 * for both MAC and RLC
11564 * @params[in] DRBs_ToBeSetup_Item_t pointer
11566 * @return ROK/RFAIED
11568 * ****************************************************************/
11570 uint8_t extractDrbListToSetupMod(DRBs_ToBeSetup_List_t *drbCfg, DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\
11571 DRBs_ToBeModified_List_t *drbModCfg, uint8_t drbCount, DuUeCfg *ueCfgDb, uint32_t *drbBitMap, RlcUeCfg *rlcUeCfg)
11574 uint8_t drbIdx = 0, rlcLcIdx = 0;
11575 uint8_t drbId = 0, lcId = 0;
11576 DRBs_ToBeSetup_Item_t *drbItem = NULLP;
11577 DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP;
11578 DRBs_ToBeModified_ItemIEs_t *drbModItem = NULLP;
11579 LcCfg *macLcCtxt = NULLP;
11580 RlcBearerCfg *rlcLcCtxt = NULLP;
11585 for(drbIdx = 0; drbIdx < drbCount; drbIdx++)
11590 if(ueCfgDb->numMacLcs > MAX_NUM_LC)
11592 DU_LOG("\nERROR --> F1AP : MAX LC Reached in MAC at extractDrbListToSetupMod()");
11596 if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
11598 DU_LOG("\nERROR --> F1AP : MAX LC Reached in RLC at extractDrbListToSetupMod()");
11603 if(drbModCfg != NULLP)
11605 drbModItem = (DRBs_ToBeModified_ItemIEs_t *) drbModCfg->list.array[drbIdx];
11606 drbId = drbModItem->value.choice.DRBs_ToBeModified_Item.dRBID;
11608 else if(drbCfg != NULLP)
11609 drbId = drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item.dRBID;
11610 else if(drbSetupModCfg != NULL)
11612 drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx];
11613 drbId = drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item.dRBID;
11616 for(rlcLcIdx = 0; rlcLcIdx < ueCfgDb->numRlcLcs; rlcLcIdx++)
11618 if(ueCfgDb->rlcLcCfg[rlcLcIdx].rbId == drbId && ueCfgDb->rlcLcCfg[rlcLcIdx].rbType == RB_TYPE_DRB)
11620 macLcCtxt = &ueCfgDb->macLcCfg[rlcLcIdx];
11621 rlcLcCtxt = &ueCfgDb->rlcLcCfg[rlcLcIdx];
11627 memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
11628 macLcCtxt = &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs];
11629 ueCfgDb->numMacLcs++;
11633 memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
11634 rlcLcCtxt = &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs];
11635 ueCfgDb->numRlcLcs++;
11638 if(drbModCfg != NULLP)
11640 lcId = fetchLcId(drbId);
11641 if(lcId < MIN_DRB_LCID)
11643 DU_LOG("\nERROR --> F1AP : Failed fetching LCID %d in extractDrbListToSetupMod() for Modified List", lcId);
11646 ret = procDrbListToSetupMod(lcId, NULL, NULL, &(drbModItem->value.choice.DRBs_ToBeModified_Item),\
11647 macLcCtxt, rlcLcCtxt, &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg);
11650 DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for Modified List");
11656 lcId = getDrbLcId(drbBitMap);
11657 if(lcId == RFAILED)
11659 DU_LOG("\nERROR --> F1AP : InCorrect LCID extractDrbListToSetupMod()");
11665 drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
11666 ret = procDrbListToSetupMod(lcId, drbItem, NULL, NULL, macLcCtxt, rlcLcCtxt, &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg);
11669 DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for DrbSetup List");
11673 else if(drbSetupModCfg != NULL)
11675 ret = procDrbListToSetupMod(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item), NULL,\
11676 macLcCtxt, rlcLcCtxt, &ueCfgDb->upTnlInfo[ueCfgDb->numDrb], rlcUeCfg);
11679 DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod() for DrbSetupMod List");
11682 ueCfgDb->numDrbSetupMod++;
11687 DU_LOG("\nDEBUG --> DUAPP: extractDrbListToSetupMod:lcId:%x ,BitMap:%x, [RLC,MAC,NumDrb]:[%x,%x,%x]",\
11688 lcId,*drbBitMap, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs, ueCfgDb->numDrb);
11691 DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetupMod()");
11702 /*******************************************************************
11704 * @brief Function to extract Dl RRC Msg received from CU
11708 * Function : extractDlRrcMsg
11710 * Functionality: Function to extract Dl RRC Msg received from CU
11712 * @params[in] F1AP message
11713 * @return ROK - success
11714 * RFAILED - failure
11716 * ****************************************************************/
11718 uint8_t extractDlRrcMsg(uint32_t gnbDuUeF1apId, uint32_t gnbCuUeF1apId, \
11719 F1DlRrcMsg *dlRrcMsg, RRCContainer_t *rrcContainer)
11722 dlRrcMsg->rrcMsgSize = rrcContainer->size;
11723 if(dlRrcMsg->rrcMsgSize > 0)
11725 DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
11726 if(!dlRrcMsg->rrcMsgPdu)
11728 DU_LOG("\nERROR --> DU APP : Memory allocation failed for RRC Msg in extractDlRrcMsg()");
11733 dlRrcMsg->gnbDuUeF1apId = gnbDuUeF1apId;
11734 dlRrcMsg->gnbCuUeF1apId = gnbCuUeF1apId;
11735 dlRrcMsg->srbId = SRB1_LCID;
11736 memcpy(dlRrcMsg->rrcMsgPdu, rrcContainer->buf, dlRrcMsg->rrcMsgSize);
11742 /*******************************************************************
11744 * @brief Extract UE capability info
11748 * Function : extractUeCapability
11750 * Functionality: Extract UE capability info and stores in ue Cb
11752 * @params[in] Octet string of UE capability RAT container list
11753 * @return ROK - success
11754 * RFAILED - failure
11756 * ****************************************************************/
11757 UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf, DuUeCb *ueCb)
11760 uint16_t recvBufLen;
11761 asn_dec_rval_t rval;
11762 UE_NR_Capability_t *ueNrCap = NULLP;
11763 UE_CapabilityRAT_ContainerListRRC_t *ueCapRatContList = NULLP;
11765 /* Decoding UE Capability RAT Container List */
11766 recvBufLen = ueCapablityListBuf->size;
11767 DU_ALLOC(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
11768 if(!ueCapRatContList)
11770 DU_LOG("\nERROR --> F1AP : Memory allocation failed in extractUeCapability");
11773 memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
11774 memset(&rval, 0, sizeof(asn_dec_rval_t));
11775 rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList,
11776 ueCapablityListBuf->buf, recvBufLen, 0, 0);
11777 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
11779 DU_LOG("\nERROR --> F1AP : ASN decode failed at decodeCellGrpCfg()");
11782 xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, ueCapRatContList);
11784 /* Free encoded buffer after decoding */
11786 for(idx = 0; idx < ueCapRatContList->list.count; idx++)
11788 if(ueCapRatContList->list.array[idx]->rat_Type == RAT_Type_nr)
11790 /* Decoding UE NR Capability */
11791 recvBufLen = ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.size;
11792 DU_ALLOC(ueNrCap, sizeof(UE_NR_Capability_t));
11795 DU_LOG("\nERROR --> F1AP : Memory allocation failed in extractUeCapability");
11796 DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
11799 memset(ueNrCap, 0, sizeof(UE_NR_Capability_t));
11800 memset(&rval, 0, sizeof(asn_dec_rval_t));
11801 rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap,
11802 ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0);
11803 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
11805 DU_LOG("\nERROR --> F1AP : ASN decode failed at decodeCellGrpCfg()");
11808 xer_fprint(stdout, &asn_DEF_UE_NR_Capability, ueNrCap);
11810 /* Free encoded buffer after decoding */
11811 free(ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf);
11813 free(ueCapRatContList->list.array[idx]);
11817 free(ueCapRatContList->list.array);
11818 DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
11822 /*******************************************************************
11824 * @brief free UE context setup request from CU
11828 * Function : freeAperDecodeF1UeContextSetupReq
11830 * Functionality: freeing part for the memory allocated by aper_decoder
11832 * @params[in] F1AP message
11833 * @return ROK - success
11834 * RFAILED - failure
11836 * ****************************************************************/
11837 void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t *ueSetReq)
11841 if(ueSetReq->protocolIEs.list.array != NULLP)
11843 for(ieIdx = 0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++)
11845 if(ueSetReq->protocolIEs.list.array[ieIdx])
11847 switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
11849 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11851 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11853 case ProtocolIE_ID_id_SpCell_ID:
11854 freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
11856 case ProtocolIE_ID_id_ServCellIndex:
11858 case ProtocolIE_ID_id_SpCellULConfigured:
11860 case ProtocolIE_ID_id_CUtoDURRCInformation:
11862 freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation);
11864 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
11866 freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List);
11868 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
11870 freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List);
11872 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
11874 freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List);
11876 case ProtocolIE_ID_id_RRCContainer:
11879 if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP)
11882 free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
11886 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
11888 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
11890 if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf)
11892 free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf);
11897 DU_LOG("\nERROR --> F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id);
11899 free(ueSetReq->protocolIEs.list.array[ieIdx]);
11902 free(ueSetReq->protocolIEs.list.array);
11905 /*******************************************************************
11907 * @brief Process UE context setup request from CU
11911 * Function : procF1UeContextSetupReq
11913 * Functionality: Process UE context setup request from CU
11915 * @params[in] F1AP message
11916 * @return ROK - success
11917 * RFAILED - failure
11919 * ****************************************************************/
11920 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
11923 uint8_t ret=0, ieIdx=0, ieExtIdx = 0, servCellIdx = 0;
11924 bool ueCbFound = false, hoInProgress = false;
11925 uint16_t nrCellId = 0, cellIdx=0;
11926 uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0;
11927 DuUeCb *duUeCb = NULL;
11928 UEContextSetupRequest_t *ueSetReq = NULL;
11929 DRBs_ToBeSetup_List_t *drbCfg = NULL;
11930 CUtoDURRCInformation_t *rrcInfo = NULL;
11934 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
11935 for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
11937 switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
11939 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11941 gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
11945 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11947 gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
11951 case ProtocolIE_ID_id_SpCell_ID:
11953 bitStringToInt(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity, &nrCellId);
11955 GET_CELL_IDX(nrCellId, cellIdx);
11956 if(!duCb.actvCellLst[cellIdx])
11958 DU_LOG("\nERROR --> F1AP : Cell Id [%d] not found", nrCellId);
11964 case ProtocolIE_ID_id_ServCellIndex:
11966 servCellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
11970 case ProtocolIE_ID_id_SpCellULConfigured:
11972 /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL,
11973 UL, SUL or UL+SUL for the indicated cell for the UE */
11977 case ProtocolIE_ID_id_CUtoDURRCInformation:
11979 rrcInfo = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation;
11981 /* Search if UE context is present */
11982 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
11984 if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)
11987 duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
11992 /* Check if UE Handover scenario */
11993 if(rrcInfo->iE_Extensions)
11995 for(ieExtIdx = 0; ieExtIdx < rrcInfo->iE_Extensions->list.count; ieExtIdx++)
11997 if(rrcInfo->iE_Extensions->list.array[ieExtIdx]->id == ProtocolIE_ID_id_HandoverPreparationInformation)
11999 hoInProgress = true;
12005 /* If UE context is not present, but UE is in handover */
12006 if(!ueCbFound && hoInProgress)
12008 ueIdx = getFreeBitFromUeBitMap(nrCellId);
12010 gnbDuUeF1apId = ueIdx +1;
12013 DU_LOG("\nERROR --> F1AP : No free UE IDX found in UE bit map of cell Id [%d]", nrCellId);
12017 duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
12018 duUeCb->f1UeDb = NULL;
12019 duUeCb->gnbCuUeF1apId = gnbCuUeF1apId;
12020 duUeCb->gnbDuUeF1apId = gnbDuUeF1apId;
12021 GET_CRNTI(duUeCb->crnti, duUeCb->gnbDuUeF1apId);
12022 duUeCb->ueState = UE_HANDIN_IN_PROGRESS;
12027 DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
12030 memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
12031 duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
12032 duUeCb->f1UeDb->cellIdx = cellIdx;
12036 DU_LOG("\nERROR --> F1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
12043 DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
12048 /* Extract UE capability info */
12049 if(rrcInfo->uE_CapabilityRAT_ContainerList)
12051 duUeCb->f1UeDb->duUeCfg.ueNrCapability = extractUeCapability(rrcInfo->uE_CapabilityRAT_ContainerList, duUeCb);
12054 /* Extract IE extension */
12055 if(rrcInfo->iE_Extensions)
12057 if(extractCuToDuRrcInfoExt(rrcInfo->iE_Extensions, &duUeCb->f1UeDb->duUeCfg) != ROK)
12059 DU_LOG("\nERROR --> F1AP: Failed to extract CU to DU RRC information extension IE");
12060 //TODO: Update the failure cause in ue context Setup Response
12067 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
12069 DU_LOG("\nINFO --> DU_APP: Received SCell_ToBeSetup_List but Not processing the list");
12073 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
12075 if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
12076 &duUeCb->f1UeDb->duUeCfg))
12078 DU_LOG("\nERROR --> DU APP : Failed at extractSrbListToSetup()");
12079 //TODO: Update the failure cause in ue context Setup Response
12085 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
12087 drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List;
12089 if(extractDrbListToSetupMod(drbCfg, NULL, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, NULLP))
12091 DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod()");
12092 //TODO: Update the failure cause in ue context Setup Response
12098 case ProtocolIE_ID_id_RRCContainer:
12100 /* Filling Dl RRC Msg Info */
12101 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
12102 if(!duUeCb->f1UeDb->dlRrcMsg)
12104 DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
12109 duUeCb->f1UeDb->dlRrcMsgPres = true;
12110 memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
12111 ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
12112 &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
12117 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
12119 if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
12121 duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
12125 DU_LOG("\nERROR --> Ignoring delivery report, since rrcContainer is not present");
12130 case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
12132 /* MaximumBitRate Uplink */
12133 bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
12134 if(bitRateSize > 0)
12136 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
12137 if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
12139 DU_LOG("\nERROR --> DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
12144 memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg));
12145 memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
12146 ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
12158 } /* End of switch */
12160 /* In case of any failure in any IE */
12163 // BuildAndSendUeContextSetupRsp(cellId,ueId);
12164 DU_LOG("\nERROR --> F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()");
12167 } /* End of for loop of IEs */
12170 ret = duProcUeContextSetupRequest(duUeCb);
12172 freeAperDecodeF1UeContextSetupReq(ueSetReq);
12176 /*******************************************************************
12177 * @brief Free the memory allocated for Dl Tunnel Info
12181 * Function : freeDlTnlInfo
12184 * Free the memory allocated for Dl Tunnel Info
12186 * @params[in] DLUPTNLInformation_ToBeSetup_List_t *
12189 * ****************************************************************/
12191 void freeDlTnlInfo(DLUPTNLInformation_ToBeSetup_List_t *tnlInfo)
12193 uint8_t arrIdx = 0;
12197 for(arrIdx=0; arrIdx < tnlInfo->list.count; arrIdx++)
12199 DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf,\
12200 tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
12201 DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf,\
12202 tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
12203 DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
12204 DU_FREE(tnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
12206 DU_FREE(tnlInfo->list.array, tnlInfo->list.size);
12210 /*******************************************************************
12211 * @brief Free the memory allocated for DRB setup List
12215 * Function : freeDrbSetupList
12218 * Free the memory allocated for DRB setup list
12220 * @params[in] DRBs_Setup_List_t *
12223 * ****************************************************************/
12224 void freeDrbSetupList(DRBs_Setup_List_t *drbSetupList)
12226 uint8_t arrIdx = 0;
12227 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
12229 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
12231 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
12232 freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
12233 DU_FREE(drbSetupList->list.array[arrIdx], sizeof(DRBs_Setup_Item_t));
12235 DU_FREE(drbSetupList->list.array, drbSetupList->list.size);
12238 /*******************************************************************
12239 * @brief Free the memory allocated for UE Setup response
12243 * Function : FreeUeContextSetupRsp
12246 * Free the memory allocated for UE Setup response
12248 * @params[in] F1AP PDU for UE setup response
12249 * @return ROK - success
12250 * RFAILED - failure
12252 * ****************************************************************/
12253 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
12256 UEContextSetupResponse_t *ueSetRsp = NULLP;
12260 if(f1apMsg->choice.successfulOutcome)
12262 ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
12263 UEContextSetupResponse;
12264 if(ueSetRsp->protocolIEs.list.array)
12266 for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
12268 if(ueSetRsp->protocolIEs.list.array[idx])
12270 switch(ueSetRsp->protocolIEs.list.array[idx]->id)
12272 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12274 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12276 case ProtocolIE_ID_id_DUtoCURRCInformation:
12278 CellGroupConfig_t *cellGrpCfg = NULLP;
12279 cellGrpCfg = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
12280 DUtoCURRCInformation.cellGroupConfig;
12281 if(cellGrpCfg->buf != NULLP)
12283 DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
12284 cellGrpCfg = NULLP;
12288 case ProtocolIE_ID_id_DRBs_Setup_List:
12290 freeDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
12294 DU_LOG("\nERROR --> DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
12295 ueSetRsp->protocolIEs.list.array[idx]->id);
12298 DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
12299 sizeof(UEContextSetupResponseIEs_t));
12302 DU_FREE(ueSetRsp->protocolIEs.list.array, \
12303 ueSetRsp->protocolIEs.list.size);
12305 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12307 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12311 /*******************************************************************
12313 * @brief Builds Ue context Setup Rsp DU To CU Info
12317 * Function : EncodeUeCntxtDuToCuInfo
12319 * Functionality: Builds Ue context Setup Rsp DU To CU Info
12321 * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t *
12323 * @return ROK - success
12324 * RFAILED - failure
12326 ******************************************************************/
12328 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
12330 asn_enc_rval_t encRetVal;
12332 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
12333 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
12335 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
12336 /* Encode results */
12337 if(encRetVal.encoded == ENCODE_FAIL)
12339 DU_LOG( "\nERROR --> F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
12340 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12345 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
12346 for(int i=0; i< encBufSize; i++)
12348 printf("%x",encBuf[i]);
12351 duToCuCellGrp->size = encBufSize;
12352 DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
12353 if(!duToCuCellGrp->buf)
12355 DU_LOG("\nERROR --> F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
12357 memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
12361 /*******************************************************************
12363 * @brief Fills Dl Gtp tunnel Info
12367 * Function : fillGtpTunnelforDl
12369 * Functionality: Fills Dl Gtp tunnel Info
12373 * @return ROK - success
12374 * RFAILED - failure
12376 * ****************************************************************/
12378 uint8_t fillGtpTunnelforDl(GTPTunnel_t *gtpDl, GtpTnlCfg *gtpUeCfg)
12380 uint8_t bufSize = 0;
12382 gtpDl->transportLayerAddress.size = 4*sizeof(uint8_t);
12383 DU_ALLOC(gtpDl->transportLayerAddress.buf, gtpDl->transportLayerAddress.size);
12384 if(gtpDl->transportLayerAddress.buf == NULLP)
12388 memcpy(gtpDl->transportLayerAddress.buf, >pUeCfg->dlTnlAddress, gtpDl->transportLayerAddress.size);
12391 gtpDl->gTP_TEID.size = 4 * sizeof(uint8_t);
12392 DU_ALLOC(gtpDl->gTP_TEID.buf, gtpDl->gTP_TEID.size);
12393 if(gtpDl->gTP_TEID.buf == NULLP)
12397 bufSize = 3; /*forming an Octect String*/
12398 fillTeIdString(bufSize, gtpUeCfg->teId, gtpDl->gTP_TEID.buf);
12403 /*******************************************************************
12405 * @brief Fills DL Tunnel Setup List
12409 * Function : fillDlTnlSetupList
12411 * Functionality: Fills the DL Tunnel Setup List
12415 * @return ROK - success
12416 * RFAILED - failure
12418 * ****************************************************************/
12420 uint8_t fillDlTnlSetupList(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo, UpTnlCfg *tnlCfg)
12422 uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
12425 dlTnlInfo->list.count = eleCount;
12426 dlTnlInfo->list.size = (eleCount * sizeof(DLUPTNLInformation_ToBeSetup_Item_t *));
12428 /* Initialize the DL Tnl Setup List Members */
12429 DU_ALLOC(dlTnlInfo->list.array, dlTnlInfo->list.size);
12430 if(dlTnlInfo->list.array == NULLP)
12432 DU_LOG(" ERROR --> F1AP : Memory allocation for DL Tnl Setup List in fillDlTnlSetupList()");
12435 for(arrIdx=0; arrIdx < eleCount; arrIdx++)
12437 DU_ALLOC(dlTnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
12438 if(dlTnlInfo->list.array[arrIdx] == NULLP)
12440 DU_LOG(" ERROR --> F1AP : Memory allocation for arrIdx [%d] failed in fillDlTnlSetupList()", arrIdx);
12443 dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
12444 DU_ALLOC(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
12445 if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel == NULLP)
12447 DU_LOG(" ERROR --> F1AP : Memory allocation for DL tunnel info in fillDlTnlSetupList()");
12450 ret = fillGtpTunnelforDl(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel,\
12458 /*******************************************************************
12460 * @brief Fills the Drb Setup List for Ue Context Setup Response
12464 * Function : fillDrbSetupList
12466 * Functionality: Fills the Drb Setup List for Ue Context Setup Response
12470 * @return ROK - success
12471 * RFAILED - failure
12473 * ****************************************************************/
12474 uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg)
12476 uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
12477 DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
12479 eleCount = ueCfg->numDrb;
12480 drbSetupList->list.count = eleCount;
12481 drbSetupList->list.size = \
12482 (eleCount * sizeof(DRBs_Setup_Item_t *));
12484 /* Initialize the Drb Setup List Members */
12485 DU_ALLOC(drbSetupList->list.array, drbSetupList->list.size);
12486 if(drbSetupList->list.array == NULLP)
12488 DU_LOG(" ERROR --> F1AP : Memory allocation for DRB Setup List in fillDrbSetupList()");
12492 for(arrIdx=0; arrIdx < eleCount; arrIdx++)
12494 DU_ALLOC(drbSetupList->list.array[arrIdx], sizeof(DRBs_Setup_Item_t));
12495 if(drbSetupList->list.array[arrIdx] == NULLP)
12497 DU_LOG(" ERROR --> F1AP : Memory allocation for arrIdx [%d] failed in fillDrbSetupList()", arrIdx);
12500 drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
12501 drbItemIe->id = ProtocolIE_ID_id_DRBs_Setup_Item;
12502 drbItemIe->criticality = Criticality_reject;
12503 drbItemIe->value.present = DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
12504 drbItemIe->value.choice.DRBs_Setup_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
12505 ret = fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List,\
12506 &ueCfg->upTnlInfo[arrIdx]);
12513 /*******************************************************************
12515 * @brief Builds and sends the UE Setup Response
12519 * Function : BuildAndSendUeContextSetupRsp
12521 * Functionality: Constructs the UE Setup Response and sends
12522 * it to the DU through SCTP.
12524 * @params[in] uint8_t cellId,uint8_t ueId
12526 * @return ROK - success
12527 * RFAILED - failure
12529 * ****************************************************************/
12530 uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueId)
12532 uint8_t idx, ret, cellIdx, elementCnt;
12533 uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */
12534 uint32_t gnbDuUeF1apId; /* gNB-DU UE F1AP Id */
12535 asn_enc_rval_t encRetVal; /* Encoder return value */
12536 F1AP_PDU_t *f1apMsg = NULLP;
12537 UEContextSetupResponse_t *ueSetRsp = NULLP;
12538 DuUeCb *ueCb = NULLP;
12540 DU_LOG("\n INFO --> F1AP : Building UE Context Setup Response for cellId %d, ueId %d\n", cellId, ueId);
12544 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12545 if(f1apMsg == NULLP)
12547 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
12552 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
12553 DU_ALLOC(f1apMsg->choice.successfulOutcome,
12554 sizeof(SuccessfulOutcome_t));
12555 if(f1apMsg->choice.successfulOutcome == NULLP)
12557 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
12562 f1apMsg->choice.successfulOutcome->procedureCode = \
12563 ProcedureCode_id_UEContextSetup;
12564 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
12565 f1apMsg->choice.successfulOutcome->value.present = \
12566 SuccessfulOutcome__value_PR_UEContextSetupResponse;
12569 &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
12571 ueSetRsp->protocolIEs.list.count = elementCnt;
12572 ueSetRsp->protocolIEs.list.size = \
12573 elementCnt * sizeof(UEContextSetupResponse_t *);
12575 /* Initialize the UESetup members */
12576 DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
12577 ueSetRsp->protocolIEs.list.size);
12578 if(ueSetRsp->protocolIEs.list.array == NULLP)
12580 DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed");
12585 for(idx=0; idx<elementCnt; idx++)
12587 DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
12588 sizeof(UEContextSetupResponseIEs_t));
12589 if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
12591 DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed");
12596 /* Fetching Ue Cb Info*/
12597 GET_CELL_IDX(cellId, cellIdx);
12598 gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
12599 gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
12600 ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
12603 /*GNB CU UE F1AP ID*/
12604 ueSetRsp->protocolIEs.list.array[idx]->id = \
12605 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
12606 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
12607 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
12608 UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
12609 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
12611 /*GNB DU UE F1AP ID*/
12613 ueSetRsp->protocolIEs.list.array[idx]->id = \
12614 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
12615 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
12616 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
12617 UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
12618 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
12621 /*DUtoCURRC Information */
12623 ueSetRsp->protocolIEs.list.array[idx]->id = \
12624 ProtocolIE_ID_id_DUtoCURRCInformation;
12625 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
12626 ueSetRsp->protocolIEs.list.array[idx]->value.present =\
12627 UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
12628 BuildCellGroupConfigRrc(ueCb, &ueSetRsp->protocolIEs.list.array[idx]->value.choice.DUtoCURRCInformation.cellGroupConfig);
12632 ueSetRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_C_RNTI;
12633 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
12634 ueSetRsp->protocolIEs.list.array[idx]->value.present = UEContextSetupResponseIEs__value_PR_C_RNTI;
12635 ueSetRsp->protocolIEs.list.array[idx]->value.choice.C_RNTI = ueCb->crnti;
12638 /* Drb Setup List */
12640 ueSetRsp->protocolIEs.list.array[idx]->id = \
12641 ProtocolIE_ID_id_DRBs_Setup_List;
12642 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
12643 ueSetRsp->protocolIEs.list.array[idx]->value.present =\
12644 UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
12645 ret = fillDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List,\
12646 &ueCb->f1UeDb->duUeCfg);
12649 DU_LOG("\nERROR --> F1AP : Failed to fillDrbSetupList in BuildAndSendUeContextSetupRsp()");
12650 freeF1UeDb(ueCb->f1UeDb);
12651 ueCb->f1UeDb = NULLP;
12655 /* Free UeContext Db created during Ue context Req */
12656 freeF1UeDb(ueCb->f1UeDb);
12657 ueCb->f1UeDb = NULLP;
12659 /* TODO: To send Drb list */
12660 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12662 /* Encode the UE context setup response type as APER */
12663 memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
12665 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12667 /* Encode results */
12668 if(encRetVal.encoded == ENCODE_FAIL)
12670 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\
12671 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12677 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Setup Response\n");
12678 for(int i=0; i< encBufSize; i++)
12680 printf("%x",encBuf[i]);
12685 if(sendF1APMsg() != ROK)
12687 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Response failed");
12693 FreeUeContextSetupRsp(f1apMsg);
12695 }/* End of BuildAndSendUeContextSetupRsp */
12696 /*******************************************************************
12698 * @brief Build And Send Ue Context Rsp
12702 * Function : BuildAndSendUeCtxtRsp
12704 * Functionality : Build And Send Ue Context Rsp
12707 * @return sucess = ROK
12708 * failure = RFAILED
12710 * ****************************************************************/
12711 uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueId)
12713 uint8_t cellIdx = 0, actionType = 0;
12715 GET_CELL_IDX(cellId, cellIdx);
12716 actionType = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].f1UeDb->actionType;
12720 case UE_CTXT_SETUP:
12722 if((BuildAndSendUeContextSetupRsp(cellId,ueId)) != ROK)
12724 DU_LOG("\nERROR --> F1AP : Failed at BuildAndSendUeContextSetupRsp()");
12731 if((BuildAndSendUeContextModRsp(&duCb.actvCellLst[cellIdx]->ueCb[ueId-1])) != ROK)
12733 DU_LOG("\nERROR --> F1AP : Failed at BuildAndSendUeContextModRsp");
12739 DU_LOG("ERROR --> F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
12746 /*******************************************************************
12748 * @brief deallocating the memory of F1reset msg
12752 * Function : FreeF1ResetReq
12755 * - freeing memory of F1reset request msg
12761 * ****************************************************************/
12762 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
12765 Reset_t *f1ResetMsg;
12769 if(f1apMsg->choice.initiatingMessage)
12771 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
12773 if(f1ResetMsg->protocolIEs.list.array)
12775 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
12777 if(f1ResetMsg->protocolIEs.list.array[idx])
12779 DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
12782 DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
12784 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12786 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12789 /*******************************************************************
12791 * @brief Build and Send F1reset request
12795 * Function : BuildAndSendF1ResetReq
12798 * - Build and Send F1reset request msg
12801 * @return ROK - success
12802 * RFAILED - failure
12804 * ****************************************************************/
12805 uint8_t BuildAndSendF1ResetReq()
12807 uint8_t elementCnt=0;
12809 uint8_t ret= RFAILED;
12810 Reset_t *f1ResetMsg = NULLP;
12811 F1AP_PDU_t *f1apMsg = NULLP;
12812 asn_enc_rval_t encRetVal;
12813 DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
12816 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12817 if(f1apMsg == NULLP)
12821 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12822 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12823 if(f1apMsg->choice.initiatingMessage == NULLP)
12827 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
12828 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12829 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
12831 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
12834 f1ResetMsg->protocolIEs.list.count = elementCnt;
12835 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
12837 /* Initialize the F1Setup members */
12838 DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
12839 if(f1ResetMsg->protocolIEs.list.array == NULLP)
12843 for(idx=0; idx<elementCnt; idx++)
12845 DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
12846 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
12854 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
12855 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
12856 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
12857 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
12861 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
12862 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
12863 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
12864 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
12865 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
12869 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
12870 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
12871 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
12872 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
12873 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
12875 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12877 /* Encode the F1SetupRequest type as APER */
12878 memset(encBuf, 0, ENC_BUF_MAX_LEN);
12880 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
12883 /* Encode results */
12884 if(encRetVal.encoded == ENCODE_FAIL)
12886 DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
12887 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12892 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
12893 for(idx=0; idx< encBufSize; idx++)
12895 printf("%x",encBuf[idx]);
12899 if(sendF1APMsg() != ROK)
12901 DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
12909 FreeF1ResetReq(f1apMsg);
12912 /*******************************************************************
12914 * @brief Build And Send F1ResetAck
12918 * Function : BuildAndSendF1ResetAck
12921 * - Build And Send F1ResetRSP
12923 * @return ROK - success
12924 * RFAILED - failure
12926 * ****************************************************************/
12927 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
12930 ResetAcknowledge_t *f1ResetAck;
12934 if(f1apMsg->choice.successfulOutcome)
12936 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
12938 if(f1ResetAck->protocolIEs.list.array)
12940 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
12942 if(f1ResetAck->protocolIEs.list.array[idx])
12944 DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
12947 DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
12949 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12951 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12955 /*******************************************************************
12957 * @brief Build And Send F1ResetAck
12961 * Function : BuildAndSendF1ResetAck
12964 * - Build And Send F1ResetRSP
12967 * @return ROK - success
12968 * RFAILED - failure
12970 * ****************************************************************/
12971 uint8_t BuildAndSendF1ResetAck()
12974 uint8_t elementCnt = 0;
12975 uint8_t ret = RFAILED;
12976 F1AP_PDU_t *f1apMsg = NULL;
12977 ResetAcknowledge_t *f1ResetAck = NULLP;
12978 asn_enc_rval_t encRetVal;
12979 DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
12982 /* Allocate the memory for F1ResetRequest_t */
12983 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12984 if(f1apMsg == NULLP)
12986 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
12990 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
12992 DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12993 if(f1apMsg->choice.successfulOutcome == NULLP)
12995 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
12998 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
12999 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
13000 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
13004 f1ResetAck->protocolIEs.list.count = elementCnt;
13005 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
13007 DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
13008 if(f1ResetAck->protocolIEs.list.array == NULLP)
13010 DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
13014 for(idx=0; idx<elementCnt; idx++)
13016 DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
13017 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
13024 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
13025 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
13026 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
13027 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
13029 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
13031 /* Encode the F1SetupRequest type as UPER */
13032 memset(encBuf, 0, ENC_BUF_MAX_LEN);
13034 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
13036 /* Check encode results */
13037 if(encRetVal.encoded == ENCODE_FAIL)
13039 DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
13040 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
13045 DU_LOG("\nDUBUG --> F1AP : Created APER encoded buffer for F1ResetAck\n");
13046 for(int i=0; i< encBufSize; i++)
13048 printf("%x",encBuf[i]);
13052 if(sendF1APMsg() != ROK)
13054 DU_LOG("\nERROR --> F1AP : Sending F1 Reset Acknowledgement failed");
13062 FreeF1ResetAck(f1apMsg);
13065 /******************************************************************
13067 * @brief free F1 reset msg allocated by aper_decoder
13071 * Function : freeAperDecodeF1ResetMsg
13073 * Functionality: free F1 reset msg allocated by aper_decoder
13075 * @params[in] Reset_t *f1ResetMsg
13078 * ****************************************************************/
13080 void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
13083 if(f1ResetMsg->protocolIEs.list.array)
13085 for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
13087 if(f1ResetMsg->protocolIEs.list.array[ieIdx])
13089 free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
13092 free(f1ResetMsg->protocolIEs.list.array);
13096 /******************************************************************
13098 * @brief Processes DL RRC Message Transfer sent by CU
13102 * Function : procF1ResetReq
13104 * Functionality: Processes DL RRC Message Transfer sent by CU
13106 * @params[in] F1AP_PDU_t ASN decoded F1AP message
13107 * @return ROK - success
13108 * RFAILED - failure
13110 * ****************************************************************/
13111 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
13113 /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
13116 Reset_t *f1ResetMsg = NULLP;
13118 DU_LOG("\nINFO --> Processing F1 reset request");
13119 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
13121 for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
13123 switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
13125 case ProtocolIE_ID_id_TransactionID:
13128 case ProtocolIE_ID_id_Cause:
13131 case ProtocolIE_ID_id_ResetType:
13140 ret = BuildAndSendF1ResetAck();
13141 DU_LOG("\nINFO --> UE release is not supported for now");
13143 freeAperDecodeF1ResetMsg(f1ResetMsg);
13148 /*******************************************************************
13150 * @brief free the RRC delivery report
13154 * Function : freeRrcDeliveryReport
13156 * Functionality: free the RRC delivery report
13159 * @return ROK - success
13160 * RFAILED - failure
13162 * ****************************************************************/
13163 void freeRrcDeliveryReport(F1AP_PDU_t *f1apMsg )
13166 RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
13170 if(f1apMsg->choice.initiatingMessage)
13172 rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
13173 if(rrcDeliveryReport->protocolIEs.list.array)
13175 for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
13178 if(rrcDeliveryReport->protocolIEs.list.array[idx])
13180 DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
13181 sizeof(RRCDeliveryReportIEs_t));
13184 DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
13185 rrcDeliveryReport->protocolIEs.list.size);
13187 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
13190 sizeof(F1AP_PDU_t));
13194 /*******************************************************************
13196 * @brief Builds and sends the RRC delivery report
13200 * Function : BuildAndSendRrcDeliveryReport
13202 * Functionality: Builds and sends the RRC delivery report
13206 * @return ROK - success
13207 * RFAILED - failure
13209 * ****************************************************************/
13210 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
13211 uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
13213 uint8_t ret = RFAILED;
13216 uint8_t elementCnt = 0;
13217 F1AP_PDU_t *f1apMsg = NULLP;
13218 asn_enc_rval_t encRetVal;
13219 RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
13223 DU_LOG("\nINFO --> F1AP : Building RRC delivery Message Transfer Message\n");
13224 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
13225 if(f1apMsg == NULLP)
13227 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
13230 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
13231 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
13232 if(f1apMsg->choice.initiatingMessage == NULLP)
13234 DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
13237 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
13238 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
13239 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
13241 rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
13243 rrcDeliveryReport->protocolIEs.list.count = elementCnt;
13244 rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
13246 /* Initialize the F1Setup members */
13247 DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
13248 if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
13250 DU_LOG(" ERROR --> F1AP : Memory allocation for RRC Delivery failed");
13253 for(idx =0 ;idx <elementCnt; idx++)
13255 DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
13256 if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
13264 /*GNB CU UE F1AP ID*/
13265 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
13266 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
13267 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
13268 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
13270 /*GNB DU UE F1AP ID*/
13272 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
13273 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
13274 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
13275 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
13277 /*RRC delivery status*/
13279 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
13280 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
13281 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
13282 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
13283 rrcDelivery->rrcDeliveryStatus.deliveryStatus;
13284 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
13285 rrcDelivery->rrcDeliveryStatus.triggeringMessage;
13289 rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
13290 rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
13291 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
13292 rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID = rrcDelivery->srbId;
13294 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
13296 /* Encode the RRC DELIVERY REPORT type as APER */
13297 memset(encBuf, 0, ENC_BUF_MAX_LEN);
13299 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
13302 /* Encode results */
13303 if(encRetVal.encoded == ENCODE_FAIL)
13305 DU_LOG("\nERROR --> F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
13306 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
13311 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
13312 for(idx=0; idx< encBufSize; idx++)
13314 printf("%x",encBuf[idx]);
13319 if(sendF1APMsg() != ROK)
13321 DU_LOG("\nERROR --> F1AP : Sending RRC delivery msg request failed");
13329 freeRrcDeliveryReport(f1apMsg);
13333 /*******************************************************************
13335 * @brief Processes cells to be activated
13339 * Function : extractCellsToBeActivated
13342 * - Processes cells to be activated list received in F1SetupRsp
13345 * @return ROK - success
13346 * RFAILED - failure
13348 * ****************************************************************/
13350 uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
13353 uint16_t idx, nci, pci = 0;
13354 Cells_to_be_Activated_List_Item_t cell;
13356 for(idx=0; idx<cellsToActivate.list.count; idx++)
13359 cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
13360 bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
13366 ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
13370 /******************************************************************
13372 * @brief Processes F1 Setup Response allocated by aper_decoder
13376 * Function : freeF1SetupRsp
13378 * Functionality: free F1 Setup Response allocated by aper_decoder
13380 * @params[in] F1SetupResponse_t *f1SetRspMsg
13383 * ****************************************************************/
13385 void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
13389 Cells_to_be_Activated_List_t *cellToActivate =NULLP;
13390 RRC_Version_t *rrcVer =NULLP;
13392 if(f1SetRspMsg->protocolIEs.list.array)
13394 for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
13396 if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
13398 switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
13400 case ProtocolIE_ID_id_Cells_to_be_Activated_List:
13403 &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
13404 if(cellToActivate->list.array)
13406 for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
13408 if(cellToActivate->list.array[arrIdx])
13411 if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
13414 if(cellToActivate->list.array[0]->value.choice.\
13415 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
13417 free(cellToActivate->list.array[0]->value.choice.\
13418 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
13421 free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
13422 nRCGI.pLMN_Identity.buf);
13424 free(cellToActivate->list.array[arrIdx]);
13427 free(cellToActivate->list.array);
13431 case ProtocolIE_ID_id_TransactionID:
13435 case ProtocolIE_ID_id_gNB_CU_Name:
13437 free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
13440 case ProtocolIE_ID_id_GNB_CU_RRC_Version:
13442 rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
13443 if(rrcVer->latest_RRC_Version.buf)
13445 if(rrcVer->iE_Extensions)
13447 if(rrcVer->iE_Extensions->list.array)
13449 if(rrcVer->iE_Extensions->list.array[0])
13451 if(rrcVer->iE_Extensions->list.\
13452 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
13454 free(rrcVer->iE_Extensions->list.\
13455 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
13457 free(rrcVer->iE_Extensions->list.array[0]);
13459 free(rrcVer->iE_Extensions->list.array);
13461 free(rrcVer->iE_Extensions);
13463 free(rrcVer->latest_RRC_Version.buf);
13470 DU_LOG("\nERROR --> DU_APP : Invalid IE received in F1SetupRsp:%ld",
13471 f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
13474 free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
13477 free(f1SetRspMsg->protocolIEs.list.array);
13480 /******************************************************************
13482 * @brief Processes F1 Setup Response sent by CU
13486 * Function : procF1SetupRsp
13488 * Functionality: Processes F1 Setup Response sent by CU
13490 * @params[in] F1AP_PDU_t ASN decoded F1AP message
13491 * @return ROK - success
13492 * RFAILED - failure
13494 * ****************************************************************/
13495 uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg, MsgLen recvBufLen, char *recvBuf)
13499 F1SetupResponse_t *f1SetRspMsg = NULLP;
13500 GNB_CU_Name_t *cuName = NULLP;
13501 F1SetupRsp f1SetRspDb;
13502 RRC_Version_t *rrcVer =NULLP;
13504 memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
13506 DU_LOG("\nINFO --> F1AP : F1 Setup Response received");
13507 f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
13509 for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
13511 switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
13513 case ProtocolIE_ID_id_Cells_to_be_Activated_List:
13515 extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
13516 value.choice.Cells_to_be_Activated_List);
13519 case ProtocolIE_ID_id_TransactionID:
13521 f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
13522 value.choice.TransactionID;
13525 case ProtocolIE_ID_id_gNB_CU_Name:
13527 cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
13528 value.choice.GNB_CU_Name;
13529 strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
13532 case ProtocolIE_ID_id_GNB_CU_RRC_Version:
13534 rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
13535 strcpy(f1SetRspDb.rrcVersion.rrcVer,
13536 (const char*)rrcVer->latest_RRC_Version.buf);
13540 DU_LOG("\nERROR --> DU_APP : Invalid IE received in F1SetupRsp:%ld",
13541 f1SetRspMsg->protocolIEs.list.array[idx]->id);
13543 duProcF1SetupRsp();
13546 freeAperDecodeF1SetupRsp(f1SetRspMsg);
13548 duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize = recvBufLen;
13549 DU_ALLOC(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, duCb.f1SetupReqAndRspMsg.f1MsgRspBufSize);
13550 if(duCb.f1SetupReqAndRspMsg.f1MsgReqBuf == NULLP)
13552 DU_LOG("\nERROR --> F1AP : Memory allocation failed to store the buf of F1setup response");
13555 memcpy(duCb.f1SetupReqAndRspMsg.f1MsgRspBuf, recvBuf, recvBufLen);
13557 if(BuildAndSendE2SetupReq() != ROK)
13559 DU_LOG("\nERROR --> F1AP : Failed to build and send E2 setup request ");
13564 /*******************************************************************
13566 * @brief free GNB DU config update ack
13570 * Function : freeAperDecodeGnbDuAck
13572 * Functionality: Processes GNB DU config update ack And
13573 * added free part for the memory allocated by aper_decoder
13575 * @params[in] F1AP_PDU_t ASN decoded F1AP message
13576 * @return ROK - success
13577 * RFAILED - failure
13579 * ****************************************************************/
13581 void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
13585 if(gnbDuAck->protocolIEs.list.array)
13587 for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
13589 if(gnbDuAck->protocolIEs.list.array[ieIdx])
13591 free(gnbDuAck->protocolIEs.list.array[ieIdx]);
13594 free(gnbDuAck->protocolIEs.list.array);
13598 /*******************************************************************
13600 * @brief Building result of gnb-du config update ack output
13604 * Function : duProcGnbDuCfgUpdAckMsg
13607 * Building output of gnb-du config update ack
13609 * @params[in] transId
13612 * ****************************************************************/
13614 uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId)
13616 uint8_t ieIdx=0, arrIdx=0,ret=ROK;
13617 uint8_t ueId =0 , ueIdx =0, totalActiveUe = 0;
13618 uint16_t cellId =0, cellIdx =0, crnti=0;
13619 CmLList *f1apPduNode = NULLP;
13620 ReservedF1apPduInfo *f1apPduInfo =NULLP;
13621 F1AP_PDU_t *f1apMsgPdu = NULLP;
13622 GNBDUConfigurationUpdate_t *gnbDuConfigUpdate = NULLP;
13623 BIT_STRING_t *cellIdentity=NULLP;
13624 struct Served_Cells_To_Delete_ItemIEs *deleteItemIe=NULLP;
13625 Served_Cells_To_Delete_List_t *cellsToDelete=NULLP;
13626 Served_Cells_To_Delete_Item_t *deleteItem=NULLP;
13628 DU_LOG("\nINFO --> DU APP: GNB-DU config update Ack received ");
13629 f1apPduNode = searchFromReservedF1apPduList(transId);
13630 f1apPduInfo = (ReservedF1apPduInfo *)f1apPduNode->node;
13631 f1apMsgPdu = (F1AP_PDU_t *)f1apPduInfo->f1apMsg;
13635 if(f1apMsgPdu->choice.initiatingMessage)
13637 gnbDuConfigUpdate = &f1apMsgPdu->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
13638 for(ieIdx=0; ieIdx < gnbDuConfigUpdate->protocolIEs.list.count; ieIdx++)
13640 switch(gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->id)
13642 case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
13644 cellsToDelete = &gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
13645 Served_Cells_To_Delete_List;
13646 if(cellsToDelete->list.array)
13648 if(cellsToDelete->list.array[arrIdx])
13650 deleteItemIe = (Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx];
13651 deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
13652 if(deleteItem->oldNRCGI.nRCellIdentity.buf)
13654 cellIdentity = &deleteItem->oldNRCGI.nRCellIdentity;
13655 bitStringToInt(cellIdentity, &cellId);
13657 GET_CELL_IDX(cellId, cellIdx);
13658 if(duCb.actvCellLst[cellIdx] != NULLP)
13660 duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS;
13666 if(duCb.actvCellLst[cellIdx] != NULLP)
13668 if(duCb.actvCellLst[cellIdx]->numActvUes == 0)
13670 ret = duSendCellDeletReq(cellId);
13673 DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\
13674 request for cellId[%d]", cellId);
13679 totalActiveUe = duCb.actvCellLst[cellIdx]->numActvUes;
13680 while(totalActiveUe)
13682 if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState != UE_ACTIVE)
13688 crnti = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti;
13689 GET_UE_ID(crnti,ueId);
13690 /* Sending Ue Context release request only for maximum supporting UEs */
13691 ret = BuildAndSendUeContextReleaseReq(cellId, ueId);
13694 DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\
13695 request for cellId[%d]", cellId);
13704 DU_LOG("\nERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId);
13717 FreeDUConfigUpdate(f1apMsgPdu);
13718 deleteFromReservedF1apPduList(f1apPduNode);
13722 /*******************************************************************
13724 * @brief Processes GNB DU config update ack
13728 * Function : procF1GNBDUCfgUpdAck
13730 * Functionality: added free part for the memory allocated by aper_decoder
13732 * @params[in] F1AP_PDU_t *f1apMsg
13735 * ****************************************************************/
13736 uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
13738 uint8_t ieIdx=0,transId=0;
13739 GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
13741 DU_LOG("\nINFO --> F1AP : GNB-DU config update acknowledgment");
13742 gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
13744 for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
13746 switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
13748 case ProtocolIE_ID_id_TransactionID:
13750 transId = gnbDuAck->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
13753 case ProtocolIE_ID_id_Cells_to_be_Activated_List:
13759 DU_LOG("\nERROR --> F1AP: procF1GNBDUCfgUpdAck(): Invalid IE Received: %ld", \
13760 gnbDuAck->protocolIEs.list.array[ieIdx]->id);
13766 duProcGnbDuCfgUpdAckMsg(transId);
13769 /* presently we are not supporting F1 Reset from DU to CU , we are only
13770 * supporting F1 Reset from CU to DU */
13772 if(BuildAndSendF1ResetReq() != ROK)
13778 freeAperDecodeGnbDuAck(gnbDuAck);
13781 /******************************************************************
13783 * @brief free DL RRC Message Transfer allocated by aper_decoder
13787 * Function : freeAperDecodef1DlRrcMsg
13789 * Functionality: free DL RRC Message Transfer allocated by aper_decoder
13791 * @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg
13792 * @return ROK - success
13793 * RFAILED - failure
13795 * ****************************************************************/
13797 void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
13800 RRCContainer_t *rrcContainer = NULLP;
13802 if(f1DlRrcMsg->protocolIEs.list.array)
13804 for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
13806 if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
13808 switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
13810 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
13812 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
13814 case ProtocolIE_ID_id_SRBID:
13816 case ProtocolIE_ID_id_RRCContainer:
13818 rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
13819 free(rrcContainer->buf);
13821 case ProtocolIE_ID_id_ExecuteDuplication:
13823 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
13827 free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
13830 free(f1DlRrcMsg->protocolIEs.list.array);
13833 /******************************************************************
13835 * @brief Processes DL RRC Message Transfer sent by CU
13839 * Function : procF1DlRrcMsgTrans
13841 * Functionality: Processes DL RRC Message Transfer sent by CU
13843 * @params[in] F1AP_PDU_t ASN decoded F1AP message
13844 * @return ROK - success
13845 * RFAILED - failure
13847 * ****************************************************************/
13848 uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
13851 DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
13853 memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
13855 DU_LOG("\nINFO --> DU_APP : DL RRC message transfer Recevied");
13856 f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
13860 for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
13862 switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
13864 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
13866 dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
13869 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
13871 dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
13874 case ProtocolIE_ID_id_SRBID:
13876 dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
13879 case ProtocolIE_ID_id_ExecuteDuplication:
13880 dlMsg.execDup = true;
13883 case ProtocolIE_ID_id_RRCContainer:
13885 if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
13887 dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
13888 DU_ALLOC_SHRABL_BUF(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
13889 if(dlMsg.rrcMsgPdu)
13891 memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
13896 DU_LOG("\nERROR --> DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
13902 DU_LOG("\nERROR --> DU_APP : RRC Container Size is invalid:%ld",\
13903 f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
13908 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
13910 dlMsg.deliveryStatRpt = true;
13914 DU_LOG("\nERROR --> DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
13915 f1DlRrcMsg->protocolIEs.list.array[idx]->id);
13919 ret = duProcDlRrcMsg(&dlMsg);
13921 freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
13924 /*******************************************************************
13926 * @brief Builds the DRB to be Setup Mod list
13932 * Functionality: Constructs the DRB to be Setup Mod list
13934 * @params[in] DRBs_SetupMod_List_t *drbSet
13936 * @return ROK - success
13937 * RFAILED - failure
13939 * ****************************************************************/
13940 uint8_t BuildSrbSetupModList(SRBs_SetupMod_List_t *srbList, DuUeCfg *ueCfg)
13942 uint8_t srbIdx = 0;
13943 struct SRBs_SetupMod_ItemIEs *srbItemIe;
13945 srbList->list.count = ueCfg->numRlcLcs;
13946 srbList->list.size = srbList->list.count * sizeof(SRBs_SetupMod_ItemIEs_t *);
13948 DU_ALLOC(srbList->list.array, srbList->list.size);
13949 if(srbList->list.array == NULLP)
13951 DU_LOG("\nERROR --> DU APP : Memory allocation failed in BuildSrbSetupModList");
13955 for(srbIdx = 0; srbIdx < srbList->list.count; srbIdx++)
13957 DU_ALLOC(srbList->list.array[srbIdx], sizeof(SRBs_SetupMod_ItemIEs_t));
13958 if(srbList->list.array[srbIdx] == NULLP)
13960 DU_LOG("\nERROR --> DU APP : Memory allocation failed in BuildSrbSetupModList");
13965 for(srbIdx=0; srbIdx < srbList->list.count; srbIdx++)
13967 srbItemIe = (struct SRBs_SetupMod_ItemIEs *)srbList->list.array[srbIdx];
13968 srbItemIe->id = ProtocolIE_ID_id_SRBs_SetupMod_Item;
13969 srbItemIe->criticality = Criticality_reject;
13970 srbItemIe->value.present = SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item;
13971 srbItemIe->value.choice.SRBs_SetupMod_Item.sRBID = ueCfg->rlcLcCfg[srbIdx].rbId;
13972 srbItemIe->value.choice.SRBs_SetupMod_Item.lCID = ueCfg->rlcLcCfg[srbIdx].lcId;
13977 /*******************************************************************
13979 * @brief Builds the DRB to be Setup Mod list
13985 * Functionality: Constructs the DRB to be Setup Mod list
13987 * @params[in] DRBs_SetupMod_List_t *drbSet
13989 * @return ROK - success
13990 * RFAILED - failure
13992 * ****************************************************************/
13994 uint8_t BuildDrbSetupModList(DRBs_SetupMod_List_t *drbSet , DuUeCfg *ueCfg)
13998 struct DRBs_SetupMod_ItemIEs *drbItemIe;
14000 drbCnt = ueCfg->numDrbSetupMod;
14004 DU_LOG("\nINFO --> F1AP : BuildDrbToBeSetupModList(): No DRB information to avaialble to add");
14008 drbSet->list.count = drbCnt;
14009 drbSet->list.size = drbCnt * sizeof(DRBs_SetupMod_ItemIEs_t *);
14010 DU_ALLOC(drbSet->list.array, drbSet->list.size);
14011 if(drbSet->list.array == NULLP)
14013 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
14016 for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
14018 DU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_SetupMod_ItemIEs_t));
14019 if(drbSet->list.array[arrIdx] == NULLP)
14021 DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
14025 drbItemIe = (struct DRBs_SetupMod_ItemIEs *)drbSet->list.array[arrIdx];
14026 drbItemIe->id = ProtocolIE_ID_id_DRBs_SetupMod_Item;
14027 drbItemIe->criticality = Criticality_reject;
14028 drbItemIe->value.present = DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
14029 drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
14030 if(fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List,\
14031 &ueCfg->upTnlInfo[arrIdx])!= ROK)
14033 DU_LOG("\nERROR --> F1AP : Failed to fill DlTnl SetupList in BuildDrbToBeSetupModList");
14041 /*******************************************************************
14042 * @brief Free the memory allocated for DRB setup List
14046 * Function : FreeDrbSetupModList
14049 * Free the memory allocated for DRB setup list
14051 * @params[in] DRBs_Setup_List_t *
14054 * ****************************************************************/
14055 void FreeDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
14057 uint8_t arrIdx = 0;
14058 DRBs_SetupMod_ItemIEs_t *drbItemIe = NULLP;
14060 for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
14062 drbItemIe = ((DRBs_SetupMod_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
14063 freeDlTnlInfo(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
14064 DU_FREE(drbSetupList->list.array[arrIdx], sizeof(DRBs_SetupMod_ItemIEs_t));
14066 DU_FREE(drbSetupList->list.array, drbSetupList->list.size);
14069 /*******************************************************************
14070 * @brief Free the memory allocated for SRB setup List
14074 * Function : FreeSrbSetupModList
14077 * Free the memory allocated for SRB setup list
14079 * @params[in] SRBs_Setup_List_t *
14082 * ****************************************************************/
14083 void FreeSrbSetupModList(SRBs_SetupMod_List_t *srbSetupList)
14085 uint8_t srbIdx = 0;
14087 for(srbIdx = 0; srbIdx < srbSetupList->list.count; srbIdx++)
14088 DU_FREE(srbSetupList->list.array[srbIdx], sizeof(SRBs_SetupMod_ItemIEs_t));
14089 DU_FREE(srbSetupList->list.array, srbSetupList->list.size);
14092 /*******************************************************************
14093 * @brief Free the memory allocated for UE Context Mod Response
14097 * Function : FreeUeContextModResp
14100 * Free the memory allocated for UE Context Mod Response
14102 * @params[in] F1AP_PDU_t *f1apMsg
14105 * ****************************************************************/
14107 void FreeUeContextModResp(F1AP_PDU_t *f1apMsg)
14110 UEContextModificationResponse_t *ueContextModifyRes = NULLP;
14113 if(f1apMsg->choice.successfulOutcome)
14115 ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
14116 if(ueContextModifyRes->protocolIEs.list.array)
14118 for(ieIdx=0 ; ieIdx<ueContextModifyRes->protocolIEs.list.count; ieIdx++)
14120 if(ueContextModifyRes->protocolIEs.list.array[ieIdx])
14122 switch(ueContextModifyRes->protocolIEs.list.array[ieIdx]->id)
14124 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
14126 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
14128 case ProtocolIE_ID_id_DRBs_SetupMod_List:
14130 FreeDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
14131 value.choice.DRBs_SetupMod_List));
14134 case ProtocolIE_ID_id_SRBs_SetupMod_List:
14136 FreeSrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.\
14137 SRBs_SetupMod_List));
14141 DU_FREE(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
14145 DU_FREE(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
14147 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
14149 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
14153 /*****************************************************************i
14155 * @brief Creating the ue context modifcation response and sending
14159 * Function : BuildAndSendUeContextModRsp
14162 * - Creating the ue context modifcation response
14164 * @params[in] uint8_t cellId,uint8_t ueId
14165 * @return ROK - success
14166 * RFAILED - failure
14168 * ****************************************************************/
14169 uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb)
14171 uint8_t ieIdx = 0, tnlIdx = 0, rbIdx = 0;
14172 uint8_t elementCnt = 0;
14173 uint8_t ret = RFAILED;
14174 F1AP_PDU_t *f1apMsg = NULLP;
14175 asn_enc_rval_t encRetVal;
14176 UEContextModificationResponse_t *ueContextModifyRes = NULLP;
14178 DU_LOG("\nINFO --> F1AP : Building UE context modification response\n");
14182 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
14183 if(f1apMsg == NULLP)
14185 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
14189 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
14191 DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
14192 if(f1apMsg->choice.successfulOutcome == NULLP)
14194 DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
14197 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextModification;
14198 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
14199 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_UEContextModificationResponse;
14201 ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
14203 if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
14205 if(ueCb->f1UeDb->duUeCfg.numDrbSetupMod)
14210 if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
14212 if(ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE)
14214 ueContextModifyRes->protocolIEs.list.count = elementCnt;
14215 ueContextModifyRes->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationResponse_t*);
14217 /* Initialize the UE context modification members */
14218 DU_ALLOC(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
14219 if(ueContextModifyRes->protocolIEs.list.array == NULLP)
14221 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
14225 for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
14227 DU_ALLOC(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
14228 if(ueContextModifyRes->protocolIEs.list.array[ieIdx] == NULLP)
14230 DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
14236 ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
14237 ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
14238 ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
14239 UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
14240 ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueCb->gnbCuUeF1apId;
14243 ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
14244 ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
14245 ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present=\
14246 UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
14247 ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueCb->gnbDuUeF1apId;
14249 if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
14252 ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCInformation;
14253 ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
14254 ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present = \
14255 UEContextModificationResponseIEs__value_PR_DUtoCURRCInformation;
14256 BuildCellGroupConfigRrc(ueCb, &ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCInformation.cellGroupConfig);
14259 if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || ((ueCb->f1UeDb->actionType == UE_CTXT_MOD) && (ueCb->f1UeDb->duUeCfg.numDrbSetupMod)))
14262 ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List;
14263 ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
14264 ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
14265 UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
14266 if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
14268 for(tnlIdx = 0; tnlIdx < duCb.numTeId; tnlIdx++)
14270 if(duCb.upTnlCfg[tnlIdx]->ueId == ueCb->gnbDuUeF1apId)
14272 memcpy(&ueCb->f1UeDb->duUeCfg.upTnlInfo[ueCb->f1UeDb->duUeCfg.numDrbSetupMod++], duCb.upTnlCfg[tnlIdx], sizeof(UpTnlCfg));
14276 ret = BuildDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
14277 value.choice.DRBs_SetupMod_List) , &ueCb->f1UeDb->duUeCfg);
14280 DU_LOG( "\nERROR --> F1AP : Failed to build DRB setupmod List ");
14285 if(ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY)
14288 ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_SRBs_SetupMod_List;
14289 ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
14290 ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present = \
14291 UEContextModificationResponseIEs__value_PR_SRBs_SetupMod_List;
14292 for(rbIdx = 0; rbIdx < ueCb->rlcUeCfg.numLcs; rbIdx++)
14294 if(ueCb->rlcUeCfg.rlcLcCfg[rbIdx].rbType == RB_TYPE_SRB)
14296 memcpy(&ueCb->f1UeDb->duUeCfg.rlcLcCfg[ueCb->f1UeDb->duUeCfg.numRlcLcs++], &ueCb->rlcUeCfg.rlcLcCfg[rbIdx],\
14297 sizeof(RlcBearerCfg));
14300 ret = BuildSrbSetupModList(&ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.SRBs_SetupMod_List, \
14301 &ueCb->f1UeDb->duUeCfg);
14304 DU_LOG( "\nERROR --> F1AP : Failed to build SRB setupmod List ");
14309 freeF1UeDb(ueCb->f1UeDb);
14310 ueCb->f1UeDb = NULLP;
14312 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
14314 /* Encode the F1SetupRequest type as APER */
14315 memset(encBuf, 0, ENC_BUF_MAX_LEN);
14317 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,encBuf);
14319 /* Encode results */
14320 if(encRetVal.encoded == ENCODE_FAIL)
14322 DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
14323 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
14329 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Modification Response\n");
14330 for(int i=0; i< encBufSize; i++)
14332 printf("%x",encBuf[i]);
14337 if(sendF1APMsg() != ROK)
14339 DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Res Failed");
14347 FreeUeContextModResp(f1apMsg);
14350 /*******************************************************************
14352 * @brief Deallocating the memory allocated by the aper decoder
14357 * Function : freeAperDecodeQosInfo
14359 * Functionality: Deallocating the memory allocated for QOSInfo
14361 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
14365 * ****************************************************************/
14367 void freeAperDecodeQosInfo(QoSFlowLevelQoSParameters_t *drbQos)
14369 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
14371 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
14373 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
14375 free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
14377 free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
14379 free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI);
14382 /*******************************************************************
14384 * @brief Deallocating the memory allocated by the aper decoder
14385 * for UlTnlInfoforDrb
14389 * Function : freeAperDecodeUlTnlInfoforDrbSetupMod
14391 * Functionality: Deallocating memory allocated for UlTnlInfoforDrb
14393 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
14397 * ****************************************************************/
14398 void freeAperDecodeUlTnlInfoforDrbSetupMod(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
14402 if(ulInfo->list.array)
14404 for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
14406 if(ulInfo->list.array[arrIdx])
14408 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
14410 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
14412 if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
14414 free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
14417 free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
14418 transportLayerAddress.buf);
14420 free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel);
14422 free(ulInfo->list.array[arrIdx]);
14425 free(ulInfo->list.array);
14428 /*******************************************************************
14430 * @brief Deallocating the memory allocated by the aper decoder
14431 * for DrbSetupModItem
14435 * Function : freeAperDecodeDrbSetupModItem
14437 * Functionality: Deallocating memory allocated for DrbSetupModItem
14439 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
14443 * ****************************************************************/
14445 void freeAperDecodeDrbSetupModItem(DRBs_ToBeSetupMod_Item_t *drbItem)
14448 SNSSAI_t *snssai =NULLP;
14449 Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
14451 drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
14452 switch(drbItem->qoSInformation.present)
14454 case QoSInformation_PR_NOTHING:
14456 case QoSInformation_PR_eUTRANQoS:
14458 if(drbItem->qoSInformation.choice.eUTRANQoS)
14460 free(drbItem->qoSInformation.choice.eUTRANQoS);
14464 case QoSInformation_PR_choice_extension:
14466 if(drbItem->qoSInformation.choice.choice_extension)
14468 freeAperDecodeQosInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.\
14469 DRB_Information.dRB_QoS);
14470 snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
14471 if(snssai->sST.buf)
14473 free(snssai->sST.buf);
14477 if(snssai->sD->buf)
14479 free(snssai->sD->buf);
14484 flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.\
14485 DRB_Information.flows_Mapped_To_DRB_List;
14486 if(flowMap->list.array)
14488 for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
14490 if(flowMap->list.array[arrIdx] )
14492 freeAperDecodeQosInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
14493 free(flowMap->list.array[arrIdx]);
14496 free(flowMap->list.array);
14499 free(drbItem->qoSInformation.choice.choice_extension);
14505 freeAperDecodeUlTnlInfoforDrbSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List);
14506 if(drbItem->uLConfiguration)
14508 free(drbItem->uLConfiguration);
14512 /*******************************************************************
14514 * @brief Deallocating the memory allocated by the aper decoder
14515 * for DrbToBeSetupModList
14519 * Function : freeAperDecodeDrbToBeSetupModList
14521 * Functionality: Deallocating memory allocated for DrbToBeSetupModList
14523 * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
14527 * ****************************************************************/
14529 void freeAperDecodeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
14532 struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
14534 if(drbSet->list.array)
14536 for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
14538 if(drbSet->list.array[arrIdx] != NULLP)
14542 drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
14543 freeAperDecodeDrbSetupModItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
14545 free(drbSet->list.array[arrIdx]);
14548 free(drbSet->list.array);
14552 /*******************************************************************
14554 * @brief Deallocating the memory allocated by the aper decoder
14555 * for UeContextModificationReqMsg
14559 * Function : freeAperDecodeUeContextModificationReqMsg
14561 * Functionality: Deallocating memory allocated for
14562 * UeContextModificationReqMsg
14564 * @params[in] UEContextModificationRequest_t *UeContextModifyReq
14568 * ****************************************************************/
14569 void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *ueContextModifyReq )
14571 uint8_t arrIdx, ieId;
14573 if(ueContextModifyReq->protocolIEs.list.array)
14575 for( arrIdx = 0 ; arrIdx<ueContextModifyReq->protocolIEs.list.count ; arrIdx++)
14577 if(ueContextModifyReq->protocolIEs.list.array[arrIdx])
14579 ieId = ueContextModifyReq->protocolIEs.list.array[arrIdx]->id;
14582 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
14584 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
14586 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
14588 freeAperDecodeDrbToBeSetupModList(&ueContextModifyReq->protocolIEs.list.array[arrIdx]->\
14589 value.choice.DRBs_ToBeSetupMod_List);
14592 case ProtocolIE_ID_id_TransmissionActionIndicator:
14594 case ProtocolIE_ID_id_RRCContainer:
14596 free(ueContextModifyReq->protocolIEs.list.array[arrIdx]->value.choice.RRCContainer.buf);
14599 free(ueContextModifyReq->protocolIEs.list.array[arrIdx]);
14602 free(ueContextModifyReq->protocolIEs.list.array);
14605 /*******************************************************************
14607 * @brief processing the F1 UeContextModificationReq
14611 * Function : procF1UeContextModificationReq
14613 * Functionality: processing the F1 UeContextModificationReq
14615 * @params[in] F1AP_PDU_t *f1apMsg
14618 * ****************************************************************/
14619 uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg)
14621 UEContextModificationRequest_t *ueContextModifyReq = NULLP;
14622 uint8_t ret = ROK, ieIdx = 0, cellIdx=0;
14623 DuUeCb *duUeCb = NULLP;
14624 DRBs_ToBeSetupMod_List_t *drbSetupModCfg;
14625 DRBs_ToBeModified_List_t *drbModifiedCfg;
14626 uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
14628 ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
14629 for(ieIdx=0; (ieIdx < ueContextModifyReq->protocolIEs.list.count && ret == ROK); ieIdx++)
14631 switch(ueContextModifyReq->protocolIEs.list.array[ieIdx]->id)
14633 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
14635 gnbCuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
14638 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
14640 gnbDuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
14641 for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
14643 if(duCb.actvCellLst[cellIdx])
14645 if((duCb.actvCellLst[cellIdx]->ueCb[gnbDuUeF1apId-1].gnbDuUeF1apId == gnbDuUeF1apId)&&\
14646 (duCb.actvCellLst[cellIdx]->ueCb[gnbDuUeF1apId-1].gnbCuUeF1apId == gnbCuUeF1apId))
14648 duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[gnbDuUeF1apId-1];
14649 if(duUeCb->f1UeDb == NULLP)
14651 DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
14652 duUeCb->f1UeDb->cellIdx = cellIdx;
14653 duUeCb->f1UeDb->actionType = UE_CTXT_MOD;
14659 if(duUeCb == NULLP)
14661 DU_LOG("\nERROR --> DU APP : wrong values of gnbCuUeF1apId and gnbDuUeF1apId ");
14667 case ProtocolIE_ID_id_RRCContainer:
14669 /* Filling Dl RRC Msg Info */
14670 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
14671 if(!duUeCb->f1UeDb->dlRrcMsg)
14673 DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \
14674 Memory allocation failed ");
14679 duUeCb->f1UeDb->dlRrcMsgPres = true;
14680 memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
14681 ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
14682 &ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
14683 value.choice.RRCContainer);
14689 case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
14690 case ProtocolIE_ID_id_DRBs_ToBeModified_List:
14694 if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present ==\
14695 UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List)
14697 drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\
14698 choice.DRBs_ToBeSetupMod_List;
14700 if(extractDrbListToSetupMod(NULL, drbSetupModCfg, NULL, drbSetupModCfg->list.count,\
14701 &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, NULL))
14703 DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbSetupModList");
14708 if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present == \
14709 UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List)
14712 drbModifiedCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\
14713 choice.DRBs_ToBeModified_List;
14714 if(extractDrbListToSetupMod(NULL, NULL, drbModifiedCfg, drbModifiedCfg->list.count,\
14715 &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap, &duUeCb->rlcUeCfg))
14717 DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetupMod() for DrbModifiedList");
14725 case ProtocolIE_ID_id_GNB_DUConfigurationQuery:
14727 DU_LOG("\nINFO --> DU APP : Received GNB DU Configuration Query in UE Context Modification Request from CU");
14730 duUeCb->f1UeDb->actionType = UE_CTXT_CFG_QUERY;
14735 case ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator:
14737 if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCReconfigurationCompleteIndicator == \
14738 RRCReconfigurationCompleteIndicator_true)
14740 duUeCb->f1UeDb->actionType = UE_CTXT_RRC_RECFG_COMPLETE;
14744 case ProtocolIE_ID_id_TransmissionActionIndicator:
14748 if(ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator == TransmissionActionIndicator_stop)
14750 duUeCb->f1UeDb->duUeCfg.dataTransmissionAction = STOP_TRANSMISSION;
14754 duUeCb->f1UeDb->duUeCfg.dataTransmissionAction = RESTART_TRANSMISSION;
14760 case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
14762 if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
14764 duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
14774 ret = duProcUeContextModReq(duUeCb);
14776 freeAperDecodeUeContextModificationReqMsg(ueContextModifyReq);
14780 /*****************************************************************i
14782 * @brief Free memory allocated for UE Context Release Request
14786 * Function : FreeUeContextReleaseReq
14789 * - Free memory allocated for UE Context Release Request
14791 * @params[in] F1AP_PDU_t *f1apMsg
14794 * *************************************************************/
14795 void FreeUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
14798 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
14802 if(f1apMsg->choice.initiatingMessage)
14804 ueReleaseReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
14805 if(ueReleaseReq->protocolIEs.list.array)
14807 for(ieIdx=0 ; ieIdx<ueReleaseReq->protocolIEs.list.count; ieIdx++)
14809 DU_FREE(ueReleaseReq->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseRequest_t));
14811 DU_FREE(ueReleaseReq->protocolIEs.list.array, ueReleaseReq->protocolIEs.list.size);
14813 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
14815 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
14819 /*****************************************************************i
14821 * @brief Build and Send UE Context Release Request
14825 * Function : BuildAndSendUeContextReleaseReq
14828 * - Build and Send UE Context Release Request
14831 * @return ROK - success
14832 * RFAILED - failure
14834 * *************************************************************/
14835 uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueId)
14837 bool memAllocFail = false;
14839 uint8_t ret = RFAILED;
14840 uint16_t cellIdx =0;
14841 uint16_t crnti = 0;
14842 uint8_t elementCnt = 0;
14843 uint32_t gnbCuUeF1apId =0; /* gNB-CU UE F1AP Id */
14844 uint32_t gnbDuUeF1apId =0; /* gNB-DU UE F1AP Id */
14845 asn_enc_rval_t encRetVal;
14846 F1AP_PDU_t *f1apMsg = NULLP;
14847 UEContextReleaseRequest_t *ueReleaseReq = NULLP;
14849 DU_LOG("\nINFO --> Building the UE Context Release Request");
14852 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
14853 if(f1apMsg == NULLP)
14855 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for f1apMsg");
14859 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
14860 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
14861 if(f1apMsg->choice.initiatingMessage == NULLP)
14863 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for\
14864 initiatingMessage");
14867 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextReleaseRequest;
14868 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
14869 f1apMsg->choice.initiatingMessage->value.present = \
14870 InitiatingMessage__value_PR_UEContextReleaseRequest;
14872 ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
14876 ueReleaseReq->protocolIEs.list.count = elementCnt;
14877 ueReleaseReq->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseRequest_t *);
14879 /* Initialize the F1Setup members */
14880 DU_ALLOC(ueReleaseReq->protocolIEs.list.array,ueReleaseReq->protocolIEs.list.size);
14881 if(ueReleaseReq->protocolIEs.list.array == NULLP)
14883 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE array");
14886 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
14888 DU_ALLOC(ueReleaseReq->protocolIEs.list.array[ieIdx],\
14889 sizeof(UEContextReleaseRequest_t));
14890 if(ueReleaseReq->protocolIEs.list.array[ieIdx] == NULLP)
14892 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE elements");
14893 memAllocFail = true;
14897 if(memAllocFail == true)
14900 /* Fetching Ue Cb Info*/
14901 GET_CELL_IDX(cellId, cellIdx);
14902 if(duCb.actvCellLst[cellIdx] == NULLP)
14904 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): CellId[%d] does not exist", cellId);
14909 GET_CRNTI(crnti, ueId);
14910 if(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].crnti != crnti)
14912 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): crnti[%d] does not exist", crnti);
14915 gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
14916 gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
14920 ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
14921 ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
14922 ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present = \
14923 UEContextReleaseRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
14924 ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
14927 ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
14928 ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
14929 ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present =\
14930 UEContextReleaseRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
14931 ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
14933 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
14935 /* Encode the F1SetupRequest type as APER */
14936 memset(encBuf, 0, ENC_BUF_MAX_LEN);
14938 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
14939 /* Encode results */
14940 if(encRetVal.encoded == ENCODE_FAIL)
14942 DU_LOG("\nERROR --> F1AP : Could not encode UEContextReleaseRequest structure (at %s)\n",\
14943 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
14948 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UEContextReleaseRequest\n");
14949 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
14951 printf("%x",encBuf[ieIdx]);
14956 if(sendF1APMsg() != ROK)
14958 DU_LOG("\nERROR --> F1AP : Sending UE Context Release Request failed");
14965 FreeUeContextReleaseReq(f1apMsg);
14968 /*****************************************************************i
14970 * @brief Free memory allocated for UE Context Release Complete
14974 * Function : FreeUeContextReleaseComplete
14977 * - Free memory allocated for UE Context Release Complete
14979 * @params[in] F1AP_PDU_t *f1apMsg
14982 * *************************************************************/
14983 void FreeUeContextReleaseComplete(F1AP_PDU_t *f1apMsg)
14986 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
14990 if(f1apMsg->choice.successfulOutcome)
14992 ueReleaseComplete =&f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
14993 if(ueReleaseComplete->protocolIEs.list.array)
14995 for(ieIdx=0 ; ieIdx<ueReleaseComplete->protocolIEs.list.count; ieIdx++)
14997 DU_FREE(ueReleaseComplete->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseComplete_t));
14999 DU_FREE(ueReleaseComplete->protocolIEs.list.array, ueReleaseComplete->protocolIEs.list.size);
15001 DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
15003 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
15007 /*****************************************************************i
15009 * @brief Build and Send UE Context Release Complete
15013 * Function : BuildAndSendUeContextReleaseComplete
15016 * - Build and Send UE Context Release Complete
15018 * @params[in] cellId, gnbCuUeF1apId, gnbDuUeF1apId
15019 * @return ROK - success
15020 * RFAILED - failure
15022 * *************************************************************/
15023 uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1apId, uint32_t gnbDuUeF1apId)
15025 bool memAllocFail = false;
15026 uint8_t ieIdx =0, ret = RFAILED, elementCnt = 0;
15027 asn_enc_rval_t encRetVal;
15028 F1AP_PDU_t *f1apMsg = NULLP;
15029 UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
15031 DU_LOG("\nINFO --> Building the UE Context Release Complete");
15034 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
15035 if(f1apMsg == NULLP)
15037 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for f1apMsg");
15041 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
15042 DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
15043 if(f1apMsg->choice.successfulOutcome == NULLP)
15045 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for\
15046 successfulOutcome");
15049 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextRelease;
15050 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
15051 f1apMsg->choice.successfulOutcome->value.present = \
15052 SuccessfulOutcome__value_PR_UEContextReleaseComplete;
15054 ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
15057 ueReleaseComplete->protocolIEs.list.count = elementCnt;
15058 ueReleaseComplete->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseComplete_t *);
15060 /* Initialize the UE Release Complete members */
15061 DU_ALLOC(ueReleaseComplete->protocolIEs.list.array,ueReleaseComplete->protocolIEs.list.size);
15062 if(ueReleaseComplete->protocolIEs.list.array == NULLP)
15064 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE array");
15067 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
15069 DU_ALLOC(ueReleaseComplete->protocolIEs.list.array[ieIdx],\
15070 sizeof(UEContextReleaseComplete_t));
15071 if(ueReleaseComplete->protocolIEs.list.array[ieIdx] == NULLP)
15073 DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE\
15075 memAllocFail = true;
15079 if(memAllocFail == true)
15084 ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
15085 ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
15086 ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present = \
15087 UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID;
15088 ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
15091 ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
15092 ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
15093 ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present =\
15094 UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID;
15095 ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
15097 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
15099 /* Encode the F1SetupComplete type as APER */
15100 memset(encBuf, 0, ENC_BUF_MAX_LEN);
15102 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
15103 /* Encode results */
15104 if(encRetVal.encoded == ENCODE_FAIL)
15106 DU_LOG("\nERROR --> F1AP : Could not encode UEContextReleaseComplete structure (at %s)\n",\
15107 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
15112 DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UEContextReleaseComplete\n");
15113 for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
15115 printf("%x",encBuf[ieIdx]);
15120 if(sendF1APMsg() != ROK)
15122 DU_LOG("\nERROR --> F1AP : Sending UE Context Release Complete failed");
15129 if((ret == ROK) && (duCb.actvCellLst[cellId-1]) && (duCb.actvCellLst[cellId-1]->cellStatus == DELETION_IN_PROGRESS)
15130 && (duCb.actvCellLst[cellId-1]->numActvUes == 0))
15132 ret = duSendCellDeletReq(cellId);
15135 DU_LOG("\nERROR --> F1AP: BuildAndSendUeContextReleaseComplete(): Failed to process cell\
15136 Delete req for CellId");
15139 FreeUeContextReleaseComplete(f1apMsg);
15144 /*******************************************************************
15146 * @brief added free part for the memory allocated by aper_decoder
15150 * Function : freeAperDecodeUeContextReleaseCommand
15152 * Functionality: added free part for the memory allocated by aper_decoder
15154 * @params[in] F1AP_PDU_t *f1apMsg
15157 * ****************************************************************/
15158 void freeAperDecodeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
15161 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
15163 ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
15165 if(ueContextReleaseCommand->protocolIEs.list.array)
15167 for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
15169 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
15171 switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
15173 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
15175 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
15177 case ProtocolIE_ID_id_Cause:
15179 case ProtocolIE_ID_id_RRCContainer:
15181 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
15183 free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
15188 DU_LOG("\nERROR --> F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
15189 ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
15193 free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]);
15195 free(ueContextReleaseCommand->protocolIEs.list.array);
15198 /*******************************************************************
15200 * @brief processing of UE Context Release Command
15204 * Function : procF1UeContextReleaseCommand
15206 * Functionality: processing of UE Context Release Command
15208 * @params[in] F1AP_PDU_t *f1apMsg
15211 * ****************************************************************/
15212 uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
15214 uint8_t ieIdx=0, ret=ROK, ueIdx=0;
15215 uint16_t cellIdx =0, cellId = 0;
15216 bool ueIdxFound = false;
15217 uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0;
15218 DuUeCb *duUeCb = NULLP;
15219 UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
15221 ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
15223 if(ueContextReleaseCommand->protocolIEs.list.array)
15225 for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
15227 if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
15229 switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
15231 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
15233 gnbCuUeF1apId= ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
15234 value.choice.GNB_CU_UE_F1AP_ID;
15238 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
15240 gnbDuUeF1apId = ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
15241 value.choice.GNB_DU_UE_F1AP_ID;
15245 case ProtocolIE_ID_id_Cause:
15247 for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
15249 for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
15251 if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
15252 (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
15254 cellId = duCb.actvCellLst[cellIdx]->cellId;
15255 duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
15260 if(ueIdxFound == true)
15268 DU_LOG("\nERROR --> F1AP: procF1UeContextReleaseCommand(): Ue Information is not available");
15274 case ProtocolIE_ID_id_RRCContainer:
15276 if(ueIdxFound == true)
15278 DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
15281 memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
15282 duUeCb->f1UeDb->actionType = UE_CTXT_RELEASE;
15283 duUeCb->f1UeDb->cellIdx = cellIdx;
15284 /* Filling Dl RRC Msg Info */
15285 DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
15286 if(!duUeCb->f1UeDb->dlRrcMsg)
15288 DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \
15289 Memory allocation failed ");
15294 duUeCb->f1UeDb->dlRrcMsgPres = true;
15295 memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
15296 ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
15297 &ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
15298 value.choice.RRCContainer);
15304 DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \
15305 Memory allocation failed ");
15313 DU_LOG("\nERROR --> F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
15314 ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
15322 duProcUeContextReleaseCommand(cellId, duUeCb);
15324 freeAperDecodeUeContextReleaseCommand(f1apMsg);
15328 /**************************************************************
15330 * @brief free the memory allocated by aper decoder for paging
15334 * Function : freeAperDecodePagingMsg
15337 * - free the memory allocated by aper decoder for
15338 * the paging f1ap msg
15340 * @params[in] Paging_t *paging
15341 * @return ROK - success
15342 * RFAILED - failure
15344 ****************************************************************/
15345 void freeAperDecodePagingMsg(Paging_t *paging)
15347 uint8_t ieIdx, cellIdx;
15348 PagingCell_ItemIEs_t *pagingCellItemIes;
15349 PagingCell_Item_t *pagingCellItem;
15350 PagingCell_list_t *pagingCelllist;
15354 if(paging->protocolIEs.list.array)
15356 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
15358 if(paging->protocolIEs.list.array[ieIdx])
15360 switch(paging->protocolIEs.list.array[ieIdx]->id)
15362 case ProtocolIE_ID_id_UEIdentityIndexValue:
15364 free(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf);
15367 case ProtocolIE_ID_id_PagingIdentity:
15369 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
15371 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
15373 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == \
15374 CNUEPagingIdentity_PR_fiveG_S_TMSI)
15376 free(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf);
15378 free(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity);
15383 case ProtocolIE_ID_id_PagingCell_List:
15385 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
15386 if(pagingCelllist->list.array)
15388 for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
15390 if(pagingCelllist->list.array[cellIdx])
15392 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
15393 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
15395 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
15396 free(pagingCellItem->nRCGI.pLMN_Identity.buf);
15397 free(pagingCellItem->nRCGI.nRCellIdentity.buf);
15399 free(pagingCelllist->list.array[cellIdx]);
15402 free(pagingCelllist->list.array);
15407 free(paging->protocolIEs.list.array[ieIdx]);
15410 free(paging->protocolIEs.list.array);
15416 /**************************************************************
15418 * @brief processing the paging f1ap msg received from CU
15422 * Function : procPagingMsg
15425 * - processing the paging f1ap msg received from CU
15427 * @params[in] F1AP_PDU_t *f1apMsg
15428 * @return ROK - success
15429 * RFAILED - failure
15432 ****************************************************************/
15433 uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg)
15435 uint8_t ieIdx = 0, cellListIdx = 0;
15436 uint16_t cellId = 0;
15437 Paging_t *paging = NULLP;
15438 PagingCell_list_t *pagingCelllist = NULLP;
15439 PagingCell_ItemIEs_t *pagingCellItemIes = NULLP;
15440 PagingCell_Item_t *pagingCellItem = NULLP;
15441 DuPagingMsg *tmpPagingParam = NULLP;
15443 DU_LOG("\nINFO --> DU APP : Processing the Paging Message");
15444 paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
15447 if(paging->protocolIEs.list.array)
15449 DU_ALLOC(tmpPagingParam, sizeof(DuPagingMsg));
15450 if(tmpPagingParam == NULLP)
15452 DU_LOG("\nERROR --> DU APP : Memory Allocation Failure in procPagingMsg");
15453 freeAperDecodePagingMsg(paging);
15456 for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
15458 if(paging->protocolIEs.list.array[ieIdx])
15460 switch(paging->protocolIEs.list.array[ieIdx]->id)
15462 case ProtocolIE_ID_id_UEIdentityIndexValue:
15464 bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10,\
15465 &tmpPagingParam->pagUeId);
15469 case ProtocolIE_ID_id_PagingIdentity:
15471 switch(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present)
15473 case PagingIdentity_PR_cNUEPagingIdentity:
15475 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
15477 bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.\
15478 cNUEPagingIdentity->choice.fiveG_S_TMSI, &tmpPagingParam->sTmsi);
15483 case PagingIdentity_PR_rANUEPagingIdentity:
15485 /*TODO: This Identifier is specific to RAN Initiated Paging – Connected Mode Paging*/
15490 DU_LOG("ERROR --> DU APP: Invalid UE Paging Identity, Skipping this Paging Message:");
15496 case ProtocolIE_ID_id_PagingDRX:
15498 tmpPagingParam->pagingDrxPres = TRUE;
15499 tmpPagingParam->pagingDrx = convertPagingCycleEnumToValue(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX);
15503 case ProtocolIE_ID_id_PagingPriority:
15505 tmpPagingParam->pagPriority = paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority;
15509 case ProtocolIE_ID_id_PagingCell_List:
15511 pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
15512 if(pagingCelllist->list.array)
15514 for(cellListIdx = 0; cellListIdx < pagingCelllist->list.count; cellListIdx++)
15516 if(pagingCelllist->list.array[cellListIdx])
15518 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellListIdx];
15519 pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
15520 bitStringToInt(&pagingCellItem->nRCGI.nRCellIdentity, &cellId);
15521 if(processPagingMsg(cellId, tmpPagingParam) != ROK)
15523 DU_LOG("\nERROR --> DU APP : Paging Processing Failed at CellId:%d",cellId);
15533 DU_LOG("\nERROR --> F1AP : Incorrect Paging IE option");
15541 DU_FREE(tmpPagingParam, sizeof(DuPagingMsg));
15542 freeAperDecodePagingMsg(paging);
15547 /**************************************************************
15549 * @brief Handles received F1AP message and sends back response
15553 * Function : F1APMsgHdlr
15556 * - Decodes received F1AP control message
15557 * - Prepares response message, encodes and sends to SCTP
15560 * @return ROK - success
15561 * RFAILED - failure
15563 * ****************************************************************/
15564 void F1APMsgHdlr(Buffer *mBuf)
15567 char *recvBuf =NULLP;
15569 MsgLen recvBufLen =0;
15570 F1AP_PDU_t *f1apMsg =NULLP;
15571 asn_dec_rval_t rval; /* Decoder return value */
15572 F1AP_PDU_t f1apasnmsg ;
15573 DU_LOG("\nINFO --> F1AP : Received F1AP message buffer");
15574 ODU_PRINT_MSG(mBuf, 0,0);
15576 /* Copy mBuf into char array to decode it */
15577 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
15578 DU_ALLOC(recvBuf, (Size)recvBufLen);
15580 if(recvBuf == NULLP)
15582 DU_LOG("\nERROR --> F1AP : Memory allocation failed");
15585 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
15587 DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt);
15591 printf("\nDEBUG --> F1AP : Received flat buffer to be decoded : ");
15592 for(i=0; i< recvBufLen; i++)
15594 printf("%x",recvBuf[i]);
15597 /* Decoding flat buffer into F1AP messsage */
15598 f1apMsg = &f1apasnmsg;
15599 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
15601 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
15603 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
15605 DU_LOG("\nERROR --> F1AP : ASN decode failed");
15609 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
15611 switch(f1apMsg->present)
15613 case F1AP_PDU_PR_successfulOutcome:
15615 switch(f1apMsg->choice.successfulOutcome->value.present)
15617 case SuccessfulOutcome__value_PR_ResetAcknowledge:
15619 DU_LOG("\nINFO --> F1AP : F1ResetAcknowledge is received successfully ");
15622 case SuccessfulOutcome__value_PR_F1SetupResponse:
15624 #ifndef ODU_TEST_STUB
15625 procF1SetupRsp(f1apMsg, recvBufLen, recvBuf);
15630 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
15632 procF1GNBDUCfgUpdAck(f1apMsg);
15638 DU_LOG("\nERROR --> F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
15639 f1apMsg->choice.successfulOutcome->value.present);
15642 }/* End of switch(successfulOutcome) */
15643 free(f1apMsg->choice.successfulOutcome);
15646 case F1AP_PDU_PR_initiatingMessage:
15648 switch(f1apMsg->choice.initiatingMessage->value.present)
15650 case InitiatingMessage__value_PR_Reset:
15652 procF1ResetReq(f1apMsg);
15655 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
15657 procF1DlRrcMsgTrans(f1apMsg);
15660 case InitiatingMessage__value_PR_UEContextSetupRequest:
15662 procF1UeContextSetupReq(f1apMsg);
15665 case InitiatingMessage__value_PR_UEContextModificationRequest:
15667 procF1UeContextModificationReq(f1apMsg);
15670 case InitiatingMessage__value_PR_UEContextReleaseCommand:
15672 procF1UeContextReleaseCommand(f1apMsg);
15675 case InitiatingMessage__value_PR_Paging:
15677 procPagingMsg(f1apMsg);
15682 DU_LOG("\nERROR --> F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
15683 f1apMsg->choice.initiatingMessage->value.present);
15686 }/* End of switch(initiatingMessage) */
15687 free(f1apMsg->choice.initiatingMessage);
15693 DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
15698 }/* End of switch(f1apMsg->present) */
15700 DU_FREE(recvBuf, (Size)recvBufLen);
15701 } /* End of F1APMsgHdlr */
15703 /**********************************************************************
15705 **********************************************************************/