1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
22 #include "du_mgr_main.h"
23 #include "du_cell_mgr.h"
24 #include "du_f1ap_msg_hdl.h"
25 #include "GNB-DU-System-Information.h"
26 #include "CellGroupConfigRrc.h"
27 #include "MAC-CellGroupConfig.h"
28 #include "SchedulingRequestConfig.h"
29 #include "SchedulingRequestToAddMod.h"
30 #include "BSR-Config.h"
31 #include "TAG-Config.h"
33 #include "PHR-Config.h"
34 #include "RLC-Config.h"
35 #include "UL-AM-RLC.h"
36 #include "DL-AM-RLC.h"
37 #include "LogicalChannelConfig.h"
38 #include "RLC-BearerConfig.h"
39 #include "PhysicalCellGroupConfig.h"
40 #include "SpCellConfig.h"
41 #include "ServingCellConfig.h"
42 #include "ControlResourceSet.h"
43 #include "SearchSpace.h"
44 #include "PDCCH-Config.h"
45 #include "PDSCH-TimeDomainResourceAllocation.h"
46 #include "PDSCH-TimeDomainResourceAllocationList.h"
47 #include "DMRS-DownlinkConfig.h"
48 #include "PDSCH-Config.h"
49 #include "BWP-DownlinkDedicated.h"
50 #include "PUSCH-TimeDomainResourceAllocation.h"
51 #include "PUSCH-TimeDomainResourceAllocationList.h"
52 #include "DMRS-UplinkConfig.h"
53 #include "PUSCH-Config.h"
54 #include "BWP-UplinkDedicated.h"
55 #include "PUSCH-ServingCellConfig.h"
56 #include "UplinkConfig.h"
57 #include "PDSCH-ServingCellConfig.h"
58 #include "DUtoCURRCContainer.h"
60 extern char encBuf[ENC_BUF_MAX_LEN];
61 extern DuCfgParams duCfgParam;
62 uint8_t BuildULTnlInforet=RFAILED;
63 uint8_t ServedCellListreturn=RFAILED;
64 S16 sctpSend(Buffer *mBuf, U8 itfType);
65 uint8_t Nrcgiret=RFAILED;
66 uint8_t SplCellListret=RFAILED;
67 uint8_t SRBSetupret=RFAILED;
68 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp);
70 /*******************************************************************
72 * @brief Builds Uplink Info for NR
76 * Function : BuildULNRInfo
78 * Functionality: Building NR Uplink Info
80 * @params[in] NRFreqInfo_t *ulnrfreq
81 * @return ROK - success
84 * ****************************************************************/
85 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
88 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
89 fdd.ulNrFreqInfo.nrArfcn;
90 ulnrfreq->freqBandListNr.list.count = 1;
91 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
92 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
93 if(ulnrfreq->freqBandListNr.list.array == NULLP)
97 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
99 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
100 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
105 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
106 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
107 freqBand[0].nrFreqBand;
108 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
111 /*******************************************************************
113 * @brief Builds Downlink NR Info
117 * Function : BuildDLNRInfo
119 * Functionality: Building Downlink NR Info
121 * @params[in] NRFreqInfo_t *dlnrfreq
122 * @return ROK - success
125 * ****************************************************************/
126 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
129 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
130 fdd.dlNrFreqInfo.nrArfcn;
131 dlnrfreq->freqBandListNr.list.count = 1;
132 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
133 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
134 if(dlnrfreq->freqBandListNr.list.array == NULLP)
138 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
140 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
141 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
146 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
147 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
148 freqBand[0].nrFreqBand;
149 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
154 /*******************************************************************
156 * @brief Builds Nrcgi
160 * Function : BuildNrcgi
162 * Functionality: Building the PLMN ID and NR Cell id
164 * @params[in] NRCGI_t *nrcgi
165 * @return ROK - success
168 * ****************************************************************/
169 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
173 uint8_t byteSize = 5;
175 /* Allocate Buffer Memory */
176 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
177 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
178 if(nrcgi->pLMN_Identity.buf == NULLP)
182 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
183 &nrcgi->pLMN_Identity); // Building PLMN function
189 //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
190 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
191 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
192 if(nrcgi->nRCellIdentity.buf == NULLP)
196 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
203 /*******************************************************************
205 * @brief Builds FiveGStac
209 * Function : BuildFiveGSTac
211 * Functionality: Building the FiveGSTac
213 * @params[in] OCTET_STRING_t *fivegsTac
214 * @return ROK - success
217 * ****************************************************************/
218 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
220 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
221 if(servcell->fiveGS_TAC == NULLP)
225 servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
226 DU_ALLOC(servcell->fiveGS_TAC->buf,\
227 sizeof(servcell->fiveGS_TAC->size));
228 if(servcell->fiveGS_TAC->buf == NULLP)
232 servcell->fiveGS_TAC->buf[0] = 0;
233 servcell->fiveGS_TAC->buf[1] = 0;
234 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
237 /*******************************************************************
239 * @brief Builds NR Mode
243 * Function : BuildNrMode
245 * Functionality: Building the NR Mode
247 * @params[in] NR_Mode_Info_t *fdd
248 * @return ROK - success
251 * ****************************************************************/
252 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
254 uint8_t BuildDLNRInforet=0;
255 uint8_t BuildULNRInforet=0;
257 mode->present = NR_Mode_Info_PR_fDD;
258 if(mode->present == NR_Mode_Info_PR_fDD)
260 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
261 if(mode->choice.fDD == NULLP)
265 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
266 if(BuildULNRInforet != ROK)
270 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
271 if(BuildDLNRInforet != ROK)
276 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
277 duCfgParam.srvdCellLst[0].duCellInfo.\
278 f1Mode.mode.fdd.ulTxBw.nrScs;
279 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
280 duCfgParam.srvdCellLst[0].duCellInfo.\
281 f1Mode.mode.fdd.ulTxBw.nrb;
282 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
283 duCfgParam.srvdCellLst[0].duCellInfo.\
284 f1Mode.mode.fdd.dlTxBw.nrScs;
285 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
286 duCfgParam.srvdCellLst[0].duCellInfo.\
287 f1Mode.mode.fdd.dlTxBw.nrb;
290 /*******************************************************************
292 * @brief Builds IE Extensions for Served PLMNs
296 * Function : BuildExtensions
298 * Functionality: Building the IE Extensions
300 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
301 * @return ROK - success
304 * ****************************************************************/
305 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
309 uint8_t extensionCnt=1;
312 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
313 if((*ieExtend) == NULLP)
317 (*ieExtend)->list.count = extensionCnt;
318 (*ieExtend)->list.size = \
319 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
320 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
321 if((*ieExtend)->list.array == NULLP)
325 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
327 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
328 sizeof(ServedPLMNs_ItemExtIEs_t));
329 if((*ieExtend)->list.array[plmnidx] == NULLP)
335 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
336 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
337 (*ieExtend)->list.array[idx]->extensionValue.present = \
338 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
339 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
341 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
342 list.size = sizeof(SliceSupportItem_t *);
343 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
344 list.array,sizeof(SliceSupportItem_t *));
345 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
350 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
351 list.array[sliceId],sizeof(SliceSupportItem_t));
352 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
353 list.array[sliceId] == NULLP)
357 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
358 list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
359 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
360 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
361 extensionValue.choice.SliceSupportList.\
362 list.array[sliceId]->sNSSAI.sST.size);
363 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
364 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
368 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
369 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
370 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
371 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
372 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
373 list.array[sliceId]->sNSSAI.sD == NULLP)
377 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
378 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
379 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
380 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
381 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
382 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
383 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
388 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
389 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
391 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
392 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
394 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
395 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
398 /*******************************************************************
400 * @brief Builds Served PLMN
404 * Function : BuildServedPlmn
406 * Functionality: Building the Served PLMN
408 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
409 * @return ROK - success
412 * ****************************************************************/
413 uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
416 uint8_t servPlmnCnt=1;
417 uint8_t buildPlmnIdret=0;
418 uint8_t BuildExtensionsret=0;
419 srvplmn->list.count = servPlmnCnt;
420 srvplmn->list.size = \
421 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
422 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
423 if(srvplmn->list.array == NULLP)
427 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
429 DU_ALLOC(srvplmn->list.array[plmnidx],\
430 sizeof(ServedPLMNs_Item_t));
431 if(srvplmn->list.array[plmnidx] == NULLP)
436 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
437 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
438 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
439 &srvplmn->list.array[0]->pLMN_Identity);
440 if(buildPlmnIdret!= ROK)
444 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
445 if(BuildExtensionsret!= ROK)
451 /*******************************************************************
453 * @brief Builds Served Cell List
457 * Function : BuildServedCellList
459 * Functionality: Building Served Cell List
461 * @params[in] PLMNID plmn
462 * @return ROK - success
465 * ****************************************************************/
467 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
469 uint8_t BuildNrcgiret=0;
470 uint8_t BuildFiveGSTacret=0;
471 uint8_t BuildServedPlmnret=0;
472 uint8_t BuildNrModeret=0;
476 GNB_DU_Served_Cells_Item_t *srvCellItem;
477 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
478 duServedCell->list.count = plmnCnt;
480 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
481 if(duServedCell->list.array == NULLP)
485 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
487 DU_ALLOC(duServedCell->list.array[plmnidx],\
488 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
489 if(duServedCell->list.array[plmnidx] == NULLP)
495 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
496 duServedCell->list.array[idx]->criticality = Criticality_reject;
497 duServedCell->list.array[idx]->value.present = \
498 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
500 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
502 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
503 if(BuildNrcgiret != ROK)
508 srvCellItem->served_Cell_Information.nRPCI = \
509 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
512 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
513 if(BuildFiveGSTacret != ROK)
518 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
519 if(BuildServedPlmnret !=ROK)
523 /*nR Mode Info with FDD*/
524 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
525 if(BuildNrModeret != ROK)
529 /*Measurement timing Config*/
530 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
531 size = sizeof(uint8_t);
532 DU_ALLOC(srvCellItem->served_Cell_Information.\
533 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
534 if(srvCellItem->served_Cell_Information.\
535 measurementTimingConfiguration.buf == NULLP)
539 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
540 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
542 /* GNB DU System Information */
543 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
544 sizeof(GNB_DU_System_Information_t));
545 if(!srvCellItem->gNB_DU_System_Information)
550 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
551 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
552 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
553 srvCellItem->gNB_DU_System_Information->mIB_message.size);
554 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
558 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
559 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
562 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
563 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
565 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
566 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
567 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
571 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
573 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
574 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
578 /*******************************************************************
580 * @brief Builds RRC Version
584 * Function : BuildRrcVer
586 * Functionality: Building RRC Version
588 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
589 * @return ROK - success
592 * ****************************************************************/
593 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
597 rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
598 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
599 if(rrcVer->latest_RRC_Version.buf == NULLP)
603 rrcVer->latest_RRC_Version.buf[0] = 0;
604 rrcVer->latest_RRC_Version.bits_unused = 5;
605 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
606 if(rrcVer->iE_Extensions == NULLP)
610 rrcVer->iE_Extensions->list.count = 1;
611 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
612 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
613 if(rrcVer->iE_Extensions->list.array == NULLP)
618 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
619 sizeof(RRC_Version_ExtIEs_t));
620 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
624 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
625 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
626 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
627 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
628 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
629 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
630 .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
631 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
632 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
633 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
634 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
635 .Latest_RRC_Version_Enhanced.buf == NULLP)
640 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
641 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
643 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
644 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
646 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
647 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
650 /*******************************************************************
652 * @brief Sends F1 msg over SCTP
656 * Function : SendF1APMsg
658 * Functionality: Sends F1 msg over SCTP
660 * @params[in] Region region
662 * @return ROK - success
665 * ****************************************************************/
666 uint8_t SendF1APMsg(Region region, Pool pool)
670 if(SGetMsg(region, pool, &mBuf) == ROK)
672 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
676 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
678 DU_LOG("\nF1AP : SCTP Send failed");
685 DU_LOG("\nF1AP : SAddPstMsgMult failed");
693 DU_LOG("\nF1AP : Failed to allocate memory");
699 /*******************************************************************
701 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
705 * Function : FreeRrcVer
707 * Functionality: deallocating the memory of function BuildRrcVer
709 * @params[in] RRC_Version_t *rrcVer
713 *****************************************************************/
714 void FreeRrcVer(RRC_Version_t *rrcVer)
716 if(rrcVer->latest_RRC_Version.buf != NULLP)
718 if(rrcVer->iE_Extensions != NULLP)
720 if(rrcVer->iE_Extensions->list.array != NULLP)
722 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
724 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
727 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
728 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
729 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
731 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
733 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
735 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
737 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
740 /*******************************************************************
742 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
746 * Function : FreeServedCellList
748 * Functionality: deallocating the memory of function BuildServedCellList
751 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
755 * ****************************************************************/
756 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
762 uint8_t extensionCnt=1;
764 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
765 if(duServedCell->list.array!=NULLP)
767 if(duServedCell->list.array[0]!=NULLP)
769 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
771 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
773 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
775 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
777 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
779 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
781 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
783 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
785 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
787 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
789 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
790 extensionValue.choice.SliceSupportList.list.array!=NULLP)
792 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
793 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
795 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
796 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
798 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
799 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
801 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
802 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
804 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
806 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
807 freqBandListNr.list.array!=NULLP)
809 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
810 freqBandListNr.list.array[0]!=NULLP)
812 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
813 freqBandListNr.list.array)
815 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
816 freqBandListNr.list.array[0]!=NULLP)
818 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
820 if(!srvCellItem->gNB_DU_System_Information)
822 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
824 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
826 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
827 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
828 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
829 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
831 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
832 srvCellItem->gNB_DU_System_Information->mIB_message.size);
833 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
834 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
836 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
838 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
839 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
841 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
842 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
844 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
845 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
847 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
848 list.array[0],sizeof(FreqBandNrItem_t));
850 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
851 list.array,sizeof(FreqBandNrItem_t*));
853 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
855 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
856 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
857 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
858 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
860 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
861 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
862 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
864 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
865 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
866 sNSSAI.sST.buf,sizeof(uint8_t));
868 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
869 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
871 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
872 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
874 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
875 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
877 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
878 array[servId]->iE_Extensions->list.array,\
879 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
881 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
882 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
884 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
885 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
886 servedPLMNs.list.array[servId]->pLMN_Identity.size
889 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
890 sizeof(ServedPLMNs_Item_t *));
892 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
893 sizeof(ServedPLMNs_Item_t *));
895 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
896 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
898 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
900 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
901 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
904 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
905 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
908 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
910 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
913 /*******************************************************************
915 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
919 * Function : FreeF1SetupReq
921 * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
923 * @params[in] F1AP_PDU_t *f1apMsg
927 * ****************************************************************/
928 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
932 F1SetupRequest_t *f1SetupReq=NULLP;
937 if(f1apMsg->choice.initiatingMessage != NULLP)
939 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
940 if(f1SetupReq->protocolIEs.list.array != NULLP)
942 if(f1SetupReq->protocolIEs.list.array[idx1]!=NULLP)
944 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf != NULLP)
947 if(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf != NULLP)
950 if(ServedCellListreturn == ROK)
952 FreeRrcVer(&f1SetupReq->protocolIEs.list.array[idx1]->value.choice.RRC_Version);
955 FreeServedCellList(&f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Served_Cells_List);
957 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_Name.buf,
958 strlen((char *)duCfgParam.duName));
961 DU_FREE(f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
962 f1SetupReq->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
965 for(idx=0; idx<f1SetupReq->protocolIEs.list.count; idx++)
967 if(f1SetupReq->protocolIEs.list.array[idx]!=NULLP)
969 DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
972 DU_FREE(f1SetupReq->protocolIEs.list.array,\
973 f1SetupReq->protocolIEs.list.size);
975 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
977 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
981 /*******************************************************************
983 * @brief Builds and Send the F1SetupRequest
987 * Function : BuildAndSendF1SetupReq
989 * Functionality:Fills the F1SetupRequest
991 * @return ROK - success
994 ******************************************************************/
995 uint8_t BuildAndSendF1SetupReq()
1000 uint8_t elementCnt=0;
1001 F1AP_PDU_t *f1apMsg = NULLP;
1002 F1SetupRequest_t *f1SetupReq=NULLP;
1003 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1004 RRC_Version_t *rrcVer=NULLP;
1005 asn_enc_rval_t encRetVal; /* Encoder return value */
1006 uint8_t ret= RFAILED;
1007 uint8_t BuildRrcVerreturn=0;
1009 DU_LOG("\nF1AP : Building F1 Setup Request\n");
1012 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1013 if(f1apMsg == NULLP)
1017 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1018 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1019 if(f1apMsg->choice.initiatingMessage == NULLP)
1023 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1024 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1025 f1apMsg->choice.initiatingMessage->value.present = \
1026 InitiatingMessage__value_PR_F1SetupRequest;
1028 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1030 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1032 f1SetupReq->protocolIEs.list.count = elementCnt;
1033 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1035 /* Initialize the F1Setup members */
1036 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1037 if(f1SetupReq->protocolIEs.list.array == NULLP)
1041 for(idx=0; idx<elementCnt; idx++)
1043 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
1044 sizeof(F1SetupRequestIEs_t));
1045 if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
1053 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
1054 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1055 f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
1056 F1SetupRequestIEs__value_PR_TransactionID;
1057 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
1062 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
1063 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1064 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1065 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1066 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
1069 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
1070 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
1071 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
1077 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
1081 if(duCfgParam.duName != NULL)
1084 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
1085 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
1086 f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1087 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
1088 strlen((char *)duCfgParam.duName);
1089 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
1090 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1091 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
1096 strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
1097 choice.GNB_DU_Name.buf,
1098 (char*)&duCfgParam.duName);
1102 /*Served Cell list */
1104 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1105 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1106 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1107 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1108 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1109 duServedCell = &f1SetupReq->protocolIEs.list.\
1110 array[idx2]->value.choice.GNB_DU_Served_Cells_List;
1111 ServedCellListreturn = BuildServedCellList(duServedCell);
1112 if(ServedCellListreturn != ROK)
1118 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1119 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1120 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1121 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1122 F1SetupRequestIEs__value_PR_RRC_Version;
1123 rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1124 BuildRrcVerreturn = BuildRrcVer(rrcVer);
1125 if(BuildRrcVerreturn != ROK)
1129 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1131 /* Encode the F1SetupRequest type as APER */
1132 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1134 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1137 /* Encode results */
1138 if(encRetVal.encoded == ENCODE_FAIL)
1140 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1141 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1146 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1147 for(i=0; i< encBufSize; i++)
1149 printf("%x",encBuf[i]);
1154 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1156 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1164 FreeF1SetupReq(f1apMsg);
1167 }/* End of BuildAndSendF1SetupReq */
1169 /*******************************************************************
1171 * @brief Builds and sends the DUConfigUpdate
1175 * Function : BuildAndSendDUConfigUpdate
1177 * Functionality: Constructs the DU Update message and sends
1178 * it to the CU through SCTP.
1180 * @params[in] void **buf,Buffer to which encoded pattern is written into
1181 * @params[in] int *size,size of buffer
1183 * @return ROK - success
1186 * ****************************************************************/
1187 uint8_t BuildAndSendDUConfigUpdate()
1196 uint8_t servPlmnCnt;
1197 uint8_t extensionCnt;
1198 asn_enc_rval_t encRetVal; /* Encoder return value */
1199 F1AP_PDU_t *f1apDuCfg = NULL;
1200 GNBDUConfigurationUpdate_t *duCfgUpdate;
1201 Served_Cells_To_Modify_List_t *cellsToModify;
1202 Served_Cells_To_Modify_Item_t *modifyItem;
1203 uint8_t ret= RFAILED;
1208 DU_LOG("\nF1AP : Building DU config update\n");
1209 /* Allocate the memory for F1DuCfg */
1210 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1211 if(f1apDuCfg == NULLP)
1213 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1217 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1218 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1219 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1221 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1225 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1226 ProcedureCode_id_gNBDUConfigurationUpdate;
1227 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1228 f1apDuCfg->choice.initiatingMessage->value.present = \
1229 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1230 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1231 choice.GNBDUConfigurationUpdate;
1233 duCfgUpdate->protocolIEs.list.count = elementCnt;
1234 duCfgUpdate->protocolIEs.list.size = \
1235 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1237 /* Initialize the F1Setup members */
1238 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1239 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1241 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1244 for(idx=0;idx<elementCnt;idx++)
1246 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1247 if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1255 duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1256 duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1257 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1258 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1259 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1262 /*Served Cell to Modify */
1264 duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1265 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1266 duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1267 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1268 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1269 cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1270 Served_Cells_To_Modify_List;
1272 cellsToModify->list.count = modifyCnt;
1273 cellsToModify->list.size = \
1274 modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1275 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1276 if(cellsToModify->list.array == NULLP)
1280 for(idy=0; idy<modifyCnt ;idy++)
1282 DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1283 Served_Cells_To_Modify_ItemIEs_t));
1284 if(cellsToModify->list.array[idy] == NULLP)
1289 cellsToModify->list.array[0]->id = \
1290 ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1291 cellsToModify->list.array[0]->criticality = Criticality_reject;
1292 cellsToModify->list.array[0]->value.present =\
1293 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1294 modifyItem=&cellsToModify->list.array[0]->value.choice.\
1295 Served_Cells_To_Modify_Item;
1298 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1299 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1300 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1304 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1305 &modifyItem->oldNRCGI.pLMN_Identity);
1308 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1309 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1310 modifyItem->oldNRCGI.nRCellIdentity.size);
1311 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1315 for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1317 modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1319 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1320 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1323 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1324 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1325 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1326 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1330 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1331 &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1332 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1333 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1334 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1335 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1339 for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1340 nRCGI.nRCellIdentity.size-1 ; tmp++)
1342 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1344 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1345 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1347 modifyItem->served_Cell_Information.nRPCI = \
1348 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1351 modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1352 modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1353 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1354 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1355 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1356 if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1360 for(idy1=0;idy1<servPlmnCnt;idy1++)
1362 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1363 sizeof(ServedPLMNs_Item_t));
1364 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1369 modifyItem->served_Cell_Information.servedPLMNs.list.\
1370 array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1371 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1372 array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1373 array[0]->pLMN_Identity.size);
1374 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1375 array[0]->pLMN_Identity.buf == NULLP)
1379 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1380 &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1381 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1382 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1383 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1384 array[0]->iE_Extensions == NULLP)
1389 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1390 iE_Extensions->list.count = extensionCnt;
1391 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1392 iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1393 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1394 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1395 iE_Extensions->list.size);
1396 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1397 array[0]->iE_Extensions->list.array == NULLP)
1401 for(idy2=0;idy2<extensionCnt;idy2++)
1403 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1404 array[0]->iE_Extensions->list.array[idy2],\
1405 sizeof(ServedPLMNs_ItemExtIEs_t));
1406 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1407 array[0]->iE_Extensions->list.array[idy2] == NULLP)
1412 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1413 iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1414 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1415 iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1416 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1417 iE_Extensions->list.array[0]->extensionValue.present = \
1418 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1419 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1420 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1422 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1423 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1424 list.size = sizeof(SliceSupportItem_t *);
1425 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1426 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1427 list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1428 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1429 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1430 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1431 list.array == NULLP)
1436 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1437 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1438 list.array[0],sizeof( SliceSupportItem_t));
1439 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1440 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1441 list.array[0] == NULLP)
1445 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1446 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1447 list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1448 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1449 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1450 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1451 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1452 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1453 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1454 list.array[0]->sNSSAI.sST.buf == NULLP)
1458 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1459 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1460 list.array[0]->sNSSAI.sST.buf[0] = 3;
1461 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1462 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1463 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1464 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1465 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1466 list.array[0]->sNSSAI.sD == NULLP)
1470 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1471 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1472 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1473 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1474 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1475 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1476 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1477 list.array[0]->sNSSAI.sD->size);
1478 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1479 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1480 list.array[0]->sNSSAI.sD->buf == NULLP)
1484 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1485 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1486 list.array[0]->sNSSAI.sD->buf[0] = 3;
1487 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1488 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1489 list.array[0]->sNSSAI.sD->buf[1] = 6;
1490 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1491 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1492 list.array[0]->sNSSAI.sD->buf[2] = 9;
1494 /*nR Mode Info with FDD*/
1495 modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1496 NR_Mode_Info_PR_fDD;
1497 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1498 sizeof(FDD_Info_t));
1499 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1503 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1504 uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1505 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1506 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1507 uL_NRFreqInfo.freqBandListNr.list.count = 1;
1508 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1509 uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1510 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1511 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1512 array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1513 uL_NRFreqInfo.freqBandListNr.list.size);
1514 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1515 fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1519 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1520 uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1521 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1522 uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1526 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1527 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1528 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1529 freqBand[0].nrFreqBand;
1530 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1531 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1532 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1533 nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1534 dlNrFreqInfo.nrArfcn;
1535 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1536 freqBandListNr.list.count = 1;
1537 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1538 freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1539 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1540 dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1541 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1542 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1543 dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1547 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1548 dL_NRFreqInfo.freqBandListNr.list.array[0],\
1549 sizeof(FreqBandNrItem_t));
1550 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1551 dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1555 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1556 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1557 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1558 freqBand[0].nrFreqBand;
1559 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1560 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1562 /*Transmission Bandwidth*/
1563 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1564 uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1565 f1Mode.mode.fdd.ulTxBw.nrScs;
1566 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1567 uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1568 f1Mode.mode.fdd.ulTxBw.nrb;
1569 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1570 dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1571 f1Mode.mode.fdd.dlTxBw.nrScs;
1572 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1573 dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1574 f1Mode.mode.fdd.dlTxBw.nrb;
1575 /*Measurement timing Config*/
1576 modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1578 DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1579 buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1580 if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1584 modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1585 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1587 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1590 duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1591 duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1592 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1593 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1594 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1596 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1597 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1598 if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1602 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1605 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1607 /* Encode the DU Config Update type as APER */
1608 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
1610 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1612 /* Checking encode results */
1613 if(encRetVal.encoded == ENCODE_FAIL)
1615 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1620 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1621 for(i=0; i< encBufSize; i++)
1623 printf("%x",encBuf[i]);
1627 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1629 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1636 FreeDUConfigUpdate(f1apDuCfg);
1640 /*******************************************************************
1642 * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1646 * Function : FreeDUConfigUpdate
1648 * Functionality: Deallocating memory of variables allocated in
1649 * BuildAndSendDUConfigUpdate function
1651 * @params[in] F1AP_PDU_t *f1apDuCfg
1653 * @return ROK - void
1655 * ****************************************************************/
1656 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1660 GNBDUConfigurationUpdate_t *duCfgUpdate;
1661 Served_Cells_To_Modify_List_t *cellsToModify;
1662 Served_Cells_To_Modify_Item_t *modifyItem;
1665 if(f1apDuCfg != NULLP)
1667 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1669 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1670 value.choice.GNBDUConfigurationUpdate;
1671 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1673 if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
1675 cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
1676 value.choice.Served_Cells_To_Modify_List;
1677 if(cellsToModify->list.array != NULLP)
1679 if(cellsToModify->list.array[idx] != NULLP)
1681 modifyItem=&cellsToModify->list.array[idx]->value.choice.\
1682 Served_Cells_To_Modify_Item;
1683 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1685 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1687 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1689 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1692 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1695 if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
1697 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1698 array[idx]->pLMN_Identity.buf != NULLP)
1700 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1701 array[idx]->iE_Extensions!= NULLP)
1703 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1704 array[idx]->iE_Extensions->list.array != NULLP)
1706 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1707 array[idx]->iE_Extensions->list.array[idx])
1709 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1710 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1713 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1714 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1715 list.array[idx]!=NULLP)
1717 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1718 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1719 list.array[idx]->sNSSAI.sST.buf!=NULLP)
1721 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1722 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1723 list.array[idx]->sNSSAI.sD != NULLP)
1725 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1726 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1727 list.array[idx]->sNSSAI.sD->buf!=NULLP)
1729 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1732 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1733 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1735 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1736 fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
1738 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1739 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1741 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1742 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1745 if(modifyItem->served_Cell_Information.\
1746 measurementTimingConfiguration.buf !=NULLP)
1749 if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
1750 choice.GNB_DU_ID.buf!=NULLP)
1752 DU_FREE(duCfgUpdate->protocolIEs.list.\
1753 array[idx]->value.choice.GNB_DU_ID.buf,\
1754 duCfgUpdate->protocolIEs.list.array[idx]->\
1755 value.choice.GNB_DU_ID.size);
1758 DU_FREE(modifyItem->served_Cell_Information.\
1759 measurementTimingConfiguration.\
1760 buf,modifyItem->served_Cell_Information.\
1761 measurementTimingConfiguration.size);
1763 DU_FREE(modifyItem->served_Cell_Information.\
1764 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1765 list.array[idx],sizeof(FreqBandNrItem_t));
1767 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1768 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1769 modifyItem->served_Cell_Information.nR_Mode_Info.\
1770 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1772 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1773 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1774 array[idx],sizeof(FreqBandNrItem_t));
1776 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1778 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1779 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1780 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1782 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1783 fDD,sizeof(FDD_Info_t));
1785 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1786 array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1788 list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1789 servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
1790 extensionValue.choice.SliceSupportList.list.array[idx]->\
1794 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1796 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1797 list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1799 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1800 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1801 list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
1803 list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1804 SliceSupportList.list.array[idx]->sNSSAI.sST.size);
1806 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1807 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1808 list.array[idx],sizeof(SliceSupportItem_t));
1810 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1811 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1813 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1814 iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
1817 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
1818 array[idx]->iE_Extensions->list.count;i++)
1820 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1821 array[idx]->iE_Extensions->list.array[i],\
1822 sizeof(ServedPLMNs_ItemExtIEs_t ));
1824 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1825 array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1826 list.array[idx]->iE_Extensions->list.size);
1828 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1829 array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1831 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1832 array[idx]->pLMN_Identity.buf,
1833 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
1836 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1838 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
1841 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1842 sizeof(ServedPLMNs_Item_t));
1845 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1846 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1848 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1849 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1851 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1852 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1854 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1855 modifyItem->oldNRCGI.nRCellIdentity.size);
1857 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1858 modifyItem->oldNRCGI.pLMN_Identity.size);
1861 for(i=0; i<cellsToModify->list.count ;i++)
1863 if(cellsToModify->list.array[i] != NULLP)
1865 DU_FREE(cellsToModify->list.array[i],\
1866 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1869 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1872 for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
1874 if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
1876 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1877 sizeof(GNBDUConfigurationUpdateIEs_t));
1880 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1882 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1884 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1887 /*******************************************************************
1889 * @brief free the ULRRCMessageTransfer
1893 * Function : FreeULRRCMessageTransfer
1895 * Functionality: Deallocating the memory of variable allocated in
1896 * FreeULRRCMessageTransfer
1900 * @return ROK - void
1902 ******************************************************************/
1903 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
1906 ULRRCMessageTransfer_t *ulRRCMsg;
1908 if(f1apMsg != NULLP)
1910 if(f1apMsg->choice.initiatingMessage != NULLP)
1912 ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1913 if(ulRRCMsg->protocolIEs.list.array != NULLP)
1915 for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
1917 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
1919 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
1922 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
1924 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1926 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1929 /*******************************************************************
1931 * @brief Builds and sends the ULRRCMessageTransfer
1935 * Function : BuildAndSendULRRCMessageTransfer
1937 * Functionality: Constructs the UL RRC Message Transfer and sends
1938 * it to the CU through SCTP.
1942 * @return ROK - success
1945 * ****************************************************************/
1946 uint8_t BuildAndSendULRRCMessageTransfer()
1951 F1AP_PDU_t *f1apMsg = NULL;
1952 ULRRCMessageTransfer_t *ulRRCMsg;
1953 asn_enc_rval_t encRetVal; /* Encoder return value */
1954 uint8_t ret =RFAILED;
1957 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1959 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1960 if(f1apMsg == NULLP)
1962 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1966 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1967 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1968 if(f1apMsg->choice.initiatingMessage == NULLP)
1970 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1973 f1apMsg->choice.initiatingMessage->procedureCode = \
1974 ProcedureCode_id_ULRRCMessageTransfer;
1975 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1976 f1apMsg->choice.initiatingMessage->value.present = \
1977 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1979 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1981 ulRRCMsg->protocolIEs.list.count = elementCnt;
1982 ulRRCMsg->protocolIEs.list.size = \
1983 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
1985 /* Initialize the F1Setup members */
1986 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
1987 if(ulRRCMsg->protocolIEs.list.array == NULLP)
1989 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
1992 for(idx=0; idx<elementCnt; idx++)
1994 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
1995 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2003 /*GNB CU UE F1AP ID*/
2004 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2005 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2006 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2007 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2008 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2009 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2011 /*GNB DU UE F1AP ID*/
2013 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2014 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2015 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2016 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2017 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2018 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2022 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
2023 ProtocolIE_ID_id_SRBID;
2024 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2025 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2026 ULRRCMessageTransferIEs__value_PR_SRBID;
2027 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = UL_SRBID;
2032 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2034 /* Encode the F1SetupRequest type as APER */
2035 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2037 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2039 /* Encode results */
2040 if(encRetVal.encoded == ENCODE_FAIL)
2042 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2043 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2048 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2049 for(int i=0; i< encBufSize; i++)
2051 printf("%x",encBuf[i]);
2056 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
2058 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
2064 FreeULRRCMessageTransfer(f1apMsg);
2067 }/* End of BuildAndSendULRRCMessageTransfer*/
2069 /*******************************************************************
2071 * @brief Builds tag config
2075 * Function : BuildTagConfig
2077 * Functionality: Builds tag config in MacCellGroupConfig
2079 * @params[in] TAG_Config *tag_Config
2081 * @return ROK - success
2084 * ****************************************************************/
2085 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2087 struct TAG_Config__tag_ToAddModList *tagList;
2088 uint8_t idx, elementCnt;
2090 tagConfig->tag_ToReleaseList = NULLP;
2091 tagConfig->tag_ToAddModList = NULLP;
2092 DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2093 if(!tagConfig->tag_ToAddModList)
2095 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2099 elementCnt = 1; //ODU_VALUE_ONE;
2100 tagList = tagConfig->tag_ToAddModList;
2101 tagList->list.count = elementCnt;
2102 tagList->list.size = elementCnt * sizeof(struct TAG *);
2104 tagList->list.array = NULLP;
2105 DU_ALLOC(tagList->list.array, tagList->list.size);
2106 if(!tagList->list.array)
2108 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2112 for(idx=0; idx<tagList->list.count; idx++)
2114 tagList->list.array[idx] = NULLP;
2115 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2116 if(!tagList->list.array[idx])
2118 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2124 tagList->list.array[idx]->tag_Id = TAG_ID;
2125 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2130 /*******************************************************************
2132 * @brief Builds PHR Config
2136 * Function : BuildPhrConfig
2138 * Functionality: Builds phrConfig in MacCellGroupConfig
2140 * @params[in] PHR Config *
2142 * @return ROK - success
2145 * ****************************************************************/
2146 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2149 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2150 phrConfig->choice.setup = NULLP;
2151 DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2152 if(!phrConfig->choice.setup)
2154 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2158 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
2159 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
2160 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2161 phrConfig->choice.setup->multiplePHR = false;
2162 phrConfig->choice.setup->dummy = false;
2163 phrConfig->choice.setup->phr_Type2OtherCell = false;
2164 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
2169 /*******************************************************************
2171 * @brief Builds BSR Config
2175 * Function : BuildBsrConfig
2177 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2179 * @params[in] BSR_Config *bsrConfig
2181 * @return ROK - success
2184 * ****************************************************************/
2185 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2187 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2188 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
2189 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2194 /*******************************************************************
2196 * @brief Builds scheduling request config
2200 * Function : BuildSchedulingReqConfig
2202 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2204 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2206 * @return ROK - success
2209 * ****************************************************************/
2210 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2212 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2213 uint8_t idx, elementCnt;
2215 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2216 DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2217 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2218 if(!schedulingRequestConfig->schedulingRequestToAddModList)
2220 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2224 elementCnt = 1; //ODU_VALUE_ONE;
2225 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2226 schReqList->list.count = elementCnt;
2227 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2229 schReqList->list.array = NULLP;
2230 DU_ALLOC(schReqList->list.array, schReqList->list.size);
2231 if(!schReqList->list.array)
2233 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2237 for(idx=0;idx<schReqList->list.count; idx++)
2239 schReqList->list.array[idx] = NULLP;
2240 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2241 if(!schReqList->list.array[idx])
2243 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2249 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2251 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2252 DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2253 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2255 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2258 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2259 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2260 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2265 /*******************************************************************
2267 * @brief Builds RLC Config
2271 * Function : BuildRlcConfig
2273 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
2275 * @params[in] RLC_Config *rlcConfig
2277 * @return ROK - success
2280 * ****************************************************************/
2281 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2284 rlcConfig->present = RLC_Config_PR_am;
2286 rlcConfig->choice.am = NULLP;
2287 DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2288 if(!rlcConfig->choice.am)
2290 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2295 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2296 DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2297 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2299 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2302 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2303 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
2304 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
2305 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
2306 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
2309 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2310 DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2311 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2313 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2316 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2317 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
2318 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
2323 /*******************************************************************
2325 * @brief Builds MAC LC Config
2329 * Function : BuildMacLCConfig
2331 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
2333 * @params[in] struct LogicalChannelConfig macLcConfig
2335 * @return ROK - success
2338 * ****************************************************************/
2339 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2342 macLcConfig->ul_SpecificParameters = NULLP;
2343 DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2344 if(!macLcConfig->ul_SpecificParameters)
2346 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2350 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2351 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
2352 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
2353 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2354 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2355 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2356 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2358 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2359 DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
2360 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2362 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2365 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2367 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2368 DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
2369 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2371 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2374 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2376 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2377 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2378 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2383 /*******************************************************************
2385 * @brief Builds RLC Bearer to Add/Mod list
2389 * Function :BuildRlcBearerToAddModList
2391 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2393 * @params[in] rlc_BearerToAddModList
2395 * @return ROK - success
2398 * ****************************************************************/
2399 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2401 uint8_t idx, elementCnt;
2404 rlcBearerList->list.count = elementCnt;
2405 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
2407 rlcBearerList->list.array = NULLP;
2408 DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2409 if(!rlcBearerList->list.array)
2411 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2415 for(idx=0; idx<rlcBearerList->list.count; idx++)
2417 rlcBearerList->list.array[idx] = NULLP;
2418 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2419 if(!rlcBearerList->list.array[idx])
2421 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2427 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
2429 DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2430 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2432 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2436 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2437 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
2439 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2440 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2441 DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2442 if(!rlcBearerList->list.array[idx]->rlc_Config)
2444 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2448 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2450 DU_LOG("\nF1AP : BuildRlcConfig failed");
2454 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2455 DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2456 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2458 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2462 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2464 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2471 /*******************************************************************
2473 * @brief Build Control resource set to add/modify list
2477 * Function : BuildControlRSetToAddModList
2479 * Functionality: Build Control resource set to add/modify list
2482 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2484 * @return ROK - success
2487 * ****************************************************************/
2488 uint8_t BuildControlRSetToAddModList
2490 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2498 struct ControlResourceSet *controlRSet;
2501 controlRSetList->list.count = elementCnt;
2502 controlRSetList->list.size = \
2503 elementCnt * sizeof(struct ControlResourceSet *);
2505 controlRSetList->list.array = NULLP;
2506 DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2507 if(!controlRSetList->list.array)
2509 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2513 for(idx = 0; idx < elementCnt; idx++)
2515 controlRSetList->list.array[idx] = NULLP;
2516 DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2517 if(!controlRSetList->list.array[idx])
2519 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2525 controlRSet = controlRSetList->list.array[idx];
2527 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2529 /* Values taken from reference logs :
2532 * Bit string stored ff0000000000
2536 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2538 controlRSet->frequencyDomainResources.buf = NULLP;
2539 DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2540 controlRSet->frequencyDomainResources.size);
2541 if(!controlRSet->frequencyDomainResources.buf)
2543 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2547 controlRSet->frequencyDomainResources.buf[byteIdx] = 255; /* setting 8 MSBs i.e. ff */
2548 for(byteIdx = 1; byteIdx < numBytes; byteIdx++)
2550 controlRSet->frequencyDomainResources.buf[byteIdx] = 0;
2552 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2554 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2555 controlRSet->cce_REG_MappingType.present = \
2556 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2558 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2559 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2560 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2561 controlRSet->tci_PresentInDCI = NULLP;
2563 uint8_t tciStateIdx;
2565 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2566 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2567 if(!controlRset->tci_StatesPDCCH_ToAddList)
2569 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2574 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2575 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2576 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2577 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2578 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2580 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2584 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2586 DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2587 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2589 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2596 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2598 DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2599 if(!controlRset->tci_PresentInDCI)
2601 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2605 *(controlRset->tci_PresentInDCI);
2608 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2609 DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2610 if(!controlRSet->pdcch_DMRS_ScramblingID)
2612 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2615 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2618 } /* End BuildControlRSetToAddModList */
2620 /*******************************************************************
2622 * @brief Build search space to add/modify list
2626 * Function : BuildSearchSpcToAddModList
2628 * Functionality: Build search space to add/modify list
2631 * @return ROK - success
2634 * ****************************************************************/
2635 uint8_t BuildSearchSpcToAddModList
2637 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2645 struct SearchSpace *searchSpc;
2648 searchSpcList->list.count = elementCnt;
2649 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2651 searchSpcList->list.array = NULLP;
2652 DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2653 if(!searchSpcList->list.array)
2655 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2659 for(idx = 0; idx < elementCnt; idx++)
2661 searchSpcList->list.array[idx] = NULLP;
2662 DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2663 if(!searchSpcList->list.array[idx])
2665 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2671 searchSpc = searchSpcList->list.array[idx];
2673 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2675 searchSpc->controlResourceSetId = NULLP;
2676 DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2677 if(!searchSpc->controlResourceSetId)
2679 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2682 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2684 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2685 DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2686 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2687 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2689 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2692 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2693 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2695 searchSpc->duration = NULLP;
2696 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2697 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2698 if(!searchSpc->monitoringSymbolsWithinSlot)
2700 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2704 /* Values taken from reference logs :
2707 * Bit string stores 8000
2712 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2713 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2714 DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2715 searchSpc->monitoringSymbolsWithinSlot->size);
2716 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2718 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2723 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 128 /* setting MSB to 128 i.e. 0x80 */;
2724 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2725 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2727 searchSpc->nrofCandidates = NULLP;
2728 DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2729 if(!searchSpc->nrofCandidates)
2731 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2735 searchSpc->nrofCandidates->aggregationLevel1 = \
2736 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2737 searchSpc->nrofCandidates->aggregationLevel2 = \
2738 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2739 searchSpc->nrofCandidates->aggregationLevel4 = \
2740 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2741 searchSpc->nrofCandidates->aggregationLevel8 = \
2742 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2743 searchSpc->nrofCandidates->aggregationLevel16 = \
2744 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2746 searchSpc->searchSpaceType = NULLP;
2747 DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2748 if(!searchSpc->searchSpaceType)
2750 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2754 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2756 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
2757 DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
2758 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
2759 if(!searchSpc->searchSpaceType->choice.ue_Specific)
2761 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2764 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
2765 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
2768 }/* End BuildSearchSpcToAddModList */
2770 /*******************************************************************
2772 * @brief Builds BWP DL dedicated PDCCH config
2776 * Function : BuildBWPDlDedPdcchCfg
2778 * Functionality: Builds BWP DL dedicated PDCCH config
2780 * @params[in] struct PDCCH_Config *pdcchCfg
2782 * @return ROK - success
2785 * ****************************************************************/
2786 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
2788 pdcchCfg->controlResourceSetToAddModList = NULLP;
2789 DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
2790 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
2791 if(!pdcchCfg->controlResourceSetToAddModList)
2793 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2797 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
2802 pdcchCfg->controlResourceSetToReleaseList = NULLP;
2804 pdcchCfg->searchSpacesToAddModList = NULLP;
2805 DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
2806 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
2807 if(!pdcchCfg->searchSpacesToAddModList)
2809 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2813 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
2818 pdcchCfg->searchSpacesToReleaseList = NULLP;
2819 pdcchCfg->downlinkPreemption = NULLP;
2820 pdcchCfg->tpc_PUSCH = NULLP;
2821 pdcchCfg->tpc_PUCCH = NULLP;
2822 pdcchCfg->tpc_SRS = NULLP;
2827 /*******************************************************************
2829 * @brief Builds DMRS DL PDSCH Mapping type A
2833 * Function : BuildDMRSDLPdschMapTypeA
2835 * Functionality: Builds DMRS DL PDSCH Mapping type A
2838 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2839 * @return ROK - success
2842 * ****************************************************************/
2843 uint8_t BuildDMRSDLPdschMapTypeA
2845 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
2848 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
2849 dmrsDlCfg->choice.setup = NULLP;
2850 DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
2851 if(!dmrsDlCfg->choice.setup)
2853 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
2857 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
2858 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
2859 DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
2860 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
2862 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
2865 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
2867 dmrsDlCfg->choice.setup->maxLength = NULLP;
2868 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
2869 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
2870 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
2875 /*******************************************************************
2877 * @brief Builds TCI states to add/modify list
2881 * Function : BuildTCIStatesToAddModList
2883 * Functionality:Builds TCI states to add/modify list
2886 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
2888 * @return ROK - success
2891 * ****************************************************************/
2892 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
2897 /*******************************************************************
2899 * @brief Builds PDSCH time domain allocation list
2903 * Function : BuildPdschTimeDomAllocList
2905 * Functionality: Builds PDSCH time domain allocation list
2908 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2910 * @return ROK - success
2913 * ****************************************************************/
2914 uint8_t BuildPdschTimeDomAllocList
2916 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
2921 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
2923 timeDomAllocList->present = \
2924 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
2926 timeDomAllocList->choice.setup = NULLP;
2927 DU_ALLOC(timeDomAllocList->choice.setup, \
2928 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
2929 if(!timeDomAllocList->choice.setup)
2931 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2936 timeDomAllocList->choice.setup->list.count = elementCnt;
2937 timeDomAllocList->choice.setup->list.size = \
2938 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
2940 timeDomAllocList->choice.setup->list.array = NULLP;
2941 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
2942 timeDomAllocList->choice.setup->list.size);
2943 if(!timeDomAllocList->choice.setup->list.array)
2945 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2949 for(idx = 0; idx < elementCnt; idx++)
2951 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
2952 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
2953 sizeof(struct PDSCH_TimeDomainResourceAllocation));
2954 if(!timeDomAllocList->choice.setup->list.array[idx])
2956 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
2962 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
2964 timeDomAlloc->k0 = NULLP;
2965 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
2966 timeDomAlloc->startSymbolAndLength = \
2967 calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
2972 /*******************************************************************
2974 * @brief Builds PDSCH PRB Bundling type
2978 * Function : BuildPdschPrbBundlingType
2980 * Functionality: Builds PDSCH PRB Bundling type
2983 * struct PDSCH_Config__prb_BundlingType *prbBndlType
2985 * @return ROK - success
2988 * ****************************************************************/
2989 uint8_t BuildPdschPrbBundlingType
2991 struct PDSCH_Config__prb_BundlingType *prbBndlType
2994 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
2996 prbBndlType->choice.staticBundling = NULLP;
2997 DU_ALLOC(prbBndlType->choice.staticBundling, \
2998 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
2999 if(!prbBndlType->choice.staticBundling)
3001 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3004 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3009 /*******************************************************************
3011 * @brief Builds BWP DL dedicated PDSCH config
3015 * Function : BuildBWPDlDedPdschCfg
3017 * Functionality: Builds BWP DL dedicated PDSCH config
3019 * @params[in] struct PDSCH_Config *pdschCfg
3021 * @return ROK - success
3024 * ****************************************************************/
3025 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3027 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3029 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3030 DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3031 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3032 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3034 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3038 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3043 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3044 pdschCfg->tci_StatesToAddModList = NULLP;
3045 pdschCfg->tci_StatesToReleaseList = NULLP;
3046 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3048 DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3049 if(!pdschCfg->tci_StatesToAddModList)
3051 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3054 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3060 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3062 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3063 DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3064 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3065 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3067 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3071 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3076 pdschCfg->pdsch_AggregationFactor = NULLP;
3077 pdschCfg->rateMatchPatternToAddModList = NULLP;
3078 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3079 pdschCfg->rateMatchPatternGroup1 = NULLP;
3080 pdschCfg->rateMatchPatternGroup2 = NULLP;
3081 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3082 pdschCfg->mcs_Table = NULLP;
3084 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3085 DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3086 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3088 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3091 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3093 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3098 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3099 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3100 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3101 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3102 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3103 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3104 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3109 /*******************************************************************
3111 * @brief Builds intitial DL BWP
3114 * Function : BuildInitialDlBWP
3116 * Functionality: Builds intitial DL BWP in spCellCfgDed
3118 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3120 * @return ROK - success
3123 * ****************************************************************/
3124 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3126 dlBwp->pdcch_Config = NULLP;
3127 DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3128 if(!dlBwp->pdcch_Config)
3130 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3133 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3135 dlBwp->pdcch_Config->choice.setup = NULLP;
3136 DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3137 if(!dlBwp->pdcch_Config->choice.setup)
3139 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3142 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3147 dlBwp->pdsch_Config = NULLP;
3148 DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3149 if(!dlBwp->pdsch_Config)
3151 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3154 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3156 dlBwp->pdsch_Config->choice.setup = NULLP;
3157 DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3158 if(!dlBwp->pdsch_Config->choice.setup)
3160 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3164 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3169 dlBwp->sps_Config = NULLP;
3170 dlBwp->radioLinkMonitoringConfig = NULLP;
3174 /*******************************************************************
3176 * @brief Builds DMRS UL Pusch Mapping type A
3180 * Function : BuildDMRSULPuschMapTypeA
3182 * Functionality: Builds DMRS UL Pusch Mapping type A
3185 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3186 * @return ROK - success
3189 * ****************************************************************/
3190 uint8_t BuildDMRSULPuschMapTypeA
3192 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3195 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3196 dmrsUlCfg->choice.setup= NULLP;
3197 DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3198 if(!dmrsUlCfg->choice.setup)
3200 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3204 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3205 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3206 DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3207 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3209 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3212 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3214 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3215 dmrsUlCfg->choice.setup->maxLength = NULLP;
3216 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3217 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3218 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3219 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3221 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3225 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3226 DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3228 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3230 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3233 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3235 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3236 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3240 /*******************************************************************
3242 * @brief Build PUSCH time domain allocation list
3246 * Function : BuildPuschTimeDomAllocList
3248 * Functionality: Build PUSCH time domain allocation list
3251 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3253 * @return ROK - success
3256 * ****************************************************************/
3257 uint8_t BuildPuschTimeDomAllocList
3259 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3264 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3266 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3267 timeDomAllocList->choice.setup = NULLP;
3268 DU_ALLOC(timeDomAllocList->choice.setup, \
3269 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3270 if(!timeDomAllocList->choice.setup)
3272 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3277 timeDomAllocList->choice.setup->list.count = elementCnt;
3278 timeDomAllocList->choice.setup->list.size = \
3279 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3280 timeDomAllocList->choice.setup->list.array = NULLP;
3281 DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3282 timeDomAllocList->choice.setup->list.size);
3283 if(!timeDomAllocList->choice.setup->list.array)
3285 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3289 for(idx = 0; idx < elementCnt; idx++)
3291 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3292 DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3293 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3294 if(!timeDomAllocList->choice.setup->list.array[idx])
3296 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3302 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3303 DU_ALLOC(timeDomAlloc->k2, sizeof(long));
3304 if(!timeDomAlloc->k2)
3306 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3309 *(timeDomAlloc->k2) = PUSCH_K2;
3310 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3311 timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
3315 /*******************************************************************
3317 * @brief Builds BWP UL dedicated PUSCH Config
3321 * Function : BuildBWPUlDedPuschCfg
3324 * Builds BWP UL dedicated PUSCH Config
3326 * @params[in] : PUSCH_Config_t *puschCfg
3328 * @return ROK - success
3331 * ****************************************************************/
3332 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3334 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3335 DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3336 if(!puschCfg->dataScramblingIdentityPUSCH)
3338 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3341 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3343 puschCfg->txConfig = NULLP;
3344 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3345 DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3346 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3347 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3349 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3353 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3358 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3359 puschCfg->pusch_PowerControl = NULLP;
3360 puschCfg->frequencyHopping = NULLP;
3361 puschCfg->frequencyHoppingOffsetLists = NULLP;
3362 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3364 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3365 DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3366 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3367 if(!puschCfg->pusch_TimeDomainAllocationList)
3369 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3373 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3378 puschCfg->pusch_AggregationFactor = NULLP;
3379 puschCfg->mcs_Table = NULLP;
3380 puschCfg->mcs_TableTransformPrecoder = NULLP;
3381 puschCfg->transformPrecoder = NULLP;
3382 DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3383 if(!puschCfg->transformPrecoder)
3385 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3388 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3390 puschCfg->codebookSubset = NULLP;
3391 puschCfg->maxRank = NULLP;
3392 puschCfg->rbg_Size = NULLP;
3393 puschCfg->uci_OnPUSCH = NULLP;
3394 puschCfg->tp_pi2BPSK = NULLP;
3399 /*******************************************************************
3401 * @brief Builds inital UL BWP
3405 * Function : BuildInitialUlBWP
3407 * Functionality: Builds initial UL BWP
3409 * @params[in] BWP_UplinkDedicated_t *ulBwp
3410 * @return ROK - success
3413 * ****************************************************************/
3414 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3416 ulBwp->pucch_Config = NULLP;
3417 ulBwp->pusch_Config = NULLP;
3418 DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3419 if(!ulBwp->pusch_Config)
3421 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3425 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3426 ulBwp->pusch_Config->choice.setup = NULLP;
3427 DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3428 if(!ulBwp->pusch_Config->choice.setup)
3430 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3434 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3439 ulBwp->configuredGrantConfig = NULLP;
3440 ulBwp->srs_Config = NULLP;
3441 ulBwp->beamFailureRecoveryConfig = NULLP;
3446 /*******************************************************************
3448 * @brief Builds Pusch Serving cell Config
3452 * Function : BuildPuschSrvCellCfg
3454 * Functionality: Builds Pusch Serving cell Config
3456 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3458 * @return ROK - success
3461 * ****************************************************************/
3462 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3464 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3465 puschCfg->choice.setup = NULLP;
3466 DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3467 if(!puschCfg->choice.setup)
3469 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3473 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3474 puschCfg->choice.setup->rateMatching = NULLP;
3475 puschCfg->choice.setup->xOverhead = NULLP;
3476 puschCfg->choice.setup->ext1 = NULLP;
3477 DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3478 if(!puschCfg->choice.setup->ext1)
3480 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3484 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
3485 DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
3486 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
3488 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3491 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
3493 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
3494 DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
3495 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
3497 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3500 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
3504 /*******************************************************************
3506 * @brief Builds UL config
3509 * Function : BuildUlCfg
3511 * Functionality: Builds UL config in spCellCfgDed
3513 * @params[in] UplinkConfig_t *ulCfg
3515 * @return ROK - success
3518 * ****************************************************************/
3519 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
3521 ulCfg->initialUplinkBWP = NULLP;
3522 DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
3523 if(!ulCfg->initialUplinkBWP)
3525 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3529 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
3534 ulCfg->uplinkBWP_ToReleaseList = NULLP;
3535 ulCfg->uplinkBWP_ToAddModList = NULLP;
3536 ulCfg->firstActiveUplinkBWP_Id = NULLP;
3537 DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
3538 if(!ulCfg->firstActiveUplinkBWP_Id)
3540 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3543 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
3545 ulCfg->pusch_ServingCellConfig = NULLP;
3546 DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
3547 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
3548 if(!ulCfg->pusch_ServingCellConfig)
3550 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
3554 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
3559 ulCfg->carrierSwitching = NULLP;
3560 ulCfg->ext1 = NULLP;
3564 /*******************************************************************
3566 * @brief Builds PDSCH serving cell config
3569 * Function : BuildPdschSrvCellCfg
3571 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
3573 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
3575 * @return ROK - success
3578 * ****************************************************************/
3579 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
3581 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
3582 pdschCfg->choice.setup = NULLP;
3583 DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
3584 if(!pdschCfg->choice.setup)
3586 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3590 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3591 pdschCfg->choice.setup->xOverhead = NULLP;
3592 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
3593 DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
3594 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
3596 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
3599 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
3600 pdschCfg->choice.setup->pucch_Cell = NULLP;
3601 pdschCfg->choice.setup->ext1 = NULLP;
3606 /*******************************************************************
3608 * @brief Builds CSI Meas config
3611 * Function : BuildCsiMeasCfg
3613 * Functionality: Builds CSI Meas config in spCellCfgDed
3615 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
3617 * @return ROK - success
3620 * ****************************************************************/
3621 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
3627 /*******************************************************************
3629 * @brief Builds Spcell config dedicated
3632 * Function : BuildSpCellCfgDed
3634 * Functionality: Builds sp cell config dedicated in spCellCfg
3636 * @params[in] ServingCellConfig_t srvCellCfg
3638 * @return ROK - success
3641 * ****************************************************************/
3642 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
3644 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
3646 srvCellCfg->initialDownlinkBWP = NULLP;
3647 DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
3648 if(!srvCellCfg->initialDownlinkBWP)
3650 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3654 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
3656 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
3660 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
3661 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
3663 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
3664 DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
3665 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
3667 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3670 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
3672 srvCellCfg->bwp_InactivityTimer = NULLP;
3674 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
3675 DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
3676 if(!srvCellCfg->defaultDownlinkBWP_Id)
3678 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3681 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
3683 srvCellCfg->uplinkConfig = NULLP;
3684 DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
3685 if(!srvCellCfg->uplinkConfig)
3687 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3691 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
3693 DU_LOG("\nF1AP : BuildUlCfg failed");
3697 srvCellCfg->supplementaryUplink = NULLP;
3698 srvCellCfg->pdcch_ServingCellConfig = NULLP;
3700 srvCellCfg->pdsch_ServingCellConfig = NULLP;
3701 DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
3702 if(!srvCellCfg->pdsch_ServingCellConfig)
3704 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3708 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
3710 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
3714 srvCellCfg->csi_MeasConfig = NULLP;
3716 DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
3717 if(!srvCellCfg->csi_MeasConfig)
3719 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
3723 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
3725 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
3729 srvCellCfg->sCellDeactivationTimer = NULLP;
3730 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
3731 srvCellCfg->tag_Id = TAG_ID;
3732 srvCellCfg->dummy = NULLP;
3733 srvCellCfg->pathlossReferenceLinking = NULLP;
3734 srvCellCfg->servingCellMO = NULLP;
3735 srvCellCfg->ext1 = NULLP;
3739 /*******************************************************************
3741 * @brief Builds Spcell config
3745 * Function : BuildSpCellCfg
3747 * Functionality: Builds sp cell config in DuToCuRrcContainer
3749 * @params[in] SpCellConfig_t spCellCfg
3751 * @return ROK - success
3754 * ****************************************************************/
3755 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
3758 spCellCfg->servCellIndex = NULLP;
3759 DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
3760 if(!spCellCfg->servCellIndex)
3762 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
3765 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
3767 spCellCfg->reconfigurationWithSync = NULLP;
3768 spCellCfg->rlf_TimersAndConstants = NULLP;
3769 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
3770 DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
3771 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
3773 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
3776 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
3778 spCellCfg->spCellConfigDedicated = NULLP;
3779 DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
3780 if(!spCellCfg->spCellConfigDedicated)
3782 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
3785 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
3787 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
3792 /*******************************************************************
3794 * @brief Builds Phy cell group config
3798 * Function : BuildPhyCellGrpCfg
3800 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
3802 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
3804 * @return ROK - success
3807 * ****************************************************************/
3808 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
3810 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
3811 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
3813 phyCellGrpCfg->p_NR_FR1 = NULLP;
3814 DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
3815 if(!phyCellGrpCfg->p_NR_FR1)
3817 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
3820 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
3821 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
3822 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
3823 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
3824 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
3825 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
3826 phyCellGrpCfg->cs_RNTI = NULLP;
3827 phyCellGrpCfg->ext1 = NULLP;
3828 phyCellGrpCfg->ext2 = NULLP;
3832 /*******************************************************************
3834 * @brief Builds Mac cell group config
3838 * Function : BuildMacCellGrpCfg
3840 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
3842 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
3844 * @return ROK - success
3847 * ****************************************************************/
3848 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
3850 macCellGrpCfg->drx_Config = NULLP;
3851 macCellGrpCfg->schedulingRequestConfig = NULLP;
3852 DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
3853 if(!macCellGrpCfg->schedulingRequestConfig)
3855 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
3859 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
3861 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
3865 macCellGrpCfg->bsr_Config = NULLP;
3866 DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
3867 if(!macCellGrpCfg->bsr_Config)
3869 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
3873 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
3875 DU_LOG("\nF1AP : BuildBsrConfig failed");
3879 macCellGrpCfg->tag_Config = NULLP;
3880 DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
3881 if(!macCellGrpCfg->tag_Config)
3883 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
3887 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
3889 DU_LOG("\nF1AP : BuildTagConfig failed");
3893 macCellGrpCfg->phr_Config = NULLP;
3894 DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
3895 if(!macCellGrpCfg->phr_Config)
3897 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
3901 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
3903 DU_LOG("\nF1AP : BuildPhrConfig failed");
3907 macCellGrpCfg->skipUplinkTxDynamic = false;
3908 macCellGrpCfg->ext1 = NULLP;
3913 /*******************************************************************
3915 * @brief Frees emmory allocated for DUToCURRCContainer
3919 * Function : FreeMemDuToCuRrcCont
3921 * Functionality: Builds DuToCuRrcContainer
3923 * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
3925 * @return ROK - success
3928 * ****************************************************************/
3929 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
3932 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList;
3933 struct RLC_Config *rlcConfig;
3934 struct LogicalChannelConfig *macLcConfig;
3935 MAC_CellGroupConfig_t *macCellGrpCfg;
3936 struct SchedulingRequestConfig *schedulingRequestConfig;
3937 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
3938 struct TAG_Config *tagConfig;
3939 struct TAG_Config__tag_ToAddModList *tagList;
3940 struct MAC_CellGroupConfig__phr_Config *phrConfig;
3941 PhysicalCellGroupConfig_t *phyCellGrpCfg;
3942 SpCellConfig_t *spCellCfg;
3943 ServingCellConfig_t *srvCellCfg;
3945 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
3948 if(rlcBearerList->list.array)
3950 for(idx=0; idx<rlcBearerList->list.count; idx++)
3952 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
3953 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
3956 if(rlcConfig->choice.am)
3958 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
3959 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
3960 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
3962 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
3964 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
3967 if(macLcConfig->ul_SpecificParameters)
3969 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
3970 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
3971 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
3973 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
3975 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
3977 DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
3979 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
3982 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
3985 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
3986 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
3988 if(schedulingRequestConfig)
3992 if(schReqList->list.array)
3994 for(idx=0;idx<schReqList->list.count; idx++)
3996 if(schReqList->list.array[idx])
3998 DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
3999 DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4002 DU_FREE(schReqList->list.array, schReqList->list.size);
4004 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
4005 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
4006 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4009 if(macCellGrpCfg->bsr_Config)
4011 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4014 tagConfig = macCellGrpCfg->tag_Config;
4015 tagList = tagConfig->tag_ToAddModList;
4020 if(tagList->list.array)
4022 for(idx=0; idx<tagList->list.count; idx++)
4024 DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
4026 DU_FREE(tagList->list.array, tagList->list.size);
4028 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4030 DU_FREE(tagConfig, sizeof(struct TAG_Config));
4033 phrConfig = macCellGrpCfg->phr_Config;
4036 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
4037 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
4040 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
4043 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
4046 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4047 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
4050 spCellCfg = cellGrpCfg->spCellConfig;
4053 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
4054 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4056 srvCellCfg = spCellCfg->spCellConfigDedicated;
4059 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4060 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4061 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4062 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4063 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4064 DU_FREE(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig));
4065 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4067 DU_FREE(spCellCfg, sizeof(SpCellConfig_t));
4071 /*******************************************************************
4073 * @brief Builds DU To CU RRC Container
4077 * Function : BuildDuToCuRrcContainer
4079 * Functionality: Builds DuToCuRrcContainer
4081 * @params[in] idx, index in F1AP msg
4082 * DuToCuRRCContainer, DuToCuRRCContainer
4084 * @return ROK - success
4087 * ****************************************************************/
4088 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
4090 CellGroupConfigRrc_t cellGrpCfg;
4091 asn_enc_rval_t encRetVal;
4092 uint8_t ret = RFAILED;
4096 cellGrpCfg.cellGroupId = CELL_GRP_ID;
4098 cellGrpCfg.rlc_BearerToAddModList = NULLP;
4099 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
4100 if(!cellGrpCfg.rlc_BearerToAddModList)
4102 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4105 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
4107 DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
4111 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
4112 cellGrpCfg.mac_CellGroupConfig = NULLP;
4113 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
4114 if(!cellGrpCfg.mac_CellGroupConfig)
4116 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4119 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
4121 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
4126 cellGrpCfg.physicalCellGroupConfig = NULLP;
4127 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
4128 if(!cellGrpCfg.physicalCellGroupConfig)
4130 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4133 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
4135 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
4139 cellGrpCfg.spCellConfig = NULLP;
4140 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
4141 if(!cellGrpCfg.spCellConfig)
4143 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
4146 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
4148 DU_LOG("\nF1AP : BuildSpCellCfg failed");
4152 cellGrpCfg.sCellToAddModList = NULLP;
4153 cellGrpCfg.sCellToReleaseList = NULLP;
4154 cellGrpCfg.ext1 = NULLP;
4156 /* encode cellGrpCfg into duToCuRrcContainer */
4157 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
4158 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
4160 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
4161 /* Encode results */
4162 if(encRetVal.encoded == ENCODE_FAIL)
4164 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
4165 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4170 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
4171 for(int i=0; i< encBufSize; i++)
4173 printf("%x",encBuf[i]);
4177 duToCuRrcContainer->size = encBufSize;
4178 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
4179 if(!duToCuRrcContainer->buf)
4181 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
4184 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
4188 FreeMemDuToCuRrcCont(&cellGrpCfg);
4192 /*******************************************************************
4194 * @brief Builds and sends the InitialULRRCMessage
4198 * Function : BuildAndSendInitialRrcMsgTransfer
4200 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
4201 * it to the CU through SCTP.
4205 * @return ROK - success
4208 * ****************************************************************/
4209 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
4210 uint8_t *rrcContainer)
4217 F1AP_PDU_t *f1apMsg = NULLP;
4218 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
4219 asn_enc_rval_t encRetVal;
4220 bool checkvar=false;
4223 DU_LOG("\n F1AP : Building RRC Setup Request\n");
4224 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
4225 if(f1apMsg == NULLP)
4227 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
4230 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
4231 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4232 if(f1apMsg->choice.initiatingMessage == NULLP)
4234 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
4237 f1apMsg->choice.initiatingMessage->procedureCode =\
4238 ProcedureCode_id_InitialULRRCMessageTransfer;
4239 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
4240 f1apMsg->choice.initiatingMessage->value.present = \
4241 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
4243 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
4245 initULRRCMsg->protocolIEs.list.count = elementCnt;
4246 initULRRCMsg->protocolIEs.list.size = \
4247 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
4248 /* Initialize the F1Setup members */
4249 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
4250 if(initULRRCMsg->protocolIEs.list.array == NULLP)
4252 DU_LOG(" F1AP : Memory allocation for\
4253 RRCSetupRequestMessageTransferIEs failed");
4256 for(idx=0; idx<elementCnt; idx++)
4258 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
4259 sizeof(InitialULRRCMessageTransferIEs_t));
4260 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
4266 /*GNB DU UE F1AP ID*/
4267 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
4268 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
4269 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
4270 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
4271 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
4272 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
4277 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
4278 ProtocolIE_ID_id_NRCGI;
4279 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
4280 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
4281 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
4284 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
4292 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
4293 ProtocolIE_ID_id_C_RNTI;
4294 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
4295 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
4296 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
4297 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
4301 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
4302 ProtocolIE_ID_id_RRCContainer;
4303 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
4304 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
4305 InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
4307 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size =\
4308 strlen((const char*)rrcContainer);
4309 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
4310 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
4311 if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
4313 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
4317 memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
4318 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
4321 /*DUtoCURRCContainer*/
4323 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
4324 ProtocolIE_ID_id_DUtoCURRCContainer;
4325 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
4326 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
4327 InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
4329 ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
4335 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4337 /* Encode the F1SetupRequest type as APER */
4338 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
4340 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
4341 /* Encode results */
4342 if(encRetVal.encoded == ENCODE_FAIL)
4344 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
4345 structure (at %s)\n",encRetVal.failed_type ? \
4346 encRetVal.failed_type->name : "unknown");
4352 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
4353 Message transfer\n");
4354 for(int i=0; i< encBufSize; i++)
4356 printf("%x",encBuf[i]);
4360 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
4362 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
4369 if(f1apMsg != NULLP)
4371 if(f1apMsg->choice.initiatingMessage != NULLP)
4373 if(initULRRCMsg->protocolIEs.list.array != NULLP)
4375 if(idx == elementCnt)
4378 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
4380 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
4382 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
4383 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
4385 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
4386 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
4390 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
4392 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
4393 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
4397 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf)
4399 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf,
4400 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.size);
4402 for(ieId=0; ieId<elementCnt; ieId++)
4404 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
4409 for(ieId=0; ieId<idx; ieId++)
4411 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
4414 DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
4416 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4418 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
4424 }/* End of BuildAndSendInitialRrcMsgTransfer*/
4426 /*******************************************************************
4428 * @brief Builds Special cell list for UE Setup Request
4432 * Function : BuildSplCellList
4434 * Functionality: Constructs the Special Cell list for UESetReq
4436 * @params[in] SCell_ToBeSetup_List_t *spCellLst
4438 * @return ROK - success
4441 * ****************************************************************/
4442 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
4448 spCellLst->list.count = cellCnt;
4449 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
4450 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
4451 if(spCellLst->list.array == NULLP)
4455 for(idx=0; idx<cellCnt; idx++)
4457 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
4458 if(spCellLst->list.array[idx] == NULLP)
4464 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
4465 spCellLst->list.array[idx]->criticality = Criticality_ignore;
4466 spCellLst->list.array[idx]->value.present =\
4467 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
4468 /* Special Cell ID -NRCGI */
4469 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
4474 /*Special Cell Index*/
4475 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
4477 }/* End of BuildSplCellList*/
4479 /*******************************************************************
4481 * @brief Builds SRBS to be setup
4485 * Function : BuildSRBSetup
4487 * Functionality: Constructs the SRB's for UESetReq
4489 * @params[in] SRBs_ToBeSetup_List_t *srbSet
4491 * @return ROK - success
4494 * ****************************************************************/
4495 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
4500 srbSet->list.count = srbCnt;
4501 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
4502 DU_ALLOC(srbSet->list.array,srbSet->list.size);
4503 if(srbSet->list.array == NULLP)
4507 for(idx=0; idx<srbCnt; idx++)
4509 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
4510 if(srbSet->list.array[idx] == NULLP)
4516 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
4517 srbSet->list.array[idx]->criticality = Criticality_ignore;
4518 srbSet->list.array[idx]->value.present = \
4519 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
4520 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
4522 }/* End of BuildSRBSetup*/
4524 /*******************************************************************
4526 * @brief Builds QOS Info for DRB Setum Item
4530 * Function : BuildQOSInfo
4532 * Functionality: Constructs the QOS Info for DRB Setup Item
4534 * @params[in] QoSInformation_t *qosinfo
4536 * @return ROK - success
4539 * ****************************************************************/
4540 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
4542 /* NonDynamic5QIDescriptor */
4543 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
4544 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
4545 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
4550 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
4552 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
4553 sizeof(AveragingWindow_t));
4554 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
4559 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
4560 /*MaxDataBurstVolume*/
4561 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
4562 sizeof(MaxDataBurstVolume_t));
4563 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
4568 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
4570 /*nRGRAN Allocation Retention Priority*/
4571 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
4572 PriorityLevel_highest;
4573 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
4574 Pre_emptionCapability_may_trigger_pre_emption;
4575 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
4576 Pre_emptionVulnerability_not_pre_emptable;
4578 /* TO DO: GBR_QoSFlowInformation */
4580 }/*End of BuildQOSInfo*/
4582 /*******************************************************************
4584 * @brief Builds SNSSAI
4588 * Function : BuildSNSSAI
4590 * Functionality: Constructs the SNSSAI For DRB list
4592 * @params[in] SNSSAI_t *snssai
4594 * @return ROK - success
4597 * ****************************************************************/
4598 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
4602 snssai->sST.size = sizeof(uint8_t);
4603 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
4604 if(snssai->sST.buf == NULLP)
4608 snssai->sST.buf[0] = 3;
4610 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
4611 if(snssai->sD == NULLP)
4615 snssai->sD->size = 3*sizeof(uint8_t);
4616 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
4617 if(snssai->sD->buf == NULLP)
4621 snssai->sD->buf[0] = 3;
4622 snssai->sD->buf[1] = 6;
4623 snssai->sD->buf[2] = 9;
4625 }/*End of BuildSNSSAI*/
4627 /*******************************************************************
4629 * @brief Builds the flow map.
4633 * Function : BuildFlowsMap
4635 * Functionality: Constructs the flowmap For DRB list
4637 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
4639 * @return ROK - success
4642 * ****************************************************************/
4643 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
4649 flowMap->list.count = flowCnt;
4650 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
4651 DU_ALLOC(flowMap->list.array,flowMap->list.size);
4652 if(flowMap->list.array == NULLP)
4656 for(idx=0; idx<flowCnt; idx++)
4658 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
4659 if(flowMap->list.array[idx] == NULLP)
4665 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
4666 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
4672 }/*End of BuildFlowsMap*/
4674 /*******************************************************************
4676 * @brief Builds the Uplink Tunnel Info
4680 * Function : BuildULTnlInfo
4682 * Functionality: Constructs the UL TnlInfo For DRB list
4684 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
4686 * @return ROK - success
4689 * ****************************************************************/
4690 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
4695 ulInfo->list.count = ulCnt;
4696 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
4697 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
4698 if(ulInfo->list.array == NULLP)
4702 for(idx=0; idx<ulCnt; idx++)
4704 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
4705 if(ulInfo->list.array[idx] == NULLP)
4711 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
4712 UPTransportLayerInformation_PR_gTPTunnel;
4714 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
4715 sizeof(GTPTunnel_t));
4716 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
4720 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4721 transportLayerAddress.size = 4*sizeof(uint8_t);
4722 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4723 transportLayerAddress.buf,ulInfo->list.array[idx]->\
4724 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
4725 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4726 transportLayerAddress.buf == NULLP)
4730 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4731 transportLayerAddress.buf[0] = 4;
4732 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4733 transportLayerAddress.buf[1] = 4;
4734 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4735 transportLayerAddress.buf[2] = 4;
4736 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4737 transportLayerAddress.buf[3] = 5;
4738 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4739 transportLayerAddress.bits_unused = 0;
4741 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
4742 = 4 * sizeof(uint8_t);
4743 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4744 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
4745 gTPTunnel->gTP_TEID.size);
4746 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
4751 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4752 gTP_TEID.buf[0] = 11;
4753 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4754 gTP_TEID.buf[1] = 0;
4755 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4756 gTP_TEID.buf[2] = 0;
4757 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
4758 gTP_TEID.buf[3] = 1;
4761 }/*End of BuildULTnlInfo*/
4763 /*******************************************************************
4765 * @brief Builds DRBS to be setup
4769 * Function : BuildDRBSetup
4771 * Functionality: Constructs the DRB's for UESetReq
4773 * @params[in] DRBs_ToBeSetup_List_t *drbSet
4775 * @return ROK - success
4778 * ****************************************************************/
4779 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
4781 uint8_t BuildQOSInforet;
4782 uint8_t BuildSNSSAIret;
4783 uint8_t BuildFlowsMapret;
4786 DRBs_ToBeSetup_Item_t *drbSetItem;
4788 drbSet->list.count = drbCnt;
4789 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
4790 DU_ALLOC(drbSet->list.array,drbSet->list.size);
4791 if(drbSet->list.array == NULLP)
4795 for(idx=0; idx<drbCnt; idx++)
4797 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
4798 if(drbSet->list.array[idx] == NULLP)
4804 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
4805 drbSet->list.array[idx]->criticality = Criticality_ignore;
4806 drbSet->list.array[idx]->value.present = \
4807 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
4808 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
4810 drbSetItem->dRBID = 1;
4812 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
4813 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
4814 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
4818 drbSetItem->qoSInformation.choice.choice_extension->id = \
4819 ProtocolIE_ID_id_DRB_Information;
4820 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
4822 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
4823 QoSInformation_ExtIEs__value_PR_DRB_Information;
4824 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
4825 choice_extension->value.choice.DRB_Information.dRB_QoS);
4826 if(BuildQOSInforet != ROK)
4831 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
4832 choice_extension->value.choice.DRB_Information.sNSSAI);
4833 if(BuildSNSSAIret != ROK)
4837 /*Flows mapped to DRB List*/
4838 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
4839 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
4840 if(BuildFlowsMapret != ROK)
4844 /*ULUPTNLInformation To Be Setup List*/
4845 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
4846 if(BuildULTnlInforet != ROK)
4851 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
4853 /*UL Configuration*/
4854 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
4855 if(drbSetItem->uLConfiguration == NULLP)
4859 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
4861 }/* End of BuildDRBSetup*/
4862 /*******************************************************************
4864 * @brief Deallocating memory of function BuildAndSendUESetReq
4868 * Function : FreeNrcgi
4870 * Functionality: Deallocating memory for function BuildNrcgi
4872 * @params[in] NRCGI_t *nrcgi
4876 *******************************************************************/
4877 void FreeNrcgi(NRCGI_t *nrcgi)
4879 if(nrcgi->pLMN_Identity.buf != NULLP)
4881 if(nrcgi->nRCellIdentity.buf != NULLP)
4883 DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
4885 DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
4888 /*******************************************************************
4890 * @brief Deallocating memory of function BuildAndSendUESetReq
4894 * Function : FreeSplCellList
4896 * Functionality: Deallocating memory for function BuildSplCellList
4898 * @params[in] SCell_ToBeSetup_List_t *spCellLst
4903 * *****************************************************************/
4904 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
4907 if(spCellLst->list.array != NULLP)
4909 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
4911 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
4913 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
4915 if(spCellLst->list.array[cellidx]!=NULLP)
4917 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
4920 DU_FREE(spCellLst->list.array,spCellLst->list.size);
4923 /*******************************************************************
4925 * @brief Deallocating memory of function BuildAndSendUESetReq
4929 * Function : FreeSRBSetup
4931 * Functionality: Deallocating memory for function BuildSRBSetup
4933 * @params[in] SRBs_ToBeSetup_List_t *srbSet
4938 * ******************************************************************/
4939 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
4942 if(srbSet->list.array != NULLP)
4944 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
4946 if(srbSet->list.array[srbidx]!=NULLP)
4948 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
4951 DU_FREE(srbSet->list.array,srbSet->list.size);
4954 /*******************************************************************
4956 * @brief Deallocating memory of function BuildAndSendUESetReq
4960 * Function : FreeQOSInfo
4962 * Functionality: Deallocating memory for function BuildQOSInfo
4964 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
4968 * ****************************************************************/
4969 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
4971 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
4973 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
4975 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
4977 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
4978 sizeof(MaxDataBurstVolume_t));
4980 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
4981 sizeof(AveragingWindow_t));
4983 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
4984 sizeof(NonDynamic5QIDescriptor_t));
4987 /*******************************************************************
4989 * @brief Deallocating memory of function BuildAndSendUESetReq
4993 * Function : FreeULTnlInfo
4995 * Functionality: Deallocating memory for function BuildULTnlInfo
4997 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
5002 * ****************************************************************/
5003 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
5006 if(ulInfo->list.array != NULLP)
5008 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
5010 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
5012 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
5014 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5015 transportLayerAddress.buf != NULLP)
5017 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
5020 DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5021 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
5022 gTPTunnel->gTP_TEID.size);
5024 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
5025 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
5026 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
5028 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
5029 sizeof(GTPTunnel_t));
5032 if(ulInfo->list.array[ulidx]!=NULLP)
5034 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
5037 DU_FREE(ulInfo->list.array,ulInfo->list.size);
5040 /*******************************************************************
5042 * @brief Deallocating memory for BuildAndSendUESetReq
5046 * Function : FreeDRBSetup
5048 * Functionality: Deallocating memory for BuildDRBSetup
5050 * @params[in] DRBs_ToBeSetup_List_t *drbSet
5054 * ****************************************************************/
5055 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
5057 DRBs_ToBeSetup_Item_t *drbSetItem;
5060 if(drbSet->list.array == NULLP)
5062 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
5064 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
5066 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
5067 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
5069 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5070 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
5072 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5073 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
5075 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5076 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5078 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
5080 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
5082 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
5084 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5085 flows_Mapped_To_DRB_List.list.array != NULLP)
5087 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5088 flows_Mapped_To_DRB_List.list.count; flowidx++)
5090 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5091 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
5093 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5094 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5095 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
5097 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5098 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5099 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
5101 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5102 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5103 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
5105 if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
5107 DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
5109 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
5110 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5111 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5112 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
5113 sizeof(MaxDataBurstVolume_t));
5115 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5116 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5117 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
5119 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5120 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
5121 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
5124 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5125 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
5127 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
5128 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
5131 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
5132 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
5133 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
5135 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
5136 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
5138 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
5139 sizeof(OCTET_STRING_t));
5141 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
5142 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
5144 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5145 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
5147 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5148 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
5150 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
5151 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
5153 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
5156 if(drbSet->list.array[drbidx]!=NULLP)
5158 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
5161 DU_FREE(drbSet->list.array,drbSet->list.size);
5164 /*******************************************************************
5166 * @brief Free the UE Setup Request
5170 * Function : FreeUESetReq
5172 * Functionality: Deallocate the memory of BuildUESetReq
5174 * @params[in] F1AP_PDU_t *f1apMsg
5179 * ****************************************************************/
5180 void FreeUESetReq(F1AP_PDU_t *f1apMsg)
5184 UEContextSetupRequest_t *ueSetReq;
5186 if(f1apMsg != NULLP)
5188 if(f1apMsg->choice.initiatingMessage != NULLP)
5190 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5191 if(ueSetReq->protocolIEs.list.array != NULLP)
5193 if(ueSetReq->protocolIEs.list.array[idx])
5198 if(ueSetReq->protocolIEs.list.array[idx])
5200 if(SplCellListret==ROK)
5203 if(ueSetReq->protocolIEs.list.array[idx])
5205 if(SRBSetupret == ROK)
5208 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
5211 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
5215 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
5219 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
5221 for(ieId=0; ieId<ueSetReq->protocolIEs.list.count; ieId++)
5223 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
5225 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
5228 DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
5230 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5232 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
5236 /*******************************************************************
5238 * @brief Builds and sends the UE Setup Request
5242 * Function : BuildAndSendUESetReq
5244 * Functionality: Constructs the UE Setup Request and sends
5245 * it to the CU through SCTP.
5249 * @return ROK - success
5252 * ****************************************************************/
5253 uint8_t BuildAndSendUESetReq()
5259 F1AP_PDU_t *f1apMsg = NULL;
5260 UEContextSetupRequest_t *ueSetReq;
5261 asn_enc_rval_t encRetVal; /* Encoder return value */
5262 uint8_t ret= RFAILED;
5266 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
5268 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5269 if(f1apMsg == NULLP)
5271 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5275 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5276 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5277 if(f1apMsg->choice.initiatingMessage == NULLP)
5279 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5283 f1apMsg->choice.initiatingMessage->procedureCode = \
5284 ProcedureCode_id_UEContextSetup;
5285 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
5286 f1apMsg->choice.initiatingMessage->value.present = \
5287 InitiatingMessage__value_PR_UEContextSetupRequest;
5289 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5291 ueSetReq->protocolIEs.list.count = elementCnt;
5292 ueSetReq->protocolIEs.list.size = \
5293 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
5295 /* Initialize the UESetup members */
5296 DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
5298 if(ueSetReq->protocolIEs.list.array == NULLP)
5300 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
5304 for(idx1=0; idx1<elementCnt; idx1++)
5306 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
5307 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
5315 /*GNB CU UE F1AP ID*/
5316 ueSetReq->protocolIEs.list.array[idx]->id = \
5317 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
5318 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5319 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5320 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
5321 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
5323 /*GNB DU UE F1AP ID*/
5325 ueSetReq->protocolIEs.list.array[idx]->id = \
5326 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5327 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5328 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5329 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
5330 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
5334 ueSetReq->protocolIEs.list.array[idx]->id = \
5335 ProtocolIE_ID_id_SpCell_ID;
5336 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5337 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5338 UEContextSetupRequestIEs__value_PR_NRCGI;
5339 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
5345 /*Served Cell Index*/
5347 ueSetReq->protocolIEs.list.array[idx]->id = \
5348 ProtocolIE_ID_id_ServCellIndex;
5349 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5350 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5351 UEContextSetupRequestIEs__value_PR_ServCellIndex;
5352 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
5355 /*CellULConfigured*/
5357 ueSetReq->protocolIEs.list.array[idx]->id = \
5358 ProtocolIE_ID_id_SpCellULConfigured;
5359 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5360 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5361 UEContextSetupRequestIEs__value_PR_CellULConfigured;
5362 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
5363 CellULConfigured_none;
5366 /*CUtoDURRCContainer*/
5368 ueSetReq->protocolIEs.list.array[idx]->id = \
5369 ProtocolIE_ID_id_CUtoDURRCInformation;
5370 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5371 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5372 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
5374 /*Special Cells to be SetupList*/
5376 ueSetReq->protocolIEs.list.array[idx]->id = \
5377 ProtocolIE_ID_id_SCell_ToBeSetup_List;
5378 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5379 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5380 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
5381 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
5382 if(SplCellListret != ROK)
5386 /*SRBs To Be Setup List*/
5388 ueSetReq->protocolIEs.list.array[idx]->id = \
5389 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
5390 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5391 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5392 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
5393 SRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
5394 if(SRBSetupret != ROK)
5398 /*DRBs to Be Setup List*/
5400 ueSetReq->protocolIEs.list.array[idx]->id = \
5401 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
5402 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5403 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5404 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
5405 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
5411 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5413 /* Encode the F1SetupRequest type as APER */
5414 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5416 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
5418 /* Encode results */
5419 if(encRetVal.encoded == ENCODE_FAIL)
5421 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
5422 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5427 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
5428 for(int i=0; i< encBufSize; i++)
5430 printf("%x",encBuf[i]);
5435 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
5437 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
5443 FreeUESetReq(f1apMsg);
5446 }/* End of BuildAndSendUESetReq*/
5448 /*******************************************************************
5450 * @brief Handles received F1AP message and sends back response
5454 * Function : F1APMsgHdlr
5457 * - Decodes received F1AP control message
5458 * - Prepares response message, encodes and sends to SCTP
5461 * @return ROK - success
5464 * ****************************************************************/
5465 void F1APMsgHdlr(Buffer *mBuf)
5471 F1AP_PDU_t *f1apMsg;
5472 asn_dec_rval_t rval; /* Decoder return value */
5473 F1AP_PDU_t f1apasnmsg ;
5475 DU_LOG("\nF1AP : Received F1AP message buffer");
5476 SPrntMsg(mBuf, 0,0);
5478 /* Copy mBuf into char array to decode it */
5479 SFndLenMsg(mBuf, &recvBufLen);
5480 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
5482 DU_LOG("\nF1AP : Memory allocation failed");
5485 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
5487 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
5491 printf("\nF1AP : Received flat buffer to be decoded : ");
5492 for(i=0; i< recvBufLen; i++)
5494 printf("%x",recvBuf[i]);
5497 /* Decoding flat buffer into F1AP messsage */
5498 f1apMsg = &f1apasnmsg;
5499 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
5501 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
5502 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
5503 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
5505 DU_LOG("\nF1AP : ASN decode failed");
5509 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5511 switch(f1apMsg->present)
5513 case F1AP_PDU_PR_successfulOutcome:
5515 switch(f1apMsg->choice.successfulOutcome->value.present)
5517 case SuccessfulOutcome__value_PR_F1SetupResponse:
5519 #ifndef ODU_TEST_STUB
5520 procF1SetupRsp(f1apMsg);
5525 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
5527 procGNBDUCfgUpdAck(f1apMsg);
5533 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
5536 }/* End of switch(successfulOutcome) */
5539 case F1AP_PDU_PR_initiatingMessage:
5541 switch(f1apMsg->choice.initiatingMessage->value.present)
5543 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
5545 procDlRrcMsgTrans(f1apMsg);
5551 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
5552 f1apMsg->choice.initiatingMessage->value.present);
5555 }/* End of switch(initiatingMessage) */
5561 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
5565 }/* End of switch(f1apMsg->present) */
5567 } /* End of F1APMsgHdlr */
5569 /**********************************************************************
5571 **********************************************************************/