JIRA-ID:[ODUHIGH-295]- Tunnel creation in EGTP
[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 #include "common_def.h"
21 #include "lrg.h"
22 #include "legtp.h"
23 #include "lkw.x"
24 #include "lrg.x"
25 #include "du_app_mac_inf.h"
26 #include "du_cfg.h"
27 #include "du_app_rlc_inf.h"
28 #include "du_mgr_main.h"
29 #include "du_utils.h"
30 #include "RAT-Type.h"
31 #include "FeatureSetUplinkPerCC.h"
32 #include "FeatureSetDownlinkPerCC.h"
33 #include "FeatureSets.h"
34 #include "UE-NR-Capability.h"
35 #include "UE-CapabilityRAT-Container.h"
36 #include "UE-CapabilityRAT-ContainerListRRC.h"
37 #include "GNB-DU-System-Information.h"
38 #include "CellGroupConfigRrc.h"
39 #include "MAC-CellGroupConfig.h"
40 #include "SchedulingRequestConfig.h"
41 #include "SchedulingRequestToAddMod.h"
42 #include "BSR-Config.h"
43 #include "TAG-Config.h"
44 #include "TAG.h"
45 #include "PHR-Config.h"
46 #include "RLC-Config.h"
47 #include "UL-AM-RLC.h"
48 #include "DL-AM-RLC.h"
49 #include "LogicalChannelConfig.h"
50 #include "RLC-BearerConfig.h"
51 #include "PhysicalCellGroupConfig.h"
52 #include "SpCellConfig.h"
53 #include "TDD-UL-DL-ConfigDedicated.h"
54 #include "ServingCellConfig.h"
55 #include "ControlResourceSet.h"
56 #include "SearchSpace.h"
57 #include "PDCCH-Config.h"
58 #include "PDSCH-TimeDomainResourceAllocation.h"
59 #include "PDSCH-TimeDomainResourceAllocationList.h"
60 #include "PDSCH-CodeBlockGroupTransmission.h"
61 #include "PDSCH-ServingCellConfig.h"
62 #include "DMRS-DownlinkConfig.h"
63 #include "PDSCH-Config.h"
64 #include "BWP-DownlinkDedicated.h"
65 #include "PUSCH-TimeDomainResourceAllocation.h"
66 #include "PUSCH-TimeDomainResourceAllocationList.h"
67 #include "DMRS-UplinkConfig.h"
68 #include "PUSCH-Config.h"
69 #include "SRS-ResourceId.h"
70 #include "SRS-Resource.h"
71 #include "SRS-ResourceSet.h"
72 #include "SRS-Config.h"
73 #include "BWP-UplinkDedicated.h"
74 #include "PUSCH-ServingCellConfig.h"
75 #include "UplinkConfig.h"
76 #include "DUtoCURRCContainer.h"
77 #include "GBR-QoSFlowInformation.h"
78 #include "QoSFlowLevelQoSParameters.h"
79 #include "PUCCH-Config.h"
80 #include "PUCCH-ResourceSet.h"
81 #include "PUCCH-Resource.h"
82 #include "PUCCH-PowerControl.h"
83 #include "P0-PUCCH.h"
84 #include "PUCCH-PathlossReferenceRS.h"
85 #include "PUCCH-format0.h"
86 #include "PUCCH-format1.h"
87 #include "PUCCH-format2.h"
88 #include "PUCCH-format3.h"
89 #include "PUCCH-format4.h"
90 #include "PUCCH-FormatConfig.h"
91 #include "SchedulingRequestResourceConfig.h"
92 #include<ProtocolIE-Field.h>
93 #include "ProtocolExtensionField.h"
94 #include "F1AP-PDU.h"
95 #include "odu_common_codec.h"
96 #include "du_mgr.h"
97 #include "du_cell_mgr.h"
98 #include "du_f1ap_msg_hdl.h"
99 #include "DRBs-Setup-Item.h"
100 #include "DLUPTNLInformation-ToBeSetup-List.h"
101 #include "DLUPTNLInformation-ToBeSetup-Item.h"
102 #include "UPTransportLayerInformation.h"
103 #include "GTPTunnel.h"
104
105 DuCfgParams duCfgParam;
106
107 /************************************************************************
108  *
109  * @brief Converts enum values into actual value of Poll retransmit timer
110  *
111  * @details
112  *
113  *    Function : getPollPdu
114  *
115  *    Functionality: Converts enum values into actual value of poll 
116  *    retransmit timer
117  *
118  * @params[in] Enum value of pollPdu
119  * @return Actual value of pollPdu
120  *
121  * **********************************************************************/
122
123 uint16_t getPollRetxTmr(uint8_t pollRetxTmrCfg)
124 {
125    uint16_t pollRetxTmr;
126
127    /* All values of poll retx timer are at interval of 5ms.
128     * This is valid upto 250ms
129     * Hence converting the enum value to actual value by multiplying it to 5
130     */
131    if(pollRetxTmrCfg <= T_PollRetransmit_ms250)
132       pollRetxTmr = (pollRetxTmrCfg + 1) * 5;
133    else
134    {
135       switch(pollRetxTmrCfg)
136       {
137          case T_PollRetransmit_ms300:
138             pollRetxTmr = 300;
139             break;
140          case T_PollRetransmit_ms350:
141             pollRetxTmr = 350;
142             break;
143          case T_PollRetransmit_ms400:
144             pollRetxTmr = 400;
145             break;
146          case T_PollRetransmit_ms450:
147             pollRetxTmr = 450;
148             break;
149          case T_PollRetransmit_ms500:
150             pollRetxTmr = 500;
151             break;
152          case T_PollRetransmit_ms800:
153             pollRetxTmr = 800;
154             break;
155          default:
156             DU_LOG("\nERROR  -->  F1AP: Invalid value of Poll Retransmit timer");
157             pollRetxTmr = 0;
158       }
159    }
160    return pollRetxTmr; 
161 }
162
163 /*******************************************************************
164  *
165  * @brief Converts enum values into actual value of PollPdu
166  *
167  * @details
168  *
169  *    Function : getPollPdu
170  *
171  *    Functionality: Converts enum values into actual value of PollPdu
172  *
173  * @params[in] Enum value of pollPdu
174  * @return Actual value of pollPdu
175  *
176  * ****************************************************************/
177 int16_t getPollPdu(uint8_t pollPduCfg)
178 {
179    int16_t pollPdu;
180    switch(pollPduCfg)
181    {
182       case PollPDU_p4:
183          pollPdu = 4;
184          break;
185       case PollPDU_p8:
186          pollPdu = 8;
187          break;
188       case PollPDU_p16:
189          pollPdu = 16;
190          break;
191       case PollPDU_p32:
192          pollPdu = 32;
193          break;
194       case PollPDU_p64:
195          pollPdu = 64;
196          break;
197       case PollPDU_p128:
198          pollPdu = 128;
199          break;
200       case PollPDU_p256:
201          pollPdu = 256;
202          break;
203       case PollPDU_p512:
204          pollPdu = 512;
205          break;
206       case PollPDU_p1024:
207          pollPdu = 1024;
208          break;
209       case PollPDU_p2048:
210          pollPdu = 2048;
211          break;
212       case PollPDU_p4096:
213          pollPdu = 4096;
214          break;
215       case PollPDU_p6144:
216          pollPdu = 6144;
217          break;
218       case PollPDU_p8192:
219          pollPdu = 8192;
220          break;
221       case PollPDU_p12288:
222          pollPdu = 12288;
223          break;
224       case PollPDU_p16384:
225          pollPdu = 16384;
226          break;
227       case PollPDU_p20480:
228          pollPdu = 20480;
229          break;
230       case PollPDU_p24576:
231          pollPdu = 24576;
232          break;
233       case PollPDU_p28672:
234          pollPdu = 28672;
235          break;
236       case PollPDU_p32768:
237          pollPdu = 32768;
238          break;
239       case PollPDU_p40960:
240          pollPdu = 40960;
241          break;
242       case PollPDU_p49152:
243          pollPdu = 49152;
244          break;
245       case PollPDU_p57344:
246          pollPdu = 57344;
247          break;
248       case PollPDU_p65536:
249          pollPdu = 65536;
250          break;
251       case PollPDU_infinity:
252          pollPdu = -1;
253          break;
254       default:
255          DU_LOG("\nERROR  -->  F1AP: Invalid value of poll pdu");
256          pollPdu = 0;
257          break;
258    }
259    return pollPdu;
260 }
261
262 /*******************************************************************
263  *
264  * @brief Converts enum values into actual value of poll bytes
265  *
266  * @details
267  *
268  *    Function : getPollByte
269  *
270  *    Functionality: Converts enum values into actual value of pollBytes
271  *
272  * @params[in] Enum value
273  * @return Actual value
274  *
275  * ****************************************************************/
276 int32_t getPollByte(uint16_t pollBytesCfg)
277 {
278    int32_t pollBytes;
279    switch(pollBytesCfg)
280    {
281       case PollByte_kB1:
282          pollBytes = 1000;
283          break;
284       case PollByte_kB2:
285          pollBytes = 2000;
286          break;
287       case PollByte_kB5:
288          pollBytes = 5000;
289          break;
290       case PollByte_kB8:
291          pollBytes = 8000;
292          break;
293       case PollByte_kB10:
294          pollBytes = 10000;
295          break;
296       case PollByte_kB15:
297          pollBytes = 15000;
298          break;
299       case PollByte_kB25:
300          pollBytes = 25000;
301          break;
302       case PollByte_kB50:
303          pollBytes = 50000;
304          break;
305       case PollByte_kB75:
306          pollBytes = 75000;
307          break;
308       case PollByte_kB100:
309          pollBytes = 100000;
310          break;
311       case PollByte_kB125:
312          pollBytes = 125000;
313          break;
314       case PollByte_kB250:
315          pollBytes = 250000;
316          break;
317       case PollByte_kB375:
318          pollBytes = 375000;
319          break;
320       case PollByte_kB500:
321          pollBytes = 500000;
322          break;
323       case PollByte_kB750:
324          pollBytes = 750000;
325          break;
326       case PollByte_kB1000:
327          pollBytes = 1000000;
328          break;
329       case PollByte_kB1250:
330          pollBytes = 1250000;
331          break;
332       case PollByte_kB1500:
333          pollBytes = 1500000;
334          break;
335       case PollByte_kB2000:
336          pollBytes = 2000000;
337          break;
338       case PollByte_kB3000:
339          pollBytes = 3000000;
340          break;
341       case PollByte_kB4000:
342          pollBytes = 4000000;
343          break;
344       case PollByte_kB4500:
345          pollBytes = 4500000;
346          break;
347       case PollByte_kB5000:
348          pollBytes = 5000000;
349          break;
350       case PollByte_kB5500:
351          pollBytes = 5500000;
352          break;
353       case PollByte_kB6000:
354          pollBytes = 6000000;
355          break;
356       case PollByte_kB6500:
357          pollBytes = 6500000;
358          break;
359       case PollByte_kB7000:
360          pollBytes = 7000000;
361          break;
362       case PollByte_kB7500:
363          pollBytes = 7500000;
364          break;
365       case PollByte_mB8:
366          pollBytes = 8000000;
367          break;
368       case PollByte_mB9:
369          pollBytes = 9000000;
370          break;
371       case PollByte_mB10:
372          pollBytes = 10000000;
373          break;
374       case PollByte_mB11:
375          pollBytes = 11000000;
376          break;
377       case PollByte_mB12:
378          pollBytes = 12000000;
379          break;
380       case PollByte_mB13:
381          pollBytes = 13000000;
382          break;
383       case PollByte_mB14:
384          pollBytes = 14000000;
385          break;
386       case PollByte_mB15:
387          pollBytes = 15000000;
388          break;
389       case PollByte_mB16:
390          pollBytes = 16000000;
391          break;
392       case PollByte_mB17:
393          pollBytes = 17000000;
394          break;
395       case PollByte_mB18:
396          pollBytes = 18000000;
397          break;
398       case PollByte_mB20:
399          pollBytes = 20000000;
400          break;
401       case PollByte_mB25:
402          pollBytes = 25000000;
403          break;
404       case PollByte_mB30:
405          pollBytes = 30000000;
406          break;
407       case PollByte_mB40:
408          pollBytes = 40000000;
409          break;
410       case PollByte_infinity:
411          pollBytes = -1;
412          break;
413       default:
414          DU_LOG("\nERROR  -->  F1AP: Invalid value of poll bytes");
415          pollBytes = 0;
416    }
417    return pollBytes;
418 }
419
420 /*******************************************************************
421  *
422  * @brief Converts enum values into actual value of maxRetx
423  *
424  * @details
425  *
426  *    Function : getMaxRetx
427  *
428  *    Functionality: Converts enum values into actual value of maxRetx
429  *
430  * @params[in] Enum value
431  * @return Actual value
432  *
433  * ****************************************************************/
434 uint8_t getMaxRetx(uint8_t maxRetxCfg)
435 {
436    uint8_t maxRetx;
437    switch(maxRetxCfg)
438    {
439       case UL_AM_RLC__maxRetxThreshold_t1:
440          maxRetx = 1;
441          break;
442       case UL_AM_RLC__maxRetxThreshold_t2:
443          maxRetx = 2;
444          break;
445       case UL_AM_RLC__maxRetxThreshold_t3:
446          maxRetx = 3;
447          break;
448       case UL_AM_RLC__maxRetxThreshold_t4:
449          maxRetx = 4;
450          break;
451       case UL_AM_RLC__maxRetxThreshold_t6:
452          maxRetx = 6;
453          break;
454       case UL_AM_RLC__maxRetxThreshold_t8:
455          maxRetx = 8;
456          break;
457       case UL_AM_RLC__maxRetxThreshold_t16:
458          maxRetx = 16;
459          break;
460       case UL_AM_RLC__maxRetxThreshold_t32:
461          maxRetx = 32;
462          break;
463       default:
464          DU_LOG("\nERROR  -->  F1AP: Invalid configuration for Max retransmission threshold");
465          maxRetx = 0;
466    }
467    return maxRetx;
468 }
469
470 /*******************************************************************
471  * @brief Converts enum values into actual value of reassembly timer
472  *
473  * @details
474  *
475  *    Function : getReAsmblTmr
476  *
477  *    Functionality: Converts enum values into actual value of reassembly 
478  *    timer
479  *
480  * @params[in] Enum value of reassembly timer
481  * @return Actual value of reassembly timer
482  *
483  * **********************************************************************/
484
485 int8_t getReAsmblTmr(uint8_t reAsmblTmrCfg)
486 {
487    int8_t reAsmblTmr = 0;
488    
489    if(reAsmblTmrCfg == T_Reassembly_ms0)
490    {
491       reAsmblTmr = 0;
492    }
493    else if(reAsmblTmrCfg >= T_Reassembly_ms5 || reAsmblTmrCfg <= T_Reassembly_ms100)
494    {
495      /* All values of re assembly timer are at interval of 5ms.
496       * This is valid upto 100ms
497       * Hence converting the enum value to actual value by multiplying it to 5
498       */
499       reAsmblTmr = reAsmblTmrCfg * 5;
500    }
501    else if(reAsmblTmrCfg >= T_Reassembly_ms110 || reAsmblTmrCfg <= T_Reassembly_ms200)
502    {
503      /* All values of re assembly timer are at interval of 10ms.
504       * This is valid upto 200ms
505       * since enum value starts from 20 for 100ms, subtracting 10 and
506       * converting the enum value to actual value by multiplying it to 10
507       */
508       reAsmblTmr = ((reAsmblTmrCfg-10) * 10);
509    }
510    else
511    {
512       DU_LOG("\nERROR  -->  F1AP : Invalid value of Re Assembly timer %d", reAsmblTmrCfg);
513       reAsmblTmr = -1;
514    }
515    return reAsmblTmr; 
516 }
517
518 /************************************************************************
519  *
520  * @brief Converts enum values into actual value of status prohibit timer
521  *
522  * @details
523  *
524  *    Function : getStatProhTmr
525  *
526  *    Functionality: Converts enum values into actual value of status prohibit 
527  *    timer
528  *
529  * @params[in] Enum value of status prohibit timer
530  * @return Actual value of status prohibit timer
531  *
532  * **********************************************************************/
533
534 int16_t getStatProhTmr(uint8_t statProhTmrCfg)
535 {
536    int16_t statProhTmr =0;
537    
538    if(statProhTmrCfg == T_StatusProhibit_ms0)
539    {
540       statProhTmr = 0;
541    }
542    else if(statProhTmrCfg >= T_StatusProhibit_ms5 || statProhTmrCfg <= T_StatusProhibit_ms250)
543    {
544       /* All values of re assembly timer are at interval of 5ms.
545        * This is valid upto 250ms
546        * Hence converting the enum value to actual value by multiplying it to 5
547        */
548       statProhTmr = statProhTmrCfg * 5;
549    }
550    else
551    {
552       switch(statProhTmrCfg)
553       {
554          case T_StatusProhibit_ms300:
555             statProhTmr = 300;
556             break;
557          case T_StatusProhibit_ms350:
558             statProhTmr = 350;
559             break;
560          case T_StatusProhibit_ms400:
561             statProhTmr = 400;
562             break;
563          case T_StatusProhibit_ms450:
564             statProhTmr = 450;
565             break;
566          case T_StatusProhibit_ms500:
567             statProhTmr = 500;
568             break;
569          case T_StatusProhibit_ms800:
570             statProhTmr = 800;
571             break;
572          case T_StatusProhibit_ms1000:
573             statProhTmr = 1000;
574             break;
575          case T_StatusProhibit_ms1200:
576             statProhTmr = 1200;
577             break;
578          case T_StatusProhibit_ms1600:
579             statProhTmr = 1600;
580             break;
581          case T_StatusProhibit_ms2000:
582             statProhTmr = 2000;
583             break;
584          case T_StatusProhibit_ms2400:
585             statProhTmr = 2400;
586             break;
587          default:
588             DU_LOG("\nInvalid value of Status Prohibit timer %d", statProhTmrCfg);
589             statProhTmr = -1;
590             break;
591       }
592    }
593    return statProhTmr; 
594 }
595
596 /*******************************************************************
597  *
598  * @brief Builds Uplink Info for NR 
599  *
600  * @details
601  *
602  *    Function : BuildULNRInfo
603  *
604  *    Functionality: Building NR Uplink Info
605  *
606  * @params[in] NRFreqInfo_t *ulnrfreq
607  * @return ROK     - success
608  *         RFAILED - failure
609  *
610  * ****************************************************************/
611 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
612 {
613    uint8_t idx=0;
614    ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
615                        fdd.ulNrFreqInfo.nrArfcn;
616    ulnrfreq->freqBandListNr.list.count = 1;
617    ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
618    DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
619    if(ulnrfreq->freqBandListNr.list.array == NULLP)
620    {
621       return RFAILED;
622    }
623    for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
624    {
625       DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
626       if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
627       {
628          return RFAILED;
629       }
630    }
631    ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
632                                                                  duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
633                                                                  freqBand[0].nrFreqBand;
634    ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
635    return ROK;
636 }
637 /*******************************************************************
638  *
639  * @brief Builds Downlink NR Info 
640  *
641  * @details
642  *
643  *    Function : BuildDLNRInfo
644  *
645  *    Functionality: Building Downlink NR Info
646  *    
647  * @params[in] NRFreqInfo_t *dlnrfreq
648  * @return ROK     - success
649  *         RFAILED - failure
650  *
651  * ****************************************************************/
652 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
653 {
654    uint8_t idx=0;
655    dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
656                        fdd.dlNrFreqInfo.nrArfcn;
657    dlnrfreq->freqBandListNr.list.count = 1;
658    dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
659    DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
660    if(dlnrfreq->freqBandListNr.list.array == NULLP)
661    {
662       return RFAILED;   
663    }
664    for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
665    {
666       DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
667       if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
668       {
669          return RFAILED;
670       }
671    }   
672    dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
673                                                                  duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
674                                                                  freqBand[0].nrFreqBand;
675    dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
676
677    return ROK;
678 }
679
680 /*******************************************************************
681  *
682  * @brief Builds NRCell ID 
683  *
684  * @details
685  *
686  *    Function : BuildNrCellId
687  *
688  *    Functionality: Building the NR Cell ID
689  *
690  * @params[in] BIT_STRING_t *nrcell
691  * @return ROK     - success
692  *         RFAILED - failure
693  *
694  * ****************************************************************/
695
696 S16 BuildNrCellId(BIT_STRING_t *nrcell)
697 {
698    memset(nrcell->buf, 0, nrcell->size);
699    nrcell->buf[4]   = 16; 
700    nrcell->bits_unused = 4;
701    return ROK;
702 }
703
704 /*******************************************************************
705  *
706  * @brief Builds Nrcgi 
707  *
708  * @details
709  *
710  *    Function : BuildNrcgi
711  *
712  *    Functionality: Building the PLMN ID and NR Cell id
713  *
714  * @params[in] NRCGI_t *nrcgi
715  * @return ROK     - success
716  *         RFAILED - failure
717  *
718  * ****************************************************************/
719 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
720 {
721    uint8_t ret;
722    uint8_t byteSize = 5;
723    /* Allocate Buffer Memory */
724    nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
725    DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
726    if(nrcgi->pLMN_Identity.buf == NULLP)
727    {
728       return RFAILED;
729    }
730    ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
731          nrcgi->pLMN_Identity.buf); // Building PLMN function
732    if(ret != ROK)
733    {
734       return RFAILED;
735    }
736    /*nrCellIdentity*/
737    nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
738    DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size); 
739    if(nrcgi->nRCellIdentity.buf == NULLP)
740    {
741       return RFAILED;
742    }
743    BuildNrCellId(&nrcgi->nRCellIdentity);
744
745    return ROK;
746 }
747 /*******************************************************************
748  *
749  * @brief Builds FiveGStac 
750  *
751  * @details
752  *
753  *    Function : BuildFiveGSTac
754  *
755  *    Functionality: Building the FiveGSTac
756  *
757  * @params[in] OCTET_STRING_t *fivegsTac
758  * @return ROK     - success
759  *         RFAILED - failure
760  *
761  * ****************************************************************/
762 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
763 {
764    DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
765    if(servcell->fiveGS_TAC == NULLP)
766    {
767       return RFAILED;
768    }
769    servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
770    DU_ALLOC(servcell->fiveGS_TAC->buf,\
771          sizeof(servcell->fiveGS_TAC->size));
772    if(servcell->fiveGS_TAC->buf == NULLP)
773    {
774       return RFAILED;
775    }
776    servcell->fiveGS_TAC->buf[0] = 0;
777    servcell->fiveGS_TAC->buf[1] = 0;
778    servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
779    return ROK;  
780 }
781 /*******************************************************************
782  *
783  * @brief Builds NR Mode 
784  *
785  * @details
786  *
787  *    Function : BuildNrMode
788  *
789  *    Functionality: Building the NR Mode
790  *
791  * @params[in] NR_Mode_Info_t *fdd
792  * @return ROK     - success
793  *         RFAILED - failure
794  *
795  * ****************************************************************/
796 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
797 {
798    uint8_t BuildDLNRInforet=0;
799    uint8_t BuildULNRInforet=0; 
800    /* FDD Mode */
801    mode->present = NR_Mode_Info_PR_fDD;
802    if(mode->present == NR_Mode_Info_PR_fDD)
803    {
804       DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
805       if(mode->choice.fDD == NULLP)
806       {
807          return RFAILED;
808       }
809       BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
810       if(BuildULNRInforet != ROK)
811       {
812          return RFAILED;    
813       }
814       BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
815       if(BuildDLNRInforet != ROK)
816       {
817          return RFAILED;
818       }
819    }
820    mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
821                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
822                                                        f1Mode.mode.fdd.ulTxBw.nrScs;
823    mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
824                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
825                                                        f1Mode.mode.fdd.ulTxBw.nrb;
826    mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
827                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
828                                                        f1Mode.mode.fdd.dlTxBw.nrScs;
829    mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
830                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
831                                                        f1Mode.mode.fdd.dlTxBw.nrb;
832    return ROK;
833 }
834 /*******************************************************************
835  *
836  * @brief Builds IE Extensions for Served PLMNs 
837  *
838  * @details
839  *
840  *    Function : BuildExtensions
841  *
842  *    Functionality: Building the IE Extensions
843  *
844  * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
845  * @return ROK     - success
846  *         RFAILED - failure
847  *
848  * ****************************************************************/
849 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
850 {
851    uint8_t idx;
852    uint8_t plmnidx;
853    uint8_t extensionCnt=1;
854    uint8_t sliceId=0;
855    uint8_t sdId;
856    DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
857    if((*ieExtend) == NULLP)
858    {
859       return RFAILED;
860    }
861    (*ieExtend)->list.count = extensionCnt;
862    (*ieExtend)->list.size = \
863                             extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
864    DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
865    if((*ieExtend)->list.array == NULLP)
866    {
867       return RFAILED;
868    }
869    for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
870    {
871       DU_ALLOC((*ieExtend)->list.array[plmnidx],\
872             sizeof(ServedPLMNs_ItemExtIEs_t));
873       if((*ieExtend)->list.array[plmnidx] == NULLP)
874       {
875          return RFAILED;
876       }
877    }
878    idx = 0;
879    (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
880    (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
881    (*ieExtend)->list.array[idx]->extensionValue.present = \
882                                                           ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
883    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
884       list.count = 1;
885    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
886       list.size = sizeof(SliceSupportItem_t *);
887    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
888          list.array,sizeof(SliceSupportItem_t *));
889    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
890          list.array == NULLP)
891    {
892       return RFAILED;
893    }
894    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
895          list.array[sliceId],sizeof(SliceSupportItem_t));
896    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
897          list.array[sliceId] == NULLP) 
898    {
899       return RFAILED;
900    }
901    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
902       list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
903    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
904          .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
905          extensionValue.choice.SliceSupportList.\
906          list.array[sliceId]->sNSSAI.sST.size);
907    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
908          .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
909    {
910       return RFAILED;
911    }
912    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
913       list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
914    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
915          list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
916    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
917          list.array[sliceId]->sNSSAI.sD == NULLP)
918    {
919       return RFAILED;
920    }
921    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
922       list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
923    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
924          list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
925          SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
926    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
927          list.array[sliceId]->sNSSAI.sD->buf == NULLP)
928    {
929       return RFAILED;
930    }
931    sdId = 0;
932    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
933       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
934    sdId++;
935    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
936       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
937    sdId++;
938    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
939       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
940    return ROK;
941 }
942 /*******************************************************************
943  *
944  * @brief Builds Served PLMN 
945  *
946  * @details
947  *
948  *    Function : BuildServedPlmn
949  *
950  *    Functionality: Building the Served PLMN
951  *
952  * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
953  * @return ROK     - success
954  *         RFAILED - failure
955  *
956  * ****************************************************************/
957 uint8_t  BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
958 {  
959    uint8_t  plmnidx;
960    uint8_t  servPlmnCnt=1;
961    uint8_t buildPlmnIdret=0;
962    uint8_t BuildExtensionsret=0;
963    srvplmn->list.count = servPlmnCnt;
964    srvplmn->list.size = \
965                         servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
966    DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
967    if(srvplmn->list.array == NULLP)
968    {
969       return RFAILED;
970    }
971    for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
972    {   
973       DU_ALLOC(srvplmn->list.array[plmnidx],\
974             sizeof(ServedPLMNs_Item_t));
975       if(srvplmn->list.array[plmnidx] == NULLP)
976       {
977          return RFAILED;
978       }  
979    }
980    srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
981    DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
982    buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
983          srvplmn->list.array[0]->pLMN_Identity.buf);
984    if(buildPlmnIdret!= ROK)
985    {
986       return RFAILED;
987    }
988    BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
989    if(BuildExtensionsret!= ROK)
990    {
991       return RFAILED;
992    }
993    return ROK;
994 }
995 /*******************************************************************
996  *
997  * @brief Builds Served Cell List
998  *
999  * @details
1000  *
1001  *    Function : BuildServedCellList
1002  *
1003  *    Functionality: Building Served Cell List
1004  *
1005  * @params[in] PLMNID plmn
1006  * @return ROK     - success
1007  *         RFAILED - failure
1008  *
1009  * ****************************************************************/
1010
1011 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
1012 {
1013    uint8_t  BuildNrcgiret=0;
1014    uint8_t  BuildFiveGSTacret=0;
1015    uint8_t  BuildServedPlmnret=0;
1016    uint8_t  BuildNrModeret=0;
1017    uint8_t  idx;
1018    uint8_t  plmnidx;
1019    uint8_t  plmnCnt=1;
1020    GNB_DU_Served_Cells_Item_t *srvCellItem;
1021    duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
1022    duServedCell->list.count = plmnCnt;
1023
1024    DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
1025    if(duServedCell->list.array == NULLP)
1026    {
1027       return RFAILED;
1028    }
1029    for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
1030    {
1031       DU_ALLOC(duServedCell->list.array[plmnidx],\
1032             sizeof(GNB_DU_Served_Cells_ItemIEs_t));
1033       if(duServedCell->list.array[plmnidx] == NULLP)
1034       {
1035          return RFAILED;
1036       }
1037    }
1038    idx = 0;
1039    duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
1040    duServedCell->list.array[idx]->criticality = Criticality_reject;
1041    duServedCell->list.array[idx]->value.present = \
1042                                                   GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
1043    srvCellItem = \
1044                  &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
1045    /*nRCGI*/
1046    BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
1047    if(BuildNrcgiret != ROK)
1048    {
1049       return RFAILED;
1050    }
1051    /*nRPCI*/
1052    srvCellItem->served_Cell_Information.nRPCI = \
1053                                                 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1054
1055    /*fiveGS_TAC*/
1056    BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
1057    if(BuildFiveGSTacret != ROK)
1058    {
1059       return RFAILED;
1060    }
1061    /*Served PLMNs*/
1062    BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
1063    if(BuildServedPlmnret !=ROK)
1064    {
1065       return RFAILED;
1066    }
1067    /*nR Mode Info with FDD*/
1068    BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
1069    if(BuildNrModeret != ROK)
1070    {
1071       return RFAILED;
1072    }
1073    /*Measurement timing Config*/
1074    srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
1075       size = sizeof(uint8_t);
1076    DU_ALLOC(srvCellItem->served_Cell_Information.\
1077          measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
1078    if(srvCellItem->served_Cell_Information.\
1079          measurementTimingConfiguration.buf == NULLP)
1080    {
1081       return RFAILED;
1082    }
1083    srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
1084                                                                                 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1085
1086    /* GNB DU System Information */
1087    DU_ALLOC(srvCellItem->gNB_DU_System_Information,
1088          sizeof(GNB_DU_System_Information_t));
1089    if(!srvCellItem->gNB_DU_System_Information)
1090    {
1091       return RFAILED;
1092    }
1093    /* MIB */
1094    srvCellItem->gNB_DU_System_Information->mIB_message.size =\
1095                                                              strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
1096    DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
1097          srvCellItem->gNB_DU_System_Information->mIB_message.size);
1098    if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
1099    {
1100       return RFAILED;
1101    }
1102    strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
1103          (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
1104
1105    /* SIB1 */
1106    srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
1107                                                               duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
1108
1109    DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
1110          srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1111    if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
1112    {
1113       return RFAILED;
1114    }
1115    for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
1116    {
1117       srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
1118                                                                   duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
1119    }
1120    return ROK; 
1121 }                                                                                                                  
1122 /*******************************************************************
1123  *
1124  * @brief Builds RRC Version 
1125  *
1126  * @details
1127  *
1128  *    Function : BuildRrcVer
1129  *
1130  *    Functionality: Building RRC Version
1131  *
1132  * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
1133  * @return ROK     - success
1134  *         RFAILED - failure
1135  *
1136  * ****************************************************************/
1137 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
1138 {
1139    uint8_t rrcExt;
1140    uint8_t rrcLatest;
1141    rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
1142    DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
1143    if(rrcVer->latest_RRC_Version.buf == NULLP)
1144    {
1145       return RFAILED;
1146    }
1147    rrcVer->latest_RRC_Version.buf[0] = 0;
1148    rrcVer->latest_RRC_Version.bits_unused = 5;
1149    DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
1150    if(rrcVer->iE_Extensions == NULLP)
1151    {  
1152       return RFAILED;
1153    }
1154    rrcVer->iE_Extensions->list.count = 1;
1155    rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
1156    DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
1157    if(rrcVer->iE_Extensions->list.array == NULLP)
1158    {
1159       return RFAILED;
1160    }
1161    rrcExt = 0;
1162    DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
1163          sizeof(RRC_Version_ExtIEs_t));
1164    if(rrcVer->iE_Extensions->list.array[0] == NULLP)
1165    {
1166       return RFAILED;
1167    }
1168    rrcVer->iE_Extensions->list.array[rrcExt]->id = \
1169                                                    ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
1170    rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
1171    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
1172                                                                       RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
1173    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1174       .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
1175    DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1176          .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
1177          array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
1178    if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1179          .Latest_RRC_Version_Enhanced.buf == NULLP)
1180    {
1181       return RFAILED;
1182    }
1183    rrcLatest = 0;
1184    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1185       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
1186    rrcLatest++;
1187    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1188       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
1189    rrcLatest++;
1190    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1191       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
1192    return ROK;
1193 }
1194 /*******************************************************************
1195  *
1196  * @brief Sends F1 msg over SCTP
1197  *
1198  * @details
1199  *
1200  *    Function : SendF1APMsg
1201  *
1202  *    Functionality: Sends F1 msg over SCTP
1203  *
1204  * @params[in] Region region
1205  *             Pool pool
1206  * @return ROK     - success
1207  *         RFAILED - failure
1208  *
1209  * ****************************************************************/
1210 uint8_t SendF1APMsg(Region region, Pool pool)
1211 {
1212    Buffer *mBuf = NULLP;
1213   
1214    if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
1215    {
1216       if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
1217       {
1218             ODU_PRINT_MSG(mBuf, 0,0);
1219
1220             if(sctpSend(mBuf, F1_INTERFACE) != ROK)
1221             {
1222                DU_LOG("\nERROR  -->  F1AP : SCTP Send failed");
1223                ODU_PUT_MSG_BUF(mBuf);
1224                return RFAILED;
1225             }
1226       }
1227       else
1228       {
1229          DU_LOG("\nERROR  -->  F1AP : ODU_ADD_POST_MSG_MULT failed");
1230          ODU_PUT_MSG_BUF(mBuf);
1231          return RFAILED;
1232       }
1233       ODU_PUT_MSG_BUF(mBuf);
1234    }
1235    else
1236    {
1237       DU_LOG("\nERROR  -->  F1AP : Failed to allocate memory");
1238       return RFAILED;
1239    }
1240    return ROK; 
1241 } /* SendF1APMsg */
1242
1243 /*******************************************************************
1244  *
1245  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1246  *
1247  * @details
1248  *
1249  *    Function :  FreeRrcVer
1250  *
1251  *    Functionality: deallocating the memory of function BuildRrcVer
1252  *
1253  * @params[in] RRC_Version_t *rrcVer
1254  * 
1255  * @return void
1256  *
1257  *****************************************************************/
1258 void FreeRrcVer(RRC_Version_t *rrcVer)
1259 {
1260    if(rrcVer->latest_RRC_Version.buf != NULLP)
1261    {
1262       if(rrcVer->iE_Extensions != NULLP)
1263       {
1264          if(rrcVer->iE_Extensions->list.array != NULLP)
1265          {
1266             if(rrcVer->iE_Extensions->list.array[0] != NULLP)
1267             {
1268                if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
1269                      != NULLP)
1270                {
1271                   DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
1272                         .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
1273                         array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
1274                }
1275                DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
1276             }
1277             DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
1278          }
1279          DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
1280       }
1281       DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
1282    }
1283 }
1284 /*******************************************************************
1285  *
1286  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1287  *
1288  * @details
1289  *
1290  *    Function :  FreeServedCellList
1291  *
1292  *    Functionality:  deallocating the memory of function BuildServedCellList
1293
1294  *
1295  * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
1296  *
1297  * @return void
1298  *
1299  * ****************************************************************/
1300 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
1301 {
1302    uint8_t   plmnCnt=1;
1303    uint8_t  servId=0;
1304    uint8_t sliceId=0;
1305    uint8_t  ieId=0;
1306    uint8_t   extensionCnt=1;
1307    uint8_t plmnidx=0;
1308    GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
1309    if(duServedCell->list.array!=NULLP)
1310    {
1311       if(duServedCell->list.array[0]!=NULLP)
1312       {
1313          if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
1314          {
1315             if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
1316             {
1317                if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
1318                {
1319                   if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
1320                   {
1321                      if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
1322                      {
1323                         if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
1324                         {
1325                            if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
1326                            {
1327                               if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
1328                               {
1329                                  if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
1330                                  {
1331                                     if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
1332                                     {
1333                                        if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1334                                              extensionValue.choice.SliceSupportList.list.array!=NULLP)
1335                                        {
1336                                           if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1337                                                 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
1338                                           {
1339                                              if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1340                                                    extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
1341                                              {
1342                                                 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1343                                                       extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
1344                                                 {
1345                                                    if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
1346                                                          list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
1347                                                    {
1348                                                       if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
1349                                                       {
1350                                                          if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1351                                                                freqBandListNr.list.array!=NULLP)
1352                                                          {
1353                                                             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1354                                                                   freqBandListNr.list.array[0]!=NULLP)
1355                                                             {
1356                                                                if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1357                                                                      freqBandListNr.list.array)
1358                                                                {
1359                                                                   if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1360                                                                         freqBandListNr.list.array[0]!=NULLP)
1361                                                                   {
1362                                                                      if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
1363                                                                      {
1364                                                                         if(!srvCellItem->gNB_DU_System_Information)
1365                                                                         {
1366                                                                            if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
1367                                                                            {
1368                                                                               if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
1369                                                                               { 
1370                                                                                  DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
1371                                                                                        srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1372                                                                                  DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
1373                                                                                        srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1374                                                                               }
1375                                                                               DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
1376                                                                                     srvCellItem->gNB_DU_System_Information->mIB_message.size);
1377                                                                               DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
1378                                                                                     strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
1379                                                                            }
1380                                                                            DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
1381                                                                         }
1382                                                                         DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
1383                                                                               srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
1384                                                                      }
1385                                                                      DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1386                                                                            freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1387                                                                   }
1388                                                                   DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1389                                                                         freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
1390                                                                }
1391                                                                DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
1392                                                                      list.array[0],sizeof(FreqBandNrItem_t));
1393                                                             }
1394                                                             DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
1395                                                                   list.array,sizeof(FreqBandNrItem_t*));
1396                                                          }
1397                                                          DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
1398                                                       }
1399                                                       DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
1400                                                             iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
1401                                                             sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
1402                                                             list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
1403                                                    }
1404                                                    DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
1405                                                          iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
1406                                                          list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1407                                                 }
1408                                                 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
1409                                                       iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
1410                                                       sNSSAI.sST.buf,sizeof(uint8_t));
1411                                              }
1412                                              DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1413                                                    extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
1414                                           }
1415                                           DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1416                                                 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
1417                                        }
1418                                        DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1419                                              array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
1420                                     }
1421                                     DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1422                                           array[servId]->iE_Extensions->list.array,\
1423                                           extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
1424                                  }
1425                                  DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1426                                        array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1427                               }
1428                               DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1429                                     array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
1430                                     servedPLMNs.list.array[servId]->pLMN_Identity.size
1431                                     * sizeof(uint8_t));
1432                            }
1433                            DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
1434                                  sizeof(ServedPLMNs_Item_t *));
1435                         }
1436                         DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
1437                               sizeof(ServedPLMNs_Item_t *));
1438                      }
1439                      DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
1440                            sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
1441                   }
1442                   DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
1443                }
1444                DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1445                      srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
1446                      sizeof(uint8_t));
1447             }
1448             DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1449                   srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
1450                   sizeof(uint8_t));
1451          }
1452          DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
1453       }
1454       DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
1455    }
1456 }
1457 /*******************************************************************
1458  *
1459  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1460  *
1461  * @details
1462  *
1463  *    Function :  FreeF1SetupReq
1464  *
1465  *    Functionality:  deallocating the memory of function BuildAndSendF1SetupReq
1466  *
1467  * @params[in] F1AP_PDU_t *f1apMsg
1468  *
1469  * @return void
1470  *
1471  * ****************************************************************/
1472 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
1473 {
1474    uint8_t ieIdx, ieIdx2;
1475    F1SetupRequest_t *f1SetupReq=NULLP;
1476
1477    if(f1apMsg != NULLP)
1478    {
1479       if(f1apMsg->choice.initiatingMessage != NULLP)
1480       {
1481          f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1482          if(f1SetupReq->protocolIEs.list.array != NULLP)
1483          {
1484             for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
1485             {
1486                if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP)
1487                {
1488                   switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
1489                   {
1490                      case ProtocolIE_ID_id_TransactionID:
1491                         break;
1492                      case ProtocolIE_ID_id_gNB_DU_ID:
1493                         DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1494                               f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1495                         break;
1496                      case ProtocolIE_ID_id_gNB_DU_Name:
1497                         DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\
1498                               strlen((char *)duCfgParam.duName));
1499                         break;
1500                      case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
1501                         FreeServedCellList(&f1SetupReq->protocolIEs.list.\
1502                               array[ieIdx]->value.choice.GNB_DU_Served_Cells_List);
1503                         break;
1504                      case ProtocolIE_ID_id_GNB_DU_RRC_Version:
1505                         FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version);
1506                         break;
1507                      default:
1508                         DU_LOG("\nERROR  -->  Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id);
1509                         break;
1510                   }
1511                }
1512                break;
1513             }
1514             for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++)
1515             {
1516                DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t));
1517             }
1518             DU_FREE(f1SetupReq->protocolIEs.list.array,\
1519                   f1SetupReq->protocolIEs.list.size);
1520          }
1521          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1522       }
1523       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1524    }
1525 }
1526 /*******************************************************************
1527  *
1528  * @brief Builds and Send the F1SetupRequest
1529  *
1530  * @details
1531  *
1532  *    Function : BuildAndSendF1SetupReq
1533  *
1534  * Functionality:Fills the F1SetupRequest
1535  *
1536  * @return ROK     - success
1537  *         RFAILED - failure
1538  *
1539  ******************************************************************/
1540 uint8_t BuildAndSendF1SetupReq()
1541 {
1542    uint8_t   ret, ieIdx, elementCnt;
1543    F1AP_PDU_t                 *f1apMsg = NULLP;
1544    F1SetupRequest_t           *f1SetupReq=NULLP;
1545    GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1546    RRC_Version_t              *rrcVer=NULLP;
1547    asn_enc_rval_t             encRetVal;        /* Encoder return value */
1548    ret= RFAILED;
1549
1550    DU_LOG("\nINFO   -->  F1AP : Building F1 Setup Request\n");
1551    do
1552    {
1553       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1554       if(f1apMsg == NULLP)
1555       {
1556          break;
1557       }
1558       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1559       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1560       if(f1apMsg->choice.initiatingMessage == NULLP)
1561       {
1562          break;
1563       }
1564       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1565       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1566       f1apMsg->choice.initiatingMessage->value.present = \
1567                                                          InitiatingMessage__value_PR_F1SetupRequest;
1568
1569       f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1570
1571       elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1572
1573       f1SetupReq->protocolIEs.list.count = elementCnt;
1574       f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1575
1576       /* Initialize the F1Setup members */
1577       DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1578       if(f1SetupReq->protocolIEs.list.array == NULLP)
1579       {
1580          break;
1581       }
1582       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
1583       {
1584          DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\
1585                sizeof(F1SetupRequestIEs_t));
1586          if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP)
1587          {
1588             break;
1589          }
1590       }
1591
1592       ieIdx = 0;
1593       /*TransactionID*/
1594       f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID;
1595       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1596       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\
1597                                                                F1SetupRequestIEs__value_PR_TransactionID;
1598       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \
1599                                                                              TRANS_ID;
1600
1601       /*DU ID*/
1602       ieIdx++;
1603       f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
1604       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1605       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1606                                                                 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1607       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\
1608                                                                              sizeof(uint8_t);
1609
1610       DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1611             f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1612       if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \
1613             NULLP)
1614       {
1615          break;
1616       }
1617
1618       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\
1619          duCfgParam.duId;
1620
1621       /*DU Name*/
1622       if(duCfgParam.duName != NULL)
1623       {
1624          ieIdx++;
1625          f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name;
1626          f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
1627          f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1628          f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\
1629             strlen((char *)duCfgParam.duName);
1630          DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\
1631                GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1632          if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\
1633                buf == NULLP)
1634          {
1635             break;
1636          }
1637          strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\
1638                choice.GNB_DU_Name.buf,
1639                (char*)&duCfgParam.duName);
1640
1641       }
1642
1643       /*Served Cell list */
1644       ieIdx++;
1645       f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1646                                                      ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1647       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1648       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1649                                                                 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1650       duServedCell = &f1SetupReq->protocolIEs.list.\
1651                      array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
1652       if(BuildServedCellList(duServedCell))
1653       {
1654          break;
1655       }
1656       /*RRC Version*/
1657       ieIdx++;
1658       f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1659                                                      ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1660       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1661       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1662                                                                 F1SetupRequestIEs__value_PR_RRC_Version;
1663       rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
1664       if(BuildRrcVer(rrcVer))
1665       {
1666          break;
1667       }
1668       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1669
1670       /* Encode the F1SetupRequest type as APER */
1671       memset(encBuf, 0, ENC_BUF_MAX_LEN);
1672       encBufSize = 0;
1673       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1674             encBuf);
1675
1676       /* Encode results */
1677       if(encRetVal.encoded == ENCODE_FAIL)
1678       {
1679          DU_LOG("\nERROR  -->  F1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1680                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1681          break;
1682       }
1683       else
1684       {
1685          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1SetupRequest\n");
1686          for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
1687          {
1688             printf("%x",encBuf[ieIdx]);
1689          }
1690       }
1691
1692       /* Sending msg */
1693       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1694       {
1695          DU_LOG("\nERROR  -->  F1AP : Sending F1 Setup request failed");
1696          break;
1697       }
1698
1699       ret=ROK;
1700       break;
1701    }while(true);
1702
1703    FreeF1SetupReq(f1apMsg);
1704
1705    return ret;
1706 }/* End of BuildAndSendF1SetupReq */
1707
1708 /*******************************************************************
1709  *
1710  * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1711  *
1712  * @details
1713  *
1714  *    Function : FreeDUConfigUpdate
1715  *
1716  *    Functionality: Deallocating memory of variables allocated in
1717  *                    BuildAndSendDUConfigUpdate function
1718  *
1719  * @params[in]  F1AP_PDU_t *f1apDuCfg
1720  *
1721  * @return ROK     - void
1722  *
1723  * ****************************************************************/
1724 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1725 {
1726    uint8_t  i;
1727    uint8_t  idx;
1728    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
1729    Served_Cells_To_Modify_List_t  *cellsToModify;
1730    Served_Cells_To_Modify_Item_t *modifyItem;
1731    idx=0;
1732    i=1;
1733    if(f1apDuCfg != NULLP)
1734    {
1735       if(f1apDuCfg->choice.initiatingMessage != NULLP)
1736       {
1737          duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1738                        value.choice.GNBDUConfigurationUpdate;
1739          if(duCfgUpdate->protocolIEs.list.array != NULLP)
1740          {
1741             if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
1742             {
1743                cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
1744                                value.choice.Served_Cells_To_Modify_List;
1745                if(cellsToModify->list.array != NULLP)
1746                {
1747                   if(cellsToModify->list.array[idx] != NULLP)
1748                   {
1749                      modifyItem=&cellsToModify->list.array[idx]->value.choice.\
1750                                 Served_Cells_To_Modify_Item;
1751                      if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1752                      {
1753                         if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1754                         {
1755                            if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1756                            {
1757                               if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1758                                     != NULLP)
1759                               { 
1760                                  if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1761                                        != NULLP)
1762                                  {
1763                                     if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
1764                                     {
1765                                        if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1766                                              array[idx]->pLMN_Identity.buf != NULLP)
1767                                        {
1768                                           if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1769                                                 array[idx]->iE_Extensions!= NULLP)
1770                                           {
1771                                              if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1772                                                    array[idx]->iE_Extensions->list.array != NULLP)
1773                                              {
1774                                                 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1775                                                       array[idx]->iE_Extensions->list.array[idx])
1776                                                 {
1777                                                    if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1778                                                          iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1779                                                          list.array !=NULLP)
1780                                                    {
1781                                                       if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1782                                                             iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1783                                                             list.array[idx]!=NULLP)
1784                                                       {   
1785                                                          if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1786                                                                iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1787                                                                list.array[idx]->sNSSAI.sST.buf!=NULLP)
1788                                                          {
1789                                                             if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1790                                                                   iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1791                                                                   list.array[idx]->sNSSAI.sD != NULLP)
1792                                                             { 
1793                                                                if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1794                                                                      iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1795                                                                      list.array[idx]->sNSSAI.sD->buf!=NULLP)
1796                                                                {
1797                                                                   if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1798                                                                         !=NULLP)
1799                                                                   {
1800                                                                      if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1801                                                                            fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1802                                                                      {
1803                                                                         if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1804                                                                               fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
1805                                                                         {
1806                                                                            if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1807                                                                                  fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1808                                                                            {
1809                                                                               if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1810                                                                                     choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1811                                                                                     array[idx]!= NULLP)
1812                                                                               {
1813                                                                                  if(modifyItem->served_Cell_Information.\
1814                                                                                        measurementTimingConfiguration.buf !=NULLP)
1815                                                                                  {
1816                                                                                     idx=2;
1817                                                                                     if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
1818                                                                                           choice.GNB_DU_ID.buf!=NULLP)
1819                                                                                     {
1820                                                                                        DU_FREE(duCfgUpdate->protocolIEs.list.\
1821                                                                                              array[idx]->value.choice.GNB_DU_ID.buf,\
1822                                                                                              duCfgUpdate->protocolIEs.list.array[idx]->\
1823                                                                                              value.choice.GNB_DU_ID.size);
1824                                                                                     }
1825                                                                                     idx=0;
1826                                                                                     DU_FREE(modifyItem->served_Cell_Information.\
1827                                                                                           measurementTimingConfiguration.\
1828                                                                                           buf,modifyItem->served_Cell_Information.\
1829                                                                                           measurementTimingConfiguration.size);
1830                                                                                  }
1831                                                                                  DU_FREE(modifyItem->served_Cell_Information.\
1832                                                                                        nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1833                                                                                        list.array[idx],sizeof(FreqBandNrItem_t));
1834                                                                               }
1835                                                                               DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1836                                                                                     .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1837                                                                                     modifyItem->served_Cell_Information.nR_Mode_Info.\
1838                                                                                     choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1839                                                                            }
1840                                                                            DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1841                                                                                  choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1842                                                                                  array[idx],sizeof(FreqBandNrItem_t));
1843                                                                         }
1844                                                                         DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1845                                                                               choice.\
1846                                                                               fDD->uL_NRFreqInfo.freqBandListNr.list.\
1847                                                                               array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1848                                                                               fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1849                                                                      }
1850                                                                      DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1851                                                                            fDD,sizeof(FDD_Info_t));
1852                                                                   }
1853                                                                   DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1854                                                                         array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1855                                                                         SliceSupportList.\
1856                                                                         list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1857                                                                         servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
1858                                                                         extensionValue.choice.SliceSupportList.list.array[idx]->\
1859                                                                         sNSSAI.sD->size);
1860
1861                                                                }
1862                                                                DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1863                                                                      array[idx]->\
1864                                                                      iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1865                                                                      list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1866                                                             }
1867                                                             DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1868                                                                   iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1869                                                                   list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
1870                                                                   servedPLMNs.\
1871                                                                   list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1872                                                                   SliceSupportList.list.array[idx]->sNSSAI.sST.size);
1873                                                          }
1874                                                          DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1875                                                                iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1876                                                                list.array[idx],sizeof(SliceSupportItem_t));
1877                                                       }
1878                                                       DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1879                                                             iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1880                                                             list.array,\
1881                                                             modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1882                                                             iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
1883                                                    }
1884                                                 }
1885                                                 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
1886                                                       array[idx]->iE_Extensions->list.count;i++)
1887                                                 {
1888                                                    DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1889                                                          array[idx]->iE_Extensions->list.array[i],\
1890                                                          sizeof(ServedPLMNs_ItemExtIEs_t ));
1891                                                 }
1892                                                 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1893                                                       array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1894                                                       list.array[idx]->iE_Extensions->list.size);
1895                                              }
1896                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1897                                                    array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1898                                           }
1899                                           DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1900                                                 array[idx]->pLMN_Identity.buf,
1901                                                 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
1902                                        }
1903                                     }
1904                                     for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1905                                     {
1906                                        if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
1907                                              != NULLP)
1908                                        {
1909                                           DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1910                                                 sizeof(ServedPLMNs_Item_t));
1911                                        }
1912                                     }
1913                                     DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1914                                           modifyItem->served_Cell_Information.servedPLMNs.list.size);
1915                                  }
1916                                  DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1917                                        modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);          
1918                               }
1919                               DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1920                                     modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1921                            }
1922                            DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1923                                  modifyItem->oldNRCGI.nRCellIdentity.size);
1924                         }
1925                         DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1926                               modifyItem->oldNRCGI.pLMN_Identity.size);
1927                      }
1928                   }
1929                   for(i=0; i<cellsToModify->list.count ;i++)
1930                   {
1931                      if(cellsToModify->list.array[i] != NULLP)
1932                      {
1933                         DU_FREE(cellsToModify->list.array[i],\
1934                               sizeof(Served_Cells_To_Modify_ItemIEs_t));
1935                      } 
1936                   }
1937                   DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1938                }
1939             }
1940             for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
1941             {
1942                if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
1943                {
1944                   DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1945                         sizeof(GNBDUConfigurationUpdateIEs_t));
1946                }
1947             }
1948             DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1949          }
1950          DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1951       }
1952       DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1953    }
1954 }
1955
1956 /*******************************************************************
1957  *
1958  * @brief Fills Served Plmns required in ServCellInfo IE
1959  *
1960  * @details
1961  *
1962  *    Function : fillServedPlmns
1963  *
1964  *    Functionality: Fills Served Plmns required in ServCellInfo IE
1965  *
1966  * @params[in] Pointer to ServedPLMNs_List_t *
1967  *
1968  * @return ROK     - success
1969  *         RFAILED - failure
1970  *
1971  *****************************************************************/
1972
1973 uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
1974 {
1975    uint8_t ieIdx, ieListCnt;
1976
1977    servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1978    DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\
1979          array[0]->pLMN_Identity.size);
1980    if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP)
1981    {
1982       return RFAILED;
1983    }
1984    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1985          servedPlmn->list.array[0]->pLMN_Identity.buf);
1986    DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1987    if(servedPlmn->list.array[0]->iE_Extensions == NULLP)
1988    {
1989       return RFAILED;
1990    }
1991
1992    ieListCnt=1;
1993    servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt;
1994    servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1995    DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\
1996          iE_Extensions->list.size);
1997    if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP)
1998    {
1999       return RFAILED;
2000    }
2001    for(ieIdx=0;ieIdx<ieListCnt;ieIdx++)
2002    {
2003       DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx],\
2004             sizeof(ServedPLMNs_ItemExtIEs_t));
2005       if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP)
2006       {
2007          return RFAILED;
2008       }
2009    }
2010    //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions; 
2011    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
2012    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore;
2013    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \
2014       ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
2015    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2016       list.count = 1;
2017    servedPlmn->list.array[0]->\
2018       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2019       list.size = sizeof(SliceSupportItem_t *);
2020    DU_ALLOC(servedPlmn->list.array[0]->\
2021          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2022          list.array,servedPlmn->list.array[0]->\
2023          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
2024    if(servedPlmn->list.array[0]->\
2025          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2026          list.array == NULLP)
2027    {
2028       return RFAILED;
2029    }
2030
2031    DU_ALLOC(servedPlmn->list.array[0]->\
2032          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2033          list.array[0],sizeof( SliceSupportItem_t));
2034    if(servedPlmn->list.array[0]->\
2035          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2036          list.array[0] == NULLP)
2037    {
2038       return RFAILED;
2039    }
2040    servedPlmn->list.array[0]->\
2041       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2042       list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
2043    DU_ALLOC(servedPlmn->list.array[0]->\
2044          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2045          list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\
2046          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
2047    if(servedPlmn->list.array[0]->\
2048          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2049          list.array[0]->sNSSAI.sST.buf == NULLP)
2050    {
2051       return RFAILED;
2052    }
2053    servedPlmn->list.array[0]->\
2054       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2055       list.array[0]->sNSSAI.sST.buf[0] = 3;
2056    DU_ALLOC(servedPlmn->list.array[0]->\
2057          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2058          list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
2059    if(servedPlmn->list.array[0]->\
2060          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2061          list.array[0]->sNSSAI.sD == NULLP)
2062    {
2063       return RFAILED;
2064    }
2065    servedPlmn->list.array[0]->\
2066       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2067       list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
2068    DU_ALLOC(servedPlmn->list.array[0]->\
2069          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2070          list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\
2071          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2072          list.array[0]->sNSSAI.sD->size);
2073    if(servedPlmn->list.array[0]->\
2074          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2075          list.array[0]->sNSSAI.sD->buf == NULLP)
2076    {
2077       return RFAILED;
2078    }
2079    servedPlmn->list.array[0]->\
2080       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2081       list.array[0]->sNSSAI.sD->buf[0] = 3;
2082    servedPlmn->list.array[0]->\
2083       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2084       list.array[0]->sNSSAI.sD->buf[1] = 6;
2085    servedPlmn->list.array[0]->\
2086       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2087       list.array[0]->sNSSAI.sD->buf[2] = 9;
2088    return ROK;
2089 }
2090
2091 /*******************************************************************
2092  *
2093  * @brief Fills Nr Fdd Info required in ServCellInfo IE
2094  *
2095  * @details
2096  *
2097  *    Function : fillNrFddInfo
2098  *
2099  *    Functionality: Fills Nr Fdd Info required in ServCellInfo IE
2100  *
2101  * @params[in] Pointer to NR_Mode_Info_t *
2102  *
2103  * @return ROK     - success
2104  *         RFAILED - failure
2105  *
2106  *****************************************************************/
2107
2108 uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd)
2109 {
2110    nrFdd->choice.fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
2111       f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
2112    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1;
2113    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
2114    DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
2115          array, nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
2116    if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
2117    {
2118       return RFAILED;
2119    }
2120    DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \
2121       sizeof(FreqBandNrItem_t));
2122    if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
2123    {
2124       return RFAILED;
2125    }
2126    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
2127       duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
2128       freqBand[0].nrFreqBand;
2129    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
2130    nrFdd->choice.fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
2131       dlNrFreqInfo.nrArfcn;
2132    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1;
2133    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
2134    DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,nrFdd->\
2135          choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
2136    if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
2137    {
2138       return RFAILED;
2139    }
2140    DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0],\
2141          sizeof(FreqBandNrItem_t));
2142    if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
2143    {
2144       return RFAILED;
2145    }
2146    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
2147       duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
2148       freqBand[0].nrFreqBand;
2149    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
2150    
2151    /*Transmission Bandwidth*/
2152    nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
2153       f1Mode.mode.fdd.ulTxBw.nrScs;
2154    nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
2155       f1Mode.mode.fdd.ulTxBw.nrb;
2156    nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
2157       f1Mode.mode.fdd.dlTxBw.nrScs;
2158    nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
2159       f1Mode.mode.fdd.dlTxBw.nrb;
2160
2161    return ROK;
2162 }
2163
2164 /*******************************************************************
2165  *
2166  * @brief Fills ServCellInfo IE
2167  *
2168  * @details
2169  *
2170  *    Function : fillServedCellInfo
2171  *
2172  *    Functionality: Fills ServCellInfo
2173  *
2174  * @params[in] Pointer to Served_Cell_Information_t *
2175  *
2176  * @return ROK     - success
2177  *         RFAILED - failure
2178  *
2179  *****************************************************************/
2180
2181 uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo)
2182 {
2183    uint8_t tmp, ieIdx, ieListCnt;
2184
2185    /*nRCGI*/
2186    srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
2187    DU_ALLOC(srvCellInfo->nRCGI.pLMN_Identity.buf,\
2188          srvCellInfo->nRCGI.pLMN_Identity.size);
2189    if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP)
2190    {
2191       return RFAILED;
2192    }
2193    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2194          srvCellInfo->nRCGI.pLMN_Identity.buf);
2195    srvCellInfo->nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
2196    DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\
2197          srvCellInfo->nRCGI.nRCellIdentity.size);
2198    if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP)
2199    {
2200       return RFAILED;
2201    }
2202    for (tmp = 0 ; tmp < srvCellInfo->\
2203          nRCGI.nRCellIdentity.size-1 ; tmp++)
2204    {
2205       srvCellInfo->nRCGI.nRCellIdentity.buf[tmp] = 0;
2206    }
2207    srvCellInfo->nRCGI.nRCellIdentity.buf[4] = 16;
2208    srvCellInfo->nRCGI.nRCellIdentity.bits_unused =4;
2209
2210    /*nRPCI*/
2211    srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
2212
2213    /*servedPLMNs*/
2214    ieListCnt = 1;
2215    srvCellInfo->servedPLMNs.list.count = ieListCnt;
2216    srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *);
2217    DU_ALLOC(srvCellInfo->servedPLMNs.list.array,\
2218          srvCellInfo->servedPLMNs.list.size);
2219    if(srvCellInfo->servedPLMNs.list.array == NULLP)
2220    {
2221       return RFAILED;
2222    }
2223    for(ieIdx=0; ieIdx < ieListCnt; ieIdx++)
2224    {
2225       DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx],\
2226             sizeof(ServedPLMNs_Item_t));
2227       if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP)
2228       {
2229          return RFAILED;
2230       }
2231    }
2232    if(fillServedPlmns(&srvCellInfo->servedPLMNs))
2233    {
2234       return RFAILED;
2235    }
2236
2237    /*nR Mode Info with FDD*/
2238    srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD;
2239    DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD,\
2240          sizeof(FDD_Info_t));
2241    if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP)
2242    {
2243       return RFAILED;
2244    }
2245    if(fillNrFddInfo(&srvCellInfo->nR_Mode_Info))
2246       return RFAILED;
2247
2248    /*Measurement timing Config*/
2249    srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t);
2250    DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\
2251          buf,srvCellInfo->measurementTimingConfiguration.size);
2252    if(srvCellInfo->measurementTimingConfiguration.buf == NULLP)
2253    {
2254       return RFAILED;
2255    }
2256    srvCellInfo->measurementTimingConfiguration.\
2257          buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
2258
2259    return ROK;
2260 }
2261
2262 /*******************************************************************
2263  *
2264  * @brief Fills ServCellToModItem IE
2265  *
2266  * @details
2267  *
2268  *    Function : fillServCellToModItem
2269  *
2270  *    Functionality: Fills ServCellToModItem IE
2271  *
2272  * @params[in] Pointer to Served_Cells_To_Modify_Item_t *
2273  *
2274  * @return ROK     - success
2275  *         RFAILED - failure
2276  *
2277  *****************************************************************/
2278
2279 uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem)
2280 {
2281    uint8_t ieIdx;
2282
2283    /*pLMN_Identity*/
2284    modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
2285    DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
2286    if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
2287    {
2288       return RFAILED;
2289    }
2290    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2291          modifyItem->oldNRCGI.pLMN_Identity.buf);
2292
2293    /*nRCellIdentity*/
2294    modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
2295    DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
2296          modifyItem->oldNRCGI.nRCellIdentity.size);
2297    if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
2298    {
2299       return RFAILED;
2300    }
2301    for(ieIdx = 0; ieIdx < modifyItem->oldNRCGI.nRCellIdentity.size-1; ieIdx++)
2302    {
2303       modifyItem->oldNRCGI.nRCellIdentity.buf[ieIdx] = 0;
2304    }
2305    modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
2306    modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
2307
2308    if(fillServedCellInfo(&modifyItem->served_Cell_Information))
2309       return RFAILED;
2310    else
2311       return ROK;
2312 }
2313
2314 /*******************************************************************
2315  *
2316  * @brief Builds ServCellToModList
2317  *
2318  * @details
2319  *
2320  *    Function : buildServCellToModList
2321  *
2322  *    Functionality: Builds the serv cell to Mod List
2323  *
2324  * @params[in] Pointer to Served_Cells_To_Modify_List_t *
2325  *
2326  * @return ROK     - success
2327  *         RFAILED - failure
2328  *
2329  *****************************************************************/
2330
2331 uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify)
2332 {
2333    uint8_t ieListCnt, ieIdx;
2334    Served_Cells_To_Modify_Item_t *modifyItem = NULLP;
2335
2336    ieListCnt = 1;
2337    cellsToModify->list.count = ieListCnt;
2338    cellsToModify->list.size = ieListCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
2339    DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
2340    if(cellsToModify->list.array == NULLP)
2341    {
2342       return RFAILED;
2343    }
2344    for(ieIdx=0; ieIdx< ieListCnt; ieIdx++)
2345    {
2346       DU_ALLOC(cellsToModify->list.array[ieIdx],sizeof(Served_Cells_To_Modify_ItemIEs_t));
2347       if(cellsToModify->list.array[ieIdx] == NULLP)
2348       {
2349          return RFAILED;
2350       }
2351    }
2352    cellsToModify->list.array[0]->id = ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
2353    cellsToModify->list.array[0]->criticality = Criticality_reject;
2354    cellsToModify->list.array[0]->value.present =\
2355       Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
2356    modifyItem=&cellsToModify->list.array[0]->value.choice.Served_Cells_To_Modify_Item;
2357
2358    if(fillServCellToModItem(modifyItem))
2359       return RFAILED;
2360    else
2361       return ROK;
2362 }
2363
2364 /*******************************************************************
2365  *
2366  * @brief Builds and sends the DUConfigUpdate
2367  *
2368  * @details
2369  *
2370  *    Function : BuildAndSendDUConfigUpdate
2371  *
2372  *    Functionality: Constructs the DU Update message and sends
2373  *                   it to the CU through SCTP.
2374  *
2375  * @params[in] void **buf,Buffer to which encoded pattern is written into
2376  * @params[in] int *size,size of buffer
2377  *
2378  * @return ROK     - success
2379  *         RFAILED - failure
2380  *
2381  * ****************************************************************/
2382 uint8_t BuildAndSendDUConfigUpdate()
2383 {
2384    uint8_t ret, ieIdx, elementCnt;
2385    F1AP_PDU_t                 *f1apDuCfg = NULLP;
2386    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
2387    asn_enc_rval_t encRetVal;     /* Encoder return value */
2388    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2389    ret= RFAILED;
2390
2391    while(true)
2392    {
2393       DU_LOG("\nINFO   -->  F1AP : Building DU config update\n");
2394       /* Allocate the memory for F1DuCfg */
2395       DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
2396       if(f1apDuCfg == NULLP)
2397       {
2398          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
2399          break;
2400       }
2401
2402       f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
2403       DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2404       if(f1apDuCfg->choice.initiatingMessage == NULLP)
2405       {
2406          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
2407          break;
2408       }
2409
2410       f1apDuCfg->choice.initiatingMessage->procedureCode = \
2411                                                            ProcedureCode_id_gNBDUConfigurationUpdate;
2412       f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
2413       f1apDuCfg->choice.initiatingMessage->value.present = \
2414                                                            InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
2415       duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
2416                     choice.GNBDUConfigurationUpdate;
2417       elementCnt = 3;
2418       duCfgUpdate->protocolIEs.list.count = elementCnt;
2419       duCfgUpdate->protocolIEs.list.size = \
2420                                            elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
2421
2422       /* Initialize the F1Setup members */
2423       DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
2424       if(duCfgUpdate->protocolIEs.list.array == NULLP)
2425       {
2426          DU_LOG("ERROR  -->  F1AP : Memory allocation for F1RequestIEs failed");
2427          break;
2428       }
2429       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
2430       {
2431          DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t));
2432          if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP)
2433          {
2434             break;
2435          }
2436       }
2437
2438       /*TransactionID*/
2439       ieIdx = 0;
2440       duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID;
2441       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
2442       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2443          GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
2444       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID;
2445
2446       /*Served Cell to Modify */
2447       ieIdx++;
2448       duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
2449                                                       ProtocolIE_ID_id_Served_Cells_To_Modify_List;
2450       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
2451       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2452          GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
2453       if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
2454          Served_Cells_To_Modify_List))
2455          break;
2456
2457       // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
2458       /*GNB DU ID */
2459       ieIdx++;
2460       duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
2461       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
2462       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2463         GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
2464       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t);
2465       DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
2466             duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
2467       if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP)
2468       {
2469          break;
2470       }
2471       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId;
2472
2473       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
2474
2475       /* Encode the DU Config Update type as APER */
2476       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2477       encBufSize = 0;
2478       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
2479
2480       /* Checking encode results */
2481       if(encRetVal.encoded == ENCODE_FAIL)
2482       {
2483          DU_LOG("ERROR  -->  F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\
2484          encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2485          break;
2486       }
2487       else
2488       {
2489          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for DUConfigUpdate\n");
2490          for(ieIdx =0; ieIdx < encBufSize; ieIdx++)
2491          {
2492             printf("%x",encBuf[ieIdx]);
2493          }
2494       }
2495       /* Sending msg */
2496       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
2497       {
2498          DU_LOG("\nERROR  -->  F1AP : Sending GNB-DU Config Update failed");
2499          break;
2500       }
2501
2502       ret = ROK;
2503       break;
2504    }
2505    FreeDUConfigUpdate(f1apDuCfg);
2506
2507    return ret;
2508 }
2509
2510
2511 /*******************************************************************
2512  *
2513  * @brief free the ULRRCMessageTransfer
2514  *
2515  * @details
2516  *
2517  *    Function : FreeULRRCMessageTransfer
2518  *
2519  *    Functionality: Deallocating the memory of variable allocated in
2520  *                      FreeULRRCMessageTransfer
2521  *
2522  * @params[in]
2523  *
2524  * @return ROK     - void
2525  *
2526  ******************************************************************/
2527 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
2528 {
2529    uint8_t idx1;
2530    ULRRCMessageTransfer_t  *ulRRCMsg;
2531
2532    if(f1apMsg != NULLP)
2533    { 
2534       if(f1apMsg->choice.initiatingMessage != NULLP)
2535       {
2536          ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2537          if(ulRRCMsg->protocolIEs.list.array != NULLP)
2538          {
2539             for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
2540             {
2541                if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
2542                {
2543                   if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
2544                         ULRRCMessageTransferIEs__value_PR_RRCContainer)
2545                   {
2546                      DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2547                            ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2548                   }
2549                   DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
2550                }
2551             }
2552             DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
2553          }
2554          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2555       }
2556       DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2557    }
2558 }
2559 /*******************************************************************
2560  *
2561  * @brief Builds and sends the ULRRCMessageTransfer 
2562  *
2563  * @details
2564  *
2565  *    Function : BuildAndSendULRRCMessageTransfer
2566  *
2567  *    Functionality: Constructs the UL RRC Message Transfer and sends
2568  *                   it to the CU through SCTP.
2569  *
2570  * @params[in] 
2571  *
2572  * @return ROK     - success
2573  *         RFAILED - failure
2574  *
2575  * ****************************************************************/
2576 uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb  ueCb, uint8_t lcId, \
2577       uint16_t msgLen, uint8_t *rrcMsg)
2578 {
2579    uint8_t   elementCnt =0;
2580    uint8_t   idx1 =0;
2581    uint8_t   idx =0;
2582    F1AP_PDU_t                   *f1apMsg = NULLP;
2583    ULRRCMessageTransfer_t       *ulRRCMsg = NULLP;
2584    asn_enc_rval_t               encRetVal;        /* Encoder return value */
2585    uint8_t ret =RFAILED;
2586    
2587    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2588
2589    while(true)
2590    {
2591       DU_LOG("\n INFO   -->  F1AP : Building UL RRC Message Transfer Message\n");
2592
2593       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2594       if(f1apMsg == NULLP)
2595       {
2596          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
2597          break;
2598       }
2599       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2600       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2601       if(f1apMsg->choice.initiatingMessage == NULLP)
2602       {
2603          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
2604          break;
2605       }
2606       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
2607       f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2608       f1apMsg->choice.initiatingMessage->value.present = \
2609                                                          InitiatingMessage__value_PR_ULRRCMessageTransfer;
2610       ulRRCMsg =
2611          &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2612       elementCnt = 4;
2613       ulRRCMsg->protocolIEs.list.count = elementCnt;
2614       ulRRCMsg->protocolIEs.list.size = \
2615                                         elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
2616
2617       /* Initialize the F1Setup members */
2618       DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
2619       if(ulRRCMsg->protocolIEs.list.array == NULLP)
2620       {
2621          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
2622          break;
2623       }
2624       for(idx=0; idx<elementCnt; idx++)
2625       {
2626          DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
2627          if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2628          {
2629             break;
2630          }
2631       }
2632
2633       idx1 = 0;
2634
2635       /*GNB CU UE F1AP ID*/
2636       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2637       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2638       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2639                                                               ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2640       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
2641
2642       /*GNB DU UE F1AP ID*/
2643       idx1++;
2644       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2645       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2646       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2647                                                               ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2648       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
2649
2650       /*SRBID*/
2651       idx1++;
2652       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
2653       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2654       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2655                                                               ULRRCMessageTransferIEs__value_PR_SRBID;
2656       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
2657
2658       /*RRCContainer*/
2659       idx1++;
2660       ulRRCMsg->protocolIEs.list.array[idx1]->id  = ProtocolIE_ID_id_RRCContainer;
2661       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2662       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2663                                                               ULRRCMessageTransferIEs__value_PR_RRCContainer;
2664       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
2665       DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2666             ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
2667       if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
2668       {
2669          DU_LOG(" ERROR  -->  F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
2670          break;
2671       }
2672       memset(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, 0, msgLen);
2673       memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
2674             rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2675
2676       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2677
2678       /* Encode the F1SetupRequest type as APER */
2679       memset(encBuf, 0, ENC_BUF_MAX_LEN);
2680       encBufSize = 0;
2681       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2682             encBuf);
2683       /* Encode results */
2684       if(encRetVal.encoded == ENCODE_FAIL)
2685       {
2686          DU_LOG( "\nERROR  -->  F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2687                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2688          break;
2689       }
2690       else
2691       {
2692          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2693          for(int i=0; i< encBufSize; i++)
2694          {
2695             printf("%x",encBuf[i]);
2696          }
2697       }
2698
2699       /* Sending  msg  */
2700       if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) !=      ROK)
2701       {
2702          DU_LOG("\nERROR  -->   F1AP : Sending  UL RRC Message Transfer Failed");
2703          break;
2704       }
2705       ret = ROK;
2706       break;
2707    }
2708    FreeULRRCMessageTransfer(f1apMsg);
2709
2710    return ret;
2711 }/* End of BuildAndSendULRRCMessageTransfer*/
2712
2713 /*******************************************************************
2714  *
2715  * @brief Builds tag config 
2716  *
2717  * @details
2718  *
2719  *    Function : BuildTagConfig 
2720  *
2721  *    Functionality: Builds tag config in MacCellGroupConfig
2722  *
2723  * @params[in] TAG_Config *tag_Config
2724  *
2725  * @return ROK     - success
2726  *         RFAILED - failure
2727  *
2728  * ****************************************************************/
2729 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2730 {
2731    struct TAG_Config__tag_ToAddModList *tagList;
2732    uint8_t                     idx, elementCnt;
2733
2734    tagConfig->tag_ToReleaseList = NULLP;
2735    tagConfig->tag_ToAddModList = NULLP;
2736    DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2737    if(!tagConfig->tag_ToAddModList)
2738    {
2739       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2740       return RFAILED;
2741    }
2742
2743    elementCnt = 1; //ODU_VALUE_ONE;
2744    tagList = tagConfig->tag_ToAddModList;
2745    tagList->list.count = elementCnt;
2746    tagList->list.size  =  elementCnt * sizeof(struct TAG *);
2747
2748    tagList->list.array = NULLP;
2749    DU_ALLOC(tagList->list.array, tagList->list.size);
2750    if(!tagList->list.array)
2751    {
2752       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2753       return RFAILED;
2754    }
2755
2756    for(idx=0; idx<tagList->list.count; idx++)
2757    {
2758       tagList->list.array[idx] = NULLP;
2759       DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2760       if(!tagList->list.array[idx])
2761       {
2762          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2763          return RFAILED;
2764       }
2765    }
2766
2767    idx = 0;
2768    tagList->list.array[idx]->tag_Id = TAG_ID;
2769    tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2770
2771    return ROK;
2772 }
2773
2774 /*******************************************************************
2775  *
2776  * @brief Builds PHR Config 
2777  *
2778  * @details
2779  *
2780  *    Function : BuildPhrConfig
2781  *
2782  *    Functionality: Builds phrConfig in MacCellGroupConfig
2783  *
2784  * @params[in] PHR Config *
2785  *
2786  * @return ROK     - success
2787  *         RFAILED - failure
2788  *
2789  * ****************************************************************/
2790 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2791 {
2792
2793    phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2794    phrConfig->choice.setup = NULLP;
2795    DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2796    if(!phrConfig->choice.setup)
2797    {
2798       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildPhrConfig");
2799       return RFAILED;
2800    }
2801
2802    phrConfig->choice.setup->phr_PeriodicTimer        = PHR_PERIODIC_TMR;
2803    phrConfig->choice.setup->phr_ProhibitTimer        = PHR_PROHIBHIT_TMR;
2804    phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2805    phrConfig->choice.setup->multiplePHR              = false;
2806    phrConfig->choice.setup->dummy                    = false;
2807    phrConfig->choice.setup->phr_Type2OtherCell       = false;
2808    phrConfig->choice.setup->phr_ModeOtherCG          = PHR_MODE_OTHER_CG;
2809
2810    return ROK;
2811 }
2812
2813 /*******************************************************************
2814  *
2815  * @brief Builds BSR Config 
2816  *
2817  * @details
2818  *
2819  *    Function : BuildBsrConfig
2820  *
2821  *    Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2822  *
2823  * @params[in] BSR_Config *bsrConfig
2824  *
2825  * @return ROK     - success
2826  *         RFAILED - failure
2827  *
2828  * ****************************************************************/
2829 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2830 {
2831    bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2832    bsrConfig->retxBSR_Timer     = RETX_BSR_TMR;
2833    bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2834
2835    return ROK;
2836 }
2837
2838 /*******************************************************************
2839  *
2840  * @brief Builds scheduling request config 
2841  *
2842  * @details
2843  *
2844  *    Function : BuildSchedulingReqConfig 
2845  *
2846  *    Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2847  *
2848  * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2849  *
2850  * @return ROK     - success
2851  *         RFAILED - failure
2852  *
2853  * ****************************************************************/
2854 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2855 {
2856    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2857    uint8_t                     idx, elementCnt;
2858
2859    schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2860    DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2861          sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2862    if(!schedulingRequestConfig->schedulingRequestToAddModList)
2863    {
2864       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2865       return RFAILED;
2866    }
2867
2868    elementCnt = 1; //ODU_VALUE_ONE;
2869    schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2870    schReqList->list.count = elementCnt;
2871    schReqList->list.size  = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2872
2873    schReqList->list.array = NULLP;
2874    DU_ALLOC(schReqList->list.array, schReqList->list.size);
2875    if(!schReqList->list.array)
2876    {
2877       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2878       return RFAILED;
2879    }
2880
2881    for(idx=0;idx<schReqList->list.count; idx++)
2882    {
2883       schReqList->list.array[idx] = NULLP;
2884       DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2885       if(!schReqList->list.array[idx])
2886       {
2887          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2888          return RFAILED;
2889       }
2890    }
2891
2892    idx = 0;
2893    schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2894
2895    schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2896    DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2897    if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2898    {
2899       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2900       return RFAILED;
2901    }
2902    *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2903    schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2904    schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2905
2906    return ROK;
2907 }
2908
2909 /*******************************************************************
2910  *
2911  * @brief Builds RLC Config
2912  *
2913  * @details
2914  *
2915  *    Function : BuildRlcConfig
2916  *
2917  *    Functionality: Builds RLC Config in BuildRlcBearerToAddModList 
2918  *
2919  * @params[in] RLC_Config *rlcConfig
2920  *
2921  * @return ROK     - success
2922  *         RFAILED - failure
2923  *
2924  * ****************************************************************/
2925 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2926 {
2927
2928    rlcConfig->present = RLC_Config_PR_am;
2929
2930    rlcConfig->choice.am = NULLP;
2931    DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2932    if(!rlcConfig->choice.am)
2933    {
2934       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
2935       return RFAILED;
2936    }
2937
2938    /* UL */
2939    rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2940    DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2941    if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2942    {
2943       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
2944       return RFAILED;
2945    }
2946    *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2947    rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit  = T_POLL_RETRANSMIT;
2948    rlcConfig->choice.am->ul_AM_RLC.pollPDU           = POLL_PDU;
2949    rlcConfig->choice.am->ul_AM_RLC.pollByte          = POLL_BYTE;
2950    rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold  = MAX_RETX_THRESHOLD;
2951
2952    /* DL */
2953    rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2954    DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
2955    if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2956    {
2957       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
2958       return RFAILED;
2959    }
2960    *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2961    rlcConfig->choice.am->dl_AM_RLC.t_Reassembly      = T_REASSEMBLY;
2962    rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit  = T_STATUS_PROHIBHIT;
2963
2964    return ROK;
2965 }
2966
2967 /*******************************************************************
2968  *
2969  * @brief Builds MAC LC Config
2970  *
2971  * @details
2972  *
2973  *    Function : BuildMacLCConfig 
2974  *
2975  *    Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList 
2976  *
2977  * @params[in] struct LogicalChannelConfig macLcConfig
2978  *
2979  * @return ROK     - success
2980  *         RFAILED - failure
2981  *
2982  * ****************************************************************/
2983 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2984 {
2985
2986    macLcConfig->ul_SpecificParameters = NULLP;
2987    DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2988    if(!macLcConfig->ul_SpecificParameters)
2989    {
2990       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
2991       return RFAILED;
2992    }
2993
2994    macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2995    macLcConfig->ul_SpecificParameters->prioritisedBitRate =     PRIORTISIED_BIT_RATE;
2996    macLcConfig->ul_SpecificParameters->bucketSizeDuration =     BUCKET_SIZE_DURATION;
2997    macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2998    macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2999    macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
3000    macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
3001
3002    macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
3003    DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup,    sizeof(long));
3004    if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
3005    {
3006       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
3007       return RFAILED;
3008    }
3009    *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
3010
3011    macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
3012    DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID,    sizeof(SchedulingRequestId_t));
3013    if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
3014    {
3015       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
3016       return RFAILED;
3017    }
3018    *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
3019
3020    macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
3021    macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
3022    macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
3023
3024    return ROK;
3025 }
3026
3027 /*******************************************************************
3028  *
3029  * @brief Builds RLC Bearer to Add/Mod list
3030  *
3031  * @details
3032  *
3033  *    Function :BuildRlcBearerToAddModList 
3034  *
3035  *    Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
3036  *
3037  * @params[in] rlc_BearerToAddModList
3038  *
3039  * @return ROK     - success
3040  *         RFAILED - failure
3041  *
3042  * ****************************************************************/
3043 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
3044 {
3045    uint8_t                     idx, elementCnt;
3046
3047    elementCnt = 1;
3048    rlcBearerList->list.count = elementCnt;
3049    rlcBearerList->list.size  = elementCnt * sizeof(struct RLC_BearerConfig *);
3050
3051    rlcBearerList->list.array = NULLP;
3052    DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
3053    if(!rlcBearerList->list.array)
3054    {
3055       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3056       return RFAILED;
3057    }
3058
3059    for(idx=0; idx<rlcBearerList->list.count; idx++)
3060    {
3061       rlcBearerList->list.array[idx] = NULLP;
3062       DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
3063       if(!rlcBearerList->list.array[idx])
3064       {
3065          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3066          return RFAILED;
3067       }
3068    }
3069
3070    idx = 0;
3071    rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
3072
3073    DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \
3074       sizeof(struct RLC_BearerConfig__servedRadioBearer));
3075    if(!rlcBearerList->list.array[idx]->servedRadioBearer)
3076    {
3077       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3078       return RFAILED;
3079    }
3080
3081    rlcBearerList->list.array[idx]->servedRadioBearer->present = \
3082       RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
3083    rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \
3084       SRB1_LCID;
3085
3086    rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
3087    rlcBearerList->list.array[idx]->rlc_Config = NULLP;
3088    DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
3089    if(!rlcBearerList->list.array[idx]->rlc_Config)
3090    {
3091       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3092       return RFAILED;
3093    }
3094
3095    if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
3096    {
3097       DU_LOG("\nERROR  -->  F1AP : BuildRlcConfig failed");
3098       return RFAILED;
3099    }
3100
3101    rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
3102    DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \
3103       sizeof(struct LogicalChannelConfig));
3104    if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
3105    {
3106       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3107       return RFAILED;
3108    }
3109
3110    if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
3111    {
3112       DU_LOG("\nERROR  -->  F1AP : BuildMacLCConfig failed");
3113       return RFAILED;
3114    }
3115
3116    return ROK;
3117 }
3118
3119 /*******************************************************************
3120  *
3121  * @brief Build Control resource set to add/modify list 
3122  *
3123  * @details
3124  *
3125  *    Function : BuildControlRSetToAddModList
3126  *
3127  *    Functionality: Build Control resource set to add/modify list
3128  *
3129  * @params[in] 
3130  * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3131  *
3132  * @return ROK     - success
3133  *         RFAILED - failure
3134  *
3135  * ****************************************************************/
3136    uint8_t BuildControlRSetToAddModList
3137 (
3138  struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3139  )
3140 {
3141    uint8_t idx;
3142    uint8_t elementCnt;
3143    uint8_t numBytes, bitsUnused;
3144    struct ControlResourceSet *controlRSet;
3145    uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3146    uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3147
3148
3149    elementCnt = 1;
3150    controlRSetList->list.count = elementCnt;
3151    controlRSetList->list.size = \
3152                                 elementCnt * sizeof(struct ControlResourceSet *);
3153
3154    controlRSetList->list.array = NULLP;
3155    DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3156    if(!controlRSetList->list.array)
3157    {
3158       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3159       return RFAILED;
3160    }
3161
3162    for(idx = 0; idx < elementCnt; idx++)
3163    {
3164       controlRSetList->list.array[idx] = NULLP;
3165       DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3166       if(!controlRSetList->list.array[idx])
3167       {
3168          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3169          return RFAILED;
3170       }
3171    }
3172
3173    idx=0;
3174    controlRSet = controlRSetList->list.array[idx];
3175
3176    controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3177
3178    /* size 6 bytes
3179     * 3 LSBs unsued
3180     * Bit string stored ff0000000000
3181     */
3182    numBytes = 6;
3183    bitsUnused = 3;
3184    controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3185
3186    controlRSet->frequencyDomainResources.buf = NULLP;
3187    DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3188          controlRSet->frequencyDomainResources.size);
3189    if(!controlRSet->frequencyDomainResources.buf)
3190    {
3191       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3192       return RFAILED;
3193    }
3194
3195    memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3196    coreset0EndPrb = CORESET0_END_PRB;
3197    coreset1StartPrb = coreset0EndPrb + 6;
3198    coreset1NumPrb = CORESET1_NUM_PRB;
3199    /* calculate the PRBs */
3200    freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3201    memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3202    controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3203
3204    controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3205    controlRSet->cce_REG_MappingType.present = \
3206                                               ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3207
3208    controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3209    controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3210    controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3211    controlRSet->tci_PresentInDCI = NULLP;
3212 #if 0
3213    uint8_t tciStateIdx;
3214
3215    DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3216          sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3217    if(!controlRset->tci_StatesPDCCH_ToAddList)
3218    {
3219       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3220       return RFAILED;
3221    }
3222
3223    elementCnt = 1;
3224    controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3225    controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3226    DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3227          controlRset->tci_StatesPDCCH_ToAddList->list.size)
3228       if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3229       {
3230          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3231          return RFAILED;
3232       }
3233
3234    for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3235    {
3236       DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3237       if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3238       {
3239          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3240          return RFAILED;
3241       }
3242    }
3243
3244    tciStateIdx = 0;
3245    /* TODO */
3246    *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3247
3248    DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3249    if(!controlRset->tci_PresentInDCI)
3250    {
3251       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3252       return RFAILED;
3253    }
3254    /* TODO */
3255    *(controlRset->tci_PresentInDCI);
3256 #endif
3257
3258    controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3259    DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3260    if(!controlRSet->pdcch_DMRS_ScramblingID)
3261    {
3262       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3263       return RFAILED;
3264    }
3265    *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3266
3267    return ROK;
3268 } /* End BuildControlRSetToAddModList */
3269
3270 /*******************************************************************
3271  *
3272  * @brief Build search space to add/modify list
3273  *
3274  * @details
3275  *
3276  *    Function : BuildSearchSpcToAddModList
3277  *
3278  *    Functionality: Build search space to add/modify list
3279  *
3280  * @params[in] 
3281  * @return ROK     - success
3282  *         RFAILED - failure
3283  *
3284  * ****************************************************************/
3285    uint8_t BuildSearchSpcToAddModList
3286 (
3287  struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3288  )
3289 {
3290    uint8_t idx;
3291    uint8_t numBytes;
3292    uint8_t byteIdx;
3293    uint8_t bitsUnused;
3294    uint8_t elementCnt;
3295    struct SearchSpace *searchSpc;
3296
3297    elementCnt = 1;
3298    searchSpcList->list.count = elementCnt;
3299    searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3300
3301    searchSpcList->list.array = NULLP;
3302    DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3303    if(!searchSpcList->list.array)
3304    {
3305       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3306       return RFAILED;
3307    }
3308
3309    for(idx = 0; idx < elementCnt; idx++)
3310    {
3311       searchSpcList->list.array[idx] = NULLP;
3312       DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3313       if(!searchSpcList->list.array[idx])
3314       {
3315          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3316          return RFAILED;
3317       }
3318    }
3319
3320    idx = 0;
3321    searchSpc = searchSpcList->list.array[idx];
3322
3323    searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3324
3325    searchSpc->controlResourceSetId = NULLP;
3326    DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3327    if(!searchSpc->controlResourceSetId)
3328    {
3329       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3330       return RFAILED;
3331    }
3332    *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3333
3334    searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3335    DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3336          sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3337    if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3338    {
3339       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3340       return RFAILED;
3341    }
3342    searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3343                                                             SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3344
3345    searchSpc->duration = NULLP;
3346    searchSpc->monitoringSymbolsWithinSlot = NULLP;
3347    DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3348    if(!searchSpc->monitoringSymbolsWithinSlot)
3349    {
3350       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3351       return RFAILED;
3352    }
3353
3354    /* Values taken from reference logs :
3355     * size 2 bytes
3356     * 2 LSBs unsued
3357     * Bit string stores 8000
3358     */
3359    numBytes = 2;
3360    bitsUnused = 2;
3361
3362    searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3363    searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3364    DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3365          searchSpc->monitoringSymbolsWithinSlot->size);
3366    if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3367    {
3368       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3369       return RFAILED;
3370    }
3371
3372    byteIdx = 0;
3373    searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3374                                                             PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3375    searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3376    searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3377
3378    searchSpc->nrofCandidates = NULLP;
3379    DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3380    if(!searchSpc->nrofCandidates)
3381    {
3382       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3383       return RFAILED;
3384    }
3385
3386    searchSpc->nrofCandidates->aggregationLevel1 = \
3387                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3388    searchSpc->nrofCandidates->aggregationLevel2 = \
3389                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3390    searchSpc->nrofCandidates->aggregationLevel4 = \
3391                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3392    searchSpc->nrofCandidates->aggregationLevel8 = \
3393                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3394    searchSpc->nrofCandidates->aggregationLevel16 = \
3395                                                    PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3396
3397    searchSpc->searchSpaceType = NULLP;
3398    DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3399    if(!searchSpc->searchSpaceType)
3400    {
3401       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3402       return RFAILED;
3403    }
3404
3405    searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3406
3407    searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3408    DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3409          sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3410    if(!searchSpc->searchSpaceType->choice.ue_Specific)
3411    {
3412       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3413       return RFAILED;
3414    }  
3415    searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3416                                                                  PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3417
3418    return ROK;
3419 }/* End BuildSearchSpcToAddModList */
3420
3421 /*******************************************************************
3422  *
3423  * @brief Builds BWP DL dedicated PDCCH config
3424  *
3425  * @details
3426  *
3427  *    Function : BuildBWPDlDedPdcchCfg
3428  *
3429  *    Functionality: Builds BWP DL dedicated PDCCH config
3430  *
3431  * @params[in] struct PDCCH_Config *pdcchCfg
3432  *
3433  * @return ROK     - success
3434  *         RFAILED - failure
3435  *
3436  * ****************************************************************/
3437 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3438 {
3439    pdcchCfg->controlResourceSetToAddModList = NULLP;
3440    DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3441          sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3442    if(!pdcchCfg->controlResourceSetToAddModList)
3443    {
3444       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3445       return RFAILED;
3446    }
3447
3448    if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3449    {
3450       return RFAILED;
3451    }
3452
3453    pdcchCfg->controlResourceSetToReleaseList = NULLP;
3454
3455    pdcchCfg->searchSpacesToAddModList = NULLP;
3456    DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3457          sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3458    if(!pdcchCfg->searchSpacesToAddModList)
3459    {
3460       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3461       return RFAILED;
3462    }
3463
3464    if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3465    {
3466       return RFAILED;
3467    }
3468
3469    pdcchCfg->searchSpacesToReleaseList = NULLP;
3470    pdcchCfg->downlinkPreemption = NULLP;
3471    pdcchCfg->tpc_PUSCH = NULLP;
3472    pdcchCfg->tpc_PUCCH = NULLP;
3473    pdcchCfg->tpc_SRS = NULLP;
3474
3475    return ROK;
3476 }
3477
3478 /*******************************************************************
3479  *
3480  * @brief Builds DMRS DL PDSCH Mapping type A
3481  *
3482  * @details
3483  *
3484  *    Function : BuildDMRSDLPdschMapTypeA
3485  *
3486  *    Functionality: Builds DMRS DL PDSCH Mapping type A
3487  *
3488  * @params[in]
3489  * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3490  * @return ROK     - success
3491  *         RFAILED - failure
3492  *
3493  * ****************************************************************/
3494    uint8_t BuildDMRSDLPdschMapTypeA
3495 (
3496  struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3497  )
3498 {
3499    dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3500    dmrsDlCfg->choice.setup = NULLP;
3501    DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3502    if(!dmrsDlCfg->choice.setup)
3503    {
3504       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3505       return RFAILED;
3506    }
3507
3508    dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3509    dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3510    DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3511    if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3512    {
3513       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3514       return RFAILED;
3515    }
3516    *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3517
3518    dmrsDlCfg->choice.setup->maxLength = NULLP;
3519    dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3520    dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3521    dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3522
3523    return ROK;
3524 }
3525
3526 /*******************************************************************
3527  *
3528  * @brief Builds TCI states to add/modify list
3529  *
3530  * @details
3531  *
3532  *    Function : BuildTCIStatesToAddModList
3533  *
3534  *    Functionality:Builds TCI states to add/modify list
3535  *
3536  * @params[in] 
3537  * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3538  *
3539  * @return ROK     - success
3540  *         RFAILED - failure
3541  *
3542  * ****************************************************************/
3543 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3544 {
3545    return ROK;
3546 }
3547
3548 /*******************************************************************
3549  *
3550  * @brief Builds PDSCH time domain allocation list
3551  *
3552  * @details
3553  *
3554  *    Function : BuildPdschTimeDomAllocList
3555  *
3556  *    Functionality: Builds PDSCH time domain allocation list
3557  *
3558  * @params[in] 
3559  * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3560  *
3561  * @return ROK     - success
3562  *         RFAILED - failure
3563  *
3564  * ****************************************************************/
3565    uint8_t BuildPdschTimeDomAllocList
3566 (
3567  struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3568  )
3569 {
3570    uint8_t idx;
3571    uint8_t elementCnt;
3572    struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3573
3574    timeDomAllocList->present = \
3575                                PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3576
3577    timeDomAllocList->choice.setup = NULLP;
3578    DU_ALLOC(timeDomAllocList->choice.setup, \
3579          sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3580    if(!timeDomAllocList->choice.setup)
3581    {
3582       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3583       return RFAILED;
3584    }
3585
3586    elementCnt = 1;
3587    timeDomAllocList->choice.setup->list.count = elementCnt;
3588    timeDomAllocList->choice.setup->list.size = \
3589                                                elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3590
3591    timeDomAllocList->choice.setup->list.array = NULLP;
3592    DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3593          timeDomAllocList->choice.setup->list.size);
3594    if(!timeDomAllocList->choice.setup->list.array)
3595    {
3596       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3597       return RFAILED;
3598    }
3599
3600    for(idx = 0; idx < elementCnt; idx++)
3601    {
3602       timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3603       DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3604             sizeof(struct PDSCH_TimeDomainResourceAllocation));
3605       if(!timeDomAllocList->choice.setup->list.array[idx])
3606       {
3607          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3608          return RFAILED;
3609       }
3610    }
3611
3612    idx = 0;
3613    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3614
3615    timeDomAlloc->k0 = NULLP;
3616    timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3617    timeDomAlloc->startSymbolAndLength = \
3618                                         calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
3619
3620    return ROK;
3621 }
3622
3623 /*******************************************************************
3624  *
3625  * @brief Builds PDSCH PRB Bundling type
3626  *
3627  * @details
3628  *
3629  *    Function : BuildPdschPrbBundlingType
3630  *
3631  *    Functionality: Builds PDSCH PRB Bundling type
3632  *
3633  * @params[in] 
3634  * struct PDSCH_Config__prb_BundlingType *prbBndlType
3635  *
3636  * @return ROK     - success
3637  *         RFAILED - failure
3638  *
3639  * ****************************************************************/
3640    uint8_t BuildPdschPrbBundlingType
3641 (
3642  struct PDSCH_Config__prb_BundlingType *prbBndlType
3643  )
3644 {
3645    prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3646
3647    prbBndlType->choice.staticBundling = NULLP;
3648    DU_ALLOC(prbBndlType->choice.staticBundling, \
3649          sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3650    if(!prbBndlType->choice.staticBundling)
3651    {
3652       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3653       return RFAILED;
3654    }
3655    prbBndlType->choice.staticBundling->bundleSize = NULLP;
3656
3657    return ROK;
3658 }
3659
3660 /*******************************************************************
3661  *
3662  * @brief Builds BWP DL dedicated PDSCH config 
3663  *
3664  * @details
3665  *
3666  *    Function : BuildBWPDlDedPdschCfg
3667  *
3668  *    Functionality: Builds BWP DL dedicated PDSCH config
3669  *
3670  * @params[in] struct PDSCH_Config *pdschCfg
3671  *
3672  * @return ROK     - success
3673  *         RFAILED - failure
3674  *
3675  * ****************************************************************/
3676 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3677 {
3678    pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3679
3680    pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3681    DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3682          sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3683    if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3684    {
3685       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3686       return RFAILED;
3687    }
3688
3689    if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3690    {
3691       return RFAILED;
3692    }
3693
3694    pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3695    pdschCfg->tci_StatesToAddModList = NULLP;
3696    pdschCfg->tci_StatesToReleaseList = NULLP;
3697    pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3698 #if 0
3699    DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3700    if(!pdschCfg->tci_StatesToAddModList)
3701    {
3702       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3703       return RFAILED;
3704    }
3705    if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3706    {
3707       return RFAILED;
3708    }
3709 #endif
3710
3711    pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3712
3713    pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3714    DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3715          sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3716    if(!pdschCfg->pdsch_TimeDomainAllocationList)
3717    {
3718       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3719       return RFAILED;
3720    }
3721
3722    if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3723    {
3724       return RFAILED;
3725    }
3726
3727    pdschCfg->pdsch_AggregationFactor = NULLP;
3728    pdschCfg->rateMatchPatternToAddModList = NULLP;
3729    pdschCfg->rateMatchPatternToReleaseList = NULLP;
3730    pdschCfg->rateMatchPatternGroup1 = NULLP;
3731    pdschCfg->rateMatchPatternGroup2 = NULLP;
3732    pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3733    pdschCfg->mcs_Table = NULLP;
3734
3735    pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3736    DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3737    if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3738    {
3739       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3740       return RFAILED;
3741    }
3742    *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3743
3744    if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3745    {
3746       return RFAILED;
3747    }
3748
3749    pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3750    pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3751    pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3752    pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3753    pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3754    pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3755    pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3756
3757    return ROK;
3758 }
3759
3760 /*******************************************************************
3761  *
3762  * @brief Builds intitial DL BWP
3763  * @details
3764  *
3765  *    Function : BuildInitialDlBWP 
3766  *
3767  *    Functionality: Builds intitial DL BWP in spCellCfgDed
3768  *
3769  * @params[in] BWP_DownlinkDedicated_t *dlBwp
3770  *
3771  * @return ROK     - success
3772  *         RFAILED - failure
3773  *
3774  * ****************************************************************/
3775 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3776 {
3777    dlBwp->pdcch_Config = NULLP;
3778    DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3779    if(!dlBwp->pdcch_Config)
3780    {
3781       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3782       return RFAILED;
3783    }
3784    dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup; 
3785
3786    dlBwp->pdcch_Config->choice.setup = NULLP;
3787    DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3788    if(!dlBwp->pdcch_Config->choice.setup)
3789    {
3790       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3791       return RFAILED;
3792    }
3793    if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3794    {
3795       return RFAILED;
3796    }
3797
3798    dlBwp->pdsch_Config = NULLP;
3799    DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3800    if(!dlBwp->pdsch_Config)
3801    {
3802       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3803       return RFAILED;
3804    }
3805    dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3806
3807    dlBwp->pdsch_Config->choice.setup = NULLP;
3808    DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3809    if(!dlBwp->pdsch_Config->choice.setup)
3810    {
3811       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3812       return RFAILED;
3813    }
3814
3815    if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3816    {
3817       return RFAILED;
3818    }
3819
3820    dlBwp->sps_Config = NULLP;
3821    dlBwp->radioLinkMonitoringConfig = NULLP; 
3822    return ROK;
3823 }
3824
3825 /*******************************************************************
3826  *
3827  * @brief Builds DMRS UL Pusch Mapping type A
3828  *
3829  * @details
3830  *
3831  *    Function : BuildDMRSULPuschMapTypeA
3832  *
3833  *    Functionality: Builds DMRS UL Pusch Mapping type A
3834  *
3835  * @params[in] 
3836  *    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3837  * @return ROK     - success
3838  *         RFAILED - failure
3839  *
3840  * ****************************************************************/
3841    uint8_t BuildDMRSULPuschMapTypeA
3842 (
3843  struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3844  )
3845 {
3846    dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3847    dmrsUlCfg->choice.setup= NULLP;
3848    DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3849    if(!dmrsUlCfg->choice.setup)
3850    {
3851       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3852       return RFAILED;
3853    }
3854
3855    dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3856    dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3857    DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3858    if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3859    {
3860       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3861       return RFAILED;
3862    }
3863    *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS; 
3864
3865    dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3866    dmrsUlCfg->choice.setup->maxLength = NULLP;
3867    dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3868    DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3869          sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3870    if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3871    {
3872       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3873       return RFAILED;
3874    }
3875
3876    dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3877    DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3878          sizeof(long));
3879    if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3880    {
3881       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3882       return RFAILED;
3883    }
3884    *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3885
3886    dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3887    dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3888    return ROK;
3889 }
3890
3891 /*******************************************************************
3892  *
3893  * @brief Build PUSCH time domain allocation list
3894  *
3895  * @details
3896  *
3897  *    Function : BuildPuschTimeDomAllocList
3898  *
3899  *    Functionality: Build PUSCH time domain allocation list
3900  *
3901  * @params[in] 
3902  * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3903  *
3904  * @return ROK     - success
3905  *         RFAILED - failure
3906  *
3907  * ****************************************************************/
3908    uint8_t BuildPuschTimeDomAllocList
3909 (
3910  struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3911  )
3912 {
3913    uint8_t idx;
3914    uint8_t elementCnt;
3915    PUSCH_TimeDomainResourceAllocation_t  *timeDomAlloc;
3916
3917    timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3918    timeDomAllocList->choice.setup = NULLP;
3919    DU_ALLOC(timeDomAllocList->choice.setup, \
3920          sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3921    if(!timeDomAllocList->choice.setup)
3922    {
3923       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3924       return RFAILED;
3925    }
3926
3927    elementCnt = 1;
3928    timeDomAllocList->choice.setup->list.count = elementCnt;
3929    timeDomAllocList->choice.setup->list.size = \
3930                                                elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3931    timeDomAllocList->choice.setup->list.array = NULLP;
3932    DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3933          timeDomAllocList->choice.setup->list.size);
3934    if(!timeDomAllocList->choice.setup->list.array)
3935    {
3936       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3937       return RFAILED;
3938    }
3939
3940    for(idx = 0; idx < elementCnt; idx++)
3941    {
3942       timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3943       DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3944             sizeof(PUSCH_TimeDomainResourceAllocation_t));
3945       if(!timeDomAllocList->choice.setup->list.array[idx])
3946       {
3947          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3948          return RFAILED;
3949       }
3950    }
3951
3952    idx = 0;
3953    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3954    DU_ALLOC(timeDomAlloc->k2, sizeof(long));
3955    if(!timeDomAlloc->k2)
3956    {
3957       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3958       return RFAILED;
3959    }
3960    *(timeDomAlloc->k2) = PUSCH_K2;
3961    timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3962    timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
3963    return ROK;
3964 }
3965
3966 /*******************************************************************
3967  *
3968  * @brief Builds BWP UL dedicated PUSCH Config
3969  *
3970  * @details
3971  *
3972  *    Function : BuildBWPUlDedPuschCfg
3973  *
3974  *    Functionality:
3975  *      Builds BWP UL dedicated PUSCH Config
3976  *
3977  * @params[in] : PUSCH_Config_t *puschCfg
3978  *    
3979  * @return ROK     - success
3980  *         RFAILED - failure
3981  *
3982  * ****************************************************************/
3983 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3984 {
3985    puschCfg->dataScramblingIdentityPUSCH = NULLP;
3986    DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3987    if(!puschCfg->dataScramblingIdentityPUSCH)
3988    {
3989       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3990       return RFAILED;
3991    }
3992    *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3993
3994    puschCfg->txConfig = NULLP;
3995    puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3996    DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3997          sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3998    if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3999    {
4000       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4001       return RFAILED;
4002    }
4003
4004    if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4005    {
4006       return RFAILED;
4007    }
4008
4009    puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4010    puschCfg->pusch_PowerControl = NULLP;
4011    puschCfg->frequencyHopping = NULLP;
4012    puschCfg->frequencyHoppingOffsetLists = NULLP;
4013    puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4014
4015    puschCfg->pusch_TimeDomainAllocationList = NULLP;
4016    DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4017          sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4018    if(!puschCfg->pusch_TimeDomainAllocationList)
4019    {
4020       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4021       return RFAILED;
4022    }
4023
4024    if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4025    {
4026       return RFAILED;
4027    }
4028
4029    puschCfg->pusch_AggregationFactor = NULLP;
4030    puschCfg->mcs_Table = NULLP;
4031    puschCfg->mcs_TableTransformPrecoder = NULLP;
4032    puschCfg->transformPrecoder = NULLP;
4033    DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4034    if(!puschCfg->transformPrecoder)
4035    {
4036       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4037       return RFAILED;
4038    }
4039    *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4040
4041    puschCfg->codebookSubset = NULLP;
4042    puschCfg->maxRank = NULLP;
4043    puschCfg->rbg_Size = NULLP;
4044    puschCfg->uci_OnPUSCH = NULLP;
4045    puschCfg->tp_pi2BPSK = NULLP;
4046
4047    return ROK;
4048 }
4049
4050 /*******************************************************************
4051  *
4052  * @brief Fills SRS resource to add/modify list 
4053  *
4054  * @details
4055  *
4056  *    Function : BuildSrsRsrcAddModList
4057  *
4058  *    Functionality: Fills SRS resource to add/modify list
4059  *
4060  * @params[in] 
4061  * @return ROK     - success
4062  *         RFAILED - failure
4063  *
4064  * ****************************************************************/
4065 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4066 {
4067    uint8_t   elementCnt;
4068    uint8_t   rsrcIdx;
4069
4070    elementCnt = 1;
4071    resourceList->list.count = elementCnt;
4072    resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4073    resourceList->list.array = NULLP;
4074    DU_ALLOC(resourceList->list.array, resourceList->list.size);
4075    if(!resourceList->list.array)
4076    {
4077       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4078       return RFAILED;
4079    }
4080
4081    for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4082    {
4083       DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4084       if(!resourceList->list.array[rsrcIdx])
4085       {
4086          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4087          return RFAILED;
4088       }
4089    }
4090
4091    rsrcIdx = 0;
4092    resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4093    resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4094    resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4095
4096    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4097    DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4098          sizeof(struct SRS_Resource__transmissionComb__n2));
4099    if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4100    {
4101       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4102       return RFAILED;
4103    }
4104    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4105       = SRS_COMB_OFFSET_N2;
4106    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4107       = SRS_CYCLIC_SHIFT_N2;
4108
4109    resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
4110                                                                       PUSCH_START_SYMBOL;
4111    resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols =  \
4112                                                                      SRS_Resource__resourceMapping__nrofSymbols_n1;
4113    resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4114                                                                          SRS_Resource__resourceMapping__repetitionFactor_n1;
4115
4116    resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4117    resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4118    resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4119    resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4120    resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4121    resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4122                                                                SRS_Resource__groupOrSequenceHopping_neither;
4123
4124    /* Setting resource type to aperiodic for intergration purposes */
4125    resourceList->list.array[rsrcIdx]->resourceType.present = \
4126                                                              SRS_Resource__resourceType_PR_aperiodic;
4127    resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4128    DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4129          sizeof(struct SRS_Resource__resourceType__aperiodic));
4130    if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4131    {
4132       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4133       return RFAILED;
4134    }
4135    resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4136
4137    return ROK;
4138 }
4139
4140 /*******************************************************************
4141  *
4142  * @brief Build SRS resource set Add/mod list
4143  *
4144  * @details
4145  *
4146  *    Function : BuildSrsRsrcSetAddModList
4147  *
4148  *    Functionality: Build SRS resource set Add/mod list
4149  *
4150  * @params[in] 
4151  * @return ROK     - success
4152  *         RFAILED - failure
4153  *
4154  * ****************************************************************/
4155    uint8_t BuildSrsRsrcSetAddModList
4156 (
4157  struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4158  )
4159 {
4160    uint8_t  elementCnt;
4161    uint8_t  rSetIdx;
4162    uint8_t  rsrcIdx;
4163    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4164
4165    elementCnt = 1;
4166    rsrcSetList->list.count = elementCnt;
4167    rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4168    rsrcSetList->list.array = NULLP;
4169    DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4170    if(!rsrcSetList->list.array)
4171    {
4172       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4173       return RFAILED;
4174    }
4175
4176    for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4177    {
4178       DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4179       if(!rsrcSetList->list.array[rSetIdx])
4180       {
4181          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4182          return RFAILED;
4183       }
4184    }
4185
4186    rSetIdx = 0;
4187    rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4188
4189    /* Fill Resource Id list in resource set */
4190    rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4191    DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4192          sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4193    if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4194    {
4195       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4196       return RFAILED;
4197    }
4198
4199    elementCnt = 1;
4200    rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4201    rsrcIdList->list.count = elementCnt;
4202    rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4203    rsrcIdList->list.array = NULLP;
4204    DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4205    if(!rsrcIdList->list.array)
4206    {
4207       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4208       return RFAILED;
4209    }
4210
4211    for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4212    {
4213       DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4214       if(!rsrcIdList->list.array[rsrcIdx])
4215       {
4216          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4217          return RFAILED;
4218       }
4219    }
4220
4221    rsrcIdx = 0;
4222    *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4223
4224    /* Fill resource type */
4225    rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4226                                                             SRS_ResourceSet__resourceType_PR_aperiodic;
4227
4228    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4229    DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4230          sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4231    if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4232    {
4233       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4234       return RFAILED;
4235    }
4236    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4237       = APERIODIC_SRS_RESRC_TRIGGER;
4238
4239    /* TODO : Fill values for below IEs as expected by Viavi */
4240    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4241    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4242
4243
4244    rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4245    rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4246    rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4247    rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4248    rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4249
4250    return ROK;
4251 }
4252
4253 /*******************************************************************
4254  *
4255  * @brief Builds BWP UL dedicated SRS Config
4256  *
4257  * @details
4258  *
4259  *    Function : BuildBWPUlDedSrsCfg
4260  *
4261  *    Functionality: Builds BWP UL dedicated SRS Config
4262  *
4263  * @params[in] SRS Config 
4264  * @return ROK     - success
4265  *         RFAILED - failure
4266  *
4267  * ****************************************************************/
4268 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4269 {
4270    srsCfg->srs_ResourceSetToReleaseList = NULLP;
4271    srsCfg->srs_ResourceSetToAddModList = NULLP;
4272    DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4273          sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4274    if(!srsCfg->srs_ResourceSetToAddModList)
4275    {
4276       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
4277       return RFAILED;
4278    }
4279    if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4280    {
4281       return RFAILED;
4282    }
4283
4284    srsCfg->srs_ResourceToReleaseList = NULLP;
4285
4286    /* Resource to Add/Modify list */
4287    srsCfg->srs_ResourceToAddModList = NULLP;
4288    DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4289          sizeof(struct SRS_Config__srs_ResourceToAddModList));
4290    if(!srsCfg->srs_ResourceToAddModList)
4291    {
4292       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
4293       return RFAILED;
4294    }
4295
4296    if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4297    {
4298       return RFAILED;
4299    }
4300
4301    srsCfg->tpc_Accumulation = NULLP;
4302
4303    return ROK;
4304 }
4305
4306
4307
4308 /*******************************************************************
4309  *
4310  * @brief Builds Pusch Serving cell Config
4311  *
4312  * @details
4313  *
4314  *    Function : BuildPuschSrvCellCfg
4315  *
4316  *    Functionality: Builds Pusch Serving cell Config
4317  *
4318  * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4319  *
4320  * @return ROK     - success
4321  *         RFAILED - failure
4322  *
4323  * ****************************************************************/
4324 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4325 {
4326    puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4327    puschCfg->choice.setup = NULLP;
4328    DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4329    if(!puschCfg->choice.setup)
4330    {
4331       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4332       return RFAILED;
4333    }
4334
4335    puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4336    puschCfg->choice.setup->rateMatching = NULLP;
4337    puschCfg->choice.setup->xOverhead = NULLP;
4338    puschCfg->choice.setup->ext1 = NULLP;
4339    DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4340    if(!puschCfg->choice.setup->ext1)
4341    {
4342       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4343       return RFAILED;
4344    }
4345
4346    puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4347    DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4348    if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4349    {
4350       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4351       return RFAILED;
4352    }
4353    *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4354
4355    puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4356    DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4357    if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4358    {
4359       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4360       return RFAILED;
4361    }
4362    *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4363    return ROK;
4364 }
4365
4366 /*******************************************************************
4367  *
4368  * @brief Builds inital UL BWP
4369  *
4370  * @details
4371  *
4372  *    Function : BuildInitialUlBWP
4373  *
4374  *    Functionality: Builds initial UL BWP
4375  *
4376  * @params[in] BWP_UplinkDedicated_t *ulBwp
4377  * @return ROK     - success
4378  *         RFAILED - failure
4379  *
4380  * ****************************************************************/
4381 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4382 {
4383    ulBwp->pucch_Config = NULLP;
4384
4385    /* Fill BWP UL dedicated PUSCH config */
4386    ulBwp->pusch_Config = NULLP;
4387    DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4388    if(!ulBwp->pusch_Config)
4389    {
4390       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4391       return RFAILED;
4392    }
4393
4394    ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4395    ulBwp->pusch_Config->choice.setup = NULLP;
4396    DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4397    if(!ulBwp->pusch_Config->choice.setup)
4398    {
4399       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4400       return RFAILED;
4401    }
4402
4403    if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4404    {
4405       return RFAILED;
4406    }
4407
4408    ulBwp->configuredGrantConfig = NULLP;
4409
4410    /* Fill BPW UL dedicated SRS config */
4411    ulBwp->srs_Config = NULLP;
4412    DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4413    if(!ulBwp->srs_Config)
4414    {
4415       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4416       return RFAILED;
4417    }
4418
4419    ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4420    ulBwp->srs_Config->choice.setup = NULLP;
4421    DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4422    if(!ulBwp->srs_Config->choice.setup)
4423    {
4424       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4425       return RFAILED;
4426    }
4427
4428    if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4429    {
4430       return RFAILED;   
4431    }
4432
4433    ulBwp->beamFailureRecoveryConfig = NULLP;
4434
4435    return ROK;
4436 }
4437
4438 /*******************************************************************
4439  *
4440  * @brief Builds UL config
4441  * @details
4442  *
4443  *    Function : BuildUlCfg 
4444  *
4445  *    Functionality: Builds UL config in spCellCfgDed
4446  *
4447  * @params[in] UplinkConfig_t *ulCfg
4448  *
4449  * @return ROK     - success
4450  *         RFAILED - failure
4451  *
4452  * ****************************************************************/
4453 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4454 {
4455    ulCfg->initialUplinkBWP = NULLP;
4456    DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4457    if(!ulCfg->initialUplinkBWP)
4458    {
4459       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4460       return RFAILED;
4461    }
4462
4463    if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4464    {
4465       return RFAILED;
4466    }
4467
4468    ulCfg->uplinkBWP_ToReleaseList = NULLP;
4469    ulCfg->uplinkBWP_ToAddModList = NULLP;
4470    ulCfg->firstActiveUplinkBWP_Id = NULLP;
4471    DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4472    if(!ulCfg->firstActiveUplinkBWP_Id)
4473    {
4474       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4475       return RFAILED;
4476    }
4477    *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4478
4479    ulCfg->pusch_ServingCellConfig = NULLP;
4480    DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4481          sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4482    if(!ulCfg->pusch_ServingCellConfig)
4483    {
4484       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4485       return RFAILED;
4486    }
4487
4488    if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4489    {
4490       return RFAILED;
4491    }
4492
4493    ulCfg->carrierSwitching = NULLP;
4494    ulCfg->ext1 = NULLP;
4495    return ROK;
4496 }
4497
4498 /*******************************************************************
4499  *
4500  * @brief Builds PDSCH serving cell config
4501  * @details
4502  *
4503  *    Function : BuildPdschSrvCellCfg
4504  *
4505  *    Functionality: Builds PDSCH serving cell config in spCellCfgDed
4506  *
4507  * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg 
4508  *
4509  * @return ROK     - success
4510  *         RFAILED - failure
4511  *
4512  * ****************************************************************/
4513 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4514 {
4515    pdschCfg->present =  ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4516    pdschCfg->choice.setup = NULLP;
4517    DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4518    if(!pdschCfg->choice.setup)
4519    {
4520       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4521       return RFAILED;
4522    }
4523
4524    pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4525    pdschCfg->choice.setup->xOverhead = NULLP;
4526    pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4527    DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4528    if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4529    {
4530       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4531       return RFAILED;
4532    }
4533    *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4534    pdschCfg->choice.setup->pucch_Cell = NULLP;
4535    pdschCfg->choice.setup->ext1 = NULLP;
4536
4537    return ROK;
4538 }
4539
4540 /*******************************************************************
4541  *
4542  * @brief Builds CSI Meas config
4543  * @details
4544  *
4545  *    Function : BuildCsiMeasCfg 
4546  *
4547  *    Functionality: Builds CSI Meas config in spCellCfgDed
4548  *
4549  * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4550  *
4551  * @return ROK     - success
4552  *         RFAILED - failure
4553  *
4554  * ****************************************************************/
4555 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4556 {
4557
4558    return ROK;
4559 }
4560
4561 /*******************************************************************
4562  *
4563  * @brief Builds Spcell config dedicated
4564  * @details
4565  *
4566  *    Function : BuildSpCellCfgDed
4567  *
4568  *    Functionality: Builds sp cell config dedicated in spCellCfg
4569  *
4570  * @params[in] ServingCellConfig_t srvCellCfg
4571  *
4572  * @return ROK     - success
4573  *         RFAILED - failure
4574  *
4575  * ****************************************************************/
4576 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4577 {
4578    srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4579    DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
4580    if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
4581    {
4582       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4583       return RFAILED;
4584    }
4585
4586    srvCellCfg->initialDownlinkBWP = NULLP;
4587    DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4588    if(!srvCellCfg->initialDownlinkBWP)
4589    {
4590       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4591       return RFAILED;
4592    }
4593
4594    if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4595    {
4596       DU_LOG("\nERROR  -->  F1AP : BuildInitialDlBWP failed");
4597       return RFAILED;
4598    }
4599    srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4600    srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4601
4602    srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4603    DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4604    if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4605    {
4606       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4607       return RFAILED;
4608    }
4609    *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4610
4611    srvCellCfg->bwp_InactivityTimer = NULLP;
4612
4613    srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4614    DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4615    if(!srvCellCfg->defaultDownlinkBWP_Id)
4616    {
4617       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4618       return RFAILED;
4619    }
4620    *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4621
4622    srvCellCfg->uplinkConfig = NULLP;
4623    DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4624    if(!srvCellCfg->uplinkConfig)
4625    {
4626       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4627       return RFAILED;
4628    }
4629
4630    if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4631    {
4632       DU_LOG("\nERROR  -->  F1AP : BuildUlCfg failed");
4633       return RFAILED;
4634    }
4635    srvCellCfg->supplementaryUplink = NULLP;
4636    srvCellCfg->pdcch_ServingCellConfig = NULLP;
4637
4638    srvCellCfg->pdsch_ServingCellConfig = NULLP;
4639    DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct  ServingCellConfig__pdsch_ServingCellConfig));
4640    if(!srvCellCfg->pdsch_ServingCellConfig)
4641    {
4642       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4643       return RFAILED;
4644    }
4645
4646    if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4647    {
4648       DU_LOG("\nERROR  -->  F1AP : BuildPdschSrvCellCfg failed");
4649       return RFAILED;
4650    }
4651
4652    srvCellCfg->csi_MeasConfig = NULLP;
4653 #if 0
4654    DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct   ServingCellConfig__csi_MeasConfig))
4655       if(!srvCellCfg->csi_MeasConfig)
4656       {
4657          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4658          return RFAILED;
4659       }
4660
4661    if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4662    {
4663       DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4664       return RFAILED;
4665    }
4666 #endif
4667    srvCellCfg->sCellDeactivationTimer = NULLP;
4668    srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4669    srvCellCfg->tag_Id = TAG_ID;
4670    srvCellCfg->dummy = NULLP;
4671    srvCellCfg->pathlossReferenceLinking = NULLP;
4672    srvCellCfg->servingCellMO = NULLP;
4673    srvCellCfg->ext1 = NULLP;
4674
4675    return ROK;
4676 }
4677 /*******************************************************************
4678  *
4679  * @brief Builds Spcell config 
4680  *
4681  * @details
4682  *
4683  *    Function : BuildSpCellCfg 
4684  *
4685  *    Functionality: Builds sp cell config in DuToCuRrcContainer
4686  *
4687  * @params[in] SpCellConfig_t spCellCfg
4688  *
4689  * @return ROK     - success
4690  *         RFAILED - failure
4691  *
4692  * ****************************************************************/
4693 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4694 {
4695
4696    spCellCfg->servCellIndex = NULLP;
4697    DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4698    if(!spCellCfg->servCellIndex)
4699    {
4700       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4701       return RFAILED;
4702    }
4703    *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4704
4705    spCellCfg->reconfigurationWithSync = NULLP;
4706    spCellCfg->rlf_TimersAndConstants = NULLP;
4707    spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4708    DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4709    if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4710    {
4711       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4712       return RFAILED;
4713    }
4714    *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4715
4716    spCellCfg->spCellConfigDedicated = NULLP;
4717    DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4718    if(!spCellCfg->spCellConfigDedicated)
4719    {
4720       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4721       return RFAILED;
4722    }
4723    if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4724    {
4725       DU_LOG("\nERROR  -->  F1AP : BuildSpCellCfgDed failed");
4726       return RFAILED;
4727    }
4728    return ROK;
4729 }
4730 /*******************************************************************
4731  *
4732  * @brief Builds Phy cell group config 
4733  *
4734  * @details
4735  *
4736  *    Function : BuildPhyCellGrpCfg 
4737  *
4738  *    Functionality: Builds Phy cell group config in DuToCuRrcContainer
4739  *
4740  * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg 
4741  *
4742  * @return ROK     - success
4743  *         RFAILED - failure
4744  *
4745  * ****************************************************************/
4746 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4747 {
4748    phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4749    phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4750
4751    phyCellGrpCfg->p_NR_FR1 = NULLP;
4752    DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4753    if(!phyCellGrpCfg->p_NR_FR1)
4754    {
4755       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4756       return RFAILED;
4757    }
4758    *(phyCellGrpCfg->p_NR_FR1)             = P_NR_FR1;
4759    phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4760    phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4761    phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4762    phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4763    phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4764    phyCellGrpCfg->cs_RNTI = NULLP;
4765    phyCellGrpCfg->ext1 = NULLP;
4766    phyCellGrpCfg->ext2 = NULLP;
4767
4768    return ROK;
4769 }
4770 /*******************************************************************
4771  *
4772  * @brief Builds Mac cell group config 
4773  *
4774  * @details
4775  *
4776  *    Function : BuildMacCellGrpCfg 
4777  *
4778  *    Functionality: Builds Mac cell group config in DuToCuRrcContainer
4779  *
4780  * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4781  *
4782  * @return ROK     - success
4783  *         RFAILED - failure
4784  *
4785  * ****************************************************************/
4786 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4787 {
4788    macCellGrpCfg->drx_Config = NULLP;
4789    macCellGrpCfg->schedulingRequestConfig = NULLP;
4790    DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4791    if(!macCellGrpCfg->schedulingRequestConfig)
4792    {
4793       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4794       return RFAILED;
4795    }
4796
4797    if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4798    {
4799       DU_LOG("\nERROR  -->  F1AP : BuildSchedulingReqConfig failed");
4800       return RFAILED;
4801    }
4802
4803    macCellGrpCfg->bsr_Config = NULLP;
4804    DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4805    if(!macCellGrpCfg->bsr_Config)
4806    {
4807       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4808       return RFAILED;
4809    }
4810
4811    if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4812    {
4813       DU_LOG("\nERROR  -->  F1AP : BuildBsrConfig failed");
4814       return RFAILED;
4815    }
4816
4817    macCellGrpCfg->tag_Config = NULLP;
4818    DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4819    if(!macCellGrpCfg->tag_Config)
4820    {
4821       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4822       return RFAILED;
4823    }
4824
4825    if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4826    {
4827       DU_LOG("\nERROR  -->  F1AP : BuildTagConfig failed");
4828       return RFAILED;
4829    }
4830
4831    macCellGrpCfg->phr_Config = NULLP;
4832    DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4833    if(!macCellGrpCfg->phr_Config)
4834    {
4835       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4836       return RFAILED;
4837    }
4838
4839    if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4840    {
4841       DU_LOG("\nERROR  -->  F1AP : BuildPhrConfig failed");
4842       return RFAILED;
4843    }
4844
4845    macCellGrpCfg->skipUplinkTxDynamic = false;
4846    macCellGrpCfg->ext1 = NULLP;
4847
4848    return ROK;
4849 }
4850 /*******************************************************************
4851  *
4852  * @brief Frees memeory allocated for SearchSpcToAddModList
4853  *
4854  * @details
4855  *
4856  *    Function : FreeSearchSpcToAddModList
4857  *
4858  *    Functionality: Deallocating memory of SearchSpcToAddModList
4859  *
4860  * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4861  *
4862  * @return void
4863  *
4864  4221 * ****************************************************************/
4865 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4866 {
4867    uint8_t idx1=0;
4868    uint8_t idx2=0;
4869    struct  SearchSpace *searchSpc=NULLP;
4870
4871    if(searchSpcList->list.array)
4872    {
4873       if(searchSpcList->list.array[idx2])
4874       {
4875          searchSpc = searchSpcList->list.array[idx2];
4876          if(searchSpc->controlResourceSetId)
4877          {
4878             if(searchSpc->monitoringSlotPeriodicityAndOffset)
4879             {
4880                if(searchSpc->monitoringSymbolsWithinSlot)
4881                {
4882                   if(searchSpc->monitoringSymbolsWithinSlot->buf)
4883                   {
4884                      if(searchSpc->nrofCandidates)
4885                      {
4886                         if(searchSpc->searchSpaceType)
4887                         {
4888                            DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4889                                  sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4890                            DU_FREE(searchSpc->searchSpaceType, sizeof(struct
4891                                     SearchSpace__searchSpaceType));
4892                         }
4893                         DU_FREE(searchSpc->nrofCandidates,
4894                               sizeof(struct SearchSpace__nrofCandidates));
4895                      }
4896                      DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4897                            searchSpc->monitoringSymbolsWithinSlot->size);
4898                   }
4899                   DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4900                         sizeof(BIT_STRING_t));
4901                }
4902                DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4903                      sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4904             }
4905             DU_FREE(searchSpc->controlResourceSetId,
4906                   sizeof(ControlResourceSetId_t));
4907          }
4908       }
4909       for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4910       {
4911          DU_FREE(searchSpcList->list.array[idx1],
4912                sizeof(struct SearchSpace));
4913       }
4914       DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4915    }
4916 }
4917 /*******************************************************************
4918  *
4919  * @brief Frees memory allocated for PdschTimeDomAllocList
4920  *
4921  * @details
4922  *
4923  *    Function : FreePdschTimeDomAllocList
4924  *
4925  *    Functionality: Deallocating memory of PdschTimeDomAllocList
4926  *
4927  * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4928  *
4929  * @return void
4930  *
4931  4221 * ****************************************************************/
4932 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4933 {
4934    uint8_t idx1=0;
4935
4936    if(timeDomAllocList->choice.setup)
4937    {
4938       if(timeDomAllocList->choice.setup->list.array)
4939       {
4940          for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4941          {
4942             DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4943                   sizeof(struct PDSCH_TimeDomainResourceAllocation));
4944          }
4945          DU_FREE(timeDomAllocList->choice.setup->list.array, \
4946                timeDomAllocList->choice.setup->list.size);
4947       }
4948       DU_FREE(timeDomAllocList->choice.setup,\
4949             sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4950    }
4951 }
4952 /*******************************************************************
4953  *
4954  * @brief Frees memory allocated for PuschTimeDomAllocList
4955  *
4956  *@details
4957  *
4958  *    Function : FreePuschTimeDomAllocList
4959  *
4960  *    Functionality: Deallocating memory of PuschTimeDomAllocList
4961  *
4962  * @params[in] PUSCH_Config_t *puschCfg
4963  *
4964  * @return void
4965  *
4966  * ****************************************************************/
4967 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4968 {
4969    uint8_t idx1=0;
4970    uint8_t idx2=0;
4971    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4972
4973    if(puschCfg->pusch_TimeDomainAllocationList)
4974    {
4975       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4976       if(timeDomAllocList_t->choice.setup)
4977       {
4978          if(timeDomAllocList_t->choice.setup->list.array)
4979          {
4980             DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4981             for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4982             {
4983                DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4984                      sizeof(PUSCH_TimeDomainResourceAllocation_t));
4985             }
4986             DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4987                   timeDomAllocList_t->choice.setup->list.size);
4988          }
4989          DU_FREE(timeDomAllocList_t->choice.setup, \
4990                sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4991       }
4992       DU_FREE(puschCfg->transformPrecoder, sizeof(long));
4993       DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4994             sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4995    }
4996
4997 }
4998 /*******************************************************************
4999  *
5000  * @brief Frees memory allocated for InitialUlBWP
5001  *
5002  * @details
5003  *
5004  *    Function : FreeInitialUlBWP
5005  *
5006  *    Functionality: Deallocating memory of InitialUlBWP
5007  *
5008  * @params[in] BWP_UplinkDedicated_t *ulBwp
5009  *
5010  * @return void
5011  *
5012  * ****************************************************************/
5013 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5014 {
5015    uint8_t  rSetIdx, rsrcIdx;
5016    SRS_Config_t   *srsCfg = NULLP;
5017    PUSCH_Config_t *puschCfg = NULLP;
5018    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5019    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5020    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5021    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5022
5023    if(ulBwp->pusch_Config)
5024    {
5025       if(ulBwp->pusch_Config->choice.setup)
5026       {
5027          puschCfg=ulBwp->pusch_Config->choice.setup;
5028          if(puschCfg->dataScramblingIdentityPUSCH)
5029          {
5030             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5031             {
5032                FreePuschTimeDomAllocList(puschCfg);
5033                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5034                if(dmrsUlCfg->choice.setup)
5035                {
5036                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5037                   {
5038                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5039                      {
5040                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5041                               sizeof(long));
5042                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5043                               sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5044                      }
5045                      DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5046                            sizeof(long));
5047                   }
5048                   DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5049                }
5050                DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5051                      sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5052             }
5053             DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5054          }
5055          DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5056       }
5057       DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5058
5059       /* Free SRS-Config */
5060       if(ulBwp->srs_Config)
5061       {
5062          if(ulBwp->srs_Config->choice.setup)
5063          {
5064             srsCfg = ulBwp->srs_Config->choice.setup;
5065
5066             /* Free Resource Set to add/mod list */
5067             if(srsCfg->srs_ResourceSetToAddModList)
5068             {
5069                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5070                if(rsrcSetList->list.array)
5071                {
5072                   rSetIdx = 0;
5073
5074                   /* Free SRS resource Id list in this SRS resource set */
5075                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5076                   {
5077                      rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5078
5079                      if(rsrcIdList->list.array)
5080                      {
5081                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5082                         {
5083                            DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5084                         }
5085                         DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5086                      }
5087                      DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5088                            sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5089                   }
5090
5091                   /* Free resource type info for this SRS resource set */
5092                   DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5093                         sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5094
5095                   /* Free memory for each resource set */
5096                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5097                   {
5098                      DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5099                   }
5100                   DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size); 
5101                }
5102                DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5103                      sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5104             }
5105
5106             /* Free resource to add/modd list */
5107             if(srsCfg->srs_ResourceToAddModList)
5108             {
5109                resourceList = srsCfg->srs_ResourceToAddModList;
5110                if(resourceList->list.array)
5111                {
5112                   rsrcIdx = 0;
5113                   DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5114                         sizeof(struct SRS_Resource__transmissionComb__n2));
5115                   DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5116                         sizeof(struct SRS_Resource__resourceType__aperiodic));
5117
5118                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5119                   {
5120                      DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5121                   }
5122                   DU_FREE(resourceList->list.array, resourceList->list.size);
5123                }
5124                DU_FREE(srsCfg->srs_ResourceToAddModList, \
5125                      sizeof(struct SRS_Config__srs_ResourceToAddModList));
5126             }
5127
5128             DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5129          }
5130          DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5131       }
5132    }
5133 }       
5134 /*******************************************************************
5135  *
5136  * @brief Frees memory allocated for initialUplinkBWP
5137  *
5138  * @details
5139  *
5140  *    Function : FreeinitialUplinkBWP
5141  *
5142  *    Functionality: Deallocating memory of initialUplinkBWP
5143  *
5144  * @params[in] UplinkConfig_t *ulCfg
5145  *
5146  * @return void
5147  *         
5148  *
5149  * ****************************************************************/
5150 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5151 {
5152    BWP_UplinkDedicated_t *ulBwp=NULLP; 
5153    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5154
5155    if(ulCfg->initialUplinkBWP)
5156    {
5157       ulBwp=ulCfg->initialUplinkBWP;
5158       if(ulCfg->firstActiveUplinkBWP_Id)
5159       {
5160          if(ulCfg->pusch_ServingCellConfig)
5161          {
5162             puschCfg=ulCfg->pusch_ServingCellConfig;
5163             if(puschCfg->choice.setup)
5164             {
5165                if(puschCfg->choice.setup->ext1)
5166                {
5167                   DU_FREE(puschCfg->choice.setup->ext1->\
5168                         processingType2Enabled,sizeof(BOOLEAN_t));
5169                   DU_FREE(puschCfg->choice.setup->ext1->\
5170                         maxMIMO_Layers,sizeof(long));
5171                   DU_FREE(puschCfg->choice.setup->ext1, \
5172                         sizeof(struct PUSCH_ServingCellConfig__ext1));
5173                }
5174                DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5175             }
5176             DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5177          }
5178          DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5179       }
5180       FreeInitialUlBWP(ulBwp);
5181       DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5182    }
5183 }
5184 /*******************************************************************
5185  *
5186  * @brief Frees emmory allocated for BWPDlDedPdschCfg
5187  *
5188  * @details
5189  *
5190  *    Function : FreeBWPDlDedPdschCfg
5191  *
5192  *    Functionality: Deallocating memory of BWPDlDedPdschCfg
5193  *
5194  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5195  *
5196  * @return void
5197  *
5198  *
5199  * ****************************************************************/
5200 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5201 {
5202    struct PDSCH_Config *pdschCfg=NULLP;
5203    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5204    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5205    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5206
5207    if(dlBwp->pdsch_Config->choice.setup)
5208    {
5209       pdschCfg=dlBwp->pdsch_Config->choice.setup;
5210       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5211       {
5212          if(pdschCfg->pdsch_TimeDomainAllocationList)
5213          {
5214             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5215             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5216             {
5217                prbBndlType=&pdschCfg->prb_BundlingType;
5218                DU_FREE(prbBndlType->choice.staticBundling,\
5219                      sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5220                DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5221             }
5222             FreePdschTimeDomAllocList(timeDomAllocList);
5223             DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5224                   sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5225          }
5226          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5227          if(dmrsDlCfg->choice.setup)
5228          {
5229             DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5230                   sizeof(long));
5231             DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5232          }
5233          DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5234                sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5235       }
5236       DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5237    }
5238 }
5239 /*******************************************************************
5240  *
5241  * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5242  *
5243  * @details
5244  *
5245  *    Function : FreeBWPDlDedPdcchCfg
5246  *
5247  *    Functionality: Deallocating memory of BWPDlDedPdcchCfg
5248  *
5249  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5250  *
5251  * @return void
5252  *         
5253  *
5254  * ****************************************************************/
5255 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5256 {
5257    uint8_t idx1=0;
5258    uint8_t idx2=0;
5259    struct PDCCH_Config *pdcchCfg=NULLP;
5260    struct ControlResourceSet *controlRSet=NULLP;
5261    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5262
5263    if(dlBwp->pdcch_Config->choice.setup)
5264    {
5265       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5266       if(pdcchCfg->controlResourceSetToAddModList)
5267       {
5268          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5269          if(controlRSetList->list.array)
5270          {
5271             controlRSet = controlRSetList->list.array[idx2];
5272             if(controlRSet)
5273             {
5274                if(controlRSet->frequencyDomainResources.buf)
5275                {
5276                   if(controlRSet->pdcch_DMRS_ScramblingID)
5277                   {
5278                      if(pdcchCfg->searchSpacesToAddModList)
5279                      {
5280                         FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5281                         DU_FREE(pdcchCfg->searchSpacesToAddModList, \
5282                               sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5283                      }
5284                      DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5285                   }
5286                   DU_FREE(controlRSet->frequencyDomainResources.buf, \
5287                         controlRSet->frequencyDomainResources.size);
5288                }
5289             }
5290             for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5291             {
5292                DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5293             }
5294             DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5295          }
5296          DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5297                sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5298       }
5299       DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5300    }
5301 }       
5302
5303 /*******************************************************************
5304  *
5305  * @brief Frees emmory allocated for DUToCURRCContainer 
5306  *
5307  * @details
5308  *
5309  *    Function : FreeMemDuToCuRrcCont
5310  *
5311  *    Functionality: Deallocating memory of DuToCuRrcContainer
5312  *
5313  * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
5314  *
5315  * @return ROK     - success
5316  *         RFAILED - failure
5317  *
5318  * ****************************************************************/
5319 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
5320 {
5321    uint8_t idx=0;
5322    SpCellConfig_t *spCellCfg=NULLP;
5323    ServingCellConfig_t *srvCellCfg=NULLP;
5324    BWP_DownlinkDedicated_t *dlBwp=NULLP;
5325    MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5326    PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5327    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5328    struct RLC_Config *rlcConfig=NULLP;
5329    struct LogicalChannelConfig *macLcConfig=NULLP;
5330    struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5331    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5332    struct TAG_Config *tagConfig=NULLP;
5333    struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5334    struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5335    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5336
5337    rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5338    if(rlcBearerList)
5339    {
5340       if(rlcBearerList->list.array)
5341       {
5342          for(idx=0; idx<rlcBearerList->list.count; idx++)
5343          {
5344             if(rlcBearerList->list.array[idx])
5345             {  
5346                rlcConfig   = rlcBearerList->list.array[idx]->rlc_Config;
5347                macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5348                if(rlcConfig)
5349                {
5350                   if(rlcConfig->choice.am)
5351                   {
5352                      DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5353                      DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
5354                      DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5355                   }     
5356                   DU_FREE(rlcConfig, sizeof(struct RLC_Config));
5357                }
5358                DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5359                if(macLcConfig)
5360                {
5361                   if(macLcConfig->ul_SpecificParameters)
5362                   {
5363                      DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID,   sizeof(SchedulingRequestId_t));
5364                      DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup,   sizeof(long));
5365                      DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5366                   }
5367                   DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5368                }
5369                DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5370             }   
5371          }
5372          DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5373       }
5374       DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5375    }
5376
5377    macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5378    if(macCellGrpCfg)
5379    {
5380       schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; 
5381       if(schedulingRequestConfig)
5382       {
5383          schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5384          if(schReqList)
5385          {
5386             if(schReqList->list.array)
5387             {
5388                for(idx=0;idx<schReqList->list.count; idx++)
5389                {
5390                   if(schReqList->list.array[idx])
5391                   {
5392                      DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5393                      DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5394                   }
5395                }
5396                DU_FREE(schReqList->list.array, schReqList->list.size);
5397             }
5398             DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5399                   sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));    }
5400             DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5401       }
5402       if(macCellGrpCfg->bsr_Config)
5403       {
5404          DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5405       }
5406       tagConfig = macCellGrpCfg->tag_Config;
5407       if(tagConfig)
5408       {
5409          tagList = tagConfig->tag_ToAddModList;
5410          if(tagList)
5411          {
5412             if(tagList->list.array)
5413             {
5414                for(idx=0; idx<tagList->list.count; idx++)
5415                {
5416                   DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5417                }
5418                DU_FREE(tagList->list.array, tagList->list.size);
5419             }
5420             DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5421          }
5422          DU_FREE(tagConfig, sizeof(struct TAG_Config));
5423       }
5424
5425       phrConfig = macCellGrpCfg->phr_Config;
5426       if(phrConfig)
5427       {
5428          DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5429          DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5430       }
5431
5432       DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5433    }
5434
5435    phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5436    if(phyCellGrpCfg)
5437    {
5438       DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5439       DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5440    }
5441
5442    spCellCfg = cellGrpCfg->spCellConfig;
5443    if(spCellCfg)
5444    {
5445       if(spCellCfg->servCellIndex)
5446       {
5447          if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5448          {
5449             if(spCellCfg->spCellConfigDedicated)
5450             {
5451                srvCellCfg = spCellCfg->spCellConfigDedicated;
5452                if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
5453                {
5454                   if(srvCellCfg->initialDownlinkBWP)
5455                   {
5456                      dlBwp = srvCellCfg->initialDownlinkBWP;
5457                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
5458                      {
5459                         if(srvCellCfg->defaultDownlinkBWP_Id)
5460                         {
5461                            if(srvCellCfg->uplinkConfig)
5462                            {
5463                               if(srvCellCfg->pdsch_ServingCellConfig)
5464                               {
5465                                  pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5466                                  if(pdschCfg->choice.setup)
5467                                  {
5468                                     DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5469                                     DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5470                                  }
5471                                  DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5472                                        ServingCellConfig__pdsch_ServingCellConfig));
5473                               }  
5474                               FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5475                               DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));        
5476                            }
5477                            DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5478                         }
5479                         DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5480                      }
5481                      if(dlBwp->pdcch_Config)
5482                      {
5483                         if(dlBwp->pdsch_Config)
5484                         {
5485                            FreeBWPDlDedPdschCfg(dlBwp);
5486                            DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5487                         }
5488                         FreeBWPDlDedPdcchCfg(dlBwp);
5489                         DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5490                     }
5491                     DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5492                   }
5493                   DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
5494                }
5495                DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5496             }
5497             DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5498          }
5499          DU_FREE(spCellCfg->servCellIndex, sizeof(long));
5500       }
5501       DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5502    }
5503    return ROK;
5504 }
5505 /*******************************************************************
5506  *
5507  * @brief Builds DU To CU RRC Container 
5508  *
5509  * @details
5510  *
5511  *    Function : BuildDuToCuRrcContainer 
5512  *
5513  *    Functionality: Builds DuToCuRrcContainer
5514  *
5515  * @params[in] idx, index in F1AP msg
5516  *             DuToCuRRCContainer, DuToCuRRCContainer
5517  *
5518  * @return ROK     - success
5519  *         RFAILED - failure
5520  *
5521  * ****************************************************************/
5522 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
5523 {
5524    uint8_t  ret = ROK;
5525    CellGroupConfigRrc_t  cellGrpCfg;
5526    asn_enc_rval_t        encRetVal;
5527    memset(&cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
5528    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5529
5530    while(true)
5531    {
5532       cellGrpCfg.cellGroupId = CELL_GRP_ID;
5533
5534       cellGrpCfg.rlc_BearerToAddModList = NULLP;
5535       DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5536       if(!cellGrpCfg.rlc_BearerToAddModList)
5537       {
5538          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5539          ret = RFAILED;
5540          break;
5541       }
5542       if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5543       {
5544          DU_LOG("\nERROR  -->  F1AP : BuildRlcBearerToAddModList failed");
5545          ret = RFAILED;
5546          break;
5547       }
5548
5549       cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5550       cellGrpCfg.mac_CellGroupConfig = NULLP;
5551       DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5552       if(!cellGrpCfg.mac_CellGroupConfig)
5553       {
5554          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5555          ret = RFAILED;
5556          break;
5557       }
5558       if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5559       {
5560          DU_LOG("\nERROR  -->  F1AP : BuildMacCellGrpCfg failed");
5561          ret = RFAILED;
5562          break;
5563       }
5564
5565       cellGrpCfg.physicalCellGroupConfig = NULLP;
5566       DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5567       if(!cellGrpCfg.physicalCellGroupConfig)
5568       {
5569          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5570          ret = RFAILED;
5571          break;
5572       }
5573       if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5574       {
5575          DU_LOG("\nERROR  -->  F1AP : BuildPhyCellGrpCfg failed");
5576          ret = RFAILED;
5577          break;
5578       }
5579
5580       cellGrpCfg.spCellConfig = NULLP;
5581       DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5582       if(!cellGrpCfg.spCellConfig)
5583       {
5584          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5585          ret = RFAILED;
5586          break;
5587       }
5588       if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5589       {
5590          DU_LOG("\nERROR  -->  F1AP : BuildSpCellCfg failed");
5591          ret = RFAILED;
5592          break;
5593       }
5594
5595       cellGrpCfg.sCellToAddModList = NULLP;
5596       cellGrpCfg.sCellToReleaseList = NULLP;
5597       cellGrpCfg.ext1 = NULLP;
5598
5599       /* encode cellGrpCfg into duToCuRrcContainer */
5600       xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5601       memset(encBuf, 0, ENC_BUF_MAX_LEN);
5602       encBufSize = 0;
5603       encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5604       /* Encode results */
5605       if(encRetVal.encoded == ENCODE_FAIL)
5606       {
5607          DU_LOG( "\nERROR  --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5608                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5609          ret = RFAILED;
5610          break;
5611       }
5612       else
5613       {
5614          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5615          for(int i=0; i< encBufSize; i++)
5616          {
5617             printf("%x",encBuf[i]);
5618          }
5619       }
5620
5621       duToCuRrcContainer->size = encBufSize;
5622       DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
5623       if(!duToCuRrcContainer->buf)
5624       {
5625          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5626          ret = RFAILED;
5627          break;
5628       }
5629       if(ret == ROK)
5630       {
5631          memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
5632       }
5633       break;
5634    }
5635    FreeMemDuToCuRrcCont(&cellGrpCfg);
5636    return ret;
5637 }
5638
5639 /*******************************************************************
5640  *
5641  * @brief Free memory allocated in InitialULRRCMessage
5642  *
5643  * @details
5644  *
5645  *    Function : freeInitUlRrcMsgTransfer
5646  *
5647  *    Functionality: Free memory allocated in InitialULRRCMessage
5648  *
5649  * @params[in]F1AP_PDU_t  *f1apMsg)
5650  *
5651  * @return ROK     - success
5652  *         RFAILED - failure
5653  *
5654  * ****************************************************************/
5655
5656 uint8_t freeInitUlRrcMsgTransfer(F1AP_PDU_t  *f1apMsg)
5657 {
5658    uint8_t ieIdx, arrIdx;
5659    InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
5660
5661    if(f1apMsg)
5662    {
5663       if(f1apMsg->choice.initiatingMessage)
5664       {
5665          initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.\
5666             choice.InitialULRRCMessageTransfer;
5667          if(initULRRCMsg->protocolIEs.list.array)
5668          {
5669             for(ieIdx = 0; ieIdx < initULRRCMsg->protocolIEs.list.count; ieIdx++)
5670             {
5671                switch(initULRRCMsg->protocolIEs.list.array[ieIdx]->id)
5672                {
5673                   case ProtocolIE_ID_id_NRCGI:
5674                   {
5675                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf)
5676                      {
5677                         if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf)
5678                         {
5679                            DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf,\
5680                            initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.size);
5681                         }
5682                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf,\
5683                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.size);
5684                      }
5685                      break;
5686                   }
5687                   case ProtocolIE_ID_id_RRCContainer:
5688                   {
5689                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5690                      {
5691                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
5692                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5693                      }
5694                      break;
5695                   }
5696                   case ProtocolIE_ID_id_DUtoCURRCContainer:
5697                   {
5698                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf)
5699                      {
5700                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf,
5701                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.size);
5702                      }
5703                      break;
5704                   }
5705                   default:
5706                      break;
5707                }
5708              }
5709              for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
5710              {
5711                 if(initULRRCMsg->protocolIEs.list.array[arrIdx])
5712                 {
5713                    DU_FREE(initULRRCMsg->protocolIEs.list.array[arrIdx],\
5714                       sizeof(InitialULRRCMessageTransferIEs_t));
5715                 }
5716              }
5717              DU_FREE(initULRRCMsg->protocolIEs.list.array, initULRRCMsg->protocolIEs.list.size);
5718           }
5719          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5720       }
5721       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
5722    }
5723    else
5724    {
5725       DU_LOG("\nERROR  -->  DU_APP : Recevied F1ap Pdu is null at freeInitUlRrcMsgTransfer()");
5726       return RFAILED;
5727    }
5728    return ROK;
5729 }
5730
5731 /*******************************************************************
5732  *
5733  * @brief Builds and sends the InitialULRRCMessage 
5734  *
5735  * @details
5736  *
5737  *    Function : BuildAndSendInitialRrcMsgTransfer 
5738  *
5739  *    Functionality: Constructs the Initial UL RRC Message Transfer and sends
5740  *                   it to the CU through SCTP.
5741  *
5742  * @params[in] 
5743  *
5744  * @return ROK     - success
5745  *         RFAILED - failure
5746  *
5747  * ****************************************************************/
5748 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
5749       uint16_t rrcContSize, uint8_t *rrcContainer)
5750 {
5751    uint8_t   ret;
5752    uint8_t   elementCnt;
5753    uint8_t   ieIdx;
5754    asn_enc_rval_t  encRetVal;
5755    F1AP_PDU_t  *f1apMsg = NULLP;
5756    InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
5757    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5758
5759    while(true)
5760    {
5761       DU_LOG("\n INFO   -->  F1AP : Building RRC Setup Request\n");
5762       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5763       if(f1apMsg == NULLP)
5764       {
5765          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
5766          break;
5767       }
5768       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5769       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5770       if(f1apMsg->choice.initiatingMessage == NULLP)
5771       {
5772          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU failed");
5773          break;
5774       }
5775       f1apMsg->choice.initiatingMessage->procedureCode =\
5776                                                         ProcedureCode_id_InitialULRRCMessageTransfer;
5777       f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
5778       f1apMsg->choice.initiatingMessage->value.present = \
5779                                                          InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
5780       initULRRCMsg =\
5781                     &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
5782       elementCnt = 5;
5783       initULRRCMsg->protocolIEs.list.count = elementCnt;
5784       initULRRCMsg->protocolIEs.list.size = \
5785                                             elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
5786       /* Initialize the F1Setup members */
5787       DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5788       if(initULRRCMsg->protocolIEs.list.array == NULLP)
5789       {
5790          DU_LOG(" ERROR  -->  F1AP : Memory allocation for\
5791                RRCSetupRequestMessageTransferIEs failed");
5792          break;
5793       }
5794       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
5795       {
5796          DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx],\
5797                sizeof(InitialULRRCMessageTransferIEs_t));
5798          if(initULRRCMsg->protocolIEs.list.array[ieIdx] == NULLP)
5799          {
5800             break;
5801          }
5802       }
5803       ieIdx = 0;
5804       /*GNB DU UE F1AP ID*/
5805       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5806                                                         ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5807       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  = Criticality_reject;
5808       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
5809                                                                   InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
5810       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
5811
5812
5813       /*NRCGI*/
5814       ieIdx++;
5815       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5816                                                         ProtocolIE_ID_id_NRCGI;
5817       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  =Criticality_reject;
5818       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
5819                                                                   InitialULRRCMessageTransferIEs__value_PR_NRCGI;
5820
5821       ret =\
5822            BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
5823       if(ret!=ROK)
5824       {
5825          break;
5826       }
5827
5828       /*CRNTI*/
5829       ieIdx++;
5830       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5831                                                         ProtocolIE_ID_id_C_RNTI;
5832       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5833       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5834                                                                  InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
5835       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.C_RNTI = crnti;
5836
5837       /*RRCContainer*/
5838       ieIdx++;
5839       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5840                                                         ProtocolIE_ID_id_RRCContainer;
5841       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5842       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5843                                                                  InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
5844
5845       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = rrcContSize;
5846       DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
5847             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size)
5848       if(!initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5849       {
5850          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
5851          break;
5852       
5853       }
5854       memcpy(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, rrcContainer,
5855             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5856
5857
5858       /*DUtoCURRCContainer*/
5859       ieIdx++;
5860       initULRRCMsg->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCContainer;
5861       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5862       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5863                                                                  InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
5864
5865       ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer);
5866       if(ret != ROK)
5867       {
5868          break;
5869       }
5870
5871       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5872
5873       /* Encode the F1SetupRequest type as APER */
5874       memset(encBuf, 0, ENC_BUF_MAX_LEN);
5875       encBufSize = 0;
5876       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
5877       /* Encode results */
5878       if(encRetVal.encoded == ENCODE_FAIL)
5879       {
5880          DU_LOG( "\nERROR  --> F1AP : Could not encode Initial UL RRC Message Transfer\
5881                structure (at %s)\n",encRetVal.failed_type ? \
5882                encRetVal.failed_type->name : "unknown");
5883          ret = RFAILED;
5884          break;
5885       }
5886       else
5887       {
5888
5889          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for Initial UL RRC\
5890                Message transfer\n");
5891          for(int i=0; i< encBufSize; i++)
5892          {
5893             printf("%x",encBuf[i]);
5894          }
5895       }
5896       /* Sending  msg  */
5897       if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
5898       {
5899          DU_LOG("\nERROR  -->  F1AP : Sending Initial UL RRC Message Transfer Failed");
5900          ret = RFAILED;
5901          break;
5902       }
5903       break;
5904    }
5905    freeInitUlRrcMsgTransfer(f1apMsg);
5906    return ret;
5907 }/* End of BuildAndSendInitialRrcMsgTransfer*/
5908
5909 /*****  UE SETUP REQUEST *****/
5910
5911 /*******************************************************************
5912  *
5913  * @brief Free Qos And Snssai Drb Info
5914  *
5915  * @details
5916  *
5917  *    Function : freeDrbQosAndSnssaiInfo
5918  *
5919  *    Functionality: Free Qos And Snssai Drb Info
5920  *
5921  * @params[in] LcCfg *lcCfg,
5922  * @return void
5923  *
5924  * ****************************************************************/
5925 void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
5926 {
5927    if(lcCfg->snssai)
5928    {
5929       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
5930    }
5931    if(lcCfg->drbQos)
5932    {
5933       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
5934    }
5935 }
5936
5937 /******************************************************************
5938 *
5939 * @brief Function to delete the RLC Lc cfg from UE APP DB
5940 *
5941 * @details
5942 *
5943 *  Function : freeRlcLcCfg
5944 *
5945 *  Functionality: Function to delete the RLC Lc cfg from UE APP DB
5946 *
5947 *
5948  *****************************************************************/
5949
5950 void freeRlcLcCfg(RlcBearerCfg *lcCfg)
5951 {
5952    switch(lcCfg->rlcMode)
5953    {
5954       case RLC_AM :
5955       {
5956          if(lcCfg->u.amCfg)
5957          {
5958             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
5959             lcCfg->u.amCfg = NULLP;
5960          }
5961          break;
5962       }
5963       case RLC_UM_BI_DIRECTIONAL :
5964       {
5965          if(lcCfg->u.umBiDirCfg)
5966          {
5967             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
5968             lcCfg->u.umBiDirCfg = NULLP;
5969          }
5970          break;
5971       }
5972       case RLC_UM_UNI_DIRECTIONAL_UL :
5973       {
5974          if(lcCfg->u.umUniDirUlCfg)
5975          {
5976             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
5977             lcCfg->u.umUniDirUlCfg = NULLP;
5978          }
5979          break;
5980
5981       }
5982       case RLC_UM_UNI_DIRECTIONAL_DL :
5983       {
5984          if(lcCfg->u.umUniDirDlCfg)
5985          {
5986             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
5987             lcCfg->u.umUniDirDlCfg = NULLP;
5988          }
5989          break;
5990       }
5991       default:
5992          DU_LOG("\nERROR  -->  DU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode);
5993          break;
5994    }
5995    memset(lcCfg, 0, sizeof(LcCfg));
5996 }
5997 /*******************************************************************
5998  *
5999  * @brief Function to free MacLcCfg
6000  *
6001  * @details
6002  *
6003  *    Function : freeMacLcCfg
6004  *
6005  *    Functionality: Function to free MacLcCfg
6006  *
6007  * @params[in] LcCfg *lcCfg,
6008  * @return void
6009  *
6010  * ****************************************************************/
6011
6012 void  freeMacLcCfg(LcCfg *lcCfg)
6013 {
6014     /* Deleting DRBQOS */
6015    if(lcCfg->drbQos)
6016    {
6017       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
6018       lcCfg->drbQos = NULLP;
6019    }
6020    /* Deleting SNSSAI */
6021    if(lcCfg->snssai)
6022    {
6023       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
6024       lcCfg->snssai = NULLP;
6025    }
6026    memset(lcCfg, 0, sizeof(LcCfg));
6027 }
6028 /*******************************************************************
6029  *
6030  * @brief Free UE NR Capability received in UE Context setup request
6031  *
6032  * @details
6033  *
6034  *    Function : freeAperDecodeUeNrCapability
6035  *
6036  *    Functionality:  
6037  *       Free UE NR Capability received in UE Context setup request
6038  *
6039  * @params[in] 
6040  * @return ROK     - success
6041  *         RFAILED - failure
6042  *
6043  * ****************************************************************/
6044 void freeAperDecodeUeNrCapability(void *ueNrCapability)
6045 {
6046    uint8_t arrIdx =0;
6047    FeatureSets_t *featureSets =NULLP;
6048    UE_NR_Capability_t *ueNrCap = (UE_NR_Capability_t *)ueNrCapability;
6049
6050    if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6051    {
6052       for(arrIdx = 0; arrIdx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; arrIdx++)
6053       {
6054          if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx])
6055             free(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx]);
6056       }
6057       free(ueNrCap->rf_Parameters.supportedBandListNR.list.array);
6058    }
6059
6060    if(ueNrCap->featureSets)
6061    {
6062       featureSets = ueNrCap->featureSets;
6063       if(featureSets->featureSetsDownlinkPerCC)
6064       {
6065          if(featureSets->featureSetsDownlinkPerCC->list.array)
6066          {
6067             for(arrIdx = 0; arrIdx < featureSets->featureSetsDownlinkPerCC->list.count; arrIdx++)
6068             {
6069                if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx])
6070                {
6071                   if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL)
6072                      free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL);
6073                   free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]);
6074                }
6075             }
6076             free(featureSets->featureSetsDownlinkPerCC->list.array);
6077          }
6078          free(featureSets->featureSetsDownlinkPerCC);
6079       }
6080       if(featureSets->featureSetsUplinkPerCC)
6081       {
6082          if(featureSets->featureSetsUplinkPerCC->list.array)
6083          {
6084             for(arrIdx = 0; arrIdx < featureSets->featureSetsUplinkPerCC->list.count; arrIdx++)
6085             {
6086                if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx])
6087                {
6088                   if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL)
6089                      free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL);
6090                   free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]);
6091                }
6092             }
6093             free(featureSets->featureSetsUplinkPerCC->list.array);
6094          }
6095          free(featureSets->featureSetsUplinkPerCC);
6096       }
6097       free(ueNrCap->featureSets);
6098    }   
6099 }
6100
6101 /*******************************************************************
6102 *
6103 * @brief Function to free PdcchSearchSpcToAddModList
6104          where memory allocated by aper_decoder
6105 *
6106 * @details
6107 *
6108 *    Function : freeAperDecodePdcchSearchSpcToAddModList 
6109 *
6110 *    Functionality: Function to free PdcchSearchSpcToAddModList
6111 *
6112 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
6113 * @return void
6114 *
6115 * ****************************************************************/
6116
6117 void freeAperDecodePdcchSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
6118 {
6119    uint8_t searchSpcArrIdx=0;
6120    uint8_t searchSpcArrIdx1=0;
6121    struct  SearchSpace *searchSpc=NULLP;
6122
6123
6124    if(searchSpcList->list.array)
6125    {
6126       if(searchSpcList->list.array[searchSpcArrIdx1])
6127       {
6128          searchSpc = searchSpcList->list.array[searchSpcArrIdx1];
6129          if(searchSpc->controlResourceSetId)
6130          {
6131             if(searchSpc->monitoringSlotPeriodicityAndOffset)
6132             {
6133                if(searchSpc->monitoringSymbolsWithinSlot)
6134                {
6135                   if(searchSpc->monitoringSymbolsWithinSlot->buf)
6136                   {
6137                      if(searchSpc->nrofCandidates)
6138                      {
6139                         if(searchSpc->searchSpaceType)
6140                         {
6141                            free(searchSpc->searchSpaceType->choice.ue_Specific);
6142                            free(searchSpc->searchSpaceType);
6143                         }
6144                         free(searchSpc->nrofCandidates);
6145                      }
6146                      free(searchSpc->monitoringSymbolsWithinSlot->buf);
6147                   }
6148                   free(searchSpc->monitoringSymbolsWithinSlot);
6149                }
6150                free(searchSpc->monitoringSlotPeriodicityAndOffset);
6151             }
6152             free(searchSpc->controlResourceSetId);
6153          }
6154       }
6155       for(searchSpcArrIdx = 0; searchSpcArrIdx < searchSpcList->list.count; searchSpcArrIdx++)
6156       {
6157          free(searchSpcList->list.array[searchSpcArrIdx]);
6158       }
6159       free(searchSpcList->list.array);
6160    }
6161 }
6162 /*******************************************************************
6163 *
6164 * @brief Function for free part for the memory allocated by aper_decoder
6165
6166 * @details
6167 *
6168 *    Function : freeAperDecodeBWPDlDedPdcchConfig
6169 *
6170 *    Functionality: Function to free BWPDlDedPdcchConfig
6171 *
6172 * @params[in] 
6173 * @return void
6174 *
6175 * ****************************************************************/
6176
6177
6178 void freeAperDecodeBWPDlDedPdcchConfig(BWP_DownlinkDedicated_t *dlBwp)
6179 {
6180    uint8_t arrIdx1=0;
6181    uint8_t arrIdx2=0;
6182    struct PDCCH_Config *pdcchCfg=NULLP;
6183    struct ControlResourceSet *controlRSet=NULLP;
6184    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6185    
6186    if(dlBwp->pdcch_Config->choice.setup)
6187    {
6188       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6189       if(pdcchCfg->controlResourceSetToAddModList)
6190       {
6191          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6192          if(controlRSetList->list.array)
6193          {
6194             controlRSet = controlRSetList->list.array[arrIdx2];
6195             if(controlRSet)
6196             {
6197                if(controlRSet->frequencyDomainResources.buf)
6198                {
6199                   if(controlRSet->pdcch_DMRS_ScramblingID)
6200                   {
6201                      if(pdcchCfg->searchSpacesToAddModList)
6202                      {
6203                         freeAperDecodePdcchSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6204                         free(pdcchCfg->searchSpacesToAddModList);
6205                      }
6206                      free(controlRSet->pdcch_DMRS_ScramblingID);
6207                   }
6208                   free(controlRSet->frequencyDomainResources.buf);
6209                }
6210             }
6211             for(arrIdx1 = 0; arrIdx1 <controlRSetList->list.count; arrIdx1++)
6212             {
6213                free(controlRSetList->list.array[arrIdx1]);
6214             }
6215             free(controlRSetList->list.array);
6216          }
6217          free(pdcchCfg->controlResourceSetToAddModList);
6218       }
6219       free(dlBwp->pdcch_Config->choice.setup);
6220    }
6221 }
6222 /*******************************************************************
6223 *
6224 * @brief Function to free PdschTimeDomAllocationList 
6225 *     where the memory allocated by aper_decoder
6226
6227 * @details
6228 *
6229 *    Function : freeAperDecodePdschTimeDomAllocationList
6230 *
6231 *    Functionality: Function to free PdschTimeDomAllocationList
6232 *
6233 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList 
6234 * @return void
6235 *
6236 * ****************************************************************/
6237
6238
6239 void freeAperDecodePdschTimeDomAllocationList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
6240 {
6241    uint8_t arrIdx=0;
6242
6243    if(timeDomAllocList->choice.setup)
6244    {
6245       if(timeDomAllocList->choice.setup->list.array)
6246       {
6247          for(arrIdx = 0; arrIdx <timeDomAllocList->choice.setup->list.count ; arrIdx++)
6248          {
6249             free(timeDomAllocList->choice.setup->list.array[arrIdx]);
6250          }
6251          free(timeDomAllocList->choice.setup->list.array);
6252       }
6253       free(timeDomAllocList->choice.setup);
6254    }
6255 }
6256
6257 /*******************************************************************
6258 *
6259 * @brief Function to free BWPDlDedPdschConfig 
6260 *        where the memory allocated by aper_decoder
6261 *  
6262 * @details
6263 *
6264 *    Function : freeAperDecodeBWPDlDedPdschConfig 
6265 *
6266 *    Functionality: Function to free BWPDlDedPdschConfig 
6267 *
6268 * @params[in] BWP_DownlinkDedicated_t *dlBwp 
6269 * @return void
6270 *
6271 * ****************************************************************/
6272
6273
6274 void freeAperDecodeBWPDlDedPdschConfig(BWP_DownlinkDedicated_t *dlBwp)
6275 {
6276    struct PDSCH_Config *pdschCfg=NULLP;
6277    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6278    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6279    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6280
6281    if(dlBwp->pdsch_Config->choice.setup)
6282    {
6283       pdschCfg=dlBwp->pdsch_Config->choice.setup;
6284       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6285       {
6286          if(pdschCfg->pdsch_TimeDomainAllocationList)
6287          {
6288             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6289             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6290             {
6291                prbBndlType=&pdschCfg->prb_BundlingType;
6292                free(prbBndlType->choice.staticBundling);
6293                free(pdschCfg->maxNrofCodeWordsScheduledByDCI);
6294             }
6295             freeAperDecodePdschTimeDomAllocationList(timeDomAllocList);
6296             free(pdschCfg->pdsch_TimeDomainAllocationList);
6297          }
6298          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6299          if(dmrsDlCfg->choice.setup)
6300          {
6301             free(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition);
6302             free(dmrsDlCfg->choice.setup);
6303          }
6304          free(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA);
6305       }
6306       free(dlBwp->pdsch_Config->choice.setup);
6307    }
6308 }
6309 /*******************************************************************
6310 *
6311 * @brief Function to free PuschTimeDomAllocListCfg
6312                  where the memory allocated by aper_decoder
6313 *
6314 * @details
6315 *
6316 *    Function : freeAperDecodePuschTimeDomAllocListCfg
6317 *
6318 *    Functionality: Function to free PuschTimeDomAllocListCfg
6319 *
6320 * @params[in] PUSCH_Config_t *puschCfg 
6321 * @return void
6322 *
6323 * ****************************************************************/
6324
6325
6326 void freeAperDecodePuschTimeDomAllocListCfg(PUSCH_Config_t *puschCfg)
6327 {
6328    uint8_t arrIdx=0;
6329    uint8_t arrIdx1=0;
6330    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
6331
6332    if(puschCfg->pusch_TimeDomainAllocationList)
6333    {
6334       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
6335       if(timeDomAllocList_t->choice.setup)
6336       {
6337          if(timeDomAllocList_t->choice.setup->list.array)
6338          {
6339             free(timeDomAllocList_t->choice.setup->list.array[arrIdx1]->k2);
6340             for(arrIdx = 0; arrIdx<timeDomAllocList_t->choice.setup->list.count; arrIdx++)
6341             {
6342                free(timeDomAllocList_t->choice.setup->list.array[arrIdx]);
6343             }
6344             free(timeDomAllocList_t->choice.setup->list.array);
6345          }
6346          free(timeDomAllocList_t->choice.setup);
6347       }
6348       free(puschCfg->transformPrecoder);
6349       free(puschCfg->pusch_TimeDomainAllocationList);
6350    }
6351 }
6352 /*******************************************************************
6353 *
6354 * @brief Function to free InitialUlBWPConfig where memory allocated by aper_decoder
6355 *
6356 * @details
6357 *
6358 *    Function : freeAperDecodeInitialUlBWPConfig 
6359 *
6360 *    Functionality: Function to free InitialUlBWPConfig
6361 *
6362 * @params[in]  BWP_UplinkDedicated_t *ulBwp
6363 * @return void
6364 *
6365 * ****************************************************************/
6366
6367
6368 void freeAperDecodeInitialUlBWPConfig(BWP_UplinkDedicated_t *ulBwp)
6369 {
6370    uint8_t  rSetIdx =0;
6371    uint8_t  rsrcIdx =0;
6372    SRS_Config_t   *srsCfg = NULLP;
6373    PUSCH_Config_t *puschCfg = NULLP;
6374    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
6375    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
6376    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
6377    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
6378
6379    if(ulBwp->pusch_Config)
6380    {
6381       if(ulBwp->pusch_Config->choice.setup)
6382       {
6383          puschCfg=ulBwp->pusch_Config->choice.setup;
6384          if(puschCfg->dataScramblingIdentityPUSCH)
6385          {
6386             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
6387             {
6388                freeAperDecodePuschTimeDomAllocListCfg(puschCfg);
6389                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
6390                if(dmrsUlCfg->choice.setup)
6391                {
6392                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
6393                   {
6394                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
6395                      {
6396                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0);
6397                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled);
6398                      }
6399                      free(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition);
6400                   }
6401                   free(dmrsUlCfg->choice.setup);
6402                }
6403                free(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA);
6404             }
6405             free(puschCfg->dataScramblingIdentityPUSCH);
6406          }
6407          free(ulBwp->pusch_Config->choice.setup);
6408       }
6409       free(ulBwp->pusch_Config);
6410
6411       /* Free SRS-Config */
6412       if(ulBwp->srs_Config)
6413       {
6414          if(ulBwp->srs_Config->choice.setup)
6415          {
6416             srsCfg = ulBwp->srs_Config->choice.setup;
6417
6418             /* Free Resource Set to add/mod list */
6419             if(srsCfg->srs_ResourceSetToAddModList)
6420             {
6421                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
6422                if(rsrcSetList->list.array)
6423                {
6424                   rSetIdx = 0;
6425
6426                   /* Free SRS resource Id list in this SRS resource set */
6427                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
6428                   {
6429                      rsrcIdList =
6430                         rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
6431
6432                      if(rsrcIdList->list.array)
6433                      {
6434                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count;
6435                               rsrcIdx++)
6436                         {
6437                            free(rsrcIdList->list.array[rsrcIdx]);
6438                         }
6439                         free(rsrcIdList->list.array);
6440                      }
6441                      free(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList);
6442                   }
6443
6444                   /* Free resource type info for this SRS resource set */
6445
6446                   free(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic);
6447
6448                   /* Free memory for each resource set */
6449                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
6450                   {
6451                      free(rsrcSetList->list.array[rSetIdx]);
6452                   }
6453                   free(rsrcSetList->list.array);
6454                }
6455                free(srsCfg->srs_ResourceSetToAddModList);
6456             }
6457
6458             /* Free resource to add/modd list */
6459             if(srsCfg->srs_ResourceToAddModList)
6460             {
6461                resourceList = srsCfg->srs_ResourceToAddModList;
6462                if(resourceList->list.array)
6463                {
6464                   rsrcIdx = 0;
6465
6466                   free(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2);
6467                   free(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic);
6468
6469                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
6470                   {
6471                      free(resourceList->list.array[rsrcIdx]);
6472                   }
6473                   free(resourceList->list.array);
6474                }
6475                free(srsCfg->srs_ResourceToAddModList);
6476             }
6477
6478             free(ulBwp->srs_Config->choice.setup);
6479          }
6480          free(ulBwp->srs_Config);
6481       }
6482    }
6483 }
6484 /*******************************************************************
6485 *
6486 * @brief Function to free initialUplinkBWPConfig where memory allocated by aper_decoder
6487 *
6488 * @details
6489 *
6490 *    Function : freeAperDecodeinitialUplinkBWPConfig
6491 *
6492 *    Functionality: Function to free initialUplinkBWPConfig
6493 *
6494 * @params[in] UplinkConfig_t *ulCfg 
6495 * @return void
6496 *
6497 * ****************************************************************/
6498
6499
6500 void freeAperDecodeinitialUplinkBWPConfig(UplinkConfig_t *ulCfg)
6501 {
6502    BWP_UplinkDedicated_t *ulBwp=NULLP;
6503    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6504    
6505    if(ulCfg->initialUplinkBWP)
6506    {
6507       ulBwp=ulCfg->initialUplinkBWP;
6508       if(ulCfg->firstActiveUplinkBWP_Id)
6509       {
6510          if(ulCfg->pusch_ServingCellConfig)
6511          {
6512             puschCfg=ulCfg->pusch_ServingCellConfig;
6513             if(puschCfg->choice.setup)
6514             {
6515                if(puschCfg->choice.setup->ext1)
6516                {
6517                   free(puschCfg->choice.setup->ext1->processingType2Enabled);
6518                   free(puschCfg->choice.setup->ext1->maxMIMO_Layers);
6519                   free(puschCfg->choice.setup->ext1);
6520                }
6521                free(puschCfg->choice.setup);
6522             }
6523             free(ulCfg->pusch_ServingCellConfig);
6524          }
6525          free(ulCfg->firstActiveUplinkBWP_Id);
6526       }
6527       freeAperDecodeInitialUlBWPConfig(ulBwp);
6528       free(ulCfg->initialUplinkBWP);
6529    }
6530 }
6531
6532 /*******************************************************************
6533  *
6534  * @brief Function to free DuUeCfg
6535  *
6536  * @details
6537  *
6538  *    Function : freeDuUeCfg
6539  *
6540  *    Functionality: Function to free DuUeCfg
6541  *
6542  * @params[in] DuUeCfg *ueCfg
6543  * @return void
6544  *
6545  * ****************************************************************/
6546 void freeDuUeCfg(DuUeCfg *ueCfg)
6547 {
6548    uint8_t lcIdx = 0;
6549    uint8_t arrIdx = 0;
6550    SpCellConfig_t *spCellCfg = NULLP;
6551    ServingCellConfig_t *srvCellCfg = NULLP;
6552    BWP_DownlinkDedicated_t *dlBwp = NULLP;
6553    MAC_CellGroupConfig_t *macCellGrpCfg = NULLP;
6554    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
6555    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList = NULLP;
6556    struct RLC_Config *rlcConfig = NULLP;
6557    struct LogicalChannelConfig *macLcConfig = NULLP;
6558    struct SchedulingRequestConfig *schedulingRequestConfig = NULLP;
6559    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList = NULLP;
6560    struct TAG_Config *tagConfig = NULLP;
6561    struct TAG_Config__tag_ToAddModList *tagList = NULLP;
6562    struct MAC_CellGroupConfig__phr_Config *phrConfig = NULLP;
6563    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg = NULLP;
6564    CellGroupConfigRrc_t *cellGrpCfg = ueCfg->cellGrpCfg;
6565   
6566    if(ueCfg->ueNrCapability)
6567    {
6568       freeAperDecodeUeNrCapability(ueCfg->ueNrCapability);
6569       DU_FREE(ueCfg->ueNrCapability, sizeof(UE_NR_Capability_t));
6570       ueCfg->ueNrCapability = NULLP;
6571    }
6572
6573    if(ueCfg->cellGrpCfg)
6574    {
6575       
6576       rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6577       if(rlcBearerList)
6578       {
6579          if(rlcBearerList->list.array)
6580          {
6581             for(arrIdx=0; arrIdx<rlcBearerList->list.count; arrIdx++)
6582             {
6583                if(rlcBearerList->list.array[arrIdx])
6584                {
6585                   rlcConfig   = rlcBearerList->list.array[arrIdx]->rlc_Config;
6586                   macLcConfig = rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig;
6587                   
6588                   if(rlcBearerList->list.array[arrIdx]->servedRadioBearer)
6589                   {
6590                      free(rlcBearerList->list.array[arrIdx]->servedRadioBearer);
6591                   }
6592                   if(rlcConfig)
6593                   {
6594                      if(rlcConfig->choice.am)
6595                      {
6596                         free(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength);
6597                         free(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength);
6598                         free(rlcConfig->choice.am);
6599                      }
6600                      free(rlcBearerList->list.array[arrIdx]->rlc_Config);
6601                   }
6602                   if(macLcConfig)
6603                   {
6604                      if(macLcConfig->ul_SpecificParameters)
6605                      {
6606                         free(macLcConfig->ul_SpecificParameters->schedulingRequestID);
6607                         free(macLcConfig->ul_SpecificParameters->logicalChannelGroup);
6608                         free(macLcConfig->ul_SpecificParameters);
6609                      }
6610                      free(rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig);
6611                   }
6612                   free(rlcBearerList->list.array[arrIdx]); 
6613                }
6614             }
6615             free(rlcBearerList->list.array);
6616          }
6617          free(cellGrpCfg->rlc_BearerToAddModList);
6618       }
6619
6620       macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6621       if(macCellGrpCfg)
6622       {
6623          schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6624          if(schedulingRequestConfig)
6625          {
6626             schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6627             if(schReqList)
6628             {
6629                if(schReqList->list.array)
6630                {
6631                   for(arrIdx=0;arrIdx<schReqList->list.count; arrIdx++)
6632                   {
6633                      if(schReqList->list.array[arrIdx])
6634                      {
6635                         free(schReqList->list.array[arrIdx]->sr_ProhibitTimer); 
6636                         free(schReqList->list.array[arrIdx]);
6637                      }
6638                   }
6639                   free(schReqList->list.array);
6640                }
6641                free(schedulingRequestConfig->schedulingRequestToAddModList);
6642             }
6643             free(macCellGrpCfg->schedulingRequestConfig);
6644          }
6645          if(macCellGrpCfg->bsr_Config)
6646          {
6647             free(macCellGrpCfg->bsr_Config);
6648          }
6649          tagConfig = macCellGrpCfg->tag_Config;
6650          if(tagConfig)
6651          {
6652             tagList = tagConfig->tag_ToAddModList;
6653             if(tagList)
6654             {
6655                if(tagList->list.array)
6656                {
6657                   for(arrIdx=0; arrIdx<tagList->list.count; arrIdx++)
6658                   {
6659                      free(tagList->list.array[arrIdx]);
6660                   }
6661                   free(tagList->list.array);
6662                }
6663                free(tagConfig->tag_ToAddModList);
6664             }
6665             free(tagConfig); 
6666          }
6667
6668          phrConfig = macCellGrpCfg->phr_Config;
6669          if(phrConfig)
6670          {
6671             free(phrConfig->choice.setup); 
6672             free(phrConfig); 
6673          }
6674
6675          free(macCellGrpCfg); 
6676       }
6677
6678       phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6679       if(phyCellGrpCfg)
6680       {
6681          free(phyCellGrpCfg->p_NR_FR1);
6682          free(phyCellGrpCfg); 
6683       }
6684
6685       spCellCfg = cellGrpCfg->spCellConfig;
6686       if(spCellCfg)
6687       {
6688          if(spCellCfg->servCellIndex)
6689          {
6690             if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6691             {
6692                if(spCellCfg->spCellConfigDedicated)
6693                {
6694                   srvCellCfg = spCellCfg->spCellConfigDedicated;
6695                   if(srvCellCfg->initialDownlinkBWP)
6696                   {
6697                      dlBwp = srvCellCfg->initialDownlinkBWP;
6698                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
6699                      {
6700                         if(srvCellCfg->defaultDownlinkBWP_Id)
6701                         {
6702                            if(srvCellCfg->uplinkConfig)
6703                            {
6704
6705                               if(srvCellCfg->pdsch_ServingCellConfig)
6706                               {
6707                                  pdschCfg=
6708                                     srvCellCfg->pdsch_ServingCellConfig;
6709                                  if(pdschCfg->choice.setup)
6710                                  {
6711
6712                                     free(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH);
6713                                     free(pdschCfg->choice.setup);
6714                                  }
6715
6716                                  free(srvCellCfg->pdsch_ServingCellConfig);
6717                               }
6718
6719                               freeAperDecodeinitialUplinkBWPConfig(srvCellCfg->uplinkConfig);
6720                               free(srvCellCfg->uplinkConfig);
6721                            }
6722                            free(srvCellCfg->defaultDownlinkBWP_Id);
6723                         }
6724
6725                         free(srvCellCfg->firstActiveDownlinkBWP_Id);
6726                      }
6727                      if(dlBwp->pdcch_Config)
6728                      {
6729                         if(dlBwp->pdsch_Config)
6730                         {
6731                            freeAperDecodeBWPDlDedPdschConfig(dlBwp);
6732                            free(dlBwp->pdsch_Config);
6733                         }
6734                         freeAperDecodeBWPDlDedPdcchConfig(dlBwp);
6735                         free(dlBwp->pdcch_Config);
6736                      }
6737                      free(srvCellCfg->initialDownlinkBWP);
6738                   }
6739
6740                   free(spCellCfg->spCellConfigDedicated);
6741                }
6742                free(spCellCfg->rlmInSyncOutOfSyncThreshold);
6743             }
6744             free(spCellCfg->servCellIndex); 
6745          }
6746          free(spCellCfg);
6747       }
6748       DU_FREE(ueCfg->cellGrpCfg, sizeof(CellGroupConfigRrc_t));
6749       ueCfg->cellGrpCfg = NULLP;
6750    }
6751    if(ueCfg->ambrCfg)
6752    {
6753       memset(ueCfg->ambrCfg, 0, sizeof(AmbrCfg));
6754       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->ambrCfg, sizeof(AmbrCfg));
6755    }
6756    for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++)
6757    {
6758       freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]);
6759    }
6760    for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
6761    {
6762       freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
6763    }
6764    for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++)
6765    {
6766       DU_FREE(ueCfg->upTnlInfo[lcIdx].tnlCfg1, sizeof(GtpTnlCfg));
6767       memset(&ueCfg->upTnlInfo[lcIdx], 0, sizeof(UpTnlCfg));
6768    }
6769 }
6770
6771 /*******************************************************************
6772  *
6773  * @brief Function to free UecontextSetupDb
6774  *
6775  * @details
6776  *
6777  *    Function : freeF1UeDb
6778  *
6779  *    Functionality: Function to free UecontextSetupDb
6780  *
6781  * @params[in] UecontextSetupDb *
6782  * @return void
6783  *
6784  * ****************************************************************/
6785
6786 void freeF1UeDb(F1UeContextSetupDb *f1UeDb)
6787 {
6788    
6789    if(f1UeDb->dlRrcMsg)
6790    {
6791       if(f1UeDb->dlRrcMsg->rrcMsgPdu)
6792       {
6793          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,\
6794             f1UeDb->dlRrcMsg->rrcMsgPdu, f1UeDb->dlRrcMsg->rrcMsgSize);
6795       }
6796       memset(f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
6797    }
6798    freeDuUeCfg(&f1UeDb->duUeCfg);
6799    memset(f1UeDb, 0, sizeof(F1UeContextSetupDb));
6800    DU_FREE(f1UeDb, sizeof(F1UeContextSetupDb));
6801 }
6802
6803 /*******************************************************************
6804  *
6805  * @brief Function to build Am cfg Info
6806  *
6807  * @details
6808  *
6809  *    Function : extractRlcAmCfg
6810  *
6811  *    Functionality: Function to build Am cfg Info
6812  *
6813  * @params[in] AmBearerCfg *
6814  *             void *
6815  *
6816  * @return ROK/RFAILED
6817  *
6818  * ****************************************************************/
6819
6820 void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg)
6821 {
6822    if(rlcAmCfg)
6823    {
6824       /* UL AM */
6825       if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
6826       {
6827          amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength);
6828          /*TODO: Check the timer value when sent by real CU */
6829          amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly; 
6830          amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit;
6831       }
6832
6833       /* DL AM */
6834       if(rlcAmCfg->ul_AM_RLC.sn_FieldLength)
6835       {
6836          amCfgToSet->dlAmCfg.snLenDl = *(rlcAmCfg->ul_AM_RLC.sn_FieldLength);
6837          amCfgToSet->dlAmCfg.pollRetxTmr = rlcAmCfg->ul_AM_RLC.t_PollRetransmit;
6838          amCfgToSet->dlAmCfg.pollPdu   = rlcAmCfg->ul_AM_RLC.pollPDU;
6839          amCfgToSet->dlAmCfg.pollByte  = rlcAmCfg->ul_AM_RLC.pollByte;
6840          amCfgToSet->dlAmCfg.maxRetxTh = rlcAmCfg->ul_AM_RLC.maxRetxThreshold;
6841       }
6842    }
6843 }
6844
6845 /*******************************************************************
6846  *
6847  * @brief Function to build Um Bi Info
6848  *
6849  * @details
6850  *
6851  *    Function : extractRlcUmBiCfg
6852  *
6853  *    Functionality: Function to build Um Bi Info
6854  *
6855  * @params[in] UmBiDirBearerCfg *
6856  *             void *
6857  *
6858  * @return ROK/RFAILED
6859  *
6860  * ****************************************************************/
6861
6862 void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_Directional *rlcBiCfg)
6863 {
6864    if(rlcBiCfg)
6865    {
6866       /* UL UM BI DIR Cfg */
6867       if(rlcBiCfg->dl_UM_RLC.sn_FieldLength)
6868       {
6869          umBiCfgToSet->ulUmCfg.snLenUlUm  = *(rlcBiCfg->dl_UM_RLC.sn_FieldLength);
6870          umBiCfgToSet->ulUmCfg.reAssemTmr = rlcBiCfg->dl_UM_RLC.t_Reassembly;
6871       }
6872
6873       /* DL UM BI DIR Cfg */
6874       if(rlcBiCfg->ul_UM_RLC.sn_FieldLength)
6875          umBiCfgToSet->dlUmCfg.snLenDlUm  = *(rlcBiCfg->ul_UM_RLC.sn_FieldLength);
6876    }
6877 }
6878
6879 /*******************************************************************
6880  *
6881  * @brief Function to build Um Ul Info
6882  *
6883  * @details
6884  *
6885  *    Function : extractRlcUmUlCfg
6886  *
6887  *    Functionality: Function to build Um Ul Info
6888  *
6889  * @params[in] UmUniDirUlBearerCfg *
6890  *             void *
6891  *
6892  * @return ROK/RFAILED
6893  *
6894  * ****************************************************************/
6895
6896 void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_Uni_Directional_DL *umUlCfg)
6897 {
6898    if(umUlCfg)
6899    {
6900       if(umUlCfg->dl_UM_RLC.sn_FieldLength)
6901       {
6902          umUlCfgToSet->ulUmCfg.snLenUlUm  = *(umUlCfg->dl_UM_RLC.sn_FieldLength);
6903          umUlCfgToSet->ulUmCfg.reAssemTmr = umUlCfg->dl_UM_RLC.t_Reassembly;
6904       }
6905    }
6906 }
6907
6908 /*******************************************************************
6909  *
6910  * @brief Function to build Um Uni Dl Info
6911  *
6912  * @details
6913  *
6914  *    Function : extractRlcUmDlCfg
6915  *
6916  *    Functionality: Function to build Um Uni Dl Info
6917  *
6918  * @params[in] UmUniDirDlBearerCfg *
6919  *             void *
6920  *
6921  * @return ROK/RFAILED
6922  *
6923  * ****************************************************************/
6924 void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_Uni_Directional_UL *umDlCfg)
6925 {
6926    if(umDlCfg)
6927    {
6928       if(umDlCfg->ul_UM_RLC.sn_FieldLength)
6929          umDlCfgToSet->dlUmCfg.snLenDlUm  = *(umDlCfg->ul_UM_RLC.sn_FieldLength);
6930    }
6931 }
6932
6933 /*******************************************************************
6934  *
6935  * @brief Function to extractRlcModeCfg
6936  *
6937  * @details
6938  *
6939  *    Function : extractRlcModeCfg
6940  *
6941  *    Functionality: Function to extractRlcModeCfg
6942  *
6943  * @params[in] RLC_Config_t *
6944  *             RlcBearerCfg *
6945  *             void  *    
6946  * @return ROK/RFAILED
6947  *
6948  * ****************************************************************/
6949 void extractRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *rlcDbCfg, RLC_Config_t *lcCfg)
6950 {
6951    if(lcCfg)
6952    {
6953       switch(rlcMode)
6954       {
6955          case RLC_AM :
6956             {
6957                if(lcCfg->choice.am)
6958                {
6959                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
6960                   if(rlcDbCfg->u.amCfg)
6961                      extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
6962                }
6963                break;
6964             }
6965          case RLC_UM_BI_DIRECTIONAL :
6966             {
6967                if(lcCfg->choice.um_Bi_Directional)
6968                {
6969                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
6970                   if(rlcDbCfg->u.umBiDirCfg)
6971                      extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
6972                }
6973                break;
6974             }
6975          case RLC_UM_UNI_DIRECTIONAL_UL :
6976             {
6977                if(lcCfg->choice.um_Uni_Directional_DL)
6978                {
6979                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
6980                   if(rlcDbCfg->u.umUniDirUlCfg)
6981                      extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
6982                }
6983                break;
6984             }
6985          case RLC_UM_UNI_DIRECTIONAL_DL :
6986             {
6987                if(lcCfg->choice.um_Uni_Directional_UL)
6988                {
6989                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
6990                   if(rlcDbCfg->u.umUniDirDlCfg)
6991                      extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
6992                }
6993                break;
6994             }
6995          default:
6996             DU_LOG("\nERROR  -->  DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
6997             break;
6998       }
6999    }
7000 }
7001
7002 /*******************************************************************
7003  *
7004  * @brief Function to extract extractUlLcCfg
7005  *
7006  * @details
7007  *
7008  *    Function : extractUlLcCfg
7009  *
7010  *    Functionality: Function to extract extractUlLcCfg
7011  *
7012  * @params[in] UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg
7013  * @return void
7014  *
7015  * ****************************************************************/
7016
7017 void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg)
7018 {
7019    if(ulLcCfg)
7020    {
7021       if(ulLcCfg->ul_SpecificParameters)
7022       {
7023          f1UlLcCfg->priority = \
7024             ulLcCfg->ul_SpecificParameters->priority;
7025       if(ulLcCfg->ul_SpecificParameters->logicalChannelGroup)
7026       {
7027          f1UlLcCfg->lcGroup = \
7028            *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup);
7029       }
7030       if(ulLcCfg->ul_SpecificParameters->schedulingRequestID)
7031       {
7032          f1UlLcCfg->schReqId = \
7033            *(ulLcCfg->ul_SpecificParameters->schedulingRequestID);
7034       }
7035       f1UlLcCfg->pbr = \
7036          ulLcCfg->ul_SpecificParameters->prioritisedBitRate;
7037       f1UlLcCfg->bsd = \
7038          ulLcCfg->ul_SpecificParameters->bucketSizeDuration;
7039       }
7040    }
7041 }
7042
7043 /*******************************************************************
7044  *
7045  * @brief Function to procRlcLcCfg
7046  *
7047  * @details
7048  *
7049  *    Function : procRlcLcCfg
7050  *
7051  *    Functionality: Function to procRlcLcCfg
7052  *
7053  * @params[in] rbId, lcId, rbType, rlcMod
7054  *             RLC_Config_t *, RlcBearerCfg * , 
7055  * @return void
7056  *
7057  * ****************************************************************/
7058
7059 void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\
7060    uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg)
7061 {
7062
7063    lcCfg->rbId   = rbId;
7064    lcCfg->configType = configType;
7065
7066    if(rbType == RB_TYPE_SRB)
7067    {
7068       lcCfg->rbType = RB_TYPE_SRB;
7069       lcCfg->lcId   = rbId;
7070       lcCfg->lcType = LCH_DCCH;
7071       lcCfg->rlcMode = RLC_AM;
7072    }
7073    else if(rbType == RB_TYPE_DRB)
7074    {
7075       lcCfg->rbType = RB_TYPE_DRB;
7076       lcCfg->lcId   = lcId;
7077       lcCfg->lcType = LCH_DTCH;
7078       lcCfg->rlcMode = rlcMode;
7079    }
7080    if(f1RlcCfg) /* rlc mode config recived */
7081    {
7082       extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg);
7083    }
7084 }
7085
7086
7087
7088 /*******************************************************************
7089  *
7090  * @brief Fills DrbQos Info received by CU
7091  *
7092  * @details
7093  *
7094  *    Function : extractQosInfo
7095  *
7096  *    Functionality: Fills DrbQos Info received  by CU
7097  *
7098  * @params[in] DrbQosInfo *qosToAdd, 
7099  *             QoSFlowLevelQoSParameters_t *qosFlowCfg
7100  * @return void
7101  *
7102  * ****************************************************************/
7103
7104 void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg)
7105 {
7106    qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present;
7107    qosToAdd->u.nonDyn5Qi.fiveQi     =\
7108          qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
7109    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow)
7110    {
7111       qosToAdd->u.nonDyn5Qi.avgWindow = \
7112         *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
7113    }
7114    qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \
7115       *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
7116    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel)
7117    {
7118       qosToAdd->u.nonDyn5Qi.priorLevel = \
7119          *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel);
7120    }
7121    qosToAdd->ngRanRetPri.priorityLevel = \
7122       qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; 
7123    qosToAdd->ngRanRetPri.preEmptionCap = \
7124       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability;
7125    qosToAdd->ngRanRetPri.preEmptionVul = \
7126       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability;
7127    if(qosFlowCfg->gBR_QoS_Flow_Information)
7128    {
7129       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \
7130          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \
7131          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size);
7132       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \
7133          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \
7134          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size);
7135       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\
7136          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \
7137          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size);
7138       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\
7139          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \
7140          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size);
7141    }
7142    qosToAdd->pduSessionId = 0;
7143    qosToAdd->ulPduSessAggMaxBitRate = 0;
7144 }
7145
7146 /*******************************************************************
7147  *
7148  * @brief Function to extract GTP Tunnel Info from CU
7149  *
7150  * @details
7151  *
7152  *    Function : extractUpTnlInfo
7153  *
7154  *    Functionality: Function to extract GTP Tunnel Info from CU
7155  *
7156  * @params[in] F1AP message
7157  * @return ROK/RFAILED
7158  *
7159  * ****************************************************************/
7160
7161 uint8_t extractUpTnlInfo(uint8_t drbId, uint8_t configType,\
7162    ULUPTNLInformation_ToBeSetup_List_t *tnlInfo, UpTnlCfg *upTnlInfo)
7163 {
7164    uint8_t tnlIdx;
7165    uint32_t ipv4_du = 0;
7166    GTPTunnel_t *gtpTunnel = NULLP;
7167
7168    upTnlInfo->drbId = drbId; 
7169    upTnlInfo->configType = configType;
7170    cmInetAddr((char *)DU_IP_V4_ADDR, &ipv4_du);
7171
7172    for(tnlIdx=0; tnlIdx < tnlInfo->list.count; tnlIdx++)
7173    {
7174       if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
7175       {
7176          if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel)
7177          {
7178             gtpTunnel = tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel;
7179             DU_ALLOC(upTnlInfo->tnlCfg1, sizeof(GtpTnlCfg));
7180             if(upTnlInfo->tnlCfg1 == NULLP)
7181             {
7182                DU_LOG("\nERROR  -->  F1AP : extractUpTnlInfo: Failed to allocate mmeory for tunnel cfg 1");
7183                return RFAILED;
7184             }
7185             bitStringToInt(&gtpTunnel->transportLayerAddress, &upTnlInfo->tnlCfg1->ulTnlAddress);
7186             upTnlInfo->tnlCfg1->dlTnlAddress = ipv4_du;
7187             if(gtpTunnel->gTP_TEID.size > 0)
7188             {
7189                teIdStringToInt(gtpTunnel->gTP_TEID.buf, &upTnlInfo->tnlCfg1->teId);
7190             }
7191          }
7192          break;
7193       }
7194    }
7195    return ROK;
7196 }
7197
7198 /*******************************************************************
7199  *
7200  * @brief Function to extract DRB info received from CU
7201  *
7202  * @details
7203  *
7204  *    Function : extractDrbCfg
7205  *
7206  *    Functionality: Function to extract DRB info received from CU
7207  *
7208  * @params[in] F1AP message
7209  * @return void
7210  *
7211  * ****************************************************************/
7212 uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo)
7213 {
7214    DRB_Information_t *drbInfo = NULLP;
7215
7216    if(extractUpTnlInfo(drbItem->dRBID, CONFIG_ADD, &drbItem->uLUPTNLInformation_ToBeSetup_List, upTnlInfo) != ROK)
7217    {
7218       DU_LOG("\nERROR  -->  DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
7219       return RFAILED;
7220    }
7221    if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
7222    {
7223       if(drbItem->qoSInformation.choice.choice_extension->value.present ==
7224             QoSInformation_ExtIEs__value_PR_DRB_Information)
7225       {
7226          drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
7227
7228          if(!macLcToAdd->drbQos)
7229          {
7230             DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
7231             if(macLcToAdd->drbQos == NULLP)
7232             {
7233                DU_LOG("\nERROR  -->  DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
7234                return RFAILED;
7235             }
7236
7237          }
7238          if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
7239          {
7240             extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
7241             macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
7242          }
7243          if(!macLcToAdd->snssai)
7244          {
7245             DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
7246             if(macLcToAdd->snssai == NULLP)
7247             {
7248                DU_LOG("\nERROR  -->  DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()");
7249                return RFAILED;
7250             }
7251          }
7252          memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
7253                drbInfo->sNSSAI.sST.size);
7254          if(drbInfo->sNSSAI.sD)
7255          {
7256             memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
7257                   drbInfo->sNSSAI.sD->size);
7258          }
7259       }/*End of DRB Info*/
7260    }
7261    return ROK;
7262 }
7263
7264 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg,\
7265    UpTnlCfg *upTnlInfo)
7266 {
7267    uint8_t ret = ROK;
7268
7269    if(drbCfg)
7270    {
7271       if(drbCfg != NULLP)
7272       {
7273          ret = extractDrbCfg(drbCfg, lcCfg, upTnlInfo);
7274          if(ret == RFAILED)
7275          {
7276             DU_LOG("ERROR  -->  F1AP : Failed to build Drb Qos at extractMacRbCfg()");
7277             return ret;
7278          }
7279       }
7280    }
7281    else
7282    {
7283       lcCfg->drbQos = NULLP;
7284       lcCfg->snssai = NULLP;
7285       if(lcCfg->lcId == SRB2_LCID)
7286          lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
7287       else
7288          lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
7289    }
7290    if(ulLcCfg)
7291    {
7292       lcCfg->ulLcCfgPres = true;
7293       extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
7294    }
7295    else
7296       lcCfg->ulLcCfgPres = false;
7297    return ret;
7298 }
7299
7300 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
7301    DRBs_ToBeSetup_Item_t *drbItem, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
7302 {
7303    uint8_t ret = ROK;
7304
7305    lcCfg->lcId = lcId;
7306    lcCfg->configType = configType;
7307    if(rbType == RB_TYPE_SRB)
7308    {
7309       ret = extractMacRbCfg(lcId, NULL, ulLcCfg, lcCfg, NULL);
7310    }
7311    else if(rbType == RB_TYPE_DRB)
7312    {
7313       ret = extractMacRbCfg(lcId, drbItem, ulLcCfg, lcCfg, upTnlInfo);
7314    }
7315    return ret;
7316 }
7317
7318 /*******************************************************************
7319  *
7320  * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
7321  *
7322  * @details
7323  *
7324  *    Function : extractRlcCfgToAddMod
7325  *
7326  *    Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
7327  *
7328  * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
7329  *             DuUeCfg Pointer
7330  * @return ROK/RFAILED
7331  *
7332  * ****************************************************************/
7333
7334 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, \
7335    DuUeCfg *ueCfgDb)
7336 {
7337   uint8_t ret, idx, rbId, lcId, rlcMode, rbType;
7338   RLC_Config_t *f1RlcCfg = NULLP;
7339   LogicalChannelConfig_t *macUlLcCfg = NULLP;
7340
7341   for(idx = 0; idx < lcCfg->list.count; idx++)
7342   {
7343      lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
7344      if(lcCfg->list.array[idx]->servedRadioBearer)
7345      {
7346         /* RadioBearer for SRB/DRB */
7347         if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7348         RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
7349         {
7350            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
7351            rbType = RB_TYPE_SRB;
7352         }
7353         else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7354         RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
7355         {
7356            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
7357            rbType = RB_TYPE_DRB;
7358         }
7359         else
7360         {
7361            DU_LOG("\nERROR  -->  No components present in Bearer config to ADD/MOD");
7362            return RFAILED;
7363         }
7364         /* MAC UL LC Config */
7365         if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
7366         {
7367            macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
7368         }
7369      }
7370      else
7371      {
7372         DU_LOG("\nERROR  -->  DUAPP: Received RadioBearer config is NULL");
7373         return RFAILED;
7374      }
7375      /* RLC Mode Config */
7376      if(lcCfg->list.array[idx]->rlc_Config)
7377      {
7378         rlcMode  = lcCfg->list.array[idx]->rlc_Config->present;
7379         f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
7380      }
7381      
7382      /* Filling RLC/MAC Config*/
7383      memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
7384      memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
7385      procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
7386      ret = procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL);
7387      if(ret == RFAILED)
7388      {
7389         DU_LOG("\nERROR  -->  DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()");
7390         return ret;
7391      }
7392      (ueCfgDb->numRlcLcs)++;
7393      (ueCfgDb->numMacLcs)++;
7394   }
7395   //TODO: To send the failure cause in UeContextSetupRsp 
7396   return ret;
7397 }
7398
7399 /*******************************************************************
7400  *
7401  * @brief DeAlloc pdsch serv cell config info
7402  *
7403  * @details
7404  *
7405  *    Function : freeMacPdschServCellInfo
7406  *
7407  *    Functionality: DeAlloc pdsch serv cell config info
7408  *
7409  * @params[in] PdschServCellCfg pointer
7410  * @return void
7411  *
7412  * ****************************************************************/
7413
7414 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
7415 {
7416    if(pdsch->xOverhead)
7417    {
7418       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(uint8_t));
7419    }
7420    if(pdsch->codeBlkGrpFlushInd)
7421    {
7422       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
7423    }
7424    if(pdsch->maxCodeBlkGrpPerTb)
7425    {
7426       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(uint8_t));
7427    }
7428    if(pdsch->maxMimoLayers)
7429    {
7430       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
7431    }
7432 }
7433
7434 /*******************************************************************
7435  *
7436  * @brief Free Serving cell Info
7437  *
7438  * @details
7439  *
7440  *    Function : freeMacServingCellInfo
7441  *
7442  *    Functionality: Free Serving cell Info
7443  *
7444  * @params[in] ServCellCfgInfo *srvCellCfg
7445  * @return void
7446  *
7447  * ****************************************************************/
7448 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
7449 {
7450    freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
7451    if(srvCellCfg->bwpInactivityTmr)
7452    {
7453       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
7454    }
7455 }
7456
7457 /*******************************************************************
7458  *
7459  * @brief Free cell Grp Cfg Info
7460  *
7461  * @details
7462  *
7463  *    Function : freeUeReCfgCellGrpInfo
7464  *
7465  *    Functionality: Free cell Grp Cfg Info
7466  *
7467  * @params[in] MacUeCfg*  duUeCfg
7468  * @return void
7469  *
7470  * ****************************************************************/
7471
7472 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
7473 {
7474    freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
7475 }
7476
7477 /*******************************************************************
7478  *
7479  * @brief Fills Reconfig SchReqReConfig
7480  *
7481  * @details
7482  *
7483  *    Function : extractSchReqReConfig
7484  *
7485  *    Functionality: Fills Reconfig SchReqReConfig
7486  *
7487  * @params[in] SchedulingRequestConfig_t *cuSchedReq
7488  *             SchedReqCfg*  macSchedReq
7489  * @return void
7490  *
7491  * ****************************************************************/
7492 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
7493 {
7494    uint8_t schReqIdx = 0;
7495    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
7496    struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
7497
7498    if(cuSchedReq->schedulingRequestToAddModList)
7499    {
7500       schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
7501       if(schReqListToAdd->list.count)
7502       {
7503          macSchedReq->addModListCount = schReqListToAdd->list.count;
7504          for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
7505          {
7506             macSchedReq->addModList[schReqIdx].schedReqId = \
7507                schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
7508             macSchedReq->addModList[schReqIdx].srProhibitTmr = \
7509                *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
7510             macSchedReq->addModList[schReqIdx].srTransMax    =\
7511                schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
7512          }
7513       }
7514    }
7515    /* Scheduling Req To release */
7516    if(cuSchedReq->schedulingRequestToReleaseList)
7517    {
7518       schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
7519       if(schReqListToRel->list.count)
7520       {
7521          macSchedReq->relListCount = schReqListToRel->list.count;
7522          for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
7523          {
7524             macSchedReq->relList[schReqIdx] = \
7525                *schReqListToRel->list.array[schReqIdx];
7526          }
7527       }
7528    }
7529 }
7530
7531 /*******************************************************************
7532  *
7533  * @brief Fills TagReconfig
7534  *
7535  * @details
7536  *
7537  *    Function : extractTagReconfig
7538  *
7539  *    Functionality: Fills extractTagReconfig
7540  *
7541  * @params[in] TAG_Config_t *cuTagCfg
7542  *             TagCfg *macTagCfg
7543  * @return void
7544  *
7545  * ****************************************************************/
7546
7547 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
7548 {
7549   uint8_t tagIdx = 0;
7550   struct TAG_Config__tag_ToAddModList  *tagListToAddMod = NULLP;
7551   struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
7552
7553   /* Tag config to AddMod */
7554   if(cuTagCfg->tag_ToAddModList)
7555   {
7556      tagListToAddMod = cuTagCfg->tag_ToAddModList; 
7557      if(tagListToAddMod->list.count)
7558      {
7559         macTagCfg->addModListCount = tagListToAddMod->list.count;
7560         for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
7561         {
7562            macTagCfg->addModList[tagIdx].tagId =\
7563               tagListToAddMod->list.array[tagIdx]->tag_Id;     
7564            macTagCfg->addModList[tagIdx].timeAlignTimer = \
7565
7566               tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
7567         }
7568      }
7569   }
7570   /* Tag config to release */
7571   if(cuTagCfg->tag_ToReleaseList)
7572   {
7573      tagListToRel = cuTagCfg->tag_ToReleaseList;
7574      if(tagListToRel->list.count)
7575      {
7576         macTagCfg->relListCount = tagListToRel->list.count;
7577         for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
7578         {
7579            macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];     
7580         }
7581      }
7582   }
7583 }
7584
7585 /*******************************************************************
7586  *
7587  * @brief Fills PdcchCfg received by CU
7588  *
7589  * @details
7590  *
7591  *    Function : extractPdcchCfg
7592  *
7593  *    Functionality: Fills PdcchCfg received  by CU
7594  *
7595  * @params[in] PDCCH_Config_t *cuPdcchCfg,
7596  *             PdcchConfig *duPdcchCfg
7597  * @return void
7598  *
7599  * ****************************************************************/
7600
7601 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
7602 {
7603    uint8_t cRsetIdx = 0;
7604    uint8_t srchSpcIdx = 0;
7605
7606    struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
7607    struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
7608    struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
7609    struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
7610
7611
7612    /* Control Resource Set To Add/Mod List */
7613    if(cuPdcchCfg->controlResourceSetToAddModList)
7614    {
7615       cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
7616       if(cRsetToAddModList->list.count)
7617       {
7618          macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
7619          for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
7620          {
7621             macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
7622               cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
7623             bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
7624                macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
7625             macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
7626               cRsetToAddModList->list.array[cRsetIdx]->duration;
7627
7628             macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
7629               cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;   
7630             if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
7631             {
7632                //TODO: handle the case for Interleaved
7633             }
7634             macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
7635               cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
7636             if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
7637             {
7638                macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
7639                   *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
7640             }
7641          }
7642       }
7643
7644    }
7645    /* Control Resource Set To Release List */
7646    if(cuPdcchCfg->controlResourceSetToReleaseList)
7647    {
7648       cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
7649       if(cRsetToRelList->list.count)
7650       {
7651          macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
7652          for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
7653          {
7654             macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
7655          }
7656       }
7657    }
7658
7659    /* Search space To Add/Mod List */
7660    if(cuPdcchCfg->searchSpacesToAddModList)
7661    {
7662       srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
7663       if(srchSpcToAddModList->list.count)
7664       {
7665          macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
7666          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
7667          {
7668             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
7669                srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
7670             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
7671                *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
7672             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
7673             {
7674                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
7675                   srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
7676             }
7677             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
7678             {
7679                bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
7680                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
7681             }
7682             if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
7683             {
7684               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
7685                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
7686               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
7687                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
7688               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
7689                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
7690               
7691               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
7692                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
7693               
7694               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
7695                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
7696             }
7697             if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
7698             {
7699                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
7700                   srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
7701                if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
7702                {
7703                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
7704                      srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
7705                }
7706          
7707             }
7708          }
7709       }
7710    }
7711    /* Search space To Rel List */
7712    if(cuPdcchCfg->searchSpacesToReleaseList)
7713    {
7714       srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
7715       if(srchSpcToRelList->list.count)
7716       {
7717          macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
7718          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
7719          {
7720             macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
7721                *(srchSpcToRelList->list.array[srchSpcIdx]);
7722          }
7723       }
7724    }
7725 }
7726
7727 /*******************************************************************
7728  *
7729  * @brief Fills PdschCfg received by CU
7730  *
7731  * @details
7732  *
7733  *    Function : extractPdschCfg
7734  *
7735  *    Functionality: Fills PdschCfg received  by CU
7736  *
7737  * @params[in] PDSCH_Config_t *cuPdschCfg,
7738  *             PdschConfig *macPdschCfg
7739  * @return void
7740  *
7741  * ****************************************************************/
7742
7743 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
7744 {
7745    uint8_t timeDomIdx;
7746    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
7747
7748    if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
7749    {
7750       if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
7751          PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
7752       {
7753          if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
7754          {
7755             macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
7756                *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
7757          }
7758       }
7759    }
7760    macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
7761    if(cuPdschCfg->pdsch_TimeDomainAllocationList)
7762    {
7763       timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
7764       if(timeDomAlloc->present ==\
7765          PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
7766       {
7767          if(timeDomAlloc->choice.setup)
7768          {
7769             macPdschCfg->numTimeDomRsrcAlloc  = timeDomAlloc->choice.setup->list.count;
7770             for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
7771             {
7772                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
7773                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
7774                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
7775                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
7776             }
7777          }
7778       }
7779    }
7780    macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
7781    if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
7782       macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
7783    if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
7784    {
7785       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
7786       if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
7787       {
7788          if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
7789          {
7790             macPdschCfg->bundlingInfo.StaticBundling.size = \
7791                *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
7792          }
7793       }
7794    }
7795    else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
7796    {
7797       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
7798    }
7799
7800 }
7801
7802 /*******************************************************************
7803  *
7804  * @brief Fills PdschServingCellCfg received by CU
7805  *
7806  * @details
7807  *
7808  *    Function : extractPdschServingCellCfg
7809  *
7810  *    Functionality: Fills PdschCfg received  by CU
7811  *
7812  * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
7813  *             PdschServCellCfg *macUePdschSrvCellCfg
7814  * @return ROK/RFAILED
7815  *
7816  * ****************************************************************/
7817
7818 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
7819 {
7820    if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
7821    {
7822       if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
7823       {
7824          if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
7825          {
7826             *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
7827                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
7828          }
7829          else
7830          {
7831             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(uint8_t));
7832             if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
7833             {
7834                *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
7835                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
7836             }
7837             else
7838             {
7839                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
7840                return RFAILED;
7841             }
7842          }
7843          if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
7844          {
7845             *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
7846                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
7847          }
7848          else
7849          {
7850             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(bool));
7851             if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
7852             {
7853                *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
7854                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
7855             }
7856             else
7857             {
7858                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
7859                return RFAILED;
7860             }
7861          }
7862       }
7863    }
7864    if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
7865    {
7866       macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH); 
7867    }
7868    if(cuPdschSrvCellCfg->ext1)
7869    {
7870       if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
7871       {
7872         if(macUePdschSrvCellCfg->maxMimoLayers)
7873         {
7874            *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
7875         }
7876         else
7877         {
7878            DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
7879            if(macUePdschSrvCellCfg->maxMimoLayers)
7880            {
7881               *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
7882            }
7883            else
7884            {
7885               DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
7886               return RFAILED;
7887            }
7888         }
7889       }
7890    }
7891    if(cuPdschSrvCellCfg->xOverhead)
7892    {
7893       if(macUePdschSrvCellCfg->xOverhead)
7894       {
7895          *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
7896       }
7897       else
7898       {
7899          DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(uint8_t));
7900          if(macUePdschSrvCellCfg->xOverhead)
7901          {
7902             *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
7903          }
7904          else
7905          {
7906             DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
7907             return RFAILED;
7908          }
7909       }
7910    }
7911    return ROK;
7912 }
7913
7914 /*******************************************************************
7915  *
7916  * @brief Fills PuschCfg received by CU
7917  *
7918  * @details
7919  *
7920  *    Function : extractPuschCfg
7921  *
7922  *    Functionality: Fills PuschCfg received  by CU
7923  *
7924  * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
7925  *             PuschCfg *macPuschCfg
7926  * @return void
7927  *
7928  * ****************************************************************/
7929
7930 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
7931 {
7932    uint8_t timeDomIdx = 0;
7933    DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
7934    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
7935
7936    if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
7937    {
7938       if(cuPuschCfg->choice.setup)
7939       {
7940          if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
7941          {
7942              macPuschCfg->dataScramblingId = \
7943                 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
7944          }
7945          if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
7946          {
7947             if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
7948             {
7949                if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
7950                {
7951                   dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
7952                   if(dmrsUlCfg->dmrs_AdditionalPosition)
7953                   {
7954                      macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
7955                         *(dmrsUlCfg->dmrs_AdditionalPosition);
7956                   }
7957                   if(dmrsUlCfg->transformPrecodingDisabled)
7958                   {
7959                      if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
7960                      {
7961                         macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
7962                            *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
7963                      }
7964                   }
7965                }
7966             }
7967          }
7968          /*Res Alloc Type for UL */
7969          if(cuPuschCfg->choice.setup->resourceAllocation)
7970          {
7971             macPuschCfg->resourceAllocType = \
7972                cuPuschCfg->choice.setup->resourceAllocation;
7973          }
7974          if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
7975          {
7976             timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
7977             if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
7978             {
7979                if(timeDomAllocList->choice.setup)
7980                {
7981                   macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
7982                   for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
7983                   {
7984                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
7985                         *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
7986                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
7987                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
7988                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
7989                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
7990                   }
7991                }
7992             }
7993          }
7994          if(cuPuschCfg->choice.setup->transformPrecoder)
7995             macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
7996       }
7997    }
7998 }
7999
8000 /*******************************************************************
8001  *
8002  * @brief Function to fill pucch Power Control
8003  *
8004  * @details
8005  *
8006  *    Function : extractPucchPowerControl
8007  *
8008  *    Functionality: Function to fill pucch Power Control
8009  *
8010  * @params[in] PucchPowerControl *pwrCtrl,
8011  *             struct PUCCH_PowerControl *cuPwrCtrlCfg
8012  * @return void
8013  *
8014  * ****************************************************************/
8015
8016 void extractPucchPowerControl(PucchPowerControl *pwrCtrl, struct PUCCH_PowerControl *cuPwrCtrlCfg)
8017 {
8018    uint8_t arrIdx;
8019
8020    if(cuPwrCtrlCfg->deltaF_PUCCH_f0)
8021       pwrCtrl->deltaF_Format0 = *cuPwrCtrlCfg->deltaF_PUCCH_f0;
8022    if(cuPwrCtrlCfg->deltaF_PUCCH_f1)
8023       pwrCtrl->deltaF_Format1 = *cuPwrCtrlCfg->deltaF_PUCCH_f1;
8024    if(cuPwrCtrlCfg->deltaF_PUCCH_f2)
8025       pwrCtrl->deltaF_Format2 = *cuPwrCtrlCfg->deltaF_PUCCH_f2;
8026    if(cuPwrCtrlCfg->deltaF_PUCCH_f3)
8027       pwrCtrl->deltaF_Format3 = *cuPwrCtrlCfg->deltaF_PUCCH_f3;
8028    if(cuPwrCtrlCfg->deltaF_PUCCH_f4)
8029       pwrCtrl->deltaF_Format4 = *cuPwrCtrlCfg->deltaF_PUCCH_f4;
8030    if(cuPwrCtrlCfg->p0_Set)
8031    {
8032       pwrCtrl->p0SetCount = cuPwrCtrlCfg->p0_Set->list.count;
8033       for(arrIdx=0; arrIdx < pwrCtrl->p0SetCount; arrIdx++)
8034       {
8035          pwrCtrl->p0Set[arrIdx].p0PucchId =\
8036             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Id;
8037          pwrCtrl->p0Set[arrIdx].p0PucchVal =\
8038             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Value;
8039       }
8040    }
8041    if(cuPwrCtrlCfg->pathlossReferenceRSs)
8042    {
8043       pwrCtrl->pathLossRefRSListCount = cuPwrCtrlCfg->pathlossReferenceRSs->list.count;
8044       for(arrIdx = 0; arrIdx < pwrCtrl->pathLossRefRSListCount; arrIdx++)
8045       {
8046          pwrCtrl->pathLossRefRSList[arrIdx].pathLossRefRSId =\
8047             cuPwrCtrlCfg->pathlossReferenceRSs->list.array[arrIdx]->pucch_PathlossReferenceRS_Id;
8048       }
8049    }
8050 }
8051  
8052  /*******************************************************************
8053  *
8054  * @brief Function to extractResrcSetToAddModList sent by CU
8055  *
8056  * @details
8057  *
8058  *    Function : extractResrcSetToAddModList
8059  *
8060  *    Functionality: Fucntion to extractResrcSetToAddModList
8061  *
8062  * @params[in] PucchResrcSetCfg pointer,
8063  *             struct PUCCH_Config__resourceSetToAddModList pointer
8064  * @return void
8065  *
8066  * ****************************************************************/
8067
8068 void extractResrcSetToAddModList(PucchResrcSetCfg *macRsrcSetList, struct PUCCH_Config__resourceSetToAddModList *cuRsrcSetList)
8069 {
8070    uint8_t arrIdx, rsrcListIdx;
8071
8072    macRsrcSetList->resrcSetToAddModListCount = cuRsrcSetList->list.count; 
8073    for(arrIdx = 0; arrIdx < macRsrcSetList->resrcSetToAddModListCount; arrIdx++)
8074    {
8075       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcSetId     =\
8076          cuRsrcSetList->list.array[arrIdx]->pucch_ResourceSetId;
8077       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount =\
8078          cuRsrcSetList->list.array[arrIdx]->resourceList.list.count;
8079       for(rsrcListIdx = 0; rsrcListIdx < macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount; rsrcListIdx++)
8080       {
8081          macRsrcSetList->resrcSetToAddModList[arrIdx].resrcList[rsrcListIdx] =\
8082             *cuRsrcSetList->list.array[arrIdx]->resourceList.list.array[rsrcListIdx];
8083       }
8084       macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\
8085          *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1;
8086    }
8087 }/* End of extractResrcSetToAddModList */
8088
8089 /*******************************************************************
8090  *
8091  * @brief Fills extractResrcToAddModList sent by CU
8092  *
8093  * @details
8094  *
8095  *    Function : extractResrcToAddModList
8096  *
8097  *    Functionality: Fills extractResrcToAddModList
8098  *
8099  * @params[in] PucchResrcCfg pointer,
8100  *             struct PUCCH_Config__resourceToAddModList pointer
8101  * @return ROk/RFAILED
8102  *
8103  * ****************************************************************/
8104
8105 uint8_t extractResrcToAddModList(PucchResrcCfg *macResrcList, struct PUCCH_Config__resourceToAddModList *cuResrcList)
8106 {
8107    uint8_t arrIdx;
8108    
8109    macResrcList->resrcToAddModListCount = cuResrcList->list.count;
8110    for(arrIdx = 0; arrIdx < macResrcList->resrcToAddModListCount; arrIdx++)
8111    {
8112       macResrcList->resrcToAddModList[arrIdx].resrcId      =\
8113         cuResrcList->list.array[arrIdx]->pucch_ResourceId; 
8114       macResrcList->resrcToAddModList[arrIdx].startPrb     =\
8115         cuResrcList->list.array[arrIdx]->startingPRB;
8116       if(cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping)
8117       {
8118          macResrcList->resrcToAddModList[arrIdx].intraFreqHop =\
8119            *cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping;
8120       }
8121       if(cuResrcList->list.array[arrIdx]->secondHopPRB)
8122       {
8123          macResrcList->resrcToAddModList[arrIdx].secondPrbHop =\
8124            *cuResrcList->list.array[arrIdx]->secondHopPRB;
8125       }
8126       /* PUCCH RSRC FORMAT */
8127       if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format0)
8128       {
8129          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_0;
8130          if(cuResrcList->list.array[arrIdx]->format.choice.format0)
8131          {
8132             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0, sizeof(PucchFormat0));
8133             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0 == NULLP)
8134             {
8135                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format0 in extractResrcToAddModList()");
8136                return RFAILED;
8137             }
8138             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->initialCyclicShift =\
8139                cuResrcList->list.array[arrIdx]->format.choice.format0->initialCyclicShift;
8140             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->numSymbols =\
8141                cuResrcList->list.array[arrIdx]->format.choice.format0->nrofSymbols;
8142             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->startSymbolIdx =\
8143                cuResrcList->list.array[arrIdx]->format.choice.format0->startingSymbolIndex;
8144          }
8145       }
8146       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format1)
8147       {
8148          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_1;
8149          if(cuResrcList->list.array[arrIdx]->format.choice.format1)
8150          {
8151             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1, sizeof(PucchFormat1));
8152             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1 == NULLP)
8153             {
8154                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format1 in extractResrcToAddModList()");
8155                return RFAILED;
8156             }
8157             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->initialCyclicShift =\
8158                 cuResrcList->list.array[arrIdx]->format.choice.format1->initialCyclicShift;
8159             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->numSymbols =\
8160                 cuResrcList->list.array[arrIdx]->format.choice.format1->nrofSymbols;
8161             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->startSymbolIdx =\
8162                 cuResrcList->list.array[arrIdx]->format.choice.format1->startingSymbolIndex;
8163             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->timeDomOCC =\
8164                 cuResrcList->list.array[arrIdx]->format.choice.format1->timeDomainOCC;
8165          }
8166       }
8167       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format2)
8168       {
8169          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_2;
8170          if(cuResrcList->list.array[arrIdx]->format.choice.format2)
8171          {
8172             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2, sizeof(PucchFormat2_3));
8173             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2 == NULLP)
8174             {
8175                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format2 in extractResrcToAddModList()");
8176                return RFAILED;
8177             }
8178             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numPrbs =\
8179                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofPRBs;
8180             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numSymbols =\
8181                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofSymbols;
8182             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->startSymbolIdx =\
8183                 cuResrcList->list.array[arrIdx]->format.choice.format2->startingSymbolIndex;
8184          }
8185       }
8186       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format3)
8187       {
8188          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_3;
8189          if(cuResrcList->list.array[arrIdx]->format.choice.format3)
8190          {
8191             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3, sizeof(PucchFormat2_3));
8192             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3 == NULLP)
8193             {
8194                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format3 in extractResrcToAddModList()");
8195                return RFAILED;
8196             }
8197             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numPrbs =\
8198                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofPRBs;
8199             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numSymbols =\
8200                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofSymbols;
8201             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->startSymbolIdx =\
8202                 cuResrcList->list.array[arrIdx]->format.choice.format3->startingSymbolIndex;
8203          }
8204       }
8205       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format4)
8206       {
8207          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_4;
8208          if(cuResrcList->list.array[arrIdx]->format.choice.format4)
8209          {
8210             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4, sizeof(PucchFormat4));
8211             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4 == NULLP)
8212             {
8213                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format4 in extractResrcToAddModList()");
8214                return RFAILED;
8215             }
8216             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->numSymbols =\
8217                 cuResrcList->list.array[arrIdx]->format.choice.format4->nrofSymbols;
8218             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occLen =\
8219                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Length;
8220             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occIdx =\
8221                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Index;
8222             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->startSymbolIdx =\
8223                 cuResrcList->list.array[arrIdx]->format.choice.format4->startingSymbolIndex;
8224          }
8225       }
8226    }
8227    return ROK;
8228
8229 }/* End of extractResrcToAddModList */
8230
8231 /*******************************************************************
8232  *
8233  * @brief Fills fillPucchSchedReqPeriodAndOffset sent by CU
8234  *
8235  * @details
8236  *
8237  *    Function : fillPucchSchedReqPeriodAndOffset
8238  *
8239  *    Functionality: To fillPucchSchedReqPeriodAndOffset
8240  *
8241  * @params[in] macPeriodicty,
8242  *     SchedulingRequestResourceConfig__periodicityAndOffset pointer
8243  * @return void
8244  *
8245  * ****************************************************************/
8246
8247 void fillPucchSchedReqPeriodAndOffset(uint8_t macPeriodicty, uint16_t  macOffset,\
8248    struct SchedulingRequestResourceConfig__periodicityAndOffset *cuPeriodicty)
8249 {
8250    macPeriodicty = cuPeriodicty->present;
8251    switch(macPeriodicty)
8252    {
8253       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2:
8254          {
8255             macOffset     = cuPeriodicty->choice.sym2;
8256             break;
8257          }
8258       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7:
8259          {
8260             macOffset     = cuPeriodicty->choice.sym6or7;
8261             break;
8262          }
8263       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
8264          {
8265             macOffset     = cuPeriodicty->choice.sl1;
8266             break;
8267          }
8268       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
8269          {
8270             macOffset = cuPeriodicty->choice.sl2;
8271             break;
8272          }
8273       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
8274          {
8275             macOffset = cuPeriodicty->choice.sl4;
8276             break;
8277          }
8278       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
8279          {
8280             macOffset = cuPeriodicty->choice.sl5;
8281             break;
8282          }
8283       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
8284          {
8285             macOffset = cuPeriodicty->choice.sl8;
8286             break;
8287          }
8288       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
8289          {
8290             macOffset = cuPeriodicty->choice.sl10;
8291             break;
8292          }
8293       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
8294          {
8295             macOffset = cuPeriodicty->choice.sl16;
8296             break;
8297          }
8298       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
8299          {
8300             macOffset = cuPeriodicty->choice.sl20;
8301             break;
8302          }
8303       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
8304          {
8305             macOffset = cuPeriodicty->choice.sl40;
8306             break;
8307          }
8308       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
8309          {
8310             macOffset = cuPeriodicty->choice.sl80;
8311             break;
8312          }
8313       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
8314          {
8315             macOffset = cuPeriodicty->choice.sl160;
8316             break;
8317          }
8318       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
8319          {
8320             macOffset = cuPeriodicty->choice.sl320;
8321             break;
8322          }
8323       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
8324          {
8325             macOffset = cuPeriodicty->choice.sl640;
8326             break;
8327          }
8328       default :
8329          DU_LOG("\nERROR  -->  F1AP : Invalid periodicity %d", macPeriodicty);
8330    }
8331 }
8332
8333 /*******************************************************************
8334  *
8335  * @brief Function to extractPucchFormatCfg sent by CU
8336  *
8337  * @details
8338  *
8339  *    Function : extractPucchFormatCfg
8340  *
8341  *    Functionality: Function to extractPucchFormatCfg
8342  *
8343  * @params[in] PucchFormatCfg pointer,
8344  *             PUCCH_FormatConfig_t pointer
8345  * @return void
8346  *
8347  * ****************************************************************/
8348
8349 void extractPucchFormatCfg(PucchFormatCfg *macFormatCfg, PUCCH_FormatConfig_t *cuFormatCfg)
8350  {
8351     if(cuFormatCfg->interslotFrequencyHopping)
8352        macFormatCfg->interSlotFreqHop = *cuFormatCfg->interslotFrequencyHopping;
8353     if(cuFormatCfg->additionalDMRS)  
8354        macFormatCfg->addDmrs = *cuFormatCfg->additionalDMRS;
8355     if(cuFormatCfg->maxCodeRate)
8356        macFormatCfg->maxCodeRate = *cuFormatCfg->maxCodeRate;
8357     if(cuFormatCfg->nrofSlots)  
8358        macFormatCfg->numSlots = *cuFormatCfg->nrofSlots;
8359     if(cuFormatCfg->pi2BPSK)  
8360        macFormatCfg->pi2BPSK = *cuFormatCfg->pi2BPSK;
8361     if(cuFormatCfg->simultaneousHARQ_ACK_CSI)  
8362        macFormatCfg->harqAckCSI = *cuFormatCfg->simultaneousHARQ_ACK_CSI;
8363  }/* End of extractPucchFormatCfg */
8364
8365 /*******************************************************************
8366  *
8367  * @brief Function to extractSchedReqCfgToAddMod sent by CU
8368  *
8369  * @details
8370  *
8371  *    Function : extractSchedReqCfgToAddMod
8372  *
8373  *    Functionality: Function to extractSchedReqCfgToAddMod
8374  *
8375  * @params[in] PucchSchedReqCfg pointer,
8376  *      PUCCH_Config__schedulingRequestResourceToAddModList pointer
8377  * @return void
8378  *
8379  * ****************************************************************/
8380
8381 void extractSchedReqCfgToAddMod(PucchSchedReqCfg *macSchedReqCfg, struct PUCCH_Config__schedulingRequestResourceToAddModList *cuSchedReqList)
8382 {
8383    uint8_t arrIdx;
8384
8385    macSchedReqCfg->schedAddModListCount = cuSchedReqList->list.count;
8386    for(arrIdx = 0; arrIdx <  macSchedReqCfg->schedAddModListCount; arrIdx++)
8387    {
8388       macSchedReqCfg->schedAddModList[arrIdx].resrcId =\
8389          cuSchedReqList->list.array[arrIdx]->schedulingRequestResourceId;
8390       macSchedReqCfg->schedAddModList[arrIdx].requestId =\
8391          cuSchedReqList->list.array[arrIdx]->schedulingRequestID;
8392       if(cuSchedReqList->list.array[arrIdx]->periodicityAndOffset)
8393       {
8394          fillPucchSchedReqPeriodAndOffset(macSchedReqCfg->schedAddModList[arrIdx].periodicity,\
8395             macSchedReqCfg->schedAddModList[arrIdx].offset, cuSchedReqList->list.array[arrIdx]->periodicityAndOffset);
8396       }
8397       if(cuSchedReqList->list.array[arrIdx]->resource)
8398       {
8399          macSchedReqCfg->schedAddModList[arrIdx].resrc =\
8400             *cuSchedReqList->list.array[arrIdx]->resource;
8401       }
8402    }
8403
8404 }/* End of extractSchedReqCfgToAddMod */
8405
8406  /*******************************************************************
8407  *
8408  * @brief Fills PucchCfg received by CU
8409  *
8410  * @details
8411  *
8412  *    Function : extractPucchCfg
8413  *
8414  *    Functionality: Fills PucchCfg received  by CU
8415  *
8416  * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg,
8417  *             PucchCfg *macPucchCfg
8418  * @return ROK/RFAILED
8419  *
8420  * ****************************************************************/
8421
8422 uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg)         
8423 {
8424    uint8_t arrIdx;
8425
8426    if(cuPucchCfg->present == BWP_UplinkDedicated__pucch_Config_PR_setup)
8427    {
8428       if(cuPucchCfg->choice.setup)
8429       {
8430          /* Resource Set Cfg */ 
8431          if(cuPucchCfg->choice.setup->resourceSetToAddModList)
8432          {
8433             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrcSet, sizeof(PucchResrcSetCfg));
8434             if(macPucchCfg->resrcSet == NULLP)
8435             {
8436                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc set List in extractPucchCfg()");
8437                return RFAILED;
8438             }
8439             memset(macPucchCfg->resrcSet, 0, sizeof(PucchResrcSetCfg));
8440             extractResrcSetToAddModList(macPucchCfg->resrcSet, cuPucchCfg->choice.setup->resourceSetToAddModList);
8441          }
8442          
8443          /* Resource Cfg */ 
8444          if(cuPucchCfg->choice.setup->resourceToAddModList)
8445          {
8446             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrc, sizeof(PucchResrcCfg));
8447             if(macPucchCfg->resrc == NULLP)
8448             {
8449                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc List in extractPucchCfg()");
8450                return RFAILED;
8451             }
8452             memset(macPucchCfg->resrc, 0, sizeof(PucchResrcCfg));
8453             extractResrcToAddModList(macPucchCfg->resrc, cuPucchCfg->choice.setup->resourceToAddModList);
8454          }
8455          
8456          /* Format 1 Cfg */ 
8457          if(cuPucchCfg->choice.setup->format1)
8458          {
8459             DU_ALLOC_SHRABL_BUF(macPucchCfg->format1, sizeof(PucchFormatCfg));
8460             if(macPucchCfg->format1 == NULLP)
8461             {
8462                DU_LOG("\nERROR --> F1AP : Failed to extract format 1 Cfg in  extractPucchCfg()");
8463                return RFAILED;
8464             }
8465             memset(macPucchCfg->format1, 0, sizeof(PucchFormatCfg));
8466             extractPucchFormatCfg(macPucchCfg->format1,\
8467                cuPucchCfg->choice.setup->format1->choice.setup);
8468          }
8469          
8470          /* Format 2 Cfg */
8471          if(cuPucchCfg->choice.setup->format2)
8472          {
8473             DU_ALLOC_SHRABL_BUF(macPucchCfg->format2, sizeof(PucchFormatCfg));
8474             if(macPucchCfg->format2 == NULLP)
8475             {
8476                DU_LOG("\nERROR --> F1AP : Failed to extract format 2 Cfg in  extractPucchCfg()");
8477                return RFAILED;
8478             }
8479             memset(macPucchCfg->format2, 0, sizeof(PucchFormatCfg));
8480             extractPucchFormatCfg(macPucchCfg->format2,\
8481                cuPucchCfg->choice.setup->format2->choice.setup);
8482          }
8483          
8484          /* Format 3 Cfg */
8485          if(cuPucchCfg->choice.setup->format3)
8486          {
8487             DU_ALLOC_SHRABL_BUF(macPucchCfg->format3, sizeof(PucchFormatCfg));
8488             if(macPucchCfg->format3 == NULLP)
8489             {
8490                DU_LOG("\nERROR --> F1AP : Failed to extract format 3 Cfg in  extractPucchCfg()");
8491                return RFAILED;
8492             }
8493             memset(macPucchCfg->format3, 0, sizeof(PucchFormatCfg));
8494             extractPucchFormatCfg(macPucchCfg->format3,\
8495                cuPucchCfg->choice.setup->format3->choice.setup);
8496          }
8497
8498          /* Format 4 Cfg */
8499          if(cuPucchCfg->choice.setup->format4)
8500          {
8501             DU_ALLOC_SHRABL_BUF(macPucchCfg->format4, sizeof(PucchFormatCfg));
8502             if(macPucchCfg->format4 == NULLP)
8503             {
8504                DU_LOG("\nERROR --> F1AP : Failed to extract format 4 Cfg in  extractPucchCfg()");
8505                return RFAILED;
8506             }
8507             memset(macPucchCfg->format4, 0, sizeof(PucchFormatCfg));
8508             extractPucchFormatCfg(macPucchCfg->format4,\
8509                cuPucchCfg->choice.setup->format4->choice.setup);
8510          }
8511
8512          /* Sched Req List */
8513          if(cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList)
8514          {
8515             DU_ALLOC_SHRABL_BUF(macPucchCfg->schedReq, sizeof(PucchSchedReqCfg));
8516             if(macPucchCfg->schedReq == NULLP)
8517             {
8518                DU_LOG("\nERROR --> F1AP : Failed to extract schedReqCfg in  extractPucchCfg()");
8519                return RFAILED;
8520             }
8521             memset(macPucchCfg->schedReq, 0, sizeof(PucchSchedReqCfg));
8522             extractSchedReqCfgToAddMod(macPucchCfg->schedReq,\
8523             cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList);
8524          }
8525
8526          /*TODO: Add support for  Spatial Info */
8527
8528          /* MultiCsiCfg */
8529          if(cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList)
8530          {
8531             DU_ALLOC_SHRABL_BUF(macPucchCfg->multiCsiCfg, sizeof(PucchMultiCsiCfg));
8532             if(macPucchCfg->multiCsiCfg == NULLP)
8533             {
8534                DU_LOG("\nERROR --> F1AP : Failed to extract multiCsiCfg in  extractPucchCfg()");
8535                return RFAILED;
8536             }
8537             memset(macPucchCfg->multiCsiCfg, 0, sizeof(PucchMultiCsiCfg));
8538             macPucchCfg->multiCsiCfg->multiCsiResrcListCount = cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.count;
8539             for(arrIdx =0; arrIdx < macPucchCfg->multiCsiCfg->multiCsiResrcListCount; arrIdx++)
8540             {
8541                macPucchCfg->multiCsiCfg->multiCsiResrcList[arrIdx] =\
8542                  *cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.array[arrIdx];
8543             }
8544          }
8545
8546          /* Dl_DataToUL_ACK */ 
8547          if(cuPucchCfg->choice.setup->dl_DataToUL_ACK)
8548          {
8549             DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
8550             if(macPucchCfg->dlDataToUlAck == NULLP)
8551             {
8552                DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
8553                return RFAILED;
8554             }
8555             memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
8556             macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
8557             for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
8558             {
8559                macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
8560                   *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
8561             }
8562          }
8563
8564          /* Power Control */
8565          if(cuPucchCfg->choice.setup->pucch_PowerControl)
8566          {
8567             DU_ALLOC_SHRABL_BUF(macPucchCfg->powerControl, sizeof(PucchPowerControl));
8568             if(macPucchCfg->powerControl == NULLP)
8569             {
8570                DU_LOG("\nERROR --> F1AP : Failed to extract power control in extractPucchCfg()");
8571                return RFAILED;
8572             }
8573             extractPucchPowerControl(macPucchCfg->powerControl,\
8574                cuPucchCfg->choice.setup->pucch_PowerControl);
8575          }
8576       }
8577    }
8578    return ROK;
8579 }
8580
8581 /*******************************************************************
8582  *
8583  * @brief Fills ServingCellReconfig received by CU
8584  *
8585  * @details
8586  *
8587  *    Function : extractSpCellDedicatedCfg
8588  *
8589  *    Functionality: Fills ServingCellReconfig received  by CU
8590  *
8591  * @params[in] ServingCellConfig_t *cuSrvCellCfg
8592  *             ServCellCfgInfo *macSrvCellCfg
8593  * @return ROK/RFAILD
8594  *
8595  * ****************************************************************/
8596 uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg)
8597 {
8598    uint8_t ret = ROK;
8599    BWP_DownlinkDedicated_t *dlBwp = NULLP;
8600    BWP_UplinkDedicated_t   *ulBwp = NULLP;
8601
8602    if(cuSrvCellCfg->initialDownlinkBWP)
8603    {
8604       dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
8605       if(dlBwp->pdcch_Config)
8606       {
8607          if(dlBwp->pdcch_Config->choice.setup)
8608          {
8609             macSrvCellCfg->initDlBwp.pdcchPresent = true;
8610             extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
8611          }
8612       }
8613       if(dlBwp->pdsch_Config)
8614       {
8615          if(dlBwp->pdsch_Config->choice.setup)
8616          {
8617             macSrvCellCfg->initDlBwp.pdschPresent = true;
8618             extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg);
8619          }
8620       }
8621    }
8622    if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
8623       macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
8624    if(cuSrvCellCfg->defaultDownlinkBWP_Id)
8625       macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
8626    if(cuSrvCellCfg->bwp_InactivityTimer)
8627    {
8628       if(macSrvCellCfg->bwpInactivityTmr)
8629       {
8630          memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
8631       }
8632       else
8633       {
8634          macSrvCellCfg->bwpInactivityTmr = NULLP;
8635          DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
8636          if(macSrvCellCfg->bwpInactivityTmr)
8637          {
8638             memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
8639          }
8640          else
8641          {
8642             DU_LOG("\nERROR  --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
8643             return RFAILED;
8644          }
8645       }
8646    }
8647    if(cuSrvCellCfg->pdsch_ServingCellConfig)
8648    {
8649       if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
8650       {
8651          ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
8652          if(ret == RFAILED)
8653          {
8654             DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
8655             return RFAILED;
8656          }
8657       }
8658    }
8659    if(cuSrvCellCfg->uplinkConfig)
8660    {
8661      if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
8662      {
8663         ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
8664         if(ulBwp->pusch_Config)
8665         {
8666            macSrvCellCfg->initUlBwp.puschPresent = true;
8667            extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
8668         }
8669         if(ulBwp->pucch_Config)
8670         {
8671            macSrvCellCfg->initUlBwp.pucchPresent = true;
8672            memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
8673            extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg); 
8674         }
8675      }
8676      if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
8677         macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
8678    }
8679    return ret;
8680 }
8681 /*******************************************************************
8682  *
8683  * @brief Fills Reconfig Cell group Info received by CU
8684  *
8685  * @details
8686  *
8687  *    Function : extractUeReCfgCellInfo
8688  *
8689  *    Functionality: Fills Reconfig Cell group Info received by CU
8690  *
8691  * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
8692  *             MacUeCfg*  macUeCfg
8693  * @return ROK/RFAILED
8694  *
8695  * ****************************************************************/
8696 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg)
8697 {
8698    uint8_t ret = ROK;
8699    MAC_CellGroupConfig_t     *macCellGroup = NULLP;
8700    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
8701    SpCellConfig_t            *spcellCfg = NULLP;
8702    ServingCellConfig_t       *servCellCfg = NULLP;
8703
8704    if(cellGrp)
8705    {
8706       /* Fill MacCell Group Reconfig  */
8707       if(cellGrp->mac_CellGroupConfig)
8708       {
8709          macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
8710          if(macCellGroup->schedulingRequestConfig)
8711          {
8712             extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
8713          }
8714          if(macCellGroup->tag_Config)
8715          {
8716             extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
8717          }
8718          if(macCellGroup->bsr_Config)
8719          {
8720             macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
8721             macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer     = macCellGroup->bsr_Config->retxBSR_Timer;
8722             if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
8723             {
8724                macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer  =\
8725                   *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
8726             }
8727          }
8728          if(macCellGroup->phr_Config)
8729          {
8730             if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
8731             {
8732                macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
8733                if(macCellGroup->phr_Config->choice.setup)
8734                {
8735                 macUeCfg->macCellGrpCfg.phrCfg.periodicTimer     = \
8736                    macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
8737                 macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer     = \
8738                    macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
8739                 macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor     = \
8740                    macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
8741                 macUeCfg->macCellGrpCfg.phrCfg.multiplePHR       = \
8742                    macCellGroup->phr_Config->choice.setup->multiplePHR;
8743                 macUeCfg->macCellGrpCfg.phrCfg.dummy             = \
8744                    macCellGroup->phr_Config->choice.setup->dummy;
8745                 macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
8746                    macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
8747                 macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG        = \
8748                    macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
8749                }
8750             }
8751          }
8752       }
8753       /* Fill Physical Cell Group Reconfig */
8754       if(cellGrp->physicalCellGroupConfig)
8755       {
8756          phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
8757          if(phyCellGrpCfg->p_NR_FR1)
8758          {
8759             if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
8760                macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
8761          }
8762          macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
8763       }
8764       /* Fill SpCell Reconfig */
8765       if(cellGrp->spCellConfig)
8766       {
8767          spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));  
8768          if(spcellCfg->servCellIndex)
8769          {
8770             macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
8771          }
8772          /* Fill Serving cell Reconfig info */
8773          if(cellGrp->spCellConfig->spCellConfigDedicated)
8774          {
8775             servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
8776             ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
8777             if(ret == RFAILED)
8778             {
8779                DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
8780             }
8781          }
8782       }
8783    }
8784    return ret;
8785 }
8786 /*******************************************************************
8787 *
8788 * @brief free the memory allocated by decoder
8789 *
8790 * @details
8791 *
8792 *    Function : freeAperDecodeNrcgi 
8793 *
8794 *    Functionality: Free Nrcgi values
8795 *
8796 * @params[in] NRCGI_t *nrcgi
8797 * @return void
8798 *
8799 * ****************************************************************/
8800
8801
8802 void freeAperDecodeNrcgi(NRCGI_t *nrcgi)
8803 {
8804     if(nrcgi->pLMN_Identity.buf != NULLP)
8805     {
8806        free(nrcgi->pLMN_Identity.buf);
8807     }
8808     if(nrcgi->nRCellIdentity.buf != NULLP)
8809     {
8810        free(nrcgi->nRCellIdentity.buf);
8811     }
8812 }
8813 /*******************************************************************
8814 *
8815 * @brief free the memory allocated by decoder
8816 *
8817 * @details
8818 *
8819 *    Function : freeAperDecodeCuToDuInfo 
8820 *
8821 *    Functionality:  Free Cu To Du Information
8822 *
8823 * @params[in] CUtoDURRCInformation_t *rrcMsg
8824 * @return void
8825 *
8826 * ****************************************************************/
8827
8828
8829 void freeAperDecodeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8830 {
8831    uint8_t ieIdx =0;
8832    uint8_t arrIdx =0;
8833
8834    if(rrcMsg->uE_CapabilityRAT_ContainerList)
8835    {
8836       if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8837          free(rrcMsg->uE_CapabilityRAT_ContainerList->buf);
8838       free(rrcMsg->uE_CapabilityRAT_ContainerList);
8839    }
8840
8841    if(rrcMsg->iE_Extensions)
8842    {
8843       if(rrcMsg->iE_Extensions->list.array)
8844       {
8845          for(ieIdx= 0; ieIdx < rrcMsg->iE_Extensions->list.count; ieIdx++)
8846          {
8847             if(rrcMsg->iE_Extensions->list.array[ieIdx])
8848             {
8849                switch(rrcMsg->iE_Extensions->list.array[ieIdx]->id)
8850                {
8851                   case ProtocolIE_ID_id_CellGroupConfig:
8852                      if(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8853                      {
8854                         free(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf);
8855                      }
8856                      break;
8857                   default:
8858                      DU_LOG("\nERROR  -->  F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8859                            rrcMsg->iE_Extensions->list.array[ieIdx]->id);
8860                      break;
8861                }
8862             }
8863          }
8864          for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
8865          {
8866             free(rrcMsg->iE_Extensions->list.array[arrIdx]);
8867          }
8868          free(rrcMsg->iE_Extensions->list.array);
8869
8870       }
8871
8872       free(rrcMsg->iE_Extensions);
8873    }
8874 }
8875 /*******************************************************************
8876 *
8877 * @brief free the memory allocated by decoder
8878 *
8879 * @details 
8880 *
8881 *    Function : freeAperDecodeSplCellList
8882 *
8883 *    Functionality: Free Spl Cell List 
8884                     where memory allocated by aper_decoder
8885 *
8886 * @params[in]  SCell_ToBeSetup_List_t *spCellLst
8887 * @return void
8888 *
8889 * ****************************************************************/
8890
8891
8892 void freeAperDecodeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
8893 {
8894     uint8_t  cellIdx =0;
8895
8896     if(spCellLst->list.array != NULLP)
8897     {
8898        for(cellIdx=0; cellIdx<spCellLst->list.count; cellIdx++)
8899        {
8900           if(cellIdx==0&&spCellLst->list.array[cellIdx]!=NULLP)
8901           {
8902              freeAperDecodeNrcgi(&spCellLst->list.array[cellIdx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
8903           }
8904           if(spCellLst->list.array[cellIdx]!=NULLP)
8905           {
8906              free(spCellLst->list.array[cellIdx]);
8907           }
8908        }
8909        free(spCellLst->list.array);
8910     }
8911 }
8912 /*******************************************************************
8913 *
8914 * @brief free the memory allocated by decoder
8915 *
8916 * @details
8917 *
8918 *    Function : freeAperDecodeSRBSetup 
8919 *
8920 *    Functionality: added free part for the memory allocated by aper_decoder
8921 *
8922 * @params[in] SRBs_ToBeSetup_List_t *srbSet
8923 * @return void
8924 *
8925 ****************************************************************/
8926
8927
8928 void freeAperDecodeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
8929 {
8930     uint8_t srbIdx =0;
8931     if(srbSet->list.array != NULLP)
8932     {
8933        for(srbIdx=0; srbIdx<srbSet->list.count; srbIdx++)
8934        {
8935           if(srbSet->list.array[srbIdx]!=NULLP)
8936           {
8937              free(srbSet->list.array[srbIdx]);
8938           }
8939        }
8940        free(srbSet->list.array);
8941     }
8942 }
8943
8944 /*******************************************************************
8945 *
8946 * @brief free the memory allocated by decoder
8947 *
8948 * @details
8949 *
8950 *    Function : freeAperDecodeULTnlInfo
8951 *
8952 *    Functionality: added free part for the memory allocated by aper_decoder
8953 *
8954 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
8955 * @return void
8956 *
8957 * ****************************************************************/
8958
8959
8960 void freeAperDecodeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
8961 {
8962    uint8_t ulIdx=0;
8963    if(ulInfo->list.array != NULLP)
8964    {
8965       for(ulIdx=0; ulIdx<ulInfo->list.count; ulIdx++)
8966       {
8967          if(ulIdx==0&&ulInfo->list.array[ulIdx]!=NULLP)
8968          {
8969             if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
8970             {
8971                if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
8972                      transportLayerAddress.buf != NULLP)
8973                {
8974                   if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
8975                         !=NULLP)
8976                   {
8977                      free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf);
8978                   }
8979                   free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
8980                         transportLayerAddress.buf);
8981                }
8982                free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel);
8983             }
8984          }
8985          if(ulInfo->list.array[ulIdx]!=NULLP)
8986          {
8987             free(ulInfo->list.array[ulIdx]);
8988          }
8989       }
8990       free(ulInfo->list.array);
8991    }
8992 }
8993 /*******************************************************************
8994 *
8995 * @brief free the memory allocated by decoder
8996 *
8997 * @details
8998 *
8999 *    Function : freeAperDecodeDRBSetup  
9000 *
9001 *    Functionality: free DRBSetup which is allocated by decoder
9002 *
9003 * @params[in]  DRBs_ToBeSetup_List_t *drbSet
9004 * @return void
9005 *
9006 * ****************************************************************/
9007
9008 void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
9009 {
9010    DRBs_ToBeSetup_Item_t *drbSetItem = NULLP;
9011    uint8_t  flowIdx =0;
9012    uint8_t  drbIdx =0;
9013    
9014    if(drbSet->list.array != NULLP)
9015    {
9016       for(drbIdx=0; drbIdx<drbSet->list.count; drbIdx++)
9017       {
9018          if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
9019          {
9020             drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9021             if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
9022             {
9023                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9024                      qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
9025                {
9026                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9027                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9028                   {
9029                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9030                            qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9031                      {
9032
9033                         if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
9034                         {
9035
9036                            if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
9037                            {
9038
9039                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
9040                               buf!=NULLP)
9041                               {
9042
9043                                  if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
9044                                        flows_Mapped_To_DRB_List.list.array != NULLP)
9045                                  {
9046
9047                                     for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9048                                     DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
9049                                     {
9050
9051                                        if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9052                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9053                                        {
9054                                           if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9055                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9056                                                 qoSFlowLevelQoSParameters.\
9057                                                 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
9058                                           {
9059                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9060                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9061                                                    qoSFlowLevelQoSParameters.\
9062                                                    qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9063                                              {
9064
9065                                                 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9066                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9067                                                       qoSFlowLevelQoSParameters.\
9068                                                       qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9069                                                 {
9070                                                    freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
9071                                                    free(drbSetItem->uLConfiguration);
9072
9073
9074                                                    free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9075                                                          DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9076                                                          qoSFlowLevelQoSParameters.\
9077                                                          qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9078                                                 }
9079
9080                                                 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9081                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9082                                                       qoSFlowLevelQoSParameters.\
9083                                                       qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9084                                              }
9085
9086                                              free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9087
9088                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9089                                                    qoSFlowLevelQoSParameters.\
9090                                                    qoS_Characteristics.choice.non_Dynamic_5QI);
9091                                           }
9092                                        }
9093                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9094                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9095                                        {
9096
9097                                           free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9098                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
9099                                        }
9100                                     }
9101
9102                                     free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9103                                           DRB_Information.flows_Mapped_To_DRB_List.list.array);
9104                                  }
9105
9106                                  free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9107                                  DRB_Information.sNSSAI.sD->buf);
9108                               }
9109
9110                               free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
9111                            }
9112
9113                            free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
9114
9115                         }
9116
9117                         free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9118
9119                               qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9120                      }
9121
9122                      free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9123                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9124                   }
9125
9126                   free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9127                         qoS_Characteristics.choice.non_Dynamic_5QI);
9128                }
9129                free(drbSetItem->qoSInformation.choice.choice_extension);
9130             }
9131          }
9132          if(drbSet->list.array[drbIdx]!=NULLP)
9133          {
9134             free(drbSet->list.array[drbIdx]);
9135          }
9136       }
9137       free(drbSet->list.array);
9138    }
9139 }
9140
9141
9142 /*******************************************************************
9143  *
9144  * @brief builds Mac Cell Cfg
9145  *
9146  * @details
9147  *
9148  *    Function : procUeReCfgCellInfo
9149  *
9150  *    Functionality: builds Mac Cell Cfg
9151  *
9152  * @params[in] MacUeCfg pointer
9153  *             void pointer
9154  *
9155  * @return void 
9156  *
9157  * ****************************************************************/
9158 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, void *cellInfo)
9159 {
9160    uint8_t ret = ROK;
9161    CellGroupConfigRrc_t *cellGrp = NULLP;
9162
9163    if(cellInfo)
9164    {
9165       cellGrp = (CellGroupConfigRrc_t *)cellInfo;
9166       ret = extractUeReCfgCellInfo(cellGrp, macUeCfg);
9167       if(ret == RFAILED)
9168          DU_LOG("\nERROR  -->  F1AP : Failed at procUeReCfgCellInfo()");
9169    }
9170    if(ret == RFAILED)
9171    {
9172       freeUeReCfgCellGrpInfo(macUeCfg);
9173    }
9174    return ret;
9175 }
9176
9177 /*******************************************************************
9178  *
9179  * @brief Filling modulation info in mac ue cfg
9180  *
9181  * @details
9182  *
9183  *    Function : duFillModulationDetails
9184  *
9185  *    Functionality: Filling modulation info in mac ue cfg
9186  *
9187  * @params[in] MAC UE Config to be updated
9188  *             Current UE configuration
9189  *             UE NR capability from CU
9190  * @return ROK     - success
9191  *         RFAILED - failure
9192  *
9193  * ****************************************************************/
9194 void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
9195 {
9196    UE_NR_Capability_t *ueNrCap;
9197
9198    if(ueCap)
9199       ueNrCap = (UE_NR_Capability_t *)ueCap;
9200
9201    /* Filling DL modulation info */
9202    if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
9203          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
9204          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
9205    {
9206       switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
9207       {
9208          case ModulationOrder_qpsk:
9209             {
9210                ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
9211                break;
9212             }
9213          case ModulationOrder_qam16:
9214             {
9215                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
9216                break;
9217             }
9218          case ModulationOrder_qam64:
9219             {
9220                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
9221                ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
9222                ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
9223                break;
9224             }
9225          case ModulationOrder_qam256:
9226             {
9227                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
9228                break;
9229             }
9230          default:
9231             {
9232                DU_LOG("\nERROR  -->  DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
9233                memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9234                break;
9235             }
9236       }
9237    }
9238    else
9239    {
9240       memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9241    }
9242
9243    /* Filling UL modulation info */
9244    if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
9245          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
9246          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
9247    {
9248       switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
9249       {
9250          case ModulationOrder_qpsk:
9251             {
9252                ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
9253                break;
9254             }
9255          case ModulationOrder_qam16:
9256             {
9257                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
9258                ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
9259                ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
9260                break;
9261             }
9262          case ModulationOrder_qam64:
9263             {
9264                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
9265                break;
9266             }
9267          case ModulationOrder_qam256:
9268             {
9269                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
9270                break;
9271             }
9272          default:
9273             {
9274                DU_LOG("\nERROR  -->  DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
9275                memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9276                break;
9277             }
9278       }
9279    }
9280    else
9281    {
9282       memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9283    }
9284 }
9285
9286 /*******************************************************************
9287  *
9288  * @brief Function to extract cellGrp Info present in cutoDu cont
9289  *
9290  * @details
9291  *
9292  *    Function : extractCellGrpInfo
9293  *
9294  *    Functionality: Function to extract cellGrp Info present
9295  *                   in cutoDu cont
9296  *
9297  * @params[in] ProtocolExtensionContainer_4624P16_t pointer
9298  *
9299  * @return CellGroupConfigRrc_t *
9300  *
9301  * ****************************************************************/
9302
9303 CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
9304    DuUeCfg *ueCfgDb)
9305 {
9306    uint8_t idx2 =0;
9307    uint16_t id =0;
9308    uint16_t recvBufLen =0;
9309    CellGroupConfigRrc_t *cellGrpCfg = NULLP;
9310    CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
9311    asn_dec_rval_t rval; /* Decoder return value */
9312    memset(&rval, 0, sizeof(asn_dec_rval_t));
9313
9314    if(protocolIeExtn)
9315    {
9316       for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++)
9317       {
9318          extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2]));
9319          id = extIeInfo->id;
9320          switch(id)
9321          {
9322             case ProtocolIE_ID_id_CellGroupConfig:
9323             {
9324                recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
9325                /* decoding the CellGroup Buf received */
9326                DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
9327                if(cellGrpCfg)
9328                {
9329                   memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
9330                   rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
9331                      extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
9332                   if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9333                   {
9334                      DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9335                      return NULLP;
9336                   }
9337                   xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
9338                   if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
9339                      return NULLP;
9340                }
9341                break;
9342             }
9343             default:
9344                DU_LOG("\nERROR  -->  F1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id);
9345                break;
9346          }
9347       }
9348    }
9349    return cellGrpCfg;
9350 }
9351
9352 /*******************************************************************
9353  *
9354  * @brief Fills Srb List received by CU
9355  *
9356  * @details
9357  *
9358  *    Function : procSrbListToSetup
9359  *
9360  *    Functionality: Fills Srb List received  by CU
9361  *
9362  * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
9363  *             LcCfg pointer
9364  *             RlcBearerCfg pointer
9365  * @return void
9366  *
9367  * ****************************************************************/
9368 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
9369 {
9370    uint8_t ret = ROK;
9371
9372    /* Filling RLC INFO */
9373    procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
9374
9375    /* Filling MAC INFO */
9376    ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL, NULL, macLcToAdd, NULL);
9377    if(ret == RFAILED)
9378    { 
9379       DU_LOG("\nERROR  -->  F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
9380       return ret;
9381    }
9382    return ret;
9383 }
9384
9385
9386
9387 /*******************************************************************
9388  *
9389  * @brief extract Srb List received by CU
9390  *
9391  * @details
9392  *
9393  *    Function : extractSrbListToSetup
9394  *
9395  *    Functionality: extract Srb List received by CU
9396  *                   for both MAC and RLC
9397  *
9398  * @params[in] SRBs_ToBeSetup_Item_t pointer
9399  *             DuUeCfg pointer
9400  * @return ROK/RFAIED
9401  *
9402  * ****************************************************************/
9403
9404 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
9405 {
9406    uint8_t ret, srbIdx;
9407    SRBs_ToBeSetup_Item_t *srbItem = NULLP;
9408
9409    if(srbCfg)
9410    {
9411       for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
9412       {
9413          srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
9414          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9415          { 
9416             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in MAC");
9417             ret = RFAILED;
9418             break;
9419          }
9420          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9421          {
9422             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in RLC");
9423             ret = RFAILED;
9424             break;
9425          }
9426          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9427          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9428          ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9429             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
9430          ueCfgDb->numRlcLcs++;
9431          ueCfgDb->numMacLcs++;
9432          if(ret == RFAILED)
9433          {
9434             DU_LOG("\nERROR  -->  F1AP:  Failed at extractSrbListToSetup()");
9435             break;
9436          }
9437       }
9438    }
9439    else
9440       ret = RFAILED;
9441
9442    return ret;
9443 }
9444
9445 /*******************************************************************
9446  *
9447  * @brief Fills Drb List received by CU
9448  *
9449  * @details
9450  *
9451  *    Function : procDrbListToSetup
9452  *
9453  *    Functionality: Fills Drb List received by CU
9454  *                   for both MAC and RLC
9455  *
9456  * @params[in] SRBs_ToBeSetup_Item_t pointer
9457  *             LcCfg pointer,
9458  *             RlcBearerCfg pointer
9459  * @return void
9460  *
9461  * ****************************************************************/
9462
9463 uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\
9464    LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo)
9465 {
9466    uint8_t ret = ROK;
9467
9468    /* Filling RLC INFO */
9469    procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
9470
9471    /* Filling MAC INFO */
9472    ret = procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, macLcToAdd, upTnlInfo);
9473    if(ret == RFAILED)
9474    { 
9475       DU_LOG("\nERROR  --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
9476       return ret;
9477    }
9478
9479    return ret;
9480 }
9481
9482 /*******************************************************************
9483  *
9484  * @brief extract Drb List received by CU
9485  *
9486  * @details
9487  *
9488  *    Function : extractDrbListToSetup
9489  *
9490  *    Functionality: extract Drb List received by CU
9491  *                   for both MAC and RLC
9492  *
9493  * @params[in] DRBs_ToBeSetup_Item_t pointer
9494  *             DuUeCfg pointer
9495  * @return ROK/RFAIED
9496  *
9497  * ****************************************************************/
9498
9499 uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg, DuUeCfg *ueCfgDb)
9500 {
9501    uint8_t ret, drbIdx;
9502    DRBs_ToBeSetup_Item_t *drbItem = NULLP;
9503
9504    ret = ROK;
9505    if(drbCfg)
9506    {
9507       for(drbIdx = 0; drbIdx < drbCfg->list.count; drbIdx++)
9508       {
9509          drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9510          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9511          { 
9512             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in MAC at extractDrbListToSetup()");
9513             ret = RFAILED;
9514             break;
9515          }
9516          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9517          {
9518             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in RLC at extractDrbListToSetup()");
9519             ret = RFAILED;
9520             break;
9521          }
9522          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9523          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9524          ret = procDrbListToSetup(lcId, drbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9525             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
9526
9527          ueCfgDb->numRlcLcs++;
9528          ueCfgDb->numMacLcs++;
9529          ueCfgDb->numDrb++;
9530          if(ret == RFAILED)
9531          {
9532             DU_LOG("\nERROR  -->  F1AP :  Failed at extractDrbListToSetup()");
9533             break;
9534          }
9535       }
9536    }
9537    else
9538       ret = RFAILED;
9539
9540    return ret;
9541 }
9542
9543 /*******************************************************************
9544  *
9545  * @brief Function to extract Dl RRC Msg received from CU
9546  *
9547  * @details
9548  *
9549  *    Function : extractDlRrcMsg
9550  *
9551  *    Functionality: Function to extract Dl RRC Msg received from CU
9552  *
9553  * @params[in] F1AP message
9554  * @return ROK     - success
9555  *         RFAILED - failure
9556  *
9557  * ****************************************************************/
9558
9559 uint8_t extractDlRrcMsg(uint32_t gnbDuUeF1apId, uint32_t gnbCuUeF1apId, \
9560    F1DlRrcMsg *dlRrcMsg, RRCContainer_t *rrcContainer)
9561 {
9562    uint8_t ret = ROK;
9563    dlRrcMsg->rrcMsgSize = rrcContainer->size;
9564    if(dlRrcMsg->rrcMsgSize > 0)
9565    {
9566       DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
9567       if(!dlRrcMsg->rrcMsgPdu)
9568       {
9569          DU_LOG("\nERROR  --> DU APP : Memory allocation failed for RRC Msg in extractDlRrcMsg()");
9570          ret = RFAILED;
9571       }
9572       else
9573       {
9574          dlRrcMsg->gnbDuUeF1apId = gnbDuUeF1apId;
9575          dlRrcMsg->gnbCuUeF1apId = gnbCuUeF1apId;
9576          dlRrcMsg->srbId = SRB1_LCID;
9577          memcpy(dlRrcMsg->rrcMsgPdu, rrcContainer->buf, dlRrcMsg->rrcMsgSize);
9578       }
9579    }
9580    return ret;
9581 }
9582
9583 /*******************************************************************
9584  *
9585  * @brief Extract UE capability info 
9586  *
9587  * @details
9588  *
9589  *    Function : extractUeCapability
9590  *
9591  *    Functionality: Extract UE capability info and stores in ue Cb
9592  *
9593  * @params[in] Octet string of UE capability RAT container list
9594  * @return ROK     - success
9595  *         RFAILED - failure
9596  *
9597  * ****************************************************************/
9598 UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf, DuUeCb *ueCb)
9599 {
9600    uint8_t  idx;
9601    uint16_t recvBufLen;
9602    asn_dec_rval_t rval;
9603    UE_NR_Capability_t  *ueNrCap = NULLP;
9604    UE_CapabilityRAT_ContainerListRRC_t  *ueCapRatContList = NULLP;
9605
9606    /* Decoding UE Capability RAT Container List */
9607    recvBufLen = ueCapablityListBuf->size;
9608    DU_ALLOC(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9609    if(!ueCapRatContList)
9610    {
9611       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
9612       return NULLP;
9613    }
9614    memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9615    memset(&rval, 0, sizeof(asn_dec_rval_t));
9616    rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList,
9617           ueCapablityListBuf->buf, recvBufLen, 0, 0);
9618    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9619    {
9620       DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9621       return NULLP;
9622    }
9623    xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, ueCapRatContList);
9624
9625    /* Free encoded buffer after decoding */
9626
9627    for(idx = 0; idx < ueCapRatContList->list.count; idx++)
9628    {
9629       if(ueCapRatContList->list.array[idx]->rat_Type == RAT_Type_nr)
9630       {
9631          /* Decoding UE NR Capability */
9632           recvBufLen = ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.size;
9633           DU_ALLOC(ueNrCap, sizeof(UE_NR_Capability_t));
9634           if(!ueNrCap)
9635           {
9636              DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
9637              DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9638              return NULLP;
9639           } 
9640           memset(ueNrCap, 0, sizeof(UE_NR_Capability_t));
9641           memset(&rval, 0, sizeof(asn_dec_rval_t));
9642           rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap,
9643                  ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0);
9644           if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9645           {
9646              DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9647              return NULLP;
9648           }
9649           xer_fprint(stdout, &asn_DEF_UE_NR_Capability, ueNrCap);
9650           
9651           /* Free encoded buffer after decoding */
9652           free(ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf);
9653       }
9654       free(ueCapRatContList->list.array[idx]);
9655    }
9656
9657    /* Free Memory*/
9658    free(ueCapRatContList->list.array);
9659    DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9660    return ueNrCap;
9661 }
9662  
9663 /*******************************************************************
9664 *
9665 * @brief free UE context setup request from CU
9666 *
9667 * @details
9668 *
9669 *    Function : freeAperDecodeF1UeContextSetupReq
9670 *
9671 *    Functionality: freeing part for the memory allocated by aper_decoder
9672 *
9673 * @params[in] F1AP message
9674 * @return ROK     - success
9675 *         RFAILED - failure
9676 *
9677 * ****************************************************************/
9678 void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t   *ueSetReq)
9679 {
9680    uint8_t ieIdx = 0;
9681
9682    if(ueSetReq->protocolIEs.list.array != NULLP)
9683    {
9684       for(ieIdx = 0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++)
9685       {
9686          if(ueSetReq->protocolIEs.list.array[ieIdx])
9687          {
9688             switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
9689             {
9690                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9691                   break;
9692                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9693                   break;
9694                case ProtocolIE_ID_id_SpCell_ID:
9695                   freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
9696                   break;
9697                case ProtocolIE_ID_id_ServCellIndex:
9698                   break;
9699                case ProtocolIE_ID_id_SpCellULConfigured:
9700                   break;
9701                case ProtocolIE_ID_id_CUtoDURRCInformation:
9702
9703                   freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation);
9704                   break;
9705                case ProtocolIE_ID_id_SCell_ToBeSetup_List:
9706
9707                   freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List);
9708                   break;
9709                case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
9710
9711                   freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List);
9712                   break;
9713                case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
9714
9715                   freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List);
9716                   break;
9717                case ProtocolIE_ID_id_RRCContainer:
9718                   {
9719
9720                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP)
9721                      {
9722
9723                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
9724                      }
9725                      break;
9726                   }
9727                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
9728                   break;
9729                case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
9730                   {
9731                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf)
9732                      {
9733                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf);
9734                      }
9735                      break;
9736                   }
9737                default:
9738                   DU_LOG("\nERROR  -->  F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id);
9739             } 
9740             free(ueSetReq->protocolIEs.list.array[ieIdx]);
9741          }
9742       }
9743       free(ueSetReq->protocolIEs.list.array);
9744    }
9745 }
9746 /*******************************************************************
9747  *
9748  * @brief Process UE context setup request from CU
9749  *
9750  * @details
9751  *
9752  *    Function : procF1UeContextSetupReq
9753  *
9754  *    Functionality: Process UE context setup request from CU
9755  *
9756  * @params[in] F1AP message
9757  * @return ROK     - success
9758  *         RFAILED - failure
9759  *
9760  * ****************************************************************/
9761 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
9762 {
9763    uint8_t  ret, ieIdx, ueIdx, lcId, cellIdx;
9764    bool ueCbFound = false;
9765    uint32_t gnbCuUeF1apId, gnbDuUeF1apId, bitRateSize;
9766    DuUeCb   *duUeCb = NULLP;
9767    UEContextSetupRequest_t   *ueSetReq = NULLP;
9768     
9769    ret = ROK;
9770    
9771    ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9772    for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
9773    {
9774       switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
9775       {
9776          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9777             {
9778                gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
9779                break;
9780             }
9781          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9782             {
9783                gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
9784                break;
9785             }
9786          case ProtocolIE_ID_id_ServCellIndex:
9787             {
9788                cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
9789                for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9790                {
9791                   if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
9792                      (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
9793                   {
9794                      ueCbFound = true;
9795                      duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
9796                      DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
9797                      if(duUeCb->f1UeDb)
9798                      {
9799                         memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
9800                         duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
9801                         duUeCb->f1UeDb->cellIdx = cellIdx;
9802                      }
9803                      else
9804                      {
9805                         DU_LOG("\nERROR  -->  F1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
9806                         ret = RFAILED;
9807                      }
9808                   }
9809                   else
9810                      ueCbFound = false;
9811                   
9812                }
9813                if(!ueCbFound)
9814                {
9815                   DU_LOG("\nERROR  -->  F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
9816                   ret = RFAILED;
9817                }
9818                break;
9819             }
9820          case ProtocolIE_ID_id_SpCellULConfigured:
9821             /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL, 
9822             UL, SUL or UL+SUL for the indicated cell for the UE */
9823             break;
9824          case ProtocolIE_ID_id_CUtoDURRCInformation:
9825             {
9826                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList)
9827                {
9828                   duUeCb->f1UeDb->duUeCfg.ueNrCapability = \
9829                      extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
9830                         uE_CapabilityRAT_ContainerList, duUeCb);
9831                }
9832                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
9833                {
9834                   duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
9835                      value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
9836                   if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
9837                   {
9838                      DU_LOG("\nERROR  -->  F1AP: Failed to extract cell Grp Info");
9839                      //TODO: Update the failure cause in ue context Setup Response
9840                      ret = RFAILED;
9841                   }
9842                }
9843                break;
9844             } 
9845          case ProtocolIE_ID_id_SCell_ToBeSetup_List:
9846             {
9847                DU_LOG("\nINFO   -->  DU_APP: Received SCell_ToBeSetup_List but  Not processing the list");
9848             break;
9849             }
9850          case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
9851             {
9852                if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
9853                   &duUeCb->f1UeDb->duUeCfg))
9854                {
9855                   DU_LOG("\nERROR  -->  DU APP : Failed at extractSrbListToSetup()");
9856                   //TODO: Update the failure cause in ue context Setup Response
9857                   ret = RFAILED;
9858                }
9859                break;
9860             }
9861          case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
9862             {
9863                lcId = getDrbLcId(&duUeCb->drbBitMap);
9864                if(lcId != RFAILED)
9865                {
9866                   if(extractDrbListToSetup(lcId, &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List,\
9867                      &duUeCb->f1UeDb->duUeCfg))
9868                   {
9869                      DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
9870                      //TODO: Update the failure cause in ue context Setup Response
9871                      ret = RFAILED;
9872                   }
9873                }
9874                else 
9875                   ret = RFAILED;
9876                break;
9877             }
9878          case ProtocolIE_ID_id_RRCContainer:
9879             {
9880                /* Filling Dl RRC Msg Info */
9881                DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
9882                if(!duUeCb->f1UeDb->dlRrcMsg)
9883                {
9884                   DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
9885                   ret = RFAILED;
9886                }
9887                else
9888                {
9889                   memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
9890                   ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
9891                      &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
9892                }          
9893                break;
9894             }
9895          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
9896             {
9897                if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
9898                {
9899                   duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
9900                }
9901                else
9902                {
9903                   DU_LOG("\nERROR  -->  Ignoring delivery report, since rrcContainer is not present");
9904                }
9905                break;
9906             }
9907          case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
9908              {
9909                /* MaximumBitRate Uplink */
9910                bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
9911                if(bitRateSize > 0)
9912                {
9913                   DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
9914                   if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
9915                   {
9916                      DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
9917                      ret = RFAILED;
9918                   }
9919                   else
9920                   {
9921                      memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg)); 
9922                      memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
9923                      ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
9924                   }
9925                }
9926                else
9927                   ret = RFAILED;
9928                break;
9929             }
9930          default:
9931             {
9932                break;
9933             }
9934       }
9935    }
9936    if(ret == RFAILED)
9937    {
9938       /*TODO : Negative case*/
9939       // BuildAndSendUeContextSetupRsp(ueIdx, cellId);
9940       DU_LOG("\nERROR  -->  F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); 
9941    }
9942    else
9943       ret = duProcUeContextSetupRequest(duUeCb);
9944    
9945    freeAperDecodeF1UeContextSetupReq(ueSetReq); 
9946    return ret;
9947
9948 }
9949
9950 /*******************************************************************
9951  * @brief Free the memory allocated for Dl Tunnel Info
9952  *
9953  * @details
9954  *
9955  *    Function : freeDlTnlInfo
9956  *
9957  *    Functionality:
9958  *       Free the memory allocated for Dl Tunnel Info
9959  *
9960  * @params[in] DLUPTNLInformation_ToBeSetup_List_t *
9961  * @return void
9962  *
9963  * ****************************************************************/
9964
9965 void freeDlTnlInfo(DLUPTNLInformation_ToBeSetup_List_t *tnlInfo)
9966 {
9967    uint8_t arrIdx = 0;
9968
9969    for(arrIdx=0; arrIdx < tnlInfo->list.count; arrIdx++)
9970    {
9971       DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
9972    }
9973 }
9974
9975 /*******************************************************************
9976  * @brief Free the memory allocated for DRB setup List
9977  *
9978  * @details
9979  *
9980  *    Function : freeDrbSetupList
9981  *
9982  *    Functionality:
9983  *       Free the memory allocated for DRB setup list
9984  *
9985  * @params[in] DRBs_Setup_List_t *
9986  * @return void
9987  *
9988  * ****************************************************************/
9989 void freeDrbSetupList(DRBs_Setup_List_t *drbSetupList)
9990 {
9991    uint8_t arrIdx = 0;
9992    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
9993
9994    for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
9995    {
9996       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
9997       freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
9998    }
9999 }
10000
10001 /*******************************************************************
10002  * @brief Free the memory allocated for UE Setup response
10003  *
10004  * @details
10005  *
10006  *    Function : FreeUeContextSetupRsp
10007  *
10008  *    Functionality:
10009  *       Free the memory allocated for UE Setup response
10010  *
10011  * @params[in] F1AP PDU for UE setup response
10012  * @return ROK     - success
10013  *         RFAILED - failure
10014  *
10015  * ****************************************************************/
10016 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
10017 {
10018    uint8_t idx;
10019    UEContextSetupResponse_t *ueSetRsp = NULLP;
10020
10021    if(f1apMsg)
10022    {
10023       if(f1apMsg->choice.successfulOutcome)
10024       {
10025          ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
10026                     UEContextSetupResponse;
10027          if(ueSetRsp->protocolIEs.list.array)
10028          {
10029             for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
10030             {
10031                if(ueSetRsp->protocolIEs.list.array[idx])
10032                {
10033                   switch(ueSetRsp->protocolIEs.list.array[idx]->id)
10034                   {
10035                      case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10036                         break;
10037                      case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10038                         break;
10039                      case ProtocolIE_ID_id_DUtoCURRCInformation:
10040                         {
10041                            CellGroupConfig_t *cellGrpCfg = NULLP;
10042                            cellGrpCfg  = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
10043                                          DUtoCURRCInformation.cellGroupConfig;
10044                            if(cellGrpCfg->buf != NULLP)
10045                            {
10046                               DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
10047                               cellGrpCfg = NULLP;
10048                            }
10049                            break;
10050                         }
10051                     case ProtocolIE_ID_id_DRBs_Setup_List:
10052                         {
10053                            freeDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List); 
10054                            break;
10055                         }
10056                      default:
10057                         DU_LOG("\nERROR  -->  DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
10058                         ueSetRsp->protocolIEs.list.array[idx]->id);
10059                         break;
10060                   }
10061                   DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
10062                         sizeof(UEContextSetupResponseIEs_t));
10063                }
10064             }
10065             DU_FREE(ueSetRsp->protocolIEs.list.array, \
10066                   ueSetRsp->protocolIEs.list.size);
10067          }
10068          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10069       }
10070       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10071    }
10072 }
10073
10074 /*******************************************************************
10075  *
10076  * @brief Builds Ue context Setup Rsp DU To CU Info
10077  *
10078  * @details
10079  *
10080  *    Function : EncodeUeCntxtDuToCuInfo
10081  *
10082  *    Functionality: Builds Ue context Setup Rsp DU To CU Info
10083  *
10084  * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t * 
10085  *
10086  * @return ROK     - success
10087  *         RFAILED - failure
10088  *
10089  ******************************************************************/
10090
10091 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
10092 {
10093    asn_enc_rval_t        encRetVal;
10094
10095    xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
10096    memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
10097    encBufSize = 0;
10098    encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
10099    /* Encode results */
10100    if(encRetVal.encoded == ENCODE_FAIL)
10101    {
10102       DU_LOG( "\nERROR  -->  F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
10103             encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10104       return RFAILED;
10105    }
10106    else
10107    {
10108       DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
10109       for(int i=0; i< encBufSize; i++)
10110       {
10111          printf("%x",encBuf[i]);
10112       }
10113    }
10114    duToCuCellGrp->size = encBufSize;
10115    DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
10116    if(!duToCuCellGrp->buf)
10117    {
10118       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
10119    }
10120    memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
10121    return ROK;
10122 }
10123
10124 /*******************************************************************
10125  *
10126  * @brief Fills Dl Gtp tunnel Info
10127  *
10128  * @details
10129  *
10130  *    Function : fillGtpTunnelforDl
10131  *
10132  *    Functionality: Fills Dl Gtp tunnel Info
10133  *
10134  * @params[in] 
10135  *
10136  * @return ROK     - success
10137  *         RFAILED - failure
10138  *
10139  * ****************************************************************/
10140
10141 uint8_t fillGtpTunnelforDl(GTPTunnel_t *gtpDl, GtpTnlCfg *gtpUeCfg)
10142 {
10143    uint8_t bufSize = 0;
10144
10145    gtpDl->transportLayerAddress.size    = 4*sizeof(uint8_t);
10146    DU_ALLOC(gtpDl->transportLayerAddress.buf, gtpDl->transportLayerAddress.size);
10147    if(gtpDl->transportLayerAddress.buf == NULLP)
10148    {
10149       return RFAILED;
10150    }
10151    memcpy(gtpDl->transportLayerAddress.buf, &gtpUeCfg->dlTnlAddress, gtpDl->transportLayerAddress.size);
10152
10153    /*GTP TEID*/
10154    gtpDl->gTP_TEID.size = 4 * sizeof(uint8_t);
10155    DU_ALLOC(gtpDl->gTP_TEID.buf, gtpDl->gTP_TEID.size);
10156    if(gtpDl->gTP_TEID.buf == NULLP)
10157    {
10158       return RFAILED;
10159    }
10160    bufSize = 3; /*forming an Octect String*/
10161    fillTeIdString(bufSize, gtpUeCfg->teId, gtpDl->gTP_TEID.buf);
10162
10163    return ROK;
10164 }
10165
10166 /*******************************************************************
10167  *
10168  * @brief Fills DL Tunnel Setup List
10169  *
10170  * @details
10171  *
10172  *    Function : fillDlTnlSetupList
10173  *
10174  *    Functionality: Fills the DL Tunnel Setup List
10175  *
10176  * @params[in] 
10177  *
10178  * @return ROK     - success
10179  *         RFAILED - failure
10180  *
10181  * ****************************************************************/
10182
10183 uint8_t fillDlTnlSetupList(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo, UpTnlCfg *tnlCfg)
10184 {
10185    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10186
10187    eleCount = 1;
10188    dlTnlInfo->list.count = eleCount; 
10189    dlTnlInfo->list.size = (eleCount * sizeof(DLUPTNLInformation_ToBeSetup_Item_t *));
10190
10191    /* Initialize the DL Tnl Setup List Members */
10192    DU_ALLOC(dlTnlInfo->list.array, dlTnlInfo->list.size);
10193    if(dlTnlInfo->list.array == NULLP)
10194    {
10195       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL Tnl Setup List in fillDlTnlSetupList()");
10196       ret = RFAILED;
10197    }
10198    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10199    {
10200       DU_ALLOC(dlTnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
10201       if(dlTnlInfo->list.array[arrIdx] == NULLP)
10202       {
10203          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDlTnlSetupList()", arrIdx);
10204          return RFAILED;
10205       }
10206       dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
10207       DU_ALLOC(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
10208       if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel == NULLP)
10209       {
10210          DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL tunnel info in fillDlTnlSetupList()");
10211          return RFAILED;
10212       }
10213       ret = fillGtpTunnelforDl(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel,\
10214                tnlCfg->tnlCfg1);
10215       if(ret != ROK)
10216          break;
10217    }
10218    return ret;
10219 }
10220
10221 /*******************************************************************
10222  *
10223  * @brief Fills the Drb Setup List for Ue Context Setup Response
10224  *
10225  * @details
10226  *
10227  *    Function : fillDrbSetupList
10228  *
10229  *    Functionality: Fills the Drb Setup List for Ue Context Setup Response
10230  *
10231  * @params[in] 
10232  *
10233  * @return ROK     - success
10234  *         RFAILED - failure
10235  *
10236  * ****************************************************************/
10237 uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg)
10238 {
10239    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10240    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
10241
10242    eleCount = ueCfg->numDrb;
10243    drbSetupList->list.count = eleCount;
10244    drbSetupList->list.size = \
10245         (eleCount * sizeof(DRBs_Setup_Item_t *));
10246
10247    /* Initialize the Drb Setup List Members */
10248    DU_ALLOC(drbSetupList->list.array, drbSetupList->list.size);
10249    if(drbSetupList->list.array == NULLP)
10250    {
10251       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DRB Setup List in fillDrbSetupList()");
10252       ret = RFAILED;
10253    }
10254
10255    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10256    {
10257       DU_ALLOC(drbSetupList->list.array[arrIdx], sizeof(DRBs_Setup_Item_t));
10258       if(drbSetupList->list.array[arrIdx] == NULLP)
10259       {
10260          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDrbSetupList()", arrIdx);
10261          return RFAILED;
10262       }
10263       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
10264       drbItemIe->id = ProtocolIE_ID_id_DRBs_Setup_Item;
10265       drbItemIe->criticality = Criticality_reject;
10266       drbItemIe->value.present = DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
10267       drbItemIe->value.choice.DRBs_Setup_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
10268       ret = fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List,\
10269           &ueCfg->upTnlInfo[arrIdx]);
10270       if(ret != ROK)
10271          break;
10272    }
10273    return ret;
10274 }
10275
10276 /*******************************************************************
10277  *
10278  * @brief Builds and sends the UE Setup Response
10279  *
10280  * @details
10281  *
10282  *    Function : BuildAndSendUeContextSetupRsp
10283  *
10284  *    Functionality: Constructs the UE Setup Response and sends
10285  *                   it to the DU through SCTP.
10286  *
10287  * @params[in] 
10288  *
10289  * @return ROK     - success
10290  *         RFAILED - failure
10291  *
10292  * ****************************************************************/
10293 uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId)
10294 {
10295    uint8_t   idx, ret, cellIdx, elementCnt;
10296    uint32_t  gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
10297    uint32_t  gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
10298    asn_enc_rval_t  encRetVal;        /* Encoder return value */
10299    F1AP_PDU_t               *f1apMsg = NULLP;
10300    UEContextSetupResponse_t *ueSetRsp = NULLP;
10301    CellGroupConfigRrc_t     *cellGrpCfg = NULLP;
10302    DuUeCb                   *ueCb = NULLP;
10303
10304    DU_LOG("\n INFO   -->  F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
10305
10306    while(true)
10307    {
10308       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10309       if(f1apMsg == NULLP)
10310       {
10311          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10312          ret = RFAILED;
10313          break;
10314       }
10315
10316       f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
10317       DU_ALLOC(f1apMsg->choice.successfulOutcome,
10318             sizeof(SuccessfulOutcome_t));
10319       if(f1apMsg->choice.successfulOutcome == NULLP)
10320       {
10321          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
10322          ret = RFAILED;
10323          break;
10324       }
10325
10326       f1apMsg->choice.successfulOutcome->procedureCode = \
10327                                                          ProcedureCode_id_UEContextSetup;
10328       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
10329       f1apMsg->choice.successfulOutcome->value.present = \
10330                                                          SuccessfulOutcome__value_PR_UEContextSetupResponse;
10331
10332       ueSetRsp =
10333          &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
10334       elementCnt = 4;
10335       ueSetRsp->protocolIEs.list.count = elementCnt;
10336       ueSetRsp->protocolIEs.list.size = \
10337                                         elementCnt * sizeof(UEContextSetupResponse_t *);
10338
10339       /* Initialize the UESetup members */
10340       DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
10341             ueSetRsp->protocolIEs.list.size);
10342       if(ueSetRsp->protocolIEs.list.array == NULLP)
10343       {
10344          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10345          ret = RFAILED;
10346          break;
10347       }
10348
10349       for(idx=0; idx<elementCnt; idx++)
10350       {
10351          DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
10352                sizeof(UEContextSetupResponseIEs_t));
10353          if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
10354          {
10355             DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10356             ret = RFAILED;
10357             break;
10358          }
10359       }
10360       /* Fetching Ue Cb Info*/
10361       GET_CELL_IDX(cellId, cellIdx);
10362       gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
10363       gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
10364       ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
10365
10366       idx = 0;
10367       /*GNB CU UE F1AP ID*/
10368       ueSetRsp->protocolIEs.list.array[idx]->id = \
10369                                                   ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10370       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10371       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10372                                                              UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
10373       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
10374
10375       /*GNB DU UE F1AP ID*/
10376       idx++;
10377       ueSetRsp->protocolIEs.list.array[idx]->id = \
10378                                                   ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10379       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10380       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10381                                                              UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
10382       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
10383
10384
10385       /*DUtoCURRC Information */
10386       idx++;
10387       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10388                                                    ProtocolIE_ID_id_DUtoCURRCInformation;
10389       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10390       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10391                                                             UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
10392       if(ueCb->f1UeDb)
10393       {
10394          if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
10395          {
10396             cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
10397             ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
10398                      choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
10399             if(ret == RFAILED)
10400             {
10401                DU_LOG("\nERROR  -->  F1AP : Failed to EncodeUeCntxtDuToCuInfo in BuildAndSendUeContextSetupRsp()");
10402                freeF1UeDb(ueCb->f1UeDb);
10403                ueCb->f1UeDb = NULLP;
10404                break;
10405             }
10406          }
10407       }
10408       else
10409       {
10410          DU_LOG("\nERROR  -->  F1AP : Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
10411          ret = RFAILED;
10412          break;
10413       }
10414
10415       /* Drb Setup List */
10416       idx++;
10417       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10418                                  ProtocolIE_ID_id_DRBs_Setup_List;
10419       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10420       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10421                                  UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
10422       ret = fillDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List,\
10423                &ueCb->f1UeDb->duUeCfg);
10424       if(ret == RFAILED)
10425       {
10426          DU_LOG("\nERROR  -->  F1AP : Failed to fillDrbSetupList in BuildAndSendUeContextSetupRsp()");
10427          freeF1UeDb(ueCb->f1UeDb);
10428          ueCb->f1UeDb = NULLP;
10429          break;
10430       }
10431
10432        /* Free UeContext Db created during Ue context Req */
10433        freeF1UeDb(ueCb->f1UeDb);
10434        ueCb->f1UeDb = NULLP;
10435
10436       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10437
10438       /* Encode the UE context setup response type as APER */
10439       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
10440       encBufSize = 0;
10441       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10442             encBuf);
10443       /* Encode results */
10444       if(encRetVal.encoded == ENCODE_FAIL)
10445       {
10446          DU_LOG( "\nERROR  -->  F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\
10447                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10448          ret = RFAILED;
10449          break;
10450       }
10451       else
10452       {
10453          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UE Context Setup Response\n");
10454          for(int i=0; i< encBufSize; i++)
10455          {
10456             printf("%x",encBuf[i]);
10457          }
10458       }
10459
10460       /* Sending  msg  */
10461       if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
10462       {
10463          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Setup Response failed");
10464          ret = RFAILED;
10465          break;
10466       }
10467       break;
10468    }
10469    FreeUeContextSetupRsp(f1apMsg);
10470    return ret;
10471 }/* End of BuildAndSendUeContextSetupRsp */
10472 /*******************************************************************
10473 *
10474 * @brief  Build And Send Ue Context Rsp 
10475 *
10476 * @details
10477 *
10478 *    Function : BuildAndSendUeCtxtRsp 
10479 *
10480 *    Functionality : Build And Send Ue Context Rsp
10481
10482 * @params[in]
10483 * @return sucess = ROK
10484 *         failure = RFAILED
10485 *
10486 * ****************************************************************/
10487 uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId)
10488 {
10489    uint8_t cellIdx = 0, actionType = 0; 
10490
10491    GET_CELL_IDX(cellId, cellIdx);
10492    actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
10493
10494    switch(actionType)
10495    {
10496       case UE_CTXT_SETUP:
10497          BuildAndSendUeContextSetupRsp(ueIdx, cellId);
10498          break;
10499       case UE_CTXT_MOD:
10500          //TODO: Build Ue context Modification Rsp
10501          break;
10502       default:
10503          DU_LOG("ERROR  -->  F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
10504          break;
10505
10506    }
10507    return ROK;
10508 }
10509
10510 /*******************************************************************
10511  *
10512  * @brief deallocating the memory of  F1reset msg
10513  *
10514  * @details
10515  *
10516  *    Function : FreeF1ResetReq
10517  *
10518  *    Functionality :
10519  *         - freeing memory of F1reset request msg
10520  *
10521  * @params[in]
10522  * @return void
10523  *
10524  *
10525  * ****************************************************************/
10526 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
10527 {
10528    uint8_t idx =0 ;
10529    Reset_t *f1ResetMsg;
10530
10531    if(f1apMsg)
10532    {
10533       if(f1apMsg->choice.initiatingMessage)
10534       {
10535          f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10536
10537          if(f1ResetMsg->protocolIEs.list.array)
10538          {
10539             for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
10540             {
10541                if(f1ResetMsg->protocolIEs.list.array[idx])
10542                {
10543                   DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
10544                }
10545             }
10546             DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
10547          }
10548          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10549       }
10550       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10551    }
10552 }
10553 /*******************************************************************
10554  *
10555  * @brief Build and Send F1reset request 
10556  *
10557  * @details
10558  *
10559  *    Function : BuildAndSendF1ResetReq
10560  *
10561  *    Functionality:
10562  *         - Build and Send F1reset request msg
10563  *
10564  * @params[in]
10565  * @return ROK     - success
10566  *         RFAILED - failure
10567  *
10568  * ****************************************************************/
10569 uint8_t BuildAndSendF1ResetReq()
10570 {
10571    uint8_t          elementCnt=0;
10572    uint8_t          idx=0;
10573    uint8_t          ret= RFAILED;
10574    Reset_t          *f1ResetMsg = NULLP;
10575    F1AP_PDU_t       *f1apMsg = NULLP;
10576    asn_enc_rval_t   encRetVal;
10577    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset request \n");
10578    do
10579    {
10580       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10581       if(f1apMsg == NULLP)
10582       {
10583          break;
10584       }
10585       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10586       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10587       if(f1apMsg->choice.initiatingMessage == NULLP)
10588       {
10589          break;
10590       }
10591       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
10592       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10593       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
10594
10595       f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10596
10597       elementCnt = 3;
10598       f1ResetMsg->protocolIEs.list.count = elementCnt;
10599       f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
10600
10601       /* Initialize the F1Setup members */
10602       DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
10603       if(f1ResetMsg->protocolIEs.list.array == NULLP)
10604       {
10605          break;
10606       }
10607       for(idx=0; idx<elementCnt; idx++)
10608       {
10609          DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
10610          if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
10611          {
10612             break;
10613          }
10614       }
10615
10616       /*TransactionID*/
10617       idx=0;
10618       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10619       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10620       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
10621       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
10622
10623       /*Cause*/
10624       idx++;
10625       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
10626       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
10627       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
10628       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10629       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
10630
10631       /*Reset Type*/
10632       idx++;
10633       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
10634       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10635       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
10636       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
10637       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
10638
10639       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10640
10641       /* Encode the F1SetupRequest type as APER */
10642       memset(encBuf, 0, ENC_BUF_MAX_LEN);
10643       encBufSize = 0;
10644       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10645             encBuf);
10646
10647       /* Encode results */
10648       if(encRetVal.encoded == ENCODE_FAIL)
10649       {
10650          DU_LOG("\nERROR  -->  F1AP : Could not encode F1Reset structure (at %s)\n",\
10651                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10652          break;
10653       }
10654       else
10655       {
10656          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1Reset\n");
10657          for(idx=0; idx< encBufSize; idx++)
10658          {
10659             printf("%x",encBuf[idx]);
10660          }
10661       }
10662
10663       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
10664       {
10665          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset request failed");
10666          break;
10667       }
10668
10669       ret = ROK;
10670       break;
10671    }while(true);
10672
10673    FreeF1ResetReq(f1apMsg);
10674    return ret;
10675 }
10676 /*******************************************************************
10677  *
10678  * @brief Build And Send F1ResetAck
10679  *
10680  * @details
10681  *
10682  *    Function : BuildAndSendF1ResetAck
10683  *
10684  *    Functionality:
10685  *         - Build And Send  F1ResetRSP
10686  *
10687  * @return ROK     - success
10688  *         RFAILED - failure
10689  *
10690  * ****************************************************************/
10691 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
10692 {
10693    uint8_t idx;
10694    ResetAcknowledge_t *f1ResetAck;
10695
10696    if(f1apMsg)
10697    {
10698       if(f1apMsg->choice.successfulOutcome)
10699       {
10700          f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10701
10702          if(f1ResetAck->protocolIEs.list.array)
10703          {
10704             for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
10705             {
10706                if(f1ResetAck->protocolIEs.list.array[idx])
10707                {
10708                   DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10709                }
10710             }
10711             DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10712          }
10713          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10714       }
10715       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10716    }
10717 }
10718
10719 /*******************************************************************
10720  *
10721  * @brief Build And Send F1ResetAck
10722  *
10723  * @details
10724  *
10725  *    Function : BuildAndSendF1ResetAck
10726  *
10727  *    Functionality:
10728  *         - Build And Send  F1ResetRSP
10729  *
10730  *  @params[in]
10731  * @return ROK     - success
10732  *         RFAILED - failure
10733  *
10734  * ****************************************************************/
10735 uint8_t BuildAndSendF1ResetAck()
10736 {
10737    uint8_t                idx = 0;
10738    uint8_t                elementCnt = 0;
10739    uint8_t                ret = RFAILED;
10740    F1AP_PDU_t             *f1apMsg = NULL;
10741    ResetAcknowledge_t     *f1ResetAck = NULLP;
10742    asn_enc_rval_t         encRetVal;
10743    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset Acknowledgment \n");
10744
10745    do{
10746       /* Allocate the memory for F1ResetRequest_t */
10747       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10748       if(f1apMsg == NULLP)
10749       {
10750          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10751          break;
10752       }
10753
10754       f1apMsg->present =  F1AP_PDU_PR_successfulOutcome;
10755
10756       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10757       if(f1apMsg->choice.successfulOutcome == NULLP)
10758       {
10759          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10760          break;
10761       }
10762       f1apMsg->choice.successfulOutcome->criticality   = Criticality_reject;
10763       f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
10764       f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10765
10766       elementCnt = 1;
10767
10768       f1ResetAck->protocolIEs.list.count = elementCnt;
10769       f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
10770
10771       DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10772       if(f1ResetAck->protocolIEs.list.array == NULLP)
10773       {
10774          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1ResetAckIEs failed");
10775          break;
10776       }
10777
10778       for(idx=0; idx<elementCnt; idx++)
10779       {
10780          DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10781          if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
10782          {
10783             break;
10784          }
10785       }
10786       /*TransactionID*/
10787       idx = 0;
10788       f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10789       f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10790       f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
10791       f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
10792
10793       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10794
10795       /* Encode the F1SetupRequest type as UPER */
10796       memset(encBuf, 0, ENC_BUF_MAX_LEN);
10797       encBufSize = 0;
10798       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10799
10800       /* Check encode results */
10801       if(encRetVal.encoded == ENCODE_FAIL)
10802       {
10803          DU_LOG("\nERROR  -->  F1AP : Could not encode F1ResetAck structure (at %s)\n",\
10804                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10805          break;
10806       }
10807       else
10808       {
10809          DU_LOG("\nDUBUG   -->  F1AP : Created APER encoded buffer for F1ResetAck\n");
10810          for(int i=0; i< encBufSize; i++)
10811          {
10812             printf("%x",encBuf[i]);
10813          }
10814       }
10815       /* Sending msg */
10816       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
10817       {
10818          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset Acknowledgement failed");
10819          break;
10820       }
10821
10822       ret = ROK;
10823       break;
10824    }while(true);
10825
10826    FreeF1ResetAck(f1apMsg);
10827    return ret;
10828 }
10829 /******************************************************************
10830 *
10831 * @brief free F1 reset msg allocated by aper_decoder 
10832 *
10833 * @details
10834 *
10835 *    Function : freeAperDecodeF1ResetMsg 
10836 *
10837 *    Functionality: free F1 reset msg allocated by aper_decoder 
10838 *
10839 * @params[in] Reset_t *f1ResetMsg 
10840 * @return void 
10841 *
10842 * ****************************************************************/
10843
10844 void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
10845 {
10846    uint8_t ieIdx =0;
10847    if(f1ResetMsg->protocolIEs.list.array)
10848    {
10849       for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
10850       {
10851          if(f1ResetMsg->protocolIEs.list.array[ieIdx])
10852          {
10853             free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
10854          }
10855       }
10856       free(f1ResetMsg->protocolIEs.list.array);
10857    }
10858 }
10859
10860 /******************************************************************
10861  *
10862  * @brief Processes DL RRC Message Transfer  sent by CU
10863  *
10864  * @details
10865  *
10866  *    Function : procF1ResetReq
10867  *
10868  *    Functionality: Processes DL RRC Message Transfer sent by CU
10869  *
10870  * @params[in] F1AP_PDU_t ASN decoded F1AP message
10871  * @return ROK     - success
10872  *         RFAILED - failure
10873  *
10874  * ****************************************************************/
10875 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
10876 {
10877    /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
10878    uint8_t       ieIdx = 0;
10879    uint8_t        ret = ROK;
10880    Reset_t       *f1ResetMsg = NULLP;
10881
10882    DU_LOG("\nINFO   -->  Processing F1 reset request");
10883    f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10884
10885    for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
10886    {
10887       switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
10888       {
10889          case ProtocolIE_ID_id_TransactionID:
10890             break;
10891
10892          case ProtocolIE_ID_id_Cause:
10893             break;
10894
10895          case ProtocolIE_ID_id_ResetType:
10896             {
10897                break;
10898             }
10899
10900          default:
10901             break;
10902       }
10903    }
10904    ret = BuildAndSendF1ResetAck();
10905    DU_LOG("\nINFO   -->  UE release is not supported for now");
10906
10907    freeAperDecodeF1ResetMsg(f1ResetMsg);
10908
10909    return ret;
10910 }
10911
10912 /*******************************************************************
10913  *
10914  * @brief free the RRC delivery report
10915  *
10916  * @details
10917  *
10918  *    Function : freeRrcDeliveryReport
10919  *
10920  *    Functionality: free the RRC delivery report
10921  *
10922  * @params[in]
10923  * @return ROK     - success
10924  *         RFAILED - failure
10925  *
10926  * ****************************************************************/
10927 void freeRrcDeliveryReport(F1AP_PDU_t  *f1apMsg )
10928 {
10929    uint8_t idx=0;
10930    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
10931
10932    if(f1apMsg)
10933    {
10934       if(f1apMsg->choice.initiatingMessage)
10935       {
10936          rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
10937          if(rrcDeliveryReport->protocolIEs.list.array)
10938          {
10939             for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
10940                   idx++)
10941             {
10942                if(rrcDeliveryReport->protocolIEs.list.array[idx])
10943                {
10944                   DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
10945                         sizeof(RRCDeliveryReportIEs_t));
10946                }   
10947             }
10948             DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
10949                   rrcDeliveryReport->protocolIEs.list.size);
10950          }
10951          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
10952       }
10953       DU_FREE(f1apMsg,
10954             sizeof(F1AP_PDU_t));
10955    }
10956 }
10957
10958 /*******************************************************************
10959 *
10960 * @brief Builds and sends the RRC delivery report
10961 *
10962 * @details
10963 *
10964 *    Function : BuildAndSendRrcDeliveryReport
10965 *
10966 *    Functionality: Builds and sends the RRC delivery report
10967 *
10968 * @params[in]
10969 *
10970 * @return ROK     - success
10971 *         RFAILED - failure
10972 *
10973 * ****************************************************************/
10974 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
10975    uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
10976 {
10977    uint8_t             ret = RFAILED;
10978    uint8_t             idx    = 0;
10979    uint8_t             idx1   = 0;
10980    uint8_t             elementCnt = 0;
10981    F1AP_PDU_t          *f1apMsg = NULLP;
10982    asn_enc_rval_t      encRetVal;  
10983    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
10984
10985    do{
10986
10987       DU_LOG("\nINFO   -->  F1AP : Building RRC delivery Message Transfer Message\n");
10988       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10989       if(f1apMsg == NULLP)
10990       {
10991          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10992          break;
10993       }
10994       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10995       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
10996       if(f1apMsg->choice.initiatingMessage == NULLP)
10997       {
10998          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU  failed");
10999          break;
11000       }
11001       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
11002       f1apMsg->choice.initiatingMessage->criticality   = Criticality_ignore;
11003       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
11004
11005       rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
11006       elementCnt = 4;
11007       rrcDeliveryReport->protocolIEs.list.count = elementCnt;
11008       rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
11009
11010       /* Initialize the F1Setup members */
11011       DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
11012       if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
11013       {
11014          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRC Delivery  failed");
11015          break;
11016       }
11017       for(idx =0 ;idx <elementCnt; idx++)
11018       {
11019          DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
11020          if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
11021          {
11022             break;
11023          }
11024       }
11025
11026       idx1 = 0;
11027
11028       /*GNB CU UE F1AP ID*/
11029       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11030       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11031       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
11032       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
11033
11034       /*GNB DU UE F1AP ID*/
11035       idx1++;
11036       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11037       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11038       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
11039       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
11040
11041       /*RRC delivery status*/
11042       idx1++;
11043       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
11044       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11045       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
11046       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
11047       rrcDelivery->rrcDeliveryStatus.deliveryStatus;
11048       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
11049       rrcDelivery->rrcDeliveryStatus.triggeringMessage;
11050
11051       /* SRB ID */ 
11052       idx1++;
11053       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
11054       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11055       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
11056       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID =  rrcDelivery->srbId;
11057
11058       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11059
11060       /* Encode the RRC DELIVERY REPORT type as APER */
11061       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11062       encBufSize = 0;
11063       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11064             encBuf);
11065
11066       /* Encode results */
11067       if(encRetVal.encoded == ENCODE_FAIL)
11068       {
11069          DU_LOG("\nERROR  -->  F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
11070                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11071          break;
11072       }
11073       else
11074       {
11075          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
11076          for(idx=0; idx< encBufSize; idx++)
11077          {
11078             printf("%x",encBuf[idx]);
11079          }
11080       }
11081
11082       /* Sending msg */
11083       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
11084       {
11085          DU_LOG("\nERROR  -->  F1AP : Sending RRC delivery  msg request failed");
11086          break;
11087       }
11088       ret = ROK;
11089       break;
11090
11091    }while(true);
11092
11093    freeRrcDeliveryReport(f1apMsg);
11094    return ret;
11095 }
11096
11097 /*******************************************************************
11098  *
11099  * @brief Processes cells to be activated
11100  *
11101  * @details
11102  *
11103  *    Function : extractCellsToBeActivated
11104  *
11105  *    Functionality:
11106  *      - Processes cells to be activated list received in F1SetupRsp
11107  *
11108  * @params[in] void
11109  * @return ROK     - success
11110  *         RFAILED - failure
11111  *
11112  * ****************************************************************/
11113
11114 uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
11115 {
11116    uint8_t  ret = ROK;
11117    uint16_t idx, nci, pci = 0;
11118    Cells_to_be_Activated_List_Item_t cell;
11119
11120    for(idx=0; idx<cellsToActivate.list.count; idx++)
11121    {
11122       nci = 0;
11123       cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
11124       bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
11125
11126       if(cell.nRPCI)
11127       {
11128          pci = *cell.nRPCI;
11129       }
11130       ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
11131    }
11132    return ret;
11133 }
11134 /******************************************************************
11135 *
11136 * @brief Processes F1 Setup Response allocated by aper_decoder 
11137 *
11138 * @details
11139 *
11140 *    Function : freeF1SetupRsp 
11141 *
11142 *    Functionality: free F1 Setup Response allocated by aper_decoder 
11143 *
11144 * @params[in] F1SetupResponse_t *f1SetRspMsg 
11145 * @return void 
11146 *
11147 * ****************************************************************/
11148
11149 void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
11150 {
11151    uint8_t ieIdx =0;
11152    uint8_t arrIdx =0;
11153    Cells_to_be_Activated_List_t *cellToActivate =NULLP;
11154    RRC_Version_t      *rrcVer =NULLP;
11155
11156    if(f1SetRspMsg->protocolIEs.list.array)
11157    {
11158       for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
11159       {
11160          if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
11161          {
11162             switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
11163             {
11164                case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11165                   {
11166                      cellToActivate =
11167                         &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
11168                      if(cellToActivate->list.array)
11169                      {
11170                         for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
11171                         {
11172                            if(cellToActivate->list.array[arrIdx])
11173                            {
11174
11175                               if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
11176                               pLMN_Identity.buf)
11177                               {
11178                                  if(cellToActivate->list.array[0]->value.choice.\
11179                                        Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
11180                                  {
11181                                     free(cellToActivate->list.array[0]->value.choice.\
11182                                           Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
11183                                  }
11184
11185                                  free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
11186                                        nRCGI.pLMN_Identity.buf);
11187                               }
11188                               free(cellToActivate->list.array[arrIdx]);
11189                            }
11190                         }
11191                         free(cellToActivate->list.array);
11192                      }
11193                      break;
11194                   }
11195                case ProtocolIE_ID_id_TransactionID:
11196                   {
11197                      break;
11198                   }
11199                case ProtocolIE_ID_id_gNB_CU_Name:
11200                   {
11201                      free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
11202                      break;
11203                   }
11204                case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11205                   {
11206                      rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
11207                      if(rrcVer->latest_RRC_Version.buf)
11208                      {
11209                         if(rrcVer->iE_Extensions)
11210                         {
11211                            if(rrcVer->iE_Extensions->list.array)
11212                            {
11213                               if(rrcVer->iE_Extensions->list.array[0])
11214                               {
11215                                  if(rrcVer->iE_Extensions->list.\
11216                                        array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
11217                                  {
11218                                     free(rrcVer->iE_Extensions->list.\
11219                                           array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
11220                                  }
11221                                  free(rrcVer->iE_Extensions->list.array[0]);
11222                               }
11223                               free(rrcVer->iE_Extensions->list.array);
11224                            }
11225                            free(rrcVer->iE_Extensions);
11226                         }
11227                         free(rrcVer->latest_RRC_Version.buf);
11228                      }
11229                      break;
11230
11231                   }
11232                default:
11233                   {
11234                      DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11235                            f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
11236                   }
11237             }
11238             free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
11239          }
11240       }
11241       free(f1SetRspMsg->protocolIEs.list.array);
11242    }
11243 }
11244 /******************************************************************
11245  *
11246  * @brief Processes F1 Setup Response sent by CU
11247  *
11248  * @details
11249  *
11250  *    Function : procF1SetupRsp
11251  *
11252  *    Functionality: Processes F1 Setup Response sent by CU
11253  *
11254  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11255  * @return ROK     - success
11256  *         RFAILED - failure
11257  *
11258  * ****************************************************************/
11259 uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
11260 {
11261    uint8_t ret = ROK;
11262    uint16_t idx =0;
11263    F1SetupResponse_t *f1SetRspMsg = NULLP;
11264    GNB_CU_Name_t     *cuName = NULLP;
11265    F1SetupRsp  f1SetRspDb;
11266    RRC_Version_t      *rrcVer =NULLP;
11267    
11268    memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
11269
11270    DU_LOG("\nINFO   -->  F1AP : F1 Setup Response received");
11271    f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
11272
11273    for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
11274    {
11275       switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
11276       {
11277          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11278             {
11279                extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
11280                      value.choice.Cells_to_be_Activated_List);
11281                break;
11282             }
11283          case ProtocolIE_ID_id_TransactionID:
11284             {
11285                f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
11286                                     value.choice.TransactionID;
11287                break;
11288             }
11289          case ProtocolIE_ID_id_gNB_CU_Name:
11290             {
11291                cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
11292                         value.choice.GNB_CU_Name;
11293                strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
11294                break;
11295             }
11296          case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11297             {
11298                rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
11299                strcpy(f1SetRspDb.rrcVersion.rrcVer,
11300                      (const char*)rrcVer->latest_RRC_Version.buf);
11301                break;
11302             }
11303          default:
11304             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11305                   f1SetRspMsg->protocolIEs.list.array[idx]->id);
11306       }
11307       duProcF1SetupRsp();
11308    }
11309    
11310    freeAperDecodeF1SetupRsp(f1SetRspMsg);
11311    return ret;
11312 }
11313 /*******************************************************************
11314 *
11315 * @brief free GNB DU config update ack
11316 *
11317 * @details
11318 *
11319 *    Function : freeAperDecodeGnbDuAck 
11320 *
11321 *    Functionality: Processes GNB DU config update ack And
11322 *                     added free part for the memory allocated by aper_decoder
11323 *
11324 * @params[in] F1AP_PDU_t ASN decoded F1AP message
11325 * @return ROK     - success
11326 *         RFAILED - failure
11327 *
11328 * ****************************************************************/
11329
11330 void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
11331 {
11332    uint8_t ieIdx = 0;
11333
11334    if(gnbDuAck->protocolIEs.list.array)
11335    {
11336       for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
11337       {
11338          if(gnbDuAck->protocolIEs.list.array[ieIdx])
11339          {
11340             free(gnbDuAck->protocolIEs.list.array[ieIdx]);
11341          }
11342       }
11343       free(gnbDuAck->protocolIEs.list.array);
11344    }
11345 }
11346 /*******************************************************************
11347 *
11348 * @brief Processes GNB DU config update ack
11349 *
11350 * @details
11351 *
11352 *    Function : procF1GNBDUCfgUpdAck
11353 *
11354 *    Functionality: added free part for the memory allocated by aper_decoder
11355 *
11356 * @params[in] F1AP_PDU_t *f1apMsg 
11357 * @return void 
11358 *
11359 * ****************************************************************/
11360 uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
11361 {
11362    uint8_t ieIdx;
11363    GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
11364    
11365    DU_LOG("\nINFO   -->  F1AP : GNB-DU config update acknowledgment");
11366    gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
11367    
11368    for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
11369    {
11370       switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
11371       {
11372          case ProtocolIE_ID_id_TransactionID:
11373             break;
11374          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11375             break;
11376          default :
11377             DU_LOG("\nERROR  -->  F1AP: Invalid IE Received: %ld, at procF1GNBDUCfgUpdAck()", \
11378             gnbDuAck->protocolIEs.list.array[ieIdx]->id);
11379             break;
11380       }
11381    }
11382    duProcGnbDuCfgUpdAckMsg();
11383 #if 0
11384    if(BuildAndSendF1ResetReq() != ROK)
11385    {
11386       return RFAILED;
11387    }
11388 #endif
11389
11390    freeAperDecodeGnbDuAck(gnbDuAck);
11391    return ROK;
11392 }
11393 /******************************************************************
11394 *
11395 * @brief free DL RRC Message Transfer allocated by aper_decoder 
11396 *
11397 * @details
11398 *
11399 *    Function : freeAperDecodef1DlRrcMsg 
11400 *
11401 *    Functionality: free DL RRC Message Transfer allocated by aper_decoder 
11402 *
11403 * @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg 
11404 * @return ROK     - success
11405 *         RFAILED - failure
11406 *
11407 * ****************************************************************/
11408
11409 void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
11410 {
11411    uint8_t ieIdx =0;
11412    RRCContainer_t *rrcContainer = NULLP;
11413
11414    if(f1DlRrcMsg->protocolIEs.list.array)
11415    {
11416       for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
11417       {
11418          if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
11419          {
11420             switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
11421             {
11422                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11423                   break;
11424                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11425                   break;
11426                case ProtocolIE_ID_id_SRBID:
11427                   break;
11428                case ProtocolIE_ID_id_RRCContainer:
11429                   {
11430                      rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
11431                      free(rrcContainer->buf);
11432                   }
11433                case ProtocolIE_ID_id_ExecuteDuplication:
11434                   break;
11435                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
11436                   break;
11437                   break;
11438             }
11439             free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
11440          }
11441       }
11442       free(f1DlRrcMsg->protocolIEs.list.array);
11443    }
11444 }
11445 /******************************************************************
11446  *
11447  * @brief Processes DL RRC Message Transfer  sent by CU
11448  *
11449  * @details
11450  *
11451  *    Function : procF1DlRrcMsgTrans
11452  *
11453  *    Functionality: Processes DL RRC Message Transfer sent by CU
11454  *
11455  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11456  * @return ROK     - success
11457  *         RFAILED - failure
11458  *
11459  * ****************************************************************/
11460 uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
11461 {
11462    uint8_t  idx, ret;
11463    DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
11464    F1DlRrcMsg dlMsg;
11465    memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
11466
11467    DU_LOG("\nINFO   -->  DU_APP : DL RRC message transfer Recevied");
11468    f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
11469
11470    ret = ROK;
11471
11472    for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
11473    {
11474       switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
11475       {
11476          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11477             {
11478                dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11479                break;
11480             }
11481          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11482             {
11483                dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11484                break;
11485             }
11486          case ProtocolIE_ID_id_SRBID:
11487             {
11488                dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
11489                break;
11490             }
11491          case ProtocolIE_ID_id_ExecuteDuplication:
11492             dlMsg.execDup = true;
11493             break;
11494
11495          case ProtocolIE_ID_id_RRCContainer:
11496             {
11497                if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
11498                {
11499                   dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
11500                   DU_ALLOC(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
11501                   if(dlMsg.rrcMsgPdu)
11502                   {
11503                      memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
11504                         dlMsg.rrcMsgSize);
11505                   }
11506                   else
11507                   {
11508                      DU_LOG("\nERROR  -->  DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
11509                      return RFAILED;
11510                   }
11511                }
11512                else
11513                {
11514                   DU_LOG("\nERROR  -->  DU_APP : RRC Container Size is invalid:%ld",\
11515                   f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
11516                   return RFAILED;
11517                }
11518                break;
11519             }
11520          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
11521             {
11522                dlMsg.deliveryStatRpt = true;
11523                break;
11524             }
11525          default:
11526             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
11527                   f1DlRrcMsg->protocolIEs.list.array[idx]->id);
11528       }
11529    }
11530
11531    ret = duProcDlRrcMsg(&dlMsg);
11532
11533    freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
11534    return ret;
11535 }
11536
11537 /*****************************************************************i
11538  *
11539  * @brief Handles received F1AP message and sends back response  
11540  *
11541  * @details
11542  *
11543  *    Function : F1APMsgHdlr
11544  *
11545  *    Functionality:
11546  *         - Decodes received F1AP control message
11547  *         - Prepares response message, encodes and sends to SCTP
11548  *
11549  * @params[in] 
11550  * @return ROK     - success
11551  *         RFAILED - failure
11552  *
11553  * ****************************************************************/
11554 void F1APMsgHdlr(Buffer *mBuf)
11555 {
11556    int i =0;
11557    char *recvBuf =NULLP;
11558    MsgLen copyCnt =0;
11559    MsgLen recvBufLen =0;
11560    F1AP_PDU_t *f1apMsg =NULLP;
11561    asn_dec_rval_t rval; /* Decoder return value */
11562    F1AP_PDU_t f1apasnmsg ;
11563    DU_LOG("\nINFO  -->  F1AP : Received F1AP message buffer");
11564    ODU_PRINT_MSG(mBuf, 0,0);
11565
11566    /* Copy mBuf into char array to decode it */
11567    ODU_GET_MSG_LEN(mBuf, &recvBufLen);
11568    DU_ALLOC(recvBuf, (Size)recvBufLen);
11569
11570    if(recvBuf == NULLP)
11571    {
11572       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed");
11573       return;
11574    }
11575    if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
11576    {
11577       DU_LOG("\nERROR   -->  F1AP : Failed while copying %d", copyCnt);
11578       return;
11579    }
11580
11581    printf("\nDEBUG   -->  F1AP : Received flat buffer to be decoded : ");
11582    for(i=0; i< recvBufLen; i++)
11583    {
11584       printf("%x",recvBuf[i]);
11585    }
11586
11587    /* Decoding flat buffer into F1AP messsage */
11588    f1apMsg = &f1apasnmsg;
11589    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
11590
11591    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
11592    DU_FREE(recvBuf, (Size)recvBufLen);
11593
11594    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
11595    {
11596       DU_LOG("\nERROR  -->  F1AP : ASN decode failed");
11597       return;
11598    }
11599    printf("\n");
11600    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11601
11602    switch(f1apMsg->present)
11603    {
11604       case F1AP_PDU_PR_successfulOutcome:
11605          {
11606             switch(f1apMsg->choice.successfulOutcome->value.present)
11607             {
11608                case SuccessfulOutcome__value_PR_ResetAcknowledge:
11609                   {
11610                      DU_LOG("\nINFO   -->  F1AP : F1ResetAcknowledge is received successfully ");
11611                      break;
11612                   }
11613                case SuccessfulOutcome__value_PR_F1SetupResponse:
11614                   {                             
11615 #ifndef ODU_TEST_STUB
11616                      procF1SetupRsp(f1apMsg);
11617 #endif
11618                      break;
11619                   }
11620
11621                case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
11622                   {
11623                      procF1GNBDUCfgUpdAck(f1apMsg);
11624                      break;
11625                   }
11626
11627                default:
11628                   {
11629                      DU_LOG("\nERROR  -->  F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
11630                      f1apMsg->choice.successfulOutcome->value.present);
11631                      return;
11632                   }
11633             }/* End of switch(successfulOutcome) */
11634             free(f1apMsg->choice.successfulOutcome);
11635             break;
11636          }
11637       case F1AP_PDU_PR_initiatingMessage:
11638          {
11639             switch(f1apMsg->choice.initiatingMessage->value.present)
11640             {
11641                case InitiatingMessage__value_PR_Reset:
11642                   {
11643                      procF1ResetReq(f1apMsg);
11644                      break;
11645                   }
11646                case InitiatingMessage__value_PR_DLRRCMessageTransfer:
11647                   {
11648                      procF1DlRrcMsgTrans(f1apMsg);
11649                      break;
11650                   }
11651                case InitiatingMessage__value_PR_UEContextSetupRequest:
11652                   {
11653                      procF1UeContextSetupReq(f1apMsg);
11654                      break;
11655                   }
11656                default:
11657                   {
11658                      DU_LOG("\nERROR  -->  F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
11659                            f1apMsg->choice.initiatingMessage->value.present);
11660                      return;
11661                   }
11662             }/* End of switch(initiatingMessage) */
11663             free(f1apMsg->choice.initiatingMessage);
11664             break;
11665          }
11666
11667       default:
11668          {
11669             DU_LOG("\nERROR  -->  F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
11670             return;
11671          }
11672          free(f1apMsg);
11673
11674    }/* End of switch(f1apMsg->present) */
11675
11676 } /* End of F1APMsgHdlr */
11677
11678 /**********************************************************************
11679   End of file
11680  **********************************************************************/