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 if(nrcgi->pLMN_Identity.buf == NULLP)
142 ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
143 &nrcgi->pLMN_Identity); // Building PLMN function
149 //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
150 nrcgi->nRCellIdentity.size = byteSize * sizeof(U8);
151 DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
152 if(nrcgi->nRCellIdentity.buf == NULLP)
156 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
163 /*******************************************************************
165 * @brief Builds FiveGStac
169 * Function : BuildFiveGSTac
171 * Functionality: Building the FiveGSTac
173 * @params[in] OCTET_STRING_t *fivegsTac
174 * @return ROK - success
177 * ****************************************************************/
178 S16 BuildFiveGSTac(Served_Cell_Information_t *servcell)
180 DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
181 if(servcell->fiveGS_TAC == NULLP)
185 servcell->fiveGS_TAC->size = 3 * sizeof(U8);
186 DU_ALLOC(servcell->fiveGS_TAC->buf,\
187 sizeof(servcell->fiveGS_TAC->size));
188 if(servcell->fiveGS_TAC->buf == NULLP)
192 servcell->fiveGS_TAC->buf[0] = 0;
193 servcell->fiveGS_TAC->buf[1] = 0;
194 servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
197 /*******************************************************************
199 * @brief Builds NR Mode
203 * Function : BuildNrMode
205 * Functionality: Building the NR Mode
207 * @params[in] NR_Mode_Info_t *fdd
208 * @return ROK - success
211 * ****************************************************************/
212 S16 BuildNrMode(NR_Mode_Info_t *mode)
214 S16 BuildDLNRInforet=0;
215 S16 BuildULNRInforet=0;
217 mode->present = NR_Mode_Info_PR_fDD;
218 if(mode->present == NR_Mode_Info_PR_fDD)
220 DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
221 if(mode->choice.fDD == NULLP)
225 BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
226 if(BuildULNRInforet != ROK)
230 BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
231 if(BuildDLNRInforet != ROK)
236 mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
237 duCfgParam.srvdCellLst[0].duCellInfo.\
238 f1Mode.mode.fdd.ulTxBw.nrScs;
239 mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
240 duCfgParam.srvdCellLst[0].duCellInfo.\
241 f1Mode.mode.fdd.ulTxBw.nrb;
242 mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
243 duCfgParam.srvdCellLst[0].duCellInfo.\
244 f1Mode.mode.fdd.dlTxBw.nrScs;
245 mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
246 duCfgParam.srvdCellLst[0].duCellInfo.\
247 f1Mode.mode.fdd.dlTxBw.nrb;
250 /*******************************************************************
252 * @brief Builds IE Extensions for Served PLMNs
256 * Function : BuildExtensions
258 * Functionality: Building the IE Extensions
260 * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
261 * @return ROK - success
264 * ****************************************************************/
265 S16 BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
272 DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
273 if((*ieExtend) == NULLP)
277 (*ieExtend)->list.count = extensionCnt;
278 (*ieExtend)->list.size = \
279 extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
280 DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
281 if((*ieExtend)->list.array == NULLP)
285 for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
287 DU_ALLOC((*ieExtend)->list.array[plmnidx],\
288 sizeof(ServedPLMNs_ItemExtIEs_t));
289 if((*ieExtend)->list.array[plmnidx] == NULLP)
295 (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
296 (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
297 (*ieExtend)->list.array[idx]->extensionValue.present = \
298 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
299 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
301 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
302 list.size = sizeof(SliceSupportItem_t *);
303 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
304 list.array,sizeof(SliceSupportItem_t *));
305 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
310 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
311 list.array[sliceId],sizeof(SliceSupportItem_t));
312 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
313 list.array[sliceId] == NULLP)
317 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
318 list.array[sliceId]->sNSSAI.sST.size = sizeof(U8);
319 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
320 .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
321 extensionValue.choice.SliceSupportList.\
322 list.array[sliceId]->sNSSAI.sST.size);
323 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
324 .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
328 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
329 list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
330 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
331 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
332 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
333 list.array[sliceId]->sNSSAI.sD == NULLP)
337 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
338 list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(U8);
339 DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
340 list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
341 SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
342 if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
343 list.array[sliceId]->sNSSAI.sD->buf == NULLP)
348 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
349 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
351 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
352 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
354 (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
355 list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
358 /*******************************************************************
360 * @brief Builds Served PLMN
364 * Function : BuildServedPlmn
366 * Functionality: Building the Served PLMN
368 * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
369 * @return ROK - success
372 * ****************************************************************/
373 S16 BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
377 S16 buildPlmnIdret=0;
378 S16 BuildExtensionsret=0;
379 srvplmn->list.count = servPlmnCnt;
380 srvplmn->list.size = \
381 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
382 DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
383 if(srvplmn->list.array == NULLP)
387 for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
389 DU_ALLOC(srvplmn->list.array[plmnidx],\
390 sizeof(ServedPLMNs_Item_t));
391 if(srvplmn->list.array[plmnidx] == NULLP)
396 srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(U8);
397 DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
398 buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
399 &srvplmn->list.array[0]->pLMN_Identity);
400 if(buildPlmnIdret!= ROK)
404 BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
405 if(BuildExtensionsret!= ROK)
411 /*******************************************************************
413 * @brief Builds Served Cell List
417 * Function : BuildServedCellList
419 * Functionality: Building Served Cell List
421 * @params[in] PLMNID plmn
422 * @return ROK - success
425 * ****************************************************************/
427 S16 BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
430 S16 BuildFiveGSTacret=0;
431 S16 BuildServedPlmnret=0;
432 S16 BuildNrModeret=0;
436 GNB_DU_Served_Cells_Item_t *srvCellItem;
437 duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
438 duServedCell->list.count = plmnCnt;
440 DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
441 if(duServedCell->list.array == NULLP)
445 for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
447 DU_ALLOC(duServedCell->list.array[plmnidx],\
448 sizeof(GNB_DU_Served_Cells_ItemIEs_t));
449 if(duServedCell->list.array[plmnidx] == NULLP)
455 duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
456 duServedCell->list.array[idx]->criticality = Criticality_reject;
457 duServedCell->list.array[idx]->value.present = \
458 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
460 &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
462 BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
463 if(BuildNrcgiret != ROK)
468 srvCellItem->served_Cell_Information.nRPCI = \
469 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
472 BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
473 if(BuildFiveGSTacret != ROK)
478 BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
479 if(BuildServedPlmnret !=ROK)
483 /*nR Mode Info with FDD*/
484 BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
485 if(BuildNrModeret != ROK)
489 /*Measurement timing Config*/
490 srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
492 DU_ALLOC(srvCellItem->served_Cell_Information.\
493 measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
494 if(srvCellItem->served_Cell_Information.\
495 measurementTimingConfiguration.buf == NULLP)
499 srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
500 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
502 /* GNB DU System Information */
503 DU_ALLOC(srvCellItem->gNB_DU_System_Information,
504 sizeof(GNB_DU_System_Information_t));
505 if(!srvCellItem->gNB_DU_System_Information)
510 srvCellItem->gNB_DU_System_Information->mIB_message.size =\
511 strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
512 DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
513 srvCellItem->gNB_DU_System_Information->mIB_message.size);
514 if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
518 strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
519 (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
522 srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
523 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
525 DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
526 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
527 if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
531 for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
533 srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
534 duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
538 /*******************************************************************
540 * @brief Builds RRC Version
544 * Function : BuildRrcVer
546 * Functionality: Building RRC Version
548 * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
549 * @return ROK - success
552 * ****************************************************************/
553 S16 BuildRrcVer(RRC_Version_t *rrcVer)
557 rrcVer->latest_RRC_Version.size = sizeof(U8);
558 DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(U8));
559 if(rrcVer->latest_RRC_Version.buf == NULLP)
563 rrcVer->latest_RRC_Version.buf[0] = 0;
564 rrcVer->latest_RRC_Version.bits_unused = 5;
565 DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
566 if(rrcVer->iE_Extensions == NULLP)
570 rrcVer->iE_Extensions->list.count = 1;
571 rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
572 DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
573 if(rrcVer->iE_Extensions->list.array == NULLP)
578 DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
579 sizeof(RRC_Version_ExtIEs_t));
580 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
584 rrcVer->iE_Extensions->list.array[rrcExt]->id = \
585 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
586 rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
587 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
588 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
589 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
590 .Latest_RRC_Version_Enhanced.size = 3*sizeof(U8);
591 DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
592 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
593 array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
594 if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
595 .Latest_RRC_Version_Enhanced.buf == NULLP)
600 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
601 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
603 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
604 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
606 rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
607 Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
610 /*******************************************************************
612 * @brief Sends F1 msg over SCTP
616 * Function : SendF1APMsg
618 * Functionality: Sends F1 msg over SCTP
620 * @params[in] Region region
622 * @return ROK - success
625 * ****************************************************************/
626 S16 SendF1APMsg(Region region, Pool pool)
630 if(SGetMsg(region, pool, &mBuf) == ROK)
632 if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
636 if(sctpSend(mBuf, F1_INTERFACE) != ROK)
638 DU_LOG("\nF1AP : SCTP Send failed");
645 DU_LOG("\nF1AP : SAddPstMsgMult failed");
653 DU_LOG("\nF1AP : Failed to allocate memory");
659 /*******************************************************************
661 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
665 * Function : FreeRrcVer
667 * Functionality: deallocating the memory of function BuildRrcVer
669 * @params[in] RRC_Version_t *rrcVer
673 *****************************************************************/
674 void FreeRrcVer(RRC_Version_t *rrcVer)
676 if(rrcVer->latest_RRC_Version.buf != NULLP)
678 if(rrcVer->iE_Extensions != NULLP)
680 if(rrcVer->iE_Extensions->list.array != NULLP)
682 if(rrcVer->iE_Extensions->list.array[0] != NULLP)
684 if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
687 DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
688 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
689 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
691 DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
693 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
695 DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
697 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
700 /*******************************************************************
702 * @brief deallocating the memory of function BuildAndSendF1SetupReq()
706 * Function : FreeServedCellList
708 * Functionality: deallocating the memory of function BuildServedCellList
711 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
715 * ****************************************************************/
716 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
724 GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
725 if(duServedCell->list.array!=NULLP)
727 if(duServedCell->list.array[0]!=NULLP)
729 if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
731 if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
733 if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
735 if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
737 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
739 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
741 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
743 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
745 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
747 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
749 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
750 extensionValue.choice.SliceSupportList.list.array!=NULLP)
752 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
753 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
755 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
756 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
758 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
759 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
761 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
762 list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
764 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
766 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
767 freqBandListNr.list.array!=NULLP)
769 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
770 freqBandListNr.list.array[0]!=NULLP)
772 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
773 freqBandListNr.list.array)
775 if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
776 freqBandListNr.list.array[0]!=NULLP)
778 if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
780 if(!srvCellItem->gNB_DU_System_Information)
782 if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
784 if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
786 DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
787 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
788 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
789 srvCellItem->gNB_DU_System_Information->sIB1_message.size);
791 DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
792 srvCellItem->gNB_DU_System_Information->mIB_message.size);
793 DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
794 strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
796 DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
798 DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
799 srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
801 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
802 freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
804 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
805 freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
807 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
808 list.array[0],sizeof(FreqBandNrItem_t));
810 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
811 list.array,sizeof(FreqBandNrItem_t*));
813 DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
815 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
816 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
817 sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
818 list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
820 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
821 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
822 list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
824 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
825 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
826 sNSSAI.sST.buf,sizeof(U8));
828 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
829 extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
831 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
832 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
834 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
835 array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
837 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
838 array[servId]->iE_Extensions->list.array,\
839 extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
841 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
842 array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
844 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
845 array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
846 servedPLMNs.list.array[servId]->pLMN_Identity.size
849 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
850 sizeof(ServedPLMNs_Item_t *));
852 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
853 sizeof(ServedPLMNs_Item_t *));
855 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
856 sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
858 DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
860 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
861 srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
864 DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
865 srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
868 DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
870 DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
873 /*******************************************************************
875 * @brief Builds and Send the F1SetupRequest
879 * Function : BuildAndSendF1SetupReq
881 * Functionality:Fills the F1SetupRequest
883 * @return ROK - success
886 ******************************************************************/
887 S16 BuildAndSendF1SetupReq()
889 S16 BuildServedCellListreturn=0;
890 S16 BuildRrcVerreturn=0;
894 F1AP_PDU_t *f1apMsg = NULLP;
895 F1SetupRequest_t *f1SetupReq=NULLP;
896 GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
897 RRC_Version_t *rrcVer=NULLP;
898 asn_enc_rval_t encRetVal; /* Encoder return value */
900 DU_LOG("\nF1AP : Building F1 Setup Request\n");
903 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
908 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
909 DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
910 if(f1apMsg->choice.initiatingMessage == NULLP)
914 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
915 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
916 f1apMsg->choice.initiatingMessage->value.present = \
917 InitiatingMessage__value_PR_F1SetupRequest;
919 f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
921 elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
923 f1SetupReq->protocolIEs.list.count = elementCnt;
924 f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
926 /* Initialize the F1Setup members */
927 DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
928 if(f1SetupReq->protocolIEs.list.array == NULLP)
932 for(idx=0; idx<elementCnt; idx++)
934 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
935 sizeof(F1SetupRequestIEs_t));
936 if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
944 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
945 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
946 f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
947 F1SetupRequestIEs__value_PR_TransactionID;
948 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
953 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
954 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
955 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
956 F1SetupRequestIEs__value_PR_GNB_DU_ID;
957 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
960 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
961 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
962 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
968 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
972 if(duCfgParam.duName != NULL)
975 f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
976 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
977 f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
978 f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
979 strlen((char *)duCfgParam.duName);
980 DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
981 GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
982 if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
987 strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
988 choice.GNB_DU_Name.buf,
989 (char*)&duCfgParam.duName);
993 /*Served Cell list */
995 f1SetupReq->protocolIEs.list.array[idx2]->id = \
996 ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
997 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
998 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
999 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1000 duServedCell = &f1SetupReq->protocolIEs.list.\
1001 array[idx2]->value.choice.GNB_DU_Served_Cells_List;
1002 BuildServedCellListreturn = BuildServedCellList(duServedCell);
1003 if(BuildServedCellListreturn != ROK)
1010 f1SetupReq->protocolIEs.list.array[idx2]->id = \
1011 ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1012 f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1013 f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1014 F1SetupRequestIEs__value_PR_RRC_Version;
1015 rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1016 BuildRrcVerreturn = BuildRrcVer(rrcVer);
1018 if(BuildRrcVerreturn != ROK)
1022 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1024 /* Encode the F1SetupRequest type as APER */
1025 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1027 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1030 /* Encode results */
1031 if(encRetVal.encoded == ENCODE_FAIL)
1033 DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1034 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1039 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1040 for(i=0; i< encBufSize; i++)
1042 printf("%x",encBuf[i]);
1047 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1049 DU_LOG("\nF1AP : Sending F1 Setup request failed");
1056 if(f1apMsg != NULLP)
1059 if(f1apMsg->choice.initiatingMessage != NULLP)
1061 if(f1SetupReq->protocolIEs.list.array != NULLP)
1063 if(idx == elementCnt-1)
1065 if(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf != NULLP)
1067 if(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf != NULLP)
1069 if(BuildServedCellListreturn == ROK)
1073 FreeServedCellList(duServedCell);
1074 DU_FREE(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1076 DU_FREE(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf, sizeof(U8));
1078 for(idx=0; idx<elementCnt; idx++)
1080 DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
1085 for(ieId=0 ; ieId<idx ;ieId++)
1087 if(f1SetupReq->protocolIEs.list.array[ieId]!=NULLP)
1089 DU_FREE(f1SetupReq->protocolIEs.list.array[ieId],\
1090 sizeof(F1SetupRequestIEs_t));
1094 DU_FREE(f1SetupReq->protocolIEs.list.array,\
1095 elementCnt * sizeof(F1SetupRequestIEs_t *));
1097 DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1099 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1106 }/* End of BuildAndSendF1SetupReq */
1108 /*******************************************************************
1110 * @brief Builds and sends the DUConfigUpdate
1114 * Function : BuildAndSendDUConfigUpdate
1116 * Functionality: Constructs the DU Update message and sends
1117 * it to the CU through SCTP.
1119 * @params[in] void **buf,Buffer to which encoded pattern is written into
1120 * @params[in] int *size,size of buffer
1122 * @return ROK - success
1125 * ****************************************************************/
1126 S16 BuildAndSendDUConfigUpdate()
1137 asn_enc_rval_t encRetVal; /* Encoder return value */
1138 F1AP_PDU_t *f1apDuCfg = NULL;
1139 GNBDUConfigurationUpdate_t *duCfgUpdate;
1140 Served_Cells_To_Modify_List_t *cellsToModify;
1141 Served_Cells_To_Modify_Item_t *modifyItem;
1142 bool checkvar=false;
1147 DU_LOG("\nF1AP : Building DU config update\n");
1148 /* Allocate the memory for F1DuCfg */
1149 DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1150 if(f1apDuCfg == NULLP)
1152 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1156 f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1157 DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1158 if(f1apDuCfg->choice.initiatingMessage == NULLP)
1160 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1164 f1apDuCfg->choice.initiatingMessage->procedureCode = \
1165 ProcedureCode_id_gNBDUConfigurationUpdate;
1166 f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1167 f1apDuCfg->choice.initiatingMessage->value.present = \
1168 InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1169 duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1170 choice.GNBDUConfigurationUpdate;
1172 duCfgUpdate->protocolIEs.list.count = elementCnt;
1173 duCfgUpdate->protocolIEs.list.size = \
1174 elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1176 /* Initialize the F1Setup members */
1177 DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1178 if(duCfgUpdate->protocolIEs.list.array == NULLP)
1180 DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1183 for(idx=0;idx<elementCnt;idx++)
1185 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1186 if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1194 duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1195 duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1196 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1197 GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1198 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1201 /*Served Cell to Modify */
1203 duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1204 ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1205 duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1206 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1207 GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1208 cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1209 Served_Cells_To_Modify_List;
1211 cellsToModify->list.count = modifyCnt;
1212 cellsToModify->list.size = \
1213 modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1214 DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1215 if(cellsToModify->list.array == NULLP)
1219 for(idy=0; idy<modifyCnt ;idy++)
1221 DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1222 Served_Cells_To_Modify_ItemIEs_t));
1223 if(cellsToModify->list.array[idy] == NULLP)
1228 cellsToModify->list.array[0]->id = \
1229 ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1230 cellsToModify->list.array[0]->criticality = Criticality_reject;
1231 cellsToModify->list.array[0]->value.present =\
1232 Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1233 modifyItem=&cellsToModify->list.array[0]->value.choice.\
1234 Served_Cells_To_Modify_Item;
1237 modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1238 DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1239 if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1243 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1244 &modifyItem->oldNRCGI.pLMN_Identity);
1247 modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1248 DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1249 modifyItem->oldNRCGI.nRCellIdentity.size);
1250 if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1254 for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1256 modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1258 modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1259 modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1262 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1263 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1264 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1265 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1269 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1270 &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1271 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1272 DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1273 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1274 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1278 for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1279 nRCGI.nRCellIdentity.size-1 ; tmp++)
1281 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1283 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1284 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1286 modifyItem->served_Cell_Information.nRPCI = \
1287 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1290 modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1291 modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1292 servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1293 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1294 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1295 if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1299 for(idy1=0;idy1<servPlmnCnt;idy1++)
1301 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1302 sizeof(ServedPLMNs_Item_t));
1303 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1308 modifyItem->served_Cell_Information.servedPLMNs.list.\
1309 array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1310 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1311 array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1312 array[0]->pLMN_Identity.size);
1313 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1314 array[0]->pLMN_Identity.buf == NULLP)
1318 buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1319 &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1320 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1321 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1322 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1323 array[0]->iE_Extensions == NULLP)
1328 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1329 iE_Extensions->list.count = extensionCnt;
1330 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1331 iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1332 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1333 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1334 iE_Extensions->list.size);
1335 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1336 array[0]->iE_Extensions->list.array == NULLP)
1340 for(idy2=0;idy2<extensionCnt;idy2++)
1342 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1343 array[0]->iE_Extensions->list.array[idy2],\
1344 sizeof(ServedPLMNs_ItemExtIEs_t));
1345 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1346 array[0]->iE_Extensions->list.array[idy2] == NULLP)
1351 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1352 iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1353 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1354 iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1355 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1356 iE_Extensions->list.array[0]->extensionValue.present = \
1357 ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1358 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1359 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1361 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1362 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1363 list.size = sizeof(SliceSupportItem_t *);
1364 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1365 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1366 list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1367 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1368 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1369 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1370 list.array == NULLP)
1375 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1376 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1377 list.array[0],sizeof( SliceSupportItem_t));
1378 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1379 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1380 list.array[0] == NULLP)
1384 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1385 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1386 list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1387 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1388 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1389 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1390 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1391 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1392 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1393 list.array[0]->sNSSAI.sST.buf == NULLP)
1397 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1398 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1399 list.array[0]->sNSSAI.sST.buf[0] = 3;
1400 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1401 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1402 list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1403 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1404 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1405 list.array[0]->sNSSAI.sD == NULLP)
1409 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1410 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1411 list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1412 DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1413 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1414 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1415 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1416 list.array[0]->sNSSAI.sD->size);
1417 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1418 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1419 list.array[0]->sNSSAI.sD->buf == NULLP)
1423 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1424 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1425 list.array[0]->sNSSAI.sD->buf[0] = 3;
1426 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1427 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1428 list.array[0]->sNSSAI.sD->buf[1] = 6;
1429 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1430 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1431 list.array[0]->sNSSAI.sD->buf[2] = 9;
1433 /*nR Mode Info with FDD*/
1434 modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1435 NR_Mode_Info_PR_fDD;
1436 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1437 sizeof(FDD_Info_t));
1438 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1442 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1443 uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1444 f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1445 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1446 uL_NRFreqInfo.freqBandListNr.list.count = 1;
1447 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1448 uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1449 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1450 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1451 array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1452 uL_NRFreqInfo.freqBandListNr.list.size);
1453 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1454 fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1458 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1459 uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1460 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1461 uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1465 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1466 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1467 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1468 freqBand[0].nrFreqBand;
1469 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1470 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1471 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1472 nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1473 dlNrFreqInfo.nrArfcn;
1474 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1475 freqBandListNr.list.count = 1;
1476 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1477 freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1478 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1479 dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1480 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1481 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1482 dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1486 DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1487 dL_NRFreqInfo.freqBandListNr.list.array[0],\
1488 sizeof(FreqBandNrItem_t));
1489 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1490 dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1494 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1495 freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1496 duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1497 freqBand[0].nrFreqBand;
1498 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1499 freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1501 /*Transmission Bandwidth*/
1502 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1503 uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1504 f1Mode.mode.fdd.ulTxBw.nrScs;
1505 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1506 uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1507 f1Mode.mode.fdd.ulTxBw.nrb;
1508 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1509 dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1510 f1Mode.mode.fdd.dlTxBw.nrScs;
1511 modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1512 dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1513 f1Mode.mode.fdd.dlTxBw.nrb;
1514 /*Measurement timing Config*/
1515 modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1517 DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1518 buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1519 if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1523 modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1524 buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1526 // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1529 duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1530 duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1531 duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1532 GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1533 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1535 DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1536 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1537 if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1541 duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1544 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1546 /* Encode the DU Config Update type as APER */
1547 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1549 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1551 /* Checking encode results */
1552 if(encRetVal.encoded == ENCODE_FAIL)
1554 DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1559 DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1560 for(i=0; i< encBufSize; i++)
1562 printf("%x",encBuf[i]);
1566 if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1568 DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1574 if(f1apDuCfg != NULLP)
1576 if(f1apDuCfg->choice.initiatingMessage != NULLP)
1578 if(duCfgUpdate->protocolIEs.list.array != NULLP)
1582 if(cellsToModify->list.array != NULLP)
1586 if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1588 if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1590 if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1592 if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1595 if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1598 if(idy1==servPlmnCnt)
1600 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1601 array[0]->pLMN_Identity.buf != NULLP)
1603 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1604 array[0]->iE_Extensions!= NULLP)
1606 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1607 array[0]->iE_Extensions->list.array != NULLP)
1609 if(idy2==extensionCnt)
1611 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1612 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1615 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1616 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1617 list.array[0]!=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.sST.buf!=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 != NULLP)
1627 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1628 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1629 list.array[0]->sNSSAI.sD->buf!=NULLP)
1631 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1634 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1635 fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1637 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1638 fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]!=NULLP)
1640 if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1641 fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1643 if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1644 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1647 if(modifyItem->served_Cell_Information.\
1648 measurementTimingConfiguration.buf !=NULLP)
1650 if(duCfgUpdate->protocolIEs.list.array[2]->value.\
1651 choice.GNB_DU_ID.buf!=NULLP)
1653 DU_FREE(duCfgUpdate->protocolIEs.list.\
1654 array[2]->value.choice.GNB_DU_ID.buf,\
1655 duCfgUpdate->protocolIEs.list.array[2]->\
1656 value.choice.GNB_DU_ID.size);
1658 DU_FREE(modifyItem->served_Cell_Information.\
1659 measurementTimingConfiguration.\
1660 buf,modifyItem->served_Cell_Information.\
1661 measurementTimingConfiguration.size);
1663 DU_FREE(modifyItem->served_Cell_Information.\
1664 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1665 list.array[0],sizeof(FreqBandNrItem_t));
1667 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1668 .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1669 modifyItem->served_Cell_Information.nR_Mode_Info.\
1670 choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1672 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1673 choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1674 array[0],sizeof(FreqBandNrItem_t));
1676 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1677 fDD->uL_NRFreqInfo.freqBandListNr.list.\
1678 array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1679 fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1681 DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1682 fDD,sizeof(FDD_Info_t));
1684 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1685 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1686 list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1687 servedPLMNs.list.array[0]->iE_Extensions->list.array[0]->\
1688 extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sD->size);
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.sD,sizeof(OCTET_STRING_t));
1695 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1696 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1697 list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.\
1698 list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.\
1699 SliceSupportList.list.array[0]->sNSSAI.sST.size);
1701 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1702 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1703 list.array[0],sizeof(SliceSupportItem_t));
1705 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1706 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1708 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1709 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1711 for(i=0;i<extensionCnt;i++)
1713 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1714 array[0]->iE_Extensions->list.array[i],\
1715 sizeof(ServedPLMNs_ItemExtIEs_t ));
1722 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1723 array[0]->iE_Extensions->list.array[i],\
1724 sizeof(ServedPLMNs_ItemExtIEs_t));
1727 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1728 array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1729 list.array[0]->iE_Extensions->list.size);
1731 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1732 array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1734 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1735 array[0]->pLMN_Identity.buf,
1736 modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity.size);
1740 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1741 sizeof(ServedPLMNs_Item_t));
1748 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1749 sizeof(ServedPLMNs_Item_t));
1752 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1753 modifyItem->served_Cell_Information.servedPLMNs.list.size);
1755 DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1756 modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1758 DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1759 modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1761 DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1762 modifyItem->oldNRCGI.nRCellIdentity.size);
1764 DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1765 modifyItem->oldNRCGI.pLMN_Identity.size);
1767 for(int iy=0; iy<modifyCnt ;iy++)
1769 DU_FREE(cellsToModify->list.array[iy],\
1770 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1775 for(int iy=0; iy<idy ;iy++)
1777 DU_FREE(cellsToModify->list.array[iy],\
1778 sizeof(Served_Cells_To_Modify_ItemIEs_t));
1781 DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1783 for(i=0;i<elementCnt;i++)
1785 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1786 sizeof(GNBDUConfigurationUpdateIEs_t));
1793 DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1794 sizeof(GNBDUConfigurationUpdateIEs_t));
1797 DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1799 DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1801 DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1807 }/* End of BuildAndSendDUConfigUpdate */
1809 /*******************************************************************
1811 * @brief Builds and sends the ULRRCMessageTransfer
1815 * Function : BuildAndSendULRRCMessageTransfer
1817 * Functionality: Constructs the UL RRC Message Transfer and sends
1818 * it to the CU through SCTP.
1822 * @return ROK - success
1825 * ****************************************************************/
1826 S16 BuildAndSendULRRCMessageTransfer()
1831 F1AP_PDU_t *f1apMsg = NULL;
1832 ULRRCMessageTransfer_t *ulRRCMsg;
1833 asn_enc_rval_t encRetVal; /* Encoder return value */
1834 bool checkvar=false;
1837 DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1839 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1840 if(f1apMsg == NULLP)
1842 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1846 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1847 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1848 if(f1apMsg->choice.initiatingMessage == NULLP)
1850 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1853 f1apMsg->choice.initiatingMessage->procedureCode = \
1854 ProcedureCode_id_ULRRCMessageTransfer;
1855 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1856 f1apMsg->choice.initiatingMessage->value.present = \
1857 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1859 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1861 ulRRCMsg->protocolIEs.list.count = elementCnt;
1862 ulRRCMsg->protocolIEs.list.size = \
1863 elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
1865 /* Initialize the F1Setup members */
1866 DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
1867 if(ulRRCMsg->protocolIEs.list.array == NULLP)
1869 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
1872 for(idx=0; idx<elementCnt; idx++)
1874 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
1875 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
1883 /*GNB CU UE F1AP ID*/
1884 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
1885 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1886 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1887 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1888 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1889 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1891 /*GNB DU UE F1AP ID*/
1893 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
1894 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1895 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1896 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1897 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1898 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1902 ulRRCMsg->protocolIEs.list.array[idx1]->id = \
1903 ProtocolIE_ID_id_SRBID;
1904 ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1905 ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1906 ULRRCMessageTransferIEs__value_PR_SRBID;
1907 ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = UL_SRBID;
1912 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1914 /* Encode the F1SetupRequest type as APER */
1915 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1917 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1919 /* Encode results */
1920 if(encRetVal.encoded == ENCODE_FAIL)
1922 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
1923 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1928 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
1929 for(int i=0; i< encBufSize; i++)
1931 printf("%x",encBuf[i]);
1936 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
1938 DU_LOG("\n F1AP : Sending UL RRC Message Transfer Failed");
1945 if(f1apMsg != NULLP)
1947 if(f1apMsg->choice.initiatingMessage != NULLP)
1949 if(ulRRCMsg->protocolIEs.list.array != NULLP)
1951 for(idx1=0;idx1<idx;idx1++)
1953 if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
1955 DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
1958 DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
1960 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1962 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1969 }/* End of BuildAndSendULRRCMessageTransfer*/
1971 /*******************************************************************
1973 * @brief Builds and sends the InitialULRRCMessage
1977 * Function : BuildAndSendRRCSetupReq
1979 * Functionality: Constructs the Initial UL RRC Message Transfer and sends
1980 * it to the CU through SCTP.
1984 * @return ROK - success
1987 * ****************************************************************/
1988 S16 BuildAndSendRRCSetupReq()
1995 F1AP_PDU_t *f1apMsg = NULLP;
1996 InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
1997 asn_enc_rval_t encRetVal;
1998 bool checkvar=false;
2001 DU_LOG("\n F1AP : Building RRC Setup Request\n");
2002 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2003 if(f1apMsg == NULLP)
2005 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2008 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2009 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2010 if(f1apMsg->choice.initiatingMessage == NULLP)
2012 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2015 f1apMsg->choice.initiatingMessage->procedureCode =\
2016 ProcedureCode_id_InitialULRRCMessageTransfer;
2017 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2018 f1apMsg->choice.initiatingMessage->value.present = \
2019 InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
2021 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2023 initULRRCMsg->protocolIEs.list.count = elementCnt;
2024 initULRRCMsg->protocolIEs.list.size = \
2025 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
2026 /* Initialize the F1Setup members */
2027 DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
2028 if(initULRRCMsg->protocolIEs.list.array == NULLP)
2030 DU_LOG(" F1AP : Memory allocation for\
2031 RRCSetupRequestMessageTransferIEs failed");
2034 for(idx=0; idx<elementCnt; idx++)
2036 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
2037 sizeof(InitialULRRCMessageTransferIEs_t));
2038 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
2044 /*GNB DU UE F1AP ID*/
2045 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
2046 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2047 initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2048 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2049 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2050 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID= DU_ID;
2053 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
2054 ProtocolIE_ID_id_NRCGI;
2055 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
2056 initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2057 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
2060 BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
2065 initULRRCMsg->protocolIEs.list.array[idx1]->id = \
2066 ProtocolIE_ID_id_C_RNTI;
2067 initULRRCMsg->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
2068 initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
2069 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
2070 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI =CRNTI;
2072 // Need to fill this.
2074 /*DUtoCURRCContainer*/
2075 //Need to fill this too.
2076 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2077 /* Encode the F1SetupRequest type as APER */
2078 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
2080 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg,\
2081 PrepFinalEncBuf,encBuf);
2082 /* Encode results */
2083 if(encRetVal.encoded == ENCODE_FAIL)
2085 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
2086 structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2092 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
2093 Message transfer\n");
2094 for(int i=0; i< encBufSize; i++)
2096 printf("%x",encBuf[i]);
2100 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
2102 DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
2109 if(f1apMsg != NULLP)
2111 if(f1apMsg->choice.initiatingMessage != NULLP)
2113 if(initULRRCMsg->protocolIEs.list.array != NULLP)
2115 if(idx == elementCnt)
2118 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
2120 if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
2122 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
2123 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
2125 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
2126 initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
2128 for(ieId=0; ieId<elementCnt; ieId++)
2130 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
2135 for(ieId=0; ieId<idx; ieId++)
2137 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
2140 DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
2142 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2144 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2150 }/* End of BuildAndSendRRCSetupReq*/
2152 /*******************************************************************
2154 * @brief Builds Special cell list for UE Setup Request
2158 * Function : BuildSplCellList
2160 * Functionality: Constructs the Special Cell list for UESetReq
2162 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2164 * @return ROK - success
2167 * ****************************************************************/
2168 S16 BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2175 spCellLst->list.count = cellCnt;
2176 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2177 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2178 if(spCellLst->list.array == NULLP)
2182 for(idx=0; idx<cellCnt; idx++)
2184 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2185 if(spCellLst->list.array[idx] == NULLP)
2187 for(cellidx=0; cellidx<idx; cellidx++)
2189 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2191 DU_FREE(spCellLst->list.array,spCellLst->list.size);
2196 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2197 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2198 spCellLst->list.array[idx]->value.present =\
2199 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2200 /* Special Cell ID -NRCGI */
2201 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2204 for(cellidx=0; cellidx<cellCnt; cellidx++)
2206 DU_FREE(spCellLst->list.array[cellidx],sizeof(
2207 SCell_ToBeSetup_ItemIEs_t));
2209 DU_FREE(spCellLst->list.array,spCellLst->list.size);
2212 /*Special Cell Index*/
2213 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2215 }/* End of BuildSplCellList*/
2217 /*******************************************************************
2219 * @brief Builds SRBS to be setup
2223 * Function : BuildSRBSetup
2225 * Functionality: Constructs the SRB's for UESetReq
2227 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2229 * @return ROK - success
2232 * ****************************************************************/
2233 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2239 srbSet->list.count = srbCnt;
2240 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2241 DU_ALLOC(srbSet->list.array,srbSet->list.size);
2242 if(srbSet->list.array == NULLP)
2246 for(idx=0; idx<srbCnt; idx++)
2248 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2249 if(srbSet->list.array[idx] == NULLP)
2251 for(srbidx=0; srbidx<idx; srbidx++)
2253 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2255 DU_FREE(srbSet->list.array,srbSet->list.size);
2259 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2260 srbSet->list.array[idx]->criticality = Criticality_ignore;
2261 srbSet->list.array[idx]->value.present = \
2262 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2263 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2265 }/* End of BuildSRBSetup*/
2267 /*******************************************************************
2269 * @brief Builds QOS Info for DRB Setum Item
2273 * Function : BuildQOSInfo
2275 * Functionality: Constructs the QOS Info for DRB Setup Item
2277 * @params[in] QoSInformation_t *qosinfo
2279 * @return ROK - success
2282 * ****************************************************************/
2283 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2285 /* NonDynamic5QIDescriptor */
2286 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2287 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2288 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2293 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2295 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2296 sizeof(AveragingWindow_t));
2297 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2300 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2301 sizeof(NonDynamic5QIDescriptor_t));
2304 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2305 /*MaxDataBurstVolume*/
2306 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2307 sizeof(MaxDataBurstVolume_t));
2308 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2311 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2312 sizeof(AveragingWindow_t));
2313 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2314 sizeof(NonDynamic5QIDescriptor_t));
2317 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2319 /*nRGRAN Allocation Retention Priority*/
2320 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
2321 PriorityLevel_highest;
2322 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
2323 Pre_emptionCapability_may_trigger_pre_emption;
2324 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
2325 Pre_emptionVulnerability_not_pre_emptable;
2327 /* TO DO: GBR_QoSFlowInformation */
2329 }/*End of BuildQOSInfo*/
2331 /*******************************************************************
2333 * @brief Builds SNSSAI
2337 * Function : BuildSNSSAI
2339 * Functionality: Constructs the SNSSAI For DRB list
2341 * @params[in] SNSSAI_t *snssai
2343 * @return ROK - success
2346 * ****************************************************************/
2347 S16 BuildSNSSAI(SNSSAI_t *snssai)
2351 snssai->sST.size = sizeof(U8);
2352 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
2353 if(snssai->sST.buf == NULLP)
2357 snssai->sST.buf[0] = 3;
2359 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2360 if(snssai->sD == NULLP)
2362 DU_FREE(snssai->sST.buf,snssai->sST.size);
2365 snssai->sD->size = 3*sizeof(U8);
2366 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
2367 if(snssai->sD->buf == NULLP)
2369 DU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
2370 DU_FREE(snssai->sST.buf,snssai->sST.size);
2373 snssai->sD->buf[0] = 3;
2374 snssai->sD->buf[1] = 6;
2375 snssai->sD->buf[2] = 9;
2377 }/*End of BuildSNSSAI*/
2379 /*******************************************************************
2381 * @brief Builds the flow map.
2385 * Function : BuildFlowsMap
2387 * Functionality: Constructs the flowmap For DRB list
2389 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2391 * @return ROK - success
2394 * ****************************************************************/
2395 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2402 flowMap->list.count = flowCnt;
2403 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2404 DU_ALLOC(flowMap->list.array,flowMap->list.size);
2405 if(flowMap->list.array == NULLP)
2409 for(idx=0; idx<flowCnt; idx++)
2411 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2412 if(flowMap->list.array[idx] == NULLP)
2414 for(flowidx=0; flowidx<idx; flowidx++)
2416 DU_FREE(flowMap->list.array[flowidx],sizeof( \
2417 Flows_Mapped_To_DRB_Item_t));
2420 DU_FREE(flowMap->list.array,flowMap->list.size);
2424 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2425 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2428 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2429 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2430 sizeof(MaxDataBurstVolume_t));
2431 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2432 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2433 sizeof(AveragingWindow_t));
2434 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2435 qoS_Characteristics.choice.non_Dynamic_5QI,\
2436 sizeof(NonDynamic5QIDescriptor_t));
2437 for(idx=0; idx<flowCnt; idx++)
2439 DU_FREE(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2441 DU_FREE(flowMap->list.array,flowMap->list.size);
2445 }/*End of BuildFlowsMap*/
2447 /*******************************************************************
2449 * @brief Builds the Uplink Tunnel Info
2453 * Function : BuildULTnlInfo
2455 * Functionality: Constructs the UL TnlInfo For DRB list
2457 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2459 * @return ROK - success
2462 * ****************************************************************/
2463 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2469 ulInfo->list.count = ulCnt;
2470 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2471 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2472 if(ulInfo->list.array == NULLP)
2476 for(idx=0; idx<ulCnt; idx++)
2478 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2479 if(ulInfo->list.array[idx] == NULLP)
2481 for(ulidx=0; ulidx<idx; ulidx++)
2483 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2485 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2490 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2491 UPTransportLayerInformation_PR_gTPTunnel;
2493 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2494 sizeof(GTPTunnel_t));
2495 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
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.size = 4*sizeof(U8);
2506 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2507 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2508 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2509 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2510 transportLayerAddress.buf == NULLP)
2512 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2513 sizeof(GTPTunnel_t));
2514 for(idx=0; idx<ulCnt; idx++)
2516 DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2518 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2521 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2522 transportLayerAddress.buf[0] = 4;
2523 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2524 transportLayerAddress.buf[1] = 4;
2525 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2526 transportLayerAddress.buf[2] = 4;
2527 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2528 transportLayerAddress.buf[3] = 5;
2529 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2530 transportLayerAddress.bits_unused = 0;
2532 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2534 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2535 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2536 gTPTunnel->gTP_TEID.size);
2537 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2540 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2541 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2542 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2543 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2544 sizeof(GTPTunnel_t));
2545 for(idx=0; idx<ulCnt; idx++)
2547 DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2549 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2552 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2553 gTP_TEID.buf[0] = 11;
2554 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2555 gTP_TEID.buf[1] = 0;
2556 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2557 gTP_TEID.buf[2] = 0;
2558 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2559 gTP_TEID.buf[3] = 1;
2562 }/*End of BuildULTnlInfo*/
2564 /*******************************************************************
2566 * @brief Builds DRBS to be setup
2570 * Function : BuildDRBSetup
2572 * Functionality: Constructs the DRB's for UESetReq
2574 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2576 * @return ROK - success
2579 * ****************************************************************/
2580 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2590 DRBs_ToBeSetup_Item_t *drbSetItem;
2592 drbSet->list.count = drbCnt;
2593 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2594 DU_ALLOC(drbSet->list.array,drbSet->list.size);
2595 if(drbSet->list.array == NULLP)
2599 for(idx=0; idx<drbCnt; idx++)
2601 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2602 if(drbSet->list.array[idx] == NULLP)
2604 for(drbidx=0; drbidx<idx; drbidx++)
2606 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2608 DU_FREE(drbSet->list.array,drbSet->list.size);
2613 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2614 drbSet->list.array[idx]->criticality = Criticality_ignore;
2615 drbSet->list.array[idx]->value.present = \
2616 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2617 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2619 drbSetItem->dRBID = 1;
2621 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2622 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2623 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2625 for(idx=0; idx<drbCnt; idx++)
2627 DU_FREE(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2629 DU_FREE(drbSet->list.array,drbSet->list.size);
2632 drbSetItem->qoSInformation.choice.choice_extension->id = \
2633 ProtocolIE_ID_id_DRB_Information;
2634 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2636 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2637 QoSInformation_ExtIEs__value_PR_DRB_Information;
2638 ret = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2639 choice_extension->value.choice.DRB_Information.dRB_QoS);
2642 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2643 for(drbidx=0; drbidx<drbCnt; drbidx++)
2645 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2647 DU_FREE(drbSet->list.array,drbSet->list.size);
2651 ret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2652 choice_extension->value.choice.DRB_Information.sNSSAI);
2655 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2656 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2657 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2658 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2659 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2660 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2661 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2662 for(drbidx=0; drbidx<drbCnt; drbidx++)
2664 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2666 DU_FREE(drbSet->list.array,drbSet->list.size);
2669 /*Flows mapped to DRB List*/
2670 ret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2671 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2674 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2675 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2676 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2677 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2678 choice.choice_extension->value.choice.DRB_Information.\
2680 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2681 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2682 choice.choice_extension->value.choice.DRB_Information.\
2684 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2685 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2686 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2687 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2688 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2689 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2690 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2691 for(drbidx=0; drbidx<drbCnt; drbidx++)
2693 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2695 DU_FREE(drbSet->list.array,drbSet->list.size);
2698 /*ULUPTNLInformation To Be Setup List*/
2699 ret = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2703 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2704 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2705 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2706 choice.non_Dynamic_5QI->maxDataBurstVolume,\
2707 sizeof(MaxDataBurstVolume_t));
2708 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2709 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2710 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2711 choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2712 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2713 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2714 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2715 choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2716 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2717 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2718 array,drbSetItem->qoSInformation.choice.choice_extension->\
2719 value.choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2721 for(flowidx=0; flowidx<flowCnt;flowidx++)
2723 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2724 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2725 array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2727 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2728 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2729 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2730 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2731 choice.choice_extension->value.choice.DRB_Information.\
2733 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2734 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2735 choice.choice_extension->value.choice.DRB_Information.\
2737 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2738 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2739 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2740 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2741 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2742 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2743 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2744 for(drbidx=0; drbidx<drbCnt; drbidx++)
2746 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2748 DU_FREE(drbSet->list.array,drbSet->list.size);
2752 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2754 /*UL Configuration*/
2756 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2757 if(drbSetItem->uLConfiguration == NULLP)
2760 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2761 uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf,\
2762 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2763 uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2764 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2765 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf,\
2766 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2767 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2768 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2769 uLUPTNLInformation.choice.gTPTunnel,sizeof(GTPTunnel_t));
2770 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array,\
2771 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.size);
2772 for(ulidx=0; ulidx<ulCnt; ulidx++)
2774 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx],\
2775 sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2778 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2779 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2780 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2781 choice.non_Dynamic_5QI->maxDataBurstVolume,\
2782 sizeof(MaxDataBurstVolume_t));
2783 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2784 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2785 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2786 choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2787 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2788 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2789 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2790 choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2791 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2792 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2793 array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2794 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2796 for(flowidx=0; flowidx<flowCnt;flowidx++)
2798 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2799 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2800 array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2802 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2803 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2804 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2805 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2806 choice.choice_extension->value.choice.DRB_Information.\
2808 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2809 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2810 choice.choice_extension->value.choice.DRB_Information.\
2812 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2813 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2814 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2815 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2816 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2817 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2818 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2819 for(drbidx=0; drbidx<drbCnt; drbidx++)
2821 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2823 DU_FREE(drbSet->list.array,drbSet->list.size);
2826 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2828 }/* End of BuildDRBSetup*/
2830 /*******************************************************************
2832 * @brief Builds and sends the UE Setup Request
2836 * Function : BuildAndSendUESetReq
2838 * Functionality: Constructs the UE Setup Request and sends
2839 * it to the CU through SCTP.
2843 * @return ROK - success
2846 * ****************************************************************/
2847 S16 BuildAndSendUESetReq()
2863 F1AP_PDU_t *f1apMsg = NULL;
2864 UEContextSetupRequest_t *ueSetReq;
2865 asn_enc_rval_t encRetVal; /* Encoder return value */
2867 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2869 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2870 if(f1apMsg == NULLP)
2872 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2876 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2877 DU_ALLOC(f1apMsg->choice.initiatingMessage,
2878 sizeof(InitiatingMessage_t));
2879 if(f1apMsg->choice.initiatingMessage == NULLP)
2881 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2882 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2886 f1apMsg->choice.initiatingMessage->procedureCode = \
2887 ProcedureCode_id_UEContextSetup;
2888 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2889 f1apMsg->choice.initiatingMessage->value.present = \
2890 InitiatingMessage__value_PR_UEContextSetupRequest;
2892 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2894 ueSetReq->protocolIEs.list.count = elementCnt;
2895 ueSetReq->protocolIEs.list.size = \
2896 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2898 /* Initialize the UESetup members */
2899 DU_ALLOC(ueSetReq->protocolIEs.list.array, \
2900 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
2901 if(ueSetReq->protocolIEs.list.array == NULLP)
2903 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2904 DU_FREE(f1apMsg->choice.initiatingMessage,
2905 sizeof(InitiatingMessage_t));
2906 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
2910 for(idx=0; idx<elementCnt; idx++)
2912 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx],\
2913 sizeof(UEContextSetupRequestIEs_t));
2914 if(ueSetReq->protocolIEs.list.array[idx] == NULLP)
2916 for(ieId=0; ieId<idx; ieId++)
2918 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],\
2919 sizeof(UEContextSetupRequestIEs_t));
2921 DU_FREE(ueSetReq->protocolIEs.list.array,\
2922 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
2923 DU_FREE(f1apMsg->choice.initiatingMessage,\
2924 sizeof(InitiatingMessage_t));
2925 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2932 /*GNB CU UE F1AP ID*/
2933 ueSetReq->protocolIEs.list.array[idx]->id = \
2934 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2935 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2936 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2937 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2938 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2940 /*GNB DU UE F1AP ID*/
2942 ueSetReq->protocolIEs.list.array[idx]->id = \
2943 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2944 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2945 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2946 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2947 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2951 ueSetReq->protocolIEs.list.array[idx]->id = \
2952 ProtocolIE_ID_id_SpCell_ID;
2953 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2954 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2955 UEContextSetupRequestIEs__value_PR_NRCGI;
2957 BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2961 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2962 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
2963 choice.NRCGI.nRCellIdentity.size));
2964 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2965 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
2966 choice.NRCGI.pLMN_Identity.size));
2967 for(idx=0; idx<elementCnt; idx++)
2969 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
2970 sizeof(InitialULRRCMessageTransferIEs_t));
2972 DU_FREE(ueSetReq->protocolIEs.list.array,\
2973 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2974 DU_FREE(f1apMsg->choice.initiatingMessage,\
2975 sizeof(InitiatingMessage_t));
2976 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2981 /*Served Cell Index*/
2983 ueSetReq->protocolIEs.list.array[idx]->id = \
2984 ProtocolIE_ID_id_ServCellIndex;
2985 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2986 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2987 UEContextSetupRequestIEs__value_PR_ServCellIndex;
2988 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
2991 /*CellULConfigured*/
2993 ueSetReq->protocolIEs.list.array[idx]->id = \
2994 ProtocolIE_ID_id_SpCellULConfigured;
2995 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2996 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2997 UEContextSetupRequestIEs__value_PR_CellULConfigured;
2998 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
2999 CellULConfigured_none;
3002 /*CUtoDURRCContainer*/
3004 ueSetReq->protocolIEs.list.array[idx]->id = \
3005 ProtocolIE_ID_id_CUtoDURRCInformation;
3006 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3007 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3008 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
3010 /*Special Cells to be SetupList*/
3012 ueSetReq->protocolIEs.list.array[idx]->id = \
3013 ProtocolIE_ID_id_SCell_ToBeSetup_List;
3014 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
3015 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3016 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
3018 ret = BuildSplCellList(&ueSetReq->protocolIEs.\
3019 list.array[idx]->value.choice.SCell_ToBeSetup_List);
3022 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3023 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3024 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3025 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3026 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3027 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3028 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3029 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3030 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3031 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3032 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3033 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3034 for(spId=0; spId<cellCnt; spId++)
3036 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3037 SCell_ToBeSetup_List.list.array[spId],sizeof(
3038 SCell_ToBeSetup_ItemIEs_t));
3040 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3041 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3042 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3045 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3046 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3047 choice.NRCGI.nRCellIdentity.size));
3048 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3049 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3050 choice.NRCGI.pLMN_Identity.size));
3051 for(idx=0; idx<elementCnt; idx++)
3053 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3054 sizeof(UEContextSetupRequestIEs_t));
3056 DU_FREE(ueSetReq->protocolIEs.list.array,\
3057 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3058 DU_FREE(f1apMsg->choice.initiatingMessage,\
3059 sizeof(InitiatingMessage_t));
3060 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3063 /*SRBs To Be Setup List*/
3065 ueSetReq->protocolIEs.list.array[idx]->id = \
3066 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
3067 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3068 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3069 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
3071 ret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.\
3072 choice.SRBs_ToBeSetup_List);
3076 for(srbId=0; srbId<srbCnt; srbId++)
3078 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3079 SRBs_ToBeSetup_List.list.array[srbId],\
3080 sizeof(SRBs_ToBeSetup_ItemIEs_t));
3082 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3083 SRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3084 array[idx]->value.choice.SRBs_ToBeSetup_List.list.size);
3086 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3087 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3088 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3089 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3090 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3091 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3092 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3093 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3094 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3095 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3096 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3097 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3098 for(spId=0; spId<cellCnt; spId++)
3100 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3101 SCell_ToBeSetup_List.list.array[spId],sizeof(\
3102 SCell_ToBeSetup_ItemIEs_t));
3104 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3105 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3106 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3108 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3109 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3110 choice.NRCGI.nRCellIdentity.size));
3111 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3112 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3113 choice.NRCGI.pLMN_Identity.size));
3114 for(idx=0; idx<elementCnt; idx++)
3116 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3117 sizeof(UEContextSetupRequestIEs_t));
3119 DU_FREE(ueSetReq->protocolIEs.list.array,\
3120 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3121 DU_FREE(f1apMsg->choice.initiatingMessage,\
3122 sizeof(InitiatingMessage_t));
3123 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3126 /*DRBs to Be Setup List*/
3128 ueSetReq->protocolIEs.list.array[idx]->id = \
3129 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
3130 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3131 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3132 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
3136 ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.\
3137 choice.DRBs_ToBeSetup_List);
3140 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3141 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3142 DRBs_ToBeSetup_Item.uLConfiguration,\
3143 sizeof(ULConfiguration_t));
3145 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3146 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3147 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3148 array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3149 sizeof(GTPTunnel_t));
3150 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3151 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3152 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3153 array,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3154 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3155 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.size);
3156 for(ulidx=0; ulidx<ulCnt;ulidx++)
3158 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3159 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3160 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3161 array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3164 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3165 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3166 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3167 choice_extension->value.choice.DRB_Information.\
3168 flows_Mapped_To_DRB_List.list.array[idx]->qoSFlowLevelQoSParameters.\
3169 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3170 sizeof(AveragingWindow_t));
3171 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3172 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3173 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3174 choice_extension->value.choice.DRB_Information.\
3175 flows_Mapped_To_DRB_List.list.array[idx]->qoSFlowLevelQoSParameters.\
3176 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3177 sizeof(MaxDataBurstVolume_t));
3178 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3179 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3180 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3181 choice_extension->value.choice.DRB_Information.\
3182 flows_Mapped_To_DRB_List.list.array,ueSetReq->protocolIEs.list.\
3183 array[idx]->value.choice.\
3184 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3185 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3186 choice_extension->value.choice.DRB_Information.\
3187 flows_Mapped_To_DRB_List.list.size);
3188 for(flowidx=0;flowidx<flowCnt;flowidx++)
3190 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3191 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3192 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3193 choice_extension->value.choice.DRB_Information.\
3194 flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(
3195 Flows_Mapped_To_DRB_Item_t));
3197 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3198 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3199 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3200 choice_extension->value.choice.DRB_Information.sNSSAI.\
3201 sD->buf,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3202 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3203 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3204 choice_extension->value.choice.DRB_Information.sNSSAI.\
3206 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3207 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3208 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3209 choice_extension->value.choice.DRB_Information.sNSSAI.\
3210 sD,sizeof(OCTET_STRING_t));
3211 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3212 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3213 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3214 choice_extension->value.choice.DRB_Information.sNSSAI.\
3215 sST.buf,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.sNSSAI.\
3220 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3221 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3222 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3223 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3224 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3225 sizeof(MaxDataBurstVolume_t));
3226 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3227 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3228 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3229 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3230 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3231 sizeof(AveragingWindow_t));
3232 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3233 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3234 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3235 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3236 qoS_Characteristics.choice.non_Dynamic_5QI,\
3237 sizeof(NonDynamic5QIDescriptor_t));
3238 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3239 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3240 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3241 choice_extension,sizeof(QoSInformation_ExtIEs_t));
3242 for(drbId=0; drbId<drbCnt; drbId++)
3244 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3245 DRBs_ToBeSetup_List.list.array[drbId],\
3246 sizeof(DRBs_ToBeSetup_ItemIEs_t));
3248 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3249 DRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3250 array[idx]->value.choice.DRBs_ToBeSetup_List.list.size);
3252 for(srbId=0; srbId<srbCnt; srbId++)
3254 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3255 SRBs_ToBeSetup_List.list.array[srbId],\
3256 sizeof(SRBs_ToBeSetup_ItemIEs_t));
3258 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3259 SRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3260 array[idx]->value.choice.SRBs_ToBeSetup_List.list.size);
3262 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3263 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3264 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3265 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3266 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3267 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3268 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3269 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3270 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3271 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3272 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3273 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3274 for(spId=0; spId<cellCnt; spId++)
3276 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3277 SCell_ToBeSetup_List.list.array[spId],sizeof(\
3278 SCell_ToBeSetup_ItemIEs_t));
3280 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3281 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3282 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3284 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3285 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3286 choice.NRCGI.nRCellIdentity.size));
3287 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3288 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3289 choice.NRCGI.pLMN_Identity.size));
3290 for(idx=0; idx<elementCnt; idx++)
3292 DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3293 sizeof(UEContextSetupRequestIEs_t));
3295 DU_FREE(ueSetReq->protocolIEs.list.array,\
3296 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3297 DU_FREE(f1apMsg->choice.initiatingMessage,\
3298 sizeof(InitiatingMessage_t));
3299 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3303 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3305 /* Encode the F1SetupRequest type as APER */
3306 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3308 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
3310 /* Encode results */
3311 if(encRetVal.encoded == ENCODE_FAIL)
3313 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
3314 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3319 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
3320 for(int i=0; i< encBufSize; i++)
3322 printf("%x",encBuf[i]);
3327 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
3329 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
3333 }/* End of BuildAndSendUESetReq*/
3335 /*******************************************************************
3337 * @brief Handles received F1AP message and sends back response
3341 * Function : F1APMsgHdlr
3344 * - Decodes received F1AP control message
3345 * - Prepares response message, encodes and sends to SCTP
3348 * @return ROK - success
3351 * ****************************************************************/
3352 void F1APMsgHdlr(Buffer *mBuf)
3358 F1AP_PDU_t *f1apMsg;
3359 asn_dec_rval_t rval; /* Decoder return value */
3360 F1AP_PDU_t f1apasnmsg ;
3362 DU_LOG("\nF1AP : Received F1AP message buffer");
3363 SPrntMsg(mBuf, 0,0);
3365 /* Copy mBuf into char array to decode it */
3366 SFndLenMsg(mBuf, &recvBufLen);
3367 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
3369 DU_LOG("\nF1AP : Memory allocation failed");
3372 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
3374 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
3378 printf("\nF1AP : Received flat buffer to be decoded : ");
3379 for(i=0; i< recvBufLen; i++)
3381 printf("%x",recvBuf[i]);
3384 /* Decoding flat buffer into F1AP messsage */
3385 f1apMsg = &f1apasnmsg;
3386 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
3388 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
3389 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
3390 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
3392 DU_LOG("\nF1AP : ASN decode failed");
3396 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3398 switch(f1apMsg->present)
3400 case F1AP_PDU_PR_successfulOutcome:
3402 switch(f1apMsg->choice.successfulOutcome->value.present)
3404 case SuccessfulOutcome__value_PR_F1SetupResponse:
3406 #ifndef ODU_TEST_STUB
3407 procF1SetupRsp(f1apMsg);
3412 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
3414 procGNBDUCfgUpdAck(f1apMsg);
3420 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
3423 }/* End of switch(successfulOutcome) */
3429 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
3433 }/* End of switch(f1apMsg->present) */
3435 } /* End of F1APMsgHdlr */
3437 /*******************************************************************
3439 * @brief Processes GNB DU config update ack
3443 * Function : procGNBDUCfgUpdAck
3445 * Functionality: Processes GNB DU config update ack
3447 * @params[in] F1AP_PDU_t ASN decoded F1AP message
3448 * @return ROK - success
3451 * ****************************************************************/
3453 S16 procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
3457 DU_LOG("\nF1AP : GNB-DU config update acknowledgment received");
3460 /* TODO :Check the deallocation */
3462 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(gNBDuCfgAck->protocolIEs.list.array),\
3463 (Size)elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
3464 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(f1apMsg->choice.successfulOutcome),\
3465 (Size)sizeof(SuccessfulOutcome_t));
3466 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&f1apMsg,(Size)sizeof(F1AP_PDU_t));
3471 /**********************************************************************
3473 **********************************************************************/