cleanup of BuildAndSendUESetReq
[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 static S16 BuildULTnlInforet=RFAILED;
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         S16 ret;
2173         cellCnt = 1;
2174         spCellLst->list.count = cellCnt;
2175         spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
2176         DU_ALLOC(spCellLst->list.array,spCellLst->list.size);
2177         if(spCellLst->list.array == NULLP)
2178         {
2179                 return RFAILED;
2180         }
2181         for(idx=0; idx<cellCnt; idx++)
2182         {
2183                 DU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2184                 if(spCellLst->list.array[idx] == NULLP)
2185                 {
2186                         return RFAILED;
2187                 }
2188         }
2189         idx = 0;
2190         spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
2191         spCellLst->list.array[idx]->criticality = Criticality_ignore;
2192         spCellLst->list.array[idx]->value.present =\
2193                 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
2194         /* Special Cell ID -NRCGI */
2195         ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2196         if(ret != ROK)
2197         {
2198                 return RFAILED;
2199         }
2200         /*Special Cell Index*/
2201         spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
2202   return ROK;   
2203 }/* End of BuildSplCellList*/
2204
2205 /*******************************************************************
2206  *
2207  * @brief Builds SRBS to be setup 
2208  *
2209  * @details
2210  *
2211  *    Function : BuildSRBSetup
2212  *
2213  *    Functionality: Constructs the SRB's for UESetReq
2214  *
2215  * @params[in] SRBs_ToBeSetup_List_t *srbSet
2216  *
2217  * @return ROK     - success
2218  *         RFAILED - failure
2219  *
2220  * ****************************************************************/
2221 S16 BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2222 {
2223         U8 idx;
2224         U8 srbCnt;
2225         srbCnt = 1;
2226         srbSet->list.count = srbCnt;
2227         srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
2228         DU_ALLOC(srbSet->list.array,srbSet->list.size);
2229         if(srbSet->list.array == NULLP)
2230         {
2231                 return RFAILED;
2232         }
2233         for(idx=0; idx<srbCnt; idx++)
2234         {
2235                 DU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2236                 if(srbSet->list.array[idx] == NULLP)
2237            {
2238                    return RFAILED;
2239                 }
2240         }
2241         idx = 0;
2242         srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
2243         srbSet->list.array[idx]->criticality = Criticality_ignore;
2244         srbSet->list.array[idx]->value.present = \
2245                         SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
2246    srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
2247    return ROK;
2248 }/* End of BuildSRBSetup*/
2249
2250 /*******************************************************************
2251  *
2252  * @brief Builds QOS Info for DRB Setum Item 
2253  *
2254  * @details
2255  *
2256  *    Function : BuildQOSInfo
2257  *
2258  *    Functionality: Constructs the QOS Info for DRB Setup Item
2259  *
2260  * @params[in] QoSInformation_t *qosinfo
2261  *
2262  * @return ROK     - success
2263  *         RFAILED - failure
2264  *
2265  * ****************************************************************/
2266 S16 BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2267 {
2268         /* NonDynamic5QIDescriptor */
2269         drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2270         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2271         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2272         {
2273                 return RFAILED;
2274         }
2275         /*FiveQI*/
2276         drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2277         /*AveragingWindow*/
2278         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2279                                                                                                 sizeof(AveragingWindow_t));
2280         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2281                                                                                                                                                                                                         NULLP)
2282         {
2283                 return RFAILED;
2284         }
2285         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2286         /*MaxDataBurstVolume*/
2287         DU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2288                                                                                                 sizeof(MaxDataBurstVolume_t));
2289         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2290                                                                                                                                                                                                         NULLP)
2291         {
2292                 return RFAILED;
2293         }
2294         *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2295
2296         /*nRGRAN Allocation Retention Priority*/
2297         drbQos->nGRANallocationRetentionPriority.priorityLevel =        \
2298                                                                                                 PriorityLevel_highest;
2299         drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = \
2300                                                         Pre_emptionCapability_may_trigger_pre_emption;
2301         drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = \
2302                                                                 Pre_emptionVulnerability_not_pre_emptable;
2303
2304         /* TO DO: GBR_QoSFlowInformation */
2305         return ROK;
2306 }/*End of BuildQOSInfo*/
2307
2308 /*******************************************************************
2309  *
2310  * @brief Builds SNSSAI  
2311  *
2312  * @details
2313  *
2314  *    Function : BuildSNSSAI
2315  *
2316  *    Functionality: Constructs the SNSSAI For DRB list
2317  *
2318  * @params[in] SNSSAI_t *snssai
2319  *
2320  * @return ROK     - success
2321  *         RFAILED - failure
2322  *
2323  * ****************************************************************/
2324 S16 BuildSNSSAI(SNSSAI_t *snssai)
2325 {
2326         /*SNSSAI*/
2327           /*ssT*/
2328         snssai->sST.size = sizeof(U8);
2329         DU_ALLOC(snssai->sST.buf,snssai->sST.size);
2330         if(snssai->sST.buf == NULLP)
2331         {
2332                 return RFAILED;
2333         }
2334         snssai->sST.buf[0] = 3;
2335           /*sD*/
2336         DU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2337         if(snssai->sD == NULLP)
2338         {
2339                 return RFAILED;
2340         }
2341         snssai->sD->size = 3*sizeof(U8);
2342         DU_ALLOC(snssai->sD->buf,snssai->sD->size);
2343         if(snssai->sD->buf == NULLP)
2344         {
2345                 return RFAILED;
2346         }
2347                 snssai->sD->buf[0] = 3;
2348                 snssai->sD->buf[1] = 6;
2349                 snssai->sD->buf[2] = 9;
2350    return ROK;
2351 }/*End of BuildSNSSAI*/
2352
2353 /*******************************************************************
2354  *
2355  * @brief Builds the flow map.  
2356  *
2357  * @details
2358  *
2359  *    Function : BuildFlowsMap
2360  *
2361  *    Functionality: Constructs the flowmap For DRB list
2362  *
2363  * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2364  *
2365  * @return ROK     - success
2366  *         RFAILED - failure
2367  *
2368  * ****************************************************************/
2369 S16 BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2370 {
2371         S16 ret;
2372         U8  idx;
2373         U8 flowCnt;
2374         flowCnt = 1;
2375         flowMap->list.count = flowCnt;
2376         flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2377         DU_ALLOC(flowMap->list.array,flowMap->list.size);
2378         if(flowMap->list.array == NULLP)
2379         {
2380                 return RFAILED;
2381         }
2382         for(idx=0; idx<flowCnt; idx++)
2383         {
2384                 DU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2385                 if(flowMap->list.array[idx] == NULLP)
2386                 {
2387                    return RFAILED;
2388                 }
2389         }
2390         idx = 0;
2391         flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2392         ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2393         if(ret != ROK)
2394         {
2395                 return RFAILED;
2396         }
2397    return ROK;
2398 }/*End of BuildFlowsMap*/
2399
2400 /*******************************************************************
2401  *
2402  * @brief Builds the Uplink Tunnel Info  
2403  *
2404  * @details
2405  *
2406  *    Function : BuildULTnlInfo
2407  *
2408  *    Functionality: Constructs the UL TnlInfo For DRB list
2409  *
2410  * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2411  *
2412  * @return ROK     - success
2413  *         RFAILED - failure
2414  *
2415  * ****************************************************************/
2416 S16 BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2417 {
2418         U8 idx;
2419         U8 ulCnt;
2420         ulCnt = 1;
2421         ulInfo->list.count = ulCnt;
2422         ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2423         DU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2424         if(ulInfo->list.array == NULLP)
2425         {
2426                 return RFAILED;
2427         }
2428         for(idx=0; idx<ulCnt; idx++)
2429         {
2430                 DU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2431                 if(ulInfo->list.array[idx] == NULLP)
2432                 {
2433                         return RFAILED;
2434                 }
2435         }
2436         idx = 0;
2437         ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2438                                                                 UPTransportLayerInformation_PR_gTPTunnel;
2439         /*GTP TUNNEL*/
2440         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2441                                 sizeof(GTPTunnel_t));
2442         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2443         {
2444                 return RFAILED;
2445         }
2446         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2447                 transportLayerAddress.size      = 4*sizeof(U8);
2448    DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2449                 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2450                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2451         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2452                 transportLayerAddress.buf == NULLP)
2453         {
2454                 return RFAILED;
2455         }
2456         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2457                 transportLayerAddress.buf[0] = 4;
2458         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2459                 transportLayerAddress.buf[1] = 4;
2460         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2461                 transportLayerAddress.buf[2] = 4;
2462         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2463                 transportLayerAddress.buf[3] = 5;
2464         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2465                 transportLayerAddress.bits_unused = 0;
2466         /*GTP TEID*/
2467         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2468                                         = 4 * sizeof(U8);
2469         DU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2470                                 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2471                                 gTPTunnel->gTP_TEID.size);
2472         if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2473                                 == NULLP)
2474         {
2475                 return RFAILED;
2476         }
2477         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2478                 gTP_TEID.buf[0] = 11;
2479         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2480                 gTP_TEID.buf[1] = 0;
2481         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2482                 gTP_TEID.buf[2] = 0;
2483         ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2484                 gTP_TEID.buf[3] = 1;
2485
2486    return ROK;
2487 }/*End of BuildULTnlInfo*/
2488
2489 /*******************************************************************
2490  *
2491  * @brief Builds DRBS to be setup 
2492  *
2493  * @details
2494  *
2495  *    Function : BuildDRBSetup
2496  *
2497  *    Functionality: Constructs the DRB's for UESetReq
2498  *
2499  * @params[in] DRBs_ToBeSetup_List_t *drbSet
2500  *
2501  * @return ROK     - success
2502  *         RFAILED - failure
2503  *
2504  * ****************************************************************/
2505 S16 BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2506 {
2507         S16 BuildQOSInforet;
2508         S16 BuildSNSSAIret;
2509         S16 BuildFlowsMapret;
2510         U8       idx;
2511         U8  drbCnt;
2512         DRBs_ToBeSetup_Item_t *drbSetItem;
2513         drbCnt = 1;
2514         drbSet->list.count = drbCnt;
2515         drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2516         DU_ALLOC(drbSet->list.array,drbSet->list.size);
2517         if(drbSet->list.array == NULLP)
2518         {
2519                 return RFAILED;
2520         }
2521         for(idx=0; idx<drbCnt; idx++)
2522         {
2523                 DU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2524                 if(drbSet->list.array[idx] == NULLP)
2525                 {
2526                         return RFAILED;
2527                 }
2528         }
2529         idx = 0;
2530         drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2531         drbSet->list.array[idx]->criticality = Criticality_ignore;
2532         drbSet->list.array[idx]->value.present = \
2533                         DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2534    drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;     
2535         /*dRBID*/
2536         drbSetItem->dRBID = 1;  
2537         /*qoSInformation*/
2538         drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2539         DU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2540         if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2541         {       
2542                 return RFAILED;
2543         }
2544         drbSetItem->qoSInformation.choice.choice_extension->id = \
2545                                                         ProtocolIE_ID_id_DRB_Information;
2546         drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2547                                                         Criticality_ignore;
2548         drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2549                                                         QoSInformation_ExtIEs__value_PR_DRB_Information;
2550         BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2551                                                         choice_extension->value.choice.DRB_Information.dRB_QoS);
2552         if(BuildQOSInforet != ROK)
2553         {
2554                 return RFAILED;
2555         }
2556         /*SNSSAI*/
2557         BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2558                                                         choice_extension->value.choice.DRB_Information.sNSSAI);
2559         if(BuildSNSSAIret != ROK)
2560         {       
2561                 return RFAILED;
2562         }
2563         /*Flows mapped to DRB List*/
2564         BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2565                                 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2566         if(BuildFlowsMapret != ROK)
2567         {
2568                 return RFAILED;
2569         }
2570         /*ULUPTNLInformation To Be Setup List*/
2571    BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2572         if(BuildULTnlInforet != ROK)
2573         {
2574                 return RFAILED;
2575         }
2576         /*RLCMode*/
2577         drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2578
2579         /*UL Configuration*/
2580         DU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2581         if(drbSetItem->uLConfiguration == NULLP)
2582         {
2583            return RFAILED;
2584         }
2585         drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2586         return ROK;
2587 }/* End of BuildDRBSetup*/
2588 /*******************************************************************
2589 *
2590 * @brief Deallocating memory of function BuildAndSendUESetReq
2591 *
2592 * @details
2593 *
2594 *    Function : FreeNrcgi
2595 *
2596 *    Functionality: Deallocating memory for function BuildNrcgi
2597 *
2598 * @params[in] NRCGI_t *nrcgi
2599 *
2600 * @return void
2601 *
2602 *******************************************************************/
2603 void FreeNrcgi(NRCGI_t *nrcgi)
2604 {
2605         if(nrcgi->pLMN_Identity.buf != NULLP)
2606         {
2607              if(nrcgi->nRCellIdentity.buf != NULLP)
2608              {
2609            DU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size); 
2610                   }
2611              DU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2612         }
2613 }
2614 /*******************************************************************
2615 *
2616 * @brief  Deallocating memory of function BuildAndSendUESetReq
2617 *
2618 * @details
2619 *
2620 *    Function : FreeSplCellList
2621 *
2622 *    Functionality: Deallocating memory for function BuildSplCellList
2623 *
2624 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2625 *
2626 * @return void
2627 *      
2628 *
2629 * *****************************************************************/
2630 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2631 {
2632     U8  cellidx;
2633     if(spCellLst->list.array != NULLP)
2634          {
2635               for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2636                         {
2637                             if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2638                                  {
2639                                     FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2640                                  }
2641                                  if(spCellLst->list.array[cellidx]!=NULLP)
2642                                  {
2643                                      DU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2644                                  }
2645                         }
2646                         DU_FREE(spCellLst->list.array,spCellLst->list.size);
2647          }
2648 }
2649  /*******************************************************************
2650  *
2651  * @brief Deallocating memory of function BuildAndSendUESetReq
2652  *
2653  * @details
2654  *
2655  *    Function : FreeSRBSetup
2656  *
2657  *    Functionality: Deallocating memory for function BuildSRBSetup
2658  *
2659  * @params[in] SRBs_ToBeSetup_List_t *srbSet
2660  *
2661  * @return void
2662  *        
2663  *
2664  * ******************************************************************/
2665 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2666 {
2667     U8 srbidx;
2668          if(srbSet->list.array != NULLP)
2669          {
2670              for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2671                   {
2672                       if(srbSet->list.array[srbidx]!=NULLP)
2673                                 {
2674                                     DU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2675                                 }
2676                   }
2677                   DU_FREE(srbSet->list.array,srbSet->list.size);
2678          }
2679 }
2680  /*******************************************************************
2681   *
2682   * @brief Deallocating memory of function BuildAndSendUESetReq
2683   *
2684   * @details
2685   *
2686   *    Function : FreeQOSInfo
2687   *
2688   *    Functionality:  Deallocating memory for function BuildQOSInfo
2689   *
2690   * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2691   *
2692   * @return void
2693   *          
2694   * ****************************************************************/
2695 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2696 {
2697     if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2698          {
2699              if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2700                   {
2701                       if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2702                                 {
2703                                     DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2704                                          sizeof(MaxDataBurstVolume_t));
2705                                 }
2706                                  DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2707                                  sizeof(AveragingWindow_t));
2708                   }
2709                   DU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2710                   sizeof(NonDynamic5QIDescriptor_t));
2711          }
2712 }
2713  /*******************************************************************
2714   *
2715   * @brief Deallocating memory of function BuildAndSendUESetReq
2716   *
2717   * @details
2718   *
2719   *    Function : FreeULTnlInfo
2720   *
2721   *    Functionality:  Deallocating memory for function BuildULTnlInfo
2722   *
2723   * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2724   *
2725   * @return void
2726   *         
2727  
2728  * ****************************************************************/
2729 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2730 {
2731     U8 ulidx=0;
2732          if(ulInfo->list.array != NULLP)
2733          {
2734              for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2735                   {
2736                       if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2737                                 {
2738                                     if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2739                                          {
2740                                              if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2741                                                   transportLayerAddress.buf != NULLP)
2742                                                   {
2743                                                       if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2744                                                                 !=NULLP)
2745                                                                 {
2746                                                                      DU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2747                                                                           gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2748                                                                           gTPTunnel->gTP_TEID.size);
2749                                                                 }
2750                                                                 DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2751                                                                 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2752                                                                 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2753                                                   }
2754                                                   DU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2755                                                   sizeof(GTPTunnel_t));
2756                                          }
2757                                 }
2758                                 if(ulInfo->list.array[ulidx]!=NULLP)
2759                                 {
2760                                     DU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2761                                 }
2762                   }
2763                   DU_FREE(ulInfo->list.array,ulInfo->list.size);
2764          }
2765 }
2766 /*******************************************************************
2767  *
2768  * @brief Deallocating memory for BuildAndSendUESetReq
2769  *
2770  * @details
2771  *
2772  *    Function : FreeDRBSetup
2773  *
2774  *    Functionality:  Deallocating memory for BuildDRBSetup
2775  *
2776  * @params[in] DRBs_ToBeSetup_List_t *drbSet
2777  *
2778  * @return void
2779  *
2780  * ****************************************************************/
2781 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2782 {
2783     DRBs_ToBeSetup_Item_t *drbSetItem;
2784          U8  flowidx;
2785          U8  drbidx;
2786     if(drbSet->list.array == NULLP)
2787          {
2788              for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2789                   {
2790                        if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2791                                  {
2792                                     drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2793                                     if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2794                                          {
2795                                                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2796                                                          qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2797                                                          {
2798                                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2799                                                                   qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2800                                                                   {
2801                                                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2802                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2803                                                                                  {
2804                                                                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2805                                                                                           {
2806                                                                                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2807                                                                                                         {
2808                                                                                                             if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2809                                                                                                                  {
2810                                                                                                                       if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2811                                                                                                                                 flows_Mapped_To_DRB_List.list.array != NULLP)
2812                                                                                                                                 {
2813                                                                                                                                     for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2814                                                                                                                                          flows_Mapped_To_DRB_List.list.count; flowidx++)
2815                                                                                                                                          {
2816                                                                                                                                              if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2817                                                                                                                                                   DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2818                                                                                                                                                   {
2819                                                                                                                                                       if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2820                                                                                                                                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2821                                                                                                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2822                                                                                                                                                                 {
2823                                                                                                                                                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2824                                                                                                                                                                           DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2825                                                                                                                                                                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2826                                                                                                                                                                           {
2827                                                                                                                                                                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2828                                                                                                                                                                                         DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2829                                                                                                                                                                                         qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2830                                                                                                                                                                                    {    
2831                                                                                                                                                                                                  if((BuildULTnlInforet==ROK)&&(drbSetItem->uLConfiguration!=NULLP))
2832                                                                                                                                                                                                  {
2833                                                                                                                                                                                                      DU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2834                                                                                                                                                                                                  }
2835                                                                                                                                                                                                  FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2836                                                                          DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2837                                                                                                                                                                                                  DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2838                                                                                                                                                                                        qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2839                                                                                                                                                                                                  sizeof(MaxDataBurstVolume_t));   
2840                                                                                                                                                                                    }
2841                                                                                                                                                                                         DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2842                                                                                                                                                                                         DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2843                                                                                                                                                                                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2844                                                                                                                                                                           }
2845                                                                                                                                                                           DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2846                                                                                                                                                                           DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2847                                                                  qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2848                                                                                                                                                                 }
2849                                                                                                                                                   }
2850                                                                                                                                                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2851                                                                                                                                                   DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2852                                                                                                                                                   {
2853                                                                                                                                                       DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2854                                                                                                                                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2855                                                                                                                                                   }
2856                                                                                                                                          }
2857                                                                                                                                     DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2858                                                                                                                                          flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2859                                                                                                                                          choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2860                                                                                                                                 }
2861                                                                                                                       DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2862                                                                                                                         drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2863                                                                                                                  }
2864                                                                                                                  DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2865                                                                                                                  sizeof(OCTET_STRING_t));
2866                                                                                                         }
2867                                                                                                          DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2868                                                                                                          drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2869                                                                                           }
2870                                                                                           DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2871                                                                                      qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2872                                                                                  }
2873                                                                        DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2874                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2875                                                                   }
2876                                                              DU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2877                                                                   qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2878                                                          }
2879                                                    DU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2880                                          }
2881                                  }
2882                        if(drbSet->list.array[drbidx]!=NULLP)
2883                                  {
2884                                      DU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2885                                 }
2886                   }
2887              DU_FREE(drbSet->list.array,drbSet->list.size);
2888          }
2889 }
2890 /*******************************************************************
2891  *
2892  * @brief Builds and sends the UE Setup Request 
2893  *
2894  * @details
2895  *
2896  *    Function : BuildAndSendUESetReq
2897  *
2898  *    Functionality: Constructs the UE Setup Request and sends
2899  *                   it to the CU through SCTP.
2900  *
2901  * @params[in] 
2902  *
2903  * @return ROK     - success
2904  *         RFAILED - failure
2905  *
2906  * ****************************************************************/
2907 S16 BuildAndSendUESetReq()
2908 {
2909         S16  ret;
2910         U8   elementCnt;
2911         S16  BuildNrcgiret;
2912         S16  BuildSplCellListret;
2913         S16  BuildSRBSetupret;
2914         U8   idx;
2915         U8   idx1;
2916         U8   ieId;
2917         F1AP_PDU_t                                              *f1apMsg = NULL;
2918    UEContextSetupRequest_t                      *ueSetReq;
2919         asn_enc_rval_t                                          encRetVal;        /* Encoder return value */
2920    bool checkvar=false;
2921         while(1)
2922         {
2923             DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2924
2925             DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2926             if(f1apMsg == NULLP)
2927             {
2928                     DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2929                          break;
2930             }
2931
2932             f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2933             DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2934             if(f1apMsg->choice.initiatingMessage == NULLP)
2935             {
2936                      DU_LOG(" F1AP : Memory allocation for      F1AP-PDU failed");
2937                           break;
2938             }
2939
2940             f1apMsg->choice.initiatingMessage->procedureCode = \
2941                                                                                                         ProcedureCode_id_UEContextSetup;
2942             f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2943             f1apMsg->choice.initiatingMessage->value.present = \
2944                                    InitiatingMessage__value_PR_UEContextSetupRequest;
2945             ueSetReq =
2946                   &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2947             elementCnt = 9;
2948             ueSetReq->protocolIEs.list.count = elementCnt;
2949             ueSetReq->protocolIEs.list.size = \
2950                                                                         elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2951
2952             /* Initialize the UESetup members */
2953             DU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2954             
2955                  if(ueSetReq->protocolIEs.list.array == NULLP)
2956             {
2957                      DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2958                           break;
2959             }
2960
2961             for(idx1=0; idx1<elementCnt; idx1++)
2962             {
2963                      DU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
2964                      if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
2965                      {
2966                              break;
2967                      }
2968             }
2969
2970             idx = 0;
2971
2972             /*GNB CU UE F1AP ID*/
2973             ueSetReq->protocolIEs.list.array[idx]->id   = \
2974                                                                                  ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2975          ueSetReq->protocolIEs.list.array[idx]->criticality     =       Criticality_reject;
2976             ueSetReq->protocolIEs.list.array[idx]->value.present = \
2977                                                 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2978             ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
2979
2980             /*GNB DU UE F1AP ID*/
2981             idx++;
2982             ueSetReq->protocolIEs.list.array[idx]->id   = \
2983                                                                                  ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2984             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_ignore;
2985             ueSetReq->protocolIEs.list.array[idx]->value.present = \
2986                                                 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2987             ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
2988
2989             /*Special Cell ID*/
2990             idx++;
2991             ueSetReq->protocolIEs.list.array[idx]->id   = \
2992                                                                                                          ProtocolIE_ID_id_SpCell_ID;
2993             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
2994             ueSetReq->protocolIEs.list.array[idx]->value.present = \
2995                                                                 UEContextSetupRequestIEs__value_PR_NRCGI;
2996             BuildNrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2997             if(BuildNrcgiret != ROK)
2998             {
2999                     break;
3000             }
3001
3002             /*Served Cell Index*/
3003             idx++;
3004             ueSetReq->protocolIEs.list.array[idx]->id   = \
3005                                                                                                  ProtocolIE_ID_id_ServCellIndex;
3006             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_reject;
3007             ueSetReq->protocolIEs.list.array[idx]->value.present = \
3008                                                 UEContextSetupRequestIEs__value_PR_ServCellIndex;
3009             ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
3010             CELL_INDEX;
3011
3012             /*CellULConfigured*/
3013             idx++;
3014             ueSetReq->protocolIEs.list.array[idx]->id   = \
3015                                                                                         ProtocolIE_ID_id_SpCellULConfigured;
3016             ueSetReq->protocolIEs.list.array[idx]->criticality  =       Criticality_ignore;
3017             ueSetReq->protocolIEs.list.array[idx]->value.present = \
3018                                                                         UEContextSetupRequestIEs__value_PR_CellULConfigured;
3019             ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
3020                                                                                                                                                         CellULConfigured_none;
3021
3022
3023              /*CUtoDURRCContainer*/
3024              idx++;
3025              ueSetReq->protocolIEs.list.array[idx]->id  = \
3026                                                                                                   ProtocolIE_ID_id_CUtoDURRCInformation;
3027              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
3028              ueSetReq->protocolIEs.list.array[idx]->value.present = \
3029                                                 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
3030
3031              /*Special Cells to be SetupList*/
3032              idx++;
3033              ueSetReq->protocolIEs.list.array[idx]->id  = \
3034                                                                                                   ProtocolIE_ID_id_SCell_ToBeSetup_List;
3035              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_ignore;
3036              ueSetReq->protocolIEs.list.array[idx]->value.present = \
3037                                                 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
3038              BuildSplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
3039              if(BuildSplCellListret != ROK)
3040              {  
3041                      break;
3042              }
3043              /*SRBs To Be Setup List*/
3044              idx++;
3045              ueSetReq->protocolIEs.list.array[idx]->id  = \
3046                                                                                  ProtocolIE_ID_id_SRBs_ToBeSetup_List;
3047              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
3048              ueSetReq->protocolIEs.list.array[idx]->value.present = \
3049                                                 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
3050              BuildSRBSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
3051              if(BuildSRBSetupret != ROK)
3052              {        
3053                      break;
3054              }
3055              /*DRBs to Be Setup List*/
3056              idx++;
3057              ueSetReq->protocolIEs.list.array[idx]->id  = \
3058                                                                                  ProtocolIE_ID_id_DRBs_ToBeSetup_List;
3059              ueSetReq->protocolIEs.list.array[idx]->criticality =       Criticality_reject;
3060              ueSetReq->protocolIEs.list.array[idx]->value.present = \
3061                                                 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
3062              ret = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
3063              if(ret != ROK)
3064              {  
3065                      break;
3066              }
3067
3068              xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3069
3070              /* Encode the F1SetupRequest type as APER */
3071              cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
3072              encBufSize = 0;
3073              encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
3074                         encBuf);
3075              /* Encode results */
3076              if(encRetVal.encoded == ENCODE_FAIL)
3077              {
3078                 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
3079                                 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3080                       break;
3081              }
3082              else
3083              {
3084                       DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
3085                       for(int i=0; i< encBufSize; i++)
3086                       {
3087                         printf("%x",encBuf[i]);
3088                       }
3089             }
3090
3091             /* Sending  msg  */
3092             if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL)   !=      ROK)
3093             {
3094                 DU_LOG("\n F1AP : Sending       UE Context Setup Request Failed");
3095                       break;
3096             }
3097                  checkvar=true;
3098                  break;
3099    }
3100    if(f1apMsg != NULLP)
3101         {
3102             if(f1apMsg->choice.initiatingMessage != NULLP)
3103                  {
3104                       if(ueSetReq->protocolIEs.list.array != NULLP)
3105                                 {
3106                                if(idx1==elementCnt)
3107                                          {
3108                                                   if(BuildNrcgiret==ROK)
3109                                                   {
3110                                                                  if(BuildSplCellListret==ROK)
3111                                                                  {
3112                                                                            if(BuildSRBSetupret == ROK)
3113                                                                                 {
3114                                                                                    FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.DRBs_ToBeSetup_List); 
3115                                                                                 }
3116                                                                                 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx--]->value.choice.SRBs_ToBeSetup_List);
3117                                                                  }    
3118                                                                  FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List); 
3119                                                   }
3120                                                   idx=2;
3121                                                   FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);   
3122                                                   for(ieId=0; ieId<idx1; ieId++)
3123                                                   {
3124                                                       DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3125                                                   }
3126                                          }
3127                                          else
3128                                          {
3129                                              for(ieId=0; ieId<idx; ieId++)
3130                                                   {
3131                                                       if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
3132                                                                 {
3133                                                           DU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
3134                                                                 }
3135                                                   }
3136                                          }
3137                                          DU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);        
3138                                 }
3139                       DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
3140                  }
3141             DU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); 
3142         }
3143         if(checkvar==true)
3144         return ROK;
3145         else
3146              return RFAILED;
3147 }/* End of BuildAndSendUESetReq*/
3148
3149 /*******************************************************************
3150 *
3151 * @brief Handles received F1AP message and sends back response  
3152 *
3153 * @details
3154 *
3155 *    Function : F1APMsgHdlr
3156 *
3157 *    Functionality:
3158 *         - Decodes received F1AP control message
3159 *         - Prepares response message, encodes and sends to SCTP
3160 *
3161 * @params[in] 
3162 * @return ROK     - success
3163 *         RFAILED - failure
3164 *
3165 * ****************************************************************/
3166 void F1APMsgHdlr(Buffer *mBuf)
3167 {
3168    int i;
3169    char *recvBuf;
3170    MsgLen copyCnt;
3171    MsgLen recvBufLen;
3172    F1AP_PDU_t *f1apMsg;
3173    asn_dec_rval_t rval; /* Decoder return value */
3174    F1AP_PDU_t f1apasnmsg ;
3175  
3176    DU_LOG("\nF1AP : Received F1AP message buffer");
3177    SPrntMsg(mBuf, 0,0);
3178  
3179    /* Copy mBuf into char array to decode it */
3180    SFndLenMsg(mBuf, &recvBufLen);
3181    if(SGetSBuf(DFLT_REGION, DFLT_POOL, (Data **)&recvBuf, (Size)recvBufLen) != ROK)
3182    {
3183       DU_LOG("\nF1AP : Memory allocation failed");
3184       return;
3185    }
3186    if(SCpyMsgFix(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
3187    {
3188       DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
3189       return;
3190    }
3191
3192    printf("\nF1AP : Received flat buffer to be decoded : ");
3193    for(i=0; i< recvBufLen; i++)
3194    {
3195         printf("%x",recvBuf[i]);
3196    }
3197
3198    /* Decoding flat buffer into F1AP messsage */
3199    f1apMsg = &f1apasnmsg;
3200    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
3201  
3202    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
3203    SPutSBuf(DFLT_REGION, DFLT_POOL, (Data *)recvBuf, (Size)recvBufLen);
3204    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
3205    {
3206       DU_LOG("\nF1AP : ASN decode failed");
3207       return;
3208    }
3209    printf("\n");
3210    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3211
3212    switch(f1apMsg->present)
3213    {
3214       case F1AP_PDU_PR_successfulOutcome:
3215       {
3216          switch(f1apMsg->choice.successfulOutcome->value.present)
3217          {
3218             case SuccessfulOutcome__value_PR_F1SetupResponse:
3219             {                           
3220 #ifndef ODU_TEST_STUB
3221                procF1SetupRsp(f1apMsg);
3222 #endif
3223                break;
3224             }
3225             
3226             case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
3227             {
3228                procGNBDUCfgUpdAck(f1apMsg);
3229                break;
3230             }
3231
3232             default:
3233             {
3234                DU_LOG("\nF1AP : Invalid type of successful outcome [%d]", f1apMsg->choice.successfulOutcome->value.present);
3235                return;
3236             }
3237          }/* End of switch(successfulOutcome) */
3238          break;
3239       }
3240       
3241       default:
3242       {
3243          DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
3244          return;
3245       }
3246
3247    }/* End of switch(f1apMsg->present) */
3248  
3249 } /* End of F1APMsgHdlr */
3250  
3251 /*******************************************************************
3252  *
3253  * @brief Processes GNB DU config update ack
3254  *
3255  * @details
3256  *
3257  *    Function : procGNBDUCfgUpdAck
3258  *
3259  *    Functionality: Processes GNB DU config update ack
3260  *
3261  * @params[in] F1AP_PDU_t ASN decoded F1AP message
3262  * @return ROK     - success
3263  *         RFAILED - failure
3264  *
3265  * ****************************************************************/
3266
3267 S16 procGNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
3268 {
3269   
3270
3271    DU_LOG("\nF1AP : GNB-DU config update acknowledgment received");
3272
3273     
3274    /* TODO :Check the deallocation */
3275 #if 0
3276    SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(gNBDuCfgAck->protocolIEs.list.array),\
3277            (Size)elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
3278    SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&(f1apMsg->choice.successfulOutcome),\
3279            (Size)sizeof(SuccessfulOutcome_t));
3280    SPutSBuf(DU_APP_MEM_REGION,DU_POOL,(Data *)&f1apMsg,(Size)sizeof(F1AP_PDU_t));
3281 #endif
3282     return ROK;
3283 }
3284
3285 /**********************************************************************
3286   End of file
3287  **********************************************************************/