MAC PDU de-mux and warning fixes
[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;
1125         U8 idy;
1126         U8 idx1;
1127         U8 idy1;
1128         U8 idy2;
1129    U8 elementCnt;
1130         U8 modifyCnt;
1131         U8 servPlmnCnt;
1132         U8 extensionCnt;
1133    asn_enc_rval_t encRetVal;      /* Encoder return value */
1134    F1AP_PDU_t *f1apDuCfg = NULL;
1135    GNBDUConfigurationUpdate_t *duCfgUpdate;
1136    Served_Cells_To_Modify_List_t  *cellsToModify;
1137    Served_Cells_To_Modify_Item_t *modifyItem;
1138    bool checkvar=false;
1139    U8 i;
1140
1141         while(1)
1142         {
1143             DU_LOG("\nF1AP : Building DU config update\n");
1144                  /* Allocate the memory for F1DuCfg */
1145             DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
1146                  if(f1apDuCfg == NULLP)
1147                  {
1148                    DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1149                    break;
1150                  }
1151                 
1152                  f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
1153        DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1154        if(f1apDuCfg->choice.initiatingMessage == NULLP)
1155                  {
1156                     DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
1157                          break;
1158                  }
1159                 
1160                  f1apDuCfg->choice.initiatingMessage->procedureCode = \
1161                                  ProcedureCode_id_gNBDUConfigurationUpdate;
1162                  f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
1163                  f1apDuCfg->choice.initiatingMessage->value.present = \
1164                                  InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
1165             duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
1166                                     choice.GNBDUConfigurationUpdate;
1167                  elementCnt = 3;
1168                  duCfgUpdate->protocolIEs.list.count = elementCnt;
1169                  duCfgUpdate->protocolIEs.list.size = \
1170                                  elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
1171      
1172            /* Initialize the F1Setup members */
1173                  DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1174                  if(duCfgUpdate->protocolIEs.list.array == NULLP)
1175                  {
1176                    DU_LOG("F1AP : Memory allocation for F1RequestIEs failed");
1177                         break;
1178                  }
1179                  for(idx=0;idx<elementCnt;idx++)
1180                  {
1181                     DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx],sizeof(GNBDUConfigurationUpdateIEs_t));
1182                           if(duCfgUpdate->protocolIEs.list.array[idx] == NULLP)
1183                           {
1184                                   break;
1185                           }
1186                  }
1187                 
1188                  /*TransactionID*/
1189                  idx1 = 0;
1190                  duCfgUpdate->protocolIEs.list.array[idx1]->id=ProtocolIE_ID_id_TransactionID;
1191                  duCfgUpdate->protocolIEs.list.array[idx1]->criticality= Criticality_reject;
1192                  duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1193                                              GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
1194                  duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.TransactionID = \
1195                         TRANS_ID;
1196
1197        /*Served Cell to Modify */
1198                  idx1++;
1199        duCfgUpdate->protocolIEs.list.array[idx1]->id = \
1200                                             ProtocolIE_ID_id_Served_Cells_To_Modify_List;
1201        duCfgUpdate->protocolIEs.list.array[idx1]->criticality =Criticality_reject;
1202        duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1203                                                   GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
1204             cellsToModify = &duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.\
1205                              Served_Cells_To_Modify_List;
1206        modifyCnt = 1;
1207                  cellsToModify->list.count = modifyCnt;
1208                  cellsToModify->list.size = \
1209                                  modifyCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
1210                  DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
1211                  if(cellsToModify->list.array == NULLP)
1212                  {
1213                break;
1214                  }
1215                  for(idy=0; idy<modifyCnt ;idy++)
1216                  {
1217                     DU_ALLOC(cellsToModify->list.array[idy],sizeof(\
1218                          Served_Cells_To_Modify_ItemIEs_t));
1219                          if(cellsToModify->list.array[idy] == NULLP)
1220                          {
1221                                  break;
1222                          }
1223                  }
1224             cellsToModify->list.array[0]->id = \
1225                                    ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
1226                  cellsToModify->list.array[0]->criticality = Criticality_reject;
1227             cellsToModify->list.array[0]->value.present =\
1228                        Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
1229             modifyItem=&cellsToModify->list.array[0]->value.choice.\
1230                    Served_Cells_To_Modify_Item;
1231
1232        /*pLMN_Identity*/
1233                  modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
1234                  DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
1235                  if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
1236                  { 
1237                     break;
1238                  }
1239        buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1240                               &modifyItem->oldNRCGI.pLMN_Identity);
1241          
1242             /*nRCellIdentity*/
1243                  modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
1244                  DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1245                      modifyItem->oldNRCGI.nRCellIdentity.size);
1246                  if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
1247                  {
1248           break;
1249                  }
1250        for (int tmp = 0;tmp < modifyItem->oldNRCGI.nRCellIdentity.size-1;tmp++)
1251                  {
1252            modifyItem->oldNRCGI.nRCellIdentity.buf[tmp] = 0;
1253                  }
1254                  modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
1255                  modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
1256                  /*pLMN_Identity*/
1257                  /*nRCGI*/
1258                  modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
1259        DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1260                      modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1261                  if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf == NULLP)
1262        {
1263                          break;
1264                  }
1265        buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1266                      &modifyItem->served_Cell_Information.nRCGI.pLMN_Identity);
1267                  modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
1268                  DU_ALLOC(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1269                     modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1270                  if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf == NULLP)
1271                  {
1272                         break;
1273                  } 
1274        for (int tmp = 0 ; tmp < modifyItem->served_Cell_Information.\
1275                      nRCGI.nRCellIdentity.size-1 ; tmp++)
1276             {
1277                     modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[tmp] = 0;
1278                  }
1279             modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf[4] = 16;
1280        modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.bits_unused =4;
1281        /*nRPCI*/
1282             modifyItem->served_Cell_Information.nRPCI = \
1283                                duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1284        /*servedPLMNs*/
1285             servPlmnCnt = 1;
1286             modifyItem->served_Cell_Information.servedPLMNs.list.count = servPlmnCnt;
1287        modifyItem->served_Cell_Information.servedPLMNs.list.size = \
1288                      servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1289                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1290                        modifyItem->served_Cell_Information.servedPLMNs.list.size);
1291             if(modifyItem->served_Cell_Information.servedPLMNs.list.array == NULLP)
1292                  {
1293                         break;
1294                  }
1295        for(idy1=0;idy1<servPlmnCnt;idy1++)
1296                  {
1297                      DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1],\
1298                            sizeof(ServedPLMNs_Item_t));
1299                                 if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idy1]== NULLP)
1300                                 {
1301                                          break;
1302                                 }
1303                  }
1304                  modifyItem->served_Cell_Information.servedPLMNs.list.\
1305                      array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1306                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1307                            array[0]->pLMN_Identity.buf,modifyItem->served_Cell_Information.servedPLMNs.list.\
1308                                           array[0]->pLMN_Identity.size);
1309                  if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1310                          array[0]->pLMN_Identity.buf == NULLP)
1311                  {
1312                          break;
1313                  }
1314        buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1315                      &modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity);
1316        DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1317                        array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1318                  if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1319                        array[0]->iE_Extensions == NULLP)
1320                  {
1321                          break;
1322                  }
1323        extensionCnt=1;
1324                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1325                        iE_Extensions->list.count = extensionCnt;
1326                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1327                      iE_Extensions->list.size = extensionCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1328                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1329                       array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1330                                  iE_Extensions->list.size);
1331                  if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1332                         array[0]->iE_Extensions->list.array == NULLP)
1333                  {
1334                    break;
1335                  }
1336        for(idy2=0;idy2<extensionCnt;idy2++)
1337                  {
1338                     DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.\
1339                            array[0]->iE_Extensions->list.array[idy2],\
1340                                 sizeof(ServedPLMNs_ItemExtIEs_t));
1341                          if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1342                                    array[0]->iE_Extensions->list.array[idy2] == NULLP)
1343                          {
1344                                   break;
1345                          }
1346                  }
1347                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1348                     iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1349        modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1350               iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1351             modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1352           iE_Extensions->list.array[0]->extensionValue.present = \
1353                          ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1354             modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1355                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1356                         list.count = 1;
1357                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1358                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1359                          list.size = sizeof(SliceSupportItem_t *);
1360                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1361                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1362           list.array,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1363                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1364             if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1365                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1366                           list.array == NULLP)
1367                  {
1368                         break;
1369                  }
1370
1371                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1372                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1373                         list.array[0],sizeof( SliceSupportItem_t));
1374                  if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1375                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1376                           list.array[0] == NULLP)
1377                  {
1378                    break;
1379                  }
1380                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1381                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1382                         list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1383                  DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1384                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1385                         list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1386                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1387             if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1388                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1389                         list.array[0]->sNSSAI.sST.buf == NULLP)
1390                  {
1391                          break;
1392                  }
1393        modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1394                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1395                          list.array[0]->sNSSAI.sST.buf[0] = 3;
1396             DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1397                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1398                    list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1399                  if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1400                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1401                         list.array[0]->sNSSAI.sD == NULLP)
1402             {
1403                          break;
1404                  }
1405                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1406                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1407                         list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1408        DU_ALLOC(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1409                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1410                    list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1411                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1412                         list.array[0]->sNSSAI.sD->size);
1413        if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1414                    iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1415                         list.array[0]->sNSSAI.sD->buf == NULLP)
1416                  {
1417                          break;
1418                  }
1419        modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1420                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1421                   list.array[0]->sNSSAI.sD->buf[0] = 3;
1422                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1423                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1424                          list.array[0]->sNSSAI.sD->buf[1] = 6;
1425                  modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1426                     iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1427                          list.array[0]->sNSSAI.sD->buf[2] = 9;
1428                 
1429                  /*nR Mode Info with FDD*/
1430        modifyItem->served_Cell_Information.nR_Mode_Info.present = \
1431                                              NR_Mode_Info_PR_fDD;
1432                  DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,\
1433                                     sizeof(FDD_Info_t));
1434                  if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD == NULLP)
1435                  {
1436                          break;
1437                  }
1438        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1439                      uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1440                            f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1441                  modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1442                      uL_NRFreqInfo.freqBandListNr.list.count = 1;
1443                  modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1444                      uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1445                  DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1446                      fDD->uL_NRFreqInfo.freqBandListNr.list.\
1447                           array, modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1448                            uL_NRFreqInfo.freqBandListNr.list.size);
1449        if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1450                             fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1451                  {
1452                          break;
1453                  }
1454                  DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1455                        uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1456                  if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->
1457                       uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1458                  {
1459           break;
1460                  }
1461        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1462          freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1463          duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1464          freqBand[0].nrFreqBand;
1465        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1466           freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1467        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1468           nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1469           dlNrFreqInfo.nrArfcn;
1470        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1471           freqBandListNr.list.count = 1;
1472        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1473           freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
1474        DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1475          dL_NRFreqInfo.freqBandListNr.list.array,modifyItem->served_Cell_Information.nR_Mode_Info.\
1476                         choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1477        if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1478          dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1479        {
1480                         break;
1481        }
1482             DU_ALLOC(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1483          dL_NRFreqInfo.freqBandListNr.list.array[0],\
1484          sizeof(FreqBandNrItem_t));
1485        if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1486          dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1487        {
1488                      break;
1489        }
1490        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1491         freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1492         duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
1493         freqBand[0].nrFreqBand;
1494        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1495         freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1496
1497        /*Transmission Bandwidth*/
1498        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1499         uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1500         f1Mode.mode.fdd.ulTxBw.nrScs;
1501        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1502         uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1503         f1Mode.mode.fdd.ulTxBw.nrb;
1504        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1505         dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
1506         f1Mode.mode.fdd.dlTxBw.nrScs;
1507        modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
1508         dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
1509         f1Mode.mode.fdd.dlTxBw.nrb;
1510        /*Measurement timing Config*/
1511        modifyItem->served_Cell_Information.measurementTimingConfiguration.size = \
1512                                                               sizeof(uint8_t);
1513        DU_ALLOC(modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1514          buf,modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1515        if(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf == NULLP)
1516        {
1517                         break;
1518        }
1519        modifyItem->served_Cell_Information.measurementTimingConfiguration.\
1520           buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1521    
1522        // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
1523        /*GNB DU ID */
1524        idx1++;
1525        duCfgUpdate->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_ID;
1526        duCfgUpdate->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
1527        duCfgUpdate->protocolIEs.list.array[idx1]->value.present = \
1528                              GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
1529        duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size = \
1530                                                              sizeof(uint8_t);
1531        DU_ALLOC(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf,\
1532           duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.size);
1533        if(duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf == NULLP)
1534        {
1535                          break;
1536        }
1537        duCfgUpdate->protocolIEs.list.array[idx1]->value.choice.GNB_DU_ID.buf[0] = \
1538                                                               duCfgParam.duId;
1539
1540        xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
1541    
1542        /* Encode the DU Config Update type as APER */
1543        cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1544        encBufSize = 0;
1545        encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
1546
1547        /* Checking encode results */
1548        if(encRetVal.encoded == ENCODE_FAIL) 
1549        {
1550             DU_LOG("F1AP : Could not encode DUConfigUpdate structure (at %s)\n",encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1551                                 break;
1552                  } 
1553        else 
1554        {
1555            DU_LOG("\nF1AP : Created APER encoded buffer for DUConfigUpdate\n");
1556            for(i=0; i< encBufSize; i++)
1557           {
1558               printf("%x",encBuf[i]);
1559           }
1560        } 
1561        /* Sending msg */
1562        if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1563        {
1564           DU_LOG("\nF1AP : Sending GND-DU Config Update failed");
1565                          break;
1566        }
1567                  checkvar=true;
1568                  break;
1569         }
1570    if(f1apDuCfg != NULLP)
1571         {
1572             if(f1apDuCfg->choice.initiatingMessage != NULLP)
1573                  {
1574                      if(duCfgUpdate->protocolIEs.list.array != NULLP)
1575                           {
1576                               if(idx==elementCnt)
1577                                         {
1578                                             if(cellsToModify->list.array != NULLP)
1579                                                  {
1580                                                      if(idy==modifyCnt)
1581                                                           {
1582                                                               if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1583                            {
1584                                                                             if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1585                                                                                  {
1586                                                                                       if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1587                                                                                                 {
1588                                                                                                      if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1589                                                                                                           != NULLP)
1590                                                                                                           { 
1591                                                                                                               if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1592                                                                                                                         != NULLP)
1593                                                                                                                          {
1594                                                                                                                              if(idy1==servPlmnCnt)
1595                                                                                                                                   {
1596                                                                                                                                       if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1597                                                                                                                                             array[0]->pLMN_Identity.buf != NULLP)
1598                                                       {
1599                                                            if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1600                                                                                                                                                             array[0]->iE_Extensions!= NULLP)
1601                                                                                                                                                                  {
1602                                                                                                                                                                      if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1603                                                                  array[0]->iE_Extensions->list.array != NULLP)
1604                                                                                                                                                                           {
1605                                                                                                                                                                               if(idy2==extensionCnt)
1606                                                                                                                                                                                         {
1607                                                                                                                                                                                            if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1608                                                                                                                                                                                                 iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1609                                                                                                                                                                                                 list.array !=NULLP)
1610                                                                                                                                                                                                 {
1611                                                                                                                                                                                                    if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1612                                                                                                                                                                                                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1613                                                                                                                                                                                                          list.array[0]!=NULLP)
1614                                                                                                                                                                                                          {   
1615                                                                                                                                                                                                              if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1616                                                                                                                                                                                                                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1617                                                                                                                                                                                                                   list.array[0]->sNSSAI.sST.buf!=NULLP)
1618                                                                                                                                                                                                                   {
1619                                                                                                                                                                                                                      if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1620                                                                                                                                                                                                                           iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1621                                                                                                                                                                                                                           list.array[0]->sNSSAI.sD != NULLP)
1622                                                                                                                                                                                                                           {
1623                                                                                                                                                                                                                                if(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1624                                                                                                                                                                                                                                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1625                                                                                                                                                                                                                                           list.array[0]->sNSSAI.sD->buf!=NULLP)
1626                                                                                                                                                                                                                                          {
1627                                                                                                                                                                                                                                              if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1628                                                                                                                                                                                                                                                   !=NULLP)
1629                                                                                                                                                                                                                                                   {
1630                                                                                                                                                                                                                                                      if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1631                                                                                                                                                                                                                                                           fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1632                                                                                                                                                                                                                                                      {
1633                                                                                                                                                                                                                                                               if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1634                                                                                                                                                                                                                                                                         fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]!=NULLP)
1635                                                                                                                                                                                                                                                                         {
1636                                                                                                                                                                                                                                                                             if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1637                                                                                                                                                                                                                                                                                  fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1638                                                                                                                                                                                                                                                                             {
1639                                                                                                                                                                                                                                                                                     if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1640                                                                                                                                                                                                                                                                                          choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1641                                                                                                                                                                                                                                                                                          array[0]!= NULLP)
1642                                                                                                                                                                                                                                                                                          {
1643                                                                                                                                                                                                                                                                                             if(modifyItem->served_Cell_Information.\
1644                                                                                                                                                                                                                                                                                                  measurementTimingConfiguration.buf !=NULLP)
1645                                                                                                                                                                                                                                                                                                  {
1646                                                                                                                                                                                                                                                                                                    if(duCfgUpdate->protocolIEs.list.array[2]->value.\
1647                                                                                                                                                                                                                                                                                                         choice.GNB_DU_ID.buf!=NULLP)
1648                                                                                                                {
1649                                                                                                                                                                                                                                                                                                             DU_FREE(duCfgUpdate->protocolIEs.list.\
1650                                                                                                                                                                                                                                                                                                                  array[2]->value.choice.GNB_DU_ID.buf,\
1651                                                                                                                                                                                                                                                                                                                  duCfgUpdate->protocolIEs.list.array[2]->\
1652                                                                                                                                                                                                                                                                                                                  value.choice.GNB_DU_ID.size);
1653                                                                                                                                                                                                                                                                                                         }
1654                                                                                                                                                                                                                                                                                                    DU_FREE(modifyItem->served_Cell_Information.\
1655                                                                                                                                                                                                                                                                                                         measurementTimingConfiguration.\
1656                                                                                                                                                                                                                                                                                                         buf,modifyItem->served_Cell_Information.\
1657                                                                                                                                                                                                                                                                                                         measurementTimingConfiguration.size);
1658                                                                                                                                                                                                                                                                                                  }
1659                                                                                                                                                                                                                                                                                             DU_FREE(modifyItem->served_Cell_Information.\
1660                                                                                                                                                                                                                                                                                                 nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1661                                                                                                                                                                                                                                                                                            list.array[0],sizeof(FreqBandNrItem_t));
1662                                                                                                                                                                                                                                                                                          }
1663                                                                                                                                                                                                                                                                                          DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1664                                                                                                                                                                                                                                                                                          .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1665                                                                                                                                                                                                                                                                                          modifyItem->served_Cell_Information.nR_Mode_Info.\
1666                                                                                                                                                                                                                                                                                          choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1667                                                                                                                                                                                                                                                                                  }
1668                                                                                                                                                                                                                                                                                  DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1669                                                                                                                                                                                                                                                                                  choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1670                                                                                                                                                                                                                                                                                  array[0],sizeof(FreqBandNrItem_t));
1671                                                                                                                                                                                                                                                                         }
1672                                                                                                                                                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1673                                                                                                                                                                                                                                                                   fDD->uL_NRFreqInfo.freqBandListNr.list.\
1674                                                                                                                                                                                                                                                                   array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1675                                                                                                                                                                                                                                                                   fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1676                                                                                                                                                                                                                                                           }
1677                                                                                                                                                                                                                                                      DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1678                                                                                                                                                                                                                                                           fDD,sizeof(FDD_Info_t));
1679                                                                                                                                                                                                                                                   }
1680                                                                                                                                                                                                                                             DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1681                                                                                                                                                                                                                                                  iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1682                                                                                                                                                                                                                                                   list.array[0]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1683                                                                                                                                                                                                                                                  servedPLMNs.list.array[0]->iE_Extensions->list.array[0]->\
1684                                                                                                                                                                                                                                                  extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sD->size);
1685
1686                                                                                                                                                                                                                                          }
1687                                                                                                                                                                                                                               DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1688                                                                                                                                                                                                                                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1689                                                                                                                                                                                                                                         list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1690                                                                                                                                                                                                                           }
1691                                                                                                                                                                                                                      DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1692                                                                                                                                                                                                                           iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1693                                                                                                                                                                                                                           list.array[0]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.servedPLMNs.\
1694                                                                                                                                                                                                                           list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.\
1695                                                                                                                                                                                                                           SliceSupportList.list.array[0]->sNSSAI.sST.size);
1696                                                                                                                                                                                                                   }
1697                                                                                                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1698                                                                                                                                                                                                                   iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1699                                                                                                                                                                                                                   list.array[0],sizeof(SliceSupportItem_t));
1700                                                                                                                                                                                                          }
1701                                                                                                                                                                                                    DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1702                                                                                                                                                                                                         iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1703                                                                                                                                                                                                     list.array,\
1704                                                                                                                                                                                                          modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->\
1705                                                                                                                                                                                                          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1706                                                                                                                                                                                                 }
1707                                                                                                                                                                                            for(i=0;i<extensionCnt;i++)
1708                                                                                                                                                                                                 {
1709                                                                                                                                                                                                     DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1710                                                                                                                                                                                                          array[0]->iE_Extensions->list.array[i],\
1711                                                                                                                                                                                                          sizeof(ServedPLMNs_ItemExtIEs_t ));
1712                                                                                                                                                                                                 }
1713                                                                                                                                                                                         }
1714                                                                                                                                                                                         else
1715                                                                                                                                                                                         {
1716                                                                                                                                                                                             for(i=0;i<idy2;i++)
1717                                                                                                                                                                                                  {
1718                                                                                                                                                                                                     DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1719                                                                                                                                                                                                           array[0]->iE_Extensions->list.array[i],\
1720                                                                                                                                                                                                           sizeof(ServedPLMNs_ItemExtIEs_t));
1721                                                                                                                                                                                                  }
1722                                                                                                                                                                                         }
1723                                                                                                                                                                               DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1724                                                                                                                                                                                    array[0]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1725                                                                                                                                                                                         list.array[0]->iE_Extensions->list.size);
1726                                                                                                                                                                           }
1727                                                                                                                                                                      DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1728                                                                                                                                                                             array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1729                                                                                                                                                                  }
1730                                                                                                                                                DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1731                                                                                                                                                     array[0]->pLMN_Identity.buf,
1732                                                                                                                                                          modifyItem->served_Cell_Information.servedPLMNs.list.array[0]->pLMN_Identity.size);
1733                                                                                                                                                 }
1734                                                       for(i=0;i<idy1;i++)
1735                                                                                                                                                 {
1736                                                                                                                                                    DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1737                                                                                                                                                         sizeof(ServedPLMNs_Item_t));
1738                                                                                                                                                 }
1739                                                                                                                                   }
1740                                                                                                                                   else
1741                                                                                                                                   {
1742                                                                                                                                      for(i=0;i<idy1;i++)
1743                                                                                                                                           {
1744                                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1745                                                                                                                                                   sizeof(ServedPLMNs_Item_t));
1746                                                                                                                                           }
1747                                                                                                                                   }
1748                                                                                                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1749                                                                                                                                   modifyItem->served_Cell_Information.servedPLMNs.list.size);
1750                                                                                                                          }
1751                                                                                                                DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1752                                                                                                                           modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);               
1753                                                                                                           }
1754                                                                                                     DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1755                                                                                                           modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1756                                                                                                 }
1757                                                                                      DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1758                                                                                              modifyItem->oldNRCGI.nRCellIdentity.size);
1759                                }
1760                                                                             DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1761                                                                                   modifyItem->oldNRCGI.pLMN_Identity.size);
1762                                                                         }
1763                                                                          for(int iy=0; iy<modifyCnt ;iy++)
1764                                                                          {
1765                                                                             DU_FREE(cellsToModify->list.array[iy],\
1766                                                                                   sizeof(Served_Cells_To_Modify_ItemIEs_t));
1767                                                                          }
1768                                                           }
1769                                                           else
1770                                                           {
1771                                                              for(int iy=0; iy<idy ;iy++)
1772                                                                   {
1773                                                                      DU_FREE(cellsToModify->list.array[iy],\
1774                                                                            sizeof(Served_Cells_To_Modify_ItemIEs_t));
1775                                                                   }     
1776                                                           }
1777                                                      DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1778                                                  }
1779                                             for(i=0;i<elementCnt;i++)
1780                                                  {
1781                                                DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1782                                                            sizeof(GNBDUConfigurationUpdateIEs_t));
1783                                                  }
1784                                         }
1785                                         else
1786                                         {
1787                                            for(i=0;i<idx;i++)
1788                                                 {
1789                                                    DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1790                                                          sizeof(GNBDUConfigurationUpdateIEs_t));
1791                                                 }
1792                                         }
1793                DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1794                           }
1795                            DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1796                  }
1797                   DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1798         }
1799    if(checkvar==true)
1800       return ROK;
1801         else 
1802            return RFAILED;
1803 }/* End of BuildAndSendDUConfigUpdate */
1804
1805 /*******************************************************************
1806  *
1807  * @brief Builds and sends the ULRRCMessageTransfer 
1808  *
1809  * @details
1810  *
1811  *    Function : BuildAndSendULRRCMessageTransfer
1812  *
1813  *    Functionality: Constructs the UL RRC Message Transfer and sends
1814  *                   it to the CU through SCTP.
1815  *
1816  * @params[in] 
1817  *
1818  * @return ROK     - success
1819  *         RFAILED - failure
1820  *
1821  * ****************************************************************/
1822 S16 BuildAndSendULRRCMessageTransfer()
1823 {
1824         U8   elementCnt;
1825         U8   ieId;
1826         U8   idx;
1827         F1AP_PDU_t                              *f1apMsg = NULL;
1828    ULRRCMessageTransfer_t       *ulRRCMsg;
1829         asn_enc_rval_t                          encRetVal;        /* Encoder return value */
1830
1831         DU_LOG("\n F1AP : Building UL RRC Message Transfer Message\n");
1832
1833         DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1834         if(f1apMsg == NULLP)
1835         {
1836                 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1837                 return RFAILED;
1838         }
1839
1840         f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1841         DU_ALLOC(f1apMsg->choice.initiatingMessage,
1842                         sizeof(InitiatingMessage_t));
1843         if(f1apMsg->choice.initiatingMessage == NULLP)
1844         {
1845                 DU_LOG(" F1AP : Memory allocation for   F1AP-PDU failed");
1846                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1847                 return RFAILED;
1848         }
1849
1850         f1apMsg->choice.initiatingMessage->procedureCode = \
1851                                                                                                 ProcedureCode_id_ULRRCMessageTransfer;
1852         f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1853         f1apMsg->choice.initiatingMessage->value.present = \
1854                                                                 InitiatingMessage__value_PR_ULRRCMessageTransfer;
1855         ulRRCMsg =
1856                 &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
1857         elementCnt = 3;
1858         ulRRCMsg->protocolIEs.list.count = elementCnt;
1859         ulRRCMsg->protocolIEs.list.size = \
1860                                                                         elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
1861
1862         /* Initialize the F1Setup members */
1863         DU_ALLOC(ulRRCMsg->protocolIEs.list.array, \
1864                         elementCnt * sizeof(ULRRCMessageTransferIEs_t *));
1865         if(ulRRCMsg->protocolIEs.list.array == NULLP)
1866         {
1867                 DU_LOG(" F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
1868                 DU_FREE(f1apMsg->choice.initiatingMessage,
1869                                 sizeof(InitiatingMessage_t));
1870                 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
1871                 return RFAILED;
1872         }
1873
1874         for(idx=0; idx<elementCnt; idx++)
1875         {
1876                 DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],\
1877                                                                                 sizeof(ULRRCMessageTransferIEs_t));
1878                 if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
1879                 {
1880                         for(ieId=0; ieId<idx; ieId++)
1881                         {
1882                                 DU_FREE(ulRRCMsg->protocolIEs.list.array[ieId],\
1883                                                 sizeof(ULRRCMessageTransferIEs_t));
1884                         }
1885                         DU_FREE(ulRRCMsg->protocolIEs.list.array,\
1886                                         elementCnt * sizeof(ULRRCMessageTransferIEs_t *));
1887                         DU_FREE(f1apMsg->choice.initiatingMessage,\
1888                                                                                                 sizeof(InitiatingMessage_t));
1889                         DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1890                         return RFAILED;
1891                 }
1892         }
1893
1894         idx = 0;
1895
1896         /*GNB CU UE F1AP ID*/
1897         ulRRCMsg->protocolIEs.list.array[idx]->id       = \
1898                                                                                  ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1899         ulRRCMsg->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
1900         ulRRCMsg->protocolIEs.list.array[idx]->value.present = \
1901                                 ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1902         ulRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1903
1904         /*GNB DU UE F1AP ID*/
1905         idx++;
1906         ulRRCMsg->protocolIEs.list.array[idx]->id       = \
1907                                                                                  ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1908         ulRRCMsg->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
1909         ulRRCMsg->protocolIEs.list.array[idx]->value.present = \
1910                                 ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1911         ulRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1912
1913         /*SRBID*/
1914         idx++;
1915         ulRRCMsg->protocolIEs.list.array[idx]->id       = \
1916                                                                                                                  ProtocolIE_ID_id_SRBID;
1917         ulRRCMsg->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
1918         ulRRCMsg->protocolIEs.list.array[idx]->value.present = \
1919                                                                 ULRRCMessageTransferIEs__value_PR_SRBID;
1920         ulRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = UL_SRBID;
1921
1922         /*RRCContainer*/
1923         //YET TO FILL
1924
1925         xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1926
1927         /* Encode the F1SetupRequest type as APER */
1928         cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1929         encBufSize = 0;
1930         encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1931                         encBuf);
1932         /* Encode results */
1933         if(encRetVal.encoded == ENCODE_FAIL)
1934         {
1935                 DU_LOG( "\n F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
1936                                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1937                 return RFAILED;
1938         }
1939         else
1940         {
1941                 DU_LOG("\n F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
1942                 for(int i=0; i< encBufSize; i++)
1943                 {
1944                         printf("%x",encBuf[i]);
1945                 }
1946         }
1947
1948         /* Sending  msg  */
1949         if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL)       !=      ROK)
1950         {
1951                 DU_LOG("\n F1AP : Sending       UL RRC Message Transfer Failed");
1952                 return RFAILED;
1953         }
1954    return ROK;
1955 }/* End of BuildAndSendULRRCMessageTransfer*/
1956
1957 /*******************************************************************
1958  *
1959  * @brief Builds and sends the InitialULRRCMessage 
1960  *
1961  * @details
1962  *
1963  *    Function : BuildAndSendRRCSetupReq
1964  *
1965  *    Functionality: Constructs the Initial UL RRC Message Transfer and sends
1966  *                   it to the CU through SCTP.
1967  *
1968  * @params[in] 
1969  *
1970  * @return ROK     - success
1971  *         RFAILED - failure
1972  *
1973  * ****************************************************************/
1974 S16 BuildAndSendRRCSetupReq()
1975 {
1976         S16  ret;
1977         U8   elementCnt;
1978         U8   ieId;
1979         U8   idx;
1980         F1AP_PDU_t                                              *f1apMsg = NULL;
1981    InitialULRRCMessageTransfer_t        *initULRRCMsg;
1982         asn_enc_rval_t                                          encRetVal;        /* Encoder return value */
1983
1984         DU_LOG("\n F1AP : Building RRC Setup Request\n");
1985
1986         DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1987         if(f1apMsg == NULLP)
1988         {
1989                 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1990                 return RFAILED;
1991         }
1992
1993         f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1994         DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1995         if(f1apMsg->choice.initiatingMessage == NULLP)
1996         {
1997                 DU_LOG(" F1AP : Memory allocation for   F1AP-PDU failed");
1998                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1999                 return RFAILED;
2000         }
2001
2002         f1apMsg->choice.initiatingMessage->procedureCode = \
2003                                                                         ProcedureCode_id_InitialULRRCMessageTransfer;
2004         f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2005         f1apMsg->choice.initiatingMessage->value.present = \
2006                                          InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
2007         initULRRCMsg =
2008                 &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
2009         elementCnt = 3;
2010         initULRRCMsg->protocolIEs.list.count = elementCnt;
2011         initULRRCMsg->protocolIEs.list.size = \
2012                                                                         elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
2013
2014         /* Initialize the F1Setup members */
2015         DU_ALLOC(initULRRCMsg->protocolIEs.list.array, \
2016                         elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2017         if(initULRRCMsg->protocolIEs.list.array == NULLP)
2018         {
2019                 DU_LOG(" F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
2020                 DU_FREE(f1apMsg->choice.initiatingMessage,
2021                                 sizeof(InitiatingMessage_t));
2022                 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
2023                 return RFAILED;
2024         }
2025
2026         for(idx=0; idx<elementCnt; idx++)
2027         {
2028                 DU_ALLOC(initULRRCMsg->protocolIEs.list.array[idx],\
2029                                                                                 sizeof(InitialULRRCMessageTransferIEs_t));
2030                 if(initULRRCMsg->protocolIEs.list.array[idx] == NULLP)
2031                 {
2032                         for(ieId=0; ieId<idx; ieId++)
2033                         {
2034                                 DU_FREE(initULRRCMsg->protocolIEs.list.array[ieId],\
2035                                                 sizeof(InitialULRRCMessageTransferIEs_t));
2036                         }
2037                         DU_FREE(initULRRCMsg->protocolIEs.list.array,\
2038                                         elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2039                         DU_FREE(f1apMsg->choice.initiatingMessage,\
2040                                                                                                 sizeof(InitiatingMessage_t));
2041                         DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2042                         return RFAILED;
2043                 }
2044         }
2045
2046         idx = 0;
2047
2048         /*GNB DU UE F1AP ID*/
2049         initULRRCMsg->protocolIEs.list.array[idx]->id   = \
2050                                                                                  ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2051         initULRRCMsg->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
2052         initULRRCMsg->protocolIEs.list.array[idx]->value.present = \
2053                                 InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2054         initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2055
2056         /*NRCGI*/
2057         idx++;
2058         initULRRCMsg->protocolIEs.list.array[idx]->id   = \
2059                                                                                                                  ProtocolIE_ID_id_NRCGI;
2060         initULRRCMsg->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
2061         initULRRCMsg->protocolIEs.list.array[idx]->value.present = \
2062                                                                 InitialULRRCMessageTransferIEs__value_PR_NRCGI;
2063         ret = \
2064         BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI);
2065         if(ret != ROK)
2066         {
2067                 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2068                                         nRCellIdentity.buf,initULRRCMsg->protocolIEs.list.array[idx]->\
2069                                         value.choice.NRCGI.nRCellIdentity.size);
2070                 DU_FREE(initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2071                                         pLMN_Identity.buf,initULRRCMsg->protocolIEs.list.array[idx]->\
2072                                         value.choice.NRCGI.pLMN_Identity.size);
2073                 for(idx=0; idx<elementCnt; idx++)
2074                 {
2075                         DU_FREE(initULRRCMsg->protocolIEs.list.array[idx],\
2076                                         sizeof(InitialULRRCMessageTransferIEs_t));
2077                 }
2078                 DU_FREE(initULRRCMsg->protocolIEs.list.array,\
2079                                 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2080                 DU_FREE(f1apMsg->choice.initiatingMessage,\
2081                                 sizeof(InitiatingMessage_t));
2082                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2083                 return RFAILED;
2084
2085         }
2086
2087         /*Cell RNTI*/
2088         idx++;
2089         initULRRCMsg->protocolIEs.list.array[idx]->id   = \
2090                                                                                                                  ProtocolIE_ID_id_C_RNTI;
2091         initULRRCMsg->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
2092         initULRRCMsg->protocolIEs.list.array[idx]->value.present = \
2093                                                 InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
2094         initULRRCMsg->protocolIEs.list.array[idx]->value.choice.C_RNTI = CRNTI;
2095
2096         /*RRCContainer*/
2097         // Need to fill this.
2098
2099         /*DUtoCURRCContainer*/
2100         //Need to fill this too.
2101
2102
2103         xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2104
2105         /* Encode the F1SetupRequest type as APER */
2106         cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
2107         encBufSize = 0;
2108         encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2109                         encBuf);
2110         /* Encode results */
2111         if(encRetVal.encoded == ENCODE_FAIL)
2112         {
2113                 DU_LOG( "\n F1AP : Could not encode Initial UL RRC Message Transfer structure (at %s)\n",\
2114                                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2115                 return RFAILED;
2116         }
2117         else
2118         {
2119                 DU_LOG("\n F1AP : Created APER encoded buffer for Initial UL RRC Message transfer\n");
2120                 for(int i=0; i< encBufSize; i++)
2121                 {
2122                         printf("%x",encBuf[i]);
2123                 }
2124         }
2125
2126         /* Sending  msg  */
2127         if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL)       !=      ROK)
2128         {
2129                 DU_LOG("\n F1AP : Sending       Initial UL RRC Message Transfer Failed");
2130                 return RFAILED;
2131         }
2132    return ROK;
2133 }/* End of BuildAndSendRRCSetupReq*/
2134
2135 /*******************************************************************
2136  *
2137  * @brief Builds Special cell list for UE Setup Request 
2138  *
2139  * @details
2140  *
2141  *    Function : BuildSplCellList
2142  *
2143  *    Functionality: Constructs the Special Cell list for UESetReq
2144  *
2145  * @params[in] SCell_ToBeSetup_List_t *spCellLst
2146  *
2147  * @return ROK     - success
2148  *         RFAILED - failure
2149  *
2150  * ****************************************************************/
2151 S16 BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2152 {
2153         U8  cellCnt;
2154         U8  idx;
2155         U8  cellidx;
2156         S16 ret;
2157         cellCnt = 1;
2158         spCellLst->list.count = cellCnt;
2159         spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2160         DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2161         if(spCellLst->list.array == NULLP)
2162         {
2163                 return RFAILED;
2164         }
2165         for(idx=0; idx<cellCnt; idx++)
2166         {
2167                 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2168                 if(spCellLst->list.array[idx] == NULLP)
2169                 {
2170                         for(cellidx=0; cellidx<idx; cellidx++)
2171                         {
2172                                 DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2173                         }
2174                         DU_FREE(spCellLst->list.array,spCellLst->list.size);
2175                         return RFAILED;
2176                 }
2177         }
2178         idx = 0;
2179         spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2180         spCellLst->list.array[idx]->criticality = Criticality_ignore;
2181         spCellLst->list.array[idx]->value.present =\
2182                 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2183         /* Special Cell ID -NRCGI */
2184         ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2185         if(ret != ROK)
2186         {
2187                 for(cellidx=0; cellidx<cellCnt; cellidx++)
2188                 {
2189                         DU_FREE(spCellLst->list.array[cellidx],sizeof(
2190                         SCell_ToBeSetup_ItemIEs_t));
2191                 }
2192                 DU_FREE(spCellLst->list.array,spCellLst->list.size);
2193                 return RFAILED;
2194         }
2195         /*Special Cell Index*/
2196         spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2197   return ROK;   
2198 }/* End of BuildSplCellList*/
2199
2200 /*******************************************************************
2201  *
2202  * @brief Builds SRBS to be setup 
2203  *
2204  * @details
2205  *
2206  *    Function : BuildSRBSetup
2207  *
2208  *    Functionality: Constructs the SRB's for UESetReq
2209  *
2210  * @params[in] SRBs_ToBeSetup_List_t *srbSet
2211  *
2212  * @return ROK     - success
2213  *         RFAILED - failure
2214  *
2215  * ****************************************************************/
2216 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2217 {
2218         U8 idx;
2219         U8 srbidx;
2220         U8 srbCnt;
2221         srbCnt = 1;
2222         srbSet->list.count = srbCnt;
2223         srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2224         DU_ALLOC(srbSet->list.array,srbSet->list.size);
2225         if(srbSet->list.array == NULLP)
2226         {
2227                 return RFAILED;
2228         }
2229         for(idx=0; idx<srbCnt; idx++)
2230         {
2231                 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2232                 if(srbSet->list.array[idx] == NULLP)
2233                 {
2234                         for(srbidx=0; srbidx<idx; srbidx++)
2235                         {
2236                                 DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2237                         }
2238                         DU_FREE(srbSet->list.array,srbSet->list.size);
2239                 }
2240         }
2241         idx = 0;
2242         srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2243         srbSet->list.array[idx]->criticality = Criticality_ignore;
2244         srbSet->list.array[idx]->value.present = \
2245                         SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2246    srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2247    return ROK;
2248 }/* End of BuildSRBSetup*/
2249
2250 /*******************************************************************
2251  *
2252  * @brief Builds QOS Info for DRB Setum Item 
2253  *
2254  * @details
2255  *
2256  *    Function : BuildQOSInfo
2257  *
2258  *    Functionality: Constructs the QOS Info for DRB Setup Item
2259  *
2260  * @params[in] QoSInformation_t *qosinfo
2261  *
2262  * @return ROK     - success
2263  *         RFAILED - failure
2264  *
2265  * ****************************************************************/
2266 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2267 {
2268         /* NonDynamic5QIDescriptor */
2269         drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2270         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2271         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2272         {
2273                 return RFAILED;
2274         }
2275         /*FiveQI*/
2276         drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2277         /*AveragingWindow*/
2278         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2279                                                                                                 sizeof(AveragingWindow_t));
2280         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2281                                                                                                                                                                                                         NULLP)
2282         {
2283                 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2284                                                 sizeof(NonDynamic5QIDescriptor_t));
2285                 return RFAILED;
2286         }
2287         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2288         /*MaxDataBurstVolume*/
2289         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2290                                                                                                 sizeof(MaxDataBurstVolume_t));
2291         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2292                                                                                                                                                                                                         NULLP)
2293         {
2294                 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2295                                                                                                 sizeof(AveragingWindow_t));
2296                 DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2297                                                 sizeof(NonDynamic5QIDescriptor_t));
2298                 return RFAILED;
2299         }
2300         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2301
2302         /*nRGRAN Allocation Retention Priority*/
2303         drbQos->nGRANallocationRetentionPriority.priorityLevel =        \
2304                                                                                                 PriorityLevel_highest;
2305         drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
2306                                                         Pre_emptionCapability_may_trigger_pre_emption;
2307         drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
2308                                                                 Pre_emptionVulnerability_not_pre_emptable;
2309
2310         /* TO DO: GBR_QoSFlowInformation */
2311         return ROK;
2312 }/*End of BuildQOSInfo*/
2313
2314 /*******************************************************************
2315  *
2316  * @brief Builds SNSSAI  
2317  *
2318  * @details
2319  *
2320  *    Function : BuildSNSSAI
2321  *
2322  *    Functionality: Constructs the SNSSAI For DRB list
2323  *
2324  * @params[in] SNSSAI_t *snssai
2325  *
2326  * @return ROK     - success
2327  *         RFAILED - failure
2328  *
2329  * ****************************************************************/
2330 S16 BuildSNSSAI(SNSSAI_t *snssai)
2331 {
2332         /*SNSSAI*/
2333           /*ssT*/
2334         snssai->sST.size = sizeof(U8);
2335         DU_ALLOC(snssai->sST.buf,snssai->sST.size);
2336         if(snssai->sST.buf == NULLP)
2337         {
2338                 return RFAILED;
2339         }
2340         snssai->sST.buf[0] = 3;
2341           /*sD*/
2342         DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2343         if(snssai->sD == NULLP)
2344         {
2345                 DU_FREE(snssai->sST.buf,snssai->sST.size);
2346                 return RFAILED;
2347         }
2348         snssai->sD->size = 3*sizeof(U8);
2349         DU_ALLOC(snssai->sD->buf,snssai->sD->size);
2350         if(snssai->sD->buf == NULLP)
2351         {
2352                 DU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
2353                 DU_FREE(snssai->sST.buf,snssai->sST.size);
2354                 return RFAILED;
2355         }
2356                 snssai->sD->buf[0] = 3;
2357                 snssai->sD->buf[1] = 6;
2358                 snssai->sD->buf[2] = 9;
2359    return ROK;
2360 }/*End of BuildSNSSAI*/
2361
2362 /*******************************************************************
2363  *
2364  * @brief Builds the flow map.  
2365  *
2366  * @details
2367  *
2368  *    Function : BuildFlowsMap
2369  *
2370  *    Functionality: Constructs the flowmap For DRB list
2371  *
2372  * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2373  *
2374  * @return ROK     - success
2375  *         RFAILED - failure
2376  *
2377  * ****************************************************************/
2378 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2379 {
2380         S16 ret;
2381         U8  idx;
2382         U8  flowidx;
2383         U8 flowCnt;
2384         flowCnt = 1;
2385         flowMap->list.count = flowCnt;
2386         flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2387         DU_ALLOC(flowMap->list.array,flowMap->list.size);
2388         if(flowMap->list.array == NULLP)
2389         {
2390                 return RFAILED;
2391         }
2392         for(idx=0; idx<flowCnt; idx++)
2393         {
2394                 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2395                 if(flowMap->list.array[idx] == NULLP)
2396                 {
2397                         for(flowidx=0; flowidx<idx; flowidx++)
2398                         {
2399                                 DU_FREE(flowMap->list.array[flowidx],sizeof( \
2400                                                         Flows_Mapped_To_DRB_Item_t));
2401                         }
2402
2403                         DU_FREE(flowMap->list.array,flowMap->list.size);
2404                 }
2405         }
2406         idx = 0;
2407         flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2408         ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2409         if(ret != ROK)
2410         {
2411                 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2412                         qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2413                         sizeof(MaxDataBurstVolume_t));
2414                 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2415                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2416                         sizeof(AveragingWindow_t));
2417                 DU_FREE(flowMap->list.array[idx]->qoSFlowLevelQoSParameters.\
2418                         qoS_Characteristics.choice.non_Dynamic_5QI,\
2419                         sizeof(NonDynamic5QIDescriptor_t));
2420                 for(idx=0; idx<flowCnt; idx++)
2421                 {
2422                         DU_FREE(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2423                 }
2424                 DU_FREE(flowMap->list.array,flowMap->list.size);
2425                 return RFAILED;
2426         }
2427    return ROK;
2428 }/*End of BuildFlowsMap*/
2429
2430 /*******************************************************************
2431  *
2432  * @brief Builds the Uplink Tunnel Info  
2433  *
2434  * @details
2435  *
2436  *    Function : BuildULTnlInfo
2437  *
2438  *    Functionality: Constructs the UL TnlInfo For DRB list
2439  *
2440  * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2441  *
2442  * @return ROK     - success
2443  *         RFAILED - failure
2444  *
2445  * ****************************************************************/
2446 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2447 {
2448         U8 idx;
2449         U8 ulidx;
2450         U8 ulCnt;
2451         ulCnt = 1;
2452         ulInfo->list.count = ulCnt;
2453         ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2454         DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2455         if(ulInfo->list.array == NULLP)
2456         {
2457                 return RFAILED;
2458         }
2459         for(idx=0; idx<ulCnt; idx++)
2460         {
2461                 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2462                 if(ulInfo->list.array[idx] == NULLP)
2463                 {
2464                         for(ulidx=0; ulidx<idx; ulidx++)
2465                         {
2466                                 DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2467                         }
2468                         DU_FREE(ulInfo->list.array,ulInfo->list.size);
2469                         return RFAILED;
2470                 }
2471         }
2472         idx = 0;
2473         ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2474                                                                 UPTransportLayerInformation_PR_gTPTunnel;
2475         /*GTP TUNNEL*/
2476         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2477                                 sizeof(GTPTunnel_t));
2478         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2479         {
2480                 for(idx=0; idx<ulCnt; idx++)
2481                 {
2482                         DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2483                 }
2484                 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2485                 return RFAILED;
2486         }
2487         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2488                 transportLayerAddress.size      = 4*sizeof(U8);
2489    DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2490                 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2491                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2492         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2493                 transportLayerAddress.buf == NULLP)
2494         {
2495                 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2496                                 sizeof(GTPTunnel_t));
2497                 for(idx=0; idx<ulCnt; idx++)
2498                 {
2499                         DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2500                 }
2501                 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2502                 return RFAILED;
2503         }
2504         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2505                 transportLayerAddress.buf[0] = 4;
2506         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2507                 transportLayerAddress.buf[1] = 4;
2508         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2509                 transportLayerAddress.buf[2] = 4;
2510         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2511                 transportLayerAddress.buf[3] = 5;
2512         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2513                 transportLayerAddress.bits_unused = 0;
2514         /*GTP TEID*/
2515         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2516                                         = 4 * sizeof(U8);
2517         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2518                                 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2519                                 gTPTunnel->gTP_TEID.size);
2520         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2521                                 == NULLP)
2522         {
2523                 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2524                                 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2525                                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2526                 DU_FREE(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2527                                 sizeof(GTPTunnel_t));
2528                 for(idx=0; idx<ulCnt; idx++)
2529                 {
2530                         DU_FREE(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2531                 }
2532                 DU_FREE(ulInfo->list.array,ulInfo->list.size);
2533                 return RFAILED;
2534         }
2535         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2536                 gTP_TEID.buf[0] = 11;
2537         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2538                 gTP_TEID.buf[1] = 0;
2539         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2540                 gTP_TEID.buf[2] = 0;
2541         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2542                 gTP_TEID.buf[3] = 1;
2543
2544    return ROK;
2545 }/*End of BuildULTnlInfo*/
2546
2547 /*******************************************************************
2548  *
2549  * @brief Builds DRBS to be setup 
2550  *
2551  * @details
2552  *
2553  *    Function : BuildDRBSetup
2554  *
2555  *    Functionality: Constructs the DRB's for UESetReq
2556  *
2557  * @params[in] DRBs_ToBeSetup_List_t *drbSet
2558  *
2559  * @return ROK     - success
2560  *         RFAILED - failure
2561  *
2562  * ****************************************************************/
2563 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2564 {
2565         S16 ret;
2566         U8       idx;
2567         U8  drbidx;
2568         U8  drbCnt;
2569         U8  flowidx;
2570         U8  flowCnt;
2571         U8  ulidx;
2572         U8  ulCnt;
2573         DRBs_ToBeSetup_Item_t *drbSetItem;
2574         drbCnt = 1;
2575         drbSet->list.count = drbCnt;
2576         drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2577         DU_ALLOC(drbSet->list.array,drbSet->list.size);
2578         if(drbSet->list.array == NULLP)
2579         {
2580                 return RFAILED;
2581         }
2582         for(idx=0; idx<drbCnt; idx++)
2583         {
2584                 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2585                 if(drbSet->list.array[idx] == NULLP)
2586                 {
2587                         for(drbidx=0; drbidx<idx; drbidx++)
2588                         {
2589                                 DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2590                         }
2591                         DU_FREE(drbSet->list.array,drbSet->list.size);
2592                         return RFAILED;
2593                 }
2594         }
2595         idx = 0;
2596         drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2597         drbSet->list.array[idx]->criticality = Criticality_ignore;
2598         drbSet->list.array[idx]->value.present = \
2599                         DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2600    drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;     
2601         /*dRBID*/
2602         drbSetItem->dRBID = 1;  
2603         /*qoSInformation*/
2604         drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2605         DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2606         if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2607         {       
2608                 for(idx=0; idx<drbCnt; idx++)
2609                 {
2610                         DU_FREE(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2611                 }
2612                 DU_FREE(drbSet->list.array,drbSet->list.size);
2613                 return RFAILED;
2614         }
2615         drbSetItem->qoSInformation.choice.choice_extension->id = \
2616                                                         ProtocolIE_ID_id_DRB_Information;
2617         drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2618                                                         Criticality_ignore;
2619         drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2620                                                         QoSInformation_ExtIEs__value_PR_DRB_Information;
2621         ret = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2622                                                         choice_extension->value.choice.DRB_Information.dRB_QoS);
2623         if(ret != ROK)
2624         {
2625                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2626                 for(drbidx=0; drbidx<drbCnt; drbidx++)
2627                 {
2628                         DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2629                 }
2630                 DU_FREE(drbSet->list.array,drbSet->list.size);
2631                 return RFAILED;
2632         }
2633         /*SNSSAI*/
2634         ret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2635                                                         choice_extension->value.choice.DRB_Information.sNSSAI);
2636         if(ret != ROK)
2637         {       
2638                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2639                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2640                                 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2641                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2642                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2643                                 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2644                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2645                 for(drbidx=0; drbidx<drbCnt; drbidx++)
2646                 {
2647                         DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2648                 }
2649                 DU_FREE(drbSet->list.array,drbSet->list.size);
2650                 return RFAILED;
2651         }
2652         /*Flows mapped to DRB List*/
2653         ret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2654                                 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2655         if(ret != ROK)
2656         {
2657                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2658                                 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2659                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2660                                 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2661                                 choice.choice_extension->value.choice.DRB_Information.\
2662                                 sNSSAI.sD->size);
2663                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2664                                 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2665                                 choice.choice_extension->value.choice.DRB_Information.\
2666                                 sNSSAI.sST.size);
2667                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2668                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2669                                 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2670                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2671                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2672                                 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2673                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2674                 for(drbidx=0; drbidx<drbCnt; drbidx++)
2675                 {
2676                         DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2677                 }
2678                 DU_FREE(drbSet->list.array,drbSet->list.size);
2679                 return RFAILED;
2680         }
2681         /*ULUPTNLInformation To Be Setup List*/
2682    ret = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2683         if(ret != ROK)
2684         {
2685                 flowidx=0;
2686                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2687                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2688                                 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2689                                 choice.non_Dynamic_5QI->maxDataBurstVolume,\
2690                                 sizeof(MaxDataBurstVolume_t));
2691                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2692                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2693                                 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2694                                 choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2695                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2696                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2697                                 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2698                                 choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2699                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2700                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2701                                 array,drbSetItem->qoSInformation.choice.choice_extension->\
2702                                 value.choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2703                                 flowCnt = 1;
2704                 for(flowidx=0; flowidx<flowCnt;flowidx++)
2705                 {
2706                         DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2707                                         choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2708                                         array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2709                 }
2710                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2711                                 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2712                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2713                                 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2714                                 choice.choice_extension->value.choice.DRB_Information.\
2715                                 sNSSAI.sD->size);
2716                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2717                                 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2718                                 choice.choice_extension->value.choice.DRB_Information.\
2719                                 sNSSAI.sST.size);
2720                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2721                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2722                                 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2723                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2724                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2725                                 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2726                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2727                 for(drbidx=0; drbidx<drbCnt; drbidx++)
2728                 {
2729                         DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2730                 }
2731                 DU_FREE(drbSet->list.array,drbSet->list.size);
2732                 return RFAILED;
2733         }
2734         /*RLCMode*/
2735         drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2736
2737         /*UL Configuration*/
2738         ulCnt = 1;
2739         DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2740         if(drbSetItem->uLConfiguration == NULLP)
2741         {
2742                 ulidx=0;
2743                 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2744                                 uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf,\
2745                                 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2746                                 uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
2747                 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2748                                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf,\
2749                                 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2750                                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2751                 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx]->\
2752                                 uLUPTNLInformation.choice.gTPTunnel,sizeof(GTPTunnel_t));
2753                 DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array,\
2754                                 drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.size);
2755                 for(ulidx=0; ulidx<ulCnt; ulidx++)
2756                 {
2757                         DU_FREE(drbSetItem->uLUPTNLInformation_ToBeSetup_List.list.array[ulidx],\
2758                                         sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2759                 }
2760                 flowidx=0;
2761                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2762                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2763                                 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2764                                 choice.non_Dynamic_5QI->maxDataBurstVolume,\
2765                                 sizeof(MaxDataBurstVolume_t));
2766                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2767                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2768                                 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2769                                 choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2770                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2771                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2772                                 array[flowidx]->qoSFlowLevelQoSParameters.qoS_Characteristics.\
2773                                 choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2774                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2775                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2776                                 array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2777                                 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2778                 flowCnt = 1;
2779                 for(flowidx=0; flowidx<flowCnt;flowidx++)
2780                 {
2781                         DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2782                                         choice.DRB_Information.flows_Mapped_To_DRB_List.list.\
2783                                         array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2784                 }
2785                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2786                                 choice.DRB_Information.sNSSAI.sD,sizeof(OCTET_STRING_t));
2787                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2788                                 choice.DRB_Information.sNSSAI.sD->buf,drbSetItem->qoSInformation.\
2789                                 choice.choice_extension->value.choice.DRB_Information.\
2790                                 sNSSAI.sD->size);
2791                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2792                                 choice.DRB_Information.sNSSAI.sST.buf,drbSetItem->qoSInformation.\
2793                                 choice.choice_extension->value.choice.DRB_Information.\
2794                                 sNSSAI.sST.size);
2795                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2796                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2797                                 non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2798                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.\
2799                                 choice.DRB_Information.dRB_QoS.qoS_Characteristics.choice.\
2800                                 non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2801                 DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2802                 for(drbidx=0; drbidx<drbCnt; drbidx++)
2803                 {
2804                         DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2805                 }
2806                 DU_FREE(drbSet->list.array,drbSet->list.size);
2807                 return RFAILED;
2808         }
2809         drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2810         return ROK;
2811 }/* End of BuildDRBSetup*/
2812
2813 /*******************************************************************
2814  *
2815  * @brief Builds and sends the UE Setup Request 
2816  *
2817  * @details
2818  *
2819  *    Function : BuildAndSendUESetReq
2820  *
2821  *    Functionality: Constructs the UE Setup Request and sends
2822  *                   it to the CU through SCTP.
2823  *
2824  * @params[in] 
2825  *
2826  * @return ROK     - success
2827  *         RFAILED - failure
2828  *
2829  * ****************************************************************/
2830 S16 BuildAndSendUESetReq()
2831 {
2832         S16  ret;
2833         U8   elementCnt;
2834         U8   cellCnt;
2835         U8   ieId;
2836         U8   idx;
2837         U8   spId;
2838         U8   srbCnt;
2839         U8   srbId;
2840         U8   drbCnt;
2841         U8   drbId;
2842         U8   flowidx;
2843         U8   flowCnt;
2844         U8   ulidx;
2845         U8   ulCnt;
2846         F1AP_PDU_t                                              *f1apMsg = NULL;
2847    UEContextSetupRequest_t                      *ueSetReq;
2848         asn_enc_rval_t                                          encRetVal;        /* Encoder return value */
2849
2850         DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2851
2852         DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2853         if(f1apMsg == NULLP)
2854         {
2855                 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2856                 return RFAILED;
2857         }
2858
2859         f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2860         DU_ALLOC(f1apMsg->choice.initiatingMessage,
2861                         sizeof(InitiatingMessage_t));
2862         if(f1apMsg->choice.initiatingMessage == NULLP)
2863         {
2864                 DU_LOG(" F1AP : Memory allocation for   F1AP-PDU failed");
2865                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2866                 return RFAILED;
2867         }
2868
2869         f1apMsg->choice.initiatingMessage->procedureCode = \
2870                                                                                                         ProcedureCode_id_UEContextSetup;
2871         f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2872         f1apMsg->choice.initiatingMessage->value.present = \
2873                                    InitiatingMessage__value_PR_UEContextSetupRequest;
2874         ueSetReq =
2875                 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2876         elementCnt = 9;
2877         ueSetReq->protocolIEs.list.count = elementCnt;
2878         ueSetReq->protocolIEs.list.size = \
2879                                                                         elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2880
2881         /* Initialize the UESetup members */
2882         DU_ALLOC(ueSetReq->protocolIEs.list.array, \
2883                         elementCnt * sizeof(UEContextSetupRequestIEs_t *));
2884         if(ueSetReq->protocolIEs.list.array == NULLP)
2885         {
2886                 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2887                 DU_FREE(f1apMsg->choice.initiatingMessage,
2888                                 sizeof(InitiatingMessage_t));
2889                 DU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
2890                 return RFAILED;
2891         }
2892
2893         for(idx=0; idx<elementCnt; idx++)
2894         {
2895                 DU_ALLOC(ueSetReq->protocolIEs.list.array[idx],\
2896                                                                                 sizeof(UEContextSetupRequestIEs_t));
2897                 if(ueSetReq->protocolIEs.list.array[idx] == NULLP)
2898                 {
2899                         for(ieId=0; ieId<idx; ieId++)
2900                         {
2901                                 DU_FREE(ueSetReq->protocolIEs.list.array[ieId],\
2902                                                 sizeof(UEContextSetupRequestIEs_t));
2903                         }
2904                         DU_FREE(ueSetReq->protocolIEs.list.array,\
2905                                         elementCnt * sizeof(UEContextSetupRequestIEs_t *));
2906                         DU_FREE(f1apMsg->choice.initiatingMessage,\
2907                                                                                                 sizeof(InitiatingMessage_t));
2908                         DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2909                         return RFAILED;
2910                 }
2911         }
2912
2913         idx = 0;
2914
2915         /*GNB CU UE F1AP ID*/
2916         ueSetReq->protocolIEs.list.array[idx]->id       = \
2917                                                                                  ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2918         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
2919         ueSetReq->protocolIEs.list.array[idx]->value.present = \
2920                                                 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2921         ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2922
2923         /*GNB DU UE F1AP ID*/
2924         idx++;
2925         ueSetReq->protocolIEs.list.array[idx]->id       = \
2926                                                                                  ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2927         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_ignore;
2928         ueSetReq->protocolIEs.list.array[idx]->value.present = \
2929                                                 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2930         ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2931
2932         /*Special Cell ID*/
2933         idx++;
2934         ueSetReq->protocolIEs.list.array[idx]->id       = \
2935                                                                                                          ProtocolIE_ID_id_SpCell_ID;
2936         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
2937         ueSetReq->protocolIEs.list.array[idx]->value.present = \
2938                                                                 UEContextSetupRequestIEs__value_PR_NRCGI;
2939         ret = \
2940         BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2941         if(ret != ROK)
2942         {
2943                 idx =2;
2944                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2945                         nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
2946                         choice.NRCGI.nRCellIdentity.size));
2947                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
2948                         pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
2949                         choice.NRCGI.pLMN_Identity.size));
2950                 for(idx=0; idx<elementCnt; idx++)
2951                 {
2952                         DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
2953                                         sizeof(InitialULRRCMessageTransferIEs_t));
2954                 }
2955                 DU_FREE(ueSetReq->protocolIEs.list.array,\
2956                                 elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *));
2957                 DU_FREE(f1apMsg->choice.initiatingMessage,\
2958                                 sizeof(InitiatingMessage_t));
2959                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2960                 return RFAILED;
2961
2962         }
2963
2964         /*Served Cell Index*/
2965         idx++;
2966         ueSetReq->protocolIEs.list.array[idx]->id       = \
2967                                                                                                  ProtocolIE_ID_id_ServCellIndex;
2968         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
2969         ueSetReq->protocolIEs.list.array[idx]->value.present = \
2970                                                 UEContextSetupRequestIEs__value_PR_ServCellIndex;
2971         ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
2972         CELL_INDEX;
2973
2974         /*CellULConfigured*/
2975         idx++;
2976         ueSetReq->protocolIEs.list.array[idx]->id       = \
2977                                                                                         ProtocolIE_ID_id_SpCellULConfigured;
2978         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_ignore;
2979         ueSetReq->protocolIEs.list.array[idx]->value.present = \
2980                                                                         UEContextSetupRequestIEs__value_PR_CellULConfigured;
2981         ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
2982                                                                                                                                                         CellULConfigured_none;
2983
2984
2985         /*CUtoDURRCContainer*/
2986         idx++;
2987         ueSetReq->protocolIEs.list.array[idx]->id       = \
2988                                                                                                   ProtocolIE_ID_id_CUtoDURRCInformation;
2989         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
2990         ueSetReq->protocolIEs.list.array[idx]->value.present = \
2991                                                 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
2992
2993         /*Special Cells to be SetupList*/
2994         idx++;
2995         ueSetReq->protocolIEs.list.array[idx]->id       = \
2996                                                                                                   ProtocolIE_ID_id_SCell_ToBeSetup_List;
2997         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_ignore;
2998         ueSetReq->protocolIEs.list.array[idx]->value.present = \
2999                                                 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
3000         cellCnt = 1;
3001         ret = BuildSplCellList(&ueSetReq->protocolIEs.\
3002                                         list.array[idx]->value.choice.SCell_ToBeSetup_List);
3003         if(ret != ROK)
3004         {  idx=6;
3005                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3006                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3007                                 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3008                                 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3009                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3010                                 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3011                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3012                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3013                                 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3014                                 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3015                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3016                                 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3017                 for(spId=0; spId<cellCnt; spId++)
3018                 {
3019                         DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3020                                         SCell_ToBeSetup_List.list.array[spId],sizeof(
3021                                                 SCell_ToBeSetup_ItemIEs_t));
3022                 }
3023                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3024                                 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3025                                 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3026                 idx =2;
3027                 idx=idx-4;
3028                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3029                                 nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3030                                         choice.NRCGI.nRCellIdentity.size));
3031                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3032                                 pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3033                                         choice.NRCGI.pLMN_Identity.size));
3034                 for(idx=0; idx<elementCnt; idx++)
3035                 {
3036                         DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3037                                         sizeof(UEContextSetupRequestIEs_t));
3038                 }
3039                 DU_FREE(ueSetReq->protocolIEs.list.array,\
3040                                 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3041                 DU_FREE(f1apMsg->choice.initiatingMessage,\
3042                                 sizeof(InitiatingMessage_t));
3043                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3044                 return RFAILED;
3045         }
3046         /*SRBs To Be Setup List*/
3047         idx++;
3048         ueSetReq->protocolIEs.list.array[idx]->id       = \
3049                                                                                  ProtocolIE_ID_id_SRBs_ToBeSetup_List;
3050         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
3051         ueSetReq->protocolIEs.list.array[idx]->value.present = \
3052                                                 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
3053         srbCnt = 1;
3054         ret =   BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.\
3055                                                                                                                         choice.SRBs_ToBeSetup_List);
3056         if(ret != ROK)
3057         {        
3058                 idx =7;
3059                 for(srbId=0; srbId<srbCnt; srbId++)
3060                 {
3061                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3062                                 SRBs_ToBeSetup_List.list.array[srbId],\
3063                                 sizeof(SRBs_ToBeSetup_ItemIEs_t));
3064                 }
3065                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3066                                 SRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3067                                 array[idx]->value.choice.SRBs_ToBeSetup_List.list.size);
3068                 idx=6;
3069                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3070                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3071                                 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3072                                 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3073                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3074                                 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3075                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3076                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3077                                 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3078                                 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3079                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3080                                 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3081                 for(spId=0; spId<cellCnt; spId++)
3082                 {
3083                         DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3084                                         SCell_ToBeSetup_List.list.array[spId],sizeof(\
3085                                                 SCell_ToBeSetup_ItemIEs_t));
3086                 }
3087                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3088                                 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3089                                 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3090                 idx=2;
3091                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3092                         nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3093                         choice.NRCGI.nRCellIdentity.size));
3094                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3095                         pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3096                         choice.NRCGI.pLMN_Identity.size));
3097                 for(idx=0; idx<elementCnt; idx++)
3098                 {
3099                         DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3100                                         sizeof(UEContextSetupRequestIEs_t));
3101                 }
3102                 DU_FREE(ueSetReq->protocolIEs.list.array,\
3103                                 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3104                 DU_FREE(f1apMsg->choice.initiatingMessage,\
3105                                 sizeof(InitiatingMessage_t));
3106                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3107                 return RFAILED;
3108         }
3109         /*DRBs to Be Setup List*/
3110         idx++;
3111         ueSetReq->protocolIEs.list.array[idx]->id       = \
3112                                                                                  ProtocolIE_ID_id_DRBs_ToBeSetup_List;
3113         ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
3114         ueSetReq->protocolIEs.list.array[idx]->value.present = \
3115                                                 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
3116         drbCnt = 1;
3117         flowCnt = 1;
3118         ulCnt = 1;
3119         ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.\
3120                                                                                                                         choice.DRBs_ToBeSetup_List);
3121         if(ret != ROK)
3122         {       idx=8;
3123                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3124                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3125                                 DRBs_ToBeSetup_Item.uLConfiguration,\
3126                                 sizeof(ULConfiguration_t));
3127                 ulidx=0;                
3128                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3129                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3130                                 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3131                                 array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
3132                                 sizeof(GTPTunnel_t));
3133                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3134                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3135                                 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3136                                 array,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3137                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3138                                 DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.size);
3139                 for(ulidx=0; ulidx<ulCnt;ulidx++)
3140                 {
3141                         DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3142                                         DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3143                                         DRBs_ToBeSetup_Item.uLUPTNLInformation_ToBeSetup_List.list.\
3144                                         array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
3145                 }
3146                 flowidx = 0;    
3147                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3148                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3149                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3150                                 choice_extension->value.choice.DRB_Information.\
3151                                 flows_Mapped_To_DRB_List.list.array[idx]->qoSFlowLevelQoSParameters.\
3152                                 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3153                                 sizeof(AveragingWindow_t));
3154                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3155                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3156                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3157                                 choice_extension->value.choice.DRB_Information.\
3158                                 flows_Mapped_To_DRB_List.list.array[idx]->qoSFlowLevelQoSParameters.\
3159                                 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3160                                 sizeof(MaxDataBurstVolume_t));
3161                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3162                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3163                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3164                                 choice_extension->value.choice.DRB_Information.\
3165                                 flows_Mapped_To_DRB_List.list.array,ueSetReq->protocolIEs.list.\
3166                                 array[idx]->value.choice.\
3167                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3168                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3169                                 choice_extension->value.choice.DRB_Information.\
3170                                 flows_Mapped_To_DRB_List.list.size);
3171            for(flowidx=0;flowidx<flowCnt;flowidx++)
3172                 {
3173                         DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3174                                         DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3175                                         DRBs_ToBeSetup_Item.qoSInformation.choice.\
3176                                         choice_extension->value.choice.DRB_Information.\
3177                                         flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(
3178                                         Flows_Mapped_To_DRB_Item_t));
3179                 }
3180                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3181                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3182                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3183                                 choice_extension->value.choice.DRB_Information.sNSSAI.\
3184                                 sD->buf,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3185                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3186                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3187                                 choice_extension->value.choice.DRB_Information.sNSSAI.\
3188                                 sD->size);
3189                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3190                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3191                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3192                                 choice_extension->value.choice.DRB_Information.sNSSAI.\
3193                                 sD,sizeof(OCTET_STRING_t));
3194                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3195                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3196                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3197                                 choice_extension->value.choice.DRB_Information.sNSSAI.\
3198                                 sST.buf,ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3199                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3200                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3201                                 choice_extension->value.choice.DRB_Information.sNSSAI.\
3202                                 sST.size);      
3203                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3204                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3205                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3206                                 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3207                                 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
3208                                 sizeof(MaxDataBurstVolume_t));
3209                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3210                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3211                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3212                                 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3213                                 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
3214                                 sizeof(AveragingWindow_t));
3215                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3216                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3217                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3218                                 choice_extension->value.choice.DRB_Information.dRB_QoS.\
3219                                 qoS_Characteristics.choice.non_Dynamic_5QI,\
3220                                 sizeof(NonDynamic5QIDescriptor_t));
3221                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3222                                 DRBs_ToBeSetup_List.list.array[0]->value.choice.\
3223                                 DRBs_ToBeSetup_Item.qoSInformation.choice.\
3224                                 choice_extension,sizeof(QoSInformation_ExtIEs_t));
3225                 for(drbId=0; drbId<drbCnt; drbId++)
3226                 {
3227                         DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3228                                         DRBs_ToBeSetup_List.list.array[drbId],\
3229                                         sizeof(DRBs_ToBeSetup_ItemIEs_t));
3230                 }
3231                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3232                                 DRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3233                                 array[idx]->value.choice.DRBs_ToBeSetup_List.list.size);
3234                 idx=7;
3235                 for(srbId=0; srbId<srbCnt; srbId++)
3236                 {
3237                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3238                                 SRBs_ToBeSetup_List.list.array[srbId],\
3239                                 sizeof(SRBs_ToBeSetup_ItemIEs_t));
3240                 }
3241                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3242                                 SRBs_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3243                                 array[idx]->value.choice.SRBs_ToBeSetup_List.list.size);
3244                 idx=6;
3245                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3246                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3247                                 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.buf,\
3248                                 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3249                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3250                                 SCell_ToBeSetup_Item.sCell_ID.nRCellIdentity.size);
3251                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3252                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3253                                 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.buf,\
3254                                 ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3255                                 SCell_ToBeSetup_List.list.array[0]->value.choice.\
3256                                 SCell_ToBeSetup_Item.sCell_ID.pLMN_Identity.size);
3257                 for(spId=0; spId<cellCnt; spId++)
3258                 {
3259                         DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3260                                         SCell_ToBeSetup_List.list.array[spId],sizeof(\
3261                                                 SCell_ToBeSetup_ItemIEs_t));
3262                 }
3263                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.\
3264                                 SCell_ToBeSetup_List.list.array,ueSetReq->protocolIEs.list.\
3265                                 array[idx]->value.choice.SCell_ToBeSetup_List.list.size);
3266                 idx =2;
3267                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3268                         nRCellIdentity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3269                         choice.NRCGI.nRCellIdentity.size));
3270                 DU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI.\
3271                         pLMN_Identity.buf,sizeof(ueSetReq->protocolIEs.list.array[idx]->value.\
3272                         choice.NRCGI.pLMN_Identity.size));
3273                 for(idx=0; idx<elementCnt; idx++)
3274                 {
3275                         DU_FREE(ueSetReq->protocolIEs.list.array[idx],\
3276                                         sizeof(UEContextSetupRequestIEs_t));
3277                 }
3278                 DU_FREE(ueSetReq->protocolIEs.list.array,\
3279                                 elementCnt * sizeof(UEContextSetupRequestIEs_t *));
3280                 DU_FREE(f1apMsg->choice.initiatingMessage,\
3281                                 sizeof(InitiatingMessage_t));
3282                 DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
3283                 return RFAILED;
3284         }
3285
3286         xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3287
3288         /* Encode the F1SetupRequest type as APER */
3289         cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3290         encBufSize = 0;
3291         encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
3292                         encBuf);
3293         /* Encode results */
3294         if(encRetVal.encoded == ENCODE_FAIL)
3295         {
3296                 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
3297                                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3298                 return RFAILED;
3299         }
3300         else
3301         {
3302                 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
3303                 for(int i=0; i< encBufSize; i++)
3304                 {
3305                         printf("%x",encBuf[i]);
3306                 }
3307         }
3308
3309         /* Sending  msg  */
3310         if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL)       !=      ROK)
3311         {
3312                 DU_LOG("\n F1AP : Sending       UE Context Setup Request Failed");
3313                 return RFAILED;
3314         }
3315         return ROK;
3316 }/* End of BuildAndSendUESetReq*/
3317
3318 /*******************************************************************
3319 *
3320 * @brief Handles received F1AP message and sends back response  
3321 *
3322 * @details
3323 *
3324 *    Function : F1APMsgHdlr
3325 *
3326 *    Functionality:
3327 *         - Decodes received F1AP control message
3328 *         - Prepares response message, encodes and sends to SCTP
3329 *
3330 * @params[in] 
3331 * @return ROK     - success
3332 *         RFAILED - failure
3333 *
3334 * ****************************************************************/
3335 void F1APMsgHdlr(Buffer *mBuf)
3336 {
3337    int i;
3338    char *recvBuf;
3339    MsgLen copyCnt;
3340    MsgLen recvBufLen;
3341    F1AP_PDU_t *f1apMsg;
3342    asn_dec_rval_t rval; /* Decoder return value */
3343    F1AP_PDU_t f1apasnmsg ;
3344  
3345    DU_LOG("\nF1AP : Received F1AP message buffer");
3346    SPrntMsg(mBuf, 0,0);
3347  
3348    /* Copy mBuf into char array to decode it */
3349    SFndLenMsg(mBuf, &recvBufLen);
3350    if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
3351    {
3352       DU_LOG("\nF1AP : Memory allocation failed");
3353       return;
3354    }
3355    if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
3356    {
3357       DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
3358       return;
3359    }
3360
3361    printf("\nF1AP : Received flat buffer to be decoded : ");
3362    for(i=0; i< recvBufLen; i++)
3363    {
3364         printf("%x",recvBuf[i]);
3365    }
3366
3367    /* Decoding flat buffer into F1AP messsage */
3368    f1apMsg = &f1apasnmsg;
3369    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
3370  
3371    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
3372    SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
3373    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
3374    {
3375       DU_LOG("\nF1AP : ASN decode failed");
3376       return;
3377    }
3378    printf("\n");
3379    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3380
3381    switch(f1apMsg->present)
3382    {
3383       case F1AP_PDU_PR_successfulOutcome:
3384       {
3385          switch(f1apMsg->choice.successfulOutcome->value.present)
3386          {
3387             case SuccessfulOutcome__value_PR_F1SetupResponse:
3388             {                           
3389 #ifndef ODU_TEST_STUB
3390                procF1SetupRsp(f1apMsg);
3391 #endif
3392                break;
3393             }
3394             
3395             case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
3396             {
3397                procGNBDUCfgUpdAck(f1apMsg);
3398                break;
3399             }
3400
3401             default:
3402             {
3403                DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
3404                return;
3405             }
3406          }/* End of switch(successfulOutcome) */
3407          break;
3408       }
3409       
3410       default:
3411       {
3412          DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
3413          return;
3414       }
3415
3416    }/* End of switch(f1apMsg->present) */
3417  
3418 } /* End of F1APMsgHdlr */
3419  
3420 /*******************************************************************
3421  *
3422  * @brief Processes GNB DU config update ack
3423  *
3424  * @details
3425  *
3426  *    Function : procGNBDUCfgUpdAck
3427  *
3428  *    Functionality: Processes GNB DU config update ack
3429  *
3430  * @params[in] F1AP_PDU_t ASN decoded F1AP message
3431  * @return ROK     - success
3432  *         RFAILED - failure
3433  *
3434  * ****************************************************************/
3435
3436 S16 procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
3437 {
3438   
3439
3440    DU_LOG("\nF1AP : GNB-DU config update acknowledgment received");
3441
3442     
3443    /* TODO :Check the deallocation */
3444 #if 0
3445    SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(gNBDuCfgAck->protocolIEs.list.array),\
3446            (Size)elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
3447    SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(f1apMsg->choice.successfulOutcome),\
3448            (Size)sizeof(SuccessfulOutcome_t));
3449    SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&f1apMsg,(Size)sizeof(F1AP_PDU_t));
3450 #endif
3451     return ROK;
3452 }
3453
3454 /**********************************************************************
3455   End of file
3456  **********************************************************************/