JIRA ID:[ODUHIGH-296]-Dl Data Changes from DUAPP to RLC
[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 /*******************************************************************
7265  *
7266  * @brief Function to extract RB info received from CU
7267  *
7268  * @details
7269  *
7270  *    Function : extractMacRbCfg
7271  *
7272  *    Functionality: Function to extract RB info received from CU
7273  *
7274  * @params[in] F1AP message
7275  * @return ROK/RFAILED
7276  *
7277  * ****************************************************************/
7278
7279 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\
7280   LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
7281 {
7282    if(drbCfg != NULLP)
7283    {
7284       if(extractDrbCfg(drbCfg, lcCfg, upTnlInfo) != ROK)
7285       {
7286          DU_LOG("ERROR  -->  F1AP : Failed to build Drb Qos at extractMacRbCfg()");
7287          return RFAILED;
7288       }
7289    }
7290    else
7291    {
7292       lcCfg->drbQos = NULLP;
7293       lcCfg->snssai = NULLP;
7294       if(lcCfg->lcId == SRB2_LCID)
7295          lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
7296       else
7297          lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
7298    }
7299    if(ulLcCfg)
7300    {
7301       lcCfg->ulLcCfgPres = true;
7302       extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
7303    }
7304    else
7305       lcCfg->ulLcCfgPres = false;
7306    return ROK;
7307 }
7308
7309 /*******************************************************************
7310  *
7311  * @brief Function processing LC config info received from CU
7312  *
7313  * @details
7314  *
7315  *    Function : procMacLcCfg
7316  *
7317  *    Functionality: Function processing LC config info received from CU
7318  *
7319  * @params[in] F1AP message
7320  * @return ROK/RFAILED
7321  *
7322  * ****************************************************************/
7323
7324 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
7325    DRBs_ToBeSetup_Item_t *drbItem, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
7326 {
7327    uint8_t ret = ROK;
7328
7329    lcCfg->lcId = lcId;
7330    lcCfg->configType = configType;
7331    if(rbType == RB_TYPE_SRB)
7332    {
7333       ret = extractMacRbCfg(lcId, NULL, ulLcCfg, lcCfg, NULL);
7334    }
7335    else if(rbType == RB_TYPE_DRB)
7336    {
7337       ret = extractMacRbCfg(lcId, drbItem, ulLcCfg, lcCfg, upTnlInfo);
7338    }
7339    return ret;
7340 }
7341
7342 /*******************************************************************
7343  *
7344  * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
7345  *
7346  * @details
7347  *
7348  *    Function : extractRlcCfgToAddMod
7349  *
7350  *    Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
7351  *
7352  * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
7353  *             DuUeCfg Pointer
7354  * @return ROK/RFAILED
7355  *
7356  * ****************************************************************/
7357
7358 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, \
7359    DuUeCfg *ueCfgDb)
7360 {
7361   uint8_t ret, idx, rbId, lcId, rlcMode, rbType;
7362   RLC_Config_t *f1RlcCfg = NULLP;
7363   LogicalChannelConfig_t *macUlLcCfg = NULLP;
7364
7365   for(idx = 0; idx < lcCfg->list.count; idx++)
7366   {
7367      lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
7368      if(lcCfg->list.array[idx]->servedRadioBearer)
7369      {
7370         /* RadioBearer for SRB/DRB */
7371         if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7372         RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
7373         {
7374            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
7375            rbType = RB_TYPE_SRB;
7376         }
7377         else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7378         RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
7379         {
7380            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
7381            rbType = RB_TYPE_DRB;
7382         }
7383         else
7384         {
7385            DU_LOG("\nERROR  -->  No components present in Bearer config to ADD/MOD");
7386            return RFAILED;
7387         }
7388         /* MAC UL LC Config */
7389         if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
7390         {
7391            macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
7392         }
7393      }
7394      else
7395      {
7396         DU_LOG("\nERROR  -->  DUAPP: Received RadioBearer config is NULL");
7397         return RFAILED;
7398      }
7399      /* RLC Mode Config */
7400      if(lcCfg->list.array[idx]->rlc_Config)
7401      {
7402         rlcMode  = lcCfg->list.array[idx]->rlc_Config->present;
7403         f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
7404      }
7405      
7406      /* Filling RLC/MAC Config*/
7407      memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
7408      memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
7409      procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
7410      ret = procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL);
7411      if(ret == RFAILED)
7412      {
7413         DU_LOG("\nERROR  -->  DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()");
7414         return ret;
7415      }
7416      (ueCfgDb->numRlcLcs)++;
7417      (ueCfgDb->numMacLcs)++;
7418   }
7419   //TODO: To send the failure cause in UeContextSetupRsp 
7420   return ret;
7421 }
7422
7423 /*******************************************************************
7424  *
7425  * @brief DeAlloc pdsch serv cell config info
7426  *
7427  * @details
7428  *
7429  *    Function : freeMacPdschServCellInfo
7430  *
7431  *    Functionality: DeAlloc pdsch serv cell config info
7432  *
7433  * @params[in] PdschServCellCfg pointer
7434  * @return void
7435  *
7436  * ****************************************************************/
7437
7438 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
7439 {
7440    if(pdsch->xOverhead)
7441    {
7442       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(uint8_t));
7443    }
7444    if(pdsch->codeBlkGrpFlushInd)
7445    {
7446       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
7447    }
7448    if(pdsch->maxCodeBlkGrpPerTb)
7449    {
7450       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(uint8_t));
7451    }
7452    if(pdsch->maxMimoLayers)
7453    {
7454       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
7455    }
7456 }
7457
7458 /*******************************************************************
7459  *
7460  * @brief Free Serving cell Info
7461  *
7462  * @details
7463  *
7464  *    Function : freeMacServingCellInfo
7465  *
7466  *    Functionality: Free Serving cell Info
7467  *
7468  * @params[in] ServCellCfgInfo *srvCellCfg
7469  * @return void
7470  *
7471  * ****************************************************************/
7472 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
7473 {
7474    freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
7475    if(srvCellCfg->bwpInactivityTmr)
7476    {
7477       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
7478    }
7479 }
7480
7481 /*******************************************************************
7482  *
7483  * @brief Free cell Grp Cfg Info
7484  *
7485  * @details
7486  *
7487  *    Function : freeUeReCfgCellGrpInfo
7488  *
7489  *    Functionality: Free cell Grp Cfg Info
7490  *
7491  * @params[in] MacUeCfg*  duUeCfg
7492  * @return void
7493  *
7494  * ****************************************************************/
7495
7496 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
7497 {
7498    freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
7499 }
7500
7501 /*******************************************************************
7502  *
7503  * @brief Fills Reconfig SchReqReConfig
7504  *
7505  * @details
7506  *
7507  *    Function : extractSchReqReConfig
7508  *
7509  *    Functionality: Fills Reconfig SchReqReConfig
7510  *
7511  * @params[in] SchedulingRequestConfig_t *cuSchedReq
7512  *             SchedReqCfg*  macSchedReq
7513  * @return void
7514  *
7515  * ****************************************************************/
7516 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
7517 {
7518    uint8_t schReqIdx = 0;
7519    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
7520    struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
7521
7522    if(cuSchedReq->schedulingRequestToAddModList)
7523    {
7524       schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
7525       if(schReqListToAdd->list.count)
7526       {
7527          macSchedReq->addModListCount = schReqListToAdd->list.count;
7528          for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
7529          {
7530             macSchedReq->addModList[schReqIdx].schedReqId = \
7531                schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
7532             macSchedReq->addModList[schReqIdx].srProhibitTmr = \
7533                *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
7534             macSchedReq->addModList[schReqIdx].srTransMax    =\
7535                schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
7536          }
7537       }
7538    }
7539    /* Scheduling Req To release */
7540    if(cuSchedReq->schedulingRequestToReleaseList)
7541    {
7542       schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
7543       if(schReqListToRel->list.count)
7544       {
7545          macSchedReq->relListCount = schReqListToRel->list.count;
7546          for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
7547          {
7548             macSchedReq->relList[schReqIdx] = \
7549                *schReqListToRel->list.array[schReqIdx];
7550          }
7551       }
7552    }
7553 }
7554
7555 /*******************************************************************
7556  *
7557  * @brief Fills TagReconfig
7558  *
7559  * @details
7560  *
7561  *    Function : extractTagReconfig
7562  *
7563  *    Functionality: Fills extractTagReconfig
7564  *
7565  * @params[in] TAG_Config_t *cuTagCfg
7566  *             TagCfg *macTagCfg
7567  * @return void
7568  *
7569  * ****************************************************************/
7570
7571 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
7572 {
7573   uint8_t tagIdx = 0;
7574   struct TAG_Config__tag_ToAddModList  *tagListToAddMod = NULLP;
7575   struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
7576
7577   /* Tag config to AddMod */
7578   if(cuTagCfg->tag_ToAddModList)
7579   {
7580      tagListToAddMod = cuTagCfg->tag_ToAddModList; 
7581      if(tagListToAddMod->list.count)
7582      {
7583         macTagCfg->addModListCount = tagListToAddMod->list.count;
7584         for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
7585         {
7586            macTagCfg->addModList[tagIdx].tagId =\
7587               tagListToAddMod->list.array[tagIdx]->tag_Id;     
7588            macTagCfg->addModList[tagIdx].timeAlignTimer = \
7589
7590               tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
7591         }
7592      }
7593   }
7594   /* Tag config to release */
7595   if(cuTagCfg->tag_ToReleaseList)
7596   {
7597      tagListToRel = cuTagCfg->tag_ToReleaseList;
7598      if(tagListToRel->list.count)
7599      {
7600         macTagCfg->relListCount = tagListToRel->list.count;
7601         for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
7602         {
7603            macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];     
7604         }
7605      }
7606   }
7607 }
7608
7609 /*******************************************************************
7610  *
7611  * @brief Fills PdcchCfg received by CU
7612  *
7613  * @details
7614  *
7615  *    Function : extractPdcchCfg
7616  *
7617  *    Functionality: Fills PdcchCfg received  by CU
7618  *
7619  * @params[in] PDCCH_Config_t *cuPdcchCfg,
7620  *             PdcchConfig *duPdcchCfg
7621  * @return void
7622  *
7623  * ****************************************************************/
7624
7625 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
7626 {
7627    uint8_t cRsetIdx = 0;
7628    uint8_t srchSpcIdx = 0;
7629
7630    struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
7631    struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
7632    struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
7633    struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
7634
7635
7636    /* Control Resource Set To Add/Mod List */
7637    if(cuPdcchCfg->controlResourceSetToAddModList)
7638    {
7639       cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
7640       if(cRsetToAddModList->list.count)
7641       {
7642          macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
7643          for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
7644          {
7645             macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
7646               cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
7647             bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
7648                macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
7649             macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
7650               cRsetToAddModList->list.array[cRsetIdx]->duration;
7651
7652             macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
7653               cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;   
7654             if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
7655             {
7656                //TODO: handle the case for Interleaved
7657             }
7658             macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
7659               cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
7660             if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
7661             {
7662                macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
7663                   *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
7664             }
7665          }
7666       }
7667
7668    }
7669    /* Control Resource Set To Release List */
7670    if(cuPdcchCfg->controlResourceSetToReleaseList)
7671    {
7672       cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
7673       if(cRsetToRelList->list.count)
7674       {
7675          macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
7676          for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
7677          {
7678             macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
7679          }
7680       }
7681    }
7682
7683    /* Search space To Add/Mod List */
7684    if(cuPdcchCfg->searchSpacesToAddModList)
7685    {
7686       srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
7687       if(srchSpcToAddModList->list.count)
7688       {
7689          macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
7690          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
7691          {
7692             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
7693                srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
7694             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
7695                *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
7696             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
7697             {
7698                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
7699                   srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
7700             }
7701             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
7702             {
7703                bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
7704                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
7705             }
7706             if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
7707             {
7708               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
7709                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
7710               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
7711                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
7712               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
7713                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
7714               
7715               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
7716                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
7717               
7718               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
7719                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
7720             }
7721             if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
7722             {
7723                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
7724                   srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
7725                if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
7726                {
7727                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
7728                      srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
7729                }
7730          
7731             }
7732          }
7733       }
7734    }
7735    /* Search space To Rel List */
7736    if(cuPdcchCfg->searchSpacesToReleaseList)
7737    {
7738       srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
7739       if(srchSpcToRelList->list.count)
7740       {
7741          macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
7742          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
7743          {
7744             macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
7745                *(srchSpcToRelList->list.array[srchSpcIdx]);
7746          }
7747       }
7748    }
7749 }
7750
7751 /*******************************************************************
7752  *
7753  * @brief Fills PdschCfg received by CU
7754  *
7755  * @details
7756  *
7757  *    Function : extractPdschCfg
7758  *
7759  *    Functionality: Fills PdschCfg received  by CU
7760  *
7761  * @params[in] PDSCH_Config_t *cuPdschCfg,
7762  *             PdschConfig *macPdschCfg
7763  * @return void
7764  *
7765  * ****************************************************************/
7766
7767 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
7768 {
7769    uint8_t timeDomIdx;
7770    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
7771
7772    if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
7773    {
7774       if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
7775          PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
7776       {
7777          if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
7778          {
7779             macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
7780                *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
7781          }
7782       }
7783    }
7784    macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
7785    if(cuPdschCfg->pdsch_TimeDomainAllocationList)
7786    {
7787       timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
7788       if(timeDomAlloc->present ==\
7789          PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
7790       {
7791          if(timeDomAlloc->choice.setup)
7792          {
7793             macPdschCfg->numTimeDomRsrcAlloc  = timeDomAlloc->choice.setup->list.count;
7794             for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
7795             {
7796                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
7797                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
7798                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
7799                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
7800             }
7801          }
7802       }
7803    }
7804    macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
7805    if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
7806       macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
7807    if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
7808    {
7809       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
7810       if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
7811       {
7812          if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
7813          {
7814             macPdschCfg->bundlingInfo.StaticBundling.size = \
7815                *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
7816          }
7817       }
7818    }
7819    else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
7820    {
7821       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
7822    }
7823
7824 }
7825
7826 /*******************************************************************
7827  *
7828  * @brief Fills PdschServingCellCfg received by CU
7829  *
7830  * @details
7831  *
7832  *    Function : extractPdschServingCellCfg
7833  *
7834  *    Functionality: Fills PdschCfg received  by CU
7835  *
7836  * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
7837  *             PdschServCellCfg *macUePdschSrvCellCfg
7838  * @return ROK/RFAILED
7839  *
7840  * ****************************************************************/
7841
7842 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
7843 {
7844    if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
7845    {
7846       if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
7847       {
7848          if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
7849          {
7850             *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
7851                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
7852          }
7853          else
7854          {
7855             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(uint8_t));
7856             if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
7857             {
7858                *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
7859                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
7860             }
7861             else
7862             {
7863                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
7864                return RFAILED;
7865             }
7866          }
7867          if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
7868          {
7869             *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
7870                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
7871          }
7872          else
7873          {
7874             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(bool));
7875             if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
7876             {
7877                *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
7878                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
7879             }
7880             else
7881             {
7882                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
7883                return RFAILED;
7884             }
7885          }
7886       }
7887    }
7888    if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
7889    {
7890       macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH); 
7891    }
7892    if(cuPdschSrvCellCfg->ext1)
7893    {
7894       if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
7895       {
7896         if(macUePdschSrvCellCfg->maxMimoLayers)
7897         {
7898            *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
7899         }
7900         else
7901         {
7902            DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
7903            if(macUePdschSrvCellCfg->maxMimoLayers)
7904            {
7905               *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
7906            }
7907            else
7908            {
7909               DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
7910               return RFAILED;
7911            }
7912         }
7913       }
7914    }
7915    if(cuPdschSrvCellCfg->xOverhead)
7916    {
7917       if(macUePdschSrvCellCfg->xOverhead)
7918       {
7919          *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
7920       }
7921       else
7922       {
7923          DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(uint8_t));
7924          if(macUePdschSrvCellCfg->xOverhead)
7925          {
7926             *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
7927          }
7928          else
7929          {
7930             DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
7931             return RFAILED;
7932          }
7933       }
7934    }
7935    return ROK;
7936 }
7937
7938 /*******************************************************************
7939  *
7940  * @brief Fills PuschCfg received by CU
7941  *
7942  * @details
7943  *
7944  *    Function : extractPuschCfg
7945  *
7946  *    Functionality: Fills PuschCfg received  by CU
7947  *
7948  * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
7949  *             PuschCfg *macPuschCfg
7950  * @return void
7951  *
7952  * ****************************************************************/
7953
7954 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
7955 {
7956    uint8_t timeDomIdx = 0;
7957    DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
7958    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
7959
7960    if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
7961    {
7962       if(cuPuschCfg->choice.setup)
7963       {
7964          if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
7965          {
7966              macPuschCfg->dataScramblingId = \
7967                 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
7968          }
7969          if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
7970          {
7971             if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
7972             {
7973                if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
7974                {
7975                   dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
7976                   if(dmrsUlCfg->dmrs_AdditionalPosition)
7977                   {
7978                      macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
7979                         *(dmrsUlCfg->dmrs_AdditionalPosition);
7980                   }
7981                   if(dmrsUlCfg->transformPrecodingDisabled)
7982                   {
7983                      if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
7984                      {
7985                         macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
7986                            *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
7987                      }
7988                   }
7989                }
7990             }
7991          }
7992          /*Res Alloc Type for UL */
7993          if(cuPuschCfg->choice.setup->resourceAllocation)
7994          {
7995             macPuschCfg->resourceAllocType = \
7996                cuPuschCfg->choice.setup->resourceAllocation;
7997          }
7998          if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
7999          {
8000             timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
8001             if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
8002             {
8003                if(timeDomAllocList->choice.setup)
8004                {
8005                   macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
8006                   for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
8007                   {
8008                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
8009                         *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
8010                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
8011                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
8012                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
8013                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
8014                   }
8015                }
8016             }
8017          }
8018          if(cuPuschCfg->choice.setup->transformPrecoder)
8019             macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
8020       }
8021    }
8022 }
8023
8024 /*******************************************************************
8025  *
8026  * @brief Function to fill pucch Power Control
8027  *
8028  * @details
8029  *
8030  *    Function : extractPucchPowerControl
8031  *
8032  *    Functionality: Function to fill pucch Power Control
8033  *
8034  * @params[in] PucchPowerControl *pwrCtrl,
8035  *             struct PUCCH_PowerControl *cuPwrCtrlCfg
8036  * @return void
8037  *
8038  * ****************************************************************/
8039
8040 void extractPucchPowerControl(PucchPowerControl *pwrCtrl, struct PUCCH_PowerControl *cuPwrCtrlCfg)
8041 {
8042    uint8_t arrIdx;
8043
8044    if(cuPwrCtrlCfg->deltaF_PUCCH_f0)
8045       pwrCtrl->deltaF_Format0 = *cuPwrCtrlCfg->deltaF_PUCCH_f0;
8046    if(cuPwrCtrlCfg->deltaF_PUCCH_f1)
8047       pwrCtrl->deltaF_Format1 = *cuPwrCtrlCfg->deltaF_PUCCH_f1;
8048    if(cuPwrCtrlCfg->deltaF_PUCCH_f2)
8049       pwrCtrl->deltaF_Format2 = *cuPwrCtrlCfg->deltaF_PUCCH_f2;
8050    if(cuPwrCtrlCfg->deltaF_PUCCH_f3)
8051       pwrCtrl->deltaF_Format3 = *cuPwrCtrlCfg->deltaF_PUCCH_f3;
8052    if(cuPwrCtrlCfg->deltaF_PUCCH_f4)
8053       pwrCtrl->deltaF_Format4 = *cuPwrCtrlCfg->deltaF_PUCCH_f4;
8054    if(cuPwrCtrlCfg->p0_Set)
8055    {
8056       pwrCtrl->p0SetCount = cuPwrCtrlCfg->p0_Set->list.count;
8057       for(arrIdx=0; arrIdx < pwrCtrl->p0SetCount; arrIdx++)
8058       {
8059          pwrCtrl->p0Set[arrIdx].p0PucchId =\
8060             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Id;
8061          pwrCtrl->p0Set[arrIdx].p0PucchVal =\
8062             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Value;
8063       }
8064    }
8065    if(cuPwrCtrlCfg->pathlossReferenceRSs)
8066    {
8067       pwrCtrl->pathLossRefRSListCount = cuPwrCtrlCfg->pathlossReferenceRSs->list.count;
8068       for(arrIdx = 0; arrIdx < pwrCtrl->pathLossRefRSListCount; arrIdx++)
8069       {
8070          pwrCtrl->pathLossRefRSList[arrIdx].pathLossRefRSId =\
8071             cuPwrCtrlCfg->pathlossReferenceRSs->list.array[arrIdx]->pucch_PathlossReferenceRS_Id;
8072       }
8073    }
8074 }
8075  
8076  /*******************************************************************
8077  *
8078  * @brief Function to extractResrcSetToAddModList sent by CU
8079  *
8080  * @details
8081  *
8082  *    Function : extractResrcSetToAddModList
8083  *
8084  *    Functionality: Fucntion to extractResrcSetToAddModList
8085  *
8086  * @params[in] PucchResrcSetCfg pointer,
8087  *             struct PUCCH_Config__resourceSetToAddModList pointer
8088  * @return void
8089  *
8090  * ****************************************************************/
8091
8092 void extractResrcSetToAddModList(PucchResrcSetCfg *macRsrcSetList, struct PUCCH_Config__resourceSetToAddModList *cuRsrcSetList)
8093 {
8094    uint8_t arrIdx, rsrcListIdx;
8095
8096    macRsrcSetList->resrcSetToAddModListCount = cuRsrcSetList->list.count; 
8097    for(arrIdx = 0; arrIdx < macRsrcSetList->resrcSetToAddModListCount; arrIdx++)
8098    {
8099       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcSetId     =\
8100          cuRsrcSetList->list.array[arrIdx]->pucch_ResourceSetId;
8101       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount =\
8102          cuRsrcSetList->list.array[arrIdx]->resourceList.list.count;
8103       for(rsrcListIdx = 0; rsrcListIdx < macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount; rsrcListIdx++)
8104       {
8105          macRsrcSetList->resrcSetToAddModList[arrIdx].resrcList[rsrcListIdx] =\
8106             *cuRsrcSetList->list.array[arrIdx]->resourceList.list.array[rsrcListIdx];
8107       }
8108       macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\
8109          *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1;
8110    }
8111 }/* End of extractResrcSetToAddModList */
8112
8113 /*******************************************************************
8114  *
8115  * @brief Fills extractResrcToAddModList sent by CU
8116  *
8117  * @details
8118  *
8119  *    Function : extractResrcToAddModList
8120  *
8121  *    Functionality: Fills extractResrcToAddModList
8122  *
8123  * @params[in] PucchResrcCfg pointer,
8124  *             struct PUCCH_Config__resourceToAddModList pointer
8125  * @return ROk/RFAILED
8126  *
8127  * ****************************************************************/
8128
8129 uint8_t extractResrcToAddModList(PucchResrcCfg *macResrcList, struct PUCCH_Config__resourceToAddModList *cuResrcList)
8130 {
8131    uint8_t arrIdx;
8132    
8133    macResrcList->resrcToAddModListCount = cuResrcList->list.count;
8134    for(arrIdx = 0; arrIdx < macResrcList->resrcToAddModListCount; arrIdx++)
8135    {
8136       macResrcList->resrcToAddModList[arrIdx].resrcId      =\
8137         cuResrcList->list.array[arrIdx]->pucch_ResourceId; 
8138       macResrcList->resrcToAddModList[arrIdx].startPrb     =\
8139         cuResrcList->list.array[arrIdx]->startingPRB;
8140       if(cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping)
8141       {
8142          macResrcList->resrcToAddModList[arrIdx].intraFreqHop =\
8143            *cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping;
8144       }
8145       if(cuResrcList->list.array[arrIdx]->secondHopPRB)
8146       {
8147          macResrcList->resrcToAddModList[arrIdx].secondPrbHop =\
8148            *cuResrcList->list.array[arrIdx]->secondHopPRB;
8149       }
8150       /* PUCCH RSRC FORMAT */
8151       if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format0)
8152       {
8153          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_0;
8154          if(cuResrcList->list.array[arrIdx]->format.choice.format0)
8155          {
8156             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0, sizeof(PucchFormat0));
8157             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0 == NULLP)
8158             {
8159                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format0 in extractResrcToAddModList()");
8160                return RFAILED;
8161             }
8162             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->initialCyclicShift =\
8163                cuResrcList->list.array[arrIdx]->format.choice.format0->initialCyclicShift;
8164             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->numSymbols =\
8165                cuResrcList->list.array[arrIdx]->format.choice.format0->nrofSymbols;
8166             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->startSymbolIdx =\
8167                cuResrcList->list.array[arrIdx]->format.choice.format0->startingSymbolIndex;
8168          }
8169       }
8170       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format1)
8171       {
8172          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_1;
8173          if(cuResrcList->list.array[arrIdx]->format.choice.format1)
8174          {
8175             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1, sizeof(PucchFormat1));
8176             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1 == NULLP)
8177             {
8178                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format1 in extractResrcToAddModList()");
8179                return RFAILED;
8180             }
8181             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->initialCyclicShift =\
8182                 cuResrcList->list.array[arrIdx]->format.choice.format1->initialCyclicShift;
8183             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->numSymbols =\
8184                 cuResrcList->list.array[arrIdx]->format.choice.format1->nrofSymbols;
8185             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->startSymbolIdx =\
8186                 cuResrcList->list.array[arrIdx]->format.choice.format1->startingSymbolIndex;
8187             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->timeDomOCC =\
8188                 cuResrcList->list.array[arrIdx]->format.choice.format1->timeDomainOCC;
8189          }
8190       }
8191       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format2)
8192       {
8193          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_2;
8194          if(cuResrcList->list.array[arrIdx]->format.choice.format2)
8195          {
8196             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2, sizeof(PucchFormat2_3));
8197             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2 == NULLP)
8198             {
8199                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format2 in extractResrcToAddModList()");
8200                return RFAILED;
8201             }
8202             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numPrbs =\
8203                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofPRBs;
8204             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numSymbols =\
8205                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofSymbols;
8206             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->startSymbolIdx =\
8207                 cuResrcList->list.array[arrIdx]->format.choice.format2->startingSymbolIndex;
8208          }
8209       }
8210       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format3)
8211       {
8212          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_3;
8213          if(cuResrcList->list.array[arrIdx]->format.choice.format3)
8214          {
8215             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3, sizeof(PucchFormat2_3));
8216             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3 == NULLP)
8217             {
8218                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format3 in extractResrcToAddModList()");
8219                return RFAILED;
8220             }
8221             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numPrbs =\
8222                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofPRBs;
8223             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numSymbols =\
8224                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofSymbols;
8225             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->startSymbolIdx =\
8226                 cuResrcList->list.array[arrIdx]->format.choice.format3->startingSymbolIndex;
8227          }
8228       }
8229       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format4)
8230       {
8231          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_4;
8232          if(cuResrcList->list.array[arrIdx]->format.choice.format4)
8233          {
8234             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4, sizeof(PucchFormat4));
8235             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4 == NULLP)
8236             {
8237                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format4 in extractResrcToAddModList()");
8238                return RFAILED;
8239             }
8240             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->numSymbols =\
8241                 cuResrcList->list.array[arrIdx]->format.choice.format4->nrofSymbols;
8242             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occLen =\
8243                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Length;
8244             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occIdx =\
8245                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Index;
8246             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->startSymbolIdx =\
8247                 cuResrcList->list.array[arrIdx]->format.choice.format4->startingSymbolIndex;
8248          }
8249       }
8250    }
8251    return ROK;
8252
8253 }/* End of extractResrcToAddModList */
8254
8255 /*******************************************************************
8256  *
8257  * @brief Fills fillPucchSchedReqPeriodAndOffset sent by CU
8258  *
8259  * @details
8260  *
8261  *    Function : fillPucchSchedReqPeriodAndOffset
8262  *
8263  *    Functionality: To fillPucchSchedReqPeriodAndOffset
8264  *
8265  * @params[in] macPeriodicty,
8266  *     SchedulingRequestResourceConfig__periodicityAndOffset pointer
8267  * @return void
8268  *
8269  * ****************************************************************/
8270
8271 void fillPucchSchedReqPeriodAndOffset(uint8_t macPeriodicty, uint16_t  macOffset,\
8272    struct SchedulingRequestResourceConfig__periodicityAndOffset *cuPeriodicty)
8273 {
8274    macPeriodicty = cuPeriodicty->present;
8275    switch(macPeriodicty)
8276    {
8277       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2:
8278          {
8279             macOffset     = cuPeriodicty->choice.sym2;
8280             break;
8281          }
8282       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7:
8283          {
8284             macOffset     = cuPeriodicty->choice.sym6or7;
8285             break;
8286          }
8287       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
8288          {
8289             macOffset     = cuPeriodicty->choice.sl1;
8290             break;
8291          }
8292       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
8293          {
8294             macOffset = cuPeriodicty->choice.sl2;
8295             break;
8296          }
8297       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
8298          {
8299             macOffset = cuPeriodicty->choice.sl4;
8300             break;
8301          }
8302       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
8303          {
8304             macOffset = cuPeriodicty->choice.sl5;
8305             break;
8306          }
8307       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
8308          {
8309             macOffset = cuPeriodicty->choice.sl8;
8310             break;
8311          }
8312       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
8313          {
8314             macOffset = cuPeriodicty->choice.sl10;
8315             break;
8316          }
8317       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
8318          {
8319             macOffset = cuPeriodicty->choice.sl16;
8320             break;
8321          }
8322       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
8323          {
8324             macOffset = cuPeriodicty->choice.sl20;
8325             break;
8326          }
8327       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
8328          {
8329             macOffset = cuPeriodicty->choice.sl40;
8330             break;
8331          }
8332       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
8333          {
8334             macOffset = cuPeriodicty->choice.sl80;
8335             break;
8336          }
8337       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
8338          {
8339             macOffset = cuPeriodicty->choice.sl160;
8340             break;
8341          }
8342       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
8343          {
8344             macOffset = cuPeriodicty->choice.sl320;
8345             break;
8346          }
8347       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
8348          {
8349             macOffset = cuPeriodicty->choice.sl640;
8350             break;
8351          }
8352       default :
8353          DU_LOG("\nERROR  -->  F1AP : Invalid periodicity %d", macPeriodicty);
8354    }
8355 }
8356
8357 /*******************************************************************
8358  *
8359  * @brief Function to extractPucchFormatCfg sent by CU
8360  *
8361  * @details
8362  *
8363  *    Function : extractPucchFormatCfg
8364  *
8365  *    Functionality: Function to extractPucchFormatCfg
8366  *
8367  * @params[in] PucchFormatCfg pointer,
8368  *             PUCCH_FormatConfig_t pointer
8369  * @return void
8370  *
8371  * ****************************************************************/
8372
8373 void extractPucchFormatCfg(PucchFormatCfg *macFormatCfg, PUCCH_FormatConfig_t *cuFormatCfg)
8374  {
8375     if(cuFormatCfg->interslotFrequencyHopping)
8376        macFormatCfg->interSlotFreqHop = *cuFormatCfg->interslotFrequencyHopping;
8377     if(cuFormatCfg->additionalDMRS)  
8378        macFormatCfg->addDmrs = *cuFormatCfg->additionalDMRS;
8379     if(cuFormatCfg->maxCodeRate)
8380        macFormatCfg->maxCodeRate = *cuFormatCfg->maxCodeRate;
8381     if(cuFormatCfg->nrofSlots)  
8382        macFormatCfg->numSlots = *cuFormatCfg->nrofSlots;
8383     if(cuFormatCfg->pi2BPSK)  
8384        macFormatCfg->pi2BPSK = *cuFormatCfg->pi2BPSK;
8385     if(cuFormatCfg->simultaneousHARQ_ACK_CSI)  
8386        macFormatCfg->harqAckCSI = *cuFormatCfg->simultaneousHARQ_ACK_CSI;
8387  }/* End of extractPucchFormatCfg */
8388
8389 /*******************************************************************
8390  *
8391  * @brief Function to extractSchedReqCfgToAddMod sent by CU
8392  *
8393  * @details
8394  *
8395  *    Function : extractSchedReqCfgToAddMod
8396  *
8397  *    Functionality: Function to extractSchedReqCfgToAddMod
8398  *
8399  * @params[in] PucchSchedReqCfg pointer,
8400  *      PUCCH_Config__schedulingRequestResourceToAddModList pointer
8401  * @return void
8402  *
8403  * ****************************************************************/
8404
8405 void extractSchedReqCfgToAddMod(PucchSchedReqCfg *macSchedReqCfg, struct PUCCH_Config__schedulingRequestResourceToAddModList *cuSchedReqList)
8406 {
8407    uint8_t arrIdx;
8408
8409    macSchedReqCfg->schedAddModListCount = cuSchedReqList->list.count;
8410    for(arrIdx = 0; arrIdx <  macSchedReqCfg->schedAddModListCount; arrIdx++)
8411    {
8412       macSchedReqCfg->schedAddModList[arrIdx].resrcId =\
8413          cuSchedReqList->list.array[arrIdx]->schedulingRequestResourceId;
8414       macSchedReqCfg->schedAddModList[arrIdx].requestId =\
8415          cuSchedReqList->list.array[arrIdx]->schedulingRequestID;
8416       if(cuSchedReqList->list.array[arrIdx]->periodicityAndOffset)
8417       {
8418          fillPucchSchedReqPeriodAndOffset(macSchedReqCfg->schedAddModList[arrIdx].periodicity,\
8419             macSchedReqCfg->schedAddModList[arrIdx].offset, cuSchedReqList->list.array[arrIdx]->periodicityAndOffset);
8420       }
8421       if(cuSchedReqList->list.array[arrIdx]->resource)
8422       {
8423          macSchedReqCfg->schedAddModList[arrIdx].resrc =\
8424             *cuSchedReqList->list.array[arrIdx]->resource;
8425       }
8426    }
8427
8428 }/* End of extractSchedReqCfgToAddMod */
8429
8430  /*******************************************************************
8431  *
8432  * @brief Fills PucchCfg received by CU
8433  *
8434  * @details
8435  *
8436  *    Function : extractPucchCfg
8437  *
8438  *    Functionality: Fills PucchCfg received  by CU
8439  *
8440  * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg,
8441  *             PucchCfg *macPucchCfg
8442  * @return ROK/RFAILED
8443  *
8444  * ****************************************************************/
8445
8446 uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg)         
8447 {
8448    uint8_t arrIdx;
8449
8450    if(cuPucchCfg->present == BWP_UplinkDedicated__pucch_Config_PR_setup)
8451    {
8452       if(cuPucchCfg->choice.setup)
8453       {
8454          /* Resource Set Cfg */ 
8455          if(cuPucchCfg->choice.setup->resourceSetToAddModList)
8456          {
8457             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrcSet, sizeof(PucchResrcSetCfg));
8458             if(macPucchCfg->resrcSet == NULLP)
8459             {
8460                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc set List in extractPucchCfg()");
8461                return RFAILED;
8462             }
8463             memset(macPucchCfg->resrcSet, 0, sizeof(PucchResrcSetCfg));
8464             extractResrcSetToAddModList(macPucchCfg->resrcSet, cuPucchCfg->choice.setup->resourceSetToAddModList);
8465          }
8466          
8467          /* Resource Cfg */ 
8468          if(cuPucchCfg->choice.setup->resourceToAddModList)
8469          {
8470             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrc, sizeof(PucchResrcCfg));
8471             if(macPucchCfg->resrc == NULLP)
8472             {
8473                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc List in extractPucchCfg()");
8474                return RFAILED;
8475             }
8476             memset(macPucchCfg->resrc, 0, sizeof(PucchResrcCfg));
8477             extractResrcToAddModList(macPucchCfg->resrc, cuPucchCfg->choice.setup->resourceToAddModList);
8478          }
8479          
8480          /* Format 1 Cfg */ 
8481          if(cuPucchCfg->choice.setup->format1)
8482          {
8483             DU_ALLOC_SHRABL_BUF(macPucchCfg->format1, sizeof(PucchFormatCfg));
8484             if(macPucchCfg->format1 == NULLP)
8485             {
8486                DU_LOG("\nERROR --> F1AP : Failed to extract format 1 Cfg in  extractPucchCfg()");
8487                return RFAILED;
8488             }
8489             memset(macPucchCfg->format1, 0, sizeof(PucchFormatCfg));
8490             extractPucchFormatCfg(macPucchCfg->format1,\
8491                cuPucchCfg->choice.setup->format1->choice.setup);
8492          }
8493          
8494          /* Format 2 Cfg */
8495          if(cuPucchCfg->choice.setup->format2)
8496          {
8497             DU_ALLOC_SHRABL_BUF(macPucchCfg->format2, sizeof(PucchFormatCfg));
8498             if(macPucchCfg->format2 == NULLP)
8499             {
8500                DU_LOG("\nERROR --> F1AP : Failed to extract format 2 Cfg in  extractPucchCfg()");
8501                return RFAILED;
8502             }
8503             memset(macPucchCfg->format2, 0, sizeof(PucchFormatCfg));
8504             extractPucchFormatCfg(macPucchCfg->format2,\
8505                cuPucchCfg->choice.setup->format2->choice.setup);
8506          }
8507          
8508          /* Format 3 Cfg */
8509          if(cuPucchCfg->choice.setup->format3)
8510          {
8511             DU_ALLOC_SHRABL_BUF(macPucchCfg->format3, sizeof(PucchFormatCfg));
8512             if(macPucchCfg->format3 == NULLP)
8513             {
8514                DU_LOG("\nERROR --> F1AP : Failed to extract format 3 Cfg in  extractPucchCfg()");
8515                return RFAILED;
8516             }
8517             memset(macPucchCfg->format3, 0, sizeof(PucchFormatCfg));
8518             extractPucchFormatCfg(macPucchCfg->format3,\
8519                cuPucchCfg->choice.setup->format3->choice.setup);
8520          }
8521
8522          /* Format 4 Cfg */
8523          if(cuPucchCfg->choice.setup->format4)
8524          {
8525             DU_ALLOC_SHRABL_BUF(macPucchCfg->format4, sizeof(PucchFormatCfg));
8526             if(macPucchCfg->format4 == NULLP)
8527             {
8528                DU_LOG("\nERROR --> F1AP : Failed to extract format 4 Cfg in  extractPucchCfg()");
8529                return RFAILED;
8530             }
8531             memset(macPucchCfg->format4, 0, sizeof(PucchFormatCfg));
8532             extractPucchFormatCfg(macPucchCfg->format4,\
8533                cuPucchCfg->choice.setup->format4->choice.setup);
8534          }
8535
8536          /* Sched Req List */
8537          if(cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList)
8538          {
8539             DU_ALLOC_SHRABL_BUF(macPucchCfg->schedReq, sizeof(PucchSchedReqCfg));
8540             if(macPucchCfg->schedReq == NULLP)
8541             {
8542                DU_LOG("\nERROR --> F1AP : Failed to extract schedReqCfg in  extractPucchCfg()");
8543                return RFAILED;
8544             }
8545             memset(macPucchCfg->schedReq, 0, sizeof(PucchSchedReqCfg));
8546             extractSchedReqCfgToAddMod(macPucchCfg->schedReq,\
8547             cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList);
8548          }
8549
8550          /*TODO: Add support for  Spatial Info */
8551
8552          /* MultiCsiCfg */
8553          if(cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList)
8554          {
8555             DU_ALLOC_SHRABL_BUF(macPucchCfg->multiCsiCfg, sizeof(PucchMultiCsiCfg));
8556             if(macPucchCfg->multiCsiCfg == NULLP)
8557             {
8558                DU_LOG("\nERROR --> F1AP : Failed to extract multiCsiCfg in  extractPucchCfg()");
8559                return RFAILED;
8560             }
8561             memset(macPucchCfg->multiCsiCfg, 0, sizeof(PucchMultiCsiCfg));
8562             macPucchCfg->multiCsiCfg->multiCsiResrcListCount = cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.count;
8563             for(arrIdx =0; arrIdx < macPucchCfg->multiCsiCfg->multiCsiResrcListCount; arrIdx++)
8564             {
8565                macPucchCfg->multiCsiCfg->multiCsiResrcList[arrIdx] =\
8566                  *cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.array[arrIdx];
8567             }
8568          }
8569
8570          /* Dl_DataToUL_ACK */ 
8571          if(cuPucchCfg->choice.setup->dl_DataToUL_ACK)
8572          {
8573             DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
8574             if(macPucchCfg->dlDataToUlAck == NULLP)
8575             {
8576                DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
8577                return RFAILED;
8578             }
8579             memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
8580             macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
8581             for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
8582             {
8583                macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
8584                   *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
8585             }
8586          }
8587
8588          /* Power Control */
8589          if(cuPucchCfg->choice.setup->pucch_PowerControl)
8590          {
8591             DU_ALLOC_SHRABL_BUF(macPucchCfg->powerControl, sizeof(PucchPowerControl));
8592             if(macPucchCfg->powerControl == NULLP)
8593             {
8594                DU_LOG("\nERROR --> F1AP : Failed to extract power control in extractPucchCfg()");
8595                return RFAILED;
8596             }
8597             extractPucchPowerControl(macPucchCfg->powerControl,\
8598                cuPucchCfg->choice.setup->pucch_PowerControl);
8599          }
8600       }
8601    }
8602    return ROK;
8603 }
8604
8605 /*******************************************************************
8606  *
8607  * @brief Fills ServingCellReconfig received by CU
8608  *
8609  * @details
8610  *
8611  *    Function : extractSpCellDedicatedCfg
8612  *
8613  *    Functionality: Fills ServingCellReconfig received  by CU
8614  *
8615  * @params[in] ServingCellConfig_t *cuSrvCellCfg
8616  *             ServCellCfgInfo *macSrvCellCfg
8617  * @return ROK/RFAILD
8618  *
8619  * ****************************************************************/
8620 uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg)
8621 {
8622    uint8_t ret = ROK;
8623    BWP_DownlinkDedicated_t *dlBwp = NULLP;
8624    BWP_UplinkDedicated_t   *ulBwp = NULLP;
8625
8626    if(cuSrvCellCfg->initialDownlinkBWP)
8627    {
8628       dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
8629       if(dlBwp->pdcch_Config)
8630       {
8631          if(dlBwp->pdcch_Config->choice.setup)
8632          {
8633             macSrvCellCfg->initDlBwp.pdcchPresent = true;
8634             extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
8635          }
8636       }
8637       if(dlBwp->pdsch_Config)
8638       {
8639          if(dlBwp->pdsch_Config->choice.setup)
8640          {
8641             macSrvCellCfg->initDlBwp.pdschPresent = true;
8642             extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg);
8643          }
8644       }
8645    }
8646    if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
8647       macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
8648    if(cuSrvCellCfg->defaultDownlinkBWP_Id)
8649       macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
8650    if(cuSrvCellCfg->bwp_InactivityTimer)
8651    {
8652       if(macSrvCellCfg->bwpInactivityTmr)
8653       {
8654          memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
8655       }
8656       else
8657       {
8658          macSrvCellCfg->bwpInactivityTmr = NULLP;
8659          DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
8660          if(macSrvCellCfg->bwpInactivityTmr)
8661          {
8662             memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
8663          }
8664          else
8665          {
8666             DU_LOG("\nERROR  --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
8667             return RFAILED;
8668          }
8669       }
8670    }
8671    if(cuSrvCellCfg->pdsch_ServingCellConfig)
8672    {
8673       if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
8674       {
8675          ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
8676          if(ret == RFAILED)
8677          {
8678             DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
8679             return RFAILED;
8680          }
8681       }
8682    }
8683    if(cuSrvCellCfg->uplinkConfig)
8684    {
8685      if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
8686      {
8687         ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
8688         if(ulBwp->pusch_Config)
8689         {
8690            macSrvCellCfg->initUlBwp.puschPresent = true;
8691            extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
8692         }
8693         if(ulBwp->pucch_Config)
8694         {
8695            macSrvCellCfg->initUlBwp.pucchPresent = true;
8696            memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
8697            extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg); 
8698         }
8699      }
8700      if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
8701         macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
8702    }
8703    return ret;
8704 }
8705 /*******************************************************************
8706  *
8707  * @brief Fills Reconfig Cell group Info received by CU
8708  *
8709  * @details
8710  *
8711  *    Function : extractUeReCfgCellInfo
8712  *
8713  *    Functionality: Fills Reconfig Cell group Info received by CU
8714  *
8715  * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
8716  *             MacUeCfg*  macUeCfg
8717  * @return ROK/RFAILED
8718  *
8719  * ****************************************************************/
8720 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg)
8721 {
8722    uint8_t ret = ROK;
8723    MAC_CellGroupConfig_t     *macCellGroup = NULLP;
8724    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
8725    SpCellConfig_t            *spcellCfg = NULLP;
8726    ServingCellConfig_t       *servCellCfg = NULLP;
8727
8728    if(cellGrp)
8729    {
8730       /* Fill MacCell Group Reconfig  */
8731       if(cellGrp->mac_CellGroupConfig)
8732       {
8733          macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
8734          if(macCellGroup->schedulingRequestConfig)
8735          {
8736             extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
8737          }
8738          if(macCellGroup->tag_Config)
8739          {
8740             extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
8741          }
8742          if(macCellGroup->bsr_Config)
8743          {
8744             macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
8745             macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer     = macCellGroup->bsr_Config->retxBSR_Timer;
8746             if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
8747             {
8748                macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer  =\
8749                   *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
8750             }
8751          }
8752          if(macCellGroup->phr_Config)
8753          {
8754             if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
8755             {
8756                macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
8757                if(macCellGroup->phr_Config->choice.setup)
8758                {
8759                 macUeCfg->macCellGrpCfg.phrCfg.periodicTimer     = \
8760                    macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
8761                 macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer     = \
8762                    macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
8763                 macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor     = \
8764                    macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
8765                 macUeCfg->macCellGrpCfg.phrCfg.multiplePHR       = \
8766                    macCellGroup->phr_Config->choice.setup->multiplePHR;
8767                 macUeCfg->macCellGrpCfg.phrCfg.dummy             = \
8768                    macCellGroup->phr_Config->choice.setup->dummy;
8769                 macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
8770                    macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
8771                 macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG        = \
8772                    macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
8773                }
8774             }
8775          }
8776       }
8777       /* Fill Physical Cell Group Reconfig */
8778       if(cellGrp->physicalCellGroupConfig)
8779       {
8780          phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
8781          if(phyCellGrpCfg->p_NR_FR1)
8782          {
8783             if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
8784                macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
8785          }
8786          macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
8787       }
8788       /* Fill SpCell Reconfig */
8789       if(cellGrp->spCellConfig)
8790       {
8791          spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));  
8792          if(spcellCfg->servCellIndex)
8793          {
8794             macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
8795          }
8796          /* Fill Serving cell Reconfig info */
8797          if(cellGrp->spCellConfig->spCellConfigDedicated)
8798          {
8799             servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
8800             ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
8801             if(ret == RFAILED)
8802             {
8803                DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
8804             }
8805          }
8806       }
8807    }
8808    return ret;
8809 }
8810 /*******************************************************************
8811 *
8812 * @brief free the memory allocated by decoder
8813 *
8814 * @details
8815 *
8816 *    Function : freeAperDecodeNrcgi 
8817 *
8818 *    Functionality: Free Nrcgi values
8819 *
8820 * @params[in] NRCGI_t *nrcgi
8821 * @return void
8822 *
8823 * ****************************************************************/
8824
8825
8826 void freeAperDecodeNrcgi(NRCGI_t *nrcgi)
8827 {
8828     if(nrcgi->pLMN_Identity.buf != NULLP)
8829     {
8830        free(nrcgi->pLMN_Identity.buf);
8831     }
8832     if(nrcgi->nRCellIdentity.buf != NULLP)
8833     {
8834        free(nrcgi->nRCellIdentity.buf);
8835     }
8836 }
8837 /*******************************************************************
8838 *
8839 * @brief free the memory allocated by decoder
8840 *
8841 * @details
8842 *
8843 *    Function : freeAperDecodeCuToDuInfo 
8844 *
8845 *    Functionality:  Free Cu To Du Information
8846 *
8847 * @params[in] CUtoDURRCInformation_t *rrcMsg
8848 * @return void
8849 *
8850 * ****************************************************************/
8851
8852
8853 void freeAperDecodeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8854 {
8855    uint8_t ieIdx =0;
8856    uint8_t arrIdx =0;
8857
8858    if(rrcMsg->uE_CapabilityRAT_ContainerList)
8859    {
8860       if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8861          free(rrcMsg->uE_CapabilityRAT_ContainerList->buf);
8862       free(rrcMsg->uE_CapabilityRAT_ContainerList);
8863    }
8864
8865    if(rrcMsg->iE_Extensions)
8866    {
8867       if(rrcMsg->iE_Extensions->list.array)
8868       {
8869          for(ieIdx= 0; ieIdx < rrcMsg->iE_Extensions->list.count; ieIdx++)
8870          {
8871             if(rrcMsg->iE_Extensions->list.array[ieIdx])
8872             {
8873                switch(rrcMsg->iE_Extensions->list.array[ieIdx]->id)
8874                {
8875                   case ProtocolIE_ID_id_CellGroupConfig:
8876                      if(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8877                      {
8878                         free(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf);
8879                      }
8880                      break;
8881                   default:
8882                      DU_LOG("\nERROR  -->  F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8883                            rrcMsg->iE_Extensions->list.array[ieIdx]->id);
8884                      break;
8885                }
8886             }
8887          }
8888          for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
8889          {
8890             free(rrcMsg->iE_Extensions->list.array[arrIdx]);
8891          }
8892          free(rrcMsg->iE_Extensions->list.array);
8893
8894       }
8895
8896       free(rrcMsg->iE_Extensions);
8897    }
8898 }
8899 /*******************************************************************
8900 *
8901 * @brief free the memory allocated by decoder
8902 *
8903 * @details 
8904 *
8905 *    Function : freeAperDecodeSplCellList
8906 *
8907 *    Functionality: Free Spl Cell List 
8908                     where memory allocated by aper_decoder
8909 *
8910 * @params[in]  SCell_ToBeSetup_List_t *spCellLst
8911 * @return void
8912 *
8913 * ****************************************************************/
8914
8915
8916 void freeAperDecodeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
8917 {
8918     uint8_t  cellIdx =0;
8919
8920     if(spCellLst->list.array != NULLP)
8921     {
8922        for(cellIdx=0; cellIdx<spCellLst->list.count; cellIdx++)
8923        {
8924           if(cellIdx==0&&spCellLst->list.array[cellIdx]!=NULLP)
8925           {
8926              freeAperDecodeNrcgi(&spCellLst->list.array[cellIdx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
8927           }
8928           if(spCellLst->list.array[cellIdx]!=NULLP)
8929           {
8930              free(spCellLst->list.array[cellIdx]);
8931           }
8932        }
8933        free(spCellLst->list.array);
8934     }
8935 }
8936 /*******************************************************************
8937 *
8938 * @brief free the memory allocated by decoder
8939 *
8940 * @details
8941 *
8942 *    Function : freeAperDecodeSRBSetup 
8943 *
8944 *    Functionality: added free part for the memory allocated by aper_decoder
8945 *
8946 * @params[in] SRBs_ToBeSetup_List_t *srbSet
8947 * @return void
8948 *
8949 ****************************************************************/
8950
8951
8952 void freeAperDecodeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
8953 {
8954     uint8_t srbIdx =0;
8955     if(srbSet->list.array != NULLP)
8956     {
8957        for(srbIdx=0; srbIdx<srbSet->list.count; srbIdx++)
8958        {
8959           if(srbSet->list.array[srbIdx]!=NULLP)
8960           {
8961              free(srbSet->list.array[srbIdx]);
8962           }
8963        }
8964        free(srbSet->list.array);
8965     }
8966 }
8967
8968 /*******************************************************************
8969 *
8970 * @brief free the memory allocated by decoder
8971 *
8972 * @details
8973 *
8974 *    Function : freeAperDecodeULTnlInfo
8975 *
8976 *    Functionality: added free part for the memory allocated by aper_decoder
8977 *
8978 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
8979 * @return void
8980 *
8981 * ****************************************************************/
8982
8983
8984 void freeAperDecodeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
8985 {
8986    uint8_t ulIdx=0;
8987    if(ulInfo->list.array != NULLP)
8988    {
8989       for(ulIdx=0; ulIdx<ulInfo->list.count; ulIdx++)
8990       {
8991          if(ulIdx==0&&ulInfo->list.array[ulIdx]!=NULLP)
8992          {
8993             if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
8994             {
8995                if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
8996                      transportLayerAddress.buf != NULLP)
8997                {
8998                   if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
8999                         !=NULLP)
9000                   {
9001                      free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf);
9002                   }
9003                   free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9004                         transportLayerAddress.buf);
9005                }
9006                free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel);
9007             }
9008          }
9009          if(ulInfo->list.array[ulIdx]!=NULLP)
9010          {
9011             free(ulInfo->list.array[ulIdx]);
9012          }
9013       }
9014       free(ulInfo->list.array);
9015    }
9016 }
9017 /*******************************************************************
9018 *
9019 * @brief free the memory allocated by decoder
9020 *
9021 * @details
9022 *
9023 *    Function : freeAperDecodeDRBSetup  
9024 *
9025 *    Functionality: free DRBSetup which is allocated by decoder
9026 *
9027 * @params[in]  DRBs_ToBeSetup_List_t *drbSet
9028 * @return void
9029 *
9030 * ****************************************************************/
9031
9032 void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
9033 {
9034    DRBs_ToBeSetup_Item_t *drbSetItem = NULLP;
9035    uint8_t  flowIdx =0;
9036    uint8_t  drbIdx =0;
9037    
9038    if(drbSet->list.array != NULLP)
9039    {
9040       for(drbIdx=0; drbIdx<drbSet->list.count; drbIdx++)
9041       {
9042          if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
9043          {
9044             drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9045             if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
9046             {
9047                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9048                      qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
9049                {
9050                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9051                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9052                   {
9053                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9054                            qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9055                      {
9056
9057                         if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
9058                         {
9059
9060                            if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
9061                            {
9062
9063                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
9064                               buf!=NULLP)
9065                               {
9066
9067                                  if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
9068                                        flows_Mapped_To_DRB_List.list.array != NULLP)
9069                                  {
9070
9071                                     for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9072                                     DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
9073                                     {
9074
9075                                        if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9076                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9077                                        {
9078                                           if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9079                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9080                                                 qoSFlowLevelQoSParameters.\
9081                                                 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
9082                                           {
9083                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9084                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9085                                                    qoSFlowLevelQoSParameters.\
9086                                                    qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9087                                              {
9088
9089                                                 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9090                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9091                                                       qoSFlowLevelQoSParameters.\
9092                                                       qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9093                                                 {
9094                                                    freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
9095                                                    free(drbSetItem->uLConfiguration);
9096
9097
9098                                                    free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9099                                                          DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9100                                                          qoSFlowLevelQoSParameters.\
9101                                                          qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9102                                                 }
9103
9104                                                 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9105                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9106                                                       qoSFlowLevelQoSParameters.\
9107                                                       qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9108                                              }
9109
9110                                              free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9111
9112                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9113                                                    qoSFlowLevelQoSParameters.\
9114                                                    qoS_Characteristics.choice.non_Dynamic_5QI);
9115                                           }
9116                                        }
9117                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9118                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9119                                        {
9120
9121                                           free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9122                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
9123                                        }
9124                                     }
9125
9126                                     free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9127                                           DRB_Information.flows_Mapped_To_DRB_List.list.array);
9128                                  }
9129
9130                                  free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9131                                  DRB_Information.sNSSAI.sD->buf);
9132                               }
9133
9134                               free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
9135                            }
9136
9137                            free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
9138
9139                         }
9140
9141                         free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9142
9143                               qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9144                      }
9145
9146                      free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9147                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9148                   }
9149
9150                   free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9151                         qoS_Characteristics.choice.non_Dynamic_5QI);
9152                }
9153                free(drbSetItem->qoSInformation.choice.choice_extension);
9154             }
9155          }
9156          if(drbSet->list.array[drbIdx]!=NULLP)
9157          {
9158             free(drbSet->list.array[drbIdx]);
9159          }
9160       }
9161       free(drbSet->list.array);
9162    }
9163 }
9164
9165
9166 /*******************************************************************
9167  *
9168  * @brief builds Mac Cell Cfg
9169  *
9170  * @details
9171  *
9172  *    Function : procUeReCfgCellInfo
9173  *
9174  *    Functionality: builds Mac Cell Cfg
9175  *
9176  * @params[in] MacUeCfg pointer
9177  *             void pointer
9178  *
9179  * @return void 
9180  *
9181  * ****************************************************************/
9182 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, void *cellInfo)
9183 {
9184    uint8_t ret = ROK;
9185    CellGroupConfigRrc_t *cellGrp = NULLP;
9186
9187    if(cellInfo)
9188    {
9189       cellGrp = (CellGroupConfigRrc_t *)cellInfo;
9190       ret = extractUeReCfgCellInfo(cellGrp, macUeCfg);
9191       if(ret == RFAILED)
9192          DU_LOG("\nERROR  -->  F1AP : Failed at procUeReCfgCellInfo()");
9193    }
9194    if(ret == RFAILED)
9195    {
9196       freeUeReCfgCellGrpInfo(macUeCfg);
9197    }
9198    return ret;
9199 }
9200
9201 /*******************************************************************
9202  *
9203  * @brief Filling modulation info in mac ue cfg
9204  *
9205  * @details
9206  *
9207  *    Function : duFillModulationDetails
9208  *
9209  *    Functionality: Filling modulation info in mac ue cfg
9210  *
9211  * @params[in] MAC UE Config to be updated
9212  *             Current UE configuration
9213  *             UE NR capability from CU
9214  * @return ROK     - success
9215  *         RFAILED - failure
9216  *
9217  * ****************************************************************/
9218 void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
9219 {
9220    UE_NR_Capability_t *ueNrCap;
9221
9222    if(ueCap)
9223       ueNrCap = (UE_NR_Capability_t *)ueCap;
9224
9225    /* Filling DL modulation info */
9226    if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
9227          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
9228          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
9229    {
9230       switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
9231       {
9232          case ModulationOrder_qpsk:
9233             {
9234                ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
9235                break;
9236             }
9237          case ModulationOrder_qam16:
9238             {
9239                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
9240                break;
9241             }
9242          case ModulationOrder_qam64:
9243             {
9244                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
9245                ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
9246                ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
9247                break;
9248             }
9249          case ModulationOrder_qam256:
9250             {
9251                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
9252                break;
9253             }
9254          default:
9255             {
9256                DU_LOG("\nERROR  -->  DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
9257                memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9258                break;
9259             }
9260       }
9261    }
9262    else
9263    {
9264       memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9265    }
9266
9267    /* Filling UL modulation info */
9268    if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
9269          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
9270          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
9271    {
9272       switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
9273       {
9274          case ModulationOrder_qpsk:
9275             {
9276                ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
9277                break;
9278             }
9279          case ModulationOrder_qam16:
9280             {
9281                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
9282                ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
9283                ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
9284                break;
9285             }
9286          case ModulationOrder_qam64:
9287             {
9288                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
9289                break;
9290             }
9291          case ModulationOrder_qam256:
9292             {
9293                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
9294                break;
9295             }
9296          default:
9297             {
9298                DU_LOG("\nERROR  -->  DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
9299                memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9300                break;
9301             }
9302       }
9303    }
9304    else
9305    {
9306       memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9307    }
9308 }
9309
9310 /*******************************************************************
9311  *
9312  * @brief Function to extract cellGrp Info present in cutoDu cont
9313  *
9314  * @details
9315  *
9316  *    Function : extractCellGrpInfo
9317  *
9318  *    Functionality: Function to extract cellGrp Info present
9319  *                   in cutoDu cont
9320  *
9321  * @params[in] ProtocolExtensionContainer_4624P16_t pointer
9322  *
9323  * @return CellGroupConfigRrc_t *
9324  *
9325  * ****************************************************************/
9326
9327 CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
9328    DuUeCfg *ueCfgDb)
9329 {
9330    uint8_t idx2 =0;
9331    uint16_t id =0;
9332    uint16_t recvBufLen =0;
9333    CellGroupConfigRrc_t *cellGrpCfg = NULLP;
9334    CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
9335    asn_dec_rval_t rval; /* Decoder return value */
9336    memset(&rval, 0, sizeof(asn_dec_rval_t));
9337
9338    if(protocolIeExtn)
9339    {
9340       for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++)
9341       {
9342          extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2]));
9343          id = extIeInfo->id;
9344          switch(id)
9345          {
9346             case ProtocolIE_ID_id_CellGroupConfig:
9347             {
9348                recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
9349                /* decoding the CellGroup Buf received */
9350                DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
9351                if(cellGrpCfg)
9352                {
9353                   memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
9354                   rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
9355                      extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
9356                   if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9357                   {
9358                      DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9359                      return NULLP;
9360                   }
9361                   xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
9362                   if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
9363                      return NULLP;
9364                }
9365                break;
9366             }
9367             default:
9368                DU_LOG("\nERROR  -->  F1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id);
9369                break;
9370          }
9371       }
9372    }
9373    return cellGrpCfg;
9374 }
9375
9376 /*******************************************************************
9377  *
9378  * @brief Fills Srb List received by CU
9379  *
9380  * @details
9381  *
9382  *    Function : procSrbListToSetup
9383  *
9384  *    Functionality: Fills Srb List received  by CU
9385  *
9386  * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
9387  *             LcCfg pointer
9388  *             RlcBearerCfg pointer
9389  * @return void
9390  *
9391  * ****************************************************************/
9392 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
9393 {
9394    uint8_t ret = ROK;
9395
9396    /* Filling RLC INFO */
9397    procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
9398
9399    /* Filling MAC INFO */
9400    ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL, NULL, macLcToAdd, NULL);
9401    if(ret == RFAILED)
9402    { 
9403       DU_LOG("\nERROR  -->  F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
9404       return ret;
9405    }
9406    return ret;
9407 }
9408
9409
9410
9411 /*******************************************************************
9412  *
9413  * @brief extract Srb List received by CU
9414  *
9415  * @details
9416  *
9417  *    Function : extractSrbListToSetup
9418  *
9419  *    Functionality: extract Srb List received by CU
9420  *                   for both MAC and RLC
9421  *
9422  * @params[in] SRBs_ToBeSetup_Item_t pointer
9423  *             DuUeCfg pointer
9424  * @return ROK/RFAIED
9425  *
9426  * ****************************************************************/
9427
9428 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
9429 {
9430    uint8_t ret, srbIdx;
9431    SRBs_ToBeSetup_Item_t *srbItem = NULLP;
9432
9433    if(srbCfg)
9434    {
9435       for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
9436       {
9437          srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
9438          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9439          { 
9440             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in MAC");
9441             ret = RFAILED;
9442             break;
9443          }
9444          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9445          {
9446             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in RLC");
9447             ret = RFAILED;
9448             break;
9449          }
9450          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9451          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9452          ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9453             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
9454          ueCfgDb->numRlcLcs++;
9455          ueCfgDb->numMacLcs++;
9456          if(ret == RFAILED)
9457          {
9458             DU_LOG("\nERROR  -->  F1AP:  Failed at extractSrbListToSetup()");
9459             break;
9460          }
9461       }
9462    }
9463    else
9464       ret = RFAILED;
9465
9466    return ret;
9467 }
9468
9469 /*******************************************************************
9470  *
9471  * @brief Fills Drb List received by CU
9472  *
9473  * @details
9474  *
9475  *    Function : procDrbListToSetup
9476  *
9477  *    Functionality: Fills Drb List received by CU
9478  *                   for both MAC and RLC
9479  *
9480  * @params[in] SRBs_ToBeSetup_Item_t pointer
9481  *             LcCfg pointer,
9482  *             RlcBearerCfg pointer
9483  * @return void
9484  *
9485  * ****************************************************************/
9486
9487 uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\
9488    LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo)
9489 {
9490    uint8_t ret = ROK;
9491
9492    /* Filling RLC INFO */
9493    procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
9494
9495    /* Filling MAC INFO */
9496    ret = procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, macLcToAdd, upTnlInfo);
9497    if(ret == RFAILED)
9498    { 
9499       DU_LOG("\nERROR  --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
9500       return ret;
9501    }
9502
9503    return ret;
9504 }
9505
9506 /*******************************************************************
9507  *
9508  * @brief extract Drb List received by CU
9509  *
9510  * @details
9511  *
9512  *    Function : extractDrbListToSetup
9513  *
9514  *    Functionality: extract Drb List received by CU
9515  *                   for both MAC and RLC
9516  *
9517  * @params[in] DRBs_ToBeSetup_Item_t pointer
9518  *             DuUeCfg pointer
9519  * @return ROK/RFAIED
9520  *
9521  * ****************************************************************/
9522
9523 uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg, DuUeCfg *ueCfgDb)
9524 {
9525    uint8_t ret, drbIdx;
9526    DRBs_ToBeSetup_Item_t *drbItem = NULLP;
9527    
9528    ret = ROK;
9529    if(drbCfg)
9530    {
9531       for(drbIdx = 0; drbIdx < drbCfg->list.count; drbIdx++)
9532       {
9533          drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9534          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9535          { 
9536             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in MAC at extractDrbListToSetup()");
9537             ret = RFAILED;
9538             break;
9539          }
9540          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9541          {
9542             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in RLC at extractDrbListToSetup()");
9543             ret = RFAILED;
9544             break;
9545          }
9546          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9547          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9548             
9549          ret = procDrbListToSetup(lcId, drbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9550             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
9551
9552          ueCfgDb->numRlcLcs++;
9553          ueCfgDb->numMacLcs++;
9554          ueCfgDb->numDrb++;
9555          if(ret == RFAILED)
9556          {
9557             DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
9558             break;
9559          }
9560       }
9561    }
9562    else
9563       ret = RFAILED;
9564
9565    return ret;
9566 }
9567
9568 /*******************************************************************
9569  *
9570  * @brief Function to extract Dl RRC Msg received from CU
9571  *
9572  * @details
9573  *
9574  *    Function : extractDlRrcMsg
9575  *
9576  *    Functionality: Function to extract Dl RRC Msg received from CU
9577  *
9578  * @params[in] F1AP message
9579  * @return ROK     - success
9580  *         RFAILED - failure
9581  *
9582  * ****************************************************************/
9583
9584 uint8_t extractDlRrcMsg(uint32_t gnbDuUeF1apId, uint32_t gnbCuUeF1apId, \
9585    F1DlRrcMsg *dlRrcMsg, RRCContainer_t *rrcContainer)
9586 {
9587    uint8_t ret = ROK;
9588    dlRrcMsg->rrcMsgSize = rrcContainer->size;
9589    if(dlRrcMsg->rrcMsgSize > 0)
9590    {
9591       DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
9592       if(!dlRrcMsg->rrcMsgPdu)
9593       {
9594          DU_LOG("\nERROR  --> DU APP : Memory allocation failed for RRC Msg in extractDlRrcMsg()");
9595          ret = RFAILED;
9596       }
9597       else
9598       {
9599          dlRrcMsg->gnbDuUeF1apId = gnbDuUeF1apId;
9600          dlRrcMsg->gnbCuUeF1apId = gnbCuUeF1apId;
9601          dlRrcMsg->srbId = SRB1_LCID;
9602          memcpy(dlRrcMsg->rrcMsgPdu, rrcContainer->buf, dlRrcMsg->rrcMsgSize);
9603       }
9604    }
9605    return ret;
9606 }
9607
9608 /*******************************************************************
9609  *
9610  * @brief Extract UE capability info 
9611  *
9612  * @details
9613  *
9614  *    Function : extractUeCapability
9615  *
9616  *    Functionality: Extract UE capability info and stores in ue Cb
9617  *
9618  * @params[in] Octet string of UE capability RAT container list
9619  * @return ROK     - success
9620  *         RFAILED - failure
9621  *
9622  * ****************************************************************/
9623 UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf, DuUeCb *ueCb)
9624 {
9625    uint8_t  idx;
9626    uint16_t recvBufLen;
9627    asn_dec_rval_t rval;
9628    UE_NR_Capability_t  *ueNrCap = NULLP;
9629    UE_CapabilityRAT_ContainerListRRC_t  *ueCapRatContList = NULLP;
9630
9631    /* Decoding UE Capability RAT Container List */
9632    recvBufLen = ueCapablityListBuf->size;
9633    DU_ALLOC(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9634    if(!ueCapRatContList)
9635    {
9636       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
9637       return NULLP;
9638    }
9639    memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9640    memset(&rval, 0, sizeof(asn_dec_rval_t));
9641    rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList,
9642           ueCapablityListBuf->buf, recvBufLen, 0, 0);
9643    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9644    {
9645       DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9646       return NULLP;
9647    }
9648    xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, ueCapRatContList);
9649
9650    /* Free encoded buffer after decoding */
9651
9652    for(idx = 0; idx < ueCapRatContList->list.count; idx++)
9653    {
9654       if(ueCapRatContList->list.array[idx]->rat_Type == RAT_Type_nr)
9655       {
9656          /* Decoding UE NR Capability */
9657           recvBufLen = ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.size;
9658           DU_ALLOC(ueNrCap, sizeof(UE_NR_Capability_t));
9659           if(!ueNrCap)
9660           {
9661              DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
9662              DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9663              return NULLP;
9664           } 
9665           memset(ueNrCap, 0, sizeof(UE_NR_Capability_t));
9666           memset(&rval, 0, sizeof(asn_dec_rval_t));
9667           rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap,
9668                  ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0);
9669           if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9670           {
9671              DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9672              return NULLP;
9673           }
9674           xer_fprint(stdout, &asn_DEF_UE_NR_Capability, ueNrCap);
9675           
9676           /* Free encoded buffer after decoding */
9677           free(ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf);
9678       }
9679       free(ueCapRatContList->list.array[idx]);
9680    }
9681
9682    /* Free Memory*/
9683    free(ueCapRatContList->list.array);
9684    DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9685    return ueNrCap;
9686 }
9687  
9688 /*******************************************************************
9689 *
9690 * @brief free UE context setup request from CU
9691 *
9692 * @details
9693 *
9694 *    Function : freeAperDecodeF1UeContextSetupReq
9695 *
9696 *    Functionality: freeing part for the memory allocated by aper_decoder
9697 *
9698 * @params[in] F1AP message
9699 * @return ROK     - success
9700 *         RFAILED - failure
9701 *
9702 * ****************************************************************/
9703 void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t   *ueSetReq)
9704 {
9705    uint8_t ieIdx = 0;
9706
9707    if(ueSetReq->protocolIEs.list.array != NULLP)
9708    {
9709       for(ieIdx = 0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++)
9710       {
9711          if(ueSetReq->protocolIEs.list.array[ieIdx])
9712          {
9713             switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
9714             {
9715                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9716                   break;
9717                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9718                   break;
9719                case ProtocolIE_ID_id_SpCell_ID:
9720                   freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
9721                   break;
9722                case ProtocolIE_ID_id_ServCellIndex:
9723                   break;
9724                case ProtocolIE_ID_id_SpCellULConfigured:
9725                   break;
9726                case ProtocolIE_ID_id_CUtoDURRCInformation:
9727
9728                   freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation);
9729                   break;
9730                case ProtocolIE_ID_id_SCell_ToBeSetup_List:
9731
9732                   freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List);
9733                   break;
9734                case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
9735
9736                   freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List);
9737                   break;
9738                case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
9739
9740                   freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List);
9741                   break;
9742                case ProtocolIE_ID_id_RRCContainer:
9743                   {
9744
9745                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP)
9746                      {
9747
9748                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
9749                      }
9750                      break;
9751                   }
9752                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
9753                   break;
9754                case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
9755                   {
9756                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf)
9757                      {
9758                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf);
9759                      }
9760                      break;
9761                   }
9762                default:
9763                   DU_LOG("\nERROR  -->  F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id);
9764             } 
9765             free(ueSetReq->protocolIEs.list.array[ieIdx]);
9766          }
9767       }
9768       free(ueSetReq->protocolIEs.list.array);
9769    }
9770 }
9771 /*******************************************************************
9772  *
9773  * @brief Process UE context setup request from CU
9774  *
9775  * @details
9776  *
9777  *    Function : procF1UeContextSetupReq
9778  *
9779  *    Functionality: Process UE context setup request from CU
9780  *
9781  * @params[in] F1AP message
9782  * @return ROK     - success
9783  *         RFAILED - failure
9784  *
9785  * ****************************************************************/
9786 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
9787 {
9788    uint8_t  ret, ieIdx, ueIdx, lcId, cellIdx;
9789    bool ueCbFound = false;
9790    uint32_t gnbCuUeF1apId, gnbDuUeF1apId, bitRateSize;
9791    DuUeCb   *duUeCb = NULLP;
9792    UEContextSetupRequest_t   *ueSetReq = NULLP;
9793     
9794    ret = ROK;
9795    
9796    ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9797    for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
9798    {
9799       switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
9800       {
9801          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9802             {
9803                gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
9804                break;
9805             }
9806          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9807             {
9808                gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
9809                break;
9810             }
9811          case ProtocolIE_ID_id_ServCellIndex:
9812             {
9813                cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
9814                for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9815                {
9816                   if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
9817                      (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
9818                   {
9819                      ueCbFound = true;
9820                      duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
9821                      DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
9822                      if(duUeCb->f1UeDb)
9823                      {
9824                         memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
9825                         duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
9826                         duUeCb->f1UeDb->cellIdx = cellIdx;
9827                      }
9828                      else
9829                      {
9830                         DU_LOG("\nERROR  -->  F1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
9831                         ret = RFAILED;
9832                      }
9833                   }
9834                   else
9835                      ueCbFound = false;
9836                   
9837                }
9838                if(!ueCbFound)
9839                {
9840                   DU_LOG("\nERROR  -->  F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
9841                   ret = RFAILED;
9842                }
9843                break;
9844             }
9845          case ProtocolIE_ID_id_SpCellULConfigured:
9846             /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL, 
9847             UL, SUL or UL+SUL for the indicated cell for the UE */
9848             break;
9849          case ProtocolIE_ID_id_CUtoDURRCInformation:
9850             {
9851                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList)
9852                {
9853                   duUeCb->f1UeDb->duUeCfg.ueNrCapability = \
9854                      extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
9855                         uE_CapabilityRAT_ContainerList, duUeCb);
9856                }
9857                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
9858                {
9859                   duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
9860                      value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
9861                   if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
9862                   {
9863                      DU_LOG("\nERROR  -->  F1AP: Failed to extract cell Grp Info");
9864                      //TODO: Update the failure cause in ue context Setup Response
9865                      ret = RFAILED;
9866                   }
9867                }
9868                break;
9869             } 
9870          case ProtocolIE_ID_id_SCell_ToBeSetup_List:
9871             {
9872                DU_LOG("\nINFO   -->  DU_APP: Received SCell_ToBeSetup_List but  Not processing the list");
9873             break;
9874             }
9875          case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
9876             {
9877                if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
9878                   &duUeCb->f1UeDb->duUeCfg))
9879                {
9880                   DU_LOG("\nERROR  -->  DU APP : Failed at extractSrbListToSetup()");
9881                   //TODO: Update the failure cause in ue context Setup Response
9882                   ret = RFAILED;
9883                }
9884                break;
9885             }
9886          case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
9887             {
9888                lcId = getDrbLcId(&duUeCb->drbBitMap);
9889                if(lcId != RFAILED)
9890                {
9891                   if(extractDrbListToSetup(lcId, &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List,\
9892                      &duUeCb->f1UeDb->duUeCfg))
9893                   {
9894                      DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
9895                      //TODO: Update the failure cause in ue context Setup Response
9896                      ret = RFAILED;
9897                   }
9898                }
9899                else 
9900                   ret = RFAILED;
9901                break;
9902             }
9903          case ProtocolIE_ID_id_RRCContainer:
9904             {
9905                /* Filling Dl RRC Msg Info */
9906                DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
9907                if(!duUeCb->f1UeDb->dlRrcMsg)
9908                {
9909                   DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
9910                   ret = RFAILED;
9911                }
9912                else
9913                {
9914                   memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
9915                   ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
9916                      &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
9917                }          
9918                break;
9919             }
9920          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
9921             {
9922                if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
9923                {
9924                   duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
9925                }
9926                else
9927                {
9928                   DU_LOG("\nERROR  -->  Ignoring delivery report, since rrcContainer is not present");
9929                }
9930                break;
9931             }
9932          case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
9933              {
9934                /* MaximumBitRate Uplink */
9935                bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
9936                if(bitRateSize > 0)
9937                {
9938                   DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
9939                   if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
9940                   {
9941                      DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
9942                      ret = RFAILED;
9943                   }
9944                   else
9945                   {
9946                      memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg)); 
9947                      memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
9948                      ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
9949                   }
9950                }
9951                else
9952                   ret = RFAILED;
9953                break;
9954             }
9955          default:
9956             {
9957                break;
9958             }
9959       }
9960    }
9961    if(ret == RFAILED)
9962    {
9963       /*TODO : Negative case*/
9964       // BuildAndSendUeContextSetupRsp(ueIdx, cellId);
9965       DU_LOG("\nERROR  -->  F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); 
9966    }
9967    else
9968       ret = duProcUeContextSetupRequest(duUeCb);
9969    
9970    freeAperDecodeF1UeContextSetupReq(ueSetReq); 
9971    return ret;
9972
9973 }
9974
9975 /*******************************************************************
9976  * @brief Free the memory allocated for Dl Tunnel Info
9977  *
9978  * @details
9979  *
9980  *    Function : freeDlTnlInfo
9981  *
9982  *    Functionality:
9983  *       Free the memory allocated for Dl Tunnel Info
9984  *
9985  * @params[in] DLUPTNLInformation_ToBeSetup_List_t *
9986  * @return void
9987  *
9988  * ****************************************************************/
9989
9990 void freeDlTnlInfo(DLUPTNLInformation_ToBeSetup_List_t *tnlInfo)
9991 {
9992    uint8_t arrIdx = 0;
9993
9994    for(arrIdx=0; arrIdx < tnlInfo->list.count; arrIdx++)
9995    {
9996       DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
9997    }
9998 }
9999
10000 /*******************************************************************
10001  * @brief Free the memory allocated for DRB setup List
10002  *
10003  * @details
10004  *
10005  *    Function : freeDrbSetupList
10006  *
10007  *    Functionality:
10008  *       Free the memory allocated for DRB setup list
10009  *
10010  * @params[in] DRBs_Setup_List_t *
10011  * @return void
10012  *
10013  * ****************************************************************/
10014 void freeDrbSetupList(DRBs_Setup_List_t *drbSetupList)
10015 {
10016    uint8_t arrIdx = 0;
10017    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
10018
10019    for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
10020    {
10021       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
10022       freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
10023    }
10024 }
10025
10026 /*******************************************************************
10027  * @brief Free the memory allocated for UE Setup response
10028  *
10029  * @details
10030  *
10031  *    Function : FreeUeContextSetupRsp
10032  *
10033  *    Functionality:
10034  *       Free the memory allocated for UE Setup response
10035  *
10036  * @params[in] F1AP PDU for UE setup response
10037  * @return ROK     - success
10038  *         RFAILED - failure
10039  *
10040  * ****************************************************************/
10041 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
10042 {
10043    uint8_t idx;
10044    UEContextSetupResponse_t *ueSetRsp = NULLP;
10045
10046    if(f1apMsg)
10047    {
10048       if(f1apMsg->choice.successfulOutcome)
10049       {
10050          ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
10051                     UEContextSetupResponse;
10052          if(ueSetRsp->protocolIEs.list.array)
10053          {
10054             for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
10055             {
10056                if(ueSetRsp->protocolIEs.list.array[idx])
10057                {
10058                   switch(ueSetRsp->protocolIEs.list.array[idx]->id)
10059                   {
10060                      case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10061                         break;
10062                      case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10063                         break;
10064                      case ProtocolIE_ID_id_DUtoCURRCInformation:
10065                         {
10066                            CellGroupConfig_t *cellGrpCfg = NULLP;
10067                            cellGrpCfg  = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
10068                                          DUtoCURRCInformation.cellGroupConfig;
10069                            if(cellGrpCfg->buf != NULLP)
10070                            {
10071                               DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
10072                               cellGrpCfg = NULLP;
10073                            }
10074                            break;
10075                         }
10076                     case ProtocolIE_ID_id_DRBs_Setup_List:
10077                         {
10078                            freeDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List); 
10079                            break;
10080                         }
10081                      default:
10082                         DU_LOG("\nERROR  -->  DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
10083                         ueSetRsp->protocolIEs.list.array[idx]->id);
10084                         break;
10085                   }
10086                   DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
10087                         sizeof(UEContextSetupResponseIEs_t));
10088                }
10089             }
10090             DU_FREE(ueSetRsp->protocolIEs.list.array, \
10091                   ueSetRsp->protocolIEs.list.size);
10092          }
10093          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10094       }
10095       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10096    }
10097 }
10098
10099 /*******************************************************************
10100  *
10101  * @brief Builds Ue context Setup Rsp DU To CU Info
10102  *
10103  * @details
10104  *
10105  *    Function : EncodeUeCntxtDuToCuInfo
10106  *
10107  *    Functionality: Builds Ue context Setup Rsp DU To CU Info
10108  *
10109  * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t * 
10110  *
10111  * @return ROK     - success
10112  *         RFAILED - failure
10113  *
10114  ******************************************************************/
10115
10116 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
10117 {
10118    asn_enc_rval_t        encRetVal;
10119
10120    xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
10121    memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
10122    encBufSize = 0;
10123    encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
10124    /* Encode results */
10125    if(encRetVal.encoded == ENCODE_FAIL)
10126    {
10127       DU_LOG( "\nERROR  -->  F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
10128             encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10129       return RFAILED;
10130    }
10131    else
10132    {
10133       DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
10134       for(int i=0; i< encBufSize; i++)
10135       {
10136          printf("%x",encBuf[i]);
10137       }
10138    }
10139    duToCuCellGrp->size = encBufSize;
10140    DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
10141    if(!duToCuCellGrp->buf)
10142    {
10143       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
10144    }
10145    memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
10146    return ROK;
10147 }
10148
10149 /*******************************************************************
10150  *
10151  * @brief Fills Dl Gtp tunnel Info
10152  *
10153  * @details
10154  *
10155  *    Function : fillGtpTunnelforDl
10156  *
10157  *    Functionality: Fills Dl Gtp tunnel Info
10158  *
10159  * @params[in] 
10160  *
10161  * @return ROK     - success
10162  *         RFAILED - failure
10163  *
10164  * ****************************************************************/
10165
10166 uint8_t fillGtpTunnelforDl(GTPTunnel_t *gtpDl, GtpTnlCfg *gtpUeCfg)
10167 {
10168    uint8_t bufSize = 0;
10169
10170    gtpDl->transportLayerAddress.size    = 4*sizeof(uint8_t);
10171    DU_ALLOC(gtpDl->transportLayerAddress.buf, gtpDl->transportLayerAddress.size);
10172    if(gtpDl->transportLayerAddress.buf == NULLP)
10173    {
10174       return RFAILED;
10175    }
10176    memcpy(gtpDl->transportLayerAddress.buf, &gtpUeCfg->dlTnlAddress, gtpDl->transportLayerAddress.size);
10177
10178    /*GTP TEID*/
10179    gtpDl->gTP_TEID.size = 4 * sizeof(uint8_t);
10180    DU_ALLOC(gtpDl->gTP_TEID.buf, gtpDl->gTP_TEID.size);
10181    if(gtpDl->gTP_TEID.buf == NULLP)
10182    {
10183       return RFAILED;
10184    }
10185    bufSize = 3; /*forming an Octect String*/
10186    fillTeIdString(bufSize, gtpUeCfg->teId, gtpDl->gTP_TEID.buf);
10187
10188    return ROK;
10189 }
10190
10191 /*******************************************************************
10192  *
10193  * @brief Fills DL Tunnel Setup List
10194  *
10195  * @details
10196  *
10197  *    Function : fillDlTnlSetupList
10198  *
10199  *    Functionality: Fills the DL Tunnel Setup List
10200  *
10201  * @params[in] 
10202  *
10203  * @return ROK     - success
10204  *         RFAILED - failure
10205  *
10206  * ****************************************************************/
10207
10208 uint8_t fillDlTnlSetupList(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo, UpTnlCfg *tnlCfg)
10209 {
10210    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10211
10212    eleCount = 1;
10213    dlTnlInfo->list.count = eleCount; 
10214    dlTnlInfo->list.size = (eleCount * sizeof(DLUPTNLInformation_ToBeSetup_Item_t *));
10215
10216    /* Initialize the DL Tnl Setup List Members */
10217    DU_ALLOC(dlTnlInfo->list.array, dlTnlInfo->list.size);
10218    if(dlTnlInfo->list.array == NULLP)
10219    {
10220       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL Tnl Setup List in fillDlTnlSetupList()");
10221       ret = RFAILED;
10222    }
10223    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10224    {
10225       DU_ALLOC(dlTnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
10226       if(dlTnlInfo->list.array[arrIdx] == NULLP)
10227       {
10228          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDlTnlSetupList()", arrIdx);
10229          return RFAILED;
10230       }
10231       dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
10232       DU_ALLOC(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
10233       if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel == NULLP)
10234       {
10235          DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL tunnel info in fillDlTnlSetupList()");
10236          return RFAILED;
10237       }
10238       ret = fillGtpTunnelforDl(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel,\
10239                tnlCfg->tnlCfg1);
10240       if(ret != ROK)
10241          break;
10242    }
10243    return ret;
10244 }
10245
10246 /*******************************************************************
10247  *
10248  * @brief Fills the Drb Setup List for Ue Context Setup Response
10249  *
10250  * @details
10251  *
10252  *    Function : fillDrbSetupList
10253  *
10254  *    Functionality: Fills the Drb Setup List for Ue Context Setup Response
10255  *
10256  * @params[in] 
10257  *
10258  * @return ROK     - success
10259  *         RFAILED - failure
10260  *
10261  * ****************************************************************/
10262 uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg)
10263 {
10264    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10265    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
10266
10267    eleCount = ueCfg->numDrb;
10268    drbSetupList->list.count = eleCount;
10269    drbSetupList->list.size = \
10270         (eleCount * sizeof(DRBs_Setup_Item_t *));
10271
10272    /* Initialize the Drb Setup List Members */
10273    DU_ALLOC(drbSetupList->list.array, drbSetupList->list.size);
10274    if(drbSetupList->list.array == NULLP)
10275    {
10276       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DRB Setup List in fillDrbSetupList()");
10277       ret = RFAILED;
10278    }
10279
10280    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10281    {
10282       DU_ALLOC(drbSetupList->list.array[arrIdx], sizeof(DRBs_Setup_Item_t));
10283       if(drbSetupList->list.array[arrIdx] == NULLP)
10284       {
10285          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDrbSetupList()", arrIdx);
10286          return RFAILED;
10287       }
10288       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
10289       drbItemIe->id = ProtocolIE_ID_id_DRBs_Setup_Item;
10290       drbItemIe->criticality = Criticality_reject;
10291       drbItemIe->value.present = DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
10292       drbItemIe->value.choice.DRBs_Setup_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
10293       ret = fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List,\
10294           &ueCfg->upTnlInfo[arrIdx]);
10295       if(ret != ROK)
10296          break;
10297    }
10298    return ret;
10299 }
10300
10301 /*******************************************************************
10302  *
10303  * @brief Builds and sends the UE Setup Response
10304  *
10305  * @details
10306  *
10307  *    Function : BuildAndSendUeContextSetupRsp
10308  *
10309  *    Functionality: Constructs the UE Setup Response and sends
10310  *                   it to the DU through SCTP.
10311  *
10312  * @params[in] 
10313  *
10314  * @return ROK     - success
10315  *         RFAILED - failure
10316  *
10317  * ****************************************************************/
10318 uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId)
10319 {
10320    uint8_t   idx, ret, cellIdx, elementCnt;
10321    uint32_t  gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
10322    uint32_t  gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
10323    asn_enc_rval_t  encRetVal;        /* Encoder return value */
10324    F1AP_PDU_t               *f1apMsg = NULLP;
10325    UEContextSetupResponse_t *ueSetRsp = NULLP;
10326    CellGroupConfigRrc_t     *cellGrpCfg = NULLP;
10327    DuUeCb                   *ueCb = NULLP;
10328
10329    DU_LOG("\n INFO   -->  F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
10330
10331    while(true)
10332    {
10333       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10334       if(f1apMsg == NULLP)
10335       {
10336          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10337          ret = RFAILED;
10338          break;
10339       }
10340
10341       f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
10342       DU_ALLOC(f1apMsg->choice.successfulOutcome,
10343             sizeof(SuccessfulOutcome_t));
10344       if(f1apMsg->choice.successfulOutcome == NULLP)
10345       {
10346          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
10347          ret = RFAILED;
10348          break;
10349       }
10350
10351       f1apMsg->choice.successfulOutcome->procedureCode = \
10352                                                          ProcedureCode_id_UEContextSetup;
10353       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
10354       f1apMsg->choice.successfulOutcome->value.present = \
10355                                                          SuccessfulOutcome__value_PR_UEContextSetupResponse;
10356
10357       ueSetRsp =
10358          &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
10359       elementCnt = 4;
10360       ueSetRsp->protocolIEs.list.count = elementCnt;
10361       ueSetRsp->protocolIEs.list.size = \
10362                                         elementCnt * sizeof(UEContextSetupResponse_t *);
10363
10364       /* Initialize the UESetup members */
10365       DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
10366             ueSetRsp->protocolIEs.list.size);
10367       if(ueSetRsp->protocolIEs.list.array == NULLP)
10368       {
10369          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10370          ret = RFAILED;
10371          break;
10372       }
10373
10374       for(idx=0; idx<elementCnt; idx++)
10375       {
10376          DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
10377                sizeof(UEContextSetupResponseIEs_t));
10378          if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
10379          {
10380             DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10381             ret = RFAILED;
10382             break;
10383          }
10384       }
10385       /* Fetching Ue Cb Info*/
10386       GET_CELL_IDX(cellId, cellIdx);
10387       gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
10388       gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
10389       ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
10390
10391       idx = 0;
10392       /*GNB CU UE F1AP ID*/
10393       ueSetRsp->protocolIEs.list.array[idx]->id = \
10394                                                   ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10395       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10396       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10397                                                              UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
10398       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
10399
10400       /*GNB DU UE F1AP ID*/
10401       idx++;
10402       ueSetRsp->protocolIEs.list.array[idx]->id = \
10403                                                   ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10404       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10405       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10406                                                              UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
10407       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
10408
10409
10410       /*DUtoCURRC Information */
10411       idx++;
10412       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10413                                                    ProtocolIE_ID_id_DUtoCURRCInformation;
10414       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10415       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10416                                                             UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
10417       if(ueCb->f1UeDb)
10418       {
10419          if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
10420          {
10421             cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
10422             ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
10423                      choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
10424             if(ret == RFAILED)
10425             {
10426                DU_LOG("\nERROR  -->  F1AP : Failed to EncodeUeCntxtDuToCuInfo in BuildAndSendUeContextSetupRsp()");
10427                freeF1UeDb(ueCb->f1UeDb);
10428                ueCb->f1UeDb = NULLP;
10429                break;
10430             }
10431          }
10432       }
10433       else
10434       {
10435          DU_LOG("\nERROR  -->  F1AP : Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
10436          ret = RFAILED;
10437          break;
10438       }
10439
10440       /* Drb Setup List */
10441       idx++;
10442       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10443                                  ProtocolIE_ID_id_DRBs_Setup_List;
10444       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10445       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10446                                  UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
10447       ret = fillDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List,\
10448                &ueCb->f1UeDb->duUeCfg);
10449       if(ret == RFAILED)
10450       {
10451          DU_LOG("\nERROR  -->  F1AP : Failed to fillDrbSetupList in BuildAndSendUeContextSetupRsp()");
10452          freeF1UeDb(ueCb->f1UeDb);
10453          ueCb->f1UeDb = NULLP;
10454          break;
10455       }
10456
10457        /* Free UeContext Db created during Ue context Req */
10458        freeF1UeDb(ueCb->f1UeDb);
10459        ueCb->f1UeDb = NULLP;
10460
10461       /* TODO: To send Drb list */
10462       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10463
10464       /* Encode the UE context setup response type as APER */
10465       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
10466       encBufSize = 0;
10467       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10468             encBuf);
10469       /* Encode results */
10470       if(encRetVal.encoded == ENCODE_FAIL)
10471       {
10472          DU_LOG( "\nERROR  -->  F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\
10473                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10474          ret = RFAILED;
10475          break;
10476       }
10477       else
10478       {
10479          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UE Context Setup Response\n");
10480          for(int i=0; i< encBufSize; i++)
10481          {
10482             printf("%x",encBuf[i]);
10483          }
10484       }
10485
10486       /* Sending  msg  */
10487       if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
10488       {
10489          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Setup Response failed");
10490          ret = RFAILED;
10491          break;
10492       }
10493       break;
10494    }
10495    FreeUeContextSetupRsp(f1apMsg);
10496    return ret;
10497 }/* End of BuildAndSendUeContextSetupRsp */
10498 /*******************************************************************
10499 *
10500 * @brief  Build And Send Ue Context Rsp 
10501 *
10502 * @details
10503 *
10504 *    Function : BuildAndSendUeCtxtRsp 
10505 *
10506 *    Functionality : Build And Send Ue Context Rsp
10507
10508 * @params[in]
10509 * @return sucess = ROK
10510 *         failure = RFAILED
10511 *
10512 * ****************************************************************/
10513 uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId)
10514 {
10515    uint8_t cellIdx = 0, actionType = 0; 
10516
10517    GET_CELL_IDX(cellId, cellIdx);
10518    actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
10519
10520    switch(actionType)
10521    {
10522       case UE_CTXT_SETUP:
10523          BuildAndSendUeContextSetupRsp(ueIdx, cellId);
10524          break;
10525       case UE_CTXT_MOD:
10526          //TODO: Build Ue context Modification Rsp
10527          break;
10528       default:
10529          DU_LOG("ERROR  -->  F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
10530          break;
10531
10532    }
10533    return ROK;
10534 }
10535
10536 /*******************************************************************
10537  *
10538  * @brief deallocating the memory of  F1reset msg
10539  *
10540  * @details
10541  *
10542  *    Function : FreeF1ResetReq
10543  *
10544  *    Functionality :
10545  *         - freeing memory of F1reset request msg
10546  *
10547  * @params[in]
10548  * @return void
10549  *
10550  *
10551  * ****************************************************************/
10552 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
10553 {
10554    uint8_t idx =0 ;
10555    Reset_t *f1ResetMsg;
10556
10557    if(f1apMsg)
10558    {
10559       if(f1apMsg->choice.initiatingMessage)
10560       {
10561          f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10562
10563          if(f1ResetMsg->protocolIEs.list.array)
10564          {
10565             for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
10566             {
10567                if(f1ResetMsg->protocolIEs.list.array[idx])
10568                {
10569                   DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
10570                }
10571             }
10572             DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
10573          }
10574          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10575       }
10576       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10577    }
10578 }
10579 /*******************************************************************
10580  *
10581  * @brief Build and Send F1reset request 
10582  *
10583  * @details
10584  *
10585  *    Function : BuildAndSendF1ResetReq
10586  *
10587  *    Functionality:
10588  *         - Build and Send F1reset request msg
10589  *
10590  * @params[in]
10591  * @return ROK     - success
10592  *         RFAILED - failure
10593  *
10594  * ****************************************************************/
10595 uint8_t BuildAndSendF1ResetReq()
10596 {
10597    uint8_t          elementCnt=0;
10598    uint8_t          idx=0;
10599    uint8_t          ret= RFAILED;
10600    Reset_t          *f1ResetMsg = NULLP;
10601    F1AP_PDU_t       *f1apMsg = NULLP;
10602    asn_enc_rval_t   encRetVal;
10603    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset request \n");
10604    do
10605    {
10606       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10607       if(f1apMsg == NULLP)
10608       {
10609          break;
10610       }
10611       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10612       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10613       if(f1apMsg->choice.initiatingMessage == NULLP)
10614       {
10615          break;
10616       }
10617       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
10618       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10619       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
10620
10621       f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10622
10623       elementCnt = 3;
10624       f1ResetMsg->protocolIEs.list.count = elementCnt;
10625       f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
10626
10627       /* Initialize the F1Setup members */
10628       DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
10629       if(f1ResetMsg->protocolIEs.list.array == NULLP)
10630       {
10631          break;
10632       }
10633       for(idx=0; idx<elementCnt; idx++)
10634       {
10635          DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
10636          if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
10637          {
10638             break;
10639          }
10640       }
10641
10642       /*TransactionID*/
10643       idx=0;
10644       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10645       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10646       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
10647       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
10648
10649       /*Cause*/
10650       idx++;
10651       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
10652       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
10653       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
10654       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10655       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
10656
10657       /*Reset Type*/
10658       idx++;
10659       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
10660       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10661       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
10662       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
10663       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
10664
10665       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10666
10667       /* Encode the F1SetupRequest type as APER */
10668       memset(encBuf, 0, ENC_BUF_MAX_LEN);
10669       encBufSize = 0;
10670       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10671             encBuf);
10672
10673       /* Encode results */
10674       if(encRetVal.encoded == ENCODE_FAIL)
10675       {
10676          DU_LOG("\nERROR  -->  F1AP : Could not encode F1Reset structure (at %s)\n",\
10677                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10678          break;
10679       }
10680       else
10681       {
10682          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1Reset\n");
10683          for(idx=0; idx< encBufSize; idx++)
10684          {
10685             printf("%x",encBuf[idx]);
10686          }
10687       }
10688
10689       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
10690       {
10691          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset request failed");
10692          break;
10693       }
10694
10695       ret = ROK;
10696       break;
10697    }while(true);
10698
10699    FreeF1ResetReq(f1apMsg);
10700    return ret;
10701 }
10702 /*******************************************************************
10703  *
10704  * @brief Build And Send F1ResetAck
10705  *
10706  * @details
10707  *
10708  *    Function : BuildAndSendF1ResetAck
10709  *
10710  *    Functionality:
10711  *         - Build And Send  F1ResetRSP
10712  *
10713  * @return ROK     - success
10714  *         RFAILED - failure
10715  *
10716  * ****************************************************************/
10717 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
10718 {
10719    uint8_t idx;
10720    ResetAcknowledge_t *f1ResetAck;
10721
10722    if(f1apMsg)
10723    {
10724       if(f1apMsg->choice.successfulOutcome)
10725       {
10726          f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10727
10728          if(f1ResetAck->protocolIEs.list.array)
10729          {
10730             for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
10731             {
10732                if(f1ResetAck->protocolIEs.list.array[idx])
10733                {
10734                   DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10735                }
10736             }
10737             DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10738          }
10739          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10740       }
10741       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10742    }
10743 }
10744
10745 /*******************************************************************
10746  *
10747  * @brief Build And Send F1ResetAck
10748  *
10749  * @details
10750  *
10751  *    Function : BuildAndSendF1ResetAck
10752  *
10753  *    Functionality:
10754  *         - Build And Send  F1ResetRSP
10755  *
10756  *  @params[in]
10757  * @return ROK     - success
10758  *         RFAILED - failure
10759  *
10760  * ****************************************************************/
10761 uint8_t BuildAndSendF1ResetAck()
10762 {
10763    uint8_t                idx = 0;
10764    uint8_t                elementCnt = 0;
10765    uint8_t                ret = RFAILED;
10766    F1AP_PDU_t             *f1apMsg = NULL;
10767    ResetAcknowledge_t     *f1ResetAck = NULLP;
10768    asn_enc_rval_t         encRetVal;
10769    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset Acknowledgment \n");
10770
10771    do{
10772       /* Allocate the memory for F1ResetRequest_t */
10773       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10774       if(f1apMsg == NULLP)
10775       {
10776          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10777          break;
10778       }
10779
10780       f1apMsg->present =  F1AP_PDU_PR_successfulOutcome;
10781
10782       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10783       if(f1apMsg->choice.successfulOutcome == NULLP)
10784       {
10785          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10786          break;
10787       }
10788       f1apMsg->choice.successfulOutcome->criticality   = Criticality_reject;
10789       f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
10790       f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10791
10792       elementCnt = 1;
10793
10794       f1ResetAck->protocolIEs.list.count = elementCnt;
10795       f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
10796
10797       DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10798       if(f1ResetAck->protocolIEs.list.array == NULLP)
10799       {
10800          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1ResetAckIEs failed");
10801          break;
10802       }
10803
10804       for(idx=0; idx<elementCnt; idx++)
10805       {
10806          DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10807          if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
10808          {
10809             break;
10810          }
10811       }
10812       /*TransactionID*/
10813       idx = 0;
10814       f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10815       f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10816       f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
10817       f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
10818
10819       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10820
10821       /* Encode the F1SetupRequest type as UPER */
10822       memset(encBuf, 0, ENC_BUF_MAX_LEN);
10823       encBufSize = 0;
10824       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10825
10826       /* Check encode results */
10827       if(encRetVal.encoded == ENCODE_FAIL)
10828       {
10829          DU_LOG("\nERROR  -->  F1AP : Could not encode F1ResetAck structure (at %s)\n",\
10830                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10831          break;
10832       }
10833       else
10834       {
10835          DU_LOG("\nDUBUG   -->  F1AP : Created APER encoded buffer for F1ResetAck\n");
10836          for(int i=0; i< encBufSize; i++)
10837          {
10838             printf("%x",encBuf[i]);
10839          }
10840       }
10841       /* Sending msg */
10842       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
10843       {
10844          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset Acknowledgement failed");
10845          break;
10846       }
10847
10848       ret = ROK;
10849       break;
10850    }while(true);
10851
10852    FreeF1ResetAck(f1apMsg);
10853    return ret;
10854 }
10855 /******************************************************************
10856 *
10857 * @brief free F1 reset msg allocated by aper_decoder 
10858 *
10859 * @details
10860 *
10861 *    Function : freeAperDecodeF1ResetMsg 
10862 *
10863 *    Functionality: free F1 reset msg allocated by aper_decoder 
10864 *
10865 * @params[in] Reset_t *f1ResetMsg 
10866 * @return void 
10867 *
10868 * ****************************************************************/
10869
10870 void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
10871 {
10872    uint8_t ieIdx =0;
10873    if(f1ResetMsg->protocolIEs.list.array)
10874    {
10875       for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
10876       {
10877          if(f1ResetMsg->protocolIEs.list.array[ieIdx])
10878          {
10879             free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
10880          }
10881       }
10882       free(f1ResetMsg->protocolIEs.list.array);
10883    }
10884 }
10885
10886 /******************************************************************
10887  *
10888  * @brief Processes DL RRC Message Transfer  sent by CU
10889  *
10890  * @details
10891  *
10892  *    Function : procF1ResetReq
10893  *
10894  *    Functionality: Processes DL RRC Message Transfer sent by CU
10895  *
10896  * @params[in] F1AP_PDU_t ASN decoded F1AP message
10897  * @return ROK     - success
10898  *         RFAILED - failure
10899  *
10900  * ****************************************************************/
10901 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
10902 {
10903    /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
10904    uint8_t       ieIdx = 0;
10905    uint8_t        ret = ROK;
10906    Reset_t       *f1ResetMsg = NULLP;
10907
10908    DU_LOG("\nINFO   -->  Processing F1 reset request");
10909    f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10910
10911    for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
10912    {
10913       switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
10914       {
10915          case ProtocolIE_ID_id_TransactionID:
10916             break;
10917
10918          case ProtocolIE_ID_id_Cause:
10919             break;
10920
10921          case ProtocolIE_ID_id_ResetType:
10922             {
10923                break;
10924             }
10925
10926          default:
10927             break;
10928       }
10929    }
10930    ret = BuildAndSendF1ResetAck();
10931    DU_LOG("\nINFO   -->  UE release is not supported for now");
10932
10933    freeAperDecodeF1ResetMsg(f1ResetMsg);
10934
10935    return ret;
10936 }
10937
10938 /*******************************************************************
10939  *
10940  * @brief free the RRC delivery report
10941  *
10942  * @details
10943  *
10944  *    Function : freeRrcDeliveryReport
10945  *
10946  *    Functionality: free the RRC delivery report
10947  *
10948  * @params[in]
10949  * @return ROK     - success
10950  *         RFAILED - failure
10951  *
10952  * ****************************************************************/
10953 void freeRrcDeliveryReport(F1AP_PDU_t  *f1apMsg )
10954 {
10955    uint8_t idx=0;
10956    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
10957
10958    if(f1apMsg)
10959    {
10960       if(f1apMsg->choice.initiatingMessage)
10961       {
10962          rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
10963          if(rrcDeliveryReport->protocolIEs.list.array)
10964          {
10965             for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
10966                   idx++)
10967             {
10968                if(rrcDeliveryReport->protocolIEs.list.array[idx])
10969                {
10970                   DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
10971                         sizeof(RRCDeliveryReportIEs_t));
10972                }   
10973             }
10974             DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
10975                   rrcDeliveryReport->protocolIEs.list.size);
10976          }
10977          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
10978       }
10979       DU_FREE(f1apMsg,
10980             sizeof(F1AP_PDU_t));
10981    }
10982 }
10983
10984 /*******************************************************************
10985 *
10986 * @brief Builds and sends the RRC delivery report
10987 *
10988 * @details
10989 *
10990 *    Function : BuildAndSendRrcDeliveryReport
10991 *
10992 *    Functionality: Builds and sends the RRC delivery report
10993 *
10994 * @params[in]
10995 *
10996 * @return ROK     - success
10997 *         RFAILED - failure
10998 *
10999 * ****************************************************************/
11000 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
11001    uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
11002 {
11003    uint8_t             ret = RFAILED;
11004    uint8_t             idx    = 0;
11005    uint8_t             idx1   = 0;
11006    uint8_t             elementCnt = 0;
11007    F1AP_PDU_t          *f1apMsg = NULLP;
11008    asn_enc_rval_t      encRetVal;  
11009    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
11010
11011    do{
11012
11013       DU_LOG("\nINFO   -->  F1AP : Building RRC delivery Message Transfer Message\n");
11014       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11015       if(f1apMsg == NULLP)
11016       {
11017          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
11018          break;
11019       }
11020       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11021       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
11022       if(f1apMsg->choice.initiatingMessage == NULLP)
11023       {
11024          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU  failed");
11025          break;
11026       }
11027       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
11028       f1apMsg->choice.initiatingMessage->criticality   = Criticality_ignore;
11029       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
11030
11031       rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
11032       elementCnt = 4;
11033       rrcDeliveryReport->protocolIEs.list.count = elementCnt;
11034       rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
11035
11036       /* Initialize the F1Setup members */
11037       DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
11038       if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
11039       {
11040          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRC Delivery  failed");
11041          break;
11042       }
11043       for(idx =0 ;idx <elementCnt; idx++)
11044       {
11045          DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
11046          if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
11047          {
11048             break;
11049          }
11050       }
11051
11052       idx1 = 0;
11053
11054       /*GNB CU UE F1AP ID*/
11055       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11056       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11057       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
11058       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
11059
11060       /*GNB DU UE F1AP ID*/
11061       idx1++;
11062       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11063       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11064       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
11065       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
11066
11067       /*RRC delivery status*/
11068       idx1++;
11069       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
11070       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11071       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
11072       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
11073       rrcDelivery->rrcDeliveryStatus.deliveryStatus;
11074       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
11075       rrcDelivery->rrcDeliveryStatus.triggeringMessage;
11076
11077       /* SRB ID */ 
11078       idx1++;
11079       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
11080       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11081       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
11082       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID =  rrcDelivery->srbId;
11083
11084       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11085
11086       /* Encode the RRC DELIVERY REPORT type as APER */
11087       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11088       encBufSize = 0;
11089       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11090             encBuf);
11091
11092       /* Encode results */
11093       if(encRetVal.encoded == ENCODE_FAIL)
11094       {
11095          DU_LOG("\nERROR  -->  F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
11096                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11097          break;
11098       }
11099       else
11100       {
11101          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
11102          for(idx=0; idx< encBufSize; idx++)
11103          {
11104             printf("%x",encBuf[idx]);
11105          }
11106       }
11107
11108       /* Sending msg */
11109       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
11110       {
11111          DU_LOG("\nERROR  -->  F1AP : Sending RRC delivery  msg request failed");
11112          break;
11113       }
11114       ret = ROK;
11115       break;
11116
11117    }while(true);
11118
11119    freeRrcDeliveryReport(f1apMsg);
11120    return ret;
11121 }
11122
11123 /*******************************************************************
11124  *
11125  * @brief Processes cells to be activated
11126  *
11127  * @details
11128  *
11129  *    Function : extractCellsToBeActivated
11130  *
11131  *    Functionality:
11132  *      - Processes cells to be activated list received in F1SetupRsp
11133  *
11134  * @params[in] void
11135  * @return ROK     - success
11136  *         RFAILED - failure
11137  *
11138  * ****************************************************************/
11139
11140 uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
11141 {
11142    uint8_t  ret = ROK;
11143    uint16_t idx, nci, pci = 0;
11144    Cells_to_be_Activated_List_Item_t cell;
11145
11146    for(idx=0; idx<cellsToActivate.list.count; idx++)
11147    {
11148       nci = 0;
11149       cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
11150       bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
11151
11152       if(cell.nRPCI)
11153       {
11154          pci = *cell.nRPCI;
11155       }
11156       ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
11157    }
11158    return ret;
11159 }
11160 /******************************************************************
11161 *
11162 * @brief Processes F1 Setup Response allocated by aper_decoder 
11163 *
11164 * @details
11165 *
11166 *    Function : freeF1SetupRsp 
11167 *
11168 *    Functionality: free F1 Setup Response allocated by aper_decoder 
11169 *
11170 * @params[in] F1SetupResponse_t *f1SetRspMsg 
11171 * @return void 
11172 *
11173 * ****************************************************************/
11174
11175 void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
11176 {
11177    uint8_t ieIdx =0;
11178    uint8_t arrIdx =0;
11179    Cells_to_be_Activated_List_t *cellToActivate =NULLP;
11180    RRC_Version_t      *rrcVer =NULLP;
11181
11182    if(f1SetRspMsg->protocolIEs.list.array)
11183    {
11184       for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
11185       {
11186          if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
11187          {
11188             switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
11189             {
11190                case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11191                   {
11192                      cellToActivate =
11193                         &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
11194                      if(cellToActivate->list.array)
11195                      {
11196                         for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
11197                         {
11198                            if(cellToActivate->list.array[arrIdx])
11199                            {
11200
11201                               if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
11202                               pLMN_Identity.buf)
11203                               {
11204                                  if(cellToActivate->list.array[0]->value.choice.\
11205                                        Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
11206                                  {
11207                                     free(cellToActivate->list.array[0]->value.choice.\
11208                                           Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
11209                                  }
11210
11211                                  free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
11212                                        nRCGI.pLMN_Identity.buf);
11213                               }
11214                               free(cellToActivate->list.array[arrIdx]);
11215                            }
11216                         }
11217                         free(cellToActivate->list.array);
11218                      }
11219                      break;
11220                   }
11221                case ProtocolIE_ID_id_TransactionID:
11222                   {
11223                      break;
11224                   }
11225                case ProtocolIE_ID_id_gNB_CU_Name:
11226                   {
11227                      free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
11228                      break;
11229                   }
11230                case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11231                   {
11232                      rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
11233                      if(rrcVer->latest_RRC_Version.buf)
11234                      {
11235                         if(rrcVer->iE_Extensions)
11236                         {
11237                            if(rrcVer->iE_Extensions->list.array)
11238                            {
11239                               if(rrcVer->iE_Extensions->list.array[0])
11240                               {
11241                                  if(rrcVer->iE_Extensions->list.\
11242                                        array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
11243                                  {
11244                                     free(rrcVer->iE_Extensions->list.\
11245                                           array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
11246                                  }
11247                                  free(rrcVer->iE_Extensions->list.array[0]);
11248                               }
11249                               free(rrcVer->iE_Extensions->list.array);
11250                            }
11251                            free(rrcVer->iE_Extensions);
11252                         }
11253                         free(rrcVer->latest_RRC_Version.buf);
11254                      }
11255                      break;
11256
11257                   }
11258                default:
11259                   {
11260                      DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11261                            f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
11262                   }
11263             }
11264             free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
11265          }
11266       }
11267       free(f1SetRspMsg->protocolIEs.list.array);
11268    }
11269 }
11270 /******************************************************************
11271  *
11272  * @brief Processes F1 Setup Response sent by CU
11273  *
11274  * @details
11275  *
11276  *    Function : procF1SetupRsp
11277  *
11278  *    Functionality: Processes F1 Setup Response sent by CU
11279  *
11280  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11281  * @return ROK     - success
11282  *         RFAILED - failure
11283  *
11284  * ****************************************************************/
11285 uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
11286 {
11287    uint8_t ret = ROK;
11288    uint16_t idx =0;
11289    F1SetupResponse_t *f1SetRspMsg = NULLP;
11290    GNB_CU_Name_t     *cuName = NULLP;
11291    F1SetupRsp  f1SetRspDb;
11292    RRC_Version_t      *rrcVer =NULLP;
11293    
11294    memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
11295
11296    DU_LOG("\nINFO   -->  F1AP : F1 Setup Response received");
11297    f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
11298
11299    for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
11300    {
11301       switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
11302       {
11303          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11304             {
11305                extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
11306                      value.choice.Cells_to_be_Activated_List);
11307                break;
11308             }
11309          case ProtocolIE_ID_id_TransactionID:
11310             {
11311                f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
11312                                     value.choice.TransactionID;
11313                break;
11314             }
11315          case ProtocolIE_ID_id_gNB_CU_Name:
11316             {
11317                cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
11318                         value.choice.GNB_CU_Name;
11319                strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
11320                break;
11321             }
11322          case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11323             {
11324                rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
11325                strcpy(f1SetRspDb.rrcVersion.rrcVer,
11326                      (const char*)rrcVer->latest_RRC_Version.buf);
11327                break;
11328             }
11329          default:
11330             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11331                   f1SetRspMsg->protocolIEs.list.array[idx]->id);
11332       }
11333       duProcF1SetupRsp();
11334    }
11335    
11336    freeAperDecodeF1SetupRsp(f1SetRspMsg);
11337    return ret;
11338 }
11339 /*******************************************************************
11340 *
11341 * @brief free GNB DU config update ack
11342 *
11343 * @details
11344 *
11345 *    Function : freeAperDecodeGnbDuAck 
11346 *
11347 *    Functionality: Processes GNB DU config update ack And
11348 *                     added free part for the memory allocated by aper_decoder
11349 *
11350 * @params[in] F1AP_PDU_t ASN decoded F1AP message
11351 * @return ROK     - success
11352 *         RFAILED - failure
11353 *
11354 * ****************************************************************/
11355
11356 void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
11357 {
11358    uint8_t ieIdx = 0;
11359
11360    if(gnbDuAck->protocolIEs.list.array)
11361    {
11362       for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
11363       {
11364          if(gnbDuAck->protocolIEs.list.array[ieIdx])
11365          {
11366             free(gnbDuAck->protocolIEs.list.array[ieIdx]);
11367          }
11368       }
11369       free(gnbDuAck->protocolIEs.list.array);
11370    }
11371 }
11372 /*******************************************************************
11373 *
11374 * @brief Processes GNB DU config update ack
11375 *
11376 * @details
11377 *
11378 *    Function : procF1GNBDUCfgUpdAck
11379 *
11380 *    Functionality: added free part for the memory allocated by aper_decoder
11381 *
11382 * @params[in] F1AP_PDU_t *f1apMsg 
11383 * @return void 
11384 *
11385 * ****************************************************************/
11386 uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
11387 {
11388    uint8_t ieIdx;
11389    GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
11390    
11391    DU_LOG("\nINFO   -->  F1AP : GNB-DU config update acknowledgment");
11392    gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
11393    
11394    for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
11395    {
11396       switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
11397       {
11398          case ProtocolIE_ID_id_TransactionID:
11399             break;
11400          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11401             break;
11402          default :
11403             DU_LOG("\nERROR  -->  F1AP: Invalid IE Received: %ld, at procF1GNBDUCfgUpdAck()", \
11404             gnbDuAck->protocolIEs.list.array[ieIdx]->id);
11405             break;
11406       }
11407    }
11408    duProcGnbDuCfgUpdAckMsg();
11409 #if 0
11410    if(BuildAndSendF1ResetReq() != ROK)
11411    {
11412       return RFAILED;
11413    }
11414 #endif
11415
11416    freeAperDecodeGnbDuAck(gnbDuAck);
11417    return ROK;
11418 }
11419 /******************************************************************
11420 *
11421 * @brief free DL RRC Message Transfer allocated by aper_decoder 
11422 *
11423 * @details
11424 *
11425 *    Function : freeAperDecodef1DlRrcMsg 
11426 *
11427 *    Functionality: free DL RRC Message Transfer allocated by aper_decoder 
11428 *
11429 * @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg 
11430 * @return ROK     - success
11431 *         RFAILED - failure
11432 *
11433 * ****************************************************************/
11434
11435 void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
11436 {
11437    uint8_t ieIdx =0;
11438    RRCContainer_t *rrcContainer = NULLP;
11439
11440    if(f1DlRrcMsg->protocolIEs.list.array)
11441    {
11442       for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
11443       {
11444          if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
11445          {
11446             switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
11447             {
11448                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11449                   break;
11450                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11451                   break;
11452                case ProtocolIE_ID_id_SRBID:
11453                   break;
11454                case ProtocolIE_ID_id_RRCContainer:
11455                   {
11456                      rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
11457                      free(rrcContainer->buf);
11458                   }
11459                case ProtocolIE_ID_id_ExecuteDuplication:
11460                   break;
11461                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
11462                   break;
11463                   break;
11464             }
11465             free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
11466          }
11467       }
11468       free(f1DlRrcMsg->protocolIEs.list.array);
11469    }
11470 }
11471 /******************************************************************
11472  *
11473  * @brief Processes DL RRC Message Transfer  sent by CU
11474  *
11475  * @details
11476  *
11477  *    Function : procF1DlRrcMsgTrans
11478  *
11479  *    Functionality: Processes DL RRC Message Transfer sent by CU
11480  *
11481  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11482  * @return ROK     - success
11483  *         RFAILED - failure
11484  *
11485  * ****************************************************************/
11486 uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
11487 {
11488    uint8_t  idx, ret;
11489    DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
11490    F1DlRrcMsg dlMsg;
11491    memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
11492
11493    DU_LOG("\nINFO   -->  DU_APP : DL RRC message transfer Recevied");
11494    f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
11495
11496    ret = ROK;
11497
11498    for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
11499    {
11500       switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
11501       {
11502          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11503             {
11504                dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11505                break;
11506             }
11507          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11508             {
11509                dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11510                break;
11511             }
11512          case ProtocolIE_ID_id_SRBID:
11513             {
11514                dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
11515                break;
11516             }
11517          case ProtocolIE_ID_id_ExecuteDuplication:
11518             dlMsg.execDup = true;
11519             break;
11520
11521          case ProtocolIE_ID_id_RRCContainer:
11522             {
11523                if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
11524                {
11525                   dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
11526                   DU_ALLOC(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
11527                   if(dlMsg.rrcMsgPdu)
11528                   {
11529                      memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
11530                         dlMsg.rrcMsgSize);
11531                   }
11532                   else
11533                   {
11534                      DU_LOG("\nERROR  -->  DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
11535                      return RFAILED;
11536                   }
11537                }
11538                else
11539                {
11540                   DU_LOG("\nERROR  -->  DU_APP : RRC Container Size is invalid:%ld",\
11541                   f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
11542                   return RFAILED;
11543                }
11544                break;
11545             }
11546          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
11547             {
11548                dlMsg.deliveryStatRpt = true;
11549                break;
11550             }
11551          default:
11552             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
11553                   f1DlRrcMsg->protocolIEs.list.array[idx]->id);
11554       }
11555    }
11556
11557    ret = duProcDlRrcMsg(&dlMsg);
11558
11559    freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
11560    return ret;
11561 }
11562
11563 /*****************************************************************i
11564  *
11565  * @brief Handles received F1AP message and sends back response  
11566  *
11567  * @details
11568  *
11569  *    Function : F1APMsgHdlr
11570  *
11571  *    Functionality:
11572  *         - Decodes received F1AP control message
11573  *         - Prepares response message, encodes and sends to SCTP
11574  *
11575  * @params[in] 
11576  * @return ROK     - success
11577  *         RFAILED - failure
11578  *
11579  * ****************************************************************/
11580 void F1APMsgHdlr(Buffer *mBuf)
11581 {
11582    int i =0;
11583    char *recvBuf =NULLP;
11584    MsgLen copyCnt =0;
11585    MsgLen recvBufLen =0;
11586    F1AP_PDU_t *f1apMsg =NULLP;
11587    asn_dec_rval_t rval; /* Decoder return value */
11588    F1AP_PDU_t f1apasnmsg ;
11589    DU_LOG("\nINFO  -->  F1AP : Received F1AP message buffer");
11590    ODU_PRINT_MSG(mBuf, 0,0);
11591
11592    /* Copy mBuf into char array to decode it */
11593    ODU_GET_MSG_LEN(mBuf, &recvBufLen);
11594    DU_ALLOC(recvBuf, (Size)recvBufLen);
11595
11596    if(recvBuf == NULLP)
11597    {
11598       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed");
11599       return;
11600    }
11601    if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
11602    {
11603       DU_LOG("\nERROR   -->  F1AP : Failed while copying %d", copyCnt);
11604       return;
11605    }
11606
11607    printf("\nDEBUG   -->  F1AP : Received flat buffer to be decoded : ");
11608    for(i=0; i< recvBufLen; i++)
11609    {
11610       printf("%x",recvBuf[i]);
11611    }
11612
11613    /* Decoding flat buffer into F1AP messsage */
11614    f1apMsg = &f1apasnmsg;
11615    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
11616
11617    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
11618    DU_FREE(recvBuf, (Size)recvBufLen);
11619
11620    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
11621    {
11622       DU_LOG("\nERROR  -->  F1AP : ASN decode failed");
11623       return;
11624    }
11625    printf("\n");
11626    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11627
11628    switch(f1apMsg->present)
11629    {
11630       case F1AP_PDU_PR_successfulOutcome:
11631          {
11632             switch(f1apMsg->choice.successfulOutcome->value.present)
11633             {
11634                case SuccessfulOutcome__value_PR_ResetAcknowledge:
11635                   {
11636                      DU_LOG("\nINFO   -->  F1AP : F1ResetAcknowledge is received successfully ");
11637                      break;
11638                   }
11639                case SuccessfulOutcome__value_PR_F1SetupResponse:
11640                   {                             
11641 #ifndef ODU_TEST_STUB
11642                      procF1SetupRsp(f1apMsg);
11643 #endif
11644                      break;
11645                   }
11646
11647                case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
11648                   {
11649                      procF1GNBDUCfgUpdAck(f1apMsg);
11650                      break;
11651                   }
11652
11653                default:
11654                   {
11655                      DU_LOG("\nERROR  -->  F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
11656                      f1apMsg->choice.successfulOutcome->value.present);
11657                      return;
11658                   }
11659             }/* End of switch(successfulOutcome) */
11660             free(f1apMsg->choice.successfulOutcome);
11661             break;
11662          }
11663       case F1AP_PDU_PR_initiatingMessage:
11664          {
11665             switch(f1apMsg->choice.initiatingMessage->value.present)
11666             {
11667                case InitiatingMessage__value_PR_Reset:
11668                   {
11669                      procF1ResetReq(f1apMsg);
11670                      break;
11671                   }
11672                case InitiatingMessage__value_PR_DLRRCMessageTransfer:
11673                   {
11674                      procF1DlRrcMsgTrans(f1apMsg);
11675                      break;
11676                   }
11677                case InitiatingMessage__value_PR_UEContextSetupRequest:
11678                   {
11679                      procF1UeContextSetupReq(f1apMsg);
11680                      break;
11681                   }
11682                default:
11683                   {
11684                      DU_LOG("\nERROR  -->  F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
11685                            f1apMsg->choice.initiatingMessage->value.present);
11686                      return;
11687                   }
11688             }/* End of switch(initiatingMessage) */
11689             free(f1apMsg->choice.initiatingMessage);
11690             break;
11691          }
11692
11693       default:
11694          {
11695             DU_LOG("\nERROR  -->  F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
11696             return;
11697          }
11698          free(f1apMsg);
11699
11700    }/* End of switch(f1apMsg->present) */
11701
11702 } /* End of F1APMsgHdlr */
11703
11704 /**********************************************************************
11705   End of file
11706  **********************************************************************/