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"
27 extern char encBuf[ENC_BUF_MAX_LEN];
28 extern DuCfgParams duCfgParam;
29 S16 sctpSend(Buffer *mBuf, U8 itfType);
30 /*******************************************************************
32 * @brief Builds Uplink Info for NR
36 * Function : BuildULNRInfo
38 * Functionality: Building NR Uplink Info
40 * @params[in] NRFreqInfo_t *ulnrfreq
41 * @return ROK - success
44 * ****************************************************************/
45 S16 BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
48 ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
49 fdd.ulNrFreqInfo.nrArfcn;
50 ulnrfreq->freqBandListNr.list.count = 1;
51 ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
52 DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
53 if(ulnrfreq->freqBandListNr.list.array == NULLP)
57 for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
59 DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
60 if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
65 ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
66 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
67 freqBand[0].nrFreqBand;
68 ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
71 /*******************************************************************
73 * @brief Builds Downlink NR Info
77 * Function : BuildDLNRInfo
79 * Functionality: Building Downlink NR Info
81 * @params[in] NRFreqInfo_t *dlnrfreq
82 * @return ROK - success
85 * ****************************************************************/
86 S16 BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
89 dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
90 fdd.dlNrFreqInfo.nrArfcn;
91 dlnrfreq->freqBandListNr.list.count = 1;
92 dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
93 DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
94 if(dlnrfreq->freqBandListNr.list.array == NULLP)
98 for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
100 DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
101 if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
106 dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
107 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
108 freqBand[0].nrFreqBand;
109 dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
114 /*******************************************************************
116 * @brief Builds Nrcgi
120 * Function : BuildNrcgi
122 * Functionality: Building the PLMN ID and NR Cell id
124 * @params[in] NRCGI_t *nrcgi
125 * @return ROK - success
128 * ****************************************************************/
129 S16 BuildNrcgi(NRCGI_t *nrcgi)
135 /* Allocate Buffer Memory */
136 nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(U8);
137 DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
138 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
139 &nrcgi->pLMN_Identity); // Building PLMN function
145 //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
146 nrcgi->nRCellIdentity.size = byteSize * sizeof(U8);
147 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
148 if(nrcgi->nRCellIdentity.buf == NULLP)
152 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
159 /*******************************************************************
161 * @brief Builds FiveGStac
165 * Function : BuildFiveGSTac
167 * Functionality: Building the FiveGSTac
169 * @params[in] OCTET_STRING_t *fivegsTac
170 * @return ROK - success
173 * ****************************************************************/
174 S16 BuildFiveGSTac(Served_Cell_Information_t *servcell)
176 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
177 if(servcell->fiveGS_TAC == NULLP)
181 servcell->fiveGS_TAC->size = 3 * sizeof(U8);
182 DU_ALLOC(servcell->fiveGS_TAC->buf,\
183 sizeof(servcell->fiveGS_TAC->size));
184 if(servcell->fiveGS_TAC->buf == NULLP)
188 servcell->fiveGS_TAC->buf[0] = 0;
189 servcell->fiveGS_TAC->buf[1] = 0;
190 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
193 /*******************************************************************
195 * @brief Builds NR Mode
199 * Function : BuildNrMode
201 * Functionality: Building the NR Mode
203 * @params[in] NR_Mode_Info_t *fdd
204 * @return ROK - success
207 * ****************************************************************/
208 S16 BuildNrMode(NR_Mode_Info_t *mode)
210 S16 BuildDLNRInforet=0;
211 S16 BuildULNRInforet=0;
213 mode->present = NR_Mode_Info_PR_fDD;
214 if(mode->present == NR_Mode_Info_PR_fDD)
216 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
217 if(mode->choice.fDD == NULLP)
221 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
222 if(BuildULNRInforet != ROK)
226 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
227 if(BuildDLNRInforet != ROK)
232 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
233 duCfgParam.srvdCellLst[0].duCellInfo.\
234 f1Mode.mode.fdd.ulTxBw.nrScs;
235 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
236 duCfgParam.srvdCellLst[0].duCellInfo.\
237 f1Mode.mode.fdd.ulTxBw.nrb;
238 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
239 duCfgParam.srvdCellLst[0].duCellInfo.\
240 f1Mode.mode.fdd.dlTxBw.nrScs;
241 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
242 duCfgParam.srvdCellLst[0].duCellInfo.\
243 f1Mode.mode.fdd.dlTxBw.nrb;
246 /*******************************************************************
248 * @brief Builds IE Extensions for Served PLMNs
252 * Function : BuildExtensions
254 * Functionality: Building the IE Extensions
256 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
257 * @return ROK - success
260 * ****************************************************************/
261 S16 BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
268 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
269 if((*ieExtend) == NULLP)
273 (*ieExtend)->list.count = extensionCnt;
274 (*ieExtend)->list.size = \
275 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
276 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
277 if((*ieExtend)->list.array == NULLP)
281 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
283 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
284 sizeof(ServedPLMNs_ItemExtIEs_t));
285 if((*ieExtend)->list.array[plmnidx] == NULLP)
291 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
292 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
293 (*ieExtend)->list.array[idx]->extensionValue.present = \
294 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
295 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
297 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
298 list.size = sizeof(SliceSupportItem_t *);
299 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
300 list.array,sizeof(SliceSupportItem_t *));
301 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
306 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
307 list.array[sliceId],sizeof(SliceSupportItem_t));
308 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
309 list.array[sliceId] == NULLP)
313 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
314 list.array[sliceId]->sNSSAI.sST.size = sizeof(U8);
315 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
316 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
317 extensionValue.choice.SliceSupportList.\
318 list.array[sliceId]->sNSSAI.sST.size);
319 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
320 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
324 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
325 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
326 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
327 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
328 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
329 list.array[sliceId]->sNSSAI.sD == NULLP)
333 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
334 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(U8);
335 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
336 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
337 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
338 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
339 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
344 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
345 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
347 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
348 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
350 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
351 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
354 /*******************************************************************
356 * @brief Builds Served PLMN
360 * Function : BuildServedPlmn
362 * Functionality: Building the Served PLMN
364 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
365 * @return ROK - success
368 * ****************************************************************/
369 S16 BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
373 S16 buildPlmnIdret=0;
374 S16 BuildExtensionsret=0;
375 srvplmn->list.count = servPlmnCnt;
376 srvplmn->list.size = \
377 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
378 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
379 if(srvplmn->list.array == NULLP)
383 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
385 DU_ALLOC(srvplmn->list.array[plmnidx],\
386 sizeof(ServedPLMNs_Item_t));
387 if(srvplmn->list.array[plmnidx] == NULLP)
392 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(U8);
393 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
394 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
395 &srvplmn->list.array[0]->pLMN_Identity);
396 if(buildPlmnIdret!= ROK)
400 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
401 if(BuildExtensionsret!= ROK)
407 /*******************************************************************
409 * @brief Builds Served Cell List
413 * Function : BuildServedCellList
415 * Functionality: Building Served Cell List
417 * @params[in] PLMNID plmn
418 * @return ROK - success
421 * ****************************************************************/
423 S16 BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
426 S16 BuildFiveGSTacret=0;
427 S16 BuildServedPlmnret=0;
428 S16 BuildNrModeret=0;
432 GNB_DU_Served_Cells_Item_t *srvCellItem;
433 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
434 duServedCell->list.count = plmnCnt;
436 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
437 if(duServedCell->list.array == NULLP)
441 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
443 DU_ALLOC(duServedCell->list.array[plmnidx],\
444 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
445 if(duServedCell->list.array[plmnidx] == NULLP)
451 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
452 duServedCell->list.array[idx]->criticality = Criticality_reject;
453 duServedCell->list.array[idx]->value.present = \
454 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
456 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
458 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
459 if(BuildNrcgiret != ROK)
464 srvCellItem->served_Cell_Information.nRPCI = \
465 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
468 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
469 if(BuildFiveGSTacret != ROK)
474 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
475 if(BuildServedPlmnret !=ROK)
479 /*nR Mode Info with FDD*/
480 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
481 if(BuildNrModeret != ROK)
485 /*Measurement timing Config*/
486 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
488 DU_ALLOC(srvCellItem->served_Cell_Information.\
489 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
490 if(srvCellItem->served_Cell_Information.\
491 measurementTimingConfiguration.buf == NULLP)
495 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
496 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
498 /* GNB DU System Information */
499 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
500 sizeof(GNB_DU_System_Information_t));
501 if(!srvCellItem->gNB_DU_System_Information)
506 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
507 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
508 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
509 srvCellItem->gNB_DU_System_Information->mIB_message.size);
510 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
514 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
515 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
518 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
519 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
521 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
522 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
523 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
527 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
529 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
530 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
534 /*******************************************************************
536 * @brief Builds RRC Version
540 * Function : BuildRrcVer
542 * Functionality: Building RRC Version
544 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
545 * @return ROK - success
548 * ****************************************************************/
549 S16 BuildRrcVer(RRC_Version_t *rrcVer)
553 rrcVer->latest_RRC_Version.size = sizeof(U8);
554 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(U8));
555 if(rrcVer->latest_RRC_Version.buf == NULLP)
559 rrcVer->latest_RRC_Version.buf[0] = 0;
560 rrcVer->latest_RRC_Version.bits_unused = 5;
561 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
562 if(rrcVer->iE_Extensions == NULLP)
566 rrcVer->iE_Extensions->list.count = 1;
567 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
568 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
569 if(rrcVer->iE_Extensions->list.array == NULLP)
574 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
575 sizeof(RRC_Version_ExtIEs_t));
576 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
580 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
581 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
582 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
583 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
584 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
585 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
586 .Latest_RRC_Version_Enhanced.size = 3*sizeof(U8);
587 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
588 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
589 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
590 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
591 .Latest_RRC_Version_Enhanced.buf == NULLP)
596 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
597 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
599 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
600 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
602 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
603 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
606 /*******************************************************************
608 * @brief Sends F1 msg over SCTP
612 * Function : SendF1APMsg
614 * Functionality: Sends F1 msg over SCTP
616 * @params[in] Region region
618 * @return ROK - success
621 * ****************************************************************/
622 S16 SendF1APMsg(Region region, Pool pool)
626 if(SGetMsg(region, pool, &mBuf) == ROK)
628 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
632 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
634 DU_LOG("\nF1AP : SCTP Send failed");
641 DU_LOG("\nF1AP : SAddPstMsgMult failed");
649 DU_LOG("\nF1AP : Failed to allocate memory");
655 /*******************************************************************
657 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
661 * Function : FreeRrcVer
663 * Functionality: deallocating the memory of function BuildRrcVer
665 * @params[in] RRC_Version_t *rrcVer
669 *****************************************************************/
670 void FreeRrcVer(RRC_Version_t *rrcVer)
672 if(rrcVer->latest_RRC_Version.buf != NULLP)
674 if(rrcVer->iE_Extensions != NULLP)
676 if(rrcVer->iE_Extensions->list.array != NULLP)
678 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
680 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
683 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
684 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
685 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
687 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
689 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
691 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
693 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
696 /*******************************************************************
698 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
702 * Function : FreeServedCellList
704 * Functionality: deallocating the memory of function BuildServedCellList
707 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
711 * ****************************************************************/
712 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
720 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
721 if(duServedCell->list.array!=NULLP)
723 if(duServedCell->list.array[0]!=NULLP)
725 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
727 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
729 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
731 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
733 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
735 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
737 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
739 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
741 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
743 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
745 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
746 extensionValue.choice.SliceSupportList.list.array!=NULLP)
748 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
749 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
751 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
752 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
754 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
755 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
757 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
758 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
760 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
762 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
763 freqBandListNr.list.array!=NULLP)
765 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
766 freqBandListNr.list.array[0]!=NULLP)
768 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
769 freqBandListNr.list.array)
771 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
772 freqBandListNr.list.array[0]!=NULLP)
774 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
776 if(!srvCellItem->gNB_DU_System_Information)
778 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
780 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
782 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
783 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
784 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
785 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
787 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
788 srvCellItem->gNB_DU_System_Information->mIB_message.size);
789 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
790 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
792 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
794 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
795 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
797 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
798 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
800 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
801 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
803 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
804 list.array[0],sizeof(FreqBandNrItem_t));
806 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
807 list.array,sizeof(FreqBandNrItem_t*));
809 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
811 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
812 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
813 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
814 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
816 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
817 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
818 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
820 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
821 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
822 sNSSAI.sST.buf,sizeof(U8));
824 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
825 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
827 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
828 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
830 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
831 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
833 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
834 array[servId]->iE_Extensions->list.array,\
835 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
837 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
838 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
840 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
841 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
842 servedPLMNs.list.array[servId]->pLMN_Identity.size
845 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
846 sizeof(ServedPLMNs_Item_t *));
848 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
849 sizeof(ServedPLMNs_Item_t *));
851 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
852 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
854 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
856 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
857 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
860 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
861 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
864 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
866 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
869 /*******************************************************************
871 * @brief Builds and Send the F1SetupRequest
875 * Function : BuildAndSendF1SetupReq
877 * Functionality:Fills the F1SetupRequest
879 * @return ROK - success
882 ******************************************************************/
883 S16 BuildAndSendF1SetupReq()
885 S16 BuildServedCellListreturn=0;
886 S16 BuildRrcVerreturn=0;
890 F1AP_PDU_t *f1apMsg = NULLP;
891 F1SetupRequest_t *f1SetupReq=NULLP;
892 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
893 RRC_Version_t *rrcVer=NULLP;
894 asn_enc_rval_t encRetVal; /* Encoder return value */
896 DU_LOG("\nF1AP : Building F1 Setup Request\n");
899 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
904 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
905 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
906 if(f1apMsg->choice.initiatingMessage == NULLP)
910 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
911 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
912 f1apMsg->choice.initiatingMessage->value.present = \
913 InitiatingMessage__value_PR_F1SetupRequest;
915 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
917 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
919 f1SetupReq->protocolIEs.list.count = elementCnt;
920 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
922 /* Initialize the F1Setup members */
923 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
924 if(f1SetupReq->protocolIEs.list.array == NULLP)
928 for(idx=0; idx<elementCnt; idx++)
930 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
931 sizeof(F1SetupRequestIEs_t));
932 if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
940 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
941 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
942 f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
943 F1SetupRequestIEs__value_PR_TransactionID;
944 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
949 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
950 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
951 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
952 F1SetupRequestIEs__value_PR_GNB_DU_ID;
953 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
956 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
957 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
958 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
964 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
968 if(duCfgParam.duName != NULL)
971 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
972 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
973 f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
974 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
975 strlen((char *)duCfgParam.duName);
976 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
977 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
978 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
983 strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
984 choice.GNB_DU_Name.buf,
985 (char*)&duCfgParam.duName);
989 /*Served Cell list */
991 f1SetupReq->protocolIEs.list.array[idx2]->id = \
992 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
993 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
994 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
995 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
996 duServedCell = &f1SetupReq->protocolIEs.list.\
997 array[idx2]->value.choice.GNB_DU_Served_Cells_List;
998 BuildServedCellListreturn = BuildServedCellList(duServedCell);
999 if(BuildServedCellListreturn != ROK)
1006 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1007 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1008 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1009 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1010 F1SetupRequestIEs__value_PR_RRC_Version;
1011 rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1012 BuildRrcVerreturn = BuildRrcVer(rrcVer);
1014 if(BuildRrcVerreturn != ROK)
1018 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1020 /* Encode the F1SetupRequest type as APER */
1021 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1023 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1026 /* Encode results */
1027 if(encRetVal.encoded == ENCODE_FAIL)
1029 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1030 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1035 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1036 for(i=0; i< encBufSize; i++)
1038 printf("%x",encBuf[i]);
1043 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1045 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1052 if(f1apMsg != NULLP)
1055 if(f1apMsg->choice.initiatingMessage != NULLP)
1057 if(f1SetupReq->protocolIEs.list.array != NULLP)
1059 if(idx == elementCnt-1)
1061 if(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf != NULLP)
1063 if(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf != NULLP)
1065 if(BuildServedCellListreturn == ROK)
1069 FreeServedCellList(duServedCell);
1070 DU_FREE(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1072 DU_FREE(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf, sizeof(U8));
1074 for(idx=0; idx<elementCnt; idx++)
1076 DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
1081 for(ieId=0 ; ieId<idx ;ieId++)
1083 if(f1SetupReq->protocolIEs.list.array[ieId]!=NULLP)
1085 DU_FREE(f1SetupReq->protocolIEs.list.array[ieId],\
1086 sizeof(F1SetupRequestIEs_t));
1090 DU_FREE(f1SetupReq->protocolIEs.list.array,\
1091 elementCnt * sizeof(F1SetupRequestIEs_t *));
1093 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1095 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1102 }/* End of BuildAndSendF1SetupReq */
1104 /*******************************************************************
1106 * @brief Builds and sends the DUConfigUpdate
1110 * Function : BuildAndSendDUConfigUpdate
1112 * Functionality: Constructs the DU Update message and sends
1113 * it to the CU through SCTP.
1115 * @params[in] void **buf,Buffer to which encoded pattern is written into
1116 * @params[in] int *size,size of buffer
1118 * @return ROK - success
1121 * ****************************************************************/
1122 S16 BuildAndSendDUConfigUpdate()
1133 asn_enc_rval_t encRetVal; /* Encoder return value */
1134 F1AP_PDU_t *f1apDuCfg = NULL;
1135 GNBDUConfigurationUpdate_t *duCfgUpdate;
1136 Served_Cells_To_Modify_List_t *cellsToModify;
1137 Served_Cells_To_Modify_Item_t *modifyItem;
1138 bool checkvar=false;
1143 DU_LOG("\nF1AP : Building DU config update\n");
1144 /* Allocate the memory for F1DuCfg */
1145 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1146 if(f1apDuCfg == NULLP)
1148 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1152 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1153 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1154 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1156 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1160 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1161 ProcedureCode_id_gNBDUConfigurationUpdate;
1162 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1163 f1apDuCfg->choice.initiatingMessage->value.present = \
1164 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1165 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1166 choice.GNBDUConfigurationUpdate;
1168 duCfgUpdate->protocolIEs.list.count = elementCnt;
1169 duCfgUpdate->protocolIEs.list.size = \
1170 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1172 /* Initialize the F1Setup members */
1173 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1174 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1176 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1179 for(idx=0;idx<elementCnt;idx++)
1181 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1182 if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1190 duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1191 duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1192 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1193 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1194 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1197 /*Served Cell to Modify */
1199 duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1200 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1201 duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1202 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1203 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1204 cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1205 Served_Cells_To_Modify_List;
1207 cellsToModify->list.count = modifyCnt;
1208 cellsToModify->list.size = \
1209 modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1210 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1211 if(cellsToModify->list.array == NULLP)
1215 for(idy=0; idy<modifyCnt ;idy++)
1217 DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1218 Served_Cells_To_Modify_ItemIEs_t));
1219 if(cellsToModify->list.array[idy] == NULLP)
1224 cellsToModify->list.array[0]->id = \
1225 ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1226 cellsToModify->list.array[0]->criticality = Criticality_reject;
1227 cellsToModify->list.array[0]->value.present =\
1228 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1229 modifyItem=&cellsToModify->list.array[0]->value.choice.\
1230 Served_Cells_To_Modify_Item;
1233 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1234 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1235 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1239 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1240 &modifyItem->oldNRCGI.pLMN_Identity);
1243 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1244 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1245 modifyItem->oldNRCGI.nRCellIdentity.size);
1246 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1250 for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1252 modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1254 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1255 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1258 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1259 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1260 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1261 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1265 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1266 &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1267 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1268 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1269 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1270 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1274 for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1275 nRCGI.nRCellIdentity.size-1 ; tmp++)
1277 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1279 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1280 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1282 modifyItem->served_Cell_Information.nRPCI = \
1283 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1286 modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1287 modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1288 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1289 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1290 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1291 if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1295 for(idy1=0;idy1<servPlmnCnt;idy1++)
1297 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1298 sizeof(ServedPLMNs_Item_t));
1299 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1304 modifyItem->served_Cell_Information.servedPLMNs.list.\
1305 array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1306 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1307 array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1308 array[0]->pLMN_Identity.size);
1309 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1310 array[0]->pLMN_Identity.buf == NULLP)
1314 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1315 &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1316 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1317 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1318 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1319 array[0]->iE_Extensions == NULLP)
1324 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1325 iE_Extensions->list.count = extensionCnt;
1326 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1327 iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1328 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1329 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1330 iE_Extensions->list.size);
1331 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1332 array[0]->iE_Extensions->list.array == NULLP)
1336 for(idy2=0;idy2<extensionCnt;idy2++)
1338 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1339 array[0]->iE_Extensions->list.array[idy2],\
1340 sizeof(ServedPLMNs_ItemExtIEs_t));
1341 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1342 array[0]->iE_Extensions->list.array[idy2] == NULLP)
1347 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1348 iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1349 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1350 iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1351 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1352 iE_Extensions->list.array[0]->extensionValue.present = \
1353 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1354 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1355 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1357 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1358 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1359 list.size = sizeof(SliceSupportItem_t *);
1360 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1361 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1362 list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1363 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1364 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1365 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1366 list.array == NULLP)
1371 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1372 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1373 list.array[0],sizeof( SliceSupportItem_t));
1374 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1375 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1376 list.array[0] == NULLP)
1380 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1381 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1382 list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1383 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1384 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1385 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1386 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1387 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1388 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1389 list.array[0]->sNSSAI.sST.buf == NULLP)
1393 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1394 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1395 list.array[0]->sNSSAI.sST.buf[0] = 3;
1396 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1397 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1398 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1399 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1400 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1401 list.array[0]->sNSSAI.sD == NULLP)
1405 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1406 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1407 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1408 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1409 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1410 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1411 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1412 list.array[0]->sNSSAI.sD->size);
1413 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1414 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1415 list.array[0]->sNSSAI.sD->buf == NULLP)
1419 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1420 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1421 list.array[0]->sNSSAI.sD->buf[0] = 3;
1422 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1423 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1424 list.array[0]->sNSSAI.sD->buf[1] = 6;
1425 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1426 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1427 list.array[0]->sNSSAI.sD->buf[2] = 9;
1429 /*nR Mode Info with FDD*/
1430 modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1431 NR_Mode_Info_PR_fDD;
1432 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1433 sizeof(FDD_Info_t));
1434 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1438 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1439 uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1440 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1441 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1442 uL_NRFreqInfo.freqBandListNr.list.count = 1;
1443 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1444 uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1445 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1446 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1447 array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1448 uL_NRFreqInfo.freqBandListNr.list.size);
1449 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1450 fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1454 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1455 uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1456 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1457 uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1461 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1462 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1463 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1464 freqBand[0].nrFreqBand;
1465 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1466 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1467 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1468 nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1469 dlNrFreqInfo.nrArfcn;
1470 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1471 freqBandListNr.list.count = 1;
1472 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1473 freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1474 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1475 dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1476 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1477 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1478 dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1482 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1483 dL_NRFreqInfo.freqBandListNr.list.array[0],\
1484 sizeof(FreqBandNrItem_t));
1485 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1486 dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1490 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1491 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1492 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1493 freqBand[0].nrFreqBand;
1494 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1495 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1497 /*Transmission Bandwidth*/
1498 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1499 uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1500 f1Mode.mode.fdd.ulTxBw.nrScs;
1501 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1502 uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1503 f1Mode.mode.fdd.ulTxBw.nrb;
1504 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1505 dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1506 f1Mode.mode.fdd.dlTxBw.nrScs;
1507 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1508 dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1509 f1Mode.mode.fdd.dlTxBw.nrb;
1510 /*Measurement timing Config*/
1511 modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1513 DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1514 buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1515 if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1519 modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1520 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1522 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1525 duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1526 duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1527 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1528 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1529 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1531 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1532 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1533 if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1537 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1540 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1542 /* Encode the DU Config Update type as APER */
1543 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1545 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1547 /* Checking encode results */
1548 if(encRetVal.encoded == ENCODE_FAIL)
1550 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1555 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1556 for(i=0; i< encBufSize; i++)
1558 printf("%x",encBuf[i]);
1562 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1564 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1570 if(f1apDuCfg != NULLP)
1572 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1574 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1578 if(cellsToModify->list.array != NULLP)
1582 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1584 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1586 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1588 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1591 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1594 if(idy1==servPlmnCnt)
1596 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1597 array[0]->pLMN_Identity.buf != NULLP)
1599 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1600 array[0]->iE_Extensions!= NULLP)
1602 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1603 array[0]->iE_Extensions->list.array != NULLP)
1605 if(idy2==extensionCnt)
1607 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1608 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1611 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1612 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1613 list.array[0]!=NULLP)
1615 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1616 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1617 list.array[0]->sNSSAI.sST.buf!=NULLP)
1619 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1620 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1621 list.array[0]->sNSSAI.sD != NULLP)
1623 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1624 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1625 list.array[0]->sNSSAI.sD->buf!=NULLP)
1627 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1630 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1631 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1633 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1634 fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]!=NULLP)
1636 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1637 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1639 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1640 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1643 if(modifyItem->served_Cell_Information.\
1644 measurementTimingConfiguration.buf !=NULLP)
1646 if(duCfgUpdate->protocolIEs.list.array[2]->value.\
1647 choice.GNB_DU_ID.buf!=NULLP)
1649 DU_FREE(duCfgUpdate->protocolIEs.list.\
1650 array[2]->value.choice.GNB_DU_ID.buf,\
1651 duCfgUpdate->protocolIEs.list.array[2]->\
1652 value.choice.GNB_DU_ID.size);
1654 DU_FREE(modifyItem->served_Cell_Information.\
1655 measurementTimingConfiguration.\
1656 buf,modifyItem->served_Cell_Information.\
1657 measurementTimingConfiguration.size);
1659 DU_FREE(modifyItem->served_Cell_Information.\
1660 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1661 list.array[0],sizeof(FreqBandNrItem_t));
1663 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1664 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1665 modifyItem->served_Cell_Information.nR_Mode_Info.\
1666 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1668 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1669 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1670 array[0],sizeof(FreqBandNrItem_t));
1672 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1673 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1674 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1675 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1677 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1678 fDD,sizeof(FDD_Info_t));
1680 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1681 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1682 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1683 servedPLMNs.list.array[0]->iE_Extensions->list.array[0]->\
1684 extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sD->size);
1687 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1688 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1689 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1691 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1692 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1693 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.\
1694 list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.\
1695 SliceSupportList.list.array[0]->sNSSAI.sST.size);
1697 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1698 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1699 list.array[0],sizeof(SliceSupportItem_t));
1701 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1702 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1704 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1705 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1707 for(i=0;i<extensionCnt;i++)
1709 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1710 array[0]->iE_Extensions->list.array[i],\
1711 sizeof(ServedPLMNs_ItemExtIEs_t ));
1718 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1719 array[0]->iE_Extensions->list.array[i],\
1720 sizeof(ServedPLMNs_ItemExtIEs_t));
1723 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1724 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1725 list.array[0]->iE_Extensions->list.size);
1727 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1728 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1730 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1731 array[0]->pLMN_Identity.buf,
1732 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity.size);
1736 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1737 sizeof(ServedPLMNs_Item_t));
1744 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1745 sizeof(ServedPLMNs_Item_t));
1748 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1749 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1751 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1752 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1754 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1755 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1757 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1758 modifyItem->oldNRCGI.nRCellIdentity.size);
1760 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1761 modifyItem->oldNRCGI.pLMN_Identity.size);
1763 for(int iy=0; iy<modifyCnt ;iy++)
1765 DU_FREE(cellsToModify->list.array[iy],\
1766 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1771 for(int iy=0; iy<idy ;iy++)
1773 DU_FREE(cellsToModify->list.array[iy],\
1774 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1777 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1779 for(i=0;i<elementCnt;i++)
1781 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1782 sizeof(GNBDUConfigurationUpdateIEs_t));
1789 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1790 sizeof(GNBDUConfigurationUpdateIEs_t));
1793 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1795 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1797 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1803 }/* End of BuildAndSendDUConfigUpdate */
1805 /*******************************************************************
1807 * @brief Builds and sends the ULRRCMessageTransfer
1811 * Function : BuildAndSendULRRCMessageTransfer
1813 * Functionality: Constructs the UL RRC Message Transfer and sends
1814 * it to the CU through SCTP.
1818 * @return ROK - success
1821 * ****************************************************************/
1822 S16 BuildAndSendULRRCMessageTransfer()
1827 F1AP_PDU_t *f1apMsg = NULL;
1828 ULRRCMessageTransfer_t *ulRRCMsg;
1829 asn_enc_rval_t encRetVal; /* Encoder return value */
1831 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1833 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1834 if(f1apMsg == NULLP)
1836 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1840 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1841 DU_ALLOC(f1apMsg->choice.initiatingMessage,
1842 sizeof(InitiatingMessage_t));
1843 if(f1apMsg->choice.initiatingMessage == NULLP)
1845 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1846 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1850 f1apMsg->choice.initiatingMessage->procedureCode = \
1851 ProcedureCode_id_ULRRCMessageTransfer;
1852 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1853 f1apMsg->choice.initiatingMessage->value.present = \
1854 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1856 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1858 ulRRCMsg->protocolIEs.list.count = elementCnt;
1859 ulRRCMsg->protocolIEs.list.size = \
1860 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
1862 /* Initialize the F1Setup members */
1863 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, \
1864 elementCnt * sizeof(ULRRCMessageTransferIEs_t *));
1865 if(ulRRCMsg->protocolIEs.list.array == NULLP)
1867 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
1868 DU_FREE(f1apMsg->choice.initiatingMessage,
1869 sizeof(InitiatingMessage_t));
1870 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
1874 for(idx=0; idx<elementCnt; idx++)
1876 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],\
1877 sizeof(ULRRCMessageTransferIEs_t));
1878 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
1880 for(ieId=0; ieId<idx; ieId++)
1882 DU_FREE(ulRRCMsg->protocolIEs.list.array[ieId],\
1883 sizeof(ULRRCMessageTransferIEs_t));
1885 DU_FREE(ulRRCMsg->protocolIEs.list.array,\
1886 elementCnt * sizeof(ULRRCMessageTransferIEs_t *));
1887 DU_FREE(f1apMsg->choice.initiatingMessage,\
1888 sizeof(InitiatingMessage_t));
1889 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1896 /*GNB CU UE F1AP ID*/
1897 ulRRCMsg->protocolIEs.list.array[idx]->id = \
1898 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1899 ulRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1900 ulRRCMsg->protocolIEs.list.array[idx]->value.present = \
1901 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1902 ulRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1904 /*GNB DU UE F1AP ID*/
1906 ulRRCMsg->protocolIEs.list.array[idx]->id = \
1907 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1908 ulRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1909 ulRRCMsg->protocolIEs.list.array[idx]->value.present = \
1910 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1911 ulRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1915 ulRRCMsg->protocolIEs.list.array[idx]->id = \
1916 ProtocolIE_ID_id_SRBID;
1917 ulRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1918 ulRRCMsg->protocolIEs.list.array[idx]->value.present = \
1919 ULRRCMessageTransferIEs__value_PR_SRBID;
1920 ulRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = UL_SRBID;
1925 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1927 /* Encode the F1SetupRequest type as APER */
1928 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1930 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1932 /* Encode results */
1933 if(encRetVal.encoded == ENCODE_FAIL)
1935 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
1936 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1941 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
1942 for(int i=0; i< encBufSize; i++)
1944 printf("%x",encBuf[i]);
1949 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
1951 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
1955 }/* End of BuildAndSendULRRCMessageTransfer*/
1957 /*******************************************************************
1959 * @brief Builds and sends the InitialULRRCMessage
1963 * Function : BuildAndSendRRCSetupReq
1965 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
1966 * it to the CU through SCTP.
1970 * @return ROK - success
1973 * ****************************************************************/
1974 S16 BuildAndSendRRCSetupReq()
1980 F1AP_PDU_t *f1apMsg = NULL;
1981 InitialULRRCMessageTransfer_t *initULRRCMsg;
1982 asn_enc_rval_t encRetVal; /* Encoder return value */
1984 DU_LOG("\n F1AP : Building RRC Setup Request\n");
1986 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1987 if(f1apMsg == NULLP)
1989 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1993 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1994 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1995 if(f1apMsg->choice.initiatingMessage == NULLP)
1997 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1998 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2002 f1apMsg->choice.initiatingMessage->procedureCode = \
2003 ProcedureCode_id_InitialULRRCMessageTransfer;
2004 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2005 f1apMsg->choice.initiatingMessage->value.present = \
2006 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
2008 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2010 initULRRCMsg->protocolIEs.list.count = elementCnt;
2011 initULRRCMsg->protocolIEs.list.size = \
2012 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
2014 /* Initialize the F1Setup members */
2015 DU_ALLOC(initULRRCMsg->protocolIEs.list.array, \
2016 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2017 if(initULRRCMsg->protocolIEs.list.array == NULLP)
2019 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
2020 DU_FREE(f1apMsg->choice.initiatingMessage,
2021 sizeof(InitiatingMessage_t));
2022 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
2026 for(idx=0; idx<elementCnt; idx++)
2028 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
2029 sizeof(InitialULRRCMessageTransferIEs_t));
2030 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
2032 for(ieId=0; ieId<idx; ieId++)
2034 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],\
2035 sizeof(InitialULRRCMessageTransferIEs_t));
2037 DU_FREE(initULRRCMsg->protocolIEs.list.array,\
2038 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2039 DU_FREE(f1apMsg->choice.initiatingMessage,\
2040 sizeof(InitiatingMessage_t));
2041 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2048 /*GNB DU UE F1AP ID*/
2049 initULRRCMsg->protocolIEs.list.array[idx]->id = \
2050 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2051 initULRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2052 initULRRCMsg->protocolIEs.list.array[idx]->value.present = \
2053 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2054 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2058 initULRRCMsg->protocolIEs.list.array[idx]->id = \
2059 ProtocolIE_ID_id_NRCGI;
2060 initULRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2061 initULRRCMsg->protocolIEs.list.array[idx]->value.present = \
2062 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
2064 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI);
2067 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2068 nRCellIdentity.buf,initULRRCMsg->protocolIEs.list.array[idx]->\
2069 value.choice.NRCGI.nRCellIdentity.size);
2070 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2071 pLMN_Identity.buf,initULRRCMsg->protocolIEs.list.array[idx]->\
2072 value.choice.NRCGI.pLMN_Identity.size);
2073 for(idx=0; idx<elementCnt; idx++)
2075 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx],\
2076 sizeof(InitialULRRCMessageTransferIEs_t));
2078 DU_FREE(initULRRCMsg->protocolIEs.list.array,\
2079 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2080 DU_FREE(f1apMsg->choice.initiatingMessage,\
2081 sizeof(InitiatingMessage_t));
2082 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2089 initULRRCMsg->protocolIEs.list.array[idx]->id = \
2090 ProtocolIE_ID_id_C_RNTI;
2091 initULRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2092 initULRRCMsg->protocolIEs.list.array[idx]->value.present = \
2093 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
2094 initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI = CRNTI;
2097 // Need to fill this.
2099 /*DUtoCURRCContainer*/
2100 //Need to fill this too.
2103 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2105 /* Encode the F1SetupRequest type as APER */
2106 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
2108 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2110 /* Encode results */
2111 if(encRetVal.encoded == ENCODE_FAIL)
2113 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer structure (at %s)\n",\
2114 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2119 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC Message transfer\n");
2120 for(int i=0; i< encBufSize; i++)
2122 printf("%x",encBuf[i]);
2127 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
2129 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
2133 }/* End of BuildAndSendRRCSetupReq*/
2135 /*******************************************************************
2137 * @brief Builds Special cell list for UE Setup Request
2141 * Function : BuildSplCellList
2143 * Functionality: Constructs the Special Cell list for UESetReq
2145 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2147 * @return ROK - success
2150 * ****************************************************************/
2151 S16 BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2158 spCellLst->list.count = cellCnt;
2159 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2160 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2161 if(spCellLst->list.array == NULLP)
2165 for(idx=0; idx<cellCnt; idx++)
2167 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2168 if(spCellLst->list.array[idx] == NULLP)
2170 for(cellidx=0; cellidx<idx; cellidx++)
2172 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2174 DU_FREE(spCellLst->list.array,spCellLst->list.size);
2179 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2180 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2181 spCellLst->list.array[idx]->value.present =\
2182 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2183 /* Special Cell ID -NRCGI */
2184 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2187 for(cellidx=0; cellidx<cellCnt; cellidx++)
2189 DU_FREE(spCellLst->list.array[cellidx],sizeof(
2190 SCell_ToBeSetup_ItemIEs_t));
2192 DU_FREE(spCellLst->list.array,spCellLst->list.size);
2195 /*Special Cell Index*/
2196 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2198 }/* End of BuildSplCellList*/
2200 /*******************************************************************
2202 * @brief Builds SRBS to be setup
2206 * Function : BuildSRBSetup
2208 * Functionality: Constructs the SRB's for UESetReq
2210 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2212 * @return ROK - success
2215 * ****************************************************************/
2216 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2222 srbSet->list.count = srbCnt;
2223 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2224 DU_ALLOC(srbSet->list.array,srbSet->list.size);
2225 if(srbSet->list.array == NULLP)
2229 for(idx=0; idx<srbCnt; idx++)
2231 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2232 if(srbSet->list.array[idx] == NULLP)
2234 for(srbidx=0; srbidx<idx; srbidx++)
2236 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2238 DU_FREE(srbSet->list.array,srbSet->list.size);
2242 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2243 srbSet->list.array[idx]->criticality = Criticality_ignore;
2244 srbSet->list.array[idx]->value.present = \
2245 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2246 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2248 }/* End of BuildSRBSetup*/
2250 /*******************************************************************
2252 * @brief Builds QOS Info for DRB Setum Item
2256 * Function : BuildQOSInfo
2258 * Functionality: Constructs the QOS Info for DRB Setup Item
2260 * @params[in] QoSInformation_t *qosinfo
2262 * @return ROK - success
2265 * ****************************************************************/
2266 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2268 /* NonDynamic5QIDescriptor */
2269 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2270 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2271 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2276 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2278 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2279 sizeof(AveragingWindow_t));
2280 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2283 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2284 sizeof(NonDynamic5QIDescriptor_t));
2287 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2288 /*MaxDataBurstVolume*/
2289 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2290 sizeof(MaxDataBurstVolume_t));
2291 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2294 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2295 sizeof(AveragingWindow_t));
2296 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2297 sizeof(NonDynamic5QIDescriptor_t));
2300 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2302 /*nRGRAN Allocation Retention Priority*/
2303 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
2304 PriorityLevel_highest;
2305 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
2306 Pre_emptionCapability_may_trigger_pre_emption;
2307 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
2308 Pre_emptionVulnerability_not_pre_emptable;
2310 /* TO DO: GBR_QoSFlowInformation */
2312 }/*End of BuildQOSInfo*/
2314 /*******************************************************************
2316 * @brief Builds SNSSAI
2320 * Function : BuildSNSSAI
2322 * Functionality: Constructs the SNSSAI For DRB list
2324 * @params[in] SNSSAI_t *snssai
2326 * @return ROK - success
2329 * ****************************************************************/
2330 S16 BuildSNSSAI(SNSSAI_t *snssai)
2334 snssai->sST.size = sizeof(U8);
2335 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
2336 if(snssai->sST.buf == NULLP)
2340 snssai->sST.buf[0] = 3;
2342 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2343 if(snssai->sD == NULLP)
2345 DU_FREE(snssai->sST.buf,snssai->sST.size);
2348 snssai->sD->size = 3*sizeof(U8);
2349 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
2350 if(snssai->sD->buf == NULLP)
2352 DU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
2353 DU_FREE(snssai->sST.buf,snssai->sST.size);
2356 snssai->sD->buf[0] = 3;
2357 snssai->sD->buf[1] = 6;
2358 snssai->sD->buf[2] = 9;
2360 }/*End of BuildSNSSAI*/
2362 /*******************************************************************
2364 * @brief Builds the flow map.
2368 * Function : BuildFlowsMap
2370 * Functionality: Constructs the flowmap For DRB list
2372 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2374 * @return ROK - success
2377 * ****************************************************************/
2378 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2385 flowMap->list.count = flowCnt;
2386 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2387 DU_ALLOC(flowMap->list.array,flowMap->list.size);
2388 if(flowMap->list.array == NULLP)
2392 for(idx=0; idx<flowCnt; idx++)
2394 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2395 if(flowMap->list.array[idx] == NULLP)
2397 for(flowidx=0; flowidx<idx; flowidx++)
2399 DU_FREE(flowMap->list.array[flowidx],sizeof( \
2400 Flows_Mapped_To_DRB_Item_t));
2403 DU_FREE(flowMap->list.array,flowMap->list.size);
2407 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2408 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2411 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2412 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2413 sizeof(MaxDataBurstVolume_t));
2414 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2415 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2416 sizeof(AveragingWindow_t));
2417 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2418 qoS_Characteristics.choice.non_Dynamic_5QI,\
2419 sizeof(NonDynamic5QIDescriptor_t));
2420 for(idx=0; idx<flowCnt; idx++)
2422 DU_FREE(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2424 DU_FREE(flowMap->list.array,flowMap->list.size);
2428 }/*End of BuildFlowsMap*/
2430 /*******************************************************************
2432 * @brief Builds the Uplink Tunnel Info
2436 * Function : BuildULTnlInfo
2438 * Functionality: Constructs the UL TnlInfo For DRB list
2440 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2442 * @return ROK - success
2445 * ****************************************************************/
2446 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2452 ulInfo->list.count = ulCnt;
2453 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2454 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2455 if(ulInfo->list.array == NULLP)
2459 for(idx=0; idx<ulCnt; idx++)
2461 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2462 if(ulInfo->list.array[idx] == NULLP)
2464 for(ulidx=0; ulidx<idx; ulidx++)
2466 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2468 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2473 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2474 UPTransportLayerInformation_PR_gTPTunnel;
2476 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2477 sizeof(GTPTunnel_t));
2478 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2480 for(idx=0; idx<ulCnt; idx++)
2482 DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2484 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2487 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2488 transportLayerAddress.size = 4*sizeof(U8);
2489 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2490 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2491 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2492 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2493 transportLayerAddress.buf == NULLP)
2495 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2496 sizeof(GTPTunnel_t));
2497 for(idx=0; idx<ulCnt; idx++)
2499 DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2501 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2504 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2505 transportLayerAddress.buf[0] = 4;
2506 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2507 transportLayerAddress.buf[1] = 4;
2508 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2509 transportLayerAddress.buf[2] = 4;
2510 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2511 transportLayerAddress.buf[3] = 5;
2512 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2513 transportLayerAddress.bits_unused = 0;
2515 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2517 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2518 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2519 gTPTunnel->gTP_TEID.size);
2520 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2523 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2524 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2525 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2526 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2527 sizeof(GTPTunnel_t));
2528 for(idx=0; idx<ulCnt; idx++)
2530 DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2532 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2535 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2536 gTP_TEID.buf[0] = 11;
2537 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2538 gTP_TEID.buf[1] = 0;
2539 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2540 gTP_TEID.buf[2] = 0;
2541 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2542 gTP_TEID.buf[3] = 1;
2545 }/*End of BuildULTnlInfo*/
2547 /*******************************************************************
2549 * @brief Builds DRBS to be setup
2553 * Function : BuildDRBSetup
2555 * Functionality: Constructs the DRB's for UESetReq
2557 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2559 * @return ROK - success
2562 * ****************************************************************/
2563 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2573 DRBs_ToBeSetup_Item_t *drbSetItem;
2575 drbSet->list.count = drbCnt;
2576 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2577 DU_ALLOC(drbSet->list.array,drbSet->list.size);
2578 if(drbSet->list.array == NULLP)
2582 for(idx=0; idx<drbCnt; idx++)
2584 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2585 if(drbSet->list.array[idx] == NULLP)
2587 for(drbidx=0; drbidx<idx; drbidx++)
2589 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2591 DU_FREE(drbSet->list.array,drbSet->list.size);
2596 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2597 drbSet->list.array[idx]->criticality = Criticality_ignore;
2598 drbSet->list.array[idx]->value.present = \
2599 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2600 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2602 drbSetItem->dRBID = 1;
2604 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2605 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2606 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2608 for(idx=0; idx<drbCnt; idx++)
2610 DU_FREE(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2612 DU_FREE(drbSet->list.array,drbSet->list.size);
2615 drbSetItem->qoSInformation.choice.choice_extension->id = \
2616 ProtocolIE_ID_id_DRB_Information;
2617 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2619 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2620 QoSInformation_ExtIEs__value_PR_DRB_Information;
2621 ret = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2622 choice_extension->value.choice.DRB_Information.dRB_QoS);
2625 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2626 for(drbidx=0; drbidx<drbCnt; drbidx++)
2628 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2630 DU_FREE(drbSet->list.array,drbSet->list.size);
2634 ret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2635 choice_extension->value.choice.DRB_Information.sNSSAI);
2638 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2639 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2640 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2641 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2642 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2643 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2644 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2645 for(drbidx=0; drbidx<drbCnt; drbidx++)
2647 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2649 DU_FREE(drbSet->list.array,drbSet->list.size);
2652 /*Flows mapped to DRB List*/
2653 ret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2654 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2657 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2658 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2659 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2660 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2661 choice.choice_extension->value.choice.DRB_Information.\
2663 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2664 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2665 choice.choice_extension->value.choice.DRB_Information.\
2667 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2668 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2669 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2670 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2671 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2672 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2673 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2674 for(drbidx=0; drbidx<drbCnt; drbidx++)
2676 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2678 DU_FREE(drbSet->list.array,drbSet->list.size);
2681 /*ULUPTNLInformation To Be Setup List*/
2682 ret = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2686 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2687 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2688 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2689 choice.non_Dynamic_5QI->maxDataBurstVolume,\
2690 sizeof(MaxDataBurstVolume_t));
2691 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2692 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2693 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2694 choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2695 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2696 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2697 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2698 choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2699 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2700 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2701 array,drbSetItem->qoSInformation.choice.choice_extension->\
2702 value.choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2704 for(flowidx=0; flowidx<flowCnt;flowidx++)
2706 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2707 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2708 array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2710 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2711 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2712 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2713 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2714 choice.choice_extension->value.choice.DRB_Information.\
2716 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2717 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2718 choice.choice_extension->value.choice.DRB_Information.\
2720 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2721 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2722 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2723 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2724 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2725 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2726 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2727 for(drbidx=0; drbidx<drbCnt; drbidx++)
2729 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2731 DU_FREE(drbSet->list.array,drbSet->list.size);
2735 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2737 /*UL Configuration*/
2739 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2740 if(drbSetItem->uLConfiguration == NULLP)
2743 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2744 uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf,\
2745 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2746 uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2747 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2748 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf,\
2749 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2750 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2751 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2752 uLUPTNLInformation.choice.gTPTunnel,sizeof(GTPTunnel_t));
2753 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array,\
2754 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.size);
2755 for(ulidx=0; ulidx<ulCnt; ulidx++)
2757 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx],\
2758 sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2761 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2762 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2763 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2764 choice.non_Dynamic_5QI->maxDataBurstVolume,\
2765 sizeof(MaxDataBurstVolume_t));
2766 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2767 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2768 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2769 choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2770 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2771 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2772 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2773 choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2774 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2775 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2776 array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2777 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2779 for(flowidx=0; flowidx<flowCnt;flowidx++)
2781 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2782 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2783 array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2785 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2786 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2787 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2788 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2789 choice.choice_extension->value.choice.DRB_Information.\
2791 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2792 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2793 choice.choice_extension->value.choice.DRB_Information.\
2795 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2796 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2797 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2798 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2799 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2800 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2801 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2802 for(drbidx=0; drbidx<drbCnt; drbidx++)
2804 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2806 DU_FREE(drbSet->list.array,drbSet->list.size);
2809 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2811 }/* End of BuildDRBSetup*/
2813 /*******************************************************************
2815 * @brief Builds and sends the UE Setup Request
2819 * Function : BuildAndSendUESetReq
2821 * Functionality: Constructs the UE Setup Request and sends
2822 * it to the CU through SCTP.
2826 * @return ROK - success
2829 * ****************************************************************/
2830 S16 BuildAndSendUESetReq()
2846 F1AP_PDU_t *f1apMsg = NULL;
2847 UEContextSetupRequest_t *ueSetReq;
2848 asn_enc_rval_t encRetVal; /* Encoder return value */
2850 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2852 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2853 if(f1apMsg == NULLP)
2855 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2859 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2860 DU_ALLOC(f1apMsg->choice.initiatingMessage,
2861 sizeof(InitiatingMessage_t));
2862 if(f1apMsg->choice.initiatingMessage == NULLP)
2864 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2865 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2869 f1apMsg->choice.initiatingMessage->procedureCode = \
2870 ProcedureCode_id_UEContextSetup;
2871 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2872 f1apMsg->choice.initiatingMessage->value.present = \
2873 InitiatingMessage__value_PR_UEContextSetupRequest;
2875 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2877 ueSetReq->protocolIEs.list.count = elementCnt;
2878 ueSetReq->protocolIEs.list.size = \
2879 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2881 /* Initialize the UESetup members */
2882 DU_ALLOC(ueSetReq->protocolIEs.list.array, \
2883 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
2884 if(ueSetReq->protocolIEs.list.array == NULLP)
2886 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2887 DU_FREE(f1apMsg->choice.initiatingMessage,
2888 sizeof(InitiatingMessage_t));
2889 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
2893 for(idx=0; idx<elementCnt; idx++)
2895 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx],\
2896 sizeof(UEContextSetupRequestIEs_t));
2897 if(ueSetReq->protocolIEs.list.array[idx] == NULLP)
2899 for(ieId=0; ieId<idx; ieId++)
2901 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],\
2902 sizeof(UEContextSetupRequestIEs_t));
2904 DU_FREE(ueSetReq->protocolIEs.list.array,\
2905 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
2906 DU_FREE(f1apMsg->choice.initiatingMessage,\
2907 sizeof(InitiatingMessage_t));
2908 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2915 /*GNB CU UE F1AP ID*/
2916 ueSetReq->protocolIEs.list.array[idx]->id = \
2917 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2918 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2919 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2920 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2921 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2923 /*GNB DU UE F1AP ID*/
2925 ueSetReq->protocolIEs.list.array[idx]->id = \
2926 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2927 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2928 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2929 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2930 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2934 ueSetReq->protocolIEs.list.array[idx]->id = \
2935 ProtocolIE_ID_id_SpCell_ID;
2936 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2937 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2938 UEContextSetupRequestIEs__value_PR_NRCGI;
2940 BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2944 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2945 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
2946 choice.NRCGI.nRCellIdentity.size));
2947 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2948 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
2949 choice.NRCGI.pLMN_Identity.size));
2950 for(idx=0; idx<elementCnt; idx++)
2952 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
2953 sizeof(InitialULRRCMessageTransferIEs_t));
2955 DU_FREE(ueSetReq->protocolIEs.list.array,\
2956 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2957 DU_FREE(f1apMsg->choice.initiatingMessage,\
2958 sizeof(InitiatingMessage_t));
2959 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2964 /*Served Cell Index*/
2966 ueSetReq->protocolIEs.list.array[idx]->id = \
2967 ProtocolIE_ID_id_ServCellIndex;
2968 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2969 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2970 UEContextSetupRequestIEs__value_PR_ServCellIndex;
2971 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
2974 /*CellULConfigured*/
2976 ueSetReq->protocolIEs.list.array[idx]->id = \
2977 ProtocolIE_ID_id_SpCellULConfigured;
2978 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2979 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2980 UEContextSetupRequestIEs__value_PR_CellULConfigured;
2981 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
2982 CellULConfigured_none;
2985 /*CUtoDURRCContainer*/
2987 ueSetReq->protocolIEs.list.array[idx]->id = \
2988 ProtocolIE_ID_id_CUtoDURRCInformation;
2989 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2990 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2991 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
2993 /*Special Cells to be SetupList*/
2995 ueSetReq->protocolIEs.list.array[idx]->id = \
2996 ProtocolIE_ID_id_SCell_ToBeSetup_List;
2997 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2998 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2999 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
3001 ret = BuildSplCellList(&ueSetReq->protocolIEs.\
3002 list.array[idx]->value.choice.SCell_ToBeSetup_List);
3005 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3006 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3007 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3008 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3009 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3010 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3011 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3012 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3013 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3014 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3015 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3016 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3017 for(spId=0; spId<cellCnt; spId++)
3019 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3020 SCell_ToBeSetup_List.list.array[spId],sizeof(
3021 SCell_ToBeSetup_ItemIEs_t));
3023 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3024 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3025 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3028 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3029 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3030 choice.NRCGI.nRCellIdentity.size));
3031 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3032 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3033 choice.NRCGI.pLMN_Identity.size));
3034 for(idx=0; idx<elementCnt; idx++)
3036 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3037 sizeof(UEContextSetupRequestIEs_t));
3039 DU_FREE(ueSetReq->protocolIEs.list.array,\
3040 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3041 DU_FREE(f1apMsg->choice.initiatingMessage,\
3042 sizeof(InitiatingMessage_t));
3043 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3046 /*SRBs To Be Setup List*/
3048 ueSetReq->protocolIEs.list.array[idx]->id = \
3049 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
3050 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3051 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3052 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
3054 ret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.\
3055 choice.SRBs_ToBeSetup_List);
3059 for(srbId=0; srbId<srbCnt; srbId++)
3061 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3062 SRBs_ToBeSetup_List.list.array[srbId],\
3063 sizeof(SRBs_ToBeSetup_ItemIEs_t));
3065 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3066 SRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3067 array[idx]->value.choice.SRBs_ToBeSetup_List.list.size);
3069 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3070 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3071 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3072 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3073 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3074 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3075 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3076 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3077 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3078 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3079 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3080 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3081 for(spId=0; spId<cellCnt; spId++)
3083 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3084 SCell_ToBeSetup_List.list.array[spId],sizeof(\
3085 SCell_ToBeSetup_ItemIEs_t));
3087 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3088 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3089 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3091 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3092 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3093 choice.NRCGI.nRCellIdentity.size));
3094 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3095 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3096 choice.NRCGI.pLMN_Identity.size));
3097 for(idx=0; idx<elementCnt; idx++)
3099 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3100 sizeof(UEContextSetupRequestIEs_t));
3102 DU_FREE(ueSetReq->protocolIEs.list.array,\
3103 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3104 DU_FREE(f1apMsg->choice.initiatingMessage,\
3105 sizeof(InitiatingMessage_t));
3106 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3109 /*DRBs to Be Setup List*/
3111 ueSetReq->protocolIEs.list.array[idx]->id = \
3112 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
3113 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3114 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3115 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
3119 ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.\
3120 choice.DRBs_ToBeSetup_List);
3123 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3124 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3125 DRBs_ToBeSetup_Item.uLConfiguration,\
3126 sizeof(ULConfiguration_t));
3128 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3129 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3130 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3131 array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3132 sizeof(GTPTunnel_t));
3133 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3134 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3135 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3136 array,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3137 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3138 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.size);
3139 for(ulidx=0; ulidx<ulCnt;ulidx++)
3141 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3142 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3143 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3144 array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3147 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3148 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3149 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3150 choice_extension->value.choice.DRB_Information.\
3151 flows_Mapped_To_DRB_List.list.array[idx]->qoSFlowLevelQoSParameters.\
3152 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3153 sizeof(AveragingWindow_t));
3154 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3155 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3156 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3157 choice_extension->value.choice.DRB_Information.\
3158 flows_Mapped_To_DRB_List.list.array[idx]->qoSFlowLevelQoSParameters.\
3159 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3160 sizeof(MaxDataBurstVolume_t));
3161 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3162 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3163 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3164 choice_extension->value.choice.DRB_Information.\
3165 flows_Mapped_To_DRB_List.list.array,ueSetReq->protocolIEs.list.\
3166 array[idx]->value.choice.\
3167 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3168 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3169 choice_extension->value.choice.DRB_Information.\
3170 flows_Mapped_To_DRB_List.list.size);
3171 for(flowidx=0;flowidx<flowCnt;flowidx++)
3173 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3174 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3175 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3176 choice_extension->value.choice.DRB_Information.\
3177 flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(
3178 Flows_Mapped_To_DRB_Item_t));
3180 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3181 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3182 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3183 choice_extension->value.choice.DRB_Information.sNSSAI.\
3184 sD->buf,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3185 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3186 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3187 choice_extension->value.choice.DRB_Information.sNSSAI.\
3189 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3190 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3191 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3192 choice_extension->value.choice.DRB_Information.sNSSAI.\
3193 sD,sizeof(OCTET_STRING_t));
3194 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3195 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3196 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3197 choice_extension->value.choice.DRB_Information.sNSSAI.\
3198 sST.buf,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3199 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3200 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3201 choice_extension->value.choice.DRB_Information.sNSSAI.\
3203 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3204 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3205 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3206 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3207 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3208 sizeof(MaxDataBurstVolume_t));
3209 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3210 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3211 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3212 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3213 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3214 sizeof(AveragingWindow_t));
3215 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3216 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3217 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3218 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3219 qoS_Characteristics.choice.non_Dynamic_5QI,\
3220 sizeof(NonDynamic5QIDescriptor_t));
3221 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3222 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3223 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3224 choice_extension,sizeof(QoSInformation_ExtIEs_t));
3225 for(drbId=0; drbId<drbCnt; drbId++)
3227 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3228 DRBs_ToBeSetup_List.list.array[drbId],\
3229 sizeof(DRBs_ToBeSetup_ItemIEs_t));
3231 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3232 DRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3233 array[idx]->value.choice.DRBs_ToBeSetup_List.list.size);
3235 for(srbId=0; srbId<srbCnt; srbId++)
3237 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3238 SRBs_ToBeSetup_List.list.array[srbId],\
3239 sizeof(SRBs_ToBeSetup_ItemIEs_t));
3241 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3242 SRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3243 array[idx]->value.choice.SRBs_ToBeSetup_List.list.size);
3245 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3246 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3247 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3248 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3249 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3250 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3251 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3252 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3253 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3254 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3255 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3256 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3257 for(spId=0; spId<cellCnt; spId++)
3259 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3260 SCell_ToBeSetup_List.list.array[spId],sizeof(\
3261 SCell_ToBeSetup_ItemIEs_t));
3263 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3264 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3265 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3267 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3268 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3269 choice.NRCGI.nRCellIdentity.size));
3270 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3271 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3272 choice.NRCGI.pLMN_Identity.size));
3273 for(idx=0; idx<elementCnt; idx++)
3275 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3276 sizeof(UEContextSetupRequestIEs_t));
3278 DU_FREE(ueSetReq->protocolIEs.list.array,\
3279 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3280 DU_FREE(f1apMsg->choice.initiatingMessage,\
3281 sizeof(InitiatingMessage_t));
3282 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3286 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3288 /* Encode the F1SetupRequest type as APER */
3289 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3291 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
3293 /* Encode results */
3294 if(encRetVal.encoded == ENCODE_FAIL)
3296 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
3297 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3302 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
3303 for(int i=0; i< encBufSize; i++)
3305 printf("%x",encBuf[i]);
3310 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
3312 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
3316 }/* End of BuildAndSendUESetReq*/
3318 /*******************************************************************
3320 * @brief Handles received F1AP message and sends back response
3324 * Function : F1APMsgHdlr
3327 * - Decodes received F1AP control message
3328 * - Prepares response message, encodes and sends to SCTP
3331 * @return ROK - success
3334 * ****************************************************************/
3335 void F1APMsgHdlr(Buffer *mBuf)
3341 F1AP_PDU_t *f1apMsg;
3342 asn_dec_rval_t rval; /* Decoder return value */
3343 F1AP_PDU_t f1apasnmsg ;
3345 DU_LOG("\nF1AP : Received F1AP message buffer");
3346 SPrntMsg(mBuf, 0,0);
3348 /* Copy mBuf into char array to decode it */
3349 SFndLenMsg(mBuf, &recvBufLen);
3350 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
3352 DU_LOG("\nF1AP : Memory allocation failed");
3355 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
3357 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
3361 printf("\nF1AP : Received flat buffer to be decoded : ");
3362 for(i=0; i< recvBufLen; i++)
3364 printf("%x",recvBuf[i]);
3367 /* Decoding flat buffer into F1AP messsage */
3368 f1apMsg = &f1apasnmsg;
3369 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
3371 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
3372 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
3373 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
3375 DU_LOG("\nF1AP : ASN decode failed");
3379 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3381 switch(f1apMsg->present)
3383 case F1AP_PDU_PR_successfulOutcome:
3385 switch(f1apMsg->choice.successfulOutcome->value.present)
3387 case SuccessfulOutcome__value_PR_F1SetupResponse:
3389 #ifndef ODU_TEST_STUB
3390 procF1SetupRsp(f1apMsg);
3395 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
3397 procGNBDUCfgUpdAck(f1apMsg);
3403 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
3406 }/* End of switch(successfulOutcome) */
3412 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
3416 }/* End of switch(f1apMsg->present) */
3418 } /* End of F1APMsgHdlr */
3420 /*******************************************************************
3422 * @brief Processes GNB DU config update ack
3426 * Function : procGNBDUCfgUpdAck
3428 * Functionality: Processes GNB DU config update ack
3430 * @params[in] F1AP_PDU_t ASN decoded F1AP message
3431 * @return ROK - success
3434 * ****************************************************************/
3436 S16 procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
3440 DU_LOG("\nF1AP : GNB-DU config update acknowledgment received");
3443 /* TODO :Check the deallocation */
3445 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(gNBDuCfgAck->protocolIEs.list.array),\
3446 (Size)elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
3447 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(f1apMsg->choice.successfulOutcome),\
3448 (Size)sizeof(SuccessfulOutcome_t));
3449 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&f1apMsg,(Size)sizeof(F1AP_PDU_t));
3454 /**********************************************************************
3456 **********************************************************************/