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