1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
22 #include "du_mgr_main.h"
23 #include "du_cell_mgr.h"
24 #include "du_f1ap_msg_hdl.h"
25 #include "GNB-DU-System-Information.h"
26 static S16 BuildULTnlInforet=RFAILED;
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)
2174 spCellLst->list.count = cellCnt;
2175 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2176 DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2177 if(spCellLst->list.array == NULLP)
2181 for(idx=0; idx<cellCnt; idx++)
2183 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2184 if(spCellLst->list.array[idx] == NULLP)
2190 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2191 spCellLst->list.array[idx]->criticality = Criticality_ignore;
2192 spCellLst->list.array[idx]->value.present =\
2193 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2194 /* Special Cell ID -NRCGI */
2195 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2200 /*Special Cell Index*/
2201 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2203 }/* End of BuildSplCellList*/
2205 /*******************************************************************
2207 * @brief Builds SRBS to be setup
2211 * Function : BuildSRBSetup
2213 * Functionality: Constructs the SRB's for UESetReq
2215 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2217 * @return ROK - success
2220 * ****************************************************************/
2221 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2226 srbSet->list.count = srbCnt;
2227 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2228 DU_ALLOC(srbSet->list.array,srbSet->list.size);
2229 if(srbSet->list.array == NULLP)
2233 for(idx=0; idx<srbCnt; idx++)
2235 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2236 if(srbSet->list.array[idx] == NULLP)
2242 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2243 srbSet->list.array[idx]->criticality = Criticality_ignore;
2244 srbSet->list.array[idx]->value.present = \
2245 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2246 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2248 }/* End of BuildSRBSetup*/
2250 /*******************************************************************
2252 * @brief Builds QOS Info for DRB Setum Item
2256 * Function : BuildQOSInfo
2258 * Functionality: Constructs the QOS Info for DRB Setup Item
2260 * @params[in] QoSInformation_t *qosinfo
2262 * @return ROK - success
2265 * ****************************************************************/
2266 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2268 /* NonDynamic5QIDescriptor */
2269 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2270 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2271 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2276 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2278 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2279 sizeof(AveragingWindow_t));
2280 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2285 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2286 /*MaxDataBurstVolume*/
2287 DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2288 sizeof(MaxDataBurstVolume_t));
2289 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2294 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2296 /*nRGRAN Allocation Retention Priority*/
2297 drbQos->nGRANallocationRetentionPriority.priorityLevel = \
2298 PriorityLevel_highest;
2299 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
2300 Pre_emptionCapability_may_trigger_pre_emption;
2301 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
2302 Pre_emptionVulnerability_not_pre_emptable;
2304 /* TO DO: GBR_QoSFlowInformation */
2306 }/*End of BuildQOSInfo*/
2308 /*******************************************************************
2310 * @brief Builds SNSSAI
2314 * Function : BuildSNSSAI
2316 * Functionality: Constructs the SNSSAI For DRB list
2318 * @params[in] SNSSAI_t *snssai
2320 * @return ROK - success
2323 * ****************************************************************/
2324 S16 BuildSNSSAI(SNSSAI_t *snssai)
2328 snssai->sST.size = sizeof(U8);
2329 DU_ALLOC(snssai->sST.buf,snssai->sST.size);
2330 if(snssai->sST.buf == NULLP)
2334 snssai->sST.buf[0] = 3;
2336 DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2337 if(snssai->sD == NULLP)
2341 snssai->sD->size = 3*sizeof(U8);
2342 DU_ALLOC(snssai->sD->buf,snssai->sD->size);
2343 if(snssai->sD->buf == NULLP)
2347 snssai->sD->buf[0] = 3;
2348 snssai->sD->buf[1] = 6;
2349 snssai->sD->buf[2] = 9;
2351 }/*End of BuildSNSSAI*/
2353 /*******************************************************************
2355 * @brief Builds the flow map.
2359 * Function : BuildFlowsMap
2361 * Functionality: Constructs the flowmap For DRB list
2363 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2365 * @return ROK - success
2368 * ****************************************************************/
2369 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2375 flowMap->list.count = flowCnt;
2376 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2377 DU_ALLOC(flowMap->list.array,flowMap->list.size);
2378 if(flowMap->list.array == NULLP)
2382 for(idx=0; idx<flowCnt; idx++)
2384 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2385 if(flowMap->list.array[idx] == NULLP)
2391 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2392 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2398 }/*End of BuildFlowsMap*/
2400 /*******************************************************************
2402 * @brief Builds the Uplink Tunnel Info
2406 * Function : BuildULTnlInfo
2408 * Functionality: Constructs the UL TnlInfo For DRB list
2410 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2412 * @return ROK - success
2415 * ****************************************************************/
2416 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2421 ulInfo->list.count = ulCnt;
2422 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2423 DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2424 if(ulInfo->list.array == NULLP)
2428 for(idx=0; idx<ulCnt; idx++)
2430 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2431 if(ulInfo->list.array[idx] == NULLP)
2437 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2438 UPTransportLayerInformation_PR_gTPTunnel;
2440 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2441 sizeof(GTPTunnel_t));
2442 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2446 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2447 transportLayerAddress.size = 4*sizeof(U8);
2448 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2449 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2450 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2451 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2452 transportLayerAddress.buf == NULLP)
2456 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2457 transportLayerAddress.buf[0] = 4;
2458 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2459 transportLayerAddress.buf[1] = 4;
2460 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2461 transportLayerAddress.buf[2] = 4;
2462 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2463 transportLayerAddress.buf[3] = 5;
2464 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2465 transportLayerAddress.bits_unused = 0;
2467 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2469 DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2470 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2471 gTPTunnel->gTP_TEID.size);
2472 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2477 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2478 gTP_TEID.buf[0] = 11;
2479 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2480 gTP_TEID.buf[1] = 0;
2481 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2482 gTP_TEID.buf[2] = 0;
2483 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2484 gTP_TEID.buf[3] = 1;
2487 }/*End of BuildULTnlInfo*/
2489 /*******************************************************************
2491 * @brief Builds DRBS to be setup
2495 * Function : BuildDRBSetup
2497 * Functionality: Constructs the DRB's for UESetReq
2499 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2501 * @return ROK - success
2504 * ****************************************************************/
2505 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2507 S16 BuildQOSInforet;
2509 S16 BuildFlowsMapret;
2512 DRBs_ToBeSetup_Item_t *drbSetItem;
2514 drbSet->list.count = drbCnt;
2515 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2516 DU_ALLOC(drbSet->list.array,drbSet->list.size);
2517 if(drbSet->list.array == NULLP)
2521 for(idx=0; idx<drbCnt; idx++)
2523 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2524 if(drbSet->list.array[idx] == NULLP)
2530 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2531 drbSet->list.array[idx]->criticality = Criticality_ignore;
2532 drbSet->list.array[idx]->value.present = \
2533 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2534 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2536 drbSetItem->dRBID = 1;
2538 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2539 DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2540 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2544 drbSetItem->qoSInformation.choice.choice_extension->id = \
2545 ProtocolIE_ID_id_DRB_Information;
2546 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2548 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2549 QoSInformation_ExtIEs__value_PR_DRB_Information;
2550 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2551 choice_extension->value.choice.DRB_Information.dRB_QoS);
2552 if(BuildQOSInforet != ROK)
2557 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2558 choice_extension->value.choice.DRB_Information.sNSSAI);
2559 if(BuildSNSSAIret != ROK)
2563 /*Flows mapped to DRB List*/
2564 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2565 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2566 if(BuildFlowsMapret != ROK)
2570 /*ULUPTNLInformation To Be Setup List*/
2571 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2572 if(BuildULTnlInforet != ROK)
2577 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2579 /*UL Configuration*/
2580 DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2581 if(drbSetItem->uLConfiguration == NULLP)
2585 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2587 }/* End of BuildDRBSetup*/
2588 /*******************************************************************
2590 * @brief Deallocating memory of function BuildAndSendUESetReq
2594 * Function : FreeNrcgi
2596 * Functionality: Deallocating memory for function BuildNrcgi
2598 * @params[in] NRCGI_t *nrcgi
2602 *******************************************************************/
2603 void FreeNrcgi(NRCGI_t *nrcgi)
2605 if(nrcgi->pLMN_Identity.buf != NULLP)
2607 if(nrcgi->nRCellIdentity.buf != NULLP)
2609 DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2611 DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2614 /*******************************************************************
2616 * @brief Deallocating memory of function BuildAndSendUESetReq
2620 * Function : FreeSplCellList
2622 * Functionality: Deallocating memory for function BuildSplCellList
2624 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2629 * *****************************************************************/
2630 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2633 if(spCellLst->list.array != NULLP)
2635 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2637 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2639 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2641 if(spCellLst->list.array[cellidx]!=NULLP)
2643 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2646 DU_FREE(spCellLst->list.array,spCellLst->list.size);
2649 /*******************************************************************
2651 * @brief Deallocating memory of function BuildAndSendUESetReq
2655 * Function : FreeSRBSetup
2657 * Functionality: Deallocating memory for function BuildSRBSetup
2659 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2664 * ******************************************************************/
2665 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2668 if(srbSet->list.array != NULLP)
2670 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2672 if(srbSet->list.array[srbidx]!=NULLP)
2674 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2677 DU_FREE(srbSet->list.array,srbSet->list.size);
2680 /*******************************************************************
2682 * @brief Deallocating memory of function BuildAndSendUESetReq
2686 * Function : FreeQOSInfo
2688 * Functionality: Deallocating memory for function BuildQOSInfo
2690 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2694 * ****************************************************************/
2695 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2697 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2699 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2701 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2703 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2704 sizeof(MaxDataBurstVolume_t));
2706 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2707 sizeof(AveragingWindow_t));
2709 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2710 sizeof(NonDynamic5QIDescriptor_t));
2713 /*******************************************************************
2715 * @brief Deallocating memory of function BuildAndSendUESetReq
2719 * Function : FreeULTnlInfo
2721 * Functionality: Deallocating memory for function BuildULTnlInfo
2723 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2728 * ****************************************************************/
2729 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2732 if(ulInfo->list.array != NULLP)
2734 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2736 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2738 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2740 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2741 transportLayerAddress.buf != NULLP)
2743 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2746 DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2747 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2748 gTPTunnel->gTP_TEID.size);
2750 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2751 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2752 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2754 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2755 sizeof(GTPTunnel_t));
2758 if(ulInfo->list.array[ulidx]!=NULLP)
2760 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2763 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2766 /*******************************************************************
2768 * @brief Deallocating memory for BuildAndSendUESetReq
2772 * Function : FreeDRBSetup
2774 * Functionality: Deallocating memory for BuildDRBSetup
2776 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2780 * ****************************************************************/
2781 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2783 DRBs_ToBeSetup_Item_t *drbSetItem;
2786 if(drbSet->list.array == NULLP)
2788 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2790 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2792 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2793 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2795 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2796 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2798 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2799 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2801 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2802 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2804 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2806 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2808 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2810 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2811 flows_Mapped_To_DRB_List.list.array != NULLP)
2813 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2814 flows_Mapped_To_DRB_List.list.count; flowidx++)
2816 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2817 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2819 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2820 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2821 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2823 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2824 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2825 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2827 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2828 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2829 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2831 if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
2833 DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2835 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2836 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2837 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2838 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2839 sizeof(MaxDataBurstVolume_t));
2841 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2842 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2843 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2845 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2846 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2847 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2850 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2851 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2853 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2854 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2857 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2858 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2859 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2861 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2862 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2864 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2865 sizeof(OCTET_STRING_t));
2867 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2868 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2870 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2871 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2873 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2874 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2876 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2877 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2879 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2882 if(drbSet->list.array[drbidx]!=NULLP)
2884 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2887 DU_FREE(drbSet->list.array,drbSet->list.size);
2890 /*******************************************************************
2892 * @brief Builds and sends the UE Setup Request
2896 * Function : BuildAndSendUESetReq
2898 * Functionality: Constructs the UE Setup Request and sends
2899 * it to the CU through SCTP.
2903 * @return ROK - success
2906 * ****************************************************************/
2907 S16 BuildAndSendUESetReq()
2912 S16 BuildSplCellListret;
2913 S16 BuildSRBSetupret;
2917 F1AP_PDU_t *f1apMsg = NULL;
2918 UEContextSetupRequest_t *ueSetReq;
2919 asn_enc_rval_t encRetVal; /* Encoder return value */
2920 bool checkvar=false;
2923 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2925 DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2926 if(f1apMsg == NULLP)
2928 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2932 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2933 DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2934 if(f1apMsg->choice.initiatingMessage == NULLP)
2936 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2940 f1apMsg->choice.initiatingMessage->procedureCode = \
2941 ProcedureCode_id_UEContextSetup;
2942 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2943 f1apMsg->choice.initiatingMessage->value.present = \
2944 InitiatingMessage__value_PR_UEContextSetupRequest;
2946 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2948 ueSetReq->protocolIEs.list.count = elementCnt;
2949 ueSetReq->protocolIEs.list.size = \
2950 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2952 /* Initialize the UESetup members */
2953 DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2955 if(ueSetReq->protocolIEs.list.array == NULLP)
2957 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2961 for(idx1=0; idx1<elementCnt; idx1++)
2963 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
2964 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
2972 /*GNB CU UE F1AP ID*/
2973 ueSetReq->protocolIEs.list.array[idx]->id = \
2974 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2975 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2976 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2977 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2978 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2980 /*GNB DU UE F1AP ID*/
2982 ueSetReq->protocolIEs.list.array[idx]->id = \
2983 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2984 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2985 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2986 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2987 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2991 ueSetReq->protocolIEs.list.array[idx]->id = \
2992 ProtocolIE_ID_id_SpCell_ID;
2993 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2994 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2995 UEContextSetupRequestIEs__value_PR_NRCGI;
2996 BuildNrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2997 if(BuildNrcgiret != ROK)
3002 /*Served Cell Index*/
3004 ueSetReq->protocolIEs.list.array[idx]->id = \
3005 ProtocolIE_ID_id_ServCellIndex;
3006 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3007 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3008 UEContextSetupRequestIEs__value_PR_ServCellIndex;
3009 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
3012 /*CellULConfigured*/
3014 ueSetReq->protocolIEs.list.array[idx]->id = \
3015 ProtocolIE_ID_id_SpCellULConfigured;
3016 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
3017 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3018 UEContextSetupRequestIEs__value_PR_CellULConfigured;
3019 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
3020 CellULConfigured_none;
3023 /*CUtoDURRCContainer*/
3025 ueSetReq->protocolIEs.list.array[idx]->id = \
3026 ProtocolIE_ID_id_CUtoDURRCInformation;
3027 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3028 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3029 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
3031 /*Special Cells to be SetupList*/
3033 ueSetReq->protocolIEs.list.array[idx]->id = \
3034 ProtocolIE_ID_id_SCell_ToBeSetup_List;
3035 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
3036 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3037 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
3038 BuildSplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3039 if(BuildSplCellListret != ROK)
3043 /*SRBs To Be Setup List*/
3045 ueSetReq->protocolIEs.list.array[idx]->id = \
3046 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
3047 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3048 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3049 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
3050 BuildSRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3051 if(BuildSRBSetupret != ROK)
3055 /*DRBs to Be Setup List*/
3057 ueSetReq->protocolIEs.list.array[idx]->id = \
3058 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
3059 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3060 ueSetReq->protocolIEs.list.array[idx]->value.present = \
3061 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
3062 ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3068 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3070 /* Encode the F1SetupRequest type as APER */
3071 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3073 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
3075 /* Encode results */
3076 if(encRetVal.encoded == ENCODE_FAIL)
3078 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
3079 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3084 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
3085 for(int i=0; i< encBufSize; i++)
3087 printf("%x",encBuf[i]);
3092 if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
3094 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
3100 if(f1apMsg != NULLP)
3102 if(f1apMsg->choice.initiatingMessage != NULLP)
3104 if(ueSetReq->protocolIEs.list.array != NULLP)
3106 if(idx1==elementCnt)
3108 if(BuildNrcgiret==ROK)
3110 if(BuildSplCellListret==ROK)
3112 if(BuildSRBSetupret == ROK)
3114 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.DRBs_ToBeSetup_List);
3116 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.SRBs_ToBeSetup_List);
3118 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3121 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
3122 for(ieId=0; ieId<idx1; ieId++)
3124 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3129 for(ieId=0; ieId<idx; ieId++)
3131 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3133 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3137 DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3139 DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3141 DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3147 }/* End of BuildAndSendUESetReq*/
3149 /*******************************************************************
3151 * @brief Handles received F1AP message and sends back response
3155 * Function : F1APMsgHdlr
3158 * - Decodes received F1AP control message
3159 * - Prepares response message, encodes and sends to SCTP
3162 * @return ROK - success
3165 * ****************************************************************/
3166 void F1APMsgHdlr(Buffer *mBuf)
3172 F1AP_PDU_t *f1apMsg;
3173 asn_dec_rval_t rval; /* Decoder return value */
3174 F1AP_PDU_t f1apasnmsg ;
3176 DU_LOG("\nF1AP : Received F1AP message buffer");
3177 SPrntMsg(mBuf, 0,0);
3179 /* Copy mBuf into char array to decode it */
3180 SFndLenMsg(mBuf, &recvBufLen);
3181 if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
3183 DU_LOG("\nF1AP : Memory allocation failed");
3186 if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
3188 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
3192 printf("\nF1AP : Received flat buffer to be decoded : ");
3193 for(i=0; i< recvBufLen; i++)
3195 printf("%x",recvBuf[i]);
3198 /* Decoding flat buffer into F1AP messsage */
3199 f1apMsg = &f1apasnmsg;
3200 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
3202 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
3203 SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
3204 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
3206 DU_LOG("\nF1AP : ASN decode failed");
3210 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3212 switch(f1apMsg->present)
3214 case F1AP_PDU_PR_successfulOutcome:
3216 switch(f1apMsg->choice.successfulOutcome->value.present)
3218 case SuccessfulOutcome__value_PR_F1SetupResponse:
3220 #ifndef ODU_TEST_STUB
3221 procF1SetupRsp(f1apMsg);
3226 case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
3228 procGNBDUCfgUpdAck(f1apMsg);
3234 DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
3237 }/* End of switch(successfulOutcome) */
3243 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
3247 }/* End of switch(f1apMsg->present) */
3249 } /* End of F1APMsgHdlr */
3251 /*******************************************************************
3253 * @brief Processes GNB DU config update ack
3257 * Function : procGNBDUCfgUpdAck
3259 * Functionality: Processes GNB DU config update ack
3261 * @params[in] F1AP_PDU_t ASN decoded F1AP message
3262 * @return ROK - success
3265 * ****************************************************************/
3267 S16 procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
3271 DU_LOG("\nF1AP : GNB-DU config update acknowledgment received");
3274 /* TODO :Check the deallocation */
3276 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(gNBDuCfgAck->protocolIEs.list.array),\
3277 (Size)elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
3278 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(f1apMsg->choice.successfulOutcome),\
3279 (Size)sizeof(SuccessfulOutcome_t));
3280 SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&f1apMsg,(Size)sizeof(F1AP_PDU_t));
3285 /**********************************************************************
3287 **********************************************************************/