18f17b663f47ee9b13b8a3e444367071ae749735
[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_ToReleaseList = NULLP;
2016    tagConfig->tag_ToAddModList = NULLP;
2017    DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2018         if(!tagConfig->tag_ToAddModList)
2019         {
2020                 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2021                 return RFAILED;
2022         }
2023
2024         elementCnt = 1; //ODU_VALUE_ONE;
2025         tagList = tagConfig->tag_ToAddModList;
2026         tagList->list.count = elementCnt;
2027         tagList->list.size  =  elementCnt * sizeof(struct TAG *);
2028
2029    tagList->list.array = NULLP;
2030         DU_ALLOC(tagList->list.array, tagList->list.size);
2031         if(!tagList->list.array)
2032         {
2033                 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2034                 return RFAILED;
2035         }
2036
2037         for(idx=0; idx<tagList->list.count; idx++)
2038         {
2039            tagList->list.array[idx] = NULLP;
2040                 DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2041                 if(!tagList->list.array[idx])
2042                 {
2043                         DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
2044                         return RFAILED;
2045                 }
2046         }
2047
2048         idx = 0;
2049         tagList->list.array[idx]->tag_Id = TAG_ID;
2050         tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2051
2052    return ROK;
2053 }
2054
2055 /*******************************************************************
2056 *
2057 * @brief Builds PHR Config 
2058 *
2059 * @details
2060 *
2061 *    Function : BuildPhrConfig
2062 *
2063 *    Functionality: Builds phrConfig in MacCellGroupConfig
2064 *
2065 * @params[in] PHR Config *
2066 *
2067 * @return ROK     - success
2068 *         RFAILED - failure
2069 *
2070 * ****************************************************************/
2071 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2072 {
2073
2074    phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2075         phrConfig->choice.setup = NULLP;
2076         DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2077         if(!phrConfig->choice.setup)
2078         {
2079                 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
2080                 return RFAILED;
2081         }
2082
2083         phrConfig->choice.setup->phr_PeriodicTimer        = PHR_PERIODIC_TMR;
2084         phrConfig->choice.setup->phr_ProhibitTimer        = PHR_PROHIBHIT_TMR;
2085    phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2086         phrConfig->choice.setup->multiplePHR              = false;
2087         phrConfig->choice.setup->dummy                    = false;
2088         phrConfig->choice.setup->phr_Type2OtherCell       = false;
2089         phrConfig->choice.setup->phr_ModeOtherCG          = PHR_MODE_OTHER_CG;
2090
2091         return ROK;
2092 }
2093
2094 /*******************************************************************
2095 *
2096 * @brief Builds BSR Config 
2097 *
2098 * @details
2099 *
2100 *    Function : BuildBsrConfig
2101 *
2102 *    Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2103 *
2104 * @params[in] BSR_Config *bsrConfig
2105 *
2106 * @return ROK     - success
2107 *         RFAILED - failure
2108 *
2109 * ****************************************************************/
2110 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2111 {
2112    bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2113         bsrConfig->retxBSR_Timer     = RETX_BSR_TMR;
2114         bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2115
2116    return ROK;
2117 }
2118
2119 /*******************************************************************
2120 *
2121 * @brief Builds scheduling request config 
2122 *
2123 * @details
2124 *
2125 *    Function : BuildSchedulingReqConfig 
2126 *
2127 *    Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2128 *
2129 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2130 *
2131 * @return ROK     - success
2132 *         RFAILED - failure
2133 *
2134 * ****************************************************************/
2135 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2136 {
2137         struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2138    uint8_t                     idx, elementCnt;
2139
2140    schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2141         DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2142                         sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2143         if(!schedulingRequestConfig->schedulingRequestToAddModList)
2144         {
2145                 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2146                 return RFAILED;
2147         }
2148
2149         elementCnt = 1; //ODU_VALUE_ONE;
2150         schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2151         schReqList->list.count = elementCnt;
2152    schReqList->list.size  = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2153
2154    schReqList->list.array = NULLP;
2155    DU_ALLOC(schReqList->list.array, schReqList->list.size);
2156         if(!schReqList->list.array)
2157         {
2158                 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2159                 return RFAILED;
2160         }
2161
2162    for(idx=0;idx<schReqList->list.count; idx++)
2163         {
2164            schReqList->list.array[idx] = NULLP;
2165                 DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2166                 if(!schReqList->list.array[idx])
2167                 {
2168                         DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2169                         return RFAILED;
2170                 }
2171         }
2172
2173         idx = 0;
2174         schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2175
2176    schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2177         DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2178         if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2179         {
2180                 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
2181                 return RFAILED;
2182         }
2183    *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2184         schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2185         schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2186
2187         return ROK;
2188 }
2189
2190 /*******************************************************************
2191 *
2192 * @brief Builds RLC Config
2193 *
2194 * @details
2195 *
2196 *    Function : BuildRlcConfig
2197 *
2198 *    Functionality: Builds RLC Config in BuildRlcBearerToAddModList 
2199 *
2200 * @params[in] RLC_Config *rlcConfig
2201 *
2202 * @return ROK     - success
2203 *         RFAILED - failure
2204 *
2205 * ****************************************************************/
2206 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2207 {
2208
2209    rlcConfig->present = RLC_Config_PR_am;
2210
2211    rlcConfig->choice.am = NULLP;
2212    DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2213         if(!rlcConfig->choice.am)
2214         {
2215                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2216                 return RFAILED;
2217         }
2218
2219    /* UL */
2220         rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2221    DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2222         if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2223         {
2224                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2225                 return RFAILED;
2226         }
2227    *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2228         rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit  = T_POLL_RETRANSMIT;
2229         rlcConfig->choice.am->ul_AM_RLC.pollPDU           = POLL_PDU;
2230         rlcConfig->choice.am->ul_AM_RLC.pollByte          = POLL_BYTE;
2231         rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold  = MAX_RETX_THRESHOLD;
2232
2233    /* DL */
2234    rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2235    DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
2236         if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2237         {
2238                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
2239                 return RFAILED;
2240         }
2241         *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2242    rlcConfig->choice.am->dl_AM_RLC.t_Reassembly      = T_REASSEMBLY;
2243         rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit  = T_STATUS_PROHIBHIT;
2244         
2245    return ROK;
2246 }
2247
2248 /*******************************************************************
2249 *
2250 * @brief Builds MAC LC Config
2251 *
2252 * @details
2253 *
2254 *    Function : BuildMacLCConfig 
2255 *
2256 *    Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList 
2257 *
2258 * @params[in] struct LogicalChannelConfig macLcConfig
2259 *
2260 * @return ROK     - success
2261 *         RFAILED - failure
2262 *
2263 * ****************************************************************/
2264 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2265 {
2266
2267    macLcConfig->ul_SpecificParameters = NULLP;
2268    DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2269         if(!macLcConfig->ul_SpecificParameters)
2270         {
2271                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2272                 return RFAILED;
2273         }
2274
2275    macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2276         macLcConfig->ul_SpecificParameters->prioritisedBitRate =        PRIORTISIED_BIT_RATE;
2277         macLcConfig->ul_SpecificParameters->bucketSizeDuration =        BUCKET_SIZE_DURATION;
2278    macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2279         macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2280         macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2281    macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2282
2283    macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2284    DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup,    sizeof(long));
2285    if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2286         {
2287                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2288                 return RFAILED;
2289         }
2290    *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2291
2292    macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2293         DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID,       sizeof(SchedulingRequestId_t));
2294         if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2295         {
2296                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
2297                 return RFAILED;
2298         }
2299    *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2300
2301         macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2302         macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2303         macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2304
2305    return ROK;
2306 }
2307
2308 /*******************************************************************
2309 *
2310 * @brief Builds RLC Bearer to Add/Mod list
2311 *
2312 * @details
2313 *
2314 *    Function :BuildRlcBearerToAddModList 
2315 *
2316 *    Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2317 *
2318 * @params[in] rlc_BearerToAddModList
2319 *
2320 * @return ROK     - success
2321 *         RFAILED - failure
2322 *
2323 * ****************************************************************/
2324 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2325 {
2326    uint8_t                     idx, elementCnt;
2327
2328    elementCnt = 1;
2329    rlcBearerList->list.count = elementCnt;
2330         rlcBearerList->list.size  = elementCnt * sizeof(struct RLC_BearerConfig *);
2331
2332    rlcBearerList->list.array = NULLP;
2333         DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2334         if(!rlcBearerList->list.array)
2335         {
2336                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2337                 return RFAILED;
2338         }
2339
2340    for(idx=0; idx<rlcBearerList->list.count; idx++)
2341         {
2342            rlcBearerList->list.array[idx] = NULLP;
2343                 DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2344                 if(!rlcBearerList->list.array[idx])
2345                 {
2346                         DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2347                         return RFAILED;
2348                 }
2349         }
2350
2351    idx = 0;
2352         rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
2353
2354         DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2355         if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2356         {
2357                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2358                 return RFAILED;
2359         }
2360
2361         rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2362    rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
2363
2364    rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2365    rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2366    DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2367         if(!rlcBearerList->list.array[idx]->rlc_Config)
2368         {
2369                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2370                 return RFAILED;
2371         }
2372
2373    if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2374         {
2375                 DU_LOG("\nF1AP : BuildRlcConfig failed");
2376                 return RFAILED;
2377         }
2378
2379    rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2380    DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2381         if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2382         {
2383                 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2384                 return RFAILED;
2385         }
2386
2387         if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2388         {
2389                 DU_LOG("\nF1AP : BuildMacLCConfig failed");
2390                 return RFAILED;
2391         }
2392
2393         return ROK;
2394 }
2395
2396 /*******************************************************************
2397  *
2398  * @brief Builds intitial DL BWP
2399  * @details
2400  *
2401  *    Function : BuildInitialDlBWP 
2402  *
2403  *    Functionality: Builds intitial DL BWP in spCellCfgDed
2404  *
2405  * @params[in] BWP_DownlinkDedicated_t *dlBwp
2406  *
2407  * @return ROK     - success
2408  *         RFAILED - failure
2409  *
2410  * ****************************************************************/
2411 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
2412 {
2413
2414    return ROK;
2415 }
2416
2417 /*******************************************************************
2418  *
2419  * @brief Builds UL config
2420  * @details
2421  *
2422  *    Function : BuildUlCfg 
2423  *
2424  *    Functionality: Builds UL config in spCellCfgDed
2425  *
2426  * @params[in] UplinkConfig_t *ulCfg
2427  *
2428  * @return ROK     - success
2429  *         RFAILED - failure
2430  *
2431  * ****************************************************************/
2432 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
2433 {
2434
2435    return ROK;
2436 }
2437
2438 /*******************************************************************
2439  *
2440  * @brief Builds PDSCH serving cell config
2441  * @details
2442  *
2443  *    Function : BuildPdschSrvCellCfg
2444  *
2445  *    Functionality: Builds PDSCH serving cell config in spCellCfgDed
2446  *
2447  * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg 
2448  *
2449  * @return ROK     - success
2450  *         RFAILED - failure
2451  *
2452  * ****************************************************************/
2453 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
2454 {
2455
2456    return ROK;
2457 }
2458
2459 /*******************************************************************
2460  *
2461  * @brief Builds CSI Meas config
2462  * @details
2463  *
2464  *    Function : BuildCsiMeasCfg 
2465  *
2466  *    Functionality: Builds CSI Meas config in spCellCfgDed
2467  *
2468  * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
2469  *
2470  * @return ROK     - success
2471  *         RFAILED - failure
2472  *
2473  * ****************************************************************/
2474 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
2475 {
2476
2477    return ROK;
2478 }
2479
2480 /*******************************************************************
2481  *
2482  * @brief Builds Spcell config dedicated
2483  * @details
2484  *
2485  *    Function : BuildSpCellCfgDed
2486  *
2487  *    Functionality: Builds sp cell config dedicated in spCellCfg
2488  *
2489  * @params[in] ServingCellConfig_t srvCellCfg
2490  *
2491  * @return ROK     - success
2492  *         RFAILED - failure
2493  *
2494  * ****************************************************************/
2495 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
2496 {
2497 #if 0
2498    srvCellCfg->initialDownlinkBWP = NULLP;
2499    DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2500         if(!srvCellCfg->initialDownlinkBWP)
2501         {
2502                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2503                 return RFAILED;
2504         }
2505
2506    if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
2507         {
2508                 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
2509                 return RFAILED;
2510         }
2511 #endif
2512    srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
2513         DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2514         if(!srvCellCfg->firstActiveDownlinkBWP_Id)
2515         {
2516                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2517                 return RFAILED;
2518         }
2519         *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2520
2521    srvCellCfg->defaultDownlinkBWP_Id = NULLP;
2522         DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2523         if(!srvCellCfg->defaultDownlinkBWP_Id)
2524         {
2525                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2526                 return RFAILED;
2527         }
2528         *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
2529 #if 0
2530    srvCellCfg->uplinkConfig = NULLP;
2531    DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2532         if(!srvCellCfg->uplinkConfig)
2533         {
2534                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2535                 return RFAILED;
2536         }
2537
2538    if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
2539         {
2540                 DU_LOG("\nF1AP : BuildUlCfg failed");
2541                 return RFAILED;
2542         }
2543
2544    srvCellCfg->pdsch_ServingCellConfig = NULLP;
2545         DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct     ServingCellConfig__pdsch_ServingCellConfig));
2546         if(!srvCellCfg->pdsch_ServingCellConfig)
2547         {
2548                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2549                 return RFAILED;
2550         }
2551
2552    if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
2553         {
2554                 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
2555                 return RFAILED;
2556         }
2557
2558    srvCellCfg->csi_MeasConfig = NULLP;
2559         DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct      ServingCellConfig__csi_MeasConfig))
2560         if(!srvCellCfg->csi_MeasConfig)
2561         {
2562                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
2563                 return RFAILED;
2564         }
2565
2566    if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
2567         {
2568                 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
2569                 return RFAILED;
2570         }
2571 #endif
2572         srvCellCfg->tag_Id = TAG_ID;
2573
2574         return ROK;
2575 }
2576 /*******************************************************************
2577  *
2578  * @brief Builds Spcell config 
2579  *
2580  * @details
2581  *
2582  *    Function : BuildSpCellCfg 
2583  *
2584  *    Functionality: Builds sp cell config in DuToCuRrcContainer
2585  *
2586  * @params[in] SpCellConfig_t spCellCfg
2587  *
2588  * @return ROK     - success
2589  *         RFAILED - failure
2590  *
2591  * ****************************************************************/
2592 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
2593 {
2594
2595    spCellCfg->servCellIndex = NULLP;
2596         DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
2597         if(!spCellCfg->servCellIndex)
2598         {
2599                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2600                 return RFAILED;
2601         }
2602    *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
2603
2604    spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
2605         DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2606         if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
2607         {
2608                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2609                 return RFAILED;
2610         }
2611    *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
2612
2613    spCellCfg->spCellConfigDedicated = NULLP;
2614    DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2615         if(!spCellCfg->spCellConfigDedicated)
2616         {
2617                 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
2618                 return RFAILED;
2619         }
2620    if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
2621         {
2622                 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
2623                 return RFAILED;
2624         }
2625         return ROK;
2626 }
2627 /*******************************************************************
2628 *
2629 * @brief Builds Phy cell group config 
2630 *
2631 * @details
2632 *
2633 *    Function : BuildPhyCellGrpCfg 
2634 *
2635 *    Functionality: Builds Phy cell group config in DuToCuRrcContainer
2636 *
2637 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg 
2638 *
2639 * @return ROK     - success
2640 *         RFAILED - failure
2641 *
2642 * ****************************************************************/
2643 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
2644 {
2645    phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
2646         phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
2647
2648    phyCellGrpCfg->p_NR_FR1 = NULLP;
2649         DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2650         if(!phyCellGrpCfg->p_NR_FR1)
2651         {
2652                 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
2653                 return RFAILED;
2654         }
2655    *(phyCellGrpCfg->p_NR_FR1)             = P_NR_FR1;
2656         phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
2657         phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
2658         phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
2659         phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
2660         phyCellGrpCfg->sp_CSI_RNTI = NULLP;
2661         phyCellGrpCfg->cs_RNTI = NULLP;
2662         phyCellGrpCfg->ext1 = NULLP;
2663         phyCellGrpCfg->ext2 = NULLP;
2664
2665         return ROK;
2666 }
2667 /*******************************************************************
2668 *
2669 * @brief Builds Mac cell group config 
2670 *
2671 * @details
2672 *
2673 *    Function : BuildMacCellGrpCfg 
2674 *
2675 *    Functionality: Builds Mac cell group config in DuToCuRrcContainer
2676 *
2677 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
2678 *
2679 * @return ROK     - success
2680 *         RFAILED - failure
2681 *
2682 * ****************************************************************/
2683 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
2684 {
2685    macCellGrpCfg->drx_Config = NULLP;
2686    macCellGrpCfg->schedulingRequestConfig = NULLP;
2687         DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2688         if(!macCellGrpCfg->schedulingRequestConfig)
2689         {
2690                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2691                 return RFAILED;
2692         }
2693
2694         if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
2695         {
2696            DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
2697                 return RFAILED;
2698         }
2699
2700    macCellGrpCfg->bsr_Config = NULLP;
2701    DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2702         if(!macCellGrpCfg->bsr_Config)
2703         {
2704                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2705                 return RFAILED;
2706         }
2707
2708    if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
2709         {
2710       DU_LOG("\nF1AP : BuildBsrConfig failed");
2711            return RFAILED;
2712         }
2713
2714    macCellGrpCfg->tag_Config = NULLP;
2715    DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
2716         if(!macCellGrpCfg->tag_Config)
2717         {
2718                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2719                 return RFAILED;
2720         }
2721
2722    if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
2723         {
2724            DU_LOG("\nF1AP : BuildTagConfig failed");
2725            return RFAILED;
2726    }
2727
2728    macCellGrpCfg->phr_Config = NULLP;
2729    DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
2730         if(!macCellGrpCfg->phr_Config)
2731         {
2732                 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
2733                 return RFAILED;
2734         }
2735
2736    if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
2737         {
2738            DU_LOG("\nF1AP : BuildPhrConfig failed");
2739            return RFAILED;
2740    }
2741
2742    macCellGrpCfg->skipUplinkTxDynamic = false;
2743         macCellGrpCfg->ext1 = NULLP;
2744
2745         return ROK;
2746 }
2747
2748 /*******************************************************************
2749  *
2750  * @brief Frees emmory allocated for DUToCURRCContainer 
2751  *
2752  * @details
2753  *
2754  *    Function : FreeMemDuToCuRrcCont
2755  *
2756  *    Functionality: Builds DuToCuRrcContainer
2757  *
2758  * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
2759  *
2760  * @return ROK     - success
2761  *         RFAILED - failure
2762  *
2763 * ****************************************************************/
2764 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
2765 {
2766    uint8_t idx;
2767         struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList;
2768         struct RLC_Config *rlcConfig;
2769         struct LogicalChannelConfig *macLcConfig;
2770         MAC_CellGroupConfig_t *macCellGrpCfg;
2771         struct SchedulingRequestConfig *schedulingRequestConfig;
2772         struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2773         struct TAG_Config *tagConfig;
2774         struct TAG_Config__tag_ToAddModList *tagList;
2775         struct MAC_CellGroupConfig__phr_Config *phrConfig;
2776         PhysicalCellGroupConfig_t *phyCellGrpCfg;
2777         SpCellConfig_t *spCellCfg;
2778         ServingCellConfig_t *srvCellCfg;
2779
2780         rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
2781         if(rlcBearerList)
2782         {
2783                 if(rlcBearerList->list.array)
2784                 {
2785                         for(idx=0; idx<rlcBearerList->list.count; idx++)
2786                         {
2787                                 rlcConfig   = rlcBearerList->list.array[idx]->rlc_Config;
2788                                 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
2789                                 if(rlcConfig)
2790                                 {
2791                                    if(rlcConfig->choice.am)
2792                                         {
2793                                       DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2794                                       DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
2795                                       DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2796                                         }
2797                                    DU_FREE(rlcConfig, sizeof(struct RLC_Config));
2798                                 }
2799                                 DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
2800                                 if(macLcConfig)
2801                                 {
2802                                    if(macLcConfig->ul_SpecificParameters)
2803                                         {
2804                                       DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID,  sizeof(SchedulingRequestId_t));
2805                                       DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup,  sizeof(long));
2806                                       DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2807                                    }
2808                                    DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
2809                                 }
2810                                 DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2811                         }
2812                         DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
2813                 }
2814                 DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2815         }
2816
2817         macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
2818         if(macCellGrpCfg)
2819         {
2820                 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; 
2821                 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2822
2823       if(schedulingRequestConfig)
2824                 {
2825                    if(schReqList)
2826                         {
2827                            if(schReqList->list.array)
2828                                 {
2829                          for(idx=0;idx<schReqList->list.count; idx++)
2830                          {
2831                                            if(schReqList->list.array[idx])
2832                                                 {
2833                                     DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2834                                     DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2835                             }
2836                                         }
2837                          DU_FREE(schReqList->list.array, schReqList->list.size);
2838                                 }
2839                       DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
2840                                 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));    }
2841                    DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
2842       }
2843       
2844                 if(macCellGrpCfg->bsr_Config)
2845                 {
2846                    DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
2847                 }
2848
2849                 tagConfig = macCellGrpCfg->tag_Config;
2850                 tagList = tagConfig->tag_ToAddModList;
2851                 if(tagConfig)
2852                 {
2853                    if(tagList)
2854                         {
2855                            if(tagList->list.array)
2856                                 {
2857                          for(idx=0; idx<tagList->list.count; idx++)
2858                          {
2859                    DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
2860                                         }
2861                          DU_FREE(tagList->list.array, tagList->list.size);
2862             }
2863                       DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2864                         }
2865                 DU_FREE(tagConfig, sizeof(struct TAG_Config));
2866                 }
2867
2868                 phrConfig = macCellGrpCfg->phr_Config;
2869                 if(phrConfig)
2870                 {
2871                    DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
2872                    DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
2873       }
2874
2875                 DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
2876         }
2877
2878         phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
2879         if(phyCellGrpCfg)
2880         {
2881                 DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
2882                 DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
2883         }
2884
2885         spCellCfg = cellGrpCfg->spCellConfig;
2886         if(spCellCfg)
2887         {
2888                 DU_FREE(spCellCfg->servCellIndex, sizeof(long));
2889       DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
2890
2891                 srvCellCfg = spCellCfg->spCellConfigDedicated;
2892       if(srvCellCfg)
2893                 {
2894                    DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
2895                    DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
2896                    DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
2897                    DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
2898                    DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct   ServingCellConfig__pdsch_ServingCellConfig));
2899                    DU_FREE(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig));
2900                    DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
2901                 }
2902                 DU_FREE(spCellCfg, sizeof(SpCellConfig_t));
2903         }
2904         return ROK;
2905 }
2906 /*******************************************************************
2907  *
2908  * @brief Builds DU To CU RRC Container 
2909  *
2910  * @details
2911  *
2912  *    Function : BuildDuToCuRrcContainer 
2913  *
2914  *    Functionality: Builds DuToCuRrcContainer
2915  *
2916  * @params[in] idx, index in F1AP msg
2917  *             DuToCuRRCContainer, DuToCuRRCContainer
2918  *
2919  * @return ROK     - success
2920  *         RFAILED - failure
2921  *
2922  * ****************************************************************/
2923 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
2924 {
2925         CellGroupConfigRrc_t  cellGrpCfg;
2926         asn_enc_rval_t        encRetVal;
2927         uint8_t               ret = RFAILED;
2928
2929         while(1)
2930         {
2931                 cellGrpCfg.cellGroupId = CELL_GRP_ID;
2932
2933                 cellGrpCfg.rlc_BearerToAddModList = NULLP;
2934                 DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
2935                 if(!cellGrpCfg.rlc_BearerToAddModList)
2936                 {
2937                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2938                         break;
2939                 }
2940                 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
2941                 {
2942                         DU_LOG("\nF1AP : BuildRlcBearerToAddModList failed");
2943                         break;
2944                 }
2945
2946       cellGrpCfg.rlc_BearerToReleaseList = NULLP;
2947                 cellGrpCfg.mac_CellGroupConfig = NULLP;
2948                 DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
2949                 if(!cellGrpCfg.mac_CellGroupConfig)
2950                 {
2951                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2952                         break;
2953                 }
2954                 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
2955                 {
2956                         DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
2957                         break;
2958                 }
2959
2960
2961                 cellGrpCfg.physicalCellGroupConfig = NULLP;
2962                 DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
2963                 if(!cellGrpCfg.physicalCellGroupConfig)
2964                 {
2965                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2966                         break;
2967                 }
2968                 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
2969                 {
2970                         DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
2971                         break;
2972                 }
2973
2974                 cellGrpCfg.spCellConfig = NULLP;
2975                 DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
2976                 if(!cellGrpCfg.spCellConfig)
2977                 {
2978                         DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
2979                         break;
2980                 }
2981                 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
2982                 {
2983                         DU_LOG("\nF1AP : BuildSpCellCfg failed");
2984                         break;
2985                 }
2986
2987       cellGrpCfg.sCellToAddModList = NULLP;
2988                 cellGrpCfg.sCellToReleaseList = NULLP;
2989                 cellGrpCfg.ext1 = NULLP;
2990
2991                 /* encode cellGrpCfg into duToCuRrcContainer */
2992                 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
2993                 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
2994                 encBufSize = 0;
2995                 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
2996                 /* Encode results */
2997                 if(encRetVal.encoded == ENCODE_FAIL)
2998                 {
2999                         DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
3000                                         encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3001                         break;
3002                 }
3003                 else
3004                 {
3005                         DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
3006                         for(int i=0; i< encBufSize; i++)
3007                         {
3008                                 printf("%x",encBuf[i]);
3009                         }
3010                 }
3011
3012            duToCuRrcContainer->size = encBufSize;
3013                 DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
3014                 if(!duToCuRrcContainer->buf)
3015                 {
3016          DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
3017                         break;
3018                 }
3019                 memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
3020                 ret = ROK;
3021                 break;
3022         }
3023    FreeMemDuToCuRrcCont(&cellGrpCfg);
3024         return ret;
3025 }
3026
3027 /*******************************************************************
3028  *
3029  * @brief Builds and sends the InitialULRRCMessage 
3030  *
3031  * @details
3032  *
3033  *    Function : BuildAndSendInitialRrcMsgTransfer 
3034  *
3035  *    Functionality: Constructs the Initial UL RRC Message Transfer and sends
3036  *                   it to the CU through SCTP.
3037  *
3038  * @params[in] 
3039  *
3040  * @return ROK     - success
3041  *         RFAILED - failure
3042  *
3043  * ****************************************************************/
3044 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
3045                 uint8_t *rrcContainer)
3046 {
3047    S16  ret;
3048         U8   elementCnt;
3049    U8   ieId;
3050         U8   idx;
3051         U8   idx1;
3052         F1AP_PDU_t  *f1apMsg = NULLP;
3053         InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
3054    asn_enc_rval_t                encRetVal;
3055         bool  checkvar=false;
3056         while(1)
3057         {
3058              DU_LOG("\n F1AP : Building RRC Setup Request\n");
3059                   DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3060                   if(f1apMsg == NULLP)
3061                   {
3062                       DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
3063                            break;
3064                   }
3065                   f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
3066                   DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3067                   if(f1apMsg->choice.initiatingMessage == NULLP)
3068                   {
3069                      DU_LOG(" F1AP : Memory allocation for  F1AP-PDU failed");
3070                           break;
3071                   }
3072                   f1apMsg->choice.initiatingMessage->procedureCode =\
3073                          ProcedureCode_id_InitialULRRCMessageTransfer;
3074                   f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
3075                   f1apMsg->choice.initiatingMessage->value.present = \
3076                          InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
3077                   initULRRCMsg =\
3078                          &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
3079         elementCnt = 5;
3080                   initULRRCMsg->protocolIEs.list.count = elementCnt;
3081                   initULRRCMsg->protocolIEs.list.size = \
3082                          elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
3083                   /* Initialize the F1Setup members */
3084                    DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3085                    if(initULRRCMsg->protocolIEs.list.array == NULLP)
3086                    {
3087                       DU_LOG(" F1AP : Memory allocation for\
3088                                 RRCSetupRequestMessageTransferIEs failed");
3089                                 break;
3090                    }
3091                    for(idx=0; idx<elementCnt; idx++)
3092               {
3093                            DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
3094                                  sizeof(InitialULRRCMessageTransferIEs_t));
3095                                  if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
3096                                  {
3097                                      break;
3098                                  }
3099                    }
3100                    idx1 = 0;
3101                    /*GNB DU UE F1AP ID*/
3102                    initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3103                                       ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
3104                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality  = Criticality_reject;
3105                    initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3106                                       InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
3107                    initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
3108
3109
3110                         /*NRCGI*/
3111                         idx1++;
3112                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3113                                  ProtocolIE_ID_id_NRCGI;
3114                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality  =Criticality_reject;
3115                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present = \
3116                        InitialULRRCMessageTransferIEs__value_PR_NRCGI;
3117                    
3118                         ret =\
3119                         BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI);
3120               if(ret!=ROK)
3121                         {
3122                             break;
3123                         }
3124
3125                         /*CRNTI*/
3126                         idx1++;
3127                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3128                                        ProtocolIE_ID_id_C_RNTI;
3129                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3130                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3131                                  InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
3132                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.C_RNTI = crnti;
3133
3134          /*RRCContainer*/
3135                         idx1++;
3136                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3137                                        ProtocolIE_ID_id_RRCContainer;
3138                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3139                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3140                                  InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
3141                                                                 
3142                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size =\
3143                                                       strlen((const char*)rrcContainer);
3144          DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3145                                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3146                         if(!initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3147                         {
3148                       DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
3149                                 break;
3150
3151                         }
3152          memcpy(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, rrcContainer,
3153                                         initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
3154
3155
3156                         /*DUtoCURRCContainer*/
3157                         idx1++;
3158                         initULRRCMsg->protocolIEs.list.array[idx1]->id  = \
3159                                        ProtocolIE_ID_id_DUtoCURRCContainer;
3160                         initULRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
3161                         initULRRCMsg->protocolIEs.list.array[idx1]->value.present =\
3162                                  InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
3163
3164                         ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer);
3165          if(ret != ROK)
3166                         {
3167                            break;
3168                         }
3169
3170                         xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3171
3172                         /* Encode the F1SetupRequest type as APER */
3173                         cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3174                         encBufSize = 0;
3175                         encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
3176                         /* Encode results */
3177                         if(encRetVal.encoded == ENCODE_FAIL)
3178                         {
3179                             DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer\
3180                                     structure (at %s)\n",encRetVal.failed_type ? \
3181                                          encRetVal.failed_type->name : "unknown");
3182                                  break;
3183                         }
3184                         else
3185                         {
3186                             
3187                                   DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC\
3188                                   Message transfer\n");
3189                                    for(int i=0; i< encBufSize; i++)
3190                                         {
3191                                             printf("%x",encBuf[i]);
3192                                         }
3193                         }
3194                         /* Sending  msg  */
3195                         if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
3196                         {
3197                             DU_LOG("\n F1AP : Sending Initial UL RRC Message Transfer Failed");
3198                                  break;
3199                         }
3200                         checkvar=true;
3201                         break;
3202         }
3203    
3204         if(f1apMsg != NULLP)
3205    {
3206             if(f1apMsg->choice.initiatingMessage != NULLP)
3207                  {
3208                      if(initULRRCMsg->protocolIEs.list.array != NULLP)
3209                           {
3210                          if(idx == elementCnt)
3211                               {
3212                                        idx1=1;
3213                                   if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf!=NULLP)
3214                                        {
3215                                            if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf!=NULLP)
3216                                                 {
3217                                                     DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.buf,
3218                                                          initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.nRCellIdentity.size);
3219                                                 }
3220                                                 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.buf,\
3221                                                  initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.NRCGI.pLMN_Identity.size);
3222                                         }
3223
3224                                                   idx1=3;
3225                                                   if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
3226                                                   {
3227                                                           DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
3228                                                                           initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
3229                                                   }
3230
3231                                                   idx1 = 4;
3232                                                   if(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf)
3233                                                   {
3234                                                      DU_FREE(initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.buf,
3235                                                           initULRRCMsg->protocolIEs.list.array[idx1]->value.choice.DUtoCURRCContainer.size);
3236                                                   }
3237                                         for(ieId=0; ieId<elementCnt; ieId++)
3238                                         {
3239                                            DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3240                                         }
3241                                }
3242                                else
3243                                {
3244                                     for(ieId=0; ieId<idx; ieId++)
3245                                               {
3246                                                   DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],sizeof(InitialULRRCMessageTransferIEs_t));
3247                                               }
3248                                }
3249                                          DU_FREE(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
3250                          }
3251                          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3252                  }
3253                  DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3254         }
3255         if(checkvar==true)
3256            return ROK;
3257         else
3258            return RFAILED;
3259 }/* End of BuildAndSendInitialRrcMsgTransfer*/
3260
3261 /*******************************************************************
3262  *
3263  * @brief Builds Special cell list for UE Setup Request 
3264  *
3265  * @details
3266  *
3267  *    Function : BuildSplCellList
3268  *
3269  *    Functionality: Constructs the Special Cell list for UESetReq
3270  *
3271  * @params[in] SCell_ToBeSetup_List_t *spCellLst
3272  *
3273  * @return ROK     - success
3274  *         RFAILED - failure
3275  *
3276  * ****************************************************************/
3277 S16 BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3278 {
3279         U8  cellCnt;
3280         U8  idx;
3281         S16 ret;
3282         cellCnt = 1;
3283         spCellLst->list.count = cellCnt;
3284         spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
3285         DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
3286         if(spCellLst->list.array == NULLP)
3287         {
3288                 return RFAILED;
3289         }
3290         for(idx=0; idx<cellCnt; idx++)
3291         {
3292                 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3293                 if(spCellLst->list.array[idx] == NULLP)
3294                 {
3295                         return RFAILED;
3296                 }
3297         }
3298         idx = 0;
3299         spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
3300         spCellLst->list.array[idx]->criticality = Criticality_ignore;
3301         spCellLst->list.array[idx]->value.present =\
3302                 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
3303         /* Special Cell ID -NRCGI */
3304         ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3305         if(ret != ROK)
3306         {
3307                 return RFAILED;
3308         }
3309         /*Special Cell Index*/
3310         spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
3311   return ROK;   
3312 }/* End of BuildSplCellList*/
3313
3314 /*******************************************************************
3315  *
3316  * @brief Builds SRBS to be setup 
3317  *
3318  * @details
3319  *
3320  *    Function : BuildSRBSetup
3321  *
3322  *    Functionality: Constructs the SRB's for UESetReq
3323  *
3324  * @params[in] SRBs_ToBeSetup_List_t *srbSet
3325  *
3326  * @return ROK     - success
3327  *         RFAILED - failure
3328  *
3329  * ****************************************************************/
3330 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3331 {
3332         U8 idx;
3333         U8 srbCnt;
3334         srbCnt = 1;
3335         srbSet->list.count = srbCnt;
3336         srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
3337         DU_ALLOC(srbSet->list.array,srbSet->list.size);
3338         if(srbSet->list.array == NULLP)
3339         {
3340                 return RFAILED;
3341         }
3342         for(idx=0; idx<srbCnt; idx++)
3343         {
3344                 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3345                 if(srbSet->list.array[idx] == NULLP)
3346            {
3347                    return RFAILED;
3348                 }
3349         }
3350         idx = 0;
3351         srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
3352         srbSet->list.array[idx]->criticality = Criticality_ignore;
3353         srbSet->list.array[idx]->value.present = \
3354                         SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
3355    srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
3356    return ROK;
3357 }/* End of BuildSRBSetup*/
3358
3359 /*******************************************************************
3360  *
3361  * @brief Builds QOS Info for DRB Setum Item 
3362  *
3363  * @details
3364  *
3365  *    Function : BuildQOSInfo
3366  *
3367  *    Functionality: Constructs the QOS Info for DRB Setup Item
3368  *
3369  * @params[in] QoSInformation_t *qosinfo
3370  *
3371  * @return ROK     - success
3372  *         RFAILED - failure
3373  *
3374  * ****************************************************************/
3375 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3376 {
3377         /* NonDynamic5QIDescriptor */
3378         drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
3379         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3380         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
3381         {
3382                 return RFAILED;
3383         }
3384         /*FiveQI*/
3385         drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
3386         /*AveragingWindow*/
3387         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3388                                                                                                 sizeof(AveragingWindow_t));
3389         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
3390                                                                                                                                                                                                         NULLP)
3391         {
3392                 return RFAILED;
3393         }
3394         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
3395         /*MaxDataBurstVolume*/
3396         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3397                                                                                                 sizeof(MaxDataBurstVolume_t));
3398         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
3399                                                                                                                                                                                                         NULLP)
3400         {
3401                 return RFAILED;
3402         }
3403         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
3404
3405         /*nRGRAN Allocation Retention Priority*/
3406         drbQos->nGRANallocationRetentionPriority.priorityLevel =        \
3407                                                                                                 PriorityLevel_highest;
3408         drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
3409                                                         Pre_emptionCapability_may_trigger_pre_emption;
3410         drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
3411                                                                 Pre_emptionVulnerability_not_pre_emptable;
3412
3413         /* TO DO: GBR_QoSFlowInformation */
3414         return ROK;
3415 }/*End of BuildQOSInfo*/
3416
3417 /*******************************************************************
3418  *
3419  * @brief Builds SNSSAI  
3420  *
3421  * @details
3422  *
3423  *    Function : BuildSNSSAI
3424  *
3425  *    Functionality: Constructs the SNSSAI For DRB list
3426  *
3427  * @params[in] SNSSAI_t *snssai
3428  *
3429  * @return ROK     - success
3430  *         RFAILED - failure
3431  *
3432  * ****************************************************************/
3433 S16 BuildSNSSAI(SNSSAI_t *snssai)
3434 {
3435         /*SNSSAI*/
3436           /*ssT*/
3437         snssai->sST.size = sizeof(U8);
3438         DU_ALLOC(snssai->sST.buf,snssai->sST.size);
3439         if(snssai->sST.buf == NULLP)
3440         {
3441                 return RFAILED;
3442         }
3443         snssai->sST.buf[0] = 3;
3444           /*sD*/
3445         DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
3446         if(snssai->sD == NULLP)
3447         {
3448                 return RFAILED;
3449         }
3450         snssai->sD->size = 3*sizeof(U8);
3451         DU_ALLOC(snssai->sD->buf,snssai->sD->size);
3452         if(snssai->sD->buf == NULLP)
3453         {
3454                 return RFAILED;
3455         }
3456                 snssai->sD->buf[0] = 3;
3457                 snssai->sD->buf[1] = 6;
3458                 snssai->sD->buf[2] = 9;
3459    return ROK;
3460 }/*End of BuildSNSSAI*/
3461
3462 /*******************************************************************
3463  *
3464  * @brief Builds the flow map.  
3465  *
3466  * @details
3467  *
3468  *    Function : BuildFlowsMap
3469  *
3470  *    Functionality: Constructs the flowmap For DRB list
3471  *
3472  * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
3473  *
3474  * @return ROK     - success
3475  *         RFAILED - failure
3476  *
3477  * ****************************************************************/
3478 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
3479 {
3480         S16 ret;
3481         U8  idx;
3482         U8 flowCnt;
3483         flowCnt = 1;
3484         flowMap->list.count = flowCnt;
3485         flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
3486         DU_ALLOC(flowMap->list.array,flowMap->list.size);
3487         if(flowMap->list.array == NULLP)
3488         {
3489                 return RFAILED;
3490         }
3491         for(idx=0; idx<flowCnt; idx++)
3492         {
3493                 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
3494                 if(flowMap->list.array[idx] == NULLP)
3495                 {
3496                    return RFAILED;
3497                 }
3498         }
3499         idx = 0;
3500         flowMap->list.array[idx]->qoSFlowIdentifier = 0;
3501         ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
3502         if(ret != ROK)
3503         {
3504                 return RFAILED;
3505         }
3506    return ROK;
3507 }/*End of BuildFlowsMap*/
3508
3509 /*******************************************************************
3510  *
3511  * @brief Builds the Uplink Tunnel Info  
3512  *
3513  * @details
3514  *
3515  *    Function : BuildULTnlInfo
3516  *
3517  *    Functionality: Constructs the UL TnlInfo For DRB list
3518  *
3519  * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3520  *
3521  * @return ROK     - success
3522  *         RFAILED - failure
3523  *
3524  * ****************************************************************/
3525 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3526 {
3527         U8 idx;
3528         U8 ulCnt;
3529         ulCnt = 1;
3530         ulInfo->list.count = ulCnt;
3531         ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
3532         DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
3533         if(ulInfo->list.array == NULLP)
3534         {
3535                 return RFAILED;
3536         }
3537         for(idx=0; idx<ulCnt; idx++)
3538         {
3539                 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3540                 if(ulInfo->list.array[idx] == NULLP)
3541                 {
3542                         return RFAILED;
3543                 }
3544         }
3545         idx = 0;
3546         ulInfo->list.array[idx]->uLUPTNLInformation.present = \
3547                                                                 UPTransportLayerInformation_PR_gTPTunnel;
3548         /*GTP TUNNEL*/
3549         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
3550                                 sizeof(GTPTunnel_t));
3551         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
3552         {
3553                 return RFAILED;
3554         }
3555         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3556                 transportLayerAddress.size      = 4*sizeof(U8);
3557    DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3558                 transportLayerAddress.buf,ulInfo->list.array[idx]->\
3559                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3560         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3561                 transportLayerAddress.buf == NULLP)
3562         {
3563                 return RFAILED;
3564         }
3565         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3566                 transportLayerAddress.buf[0] = 4;
3567         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3568                 transportLayerAddress.buf[1] = 4;
3569         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3570                 transportLayerAddress.buf[2] = 4;
3571         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3572                 transportLayerAddress.buf[3] = 5;
3573         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3574                 transportLayerAddress.bits_unused = 0;
3575         /*GTP TEID*/
3576         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
3577                                         = 4 * sizeof(U8);
3578         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3579                                 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
3580                                 gTPTunnel->gTP_TEID.size);
3581         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3582                                 == NULLP)
3583         {
3584                 return RFAILED;
3585         }
3586         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3587                 gTP_TEID.buf[0] = 11;
3588         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3589                 gTP_TEID.buf[1] = 0;
3590         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3591                 gTP_TEID.buf[2] = 0;
3592         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
3593                 gTP_TEID.buf[3] = 1;
3594
3595    return ROK;
3596 }/*End of BuildULTnlInfo*/
3597
3598 /*******************************************************************
3599  *
3600  * @brief Builds DRBS to be setup 
3601  *
3602  * @details
3603  *
3604  *    Function : BuildDRBSetup
3605  *
3606  *    Functionality: Constructs the DRB's for UESetReq
3607  *
3608  * @params[in] DRBs_ToBeSetup_List_t *drbSet
3609  *
3610  * @return ROK     - success
3611  *         RFAILED - failure
3612  *
3613  * ****************************************************************/
3614 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3615 {
3616         S16 BuildQOSInforet;
3617         S16 BuildSNSSAIret;
3618         S16 BuildFlowsMapret;
3619         U8       idx;
3620         U8  drbCnt;
3621         DRBs_ToBeSetup_Item_t *drbSetItem;
3622         drbCnt = 1;
3623         drbSet->list.count = drbCnt;
3624         drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
3625         DU_ALLOC(drbSet->list.array,drbSet->list.size);
3626         if(drbSet->list.array == NULLP)
3627         {
3628                 return RFAILED;
3629         }
3630         for(idx=0; idx<drbCnt; idx++)
3631         {
3632                 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3633                 if(drbSet->list.array[idx] == NULLP)
3634                 {
3635                         return RFAILED;
3636                 }
3637         }
3638         idx = 0;
3639         drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
3640         drbSet->list.array[idx]->criticality = Criticality_ignore;
3641         drbSet->list.array[idx]->value.present = \
3642                         DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
3643    drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;     
3644         /*dRBID*/
3645         drbSetItem->dRBID = 1;  
3646         /*qoSInformation*/
3647         drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
3648         DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3649         if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
3650         {       
3651                 return RFAILED;
3652         }
3653         drbSetItem->qoSInformation.choice.choice_extension->id = \
3654                                                         ProtocolIE_ID_id_DRB_Information;
3655         drbSetItem->qoSInformation.choice.choice_extension->criticality = \
3656                                                         Criticality_ignore;
3657         drbSetItem->qoSInformation.choice.choice_extension->value.present = \
3658                                                         QoSInformation_ExtIEs__value_PR_DRB_Information;
3659         BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
3660                                                         choice_extension->value.choice.DRB_Information.dRB_QoS);
3661         if(BuildQOSInforet != ROK)
3662         {
3663                 return RFAILED;
3664         }
3665         /*SNSSAI*/
3666         BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
3667                                                         choice_extension->value.choice.DRB_Information.sNSSAI);
3668         if(BuildSNSSAIret != ROK)
3669         {       
3670                 return RFAILED;
3671         }
3672         /*Flows mapped to DRB List*/
3673         BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
3674                                 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
3675         if(BuildFlowsMapret != ROK)
3676         {
3677                 return RFAILED;
3678         }
3679         /*ULUPTNLInformation To Be Setup List*/
3680    BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3681         if(BuildULTnlInforet != ROK)
3682         {
3683                 return RFAILED;
3684         }
3685         /*RLCMode*/
3686         drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
3687
3688         /*UL Configuration*/
3689         DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3690         if(drbSetItem->uLConfiguration == NULLP)
3691         {
3692            return RFAILED;
3693         }
3694         drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
3695         return ROK;
3696 }/* End of BuildDRBSetup*/
3697 /*******************************************************************
3698 *
3699 * @brief Deallocating memory of function BuildAndSendUESetReq
3700 *
3701 * @details
3702 *
3703 *    Function : FreeNrcgi
3704 *
3705 *    Functionality: Deallocating memory for function BuildNrcgi
3706 *
3707 * @params[in] NRCGI_t *nrcgi
3708 *
3709 * @return void
3710 *
3711 *******************************************************************/
3712 void FreeNrcgi(NRCGI_t *nrcgi)
3713 {
3714         if(nrcgi->pLMN_Identity.buf != NULLP)
3715         {
3716              if(nrcgi->nRCellIdentity.buf != NULLP)
3717              {
3718            DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size); 
3719                   }
3720              DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
3721         }
3722 }
3723 /*******************************************************************
3724 *
3725 * @brief  Deallocating memory of function BuildAndSendUESetReq
3726 *
3727 * @details
3728 *
3729 *    Function : FreeSplCellList
3730 *
3731 *    Functionality: Deallocating memory for function BuildSplCellList
3732 *
3733 * @params[in] SCell_ToBeSetup_List_t *spCellLst
3734 *
3735 * @return void
3736 *      
3737 *
3738 * *****************************************************************/
3739 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
3740 {
3741     U8  cellidx;
3742     if(spCellLst->list.array != NULLP)
3743          {
3744               for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
3745                         {
3746                             if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
3747                                  {
3748                                     FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
3749                                  }
3750                                  if(spCellLst->list.array[cellidx]!=NULLP)
3751                                  {
3752                                      DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
3753                                  }
3754                         }
3755                         DU_FREE(spCellLst->list.array,spCellLst->list.size);
3756          }
3757 }
3758  /*******************************************************************
3759  *
3760  * @brief Deallocating memory of function BuildAndSendUESetReq
3761  *
3762  * @details
3763  *
3764  *    Function : FreeSRBSetup
3765  *
3766  *    Functionality: Deallocating memory for function BuildSRBSetup
3767  *
3768  * @params[in] SRBs_ToBeSetup_List_t *srbSet
3769  *
3770  * @return void
3771  *        
3772  *
3773  * ******************************************************************/
3774 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
3775 {
3776     U8 srbidx;
3777          if(srbSet->list.array != NULLP)
3778          {
3779              for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
3780                   {
3781                       if(srbSet->list.array[srbidx]!=NULLP)
3782                                 {
3783                                     DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
3784                                 }
3785                   }
3786                   DU_FREE(srbSet->list.array,srbSet->list.size);
3787          }
3788 }
3789  /*******************************************************************
3790   *
3791   * @brief Deallocating memory of function BuildAndSendUESetReq
3792   *
3793   * @details
3794   *
3795   *    Function : FreeQOSInfo
3796   *
3797   *    Functionality:  Deallocating memory for function BuildQOSInfo
3798   *
3799   * @params[in] QoSFlowLevelQoSParameters_t *drbQos
3800   *
3801   * @return void
3802   *          
3803   * ****************************************************************/
3804 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
3805 {
3806     if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
3807          {
3808              if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3809                   {
3810                       if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3811                                 {
3812                                     DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3813                                          sizeof(MaxDataBurstVolume_t));
3814                                 }
3815                                  DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3816                                  sizeof(AveragingWindow_t));
3817                   }
3818                   DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
3819                   sizeof(NonDynamic5QIDescriptor_t));
3820          }
3821 }
3822  /*******************************************************************
3823   *
3824   * @brief Deallocating memory of function BuildAndSendUESetReq
3825   *
3826   * @details
3827   *
3828   *    Function : FreeULTnlInfo
3829   *
3830   *    Functionality:  Deallocating memory for function BuildULTnlInfo
3831   *
3832   * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
3833   *
3834   * @return void
3835   *         
3836  
3837  * ****************************************************************/
3838 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
3839 {
3840     U8 ulidx=0;
3841          if(ulInfo->list.array != NULLP)
3842          {
3843              for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
3844                   {
3845                       if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
3846                                 {
3847                                     if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
3848                                          {
3849                                              if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3850                                                   transportLayerAddress.buf != NULLP)
3851                                                   {
3852                                                       if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
3853                                                                 !=NULLP)
3854                                                                 {
3855                                                                      DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3856                                                                           gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
3857                                                                           gTPTunnel->gTP_TEID.size);
3858                                                                 }
3859                                                                 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
3860                                                                 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
3861                                                                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
3862                                                   }
3863                                                   DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3864                                                   sizeof(GTPTunnel_t));
3865                                          }
3866                                 }
3867                                 if(ulInfo->list.array[ulidx]!=NULLP)
3868                                 {
3869                                     DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3870                                 }
3871                   }
3872                   DU_FREE(ulInfo->list.array,ulInfo->list.size);
3873          }
3874 }
3875 /*******************************************************************
3876  *
3877  * @brief Deallocating memory for BuildAndSendUESetReq
3878  *
3879  * @details
3880  *
3881  *    Function : FreeDRBSetup
3882  *
3883  *    Functionality:  Deallocating memory for BuildDRBSetup
3884  *
3885  * @params[in] DRBs_ToBeSetup_List_t *drbSet
3886  *
3887  * @return void
3888  *
3889  * ****************************************************************/
3890 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
3891 {
3892     DRBs_ToBeSetup_Item_t *drbSetItem;
3893          U8  flowidx;
3894          U8  drbidx;
3895     if(drbSet->list.array == NULLP)
3896          {
3897              for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
3898                   {
3899                        if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
3900                                  {
3901                                     drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
3902                                     if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
3903                                          {
3904                                                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3905                                                          qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
3906                                                          {
3907                                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3908                                                                   qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3909                                                                   {
3910                                                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3911                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3912                                                                                  {
3913                                                                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
3914                                                                                           {
3915                                                                                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
3916                                                                                                         {
3917                                                                                                             if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
3918                                                                                                                  {
3919                                                                                                                       if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3920                                                                                                                                 flows_Mapped_To_DRB_List.list.array != NULLP)
3921                                                                                                                                 {
3922                                                                                                                                     for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3923                                                                                                                                          flows_Mapped_To_DRB_List.list.count; flowidx++)
3924                                                                                                                                          {
3925                                                                                                                                              if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3926                                                                                                                                                   DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3927                                                                                                                                                   {
3928                                                                                                                                                       if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3929                                                                                                                                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3930                                                                                                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
3931                                                                                                                                                                 {
3932                                                                                                                                                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3933                                                                                                                                                                           DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3934                                                                                                                                                                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
3935                                                                                                                                                                           {
3936                                                                                                                                                                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3937                                                                                                                                                                                         DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3938                                                                                                                                                                                         qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
3939                                                                                                                                                                                    {    
3940                                                                                                                                                                                                  if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
3941                                                                                                                                                                                                  {
3942                                                                                                                                                                                                      DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
3943                                                                                                                                                                                                  }
3944                                                                                                                                                                                                  FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
3945                                                                          DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3946                                                                                                                                                                                                  DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3947                                                                                                                                                                                        qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3948                                                                                                                                                                                                  sizeof(MaxDataBurstVolume_t));   
3949                                                                                                                                                                                    }
3950                                                                                                                                                                                         DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3951                                                                                                                                                                                         DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3952                                                                                                                                                                                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3953                                                                                                                                                                           }
3954                                                                                                                                                                           DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3955                                                                                                                                                                           DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
3956                                                                  qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
3957                                                                                                                                                                 }
3958                                                                                                                                                   }
3959                                                                                                                                                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3960                                                                                                                                                   DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
3961                                                                                                                                                   {
3962                                                                                                                                                       DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
3963                                                                                                                                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
3964                                                                                                                                                   }
3965                                                                                                                                          }
3966                                                                                                                                     DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
3967                                                                                                                                          flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
3968                                                                                                                                          choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
3969                                                                                                                                 }
3970                                                                                                                       DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
3971                                                                                                                         drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
3972                                                                                                                  }
3973                                                                                                                  DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
3974                                                                                                                  sizeof(OCTET_STRING_t));
3975                                                                                                         }
3976                                                                                                          DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
3977                                                                                                          drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
3978                                                                                           }
3979                                                                                           DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3980                                                                                      qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
3981                                                                                  }
3982                                                                        DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3983                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
3984                                                                   }
3985                                                              DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
3986                                                                   qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
3987                                                          }
3988                                                    DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
3989                                          }
3990                                  }
3991                        if(drbSet->list.array[drbidx]!=NULLP)
3992                                  {
3993                                      DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
3994                                 }
3995                   }
3996              DU_FREE(drbSet->list.array,drbSet->list.size);
3997          }
3998 }
3999 /*******************************************************************
4000  *
4001  * @brief Builds and sends the UE Setup Request 
4002  *
4003  * @details
4004  *
4005  *    Function : BuildAndSendUESetReq
4006  *
4007  *    Functionality: Constructs the UE Setup Request and sends
4008  *                   it to the CU through SCTP.
4009  *
4010  * @params[in] 
4011  *
4012  * @return ROK     - success
4013  *         RFAILED - failure
4014  *
4015  * ****************************************************************/
4016 S16 BuildAndSendUESetReq()
4017 {
4018         S16  ret;
4019         U8   elementCnt;
4020         S16  BuildNrcgiret;
4021         S16  BuildSplCellListret;
4022         S16  BuildSRBSetupret;
4023         U8   idx;
4024         U8   idx1;
4025         U8   ieId;
4026         F1AP_PDU_t                                              *f1apMsg = NULL;
4027    UEContextSetupRequest_t                      *ueSetReq;
4028         asn_enc_rval_t                                          encRetVal;        /* Encoder return value */
4029    bool checkvar=false;
4030         while(1)
4031         {
4032             DU_LOG("\n F1AP : Building UE Context Setup Request\n");
4033
4034             DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
4035             if(f1apMsg == NULLP)
4036             {
4037                     DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
4038                          break;
4039             }
4040
4041             f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
4042             DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4043             if(f1apMsg->choice.initiatingMessage == NULLP)
4044             {
4045                      DU_LOG(" F1AP : Memory allocation for      F1AP-PDU failed");
4046                           break;
4047             }
4048
4049             f1apMsg->choice.initiatingMessage->procedureCode = \
4050                                                                                                         ProcedureCode_id_UEContextSetup;
4051             f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
4052             f1apMsg->choice.initiatingMessage->value.present = \
4053                                    InitiatingMessage__value_PR_UEContextSetupRequest;
4054             ueSetReq =
4055                   &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
4056             elementCnt = 9;
4057             ueSetReq->protocolIEs.list.count = elementCnt;
4058             ueSetReq->protocolIEs.list.size = \
4059                                                                         elementCnt * sizeof(UEContextSetupRequestIEs_t *);
4060
4061             /* Initialize the UESetup members */
4062             DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
4063             
4064                  if(ueSetReq->protocolIEs.list.array == NULLP)
4065             {
4066                      DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
4067                           break;
4068             }
4069
4070             for(idx1=0; idx1<elementCnt; idx1++)
4071             {
4072                      DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
4073                      if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
4074                      {
4075                              break;
4076                      }
4077             }
4078
4079             idx = 0;
4080
4081             /*GNB CU UE F1AP ID*/
4082             ueSetReq->protocolIEs.list.array[idx]->id   = \
4083                                                                                  ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
4084          ueSetReq->protocolIEs.list.array[idx]->criticality     =       Criticality_reject;
4085             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4086                                                 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
4087             ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
4088
4089             /*GNB DU UE F1AP ID*/
4090             idx++;
4091             ueSetReq->protocolIEs.list.array[idx]->id   = \
4092                                                                                  ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
4093             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_ignore;
4094             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4095                                                 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
4096             ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
4097
4098             /*Special Cell ID*/
4099             idx++;
4100             ueSetReq->protocolIEs.list.array[idx]->id   = \
4101                                                                                                          ProtocolIE_ID_id_SpCell_ID;
4102             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
4103             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4104                                                                 UEContextSetupRequestIEs__value_PR_NRCGI;
4105             BuildNrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
4106             if(BuildNrcgiret != ROK)
4107             {
4108                     break;
4109             }
4110
4111             /*Served Cell Index*/
4112             idx++;
4113             ueSetReq->protocolIEs.list.array[idx]->id   = \
4114                                                                                                  ProtocolIE_ID_id_ServCellIndex;
4115             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
4116             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4117                                                 UEContextSetupRequestIEs__value_PR_ServCellIndex;
4118             ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
4119             CELL_INDEX;
4120
4121             /*CellULConfigured*/
4122             idx++;
4123             ueSetReq->protocolIEs.list.array[idx]->id   = \
4124                                                                                         ProtocolIE_ID_id_SpCellULConfigured;
4125             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_ignore;
4126             ueSetReq->protocolIEs.list.array[idx]->value.present = \
4127                                                                         UEContextSetupRequestIEs__value_PR_CellULConfigured;
4128             ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
4129                                                                                                                                                         CellULConfigured_none;
4130
4131
4132              /*CUtoDURRCContainer*/
4133              idx++;
4134              ueSetReq->protocolIEs.list.array[idx]->id  = \
4135                                                                                                   ProtocolIE_ID_id_CUtoDURRCInformation;
4136              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
4137              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4138                                                 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
4139
4140              /*Special Cells to be SetupList*/
4141              idx++;
4142              ueSetReq->protocolIEs.list.array[idx]->id  = \
4143                                                                                                   ProtocolIE_ID_id_SCell_ToBeSetup_List;
4144              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_ignore;
4145              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4146                                                 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
4147              BuildSplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
4148              if(BuildSplCellListret != ROK)
4149              {  
4150                      break;
4151              }
4152              /*SRBs To Be Setup List*/
4153              idx++;
4154              ueSetReq->protocolIEs.list.array[idx]->id  = \
4155                                                                                  ProtocolIE_ID_id_SRBs_ToBeSetup_List;
4156              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
4157              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4158                                                 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
4159              BuildSRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
4160              if(BuildSRBSetupret != ROK)
4161              {        
4162                      break;
4163              }
4164              /*DRBs to Be Setup List*/
4165              idx++;
4166              ueSetReq->protocolIEs.list.array[idx]->id  = \
4167                                                                                  ProtocolIE_ID_id_DRBs_ToBeSetup_List;
4168              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
4169              ueSetReq->protocolIEs.list.array[idx]->value.present = \
4170                                                 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
4171              ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
4172              if(ret != ROK)
4173              {  
4174                      break;
4175              }
4176
4177              xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4178
4179              /* Encode the F1SetupRequest type as APER */
4180              cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
4181              encBufSize = 0;
4182              encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
4183                         encBuf);
4184              /* Encode results */
4185              if(encRetVal.encoded == ENCODE_FAIL)
4186              {
4187                 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
4188                                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
4189                       break;
4190              }
4191              else
4192              {
4193                       DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
4194                       for(int i=0; i< encBufSize; i++)
4195                       {
4196                         printf("%x",encBuf[i]);
4197                       }
4198             }
4199
4200             /* Sending  msg  */
4201             if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL)   !=      ROK)
4202             {
4203                 DU_LOG("\n F1AP : Sending       UE Context Setup Request Failed");
4204                       break;
4205             }
4206                  checkvar=true;
4207                  break;
4208    }
4209    if(f1apMsg != NULLP)
4210         {
4211             if(f1apMsg->choice.initiatingMessage != NULLP)
4212                  {
4213                       if(ueSetReq->protocolIEs.list.array != NULLP)
4214                                 {
4215                                if(idx1==elementCnt)
4216                                          {
4217                                                   if(BuildNrcgiret==ROK)
4218                                                   {
4219                                                                  if(BuildSplCellListret==ROK)
4220                                                                  {
4221                                                                            if(BuildSRBSetupret == ROK)
4222                                                                                 {
4223                                                                                    FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.DRBs_ToBeSetup_List); 
4224                                                                                 }
4225                                                                                 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.SRBs_ToBeSetup_List);
4226                                                                  }    
4227                                                                  FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List); 
4228                                                   }
4229                                                   idx=2;
4230                                                   FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);   
4231                                                   for(ieId=0; ieId<idx1; ieId++)
4232                                                   {
4233                                                       DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4234                                                   }
4235                                          }
4236                                          else
4237                                          {
4238                                              for(ieId=0; ieId<idx; ieId++)
4239                                                   {
4240                                                       if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
4241                                                                 {
4242                                                           DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
4243                                                                 }
4244                                                   }
4245                                          }
4246                                          DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);        
4247                                 }
4248                       DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
4249                  }
4250             DU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); 
4251         }
4252         if(checkvar==true)
4253         return ROK;
4254         else
4255              return RFAILED;
4256 }/* End of BuildAndSendUESetReq*/
4257
4258 /*******************************************************************
4259 *
4260 * @brief Handles received F1AP message and sends back response  
4261 *
4262 * @details
4263 *
4264 *    Function : F1APMsgHdlr
4265 *
4266 *    Functionality:
4267 *         - Decodes received F1AP control message
4268 *         - Prepares response message, encodes and sends to SCTP
4269 *
4270 * @params[in] 
4271 * @return ROK     - success
4272 *         RFAILED - failure
4273 *
4274 * ****************************************************************/
4275 void F1APMsgHdlr(Buffer *mBuf)
4276 {
4277    int i;
4278    char *recvBuf;
4279    MsgLen copyCnt;
4280    MsgLen recvBufLen;
4281    F1AP_PDU_t *f1apMsg;
4282    asn_dec_rval_t rval; /* Decoder return value */
4283    F1AP_PDU_t f1apasnmsg ;
4284  
4285    DU_LOG("\nF1AP : Received F1AP message buffer");
4286    SPrntMsg(mBuf, 0,0);
4287  
4288    /* Copy mBuf into char array to decode it */
4289    SFndLenMsg(mBuf, &recvBufLen);
4290    if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
4291    {
4292       DU_LOG("\nF1AP : Memory allocation failed");
4293       return;
4294    }
4295    if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
4296    {
4297       DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
4298       return;
4299    }
4300
4301    printf("\nF1AP : Received flat buffer to be decoded : ");
4302    for(i=0; i< recvBufLen; i++)
4303    {
4304         printf("%x",recvBuf[i]);
4305    }
4306
4307    /* Decoding flat buffer into F1AP messsage */
4308    f1apMsg = &f1apasnmsg;
4309    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
4310  
4311    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
4312    SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
4313    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
4314    {
4315       DU_LOG("\nF1AP : ASN decode failed");
4316       return;
4317    }
4318    printf("\n");
4319    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
4320
4321    switch(f1apMsg->present)
4322    {
4323       case F1AP_PDU_PR_successfulOutcome:
4324       {
4325          switch(f1apMsg->choice.successfulOutcome->value.present)
4326          {
4327             case SuccessfulOutcome__value_PR_F1SetupResponse:
4328             {                           
4329 #ifndef ODU_TEST_STUB
4330                procF1SetupRsp(f1apMsg);
4331 #endif
4332                break;
4333             }
4334             
4335             case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
4336             {
4337                procGNBDUCfgUpdAck(f1apMsg);
4338                break;
4339             }
4340
4341             default:
4342             {
4343                DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
4344                return;
4345             }
4346          }/* End of switch(successfulOutcome) */
4347          break;
4348       }
4349                 case F1AP_PDU_PR_initiatingMessage:
4350                 {
4351                         switch(f1apMsg->choice.initiatingMessage->value.present)
4352                         {
4353                                 case InitiatingMessage__value_PR_DLRRCMessageTransfer:
4354                                         {
4355                                                 procDlRrcMsgTrans(f1apMsg);
4356                                                 break;
4357                                         }
4358
4359                                 default:
4360                                         {
4361                                                 DU_LOG("\nF1AP : Invalid type of initiating message[%d]",
4362                                                                 f1apMsg->choice.initiatingMessage->value.present);
4363                                                 return;
4364                                         }
4365                         }/* End of switch(initiatingMessage) */
4366                         break;
4367                 }
4368
4369       default:
4370       {
4371          DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
4372          return;
4373       }
4374
4375    }/* End of switch(f1apMsg->present) */
4376  
4377 } /* End of F1APMsgHdlr */
4378  
4379 /**********************************************************************
4380   End of file
4381  **********************************************************************/