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