Muxing mac pdu and lower mac changes for Msg4
[o-du/l2.git] / src / du_app / du_f1ap_msg_hdl.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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 *******************************************************************************/
18
19 /* This file contains F1AP message handler functions */
20
21 #include "du_mgr.h"
22 #include "du_mgr_main.h"
23 #include "du_cell_mgr.h"
24 #include "du_f1ap_msg_hdl.h"
25 #include "GNB-DU-System-Information.h"
26 #include "CellGroupConfigRrc.h"
27 #include "MAC-CellGroupConfig.h"
28 #include "SchedulingRequestConfig.h"
29 #include "SchedulingRequestToAddMod.h"
30 #include "BSR-Config.h"
31 #include "TAG-Config.h"
32 #include "TAG.h"
33 #include "PHR-Config.h"
34 #include "RLC-Config.h"
35 #include "UL-AM-RLC.h"
36 #include "DL-AM-RLC.h"
37 #include "LogicalChannelConfig.h"
38 #include "RLC-BearerConfig.h"
39 #include "PhysicalCellGroupConfig.h"
40 #include "SpCellConfig.h"
41 #include "ServingCellConfig.h"
42 #include "BWP-DownlinkDedicated.h"
43 #include "UplinkConfig.h"
44 #include "DUtoCURRCContainer.h"
45
46 extern char encBuf[ENC_BUF_MAX_LEN];
47 extern DuCfgParams duCfgParam;
48 static S16 BuildULTnlInforet=RFAILED;
49
50 S16 sctpSend(Buffer *mBuf, U8 itfType);
51
52
53 /*******************************************************************
54  *
55  * @brief Builds Uplink Info for NR 
56  *
57  * @details
58  *
59  *    Function : BuildULNRInfo
60  *
61  *    Functionality: Building NR Uplink Info
62  *
63  * @params[in] NRFreqInfo_t *ulnrfreq
64  * @return ROK     - success
65  *         RFAILED - failure
66  *
67  * ****************************************************************/
68 S16 BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
69 {
70    U8 idx=0;
71    ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
72                        fdd.ulNrFreqInfo.nrArfcn;
73    ulnrfreq->freqBandListNr.list.count = 1;
74    ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
75         DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
76    if(ulnrfreq->freqBandListNr.list.array == NULLP)
77    {
78        return RFAILED;
79    }
80    for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
81    {
82        DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
83        if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
84       {
85          return RFAILED;
86            }
87    }
88    ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
89    duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
90    freqBand[0].nrFreqBand;
91    ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
92         return ROK;
93 }
94 /*******************************************************************
95  *
96  * @brief Builds Downlink NR Info 
97  *
98  * @details
99  *
100  *    Function : BuildDLNRInfo
101  *
102  *    Functionality: Building Downlink NR Info
103  *    
104  * @params[in] NRFreqInfo_t *dlnrfreq
105  * @return ROK     - success
106  *         RFAILED - failure
107  *
108  * ****************************************************************/
109 S16 BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
110 {
111    U8 idx=0;
112         dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
113                        fdd.dlNrFreqInfo.nrArfcn;
114    dlnrfreq->freqBandListNr.list.count = 1;
115    dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
116    DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
117    if(dlnrfreq->freqBandListNr.list.array == NULLP)
118    {
119       return RFAILED;   
120         }
121    for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
122         {
123            DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
124       if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
125       {
126          return RFAILED;
127                 }
128    }   
129    dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
130    duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
131       freqBand[0].nrFreqBand;
132    dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
133       
134      return ROK;
135 }
136
137 /*******************************************************************
138  *
139  * @brief Builds Nrcgi 
140  *
141  * @details
142  *
143  *    Function : BuildNrcgi
144  *
145  *    Functionality: Building the PLMN ID and NR Cell id
146  *
147  * @params[in] NRCGI_t *nrcgi
148  * @return ROK     - success
149  *         RFAILED - failure
150  *
151  * ****************************************************************/
152 S16 BuildNrcgi(NRCGI_t *nrcgi)
153 {
154    S16 ret;
155    U8 unused = 4;
156    U8 byteSize = 5;
157    U8 val = 16;
158    /* Allocate Buffer Memory */
159    nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(U8);
160    DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
161    if(nrcgi->pLMN_Identity.buf == NULLP)
162         {
163            return RFAILED;
164    }
165         ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
166                                  &nrcgi->pLMN_Identity); // Building PLMN function
167         if(ret != ROK)
168    {
169            return RFAILED;
170    }
171    /*nrCellIdentity*/
172    //ret = BuildNrCellId(&nrcgi->nRCellIdentity);
173    nrcgi->nRCellIdentity.size = byteSize * sizeof(U8);
174    DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size); 
175    if(nrcgi->nRCellIdentity.buf == NULLP)
176    {
177            return RFAILED;
178    }
179    ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
180    if(ret != ROK)
181    {
182                 return RFAILED;
183    }
184    return ROK;
185 }
186 /*******************************************************************
187  *
188  * @brief Builds FiveGStac 
189  *
190  * @details
191  *
192  *    Function : BuildFiveGSTac
193  *
194  *    Functionality: Building the FiveGSTac
195  *
196  * @params[in] OCTET_STRING_t *fivegsTac
197  * @return ROK     - success
198  *         RFAILED - failure
199  *
200  * ****************************************************************/
201 S16 BuildFiveGSTac(Served_Cell_Information_t *servcell)
202 {
203    DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
204    if(servcell->fiveGS_TAC == NULLP)
205    {
206            return RFAILED;
207    }
208    servcell->fiveGS_TAC->size = 3 * sizeof(U8);
209    DU_ALLOC(servcell->fiveGS_TAC->buf,\
210          sizeof(servcell->fiveGS_TAC->size));
211    if(servcell->fiveGS_TAC->buf == NULLP)
212    {
213            return RFAILED;
214    }
215    servcell->fiveGS_TAC->buf[0] = 0;
216    servcell->fiveGS_TAC->buf[1] = 0;
217    servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
218    return ROK;  
219 }
220 /*******************************************************************
221  *
222  * @brief Builds NR Mode 
223  *
224  * @details
225  *
226  *    Function : BuildNrMode
227  *
228  *    Functionality: Building the NR Mode
229  *
230  * @params[in] NR_Mode_Info_t *fdd
231  * @return ROK     - success
232  *         RFAILED - failure
233  *
234  * ****************************************************************/
235 S16 BuildNrMode(NR_Mode_Info_t *mode)
236 {
237    S16 BuildDLNRInforet=0;
238         S16 BuildULNRInforet=0; 
239    /* FDD Mode */
240         mode->present = NR_Mode_Info_PR_fDD;
241    if(mode->present == NR_Mode_Info_PR_fDD)
242    {
243       DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
244       if(mode->choice.fDD == NULLP)
245       {
246                    return RFAILED;
247       }
248       BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
249       if(BuildULNRInforet != ROK)
250       {
251           return RFAILED;    
252            }
253            BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
254       if(BuildDLNRInforet != ROK)
255       {
256                    return RFAILED;
257       }
258         }
259    mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
260                                     duCfgParam.srvdCellLst[0].duCellInfo.\
261                                     f1Mode.mode.fdd.ulTxBw.nrScs;
262    mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
263                                     duCfgParam.srvdCellLst[0].duCellInfo.\
264                                     f1Mode.mode.fdd.ulTxBw.nrb;
265    mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
266                                     duCfgParam.srvdCellLst[0].duCellInfo.\
267                                     f1Mode.mode.fdd.dlTxBw.nrScs;
268    mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
269                                     duCfgParam.srvdCellLst[0].duCellInfo.\
270                                     f1Mode.mode.fdd.dlTxBw.nrb;
271         return ROK;
272 }
273 /*******************************************************************
274  *
275  * @brief Builds IE Extensions for Served PLMNs 
276  *
277  * @details
278  *
279  *    Function : BuildExtensions
280  *
281  *    Functionality: Building the IE Extensions
282  *
283  * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
284  * @return ROK     - success
285  *         RFAILED - failure
286  *
287  * ****************************************************************/
288 S16 BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
289 {
290    U8 idx;
291    U8 plmnidx;
292    U8 extensionCnt=1;
293    U8 sliceId=0;
294    U8 sdId;
295    DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
296    if((*ieExtend) == NULLP)
297    {
298            return RFAILED;
299    }
300    (*ieExtend)->list.count = extensionCnt;
301    (*ieExtend)->list.size = \
302                             extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
303    DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
304    if((*ieExtend)->list.array == NULLP)
305    {
306            return RFAILED;
307    }
308    for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
309    {
310       DU_ALLOC((*ieExtend)->list.array[plmnidx],\
311             sizeof(ServedPLMNs_ItemExtIEs_t));
312       if((*ieExtend)->list.array[plmnidx] == NULLP)
313       {
314                    return RFAILED;
315            }
316    }
317    idx = 0;
318    (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
319    (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
320    (*ieExtend)->list.array[idx]->extensionValue.present = \
321                  ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
322    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
323       list.count = 1;
324    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
325                  list.size = sizeof(SliceSupportItem_t *);
326     DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
327             list.array,sizeof(SliceSupportItem_t *));
328     if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
329             list.array == NULLP)
330     {
331             return RFAILED;
332     }
333     DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
334             list.array[sliceId],sizeof(SliceSupportItem_t));
335     if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
336             list.array[sliceId] == NULLP) 
337     {
338              return RFAILED;
339     }
340    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
341          list.array[sliceId]->sNSSAI.sST.size = sizeof(U8);
342     DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
343             .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
344             extensionValue.choice.SliceSupportList.\
345             list.array[sliceId]->sNSSAI.sST.size);
346    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
347             .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
348    {
349            return RFAILED;
350    }
351   (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
352          list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
353    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
354             list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
355    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
356             list.array[sliceId]->sNSSAI.sD == NULLP)
357    {
358            return RFAILED;
359    }
360    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
361          list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(U8);
362    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
363             list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
364             SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
365    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
366             list.array[sliceId]->sNSSAI.sD->buf == NULLP)
367    {
368        return RFAILED;
369         }
370    sdId = 0;
371    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
372          list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
373       sdId++;
374    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
375          list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
376       sdId++;
377    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
378          list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
379     return ROK;
380 }
381 /*******************************************************************
382  *
383  * @brief Builds Served PLMN 
384  *
385  * @details
386  *
387  *    Function : BuildServedPlmn
388  *
389  *    Functionality: Building the Served PLMN
390  *
391  * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
392  * @return ROK     - success
393  *         RFAILED - failure
394  *
395  * ****************************************************************/
396 S16  BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
397 {  
398    U8  plmnidx;
399    U8  servPlmnCnt=1;
400         S16 buildPlmnIdret=0;
401         S16 BuildExtensionsret=0;
402    srvplmn->list.count = servPlmnCnt;
403    srvplmn->list.size = \
404                       servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
405         DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
406    if(srvplmn->list.array == NULLP)
407    {
408        return RFAILED;
409    }
410    for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
411    {   
412       DU_ALLOC(srvplmn->list.array[plmnidx],\
413             sizeof(ServedPLMNs_Item_t));
414       if(srvplmn->list.array[plmnidx] == NULLP)
415       {
416                    return RFAILED;
417       }  
418    }
419         srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(U8);
420    DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
421    buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
422          &srvplmn->list.array[0]->pLMN_Identity);
423    if(buildPlmnIdret!= ROK)
424    {
425            return RFAILED;
426    }
427    BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
428    if(BuildExtensionsret!= ROK)
429    {
430            return RFAILED;
431    }
432    return ROK;
433 }
434 /*******************************************************************
435  *
436  * @brief Builds Served Cell List
437  *
438  * @details
439  *
440  *    Function : BuildServedCellList
441  *
442  *    Functionality: Building Served Cell List
443  *
444  * @params[in] PLMNID plmn
445  * @return ROK     - success
446  *         RFAILED - failure
447  *
448  * ****************************************************************/
449
450 S16 BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
451 {
452    S16 BuildNrcgiret=0;
453    S16 BuildFiveGSTacret=0;
454         S16 BuildServedPlmnret=0;
455         S16 BuildNrModeret=0;
456    U8  idx;
457    U8  plmnidx;
458    U8  plmnCnt=1;
459    GNB_DU_Served_Cells_Item_t *srvCellItem;
460    duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
461    duServedCell->list.count = plmnCnt;
462  
463    DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
464    if(duServedCell->list.array == NULLP)
465    {
466            return RFAILED;
467    }
468    for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
469    {
470       DU_ALLOC(duServedCell->list.array[plmnidx],\
471              sizeof(GNB_DU_Served_Cells_ItemIEs_t));
472       if(duServedCell->list.array[plmnidx] == NULLP)
473       {
474                    return RFAILED;
475       }
476    }
477    idx = 0;
478    duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
479    duServedCell->list.array[idx]->criticality = Criticality_reject;
480    duServedCell->list.array[idx]->value.present = \
481                 GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
482    srvCellItem = \
483            &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
484    /*nRCGI*/
485    BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
486    if(BuildNrcgiret != ROK)
487    {
488            return RFAILED;
489    }
490       /*nRPCI*/
491    srvCellItem->served_Cell_Information.nRPCI = \
492                          duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
493
494    /*fiveGS_TAC*/
495    BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
496    if(BuildFiveGSTacret != ROK)
497    {
498            return RFAILED;
499    }
500    /*Served PLMNs*/
501    BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
502    if(BuildServedPlmnret !=ROK)
503    {
504             return RFAILED;
505    }
506    /*nR Mode Info with FDD*/
507    BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
508    if(BuildNrModeret != ROK)
509    {
510            return RFAILED;
511    }
512    /*Measurement timing Config*/
513    srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
514       size = sizeof(U8);
515    DU_ALLOC(srvCellItem->served_Cell_Information.\
516          measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
517    if(srvCellItem->served_Cell_Information.\
518          measurementTimingConfiguration.buf == NULLP)
519    {
520             return RFAILED;
521    }
522    srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
523              duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
524
525    /* GNB DU System Information */
526    DU_ALLOC(srvCellItem->gNB_DU_System_Information,
527                         sizeof(GNB_DU_System_Information_t));
528    if(!srvCellItem->gNB_DU_System_Information)
529    {
530            return RFAILED;
531    }
532    /* MIB */
533    srvCellItem->gNB_DU_System_Information->mIB_message.size =\
534               strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
535    DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
536               srvCellItem->gNB_DU_System_Information->mIB_message.size);
537    if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
538    {
539            return RFAILED;
540    }
541    strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
542                         (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
543
544     /* SIB1 */
545    srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
546               duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
547
548    DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
549               srvCellItem->gNB_DU_System_Information->sIB1_message.size);
550    if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
551    {
552             return RFAILED;
553    }
554    for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
555    {
556          srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
557            duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
558    }
559   return ROK; 
560 }                                                                                                                  
561 /*******************************************************************
562  *
563  * @brief Builds RRC Version 
564  *
565  * @details
566  *
567  *    Function : BuildRrcVer
568  *
569  *    Functionality: Building RRC Version
570  *
571  * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
572  * @return ROK     - success
573  *         RFAILED - failure
574  *
575  * ****************************************************************/
576 S16 BuildRrcVer(RRC_Version_t *rrcVer)
577 {
578    U8 rrcExt;
579    U8 rrcLatest;
580    rrcVer->latest_RRC_Version.size = sizeof(U8);
581    DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(U8));
582    if(rrcVer->latest_RRC_Version.buf == NULLP)
583    {
584            return RFAILED;
585    }
586    rrcVer->latest_RRC_Version.buf[0] = 0;
587    rrcVer->latest_RRC_Version.bits_unused = 5;
588    DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
589    if(rrcVer->iE_Extensions == NULLP)
590    {  
591            return RFAILED;
592    }
593    rrcVer->iE_Extensions->list.count = 1;
594    rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
595    DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
596    if(rrcVer->iE_Extensions->list.array == NULLP)
597    {
598            return RFAILED;
599    }
600    rrcExt = 0;
601    DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
602          sizeof(RRC_Version_ExtIEs_t));
603    if(rrcVer->iE_Extensions->list.array[0] == NULLP)
604    {
605            return RFAILED;
606    }
607    rrcVer->iE_Extensions->list.array[rrcExt]->id = \
608                              ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
609    rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
610    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
611               RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
612    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
613              .Latest_RRC_Version_Enhanced.size = 3*sizeof(U8);
614    DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
615         .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
616          array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
617    if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
618           .Latest_RRC_Version_Enhanced.buf == NULLP)
619    {
620            return RFAILED;
621    }
622    rrcLatest = 0;
623    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
624    Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
625    rrcLatest++;
626    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
627    Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
628    rrcLatest++;
629    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
630    Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
631    return ROK;
632 }
633 /*******************************************************************
634 *
635 * @brief Sends F1 msg over SCTP
636 *
637 * @details
638 *
639 *    Function : SendF1APMsg
640 *
641 *    Functionality: Sends F1 msg over SCTP
642 *
643 * @params[in] Region region
644 *             Pool pool
645 * @return ROK     - success
646 *         RFAILED - failure
647 *
648 * ****************************************************************/
649 S16 SendF1APMsg(Region region, Pool pool)
650 {
651    Buffer *mBuf;
652
653    if(SGetMsg(region, pool, &mBuf) == ROK)
654    {
655       if(SAddPstMsgMult((Data *)encBuf, encBufSize, mBuf) == ROK)
656       {
657          SPrntMsg(mBuf, 0,0);
658  
659          if(sctpSend(mBuf, F1_INTERFACE) != ROK)
660          {
661             DU_LOG("\nF1AP : SCTP Send failed");
662             SPutMsg(mBuf);
663             return RFAILED;
664          }
665       }
666       else
667       {
668          DU_LOG("\nF1AP : SAddPstMsgMult failed");
669          SPutMsg(mBuf);
670          return RFAILED;
671       }
672       SPutMsg(mBuf);
673    }
674    else
675    {
676       DU_LOG("\nF1AP : Failed to allocate memory");
677       return RFAILED;
678    }
679    return ROK; 
680 } /* SendF1APMsg */
681
682 /*******************************************************************
683 *
684 * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
685 *
686 * @details
687 *
688 *    Function :  FreeRrcVer
689 *
690 *    Functionality: deallocating the memory of function BuildRrcVer
691 *
692 * @params[in] RRC_Version_t *rrcVer
693
694 * @return void
695 *
696 *****************************************************************/
697 void FreeRrcVer(RRC_Version_t *rrcVer)
698 {
699    if(rrcVer->latest_RRC_Version.buf != NULLP)
700         {
701            if(rrcVer->iE_Extensions != NULLP)
702                 {
703                    if(rrcVer->iE_Extensions->list.array != NULLP)
704                         {
705                            if(rrcVer->iE_Extensions->list.array[0] != NULLP)
706                                 {
707                                    if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
708                                         != NULLP)
709                                         {
710                                            DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
711                                                 .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
712                                                 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
713                                         }
714                                         DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
715                                 }
716                                 DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
717                         }
718                         DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
719                 }
720                 DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
721         }
722 }
723 /*******************************************************************
724 *
725 * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
726 *
727 * @details
728 *
729 *    Function :  FreeServedCellList
730 *
731 *    Functionality:  deallocating the memory of function BuildServedCellList
732
733 *
734 * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
735 *
736 * @return void
737 *
738 * ****************************************************************/
739 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
740 {
741    U8   plmnCnt=1;
742    U8  servId=0;
743         U8 sliceId=0;
744         U8  ieId=0;
745         U8   extensionCnt=1;
746         U8 plmnidx=0;
747    GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
748    if(duServedCell->list.array!=NULLP)
749    {
750      if(duServedCell->list.array[0]!=NULLP)
751           {
752              if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
753              {
754                      if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
755                           {
756                              if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
757                                   {
758                                      if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
759                                           {
760                                              if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
761                                                   {
762                                                      if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
763                                                           {
764                                                              if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
765                                                                   {
766                                                                      if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
767                                                                           {
768                                                                              if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
769                                                                                   {
770                                                                                      if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
771                                                                                           {
772                                                                                             if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
773                                                                                                  extensionValue.choice.SliceSupportList.list.array!=NULLP)
774                                                                                                  {
775                                                                                                     if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
776                                                                                                          extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
777                                                                                                          {
778                                                                                                    if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
779                                                                                                         extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
780                                                                                                         {
781                                                                                                            if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
782                                                                                                                 extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
783                                                                                                                 {
784                                                                                                                    if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
785                                                                                                                         list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
786                                                                                                                    {
787                                                      if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
788                                                                                                                                 {
789                                                                                                                                    if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
790                                                                                                                                         freqBandListNr.list.array!=NULLP)
791                                                                                                                                         {
792                                                                                                                                             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
793                                                                                                                                                  freqBandListNr.list.array[0]!=NULLP)
794                                                                                                                                                  {
795                                                                                                                                                     if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
796                                                                                                                                                          freqBandListNr.list.array)
797                                                                                                                                                          {
798                                                                                                                                                             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
799                                                                                                                                                             freqBandListNr.list.array[0]!=NULLP)
800                                                                                                                                                                  {
801                                                                                                                                                                     if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
802                                                                                                                                                                          {
803                                                                                                                                                                             if(!srvCellItem->gNB_DU_System_Information)
804                                                                                                                                                                                  {
805                                                                                                                                                                                     if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
806                                                                                                                                                                                          {
807                                                                                                                                                                                                   if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
808                                                                                                                                                                                                   { 
809                                                                                                                                                                                                      DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
810                                                                                                                                                                                                       srvCellItem->gNB_DU_System_Information->sIB1_message.size);
811                                                                                                                                                                                                                          DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
812                                                                                                                                                                                                                           srvCellItem->gNB_DU_System_Information->sIB1_message.size);
813                                                                                                                                                                                                   }
814                                                                                                                                                                                              DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
815                                                                                                                                                                                              srvCellItem->gNB_DU_System_Information->mIB_message.size);
816                                                                                                                                                                                                                  DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
817                                                                                                                                                                                                                  strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
818                                                                                                                                                                                      }
819                                                                                                                                                                                      DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
820                                                                                                                                                                                   }
821                                                                                                                                                                              DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
822                                                                                                                                                                                   srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
823                                                                                                                                                                          }
824                                                                                                                                                                     DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
825                                                                                                                                                                          freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
826                                                                                                                                                                  }
827                                                                                                                                                             DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
828                                                                                                                                                                  freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
829                                                                                                                                                         }
830                                                                                                                                                    DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
831                                                                                                                                                                   list.array[0],sizeof(FreqBandNrItem_t));
832                                                                                                                                                 }
833                                                                                                                                            DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
834                                                                                                                                                           list.array,sizeof(FreqBandNrItem_t*));
835                                                                                                                                         }
836                                                                                                                                    DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
837                                                                                                                                 }
838                                                                                                                            DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
839                                                                                                                                 iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
840                                                                                                                                           sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
841                                                                                                                                          list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
842                                                                                                                                  }
843                                                                                                                   DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
844                                                                                                                        iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
845                                                                                                                         list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
846                                                                                                                }
847                                                                                                           DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
848                                                                                                                iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
849                                                                                                                          sNSSAI.sST.buf,sizeof(U8));
850                                                                                                             }
851                                                                                                                  DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
852                                            extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
853                                                                                                     }
854                                         DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
855                                                                                                           extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
856                                      }
857                                                                                             DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
858                                                                                                  array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
859                                                                                           }
860                                                                                      DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
861                                                                                           array[servId]->iE_Extensions->list.array,\
862                                                                                           extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
863                                                                                   }
864                                                                              DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
865                                                                                   array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
866                                                                           }
867                                                                      DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
868                                                                           array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
869                                                                           servedPLMNs.list.array[servId]->pLMN_Identity.size
870                                                                           * sizeof(U8));
871                                                                   }
872                                                              DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
873                                                                   sizeof(ServedPLMNs_Item_t *));
874                                                           }
875                                                      DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
876                                                           sizeof(ServedPLMNs_Item_t *));
877                                                   }
878                                              DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
879                                                   sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
880                                           }
881                                      DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
882                                   }
883                              DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
884                                   srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
885                                   sizeof(U8));
886                           }
887                      DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
888                           srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
889                           sizeof(U8));
890                   }
891              DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
892           }
893      DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
894   }
895 }
896 /*******************************************************************
897  *
898  * @brief Builds and Send the F1SetupRequest
899  *
900  * @details
901  *
902  *    Function : BuildAndSendF1SetupReq
903  *
904  * Functionality:Fills the F1SetupRequest
905  *
906  * @return ROK     - success
907  *         RFAILED - failure
908  *
909  ******************************************************************/
910 S16 BuildAndSendF1SetupReq()
911 {
912    S16  BuildServedCellListreturn=0;
913         S16  BuildRrcVerreturn=0; 
914    U8   idx=0,idx2=0,i=0;
915    U8   ieId=0;
916    U8   elementCnt=0;
917    F1AP_PDU_t                 *f1apMsg = NULLP;
918    F1SetupRequest_t           *f1SetupReq=NULLP;
919    GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
920    RRC_Version_t              *rrcVer=NULLP;
921    asn_enc_rval_t             encRetVal;        /* Encoder return value */
922         bool ret=false;
923    DU_LOG("\nF1AP : Building F1 Setup Request\n");
924    do
925    {
926       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
927       if(f1apMsg == NULLP)
928       {
929          break;
930       }
931       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
932       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
933       if(f1apMsg->choice.initiatingMessage == NULLP)
934       {
935          break;
936       }
937       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
938       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
939       f1apMsg->choice.initiatingMessage->value.present = \
940                                     InitiatingMessage__value_PR_F1SetupRequest;
941
942       f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
943
944       elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
945
946       f1SetupReq->protocolIEs.list.count = elementCnt;
947       f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
948
949       /* Initialize the F1Setup members */
950       DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
951       if(f1SetupReq->protocolIEs.list.array == NULLP)
952       {
953          break;
954       }
955       for(idx=0; idx<elementCnt; idx++)
956       {
957          DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx],\
958             sizeof(F1SetupRequestIEs_t));
959          if(f1SetupReq->protocolIEs.list.array[idx] == NULLP)
960          {
961             break;
962          }
963       }
964       idx2 = 0;
965
966       /*TransactionID*/
967       f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_TransactionID;
968       f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
969       f1SetupReq->protocolIEs.list.array[idx2]->value.present =\
970                                     F1SetupRequestIEs__value_PR_TransactionID;
971       f1SetupReq->protocolIEs.list.array[idx2]->value.choice.TransactionID = \
972                                                                    TRANS_ID;
973
974       /*DU ID*/
975       idx2++;
976       f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_ID;
977       f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
978       f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
979          F1SetupRequestIEs__value_PR_GNB_DU_ID;
980       f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size =\
981                                                                     sizeof(U8);
982
983       DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf,\
984            f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.size);
985       if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf == \
986          NULLP)
987       {
988          break;
989       }
990                        
991       f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_ID.buf[0] =\
992                                                              duCfgParam.duId;
993
994       /*DU Name*/
995       if(duCfgParam.duName != NULL)
996       {
997          idx2++;
998          f1SetupReq->protocolIEs.list.array[idx2]->id = ProtocolIE_ID_id_gNB_DU_Name ;
999          f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_ignore;
1000          f1SetupReq->protocolIEs.list.array[idx2]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1001          f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.size =\
1002                                                         strlen((char *)duCfgParam.duName);
1003          DU_ALLOC(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.\
1004             GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1005          if(f1SetupReq->protocolIEs.list.array[idx2]->value.choice.GNB_DU_Name.\
1006             buf == NULLP)
1007          {
1008             break;
1009          }
1010          strcpy((char*)f1SetupReq->protocolIEs.list.array[idx2]->value.\
1011             choice.GNB_DU_Name.buf,
1012          (char*)&duCfgParam.duName);
1013
1014       }
1015
1016        /*Served Cell list */
1017       idx2++;
1018       f1SetupReq->protocolIEs.list.array[idx2]->id = \
1019                                  ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1020       f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1021       f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1022                             F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1023       duServedCell = &f1SetupReq->protocolIEs.list.\
1024                   array[idx2]->value.choice.GNB_DU_Served_Cells_List;
1025       BuildServedCellListreturn = BuildServedCellList(duServedCell);
1026       if(BuildServedCellListreturn != ROK)
1027       {
1028          break;
1029       }
1030
1031       /*RRC Version*/
1032       idx2++;
1033       f1SetupReq->protocolIEs.list.array[idx2]->id = \
1034                                   ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1035       f1SetupReq->protocolIEs.list.array[idx2]->criticality = Criticality_reject;
1036       f1SetupReq->protocolIEs.list.array[idx2]->value.present = \
1037                                     F1SetupRequestIEs__value_PR_RRC_Version;
1038       rrcVer = &f1SetupReq->protocolIEs.list.array[idx2]->value.choice.RRC_Version;
1039       BuildRrcVerreturn = BuildRrcVer(rrcVer);
1040       ieId = 0;
1041       if(BuildRrcVerreturn != ROK)
1042       {
1043                         break;
1044       }
1045       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1046
1047       /* Encode the F1SetupRequest type as APER */
1048       cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1049       encBufSize = 0;
1050       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1051          encBuf);
1052
1053       /* Encode results */
1054       if(encRetVal.encoded == ENCODE_FAIL)
1055       {
1056            DU_LOG("\nF1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1057                            encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1058                           break;
1059       }
1060       else
1061       {
1062            DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupRequest\n");
1063            for(i=0; i< encBufSize; i++)
1064            {
1065                    printf("%x",encBuf[i]);
1066            }
1067       }
1068
1069       /* Sending msg */
1070       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1071        {
1072            DU_LOG("\nF1AP : Sending F1 Setup request failed");
1073                           break;
1074       }
1075                 ret=true;
1076       break;
1077    }while(1);
1078
1079    if(f1apMsg != NULLP)
1080    {
1081
1082       if(f1apMsg->choice.initiatingMessage != NULLP)
1083       {
1084          if(f1SetupReq->protocolIEs.list.array != NULLP)
1085          {
1086             if(idx == elementCnt-1)
1087             {
1088                if(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf !=  NULLP)
1089                {
1090                    if(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf != NULLP)
1091                    {
1092                                                      if(BuildServedCellListreturn == ROK)
1093                                                           {   
1094                                                               FreeRrcVer(rrcVer);
1095                                                           }
1096                                                           FreeServedCellList(duServedCell);
1097                                                           DU_FREE(f1SetupReq->protocolIEs.list.array[2]->value.choice.GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1098                    }
1099                    DU_FREE(f1SetupReq->protocolIEs.list.array[1]->value.choice.GNB_DU_ID.buf, sizeof(U8));
1100                 }
1101                           for(idx=0; idx<elementCnt; idx++)
1102                 {
1103                     DU_FREE(f1SetupReq->protocolIEs.list.array[idx],sizeof(F1SetupRequestIEs_t));
1104                 }
1105             }
1106             else
1107             {
1108                 for(ieId=0 ; ieId<idx ;ieId++)
1109                 {
1110                                             if(f1SetupReq->protocolIEs.list.array[ieId]!=NULLP)
1111                    {
1112                                                      DU_FREE(f1SetupReq->protocolIEs.list.array[ieId],\
1113                        sizeof(F1SetupRequestIEs_t));
1114                                                  }
1115                 }
1116             }
1117             DU_FREE(f1SetupReq->protocolIEs.list.array,\
1118                elementCnt * sizeof(F1SetupRequestIEs_t *));
1119          }
1120          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1121       }
1122       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1123    }
1124
1125         if(ret==true)
1126    return ROK;  
1127         else
1128         return RFAILED;
1129 }/* End of BuildAndSendF1SetupReq */
1130
1131 /*******************************************************************
1132  *
1133  * @brief Builds and sends the DUConfigUpdate
1134  *
1135  * @details
1136  *
1137  *    Function : BuildAndSendDUConfigUpdate
1138  *
1139  *    Functionality: Constructs the DU Update message and sends
1140  *                   it to the CU through SCTP.
1141  *
1142  * @params[in] void **buf,Buffer to which encoded pattern is written into
1143  * @params[in] int *size,size of buffer
1144  *
1145  * @return ROK     - success
1146  *         RFAILED - failure
1147  *
1148  * ****************************************************************/
1149 S16 BuildAndSendDUConfigUpdate()
1150 {
1151    U8 idx;
1152         U8 idy;
1153         U8 idx1;
1154         U8 idy1;
1155         U8 idy2;
1156    U8 elementCnt;
1157         U8 modifyCnt;
1158         U8 servPlmnCnt;
1159         U8 extensionCnt;
1160    asn_enc_rval_t encRetVal;      /* Encoder return value */
1161    F1AP_PDU_t *f1apDuCfg = NULL;
1162    GNBDUConfigurationUpdate_t *duCfgUpdate;
1163    Served_Cells_To_Modify_List_t  *cellsToModify;
1164    Served_Cells_To_Modify_Item_t *modifyItem;
1165    bool checkvar=false;
1166    U8 i;
1167
1168         while(1)
1169         {
1170             DU_LOG("\nF1AP : Building DU config update\n");
1171                  /* Allocate the memory for F1DuCfg */
1172             DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1173                  if(f1apDuCfg == NULLP)
1174                  {
1175                    DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1176                    break;
1177                  }
1178                 
1179                  f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1180        DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1181        if(f1apDuCfg->choice.initiatingMessage == NULLP)
1182                  {
1183                     DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1184                          break;
1185                  }
1186                 
1187                  f1apDuCfg->choice.initiatingMessage->procedureCode = \
1188                                  ProcedureCode_id_gNBDUConfigurationUpdate;
1189                  f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1190                  f1apDuCfg->choice.initiatingMessage->value.present = \
1191                                  InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1192             duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1193                                     choice.GNBDUConfigurationUpdate;
1194                  elementCnt = 3;
1195                  duCfgUpdate->protocolIEs.list.count = elementCnt;
1196                  duCfgUpdate->protocolIEs.list.size = \
1197                                  elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1198      
1199            /* Initialize the F1Setup members */
1200                  DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1201                  if(duCfgUpdate->protocolIEs.list.array == NULLP)
1202                  {
1203                    DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1204                         break;
1205                  }
1206                  for(idx=0;idx<elementCnt;idx++)
1207                  {
1208                     DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1209                           if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1210                           {
1211                                   break;
1212                           }
1213                  }
1214                 
1215                  /*TransactionID*/
1216                  idx1 = 0;
1217                  duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1218                  duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1219                  duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1220                                              GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1221                  duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1222                         TRANS_ID;
1223
1224        /*Served Cell to Modify */
1225                  idx1++;
1226        duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1227                                             ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1228        duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1229        duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1230                                                   GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1231             cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1232                              Served_Cells_To_Modify_List;
1233        modifyCnt = 1;
1234                  cellsToModify->list.count = modifyCnt;
1235                  cellsToModify->list.size = \
1236                                  modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1237                  DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1238                  if(cellsToModify->list.array == NULLP)
1239                  {
1240                break;
1241                  }
1242                  for(idy=0; idy<modifyCnt ;idy++)
1243                  {
1244                     DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1245                          Served_Cells_To_Modify_ItemIEs_t));
1246                          if(cellsToModify->list.array[idy] == NULLP)
1247                          {
1248                                  break;
1249                          }
1250                  }
1251             cellsToModify->list.array[0]->id = \
1252                                    ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1253                  cellsToModify->list.array[0]->criticality = Criticality_reject;
1254             cellsToModify->list.array[0]->value.present =\
1255                        Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1256             modifyItem=&cellsToModify->list.array[0]->value.choice.\
1257                    Served_Cells_To_Modify_Item;
1258
1259        /*pLMN_Identity*/
1260                  modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1261                  DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1262                  if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1263                  { 
1264                     break;
1265                  }
1266        buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1267                               &modifyItem->oldNRCGI.pLMN_Identity);
1268          
1269             /*nRCellIdentity*/
1270                  modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1271                  DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1272                      modifyItem->oldNRCGI.nRCellIdentity.size);
1273                  if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1274                  {
1275           break;
1276                  }
1277        for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1278                  {
1279            modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1280                  }
1281                  modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1282                  modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1283                  /*pLMN_Identity*/
1284                  /*nRCGI*/
1285                  modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1286        DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1287                      modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1288                  if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1289        {
1290                          break;
1291                  }
1292        buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1293                      &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1294                  modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1295                  DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1296                     modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1297                  if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1298                  {
1299                         break;
1300                  } 
1301        for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1302                      nRCGI.nRCellIdentity.size-1 ; tmp++)
1303             {
1304                     modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1305                  }
1306             modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1307        modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1308        /*nRPCI*/
1309             modifyItem->served_Cell_Information.nRPCI = \
1310                                duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1311        /*servedPLMNs*/
1312             servPlmnCnt = 1;
1313             modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1314        modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1315                      servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1316                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1317                        modifyItem->served_Cell_Information.servedPLMNs.list.size);
1318             if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1319                  {
1320                         break;
1321                  }
1322        for(idy1=0;idy1<servPlmnCnt;idy1++)
1323                  {
1324                      DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1325                            sizeof(ServedPLMNs_Item_t));
1326                                 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1327                                 {
1328                                          break;
1329                                 }
1330                  }
1331                  modifyItem->served_Cell_Information.servedPLMNs.list.\
1332                      array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1333                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1334                            array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1335                                           array[0]->pLMN_Identity.size);
1336                  if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1337                          array[0]->pLMN_Identity.buf == NULLP)
1338                  {
1339                          break;
1340                  }
1341        buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1342                      &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1343        DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1344                        array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1345                  if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1346                        array[0]->iE_Extensions == NULLP)
1347                  {
1348                          break;
1349                  }
1350        extensionCnt=1;
1351                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1352                        iE_Extensions->list.count = extensionCnt;
1353                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1354                      iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1355                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1356                       array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1357                                  iE_Extensions->list.size);
1358                  if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1359                         array[0]->iE_Extensions->list.array == NULLP)
1360                  {
1361                    break;
1362                  }
1363        for(idy2=0;idy2<extensionCnt;idy2++)
1364                  {
1365                     DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1366                            array[0]->iE_Extensions->list.array[idy2],\
1367                                 sizeof(ServedPLMNs_ItemExtIEs_t));
1368                          if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1369                                    array[0]->iE_Extensions->list.array[idy2] == NULLP)
1370                          {
1371                                   break;
1372                          }
1373                  }
1374                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1375                     iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1376        modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1377               iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1378             modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1379           iE_Extensions->list.array[0]->extensionValue.present = \
1380                          ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1381             modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1382                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1383                         list.count = 1;
1384                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1385                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1386                          list.size = sizeof(SliceSupportItem_t *);
1387                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1388                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1389           list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1390                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1391             if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1392                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1393                           list.array == NULLP)
1394                  {
1395                         break;
1396                  }
1397
1398                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1399                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1400                         list.array[0],sizeof( SliceSupportItem_t));
1401                  if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1402                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1403                           list.array[0] == NULLP)
1404                  {
1405                    break;
1406                  }
1407                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1408                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1409                         list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1410                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1411                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1412                         list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1413                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1414             if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1415                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1416                         list.array[0]->sNSSAI.sST.buf == NULLP)
1417                  {
1418                          break;
1419                  }
1420        modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1421                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1422                          list.array[0]->sNSSAI.sST.buf[0] = 3;
1423             DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1424                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1425                    list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1426                  if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1427                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1428                         list.array[0]->sNSSAI.sD == NULLP)
1429             {
1430                          break;
1431                  }
1432                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1433                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1434                         list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1435        DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1436                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1437                    list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1438                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1439                         list.array[0]->sNSSAI.sD->size);
1440        if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1441                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1442                         list.array[0]->sNSSAI.sD->buf == NULLP)
1443                  {
1444                          break;
1445                  }
1446        modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1447                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1448                   list.array[0]->sNSSAI.sD->buf[0] = 3;
1449                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1450                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1451                          list.array[0]->sNSSAI.sD->buf[1] = 6;
1452                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1453                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1454                          list.array[0]->sNSSAI.sD->buf[2] = 9;
1455                 
1456                  /*nR Mode Info with FDD*/
1457        modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1458                                              NR_Mode_Info_PR_fDD;
1459                  DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1460                                     sizeof(FDD_Info_t));
1461                  if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1462                  {
1463                          break;
1464                  }
1465        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1466                      uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1467                            f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1468                  modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1469                      uL_NRFreqInfo.freqBandListNr.list.count = 1;
1470                  modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1471                      uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1472                  DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1473                      fDD->uL_NRFreqInfo.freqBandListNr.list.\
1474                           array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1475                            uL_NRFreqInfo.freqBandListNr.list.size);
1476        if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1477                             fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1478                  {
1479                          break;
1480                  }
1481                  DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1482                        uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1483                  if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1484                       uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1485                  {
1486           break;
1487                  }
1488        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1489          freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1490          duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1491          freqBand[0].nrFreqBand;
1492        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1493           freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1494        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1495           nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1496           dlNrFreqInfo.nrArfcn;
1497        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1498           freqBandListNr.list.count = 1;
1499        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1500           freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1501        DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1502          dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1503                         choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1504        if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1505          dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1506        {
1507                         break;
1508        }
1509             DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1510          dL_NRFreqInfo.freqBandListNr.list.array[0],\
1511          sizeof(FreqBandNrItem_t));
1512        if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1513          dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1514        {
1515                      break;
1516        }
1517        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1518         freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1519         duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1520         freqBand[0].nrFreqBand;
1521        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1522         freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1523
1524        /*Transmission Bandwidth*/
1525        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1526         uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1527         f1Mode.mode.fdd.ulTxBw.nrScs;
1528        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1529         uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1530         f1Mode.mode.fdd.ulTxBw.nrb;
1531        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1532         dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1533         f1Mode.mode.fdd.dlTxBw.nrScs;
1534        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1535         dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1536         f1Mode.mode.fdd.dlTxBw.nrb;
1537        /*Measurement timing Config*/
1538        modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1539                                                               sizeof(uint8_t);
1540        DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1541          buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1542        if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1543        {
1544                         break;
1545        }
1546        modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1547           buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1548    
1549        // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1550        /*GNB DU ID */
1551        idx1++;
1552        duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1553        duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1554        duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1555                              GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1556        duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1557                                                              sizeof(uint8_t);
1558        DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1559           duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1560        if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1561        {
1562                          break;
1563        }
1564        duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1565                                                               duCfgParam.duId;
1566
1567        xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1568    
1569        /* Encode the DU Config Update type as APER */
1570        cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1571        encBufSize = 0;
1572        encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1573
1574        /* Checking encode results */
1575        if(encRetVal.encoded == ENCODE_FAIL) 
1576        {
1577             DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1578                                 break;
1579                  } 
1580        else 
1581        {
1582            DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1583            for(i=0; i< encBufSize; i++)
1584           {
1585               printf("%x",encBuf[i]);
1586           }
1587        } 
1588        /* Sending msg */
1589        if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1590        {
1591           DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1592                          break;
1593        }
1594                  checkvar=true;
1595                  break;
1596         }
1597    if(f1apDuCfg != NULLP)
1598         {
1599             if(f1apDuCfg->choice.initiatingMessage != NULLP)
1600                  {
1601                      if(duCfgUpdate->protocolIEs.list.array != NULLP)
1602                           {
1603                               if(idx==elementCnt)
1604                                         {
1605                                             if(cellsToModify->list.array != NULLP)
1606                                                  {
1607                                                      if(idy==modifyCnt)
1608                                                           {
1609                                                               if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1610                            {
1611                                                                             if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1612                                                                                  {
1613                                                                                       if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1614                                                                                                 {
1615                                                                                                      if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1616                                                                                                           != NULLP)
1617                                                                                                           { 
1618                                                                                                               if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1619                                                                                                                         != NULLP)
1620                                                                                                                          {
1621                                                                                                                              if(idy1==servPlmnCnt)
1622                                                                                                                                   {
1623                                                                                                                                       if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1624                                                                                                                                             array[0]->pLMN_Identity.buf != NULLP)
1625                                                       {
1626                                                            if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1627                                                                                                                                                             array[0]->iE_Extensions!= NULLP)
1628                                                                                                                                                                  {
1629                                                                                                                                                                      if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1630                                                                  array[0]->iE_Extensions->list.array != NULLP)
1631                                                                                                                                                                           {
1632                                                                                                                                                                               if(idy2==extensionCnt)
1633                                                                                                                                                                                         {
1634                                                                                                                                                                                            if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1635                                                                                                                                                                                                 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1636                                                                                                                                                                                                 list.array !=NULLP)
1637                                                                                                                                                                                                 {
1638                                                                                                                                                                                                    if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1639                                                                                                                                                                                                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1640                                                                                                                                                                                                          list.array[0]!=NULLP)
1641                                                                                                                                                                                                          {   
1642                                                                                                                                                                                                              if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1643                                                                                                                                                                                                                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1644                                                                                                                                                                                                                   list.array[0]->sNSSAI.sST.buf!=NULLP)
1645                                                                                                                                                                                                                   {
1646                                                                                                                                                                                                                      if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1647                                                                                                                                                                                                                           iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1648                                                                                                                                                                                                                           list.array[0]->sNSSAI.sD != NULLP)
1649                                                                                                                                                                                                                           {
1650                                                                                                                                                                                                                                if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1651                                                                                                                                                                                                                                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1652                                                                                                                                                                                                                                           list.array[0]->sNSSAI.sD->buf!=NULLP)
1653                                                                                                                                                                                                                                          {
1654                                                                                                                                                                                                                                              if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1655                                                                                                                                                                                                                                                   !=NULLP)
1656                                                                                                                                                                                                                                                   {
1657                                                                                                                                                                                                                                                      if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1658                                                                                                                                                                                                                                                           fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1659                                                                                                                                                                                                                                                      {
1660                                                                                                                                                                                                                                                               if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1661                                                                                                                                                                                                                                                                         fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]!=NULLP)
1662                                                                                                                                                                                                                                                                         {
1663                                                                                                                                                                                                                                                                             if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1664                                                                                                                                                                                                                                                                                  fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1665                                                                                                                                                                                                                                                                             {
1666                                                                                                                                                                                                                                                                                     if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1667                                                                                                                                                                                                                                                                                          choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1668                                                                                                                                                                                                                                                                                          array[0]!= NULLP)
1669                                                                                                                                                                                                                                                                                          {
1670                                                                                                                                                                                                                                                                                             if(modifyItem->served_Cell_Information.\
1671                                                                                                                                                                                                                                                                                                  measurementTimingConfiguration.buf !=NULLP)
1672                                                                                                                                                                                                                                                                                                  {
1673                                                                                                                                                                                                                                                                                                    if(duCfgUpdate->protocolIEs.list.array[2]->value.\
1674                                                                                                                                                                                                                                                                                                         choice.GNB_DU_ID.buf!=NULLP)
1675                                                                                                                {
1676                                                                                                                                                                                                                                                                                                             DU_FREE(duCfgUpdate->protocolIEs.list.\
1677                                                                                                                                                                                                                                                                                                                  array[2]->value.choice.GNB_DU_ID.buf,\
1678                                                                                                                                                                                                                                                                                                                  duCfgUpdate->protocolIEs.list.array[2]->\
1679                                                                                                                                                                                                                                                                                                                  value.choice.GNB_DU_ID.size);
1680                                                                                                                                                                                                                                                                                                         }
1681                                                                                                                                                                                                                                                                                                    DU_FREE(modifyItem->served_Cell_Information.\
1682                                                                                                                                                                                                                                                                                                         measurementTimingConfiguration.\
1683                                                                                                                                                                                                                                                                                                         buf,modifyItem->served_Cell_Information.\
1684                                                                                                                                                                                                                                                                                                         measurementTimingConfiguration.size);
1685                                                                                                                                                                                                                                                                                                  }
1686                                                                                                                                                                                                                                                                                             DU_FREE(modifyItem->served_Cell_Information.\
1687                                                                                                                                                                                                                                                                                                 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1688                                                                                                                                                                                                                                                                                            list.array[0],sizeof(FreqBandNrItem_t));
1689                                                                                                                                                                                                                                                                                          }
1690                                                                                                                                                                                                                                                                                          DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1691                                                                                                                                                                                                                                                                                          .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1692                                                                                                                                                                                                                                                                                          modifyItem->served_Cell_Information.nR_Mode_Info.\
1693                                                                                                                                                                                                                                                                                          choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1694                                                                                                                                                                                                                                                                                  }
1695                                                                                                                                                                                                                                                                                  DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1696                                                                                                                                                                                                                                                                                  choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1697                                                                                                                                                                                                                                                                                  array[0],sizeof(FreqBandNrItem_t));
1698                                                                                                                                                                                                                                                                         }
1699                                                                                                                                                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1700                                                                                                                                                                                                                                                                   fDD->uL_NRFreqInfo.freqBandListNr.list.\
1701                                                                                                                                                                                                                                                                   array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1702                                                                                                                                                                                                                                                                   fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1703                                                                                                                                                                                                                                                           }
1704                                                                                                                                                                                                                                                      DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1705                                                                                                                                                                                                                                                           fDD,sizeof(FDD_Info_t));
1706                                                                                                                                                                                                                                                   }
1707                                                                                                                                                                                                                                             DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1708                                                                                                                                                                                                                                                  iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1709                                                                                                                                                                                                                                                   list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1710                                                                                                                                                                                                                                                  servedPLMNs.list.array[0]->iE_Extensions->list.array[0]->\
1711                                                                                                                                                                                                                                                  extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sD->size);
1712
1713                                                                                                                                                                                                                                          }
1714                                                                                                                                                                                                                               DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1715                                                                                                                                                                                                                                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1716                                                                                                                                                                                                                                         list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1717                                                                                                                                                                                                                           }
1718                                                                                                                                                                                                                      DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1719                                                                                                                                                                                                                           iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1720                                                                                                                                                                                                                           list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.\
1721                                                                                                                                                                                                                           list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.\
1722                                                                                                                                                                                                                           SliceSupportList.list.array[0]->sNSSAI.sST.size);
1723                                                                                                                                                                                                                   }
1724                                                                                                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1725                                                                                                                                                                                                                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1726                                                                                                                                                                                                                   list.array[0],sizeof(SliceSupportItem_t));
1727                                                                                                                                                                                                          }
1728                                                                                                                                                                                                    DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1729                                                                                                                                                                                                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1730                                                                                                                                                                                                     list.array,\
1731                                                                                                                                                                                                          modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1732                                                                                                                                                                                                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1733                                                                                                                                                                                                 }
1734                                                                                                                                                                                            for(i=0;i<extensionCnt;i++)
1735                                                                                                                                                                                                 {
1736                                                                                                                                                                                                     DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1737                                                                                                                                                                                                          array[0]->iE_Extensions->list.array[i],\
1738                                                                                                                                                                                                          sizeof(ServedPLMNs_ItemExtIEs_t ));
1739                                                                                                                                                                                                 }
1740                                                                                                                                                                                         }
1741                                                                                                                                                                                         else
1742                                                                                                                                                                                         {
1743                                                                                                                                                                                             for(i=0;i<idy2;i++)
1744                                                                                                                                                                                                  {
1745                                                                                                                                                                                                     DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1746                                                                                                                                                                                                           array[0]->iE_Extensions->list.array[i],\
1747                                                                                                                                                                                                           sizeof(ServedPLMNs_ItemExtIEs_t));
1748                                                                                                                                                                                                  }
1749                                                                                                                                                                                         }
1750                                                                                                                                                                               DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1751                                                                                                                                                                                    array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1752                                                                                                                                                                                         list.array[0]->iE_Extensions->list.size);
1753                                                                                                                                                                           }
1754                                                                                                                                                                      DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1755                                                                                                                                                                             array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1756                                                                                                                                                                  }
1757                                                                                                                                                DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1758                                                                                                                                                     array[0]->pLMN_Identity.buf,
1759                                                                                                                                                          modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity.size);
1760                                                                                                                                                 }
1761                                                       for(i=0;i<idy1;i++)
1762                                                                                                                                                 {
1763                                                                                                                                                    DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1764                                                                                                                                                         sizeof(ServedPLMNs_Item_t));
1765                                                                                                                                                 }
1766                                                                                                                                   }
1767                                                                                                                                   else
1768                                                                                                                                   {
1769                                                                                                                                      for(i=0;i<idy1;i++)
1770                                                                                                                                           {
1771                                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1772                                                                                                                                                   sizeof(ServedPLMNs_Item_t));
1773                                                                                                                                           }
1774                                                                                                                                   }
1775                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1776                                                                                                                                   modifyItem->served_Cell_Information.servedPLMNs.list.size);
1777                                                                                                                          }
1778                                                                                                                DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1779                                                                                                                           modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);               
1780                                                                                                           }
1781                                                                                                     DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1782                                                                                                           modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1783                                                                                                 }
1784                                                                                      DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1785                                                                                              modifyItem->oldNRCGI.nRCellIdentity.size);
1786                                }
1787                                                                             DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1788                                                                                   modifyItem->oldNRCGI.pLMN_Identity.size);
1789                                                                         }
1790                                                                          for(int iy=0; iy<modifyCnt ;iy++)
1791                                                                          {
1792                                                                             DU_FREE(cellsToModify->list.array[iy],\
1793                                                                                   sizeof(Served_Cells_To_Modify_ItemIEs_t));
1794                                                                          }
1795                                                           }
1796                                                           else
1797                                                           {
1798                                                              for(int iy=0; iy<idy ;iy++)
1799                                                                   {
1800                                                                      DU_FREE(cellsToModify->list.array[iy],\
1801                                                                            sizeof(Served_Cells_To_Modify_ItemIEs_t));
1802                                                                   }     
1803                                                           }
1804                                                      DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1805                                                  }
1806                                             for(i=0;i<elementCnt;i++)
1807                                                  {
1808                                                DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1809                                                            sizeof(GNBDUConfigurationUpdateIEs_t));
1810                                                  }
1811                                         }
1812                                         else
1813                                         {
1814                                            for(i=0;i<idx;i++)
1815                                                 {
1816                                                    DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1817                                                          sizeof(GNBDUConfigurationUpdateIEs_t));
1818                                                 }
1819                                         }
1820                DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1821                           }
1822                            DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1823                  }
1824                   DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1825         }
1826    if(checkvar==true)
1827       return ROK;
1828         else 
1829            return RFAILED;
1830 }/* End of BuildAndSendDUConfigUpdate */
1831
1832 /*******************************************************************
1833  *
1834  * @brief Builds and sends the ULRRCMessageTransfer 
1835  *
1836  * @details
1837  *
1838  *    Function : BuildAndSendULRRCMessageTransfer
1839  *
1840  *    Functionality: Constructs the UL RRC Message Transfer and sends
1841  *                   it to the CU through SCTP.
1842  *
1843  * @params[in] 
1844  *
1845  * @return ROK     - success
1846  *         RFAILED - failure
1847  *
1848  * ****************************************************************/
1849 S16 BuildAndSendULRRCMessageTransfer()
1850 {
1851         U8   elementCnt;
1852         U8   idx1;
1853         U8   idx;
1854         F1AP_PDU_t                              *f1apMsg = NULL;
1855    ULRRCMessageTransfer_t       *ulRRCMsg;
1856         asn_enc_rval_t                          encRetVal;        /* Encoder return value */
1857    bool checkvar=false;
1858         while(1)
1859         {
1860            DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1861
1862            DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1863            if(f1apMsg == NULLP)
1864            {
1865                    DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1866                         break;
1867            }
1868
1869            f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1870         DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1871            if(f1apMsg->choice.initiatingMessage == NULLP)
1872            {
1873                    DU_LOG(" F1AP : Memory allocation for        F1AP-PDU failed");
1874                         break;
1875            }
1876         f1apMsg->choice.initiatingMessage->procedureCode = \
1877                                                                                                 ProcedureCode_id_ULRRCMessageTransfer;
1878            f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1879            f1apMsg->choice.initiatingMessage->value.present = \
1880                                                                 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1881            ulRRCMsg =
1882                     &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1883            elementCnt = 3;
1884         ulRRCMsg->protocolIEs.list.count = elementCnt;
1885            ulRRCMsg->protocolIEs.list.size = \
1886                                                                         elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
1887
1888             /* Initialize the F1Setup members */
1889            DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
1890            if(ulRRCMsg->protocolIEs.list.array == NULLP)
1891            {
1892                     DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
1893                          break;
1894         }
1895            for(idx=0; idx<elementCnt; idx++)
1896            {
1897                    DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
1898                 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
1899                    {
1900                            break;
1901                    }
1902            }
1903
1904            idx1 = 0;
1905
1906             /*GNB CU UE F1AP ID*/
1907            ulRRCMsg->protocolIEs.list.array[idx1]->id   = \
1908                                                                                  ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1909            ulRRCMsg->protocolIEs.list.array[idx1]->criticality  =       Criticality_reject;
1910            ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1911                                 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1912         ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1913
1914            /*GNB DU UE F1AP ID*/
1915            idx1++;
1916         ulRRCMsg->protocolIEs.list.array[idx1]->id      = \
1917                                                                                  ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1918            ulRRCMsg->protocolIEs.list.array[idx1]->criticality  =       Criticality_reject;
1919            ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1920                                 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1921            ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1922
1923            /*SRBID*/
1924            idx1++;
1925            ulRRCMsg->protocolIEs.list.array[idx1]->id   = \
1926                                                                                                                  ProtocolIE_ID_id_SRBID;
1927            ulRRCMsg->protocolIEs.list.array[idx1]->criticality  =       Criticality_reject;
1928            ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
1929                                                                 ULRRCMessageTransferIEs__value_PR_SRBID;
1930            ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = UL_SRBID;
1931
1932            /*RRCContainer*/
1933            //YET TO FILL
1934
1935            xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1936
1937            /* Encode the F1SetupRequest type as APER */
1938            cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1939            encBufSize = 0;
1940            encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1941                         encBuf);
1942            /* Encode results */
1943            if(encRetVal.encoded == ENCODE_FAIL)
1944            {
1945                      DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
1946                                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1947                           break;
1948            }
1949            else
1950            {
1951                     DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
1952                     for(int i=0; i< encBufSize; i++)
1953                     {
1954                              printf("%x",encBuf[i]);
1955                     }
1956            }
1957
1958            /* Sending  msg  */
1959            if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL)    !=      ROK)
1960            {
1961                     DU_LOG("\n F1AP : Sending   UL RRC Message Transfer Failed");
1962                          break;
1963                 }
1964       checkvar=true;
1965                 break;
1966         }
1967
1968         if(f1apMsg != NULLP)
1969         {
1970            if(f1apMsg->choice.initiatingMessage != NULLP) 
1971            {
1972                    if(ulRRCMsg->protocolIEs.list.array != NULLP)
1973                         {
1974                                  for(idx1=0;idx1<idx;idx1++)
1975                                  {
1976                                       if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
1977                                           {
1978                                                   DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
1979                                           }
1980                                  }
1981                             DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size ); 
1982                         }
1983                    DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1984                 }
1985            DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1986         }
1987
1988         if(checkvar==true)
1989       return ROK;
1990         else
1991            return RFAILED;
1992 }/* End of BuildAndSendULRRCMessageTransfer*/
1993
1994 /*******************************************************************
1995 *
1996 * @brief Builds tag config 
1997 *
1998 * @details
1999 *
2000 *    Function : BuildTagConfig 
2001 *
2002 *    Functionality: Builds tag config in MacCellGroupConfig
2003 *
2004 * @params[in] TAG_Config *tag_Config
2005 *
2006 * @return ROK     - success
2007 *         RFAILED - failure
2008 *
2009 * ****************************************************************/
2010 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2011 {
2012         struct TAG_Config__tag_ToAddModList *tagList;
2013    uint8_t                     idx, elementCnt;
2014
2015    tagConfig->tag_ToAddModList = NULLP;
2016    DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2017         if(!tagConfig->tag_ToAddModList)
2018         {
2019                 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2020                 return RFAILED;
2021         }
2022
2023         elementCnt = 1; //ODU_VALUE_ONE;
2024         tagList = tagConfig->tag_ToAddModList;
2025         tagList->list.count = elementCnt;
2026         tagList->list.size  =  elementCnt * sizeof(struct TAG);
2027
2028    tagList->list.array = NULLP;
2029         DU_ALLOC(tagList->list.array, tagList->list.size);
2030         if(!tagList->list.array)
2031         {
2032                 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2033                 return RFAILED;
2034         }
2035
2036         for(idx=0; idx<tagList->list.count; idx++)
2037         {
2038            tagList->list.array[idx] = NULLP;
2039                 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2040                 if(!tagList->list.array[idx])
2041                 {
2042                         DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2043                         return RFAILED;
2044                 }
2045         }
2046
2047         idx = 0;
2048         tagList->list.array[idx]->tag_Id = TAG_ID;
2049         tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2050
2051    return ROK;
2052 }
2053
2054 /*******************************************************************
2055 *
2056 * @brief Builds PHR Config 
2057 *
2058 * @details
2059 *
2060 *    Function : BuildPhrConfig
2061 *
2062 *    Functionality: Builds phrConfig in MacCellGroupConfig
2063 *
2064 * @params[in] PHR Config *
2065 *
2066 * @return ROK     - success
2067 *         RFAILED - failure
2068 *
2069 * ****************************************************************/
2070 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2071 {
2072
2073    phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2074         phrConfig->choice.setup = NULLP;
2075         DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2076         if(!phrConfig->choice.setup)
2077         {
2078                 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2079                 return RFAILED;
2080         }
2081
2082         phrConfig->choice.setup->phr_PeriodicTimer        = PHR_PERIODIC_TMR;
2083         phrConfig->choice.setup->phr_ProhibitTimer        = PHR_PROHIBHIT_TMR;
2084    phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2085         phrConfig->choice.setup->multiplePHR              = false;
2086         phrConfig->choice.setup->dummy                    = false;
2087         phrConfig->choice.setup->phr_Type2OtherCell       = false;
2088         phrConfig->choice.setup->phr_ModeOtherCG          = PHR_MODE_OTHER_CG;
2089
2090         return ROK;
2091 }
2092
2093 /*******************************************************************
2094 *
2095 * @brief Builds BSR Config 
2096 *
2097 * @details
2098 *
2099 *    Function : BuildBsrConfig
2100 *
2101 *    Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2102 *
2103 * @params[in] BSR_Config *bsrConfig
2104 *
2105 * @return ROK     - success
2106 *         RFAILED - failure
2107 *
2108 * ****************************************************************/
2109 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2110 {
2111    bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2112         bsrConfig->retxBSR_Timer     = RETX_BSR_TMR;
2113
2114    return ROK;
2115 }
2116
2117 /*******************************************************************
2118 *
2119 * @brief Builds scheduling request config 
2120 *
2121 * @details
2122 *
2123 *    Function : BuildSchedulingReqConfig 
2124 *
2125 *    Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2126 *
2127 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2128 *
2129 * @return ROK     - success
2130 *         RFAILED - failure
2131 *
2132 * ****************************************************************/
2133 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2134 {
2135         struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2136    uint8_t                     idx, elementCnt;
2137
2138    schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2139         DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2140                         sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2141         if(!schedulingRequestConfig->schedulingRequestToAddModList)
2142         {
2143                 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2144                 return RFAILED;
2145         }
2146
2147         elementCnt = 1; //ODU_VALUE_ONE;
2148         schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2149         schReqList->list.count = elementCnt;
2150         schReqList->list.size  =  elementCnt * sizeof(SchedulingRequestId_t);
2151
2152    schReqList->list.array = NULLP;
2153    DU_ALLOC(schReqList->list.array, schReqList->list.size);
2154         if(!schReqList->list.array)
2155         {
2156                 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2157                 return RFAILED;
2158         }
2159
2160    for(idx=0;idx<schReqList->list.count; idx++)
2161         {
2162            schReqList->list.array[idx] = NULLP;
2163       DU_ALLOC(schReqList->list.array[idx], sizeof(SchedulingRequestId_t));
2164                 if(!schReqList->list.array[idx])
2165                 {
2166                         DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2167                         return RFAILED;
2168                 }
2169         }
2170
2171         idx = 0;
2172         schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2173
2174    schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2175         DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2176         if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2177         {
2178                 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2179                 return RFAILED;
2180         }
2181    *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2182
2183         schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2184
2185         return ROK;
2186 }
2187
2188 /*******************************************************************
2189 *
2190 * @brief Builds RLC Config
2191 *
2192 * @details
2193 *
2194 *    Function : BuildRlcConfig
2195 *
2196 *    Functionality: Builds RLC Config in BuildRlcBearerToAddModList 
2197 *
2198 * @params[in] RLC_Config *rlcConfig
2199 *
2200 * @return ROK     - success
2201 *         RFAILED - failure
2202 *
2203 * ****************************************************************/
2204 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2205 {
2206
2207    rlcConfig->present = RLC_Config_PR_am;
2208
2209    rlcConfig->choice.am = NULLP;
2210    DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2211         if(!rlcConfig->choice.am)
2212         {
2213                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2214                 return RFAILED;
2215         }
2216
2217    /* UL */
2218         rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2219    DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2220         if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2221         {
2222                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2223                 return RFAILED;
2224         }
2225    *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2226         rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit  = T_POLL_RETRANSMIT;
2227         rlcConfig->choice.am->ul_AM_RLC.pollPDU           = POLL_PDU;
2228         rlcConfig->choice.am->ul_AM_RLC.pollByte          = POLL_BYTE;
2229         rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold  = MAX_RETX_THRESHOLD;
2230
2231    /* DL */
2232         rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2233    DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
2234         if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2235         {
2236                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2237                 return RFAILED;
2238         }
2239         *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2240    rlcConfig->choice.am->dl_AM_RLC.t_Reassembly      = T_REASSEMBLY;
2241         rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit  = T_STATUS_PROHIBHIT;
2242
2243    return ROK;
2244 }
2245
2246 /*******************************************************************
2247 *
2248 * @brief Builds MAC LC Config
2249 *
2250 * @details
2251 *
2252 *    Function : BuildMacLCConfig 
2253 *
2254 *    Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList 
2255 *
2256 * @params[in] struct LogicalChannelConfig macLcConfig
2257 *
2258 * @return ROK     - success
2259 *         RFAILED - failure
2260 *
2261 * ****************************************************************/
2262 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2263 {
2264
2265    macLcConfig->ul_SpecificParameters = NULLP;
2266    DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2267         if(!macLcConfig->ul_SpecificParameters)
2268         {
2269                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2270                 return RFAILED;
2271         }
2272
2273    macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2274         macLcConfig->ul_SpecificParameters->prioritisedBitRate =        PRIORTISIED_BIT_RATE;
2275         macLcConfig->ul_SpecificParameters->bucketSizeDuration =        BUCKET_SIZE_DURATION;
2276
2277    macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2278    DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup,    sizeof(long));
2279    if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2280         {
2281                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2282                 return RFAILED;
2283         }
2284    *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2285
2286    macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2287         DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID,       sizeof(SchedulingRequestId_t));
2288         if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2289         {
2290                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2291                 return RFAILED;
2292         }
2293    *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2294
2295         macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2296         macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2297
2298    return ROK;
2299 }
2300
2301 /*******************************************************************
2302 *
2303 * @brief Builds RLC Bearer to Add/Mod list
2304 *
2305 * @details
2306 *
2307 *    Function :BuildRlcBearerToAddModList 
2308 *
2309 *    Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2310 *
2311 * @params[in] rlc_BearerToAddModList
2312 *
2313 * @return ROK     - success
2314 *         RFAILED - failure
2315 *
2316 * ****************************************************************/
2317 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2318 {
2319    uint8_t                     idx, elementCnt;
2320
2321    elementCnt = 1;
2322    rlcBearerList->list.count = elementCnt;
2323         rlcBearerList->list.size  = elementCnt * sizeof(struct RLC_BearerConfig);
2324
2325    rlcBearerList->list.array = NULLP;
2326         DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2327         if(!rlcBearerList->list.array)
2328         {
2329                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2330                 return RFAILED;
2331         }
2332
2333    for(idx=0; idx<rlcBearerList->list.count; idx++)
2334         {
2335            rlcBearerList->list.array[idx] = NULLP;
2336                 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2337                 if(!rlcBearerList->list.array[idx])
2338                 {
2339                         DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2340                         return RFAILED;
2341                 }
2342         }
2343
2344    idx = 0;
2345         rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
2346
2347         DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2348         if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2349         {
2350                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2351                 return RFAILED;
2352         }
2353
2354         rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2355    rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
2356
2357    rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2358    DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2359         if(!rlcBearerList->list.array[idx]->rlc_Config)
2360         {
2361                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2362                 return RFAILED;
2363         }
2364
2365    if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2366         {
2367                 DU_LOG("\nF1AP : BuildRlcConfig failed");
2368                 return RFAILED;
2369         }
2370
2371    rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2372    DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2373         if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2374         {
2375                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2376                 return RFAILED;
2377         }
2378
2379         if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2380         {
2381                 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2382                 return RFAILED;
2383         }
2384
2385         return ROK;
2386 }
2387
2388 /*******************************************************************
2389  *
2390  * @brief Builds intitial DL BWP
2391  * @details
2392  *
2393  *    Function : BuildInitialDlBWP 
2394  *
2395  *    Functionality: Builds intitial DL BWP in spCellCfgDed
2396  *
2397  * @params[in] BWP_DownlinkDedicated_t *dlBwp
2398  *
2399  * @return ROK     - success
2400  *         RFAILED - failure
2401  *
2402  * ****************************************************************/
2403 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
2404 {
2405
2406    return ROK;
2407 }
2408
2409 /*******************************************************************
2410  *
2411  * @brief Builds UL config
2412  * @details
2413  *
2414  *    Function : BuildUlCfg 
2415  *
2416  *    Functionality: Builds UL config in spCellCfgDed
2417  *
2418  * @params[in] UplinkConfig_t *ulCfg
2419  *
2420  * @return ROK     - success
2421  *         RFAILED - failure
2422  *
2423  * ****************************************************************/
2424 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
2425 {
2426
2427    return ROK;
2428 }
2429
2430 /*******************************************************************
2431  *
2432  * @brief Builds PDSCH serving cell config
2433  * @details
2434  *
2435  *    Function : BuildPdschSrvCellCfg
2436  *
2437  *    Functionality: Builds PDSCH serving cell config in spCellCfgDed
2438  *
2439  * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg 
2440  *
2441  * @return ROK     - success
2442  *         RFAILED - failure
2443  *
2444  * ****************************************************************/
2445 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
2446 {
2447
2448    return ROK;
2449 }
2450
2451 /*******************************************************************
2452  *
2453  * @brief Builds CSI Meas config
2454  * @details
2455  *
2456  *    Function : BuildCsiMeasCfg 
2457  *
2458  *    Functionality: Builds CSI Meas config in spCellCfgDed
2459  *
2460  * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
2461  *
2462  * @return ROK     - success
2463  *         RFAILED - failure
2464  *
2465  * ****************************************************************/
2466 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
2467 {
2468
2469    return ROK;
2470 }
2471
2472 /*******************************************************************
2473  *
2474  * @brief Builds Spcell config dedicated
2475  * @details
2476  *
2477  *    Function : BuildSpCellCfgDed
2478  *
2479  *    Functionality: Builds sp cell config dedicated in spCellCfg
2480  *
2481  * @params[in] ServingCellConfig_t srvCellCfg
2482  *
2483  * @return ROK     - success
2484  *         RFAILED - failure
2485  *
2486  * ****************************************************************/
2487 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
2488 {
2489
2490    srvCellCfg->initialDownlinkBWP = NULLP;
2491    DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2492         if(!srvCellCfg->initialDownlinkBWP)
2493         {
2494                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2495                 return RFAILED;
2496         }
2497
2498    if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
2499         {
2500                 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
2501                 return RFAILED;
2502         }
2503
2504    srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
2505         DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2506         if(!srvCellCfg->firstActiveDownlinkBWP_Id)
2507         {
2508                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2509                 return RFAILED;
2510         }
2511         *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2512
2513    srvCellCfg->defaultDownlinkBWP_Id = NULLP;
2514         DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2515         if(!srvCellCfg->defaultDownlinkBWP_Id)
2516         {
2517                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2518                 return RFAILED;
2519         }
2520         *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2521
2522    srvCellCfg->uplinkConfig = NULLP;
2523    DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2524         if(!srvCellCfg->uplinkConfig)
2525         {
2526                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2527                 return RFAILED;
2528         }
2529
2530    if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
2531         {
2532                 DU_LOG("\nF1AP : BuildUlCfg failed");
2533                 return RFAILED;
2534         }
2535
2536    srvCellCfg->pdsch_ServingCellConfig = NULLP;
2537         DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct     ServingCellConfig__pdsch_ServingCellConfig));
2538         if(!srvCellCfg->pdsch_ServingCellConfig)
2539         {
2540                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2541                 return RFAILED;
2542         }
2543
2544    if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
2545         {
2546                 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
2547                 return RFAILED;
2548         }
2549
2550    srvCellCfg->csi_MeasConfig = NULLP;
2551         DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct      ServingCellConfig__csi_MeasConfig))
2552         if(!srvCellCfg->csi_MeasConfig)
2553         {
2554                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2555                 return RFAILED;
2556         }
2557
2558    if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
2559         {
2560                 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
2561                 return RFAILED;
2562         }
2563
2564         srvCellCfg->tag_Id = TAG_ID;
2565
2566         return ROK;
2567 }
2568 /*******************************************************************
2569  *
2570  * @brief Builds Spcell config 
2571  *
2572  * @details
2573  *
2574  *    Function : BuildSpCellCfg 
2575  *
2576  *    Functionality: Builds sp cell config in DuToCuRrcContainer
2577  *
2578  * @params[in] SpCellConfig_t spCellCfg
2579  *
2580  * @return ROK     - success
2581  *         RFAILED - failure
2582  *
2583  * ****************************************************************/
2584 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
2585 {
2586
2587    spCellCfg->servCellIndex = NULLP;
2588         DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
2589         if(!spCellCfg->servCellIndex)
2590         {
2591                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2592                 return RFAILED;
2593         }
2594    *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
2595
2596    spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
2597         DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2598         if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
2599         {
2600                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2601                 return RFAILED;
2602         }
2603    *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
2604
2605    spCellCfg->spCellConfigDedicated = NULLP;
2606    DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2607         if(!spCellCfg->spCellConfigDedicated)
2608         {
2609                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2610                 return RFAILED;
2611         }
2612
2613    if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
2614         {
2615                 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
2616                 return RFAILED;
2617         }
2618
2619         return ROK;
2620 }
2621 /*******************************************************************
2622 *
2623 * @brief Builds Phy cell group config 
2624 *
2625 * @details
2626 *
2627 *    Function : BuildPhyCellGrpCfg 
2628 *
2629 *    Functionality: Builds Phy cell group config in DuToCuRrcContainer
2630 *
2631 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg 
2632 *
2633 * @return ROK     - success
2634 *         RFAILED - failure
2635 *
2636 * ****************************************************************/
2637 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
2638 {
2639    phyCellGrpCfg->p_NR_FR1 = NULLP;
2640         DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2641         if(!phyCellGrpCfg->p_NR_FR1)
2642         {
2643                 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
2644                 return RFAILED;
2645         }
2646    *(phyCellGrpCfg->p_NR_FR1)             = P_NR_FR1;
2647         phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
2648
2649         return ROK;
2650 }
2651 /*******************************************************************
2652 *
2653 * @brief Builds Mac cell group config 
2654 *
2655 * @details
2656 *
2657 *    Function : BuildMacCellGrpCfg 
2658 *
2659 *    Functionality: Builds Mac cell group config in DuToCuRrcContainer
2660 *
2661 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
2662 *
2663 * @return ROK     - success
2664 *         RFAILED - failure
2665 *
2666 * ****************************************************************/
2667 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
2668 {
2669
2670    macCellGrpCfg->schedulingRequestConfig = NULLP;
2671         DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2672         if(!macCellGrpCfg->schedulingRequestConfig)
2673         {
2674                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2675                 return RFAILED;
2676         }
2677
2678         if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
2679         {
2680            DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
2681                 return RFAILED;
2682         }
2683
2684    macCellGrpCfg->bsr_Config = NULLP;
2685    DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2686         if(!macCellGrpCfg->bsr_Config)
2687         {
2688                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2689                 return RFAILED;
2690         }
2691
2692    if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
2693         {
2694       DU_LOG("\nF1AP : BuildBsrConfig failed");
2695            return RFAILED;
2696         }
2697
2698    macCellGrpCfg->tag_Config = NULLP;
2699    DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
2700         if(!macCellGrpCfg->tag_Config)
2701         {
2702                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2703                 return RFAILED;
2704         }
2705
2706    if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
2707         {
2708            DU_LOG("\nF1AP : BuildTagConfig failed");
2709            return RFAILED;
2710    }
2711
2712    macCellGrpCfg->phr_Config = NULLP;
2713    DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
2714         if(!macCellGrpCfg->phr_Config)
2715         {
2716                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2717                 return RFAILED;
2718         }
2719
2720    if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
2721         {
2722            DU_LOG("\nF1AP : BuildPhrConfig failed");
2723            return RFAILED;
2724    }
2725
2726    macCellGrpCfg->skipUplinkTxDynamic = false;
2727
2728         return ROK;
2729 }
2730
2731 /*******************************************************************
2732  *
2733  * @brief Frees emmory allocated for DUToCURRCContainer 
2734  *
2735  * @details
2736  *
2737  *    Function : FreeMemDuToCuRrcCont
2738  *
2739  *    Functionality: Builds DuToCuRrcContainer
2740  *
2741  * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
2742  *
2743  * @return ROK     - success
2744  *         RFAILED - failure
2745  *
2746 * ****************************************************************/
2747 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
2748 {
2749    uint8_t idx;
2750         struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList;
2751         struct RLC_Config *rlcConfig;
2752         struct LogicalChannelConfig *macLcConfig;
2753         MAC_CellGroupConfig_t *macCellGrpCfg;
2754         struct SchedulingRequestConfig *schedulingRequestConfig;
2755         struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2756         struct TAG_Config *tagConfig;
2757         struct TAG_Config__tag_ToAddModList *tagList;
2758         struct MAC_CellGroupConfig__phr_Config *phrConfig;
2759         PhysicalCellGroupConfig_t *phyCellGrpCfg;
2760         SpCellConfig_t *spCellCfg;
2761         ServingCellConfig_t *srvCellCfg;
2762
2763         rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
2764         if(rlcBearerList)
2765         {
2766                 if(rlcBearerList->list.array)
2767                 {
2768                         for(idx=0; idx<rlcBearerList->list.count; idx++)
2769                         {
2770                                 rlcConfig   = rlcBearerList->list.array[idx]->rlc_Config;
2771                                 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
2772                                 DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2773                                 DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
2774                                 DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2775                                 DU_FREE(rlcConfig, sizeof(struct RLC_Config));
2776                                 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2777                                 DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID,        sizeof(SchedulingRequestId_t));
2778                                 DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup,        sizeof(long));
2779                                 DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2780                                 DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2781                                 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2782                         }
2783                         DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
2784                 }
2785                 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2786         }
2787
2788         macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
2789         if(macCellGrpCfg)
2790         {
2791                 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; 
2792                 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2793
2794                 for(idx=0;idx<schReqList->list.count; idx++)
2795                 {
2796                         DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2797                         DU_FREE(schReqList->list.array[idx], sizeof(SchedulingRequestId_t));
2798                 }
2799                 DU_FREE(schReqList->list.array, schReqList->list.size);
2800                 DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
2801                                 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2802                 DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2803
2804                 DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2805
2806                 tagConfig = macCellGrpCfg->tag_Config;
2807                 tagList = tagConfig->tag_ToAddModList;
2808                 for(idx=0; idx<tagList->list.count; idx++)
2809                 {
2810                         DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
2811                 }
2812                 DU_FREE(tagList->list.array, tagList->list.size);
2813                 DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2814                 DU_FREE(tagConfig, sizeof(struct TAG_Config));
2815
2816                 phrConfig = macCellGrpCfg->phr_Config;
2817                 DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
2818                 DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
2819
2820                 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
2821         }
2822
2823         phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
2824         if(phyCellGrpCfg)
2825         {
2826                 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2827                 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
2828
2829         }
2830
2831         spCellCfg = cellGrpCfg->spCellConfig;
2832         if(spCellCfg)
2833         {
2834                 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
2835                 DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2836
2837                 srvCellCfg = spCellCfg->spCellConfigDedicated;
2838
2839                 DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2840
2841                 DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2842                 DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2843
2844
2845                 DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2846
2847
2848                 DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct      ServingCellConfig__pdsch_ServingCellConfig));
2849
2850
2851                 DU_FREE(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig));
2852
2853                 DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2854                 DU_FREE(spCellCfg, sizeof(SpCellConfig_t));
2855         }
2856
2857         return ROK;
2858 }
2859 /*******************************************************************
2860  *
2861  * @brief Builds DU To CU RRC Container 
2862  *
2863  * @details
2864  *
2865  *    Function : BuildDuToCuRrcContainer 
2866  *
2867  *    Functionality: Builds DuToCuRrcContainer
2868  *
2869  * @params[in] idx, index in F1AP msg
2870  *             DuToCuRRCContainer, DuToCuRRCContainer
2871  *
2872  * @return ROK     - success
2873  *         RFAILED - failure
2874  *
2875  * ****************************************************************/
2876 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
2877 {
2878         CellGroupConfigRrc_t  cellGrpCfg;
2879         asn_enc_rval_t        encRetVal;
2880
2881
2882         while(1)
2883         {
2884                 duToCuRrcContainer     = NULLP;
2885                 cellGrpCfg.cellGroupId = CELL_GRP_ID;
2886
2887                 cellGrpCfg.rlc_BearerToAddModList = NULLP;
2888                 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2889                 if(!cellGrpCfg.rlc_BearerToAddModList)
2890                 {
2891                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2892                         break;
2893                 }
2894                 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
2895                 {
2896                         DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
2897                         break;
2898                 }
2899
2900        cellGrpCfg.rlc_BearerToReleaseList = NULLP;
2901                 cellGrpCfg.mac_CellGroupConfig = NULLP;
2902                 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
2903                 if(!cellGrpCfg.mac_CellGroupConfig)
2904                 {
2905                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2906                         break;
2907                 }
2908                 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
2909                 {
2910                         DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
2911                         break;
2912                 }
2913
2914
2915                 cellGrpCfg.physicalCellGroupConfig = NULLP;
2916                 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
2917                 if(!cellGrpCfg.physicalCellGroupConfig)
2918                 {
2919                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2920                         break;
2921                 }
2922                 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
2923                 {
2924                         DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
2925                         break;
2926                 }
2927
2928                 cellGrpCfg.spCellConfig = NULLP;
2929                 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
2930                 if(!cellGrpCfg.spCellConfig)
2931                 {
2932                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2933                         break;
2934                 }
2935                 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
2936                 {
2937                         DU_LOG("\nF1AP : BuildSpCellCfg failed");
2938                         break;
2939                 }
2940
2941                 /* encode cellGrpCfg into duToCuRrcContainer */
2942                 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
2943                 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
2944                 encBufSize = 0;
2945                 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
2946                 /* Encode results */
2947                 if(encRetVal.encoded == ENCODE_FAIL)
2948                 {
2949                         DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
2950                                         encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2951                         break;
2952                 }
2953                 else
2954                 {
2955                         DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
2956                         for(int i=0; i< encBufSize; i++)
2957                         {
2958                                 printf("%x",encBuf[i]);
2959                         }
2960                 }
2961
2962                 memcpy(duToCuRrcContainer, encBuf, encBufSize);
2963                 break;
2964         }
2965         FreeMemDuToCuRrcCont(&cellGrpCfg);
2966         return ROK;
2967 }
2968
2969 /*******************************************************************
2970  *
2971  * @brief Builds and sends the InitialULRRCMessage 
2972  *
2973  * @details
2974  *
2975  *    Function : BuildAndSendInitialRrcMsgTransfer 
2976  *
2977  *    Functionality: Constructs the Initial UL RRC Message Transfer and sends
2978  *                   it to the CU through SCTP.
2979  *
2980  * @params[in] 
2981  *
2982  * @return ROK     - success
2983  *         RFAILED - failure
2984  *
2985  * ****************************************************************/
2986 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
2987                 uint8_t *rrcContainer)
2988 {
2989    S16  ret;
2990         U8   elementCnt;
2991    U8   ieId;
2992         U8   idx;
2993         U8   idx1;
2994         F1AP_PDU_t  *f1apMsg = NULLP;
2995         InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
2996    asn_enc_rval_t                encRetVal;
2997         bool  checkvar=false;
2998         while(1)
2999         {
3000              DU_LOG("\n F1AP : Building RRC Setup Request\n");
3001                   DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3002                   if(f1apMsg == NULLP)
3003                   {
3004                       DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3005                            break;
3006                   }
3007                   f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
3008                   DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3009                   if(f1apMsg->choice.initiatingMessage == NULLP)
3010                   {
3011                      DU_LOG(" F1AP : Memory allocation for  F1AP-PDU failed");
3012                           break;
3013                   }
3014                   f1apMsg->choice.initiatingMessage->procedureCode =\
3015                          ProcedureCode_id_InitialULRRCMessageTransfer;
3016                   f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
3017                   f1apMsg->choice.initiatingMessage->value.present = \
3018                          InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
3019                   initULRRCMsg =\
3020                          &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
3021         elementCnt = 3;
3022                   initULRRCMsg->protocolIEs.list.count = elementCnt;
3023                   initULRRCMsg->protocolIEs.list.size = \
3024                          elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
3025                   /* Initialize the F1Setup members */
3026                    DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3027                    if(initULRRCMsg->protocolIEs.list.array == NULLP)
3028                    {
3029                       DU_LOG(" F1AP : Memory allocation for\
3030                                 RRCSetupRequestMessageTransferIEs failed");
3031                                 break;
3032                    }
3033                    for(idx=0; idx<elementCnt; idx++)
3034               {
3035                            DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
3036                                  sizeof(InitialULRRCMessageTransferIEs_t));
3037                                  if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
3038                                  {
3039                                      break;
3040                                  }
3041                    }
3042                    idx1 = 0;
3043                    /*GNB DU UE F1AP ID*/
3044                    initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3045                                       ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
3046                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality  = Criticality_reject;
3047                    initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3048                                       InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
3049                    initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
3050
3051
3052                         /*NRCGI*/
3053                         idx1++;
3054                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3055                                  ProtocolIE_ID_id_NRCGI;
3056                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality  =Criticality_reject;
3057                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3058                        InitialULRRCMessageTransferIEs__value_PR_NRCGI;
3059                    
3060                         ret =\
3061                         BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
3062               if(ret!=ROK)
3063                         {
3064                             break;
3065                         }
3066
3067                         /*CRNTI*/
3068                         idx1++;
3069                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3070                                        ProtocolIE_ID_id_C_RNTI;
3071                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3072                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3073                                  InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
3074                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
3075
3076          /*RRCContainer*/
3077                         idx1++;
3078                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3079                                        ProtocolIE_ID_id_RRCContainer;
3080                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3081                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3082                                  InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
3083                                                                 
3084                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size =\
3085                                                       strlen((const char*)rrcContainer);
3086          DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3087                                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3088                         if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3089                         {
3090                       DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
3091                                 break;
3092
3093                         }
3094          memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
3095                                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
3096
3097
3098                         /*DUtoCURRCContainer*/
3099                         idx1++;
3100                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3101                                        ProtocolIE_ID_id_DUtoCURRCContainer;
3102                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3103                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3104                                  InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
3105
3106                         BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
3107
3108                         xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3109                         /* Encode the F1SetupRequest type as APER */
3110                         cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3111                         encBufSize = 0;
3112                         encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
3113                         /* Encode results */
3114                         if(encRetVal.encoded == ENCODE_FAIL)
3115                         {
3116                             DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
3117                                  structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3118                                  break;
3119                         }
3120                         else
3121                         {
3122                             
3123                                   DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
3124                                   Message transfer\n");
3125                                    for(int i=0; i< encBufSize; i++)
3126                                         {
3127                                             printf("%x",encBuf[i]);
3128                                         }
3129                         }
3130                         /* Sending  msg  */
3131                         if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
3132                         {
3133                             DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
3134                                  break;
3135                         }
3136                         checkvar=true;
3137                         break;
3138         }
3139    
3140         if(f1apMsg != NULLP)
3141    {
3142             if(f1apMsg->choice.initiatingMessage != NULLP)
3143                  {
3144                      if(initULRRCMsg->protocolIEs.list.array != NULLP)
3145                           {
3146                          if(idx == elementCnt)
3147                               {
3148                                        idx1=1;
3149                                   if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
3150                                        {
3151                                            if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
3152                                                 {
3153                                                     DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
3154                                                          initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
3155                                                 }
3156                                                 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
3157                                                  initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
3158                                         }
3159
3160                                                   idx1=3;
3161                                                   if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3162                                                   {
3163                                                           DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3164                                                                           initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3165                                                   }
3166                                         for(ieId=0; ieId<elementCnt; ieId++)
3167                                         {
3168                                            DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3169                                         }
3170                                }
3171                                else
3172                                {
3173                                     for(ieId=0; ieId<idx; ieId++)
3174                                               {
3175                                                   DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3176                                               }
3177                                }
3178                                          DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3179                          }
3180                          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3181                  }
3182                  DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3183         }
3184         if(checkvar==true)
3185            return ROK;
3186         else
3187            return RFAILED;
3188 }/* End of BuildAndSendInitialRrcMsgTransfer*/
3189
3190 /*******************************************************************
3191  *
3192  * @brief Builds Special cell list for UE Setup Request 
3193  *
3194  * @details
3195  *
3196  *    Function : BuildSplCellList
3197  *
3198  *    Functionality: Constructs the Special Cell list for UESetReq
3199  *
3200  * @params[in] SCell_ToBeSetup_List_t *spCellLst
3201  *
3202  * @return ROK     - success
3203  *         RFAILED - failure
3204  *
3205  * ****************************************************************/
3206 S16 BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3207 {
3208         U8  cellCnt;
3209         U8  idx;
3210         S16 ret;
3211         cellCnt = 1;
3212         spCellLst->list.count = cellCnt;
3213         spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
3214         DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
3215         if(spCellLst->list.array == NULLP)
3216         {
3217                 return RFAILED;
3218         }
3219         for(idx=0; idx<cellCnt; idx++)
3220         {
3221                 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3222                 if(spCellLst->list.array[idx] == NULLP)
3223                 {
3224                         return RFAILED;
3225                 }
3226         }
3227         idx = 0;
3228         spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
3229         spCellLst->list.array[idx]->criticality = Criticality_ignore;
3230         spCellLst->list.array[idx]->value.present =\
3231                 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
3232         /* Special Cell ID -NRCGI */
3233         ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3234         if(ret != ROK)
3235         {
3236                 return RFAILED;
3237         }
3238         /*Special Cell Index*/
3239         spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
3240   return ROK;   
3241 }/* End of BuildSplCellList*/
3242
3243 /*******************************************************************
3244  *
3245  * @brief Builds SRBS to be setup 
3246  *
3247  * @details
3248  *
3249  *    Function : BuildSRBSetup
3250  *
3251  *    Functionality: Constructs the SRB's for UESetReq
3252  *
3253  * @params[in] SRBs_ToBeSetup_List_t *srbSet
3254  *
3255  * @return ROK     - success
3256  *         RFAILED - failure
3257  *
3258  * ****************************************************************/
3259 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3260 {
3261         U8 idx;
3262         U8 srbCnt;
3263         srbCnt = 1;
3264         srbSet->list.count = srbCnt;
3265         srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
3266         DU_ALLOC(srbSet->list.array,srbSet->list.size);
3267         if(srbSet->list.array == NULLP)
3268         {
3269                 return RFAILED;
3270         }
3271         for(idx=0; idx<srbCnt; idx++)
3272         {
3273                 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3274                 if(srbSet->list.array[idx] == NULLP)
3275            {
3276                    return RFAILED;
3277                 }
3278         }
3279         idx = 0;
3280         srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
3281         srbSet->list.array[idx]->criticality = Criticality_ignore;
3282         srbSet->list.array[idx]->value.present = \
3283                         SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
3284    srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
3285    return ROK;
3286 }/* End of BuildSRBSetup*/
3287
3288 /*******************************************************************
3289  *
3290  * @brief Builds QOS Info for DRB Setum Item 
3291  *
3292  * @details
3293  *
3294  *    Function : BuildQOSInfo
3295  *
3296  *    Functionality: Constructs the QOS Info for DRB Setup Item
3297  *
3298  * @params[in] QoSInformation_t *qosinfo
3299  *
3300  * @return ROK     - success
3301  *         RFAILED - failure
3302  *
3303  * ****************************************************************/
3304 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3305 {
3306         /* NonDynamic5QIDescriptor */
3307         drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
3308         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3309         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
3310         {
3311                 return RFAILED;
3312         }
3313         /*FiveQI*/
3314         drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
3315         /*AveragingWindow*/
3316         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3317                                                                                                 sizeof(AveragingWindow_t));
3318         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
3319                                                                                                                                                                                                         NULLP)
3320         {
3321                 return RFAILED;
3322         }
3323         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
3324         /*MaxDataBurstVolume*/
3325         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3326                                                                                                 sizeof(MaxDataBurstVolume_t));
3327         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
3328                                                                                                                                                                                                         NULLP)
3329         {
3330                 return RFAILED;
3331         }
3332         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
3333
3334         /*nRGRAN Allocation Retention Priority*/
3335         drbQos->nGRANallocationRetentionPriority.priorityLevel =        \
3336                                                                                                 PriorityLevel_highest;
3337         drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
3338                                                         Pre_emptionCapability_may_trigger_pre_emption;
3339         drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
3340                                                                 Pre_emptionVulnerability_not_pre_emptable;
3341
3342         /* TO DO: GBR_QoSFlowInformation */
3343         return ROK;
3344 }/*End of BuildQOSInfo*/
3345
3346 /*******************************************************************
3347  *
3348  * @brief Builds SNSSAI  
3349  *
3350  * @details
3351  *
3352  *    Function : BuildSNSSAI
3353  *
3354  *    Functionality: Constructs the SNSSAI For DRB list
3355  *
3356  * @params[in] SNSSAI_t *snssai
3357  *
3358  * @return ROK     - success
3359  *         RFAILED - failure
3360  *
3361  * ****************************************************************/
3362 S16 BuildSNSSAI(SNSSAI_t *snssai)
3363 {
3364         /*SNSSAI*/
3365           /*ssT*/
3366         snssai->sST.size = sizeof(U8);
3367         DU_ALLOC(snssai->sST.buf,snssai->sST.size);
3368         if(snssai->sST.buf == NULLP)
3369         {
3370                 return RFAILED;
3371         }
3372         snssai->sST.buf[0] = 3;
3373           /*sD*/
3374         DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
3375         if(snssai->sD == NULLP)
3376         {
3377                 return RFAILED;
3378         }
3379         snssai->sD->size = 3*sizeof(U8);
3380         DU_ALLOC(snssai->sD->buf,snssai->sD->size);
3381         if(snssai->sD->buf == NULLP)
3382         {
3383                 return RFAILED;
3384         }
3385                 snssai->sD->buf[0] = 3;
3386                 snssai->sD->buf[1] = 6;
3387                 snssai->sD->buf[2] = 9;
3388    return ROK;
3389 }/*End of BuildSNSSAI*/
3390
3391 /*******************************************************************
3392  *
3393  * @brief Builds the flow map.  
3394  *
3395  * @details
3396  *
3397  *    Function : BuildFlowsMap
3398  *
3399  *    Functionality: Constructs the flowmap For DRB list
3400  *
3401  * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
3402  *
3403  * @return ROK     - success
3404  *         RFAILED - failure
3405  *
3406  * ****************************************************************/
3407 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
3408 {
3409         S16 ret;
3410         U8  idx;
3411         U8 flowCnt;
3412         flowCnt = 1;
3413         flowMap->list.count = flowCnt;
3414         flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
3415         DU_ALLOC(flowMap->list.array,flowMap->list.size);
3416         if(flowMap->list.array == NULLP)
3417         {
3418                 return RFAILED;
3419         }
3420         for(idx=0; idx<flowCnt; idx++)
3421         {
3422                 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
3423                 if(flowMap->list.array[idx] == NULLP)
3424                 {
3425                    return RFAILED;
3426                 }
3427         }
3428         idx = 0;
3429         flowMap->list.array[idx]->qoSFlowIdentifier = 0;
3430         ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
3431         if(ret != ROK)
3432         {
3433                 return RFAILED;
3434         }
3435    return ROK;
3436 }/*End of BuildFlowsMap*/
3437
3438 /*******************************************************************
3439  *
3440  * @brief Builds the Uplink Tunnel Info  
3441  *
3442  * @details
3443  *
3444  *    Function : BuildULTnlInfo
3445  *
3446  *    Functionality: Constructs the UL TnlInfo For DRB list
3447  *
3448  * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3449  *
3450  * @return ROK     - success
3451  *         RFAILED - failure
3452  *
3453  * ****************************************************************/
3454 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3455 {
3456         U8 idx;
3457         U8 ulCnt;
3458         ulCnt = 1;
3459         ulInfo->list.count = ulCnt;
3460         ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
3461         DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
3462         if(ulInfo->list.array == NULLP)
3463         {
3464                 return RFAILED;
3465         }
3466         for(idx=0; idx<ulCnt; idx++)
3467         {
3468                 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3469                 if(ulInfo->list.array[idx] == NULLP)
3470                 {
3471                         return RFAILED;
3472                 }
3473         }
3474         idx = 0;
3475         ulInfo->list.array[idx]->uLUPTNLInformation.present = \
3476                                                                 UPTransportLayerInformation_PR_gTPTunnel;
3477         /*GTP TUNNEL*/
3478         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
3479                                 sizeof(GTPTunnel_t));
3480         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
3481         {
3482                 return RFAILED;
3483         }
3484         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3485                 transportLayerAddress.size      = 4*sizeof(U8);
3486    DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3487                 transportLayerAddress.buf,ulInfo->list.array[idx]->\
3488                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3489         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3490                 transportLayerAddress.buf == NULLP)
3491         {
3492                 return RFAILED;
3493         }
3494         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3495                 transportLayerAddress.buf[0] = 4;
3496         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3497                 transportLayerAddress.buf[1] = 4;
3498         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3499                 transportLayerAddress.buf[2] = 4;
3500         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3501                 transportLayerAddress.buf[3] = 5;
3502         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3503                 transportLayerAddress.bits_unused = 0;
3504         /*GTP TEID*/
3505         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
3506                                         = 4 * sizeof(U8);
3507         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3508                                 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
3509                                 gTPTunnel->gTP_TEID.size);
3510         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3511                                 == NULLP)
3512         {
3513                 return RFAILED;
3514         }
3515         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3516                 gTP_TEID.buf[0] = 11;
3517         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3518                 gTP_TEID.buf[1] = 0;
3519         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3520                 gTP_TEID.buf[2] = 0;
3521         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3522                 gTP_TEID.buf[3] = 1;
3523
3524    return ROK;
3525 }/*End of BuildULTnlInfo*/
3526
3527 /*******************************************************************
3528  *
3529  * @brief Builds DRBS to be setup 
3530  *
3531  * @details
3532  *
3533  *    Function : BuildDRBSetup
3534  *
3535  *    Functionality: Constructs the DRB's for UESetReq
3536  *
3537  * @params[in] DRBs_ToBeSetup_List_t *drbSet
3538  *
3539  * @return ROK     - success
3540  *         RFAILED - failure
3541  *
3542  * ****************************************************************/
3543 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3544 {
3545         S16 BuildQOSInforet;
3546         S16 BuildSNSSAIret;
3547         S16 BuildFlowsMapret;
3548         U8       idx;
3549         U8  drbCnt;
3550         DRBs_ToBeSetup_Item_t *drbSetItem;
3551         drbCnt = 1;
3552         drbSet->list.count = drbCnt;
3553         drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
3554         DU_ALLOC(drbSet->list.array,drbSet->list.size);
3555         if(drbSet->list.array == NULLP)
3556         {
3557                 return RFAILED;
3558         }
3559         for(idx=0; idx<drbCnt; idx++)
3560         {
3561                 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3562                 if(drbSet->list.array[idx] == NULLP)
3563                 {
3564                         return RFAILED;
3565                 }
3566         }
3567         idx = 0;
3568         drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
3569         drbSet->list.array[idx]->criticality = Criticality_ignore;
3570         drbSet->list.array[idx]->value.present = \
3571                         DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
3572    drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;     
3573         /*dRBID*/
3574         drbSetItem->dRBID = 1;  
3575         /*qoSInformation*/
3576         drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
3577         DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3578         if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
3579         {       
3580                 return RFAILED;
3581         }
3582         drbSetItem->qoSInformation.choice.choice_extension->id = \
3583                                                         ProtocolIE_ID_id_DRB_Information;
3584         drbSetItem->qoSInformation.choice.choice_extension->criticality = \
3585                                                         Criticality_ignore;
3586         drbSetItem->qoSInformation.choice.choice_extension->value.present = \
3587                                                         QoSInformation_ExtIEs__value_PR_DRB_Information;
3588         BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
3589                                                         choice_extension->value.choice.DRB_Information.dRB_QoS);
3590         if(BuildQOSInforet != ROK)
3591         {
3592                 return RFAILED;
3593         }
3594         /*SNSSAI*/
3595         BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
3596                                                         choice_extension->value.choice.DRB_Information.sNSSAI);
3597         if(BuildSNSSAIret != ROK)
3598         {       
3599                 return RFAILED;
3600         }
3601         /*Flows mapped to DRB List*/
3602         BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
3603                                 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
3604         if(BuildFlowsMapret != ROK)
3605         {
3606                 return RFAILED;
3607         }
3608         /*ULUPTNLInformation To Be Setup List*/
3609    BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3610         if(BuildULTnlInforet != ROK)
3611         {
3612                 return RFAILED;
3613         }
3614         /*RLCMode*/
3615         drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3616
3617         /*UL Configuration*/
3618         DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3619         if(drbSetItem->uLConfiguration == NULLP)
3620         {
3621            return RFAILED;
3622         }
3623         drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
3624         return ROK;
3625 }/* End of BuildDRBSetup*/
3626 /*******************************************************************
3627 *
3628 * @brief Deallocating memory of function BuildAndSendUESetReq
3629 *
3630 * @details
3631 *
3632 *    Function : FreeNrcgi
3633 *
3634 *    Functionality: Deallocating memory for function BuildNrcgi
3635 *
3636 * @params[in] NRCGI_t *nrcgi
3637 *
3638 * @return void
3639 *
3640 *******************************************************************/
3641 void FreeNrcgi(NRCGI_t *nrcgi)
3642 {
3643         if(nrcgi->pLMN_Identity.buf != NULLP)
3644         {
3645              if(nrcgi->nRCellIdentity.buf != NULLP)
3646              {
3647            DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size); 
3648                   }
3649              DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3650         }
3651 }
3652 /*******************************************************************
3653 *
3654 * @brief  Deallocating memory of function BuildAndSendUESetReq
3655 *
3656 * @details
3657 *
3658 *    Function : FreeSplCellList
3659 *
3660 *    Functionality: Deallocating memory for function BuildSplCellList
3661 *
3662 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3663 *
3664 * @return void
3665 *      
3666 *
3667 * *****************************************************************/
3668 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3669 {
3670     U8  cellidx;
3671     if(spCellLst->list.array != NULLP)
3672          {
3673               for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3674                         {
3675                             if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3676                                  {
3677                                     FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3678                                  }
3679                                  if(spCellLst->list.array[cellidx]!=NULLP)
3680                                  {
3681                                      DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3682                                  }
3683                         }
3684                         DU_FREE(spCellLst->list.array,spCellLst->list.size);
3685          }
3686 }
3687  /*******************************************************************
3688  *
3689  * @brief Deallocating memory of function BuildAndSendUESetReq
3690  *
3691  * @details
3692  *
3693  *    Function : FreeSRBSetup
3694  *
3695  *    Functionality: Deallocating memory for function BuildSRBSetup
3696  *
3697  * @params[in] SRBs_ToBeSetup_List_t *srbSet
3698  *
3699  * @return void
3700  *        
3701  *
3702  * ******************************************************************/
3703 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3704 {
3705     U8 srbidx;
3706          if(srbSet->list.array != NULLP)
3707          {
3708              for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3709                   {
3710                       if(srbSet->list.array[srbidx]!=NULLP)
3711                                 {
3712                                     DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3713                                 }
3714                   }
3715                   DU_FREE(srbSet->list.array,srbSet->list.size);
3716          }
3717 }
3718  /*******************************************************************
3719   *
3720   * @brief Deallocating memory of function BuildAndSendUESetReq
3721   *
3722   * @details
3723   *
3724   *    Function : FreeQOSInfo
3725   *
3726   *    Functionality:  Deallocating memory for function BuildQOSInfo
3727   *
3728   * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3729   *
3730   * @return void
3731   *          
3732   * ****************************************************************/
3733 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3734 {
3735     if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3736          {
3737              if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3738                   {
3739                       if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3740                                 {
3741                                     DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3742                                          sizeof(MaxDataBurstVolume_t));
3743                                 }
3744                                  DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3745                                  sizeof(AveragingWindow_t));
3746                   }
3747                   DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3748                   sizeof(NonDynamic5QIDescriptor_t));
3749          }
3750 }
3751  /*******************************************************************
3752   *
3753   * @brief Deallocating memory of function BuildAndSendUESetReq
3754   *
3755   * @details
3756   *
3757   *    Function : FreeULTnlInfo
3758   *
3759   *    Functionality:  Deallocating memory for function BuildULTnlInfo
3760   *
3761   * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3762   *
3763   * @return void
3764   *         
3765  
3766  * ****************************************************************/
3767 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3768 {
3769     U8 ulidx=0;
3770          if(ulInfo->list.array != NULLP)
3771          {
3772              for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3773                   {
3774                       if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3775                                 {
3776                                     if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3777                                          {
3778                                              if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3779                                                   transportLayerAddress.buf != NULLP)
3780                                                   {
3781                                                       if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3782                                                                 !=NULLP)
3783                                                                 {
3784                                                                      DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3785                                                                           gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3786                                                                           gTPTunnel->gTP_TEID.size);
3787                                                                 }
3788                                                                 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3789                                                                 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3790                                                                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3791                                                   }
3792                                                   DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3793                                                   sizeof(GTPTunnel_t));
3794                                          }
3795                                 }
3796                                 if(ulInfo->list.array[ulidx]!=NULLP)
3797                                 {
3798                                     DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3799                                 }
3800                   }
3801                   DU_FREE(ulInfo->list.array,ulInfo->list.size);
3802          }
3803 }
3804 /*******************************************************************
3805  *
3806  * @brief Deallocating memory for BuildAndSendUESetReq
3807  *
3808  * @details
3809  *
3810  *    Function : FreeDRBSetup
3811  *
3812  *    Functionality:  Deallocating memory for BuildDRBSetup
3813  *
3814  * @params[in] DRBs_ToBeSetup_List_t *drbSet
3815  *
3816  * @return void
3817  *
3818  * ****************************************************************/
3819 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3820 {
3821     DRBs_ToBeSetup_Item_t *drbSetItem;
3822          U8  flowidx;
3823          U8  drbidx;
3824     if(drbSet->list.array == NULLP)
3825          {
3826              for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3827                   {
3828                        if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
3829                                  {
3830                                     drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3831                                     if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3832                                          {
3833                                                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3834                                                          qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3835                                                          {
3836                                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3837                                                                   qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3838                                                                   {
3839                                                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3840                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3841                                                                                  {
3842                                                                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3843                                                                                           {
3844                                                                                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3845                                                                                                         {
3846                                                                                                             if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3847                                                                                                                  {
3848                                                                                                                       if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3849                                                                                                                                 flows_Mapped_To_DRB_List.list.array != NULLP)
3850                                                                                                                                 {
3851                                                                                                                                     for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3852                                                                                                                                          flows_Mapped_To_DRB_List.list.count; flowidx++)
3853                                                                                                                                          {
3854                                                                                                                                              if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3855                                                                                                                                                   DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3856                                                                                                                                                   {
3857                                                                                                                                                       if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3858                                                                                                                                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3859                                                                                                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3860                                                                                                                                                                 {
3861                                                                                                                                                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3862                                                                                                                                                                           DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3863                                                                                                                                                                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3864                                                                                                                                                                           {
3865                                                                                                                                                                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3866                                                                                                                                                                                         DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3867                                                                                                                                                                                         qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3868                                                                                                                                                                                    {    
3869                                                                                                                                                                                                  if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
3870                                                                                                                                                                                                  {
3871                                                                                                                                                                                                      DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3872                                                                                                                                                                                                  }
3873                                                                                                                                                                                                  FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3874                                                                          DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3875                                                                                                                                                                                                  DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3876                                                                                                                                                                                        qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3877                                                                                                                                                                                                  sizeof(MaxDataBurstVolume_t));   
3878                                                                                                                                                                                    }
3879                                                                                                                                                                                         DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3880                                                                                                                                                                                         DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3881                                                                                                                                                                                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3882                                                                                                                                                                           }
3883                                                                                                                                                                           DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3884                                                                                                                                                                           DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3885                                                                  qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3886                                                                                                                                                                 }
3887                                                                                                                                                   }
3888                                                                                                                                                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3889                                                                                                                                                   DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3890                                                                                                                                                   {
3891                                                                                                                                                       DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3892                                                                                                                                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3893                                                                                                                                                   }
3894                                                                                                                                          }
3895                                                                                                                                     DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3896                                                                                                                                          flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3897                                                                                                                                          choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3898                                                                                                                                 }
3899                                                                                                                       DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3900                                                                                                                         drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3901                                                                                                                  }
3902                                                                                                                  DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3903                                                                                                                  sizeof(OCTET_STRING_t));
3904                                                                                                         }
3905                                                                                                          DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3906                                                                                                          drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3907                                                                                           }
3908                                                                                           DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3909                                                                                      qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3910                                                                                  }
3911                                                                        DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3912                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3913                                                                   }
3914                                                              DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3915                                                                   qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3916                                                          }
3917                                                    DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3918                                          }
3919                                  }
3920                        if(drbSet->list.array[drbidx]!=NULLP)
3921                                  {
3922                                      DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3923                                 }
3924                   }
3925              DU_FREE(drbSet->list.array,drbSet->list.size);
3926          }
3927 }
3928 /*******************************************************************
3929  *
3930  * @brief Builds and sends the UE Setup Request 
3931  *
3932  * @details
3933  *
3934  *    Function : BuildAndSendUESetReq
3935  *
3936  *    Functionality: Constructs the UE Setup Request and sends
3937  *                   it to the CU through SCTP.
3938  *
3939  * @params[in] 
3940  *
3941  * @return ROK     - success
3942  *         RFAILED - failure
3943  *
3944  * ****************************************************************/
3945 S16 BuildAndSendUESetReq()
3946 {
3947         S16  ret;
3948         U8   elementCnt;
3949         S16  BuildNrcgiret;
3950         S16  BuildSplCellListret;
3951         S16  BuildSRBSetupret;
3952         U8   idx;
3953         U8   idx1;
3954         U8   ieId;
3955         F1AP_PDU_t                                              *f1apMsg = NULL;
3956    UEContextSetupRequest_t                      *ueSetReq;
3957         asn_enc_rval_t                                          encRetVal;        /* Encoder return value */
3958    bool checkvar=false;
3959         while(1)
3960         {
3961             DU_LOG("\n F1AP : Building UE Context Setup Request\n");
3962
3963             DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3964             if(f1apMsg == NULLP)
3965             {
3966                     DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3967                          break;
3968             }
3969
3970             f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
3971             DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3972             if(f1apMsg->choice.initiatingMessage == NULLP)
3973             {
3974                      DU_LOG(" F1AP : Memory allocation for      F1AP-PDU failed");
3975                           break;
3976             }
3977
3978             f1apMsg->choice.initiatingMessage->procedureCode = \
3979                                                                                                         ProcedureCode_id_UEContextSetup;
3980             f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
3981             f1apMsg->choice.initiatingMessage->value.present = \
3982                                    InitiatingMessage__value_PR_UEContextSetupRequest;
3983             ueSetReq =
3984                   &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
3985             elementCnt = 9;
3986             ueSetReq->protocolIEs.list.count = elementCnt;
3987             ueSetReq->protocolIEs.list.size = \
3988                                                                         elementCnt * sizeof(UEContextSetupRequestIEs_t *);
3989
3990             /* Initialize the UESetup members */
3991             DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
3992             
3993                  if(ueSetReq->protocolIEs.list.array == NULLP)
3994             {
3995                      DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
3996                           break;
3997             }
3998
3999             for(idx1=0; idx1<elementCnt; idx1++)
4000             {
4001                      DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
4002                      if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
4003                      {
4004                              break;
4005                      }
4006             }
4007
4008             idx = 0;
4009
4010             /*GNB CU UE F1AP ID*/
4011             ueSetReq->protocolIEs.list.array[idx]->id   = \
4012                                                                                  ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
4013          ueSetReq->protocolIEs.list.array[idx]->criticality     =       Criticality_reject;
4014             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4015                                                 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
4016             ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
4017
4018             /*GNB DU UE F1AP ID*/
4019             idx++;
4020             ueSetReq->protocolIEs.list.array[idx]->id   = \
4021                                                                                  ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
4022             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_ignore;
4023             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4024                                                 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
4025             ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
4026
4027             /*Special Cell ID*/
4028             idx++;
4029             ueSetReq->protocolIEs.list.array[idx]->id   = \
4030                                                                                                          ProtocolIE_ID_id_SpCell_ID;
4031             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
4032             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4033                                                                 UEContextSetupRequestIEs__value_PR_NRCGI;
4034             BuildNrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
4035             if(BuildNrcgiret != ROK)
4036             {
4037                     break;
4038             }
4039
4040             /*Served Cell Index*/
4041             idx++;
4042             ueSetReq->protocolIEs.list.array[idx]->id   = \
4043                                                                                                  ProtocolIE_ID_id_ServCellIndex;
4044             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
4045             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4046                                                 UEContextSetupRequestIEs__value_PR_ServCellIndex;
4047             ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
4048             CELL_INDEX;
4049
4050             /*CellULConfigured*/
4051             idx++;
4052             ueSetReq->protocolIEs.list.array[idx]->id   = \
4053                                                                                         ProtocolIE_ID_id_SpCellULConfigured;
4054             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_ignore;
4055             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4056                                                                         UEContextSetupRequestIEs__value_PR_CellULConfigured;
4057             ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
4058                                                                                                                                                         CellULConfigured_none;
4059
4060
4061              /*CUtoDURRCContainer*/
4062              idx++;
4063              ueSetReq->protocolIEs.list.array[idx]->id  = \
4064                                                                                                   ProtocolIE_ID_id_CUtoDURRCInformation;
4065              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
4066              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4067                                                 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
4068
4069              /*Special Cells to be SetupList*/
4070              idx++;
4071              ueSetReq->protocolIEs.list.array[idx]->id  = \
4072                                                                                                   ProtocolIE_ID_id_SCell_ToBeSetup_List;
4073              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_ignore;
4074              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4075                                                 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
4076              BuildSplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
4077              if(BuildSplCellListret != ROK)
4078              {  
4079                      break;
4080              }
4081              /*SRBs To Be Setup List*/
4082              idx++;
4083              ueSetReq->protocolIEs.list.array[idx]->id  = \
4084                                                                                  ProtocolIE_ID_id_SRBs_ToBeSetup_List;
4085              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
4086              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4087                                                 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
4088              BuildSRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
4089              if(BuildSRBSetupret != ROK)
4090              {        
4091                      break;
4092              }
4093              /*DRBs to Be Setup List*/
4094              idx++;
4095              ueSetReq->protocolIEs.list.array[idx]->id  = \
4096                                                                                  ProtocolIE_ID_id_DRBs_ToBeSetup_List;
4097              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
4098              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4099                                                 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
4100              ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
4101              if(ret != ROK)
4102              {  
4103                      break;
4104              }
4105
4106              xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4107
4108              /* Encode the F1SetupRequest type as APER */
4109              cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
4110              encBufSize = 0;
4111              encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
4112                         encBuf);
4113              /* Encode results */
4114              if(encRetVal.encoded == ENCODE_FAIL)
4115              {
4116                 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
4117                                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4118                       break;
4119              }
4120              else
4121              {
4122                       DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
4123                       for(int i=0; i< encBufSize; i++)
4124                       {
4125                         printf("%x",encBuf[i]);
4126                       }
4127             }
4128
4129             /* Sending  msg  */
4130             if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL)   !=      ROK)
4131             {
4132                 DU_LOG("\n F1AP : Sending       UE Context Setup Request Failed");
4133                       break;
4134             }
4135                  checkvar=true;
4136                  break;
4137    }
4138    if(f1apMsg != NULLP)
4139         {
4140             if(f1apMsg->choice.initiatingMessage != NULLP)
4141                  {
4142                       if(ueSetReq->protocolIEs.list.array != NULLP)
4143                                 {
4144                                if(idx1==elementCnt)
4145                                          {
4146                                                   if(BuildNrcgiret==ROK)
4147                                                   {
4148                                                                  if(BuildSplCellListret==ROK)
4149                                                                  {
4150                                                                            if(BuildSRBSetupret == ROK)
4151                                                                                 {
4152                                                                                    FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.DRBs_ToBeSetup_List); 
4153                                                                                 }
4154                                                                                 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.SRBs_ToBeSetup_List);
4155                                                                  }    
4156                                                                  FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List); 
4157                                                   }
4158                                                   idx=2;
4159                                                   FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);   
4160                                                   for(ieId=0; ieId<idx1; ieId++)
4161                                                   {
4162                                                       DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4163                                                   }
4164                                          }
4165                                          else
4166                                          {
4167                                              for(ieId=0; ieId<idx; ieId++)
4168                                                   {
4169                                                       if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
4170                                                                 {
4171                                                           DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4172                                                                 }
4173                                                   }
4174                                          }
4175                                          DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);        
4176                                 }
4177                       DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4178                  }
4179             DU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); 
4180         }
4181         if(checkvar==true)
4182         return ROK;
4183         else
4184              return RFAILED;
4185 }/* End of BuildAndSendUESetReq*/
4186
4187 /*******************************************************************
4188 *
4189 * @brief Handles received F1AP message and sends back response  
4190 *
4191 * @details
4192 *
4193 *    Function : F1APMsgHdlr
4194 *
4195 *    Functionality:
4196 *         - Decodes received F1AP control message
4197 *         - Prepares response message, encodes and sends to SCTP
4198 *
4199 * @params[in] 
4200 * @return ROK     - success
4201 *         RFAILED - failure
4202 *
4203 * ****************************************************************/
4204 void F1APMsgHdlr(Buffer *mBuf)
4205 {
4206    int i;
4207    char *recvBuf;
4208    MsgLen copyCnt;
4209    MsgLen recvBufLen;
4210    F1AP_PDU_t *f1apMsg;
4211    asn_dec_rval_t rval; /* Decoder return value */
4212    F1AP_PDU_t f1apasnmsg ;
4213  
4214    DU_LOG("\nF1AP : Received F1AP message buffer");
4215    SPrntMsg(mBuf, 0,0);
4216  
4217    /* Copy mBuf into char array to decode it */
4218    SFndLenMsg(mBuf, &recvBufLen);
4219    if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
4220    {
4221       DU_LOG("\nF1AP : Memory allocation failed");
4222       return;
4223    }
4224    if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
4225    {
4226       DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
4227       return;
4228    }
4229
4230    printf("\nF1AP : Received flat buffer to be decoded : ");
4231    for(i=0; i< recvBufLen; i++)
4232    {
4233         printf("%x",recvBuf[i]);
4234    }
4235
4236    /* Decoding flat buffer into F1AP messsage */
4237    f1apMsg = &f1apasnmsg;
4238    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
4239  
4240    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
4241    SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
4242    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
4243    {
4244       DU_LOG("\nF1AP : ASN decode failed");
4245       return;
4246    }
4247    printf("\n");
4248    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4249
4250    switch(f1apMsg->present)
4251    {
4252       case F1AP_PDU_PR_successfulOutcome:
4253       {
4254          switch(f1apMsg->choice.successfulOutcome->value.present)
4255          {
4256             case SuccessfulOutcome__value_PR_F1SetupResponse:
4257             {                           
4258 #ifndef ODU_TEST_STUB
4259                procF1SetupRsp(f1apMsg);
4260 #endif
4261                break;
4262             }
4263             
4264             case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
4265             {
4266                procGNBDUCfgUpdAck(f1apMsg);
4267                break;
4268             }
4269
4270             default:
4271             {
4272                DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
4273                return;
4274             }
4275          }/* End of switch(successfulOutcome) */
4276          break;
4277       }
4278                 case F1AP_PDU_PR_initiatingMessage:
4279                 {
4280                         switch(f1apMsg->choice.initiatingMessage->value.present)
4281                         {
4282                                 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
4283                                         {
4284                                                 procDlRrcMsgTrans(f1apMsg);
4285                                                 break;
4286                                         }
4287
4288                                 default:
4289                                         {
4290                                                 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
4291                                                                 f1apMsg->choice.initiatingMessage->value.present);
4292                                                 return;
4293                                         }
4294                         }/* End of switch(initiatingMessage) */
4295                         break;
4296                 }
4297
4298       default:
4299       {
4300          DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
4301          return;
4302       }
4303
4304    }/* End of switch(f1apMsg->present) */
4305  
4306 } /* End of F1APMsgHdlr */
4307  
4308 /**********************************************************************
4309   End of file
4310  **********************************************************************/