K2 configuration from F1AP to SCH [Issue-ID: ODUHIGH-341]
[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 "F1AP-PDU.h"
26 #include "du_app_mac_inf.h"
27 #include "du_cfg.h"
28 #include "du_app_rlc_inf.h"
29 #include "du_mgr_main.h"
30 #include "du_utils.h"
31 #include "RAT-Type.h"
32 #include "FeatureSetUplinkPerCC.h"
33 #include "FeatureSetDownlinkPerCC.h"
34 #include "FeatureSets.h"
35 #include "UE-NR-Capability.h"
36 #include "UE-CapabilityRAT-Container.h"
37 #include "UE-CapabilityRAT-ContainerListRRC.h"
38 #include "GNB-DU-System-Information.h"
39 #include "CellGroupConfigRrc.h"
40 #include "MAC-CellGroupConfig.h"
41 #include "SchedulingRequestConfig.h"
42 #include "SchedulingRequestToAddMod.h"
43 #include "BSR-Config.h"
44 #include "TAG-Config.h"
45 #include "TAG.h"
46 #include "PHR-Config.h"
47 #include "RLC-Config.h"
48 #include "UL-AM-RLC.h"
49 #include "DL-AM-RLC.h"
50 #include "LogicalChannelConfig.h"
51 #include "RLC-BearerConfig.h"
52 #include "PhysicalCellGroupConfig.h"
53 #include "SpCellConfig.h"
54 #include "TDD-UL-DL-ConfigDedicated.h"
55 #include "ServingCellConfig.h"
56 #include "ControlResourceSet.h"
57 #include "SearchSpace.h"
58 #include "PDCCH-Config.h"
59 #include "PDSCH-TimeDomainResourceAllocation.h"
60 #include "PDSCH-TimeDomainResourceAllocationList.h"
61 #include "PDSCH-CodeBlockGroupTransmission.h"
62 #include "PDSCH-ServingCellConfig.h"
63 #include "DMRS-DownlinkConfig.h"
64 #include "PDSCH-Config.h"
65 #include "BWP-DownlinkDedicated.h"
66 #include "PUSCH-TimeDomainResourceAllocation.h"
67 #include "PUSCH-TimeDomainResourceAllocationList.h"
68 #include "DMRS-UplinkConfig.h"
69 #include "PUSCH-Config.h"
70 #include "SRS-ResourceId.h"
71 #include "SRS-Resource.h"
72 #include "SRS-ResourceSet.h"
73 #include "SRS-Config.h"
74 #include "BWP-UplinkDedicated.h"
75 #include "PUSCH-ServingCellConfig.h"
76 #include "UplinkConfig.h"
77 #include "DUtoCURRCContainer.h"
78 #include "GBR-QoSFlowInformation.h"
79 #include "QoSFlowLevelQoSParameters.h"
80 #include "PUCCH-Config.h"
81 #include "PUCCH-ResourceSet.h"
82 #include "PUCCH-Resource.h"
83 #include "PUCCH-PowerControl.h"
84 #include "P0-PUCCH.h"
85 #include "PUCCH-PathlossReferenceRS.h"
86 #include "PUCCH-format0.h"
87 #include "PUCCH-format1.h"
88 #include "PUCCH-format2.h"
89 #include "PUCCH-format3.h"
90 #include "PUCCH-format4.h"
91 #include "PUCCH-FormatConfig.h"
92 #include "SchedulingRequestResourceConfig.h"
93 #include<ProtocolIE-Field.h>
94 #include "ProtocolExtensionField.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 #ifdef O1_ENABLE
106 #include "ConfigInterface.h"
107 extern StartupConfig g_cfg;
108 #endif
109
110 DuCfgParams duCfgParam;
111
112 /************************************************************************
113  *
114  * @brief Converts enum values into actual value of Poll retransmit timer
115  *
116  * @details
117  *
118  *    Function : getPollPdu
119  *
120  *    Functionality: Converts enum values into actual value of poll 
121  *    retransmit timer
122  *
123  * @params[in] Enum value of pollPdu
124  * @return Actual value of pollPdu
125  *
126  * **********************************************************************/
127
128 uint16_t getPollRetxTmr(uint8_t pollRetxTmrCfg)
129 {
130    uint16_t pollRetxTmr;
131
132    /* All values of poll retx timer are at interval of 5ms.
133     * This is valid upto 250ms
134     * Hence converting the enum value to actual value by multiplying it to 5
135     */
136    if(pollRetxTmrCfg <= T_PollRetransmit_ms250)
137       pollRetxTmr = (pollRetxTmrCfg + 1) * 5;
138    else
139    {
140       switch(pollRetxTmrCfg)
141       {
142          case T_PollRetransmit_ms300:
143             pollRetxTmr = 300;
144             break;
145          case T_PollRetransmit_ms350:
146             pollRetxTmr = 350;
147             break;
148          case T_PollRetransmit_ms400:
149             pollRetxTmr = 400;
150             break;
151          case T_PollRetransmit_ms450:
152             pollRetxTmr = 450;
153             break;
154          case T_PollRetransmit_ms500:
155             pollRetxTmr = 500;
156             break;
157          case T_PollRetransmit_ms800:
158             pollRetxTmr = 800;
159             break;
160          default:
161             DU_LOG("\nERROR  -->  F1AP: Invalid value of Poll Retransmit timer");
162             pollRetxTmr = 0;
163       }
164    }
165    return pollRetxTmr; 
166 }
167
168 /*******************************************************************
169  *
170  * @brief Converts enum values into actual value of PollPdu
171  *
172  * @details
173  *
174  *    Function : getPollPdu
175  *
176  *    Functionality: Converts enum values into actual value of PollPdu
177  *
178  * @params[in] Enum value of pollPdu
179  * @return Actual value of pollPdu
180  *
181  * ****************************************************************/
182 int32_t getPollPdu(uint8_t pollPduCfg)
183 {
184    int32_t pollPdu;
185    switch(pollPduCfg)
186    {
187       case PollPDU_p4:
188          pollPdu = 4;
189          break;
190       case PollPDU_p8:
191          pollPdu = 8;
192          break;
193       case PollPDU_p16:
194          pollPdu = 16;
195          break;
196       case PollPDU_p32:
197          pollPdu = 32;
198          break;
199       case PollPDU_p64:
200          pollPdu = 64;
201          break;
202       case PollPDU_p128:
203          pollPdu = 128;
204          break;
205       case PollPDU_p256:
206          pollPdu = 256;
207          break;
208       case PollPDU_p512:
209          pollPdu = 512;
210          break;
211       case PollPDU_p1024:
212          pollPdu = 1024;
213          break;
214       case PollPDU_p2048:
215          pollPdu = 2048;
216          break;
217       case PollPDU_p4096:
218          pollPdu = 4096;
219          break;
220       case PollPDU_p6144:
221          pollPdu = 6144;
222          break;
223       case PollPDU_p8192:
224          pollPdu = 8192;
225          break;
226       case PollPDU_p12288:
227          pollPdu = 12288;
228          break;
229       case PollPDU_p16384:
230          pollPdu = 16384;
231          break;
232       case PollPDU_p20480:
233          pollPdu = 20480;
234          break;
235       case PollPDU_p24576:
236          pollPdu = 24576;
237          break;
238       case PollPDU_p28672:
239          pollPdu = 28672;
240          break;
241       case PollPDU_p32768:
242          pollPdu = 32768;
243          break;
244       case PollPDU_p40960:
245          pollPdu = 40960;
246          break;
247       case PollPDU_p49152:
248          pollPdu = 49152;
249          break;
250       case PollPDU_p57344:
251          pollPdu = 57344;
252          break;
253       case PollPDU_p65536:
254          pollPdu = 65536;
255          break;
256       case PollPDU_infinity:
257          pollPdu = -1;
258          break;
259       default:
260          DU_LOG("\nERROR  -->  F1AP: Invalid value of poll pdu");
261          pollPdu = 0;
262          break;
263    }
264    return pollPdu;
265 }
266
267 /*******************************************************************
268  *
269  * @brief Converts enum values into actual value of poll bytes
270  *
271  * @details
272  *
273  *    Function : getPollByte
274  *
275  *    Functionality: Converts enum values into actual value of pollBytes
276  *
277  * @params[in] Enum value
278  * @return Actual value
279  *
280  * ****************************************************************/
281 int32_t getPollByte(uint16_t pollBytesCfg)
282 {
283    int32_t pollBytes;
284    switch(pollBytesCfg)
285    {
286       case PollByte_kB1:
287          pollBytes = 1000;
288          break;
289       case PollByte_kB2:
290          pollBytes = 2000;
291          break;
292       case PollByte_kB5:
293          pollBytes = 5000;
294          break;
295       case PollByte_kB8:
296          pollBytes = 8000;
297          break;
298       case PollByte_kB10:
299          pollBytes = 10000;
300          break;
301       case PollByte_kB15:
302          pollBytes = 15000;
303          break;
304       case PollByte_kB25:
305          pollBytes = 25000;
306          break;
307       case PollByte_kB50:
308          pollBytes = 50000;
309          break;
310       case PollByte_kB75:
311          pollBytes = 75000;
312          break;
313       case PollByte_kB100:
314          pollBytes = 100000;
315          break;
316       case PollByte_kB125:
317          pollBytes = 125000;
318          break;
319       case PollByte_kB250:
320          pollBytes = 250000;
321          break;
322       case PollByte_kB375:
323          pollBytes = 375000;
324          break;
325       case PollByte_kB500:
326          pollBytes = 500000;
327          break;
328       case PollByte_kB750:
329          pollBytes = 750000;
330          break;
331       case PollByte_kB1000:
332          pollBytes = 1000000;
333          break;
334       case PollByte_kB1250:
335          pollBytes = 1250000;
336          break;
337       case PollByte_kB1500:
338          pollBytes = 1500000;
339          break;
340       case PollByte_kB2000:
341          pollBytes = 2000000;
342          break;
343       case PollByte_kB3000:
344          pollBytes = 3000000;
345          break;
346       case PollByte_kB4000:
347          pollBytes = 4000000;
348          break;
349       case PollByte_kB4500:
350          pollBytes = 4500000;
351          break;
352       case PollByte_kB5000:
353          pollBytes = 5000000;
354          break;
355       case PollByte_kB5500:
356          pollBytes = 5500000;
357          break;
358       case PollByte_kB6000:
359          pollBytes = 6000000;
360          break;
361       case PollByte_kB6500:
362          pollBytes = 6500000;
363          break;
364       case PollByte_kB7000:
365          pollBytes = 7000000;
366          break;
367       case PollByte_kB7500:
368          pollBytes = 7500000;
369          break;
370       case PollByte_mB8:
371          pollBytes = 8000000;
372          break;
373       case PollByte_mB9:
374          pollBytes = 9000000;
375          break;
376       case PollByte_mB10:
377          pollBytes = 10000000;
378          break;
379       case PollByte_mB11:
380          pollBytes = 11000000;
381          break;
382       case PollByte_mB12:
383          pollBytes = 12000000;
384          break;
385       case PollByte_mB13:
386          pollBytes = 13000000;
387          break;
388       case PollByte_mB14:
389          pollBytes = 14000000;
390          break;
391       case PollByte_mB15:
392          pollBytes = 15000000;
393          break;
394       case PollByte_mB16:
395          pollBytes = 16000000;
396          break;
397       case PollByte_mB17:
398          pollBytes = 17000000;
399          break;
400       case PollByte_mB18:
401          pollBytes = 18000000;
402          break;
403       case PollByte_mB20:
404          pollBytes = 20000000;
405          break;
406       case PollByte_mB25:
407          pollBytes = 25000000;
408          break;
409       case PollByte_mB30:
410          pollBytes = 30000000;
411          break;
412       case PollByte_mB40:
413          pollBytes = 40000000;
414          break;
415       case PollByte_infinity:
416          pollBytes = -1;
417          break;
418       default:
419          DU_LOG("\nERROR  -->  F1AP: Invalid value of poll bytes");
420          pollBytes = 0;
421    }
422    return pollBytes;
423 }
424
425 /*******************************************************************
426  *
427  * @brief Converts enum values into actual value of maxRetx
428  *
429  * @details
430  *
431  *    Function : getMaxRetx
432  *
433  *    Functionality: Converts enum values into actual value of maxRetx
434  *
435  * @params[in] Enum value
436  * @return Actual value
437  *
438  * ****************************************************************/
439 uint8_t getMaxRetx(uint8_t maxRetxCfg)
440 {
441    uint8_t maxRetx;
442    switch(maxRetxCfg)
443    {
444       case UL_AM_RLC__maxRetxThreshold_t1:
445          maxRetx = 1;
446          break;
447       case UL_AM_RLC__maxRetxThreshold_t2:
448          maxRetx = 2;
449          break;
450       case UL_AM_RLC__maxRetxThreshold_t3:
451          maxRetx = 3;
452          break;
453       case UL_AM_RLC__maxRetxThreshold_t4:
454          maxRetx = 4;
455          break;
456       case UL_AM_RLC__maxRetxThreshold_t6:
457          maxRetx = 6;
458          break;
459       case UL_AM_RLC__maxRetxThreshold_t8:
460          maxRetx = 8;
461          break;
462       case UL_AM_RLC__maxRetxThreshold_t16:
463          maxRetx = 16;
464          break;
465       case UL_AM_RLC__maxRetxThreshold_t32:
466          maxRetx = 32;
467          break;
468       default:
469          DU_LOG("\nERROR  -->  F1AP: Invalid configuration for Max retransmission threshold");
470          maxRetx = 0;
471    }
472    return maxRetx;
473 }
474
475 /*******************************************************************
476  * @brief Converts enum values into actual value of reassembly timer
477  *
478  * @details
479  *
480  *    Function : getReAsmblTmr
481  *
482  *    Functionality: Converts enum values into actual value of reassembly 
483  *    timer
484  *
485  * @params[in] Enum value of reassembly timer
486  * @return Actual value of reassembly timer
487  *
488  * **********************************************************************/
489
490 int8_t getReAsmblTmr(uint8_t reAsmblTmrCfg)
491 {
492    int8_t reAsmblTmr = 0;
493    
494    if(reAsmblTmrCfg == T_Reassembly_ms0)
495    {
496       reAsmblTmr = 0;
497    }
498    else if(reAsmblTmrCfg >= T_Reassembly_ms5 || reAsmblTmrCfg <= T_Reassembly_ms100)
499    {
500      /* All values of re assembly timer are at interval of 5ms.
501       * This is valid upto 100ms
502       * Hence converting the enum value to actual value by multiplying it to 5
503       */
504       reAsmblTmr = reAsmblTmrCfg * 5;
505    }
506    else if(reAsmblTmrCfg >= T_Reassembly_ms110 || reAsmblTmrCfg <= T_Reassembly_ms200)
507    {
508      /* All values of re assembly timer are at interval of 10ms.
509       * This is valid upto 200ms
510       * since enum value starts from 20 for 100ms, subtracting 10 and
511       * converting the enum value to actual value by multiplying it to 10
512       */
513       reAsmblTmr = ((reAsmblTmrCfg-10) * 10);
514    }
515    else
516    {
517       DU_LOG("\nERROR  -->  F1AP : Invalid value of Re Assembly timer %d", reAsmblTmrCfg);
518       reAsmblTmr = -1;
519    }
520    return reAsmblTmr; 
521 }
522
523 /************************************************************************
524  *
525  * @brief Converts enum values into actual value of status prohibit timer
526  *
527  * @details
528  *
529  *    Function : getStatProhTmr
530  *
531  *    Functionality: Converts enum values into actual value of status prohibit 
532  *    timer
533  *
534  * @params[in] Enum value of status prohibit timer
535  * @return Actual value of status prohibit timer
536  *
537  * **********************************************************************/
538
539 int16_t getStatProhTmr(uint8_t statProhTmrCfg)
540 {
541    int16_t statProhTmr =0;
542    
543    if(statProhTmrCfg == T_StatusProhibit_ms0)
544    {
545       statProhTmr = 0;
546    }
547    else if(statProhTmrCfg >= T_StatusProhibit_ms5 || statProhTmrCfg <= T_StatusProhibit_ms250)
548    {
549       /* All values of re assembly timer are at interval of 5ms.
550        * This is valid upto 250ms
551        * Hence converting the enum value to actual value by multiplying it to 5
552        */
553       statProhTmr = statProhTmrCfg * 5;
554    }
555    else
556    {
557       switch(statProhTmrCfg)
558       {
559          case T_StatusProhibit_ms300:
560             statProhTmr = 300;
561             break;
562          case T_StatusProhibit_ms350:
563             statProhTmr = 350;
564             break;
565          case T_StatusProhibit_ms400:
566             statProhTmr = 400;
567             break;
568          case T_StatusProhibit_ms450:
569             statProhTmr = 450;
570             break;
571          case T_StatusProhibit_ms500:
572             statProhTmr = 500;
573             break;
574          case T_StatusProhibit_ms800:
575             statProhTmr = 800;
576             break;
577          case T_StatusProhibit_ms1000:
578             statProhTmr = 1000;
579             break;
580          case T_StatusProhibit_ms1200:
581             statProhTmr = 1200;
582             break;
583          case T_StatusProhibit_ms1600:
584             statProhTmr = 1600;
585             break;
586          case T_StatusProhibit_ms2000:
587             statProhTmr = 2000;
588             break;
589          case T_StatusProhibit_ms2400:
590             statProhTmr = 2400;
591             break;
592          default:
593             DU_LOG("\nInvalid value of Status Prohibit timer %d", statProhTmrCfg);
594             statProhTmr = -1;
595             break;
596       }
597    }
598    return statProhTmr; 
599 }
600
601 /*******************************************************************
602 *
603 * @brief Adding F1AP pdu to reserved pdu list
604 *
605 * @details
606 *
607 *    Function : addToReservedF1apPduList 
608 *
609 *    Functionality: Adding F1AP pdu to reserved pdu list.
610 *     These pdu are awaiting aknowledgment from CU
611 *
612 * @params[in] uint8_t transId, F1AP_PDU_t *f1apMsg
613 *
614 * @return ROK - success
615 *         RFAILED - failure
616 *
617 * ****************************************************************/
618
619 void addToReservedF1apPduList(uint8_t transId, F1AP_PDU_t *f1apPdu)
620 {
621    CmLList         *node = NULLP;
622    ReservedF1apPduInfo *pduInfo = NULLP;
623    DU_ALLOC(pduInfo, sizeof(ReservedF1apPduInfo));
624    if(pduInfo)
625    {
626       DU_ALLOC(node, sizeof(CmLList));
627       if(node)
628       {
629          pduInfo->transId = transId;
630          pduInfo->f1apMsg = (void*) f1apPdu;
631
632          node->node = (PTR)pduInfo;
633          cmLListAdd2Tail(&duCb.reservedF1apPduList, node);
634       }
635    }
636 }
637
638 /*******************************************************************
639 *
640 * @brief searching for F1AP pdu from ReservedF1apPduList 
641 *
642 * @details
643 *
644 *    Function : searchFromReservedF1apPduList 
645 *
646 *    Functionality: searching for F1AP pdu information
647 *
648 * @params[in] uint8_t transId
649 *
650 * @return pointer to F1AP_PDU_t
651 *
652 * ****************************************************************/
653
654 CmLList *searchFromReservedF1apPduList(uint8_t transId)
655 {
656    CmLList         *node;
657    ReservedF1apPduInfo *f1apPdu;
658    if(duCb.reservedF1apPduList.count)
659    {
660       CM_LLIST_FIRST_NODE(&duCb.reservedF1apPduList, node);
661       while(node)
662       {
663          f1apPdu = (ReservedF1apPduInfo*)node->node;
664          if(f1apPdu->transId == transId)
665          {
666             return node;
667          }
668          node = node->next;
669       }
670    }
671    return NULL;
672 }
673
674 /*******************************************************************
675 *
676 * @brief deleting F1AP pdu information from ReservedF1apPduList
677 *
678 * @details
679 *
680 *    Function : deleteFromReservedF1apPduList 
681 *
682 *    Functionality: deleting pdu information from ReservedF1apPduList
683 *
684 * @params[in] CmLList *node 
685 *
686 * @return void 
687 *
688 * ****************************************************************/
689
690 void deleteFromReservedF1apPduList(CmLList *node)
691 {
692    ReservedF1apPduInfo *f1apPdu;
693
694    if(node != NULL)
695    {
696       f1apPdu = (ReservedF1apPduInfo *)node->node;
697       cmLListDelFrm(&duCb.reservedF1apPduList, node);
698       DU_FREE(f1apPdu, sizeof(ReservedF1apPduInfo));
699       DU_FREE(node, sizeof(CmLList));
700       node = NULL;
701    }
702 }
703
704 /*******************************************************************
705  *
706  * @brief Builds Uplink Info for NR 
707  *
708  * @details
709  *
710  *    Function : BuildULNRInfo
711  *
712  *    Functionality: Building NR Uplink Info
713  *
714  * @params[in] NRFreqInfo_t *ulnrfreq
715  * @return ROK     - success
716  *         RFAILED - failure
717  *
718  * ****************************************************************/
719 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
720 {
721    uint8_t idx=0;
722    ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
723                        fdd.ulNrFreqInfo.nrArfcn;
724    ulnrfreq->freqBandListNr.list.count = 1;
725    ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
726    DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
727    if(ulnrfreq->freqBandListNr.list.array == NULLP)
728    {
729       return RFAILED;
730    }
731    for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
732    {
733       DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
734       if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
735       {
736          return RFAILED;
737       }
738    }
739    ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
740                                                                  duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
741                                                                  freqBand[0].nrFreqBand;
742    ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
743    return ROK;
744 }
745 /*******************************************************************
746  *
747  * @brief Builds Downlink NR Info 
748  *
749  * @details
750  *
751  *    Function : BuildDLNRInfo
752  *
753  *    Functionality: Building Downlink NR Info
754  *    
755  * @params[in] NRFreqInfo_t *dlnrfreq
756  * @return ROK     - success
757  *         RFAILED - failure
758  *
759  * ****************************************************************/
760 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
761 {
762    uint8_t idx=0;
763    dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
764                        fdd.dlNrFreqInfo.nrArfcn;
765    dlnrfreq->freqBandListNr.list.count = 1;
766    dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
767    DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
768    if(dlnrfreq->freqBandListNr.list.array == NULLP)
769    {
770       return RFAILED;   
771    }
772    for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
773    {
774       DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
775       if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
776       {
777          return RFAILED;
778       }
779    }   
780    dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
781                                                                  duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
782                                                                  freqBand[0].nrFreqBand;
783    dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
784
785    return ROK;
786 }
787
788 /*******************************************************************
789  *
790  * @brief Builds NRCell ID 
791  *
792  * @details
793  *
794  *    Function : BuildNrCellId
795  *
796  *    Functionality: Building the NR Cell ID
797  *
798  * @params[in] BIT_STRING_t *nrcell
799  * @return ROK     - success
800  *         RFAILED - failure
801  *
802  * ****************************************************************/
803
804 S16 BuildNrCellId(BIT_STRING_t *nrcell)
805 {
806    memset(nrcell->buf, 0, nrcell->size);
807    nrcell->buf[4]   = 16; 
808    nrcell->bits_unused = 4;
809    return ROK;
810 }
811
812 /*******************************************************************
813  *
814  * @brief Builds Nrcgi 
815  *
816  * @details
817  *
818  *    Function : BuildNrcgi
819  *
820  *    Functionality: Building the PLMN ID and NR Cell id
821  *
822  * @params[in] NRCGI_t *nrcgi
823  * @return ROK     - success
824  *         RFAILED - failure
825  *
826  * ****************************************************************/
827 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
828 {
829    uint8_t ret;
830    uint8_t byteSize = 5;
831    /* Allocate Buffer Memory */
832    nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
833    DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
834    if(nrcgi->pLMN_Identity.buf == NULLP)
835    {
836       return RFAILED;
837    }
838    ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
839          nrcgi->pLMN_Identity.buf); // Building PLMN function
840    if(ret != ROK)
841    {
842       return RFAILED;
843    }
844    /*nrCellIdentity*/
845    nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
846    DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size); 
847    if(nrcgi->nRCellIdentity.buf == NULLP)
848    {
849       return RFAILED;
850    }
851    BuildNrCellId(&nrcgi->nRCellIdentity);
852
853    return ROK;
854 }
855 /*******************************************************************
856  *
857  * @brief Builds FiveGStac 
858  *
859  * @details
860  *
861  *    Function : BuildFiveGSTac
862  *
863  *    Functionality: Building the FiveGSTac
864  *
865  * @params[in] OCTET_STRING_t *fivegsTac
866  * @return ROK     - success
867  *         RFAILED - failure
868  *
869  * ****************************************************************/
870 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
871 {
872    DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
873    if(servcell->fiveGS_TAC == NULLP)
874    {
875       return RFAILED;
876    }
877    servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
878    DU_ALLOC(servcell->fiveGS_TAC->buf,\
879          sizeof(servcell->fiveGS_TAC->size));
880    if(servcell->fiveGS_TAC->buf == NULLP)
881    {
882       return RFAILED;
883    }
884    servcell->fiveGS_TAC->buf[0] = 0;
885    servcell->fiveGS_TAC->buf[1] = 0;
886    servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
887    return ROK;  
888 }
889 /*******************************************************************
890  *
891  * @brief Builds NR Mode 
892  *
893  * @details
894  *
895  *    Function : BuildNrMode
896  *
897  *    Functionality: Building the NR Mode
898  *
899  * @params[in] NR_Mode_Info_t *fdd
900  * @return ROK     - success
901  *         RFAILED - failure
902  *
903  * ****************************************************************/
904 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
905 {
906    uint8_t BuildDLNRInforet=0;
907    uint8_t BuildULNRInforet=0; 
908    /* FDD Mode */
909    mode->present = NR_Mode_Info_PR_fDD;
910    if(mode->present == NR_Mode_Info_PR_fDD)
911    {
912       DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
913       if(mode->choice.fDD == NULLP)
914       {
915          return RFAILED;
916       }
917       BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
918       if(BuildULNRInforet != ROK)
919       {
920          return RFAILED;    
921       }
922       BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
923       if(BuildDLNRInforet != ROK)
924       {
925          return RFAILED;
926       }
927    }
928    mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
929                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
930                                                        f1Mode.mode.fdd.ulTxBw.nrScs;
931    mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
932                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
933                                                        f1Mode.mode.fdd.ulTxBw.nrb;
934    mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
935                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
936                                                        f1Mode.mode.fdd.dlTxBw.nrScs;
937    mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
938                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
939                                                        f1Mode.mode.fdd.dlTxBw.nrb;
940    return ROK;
941 }
942 /*******************************************************************
943  *
944  * @brief Builds IE Extensions for Served PLMNs 
945  *
946  * @details
947  *
948  *    Function : BuildExtensions
949  *
950  *    Functionality: Building the IE Extensions
951  *
952  * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
953  * @return ROK     - success
954  *         RFAILED - failure
955  *
956  * ****************************************************************/
957 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
958 {
959    uint8_t idx;
960    uint8_t plmnidx;
961    uint8_t extensionCnt=1;
962    uint8_t sliceId=0;
963    uint8_t sdId;
964    DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
965    if((*ieExtend) == NULLP)
966    {
967       return RFAILED;
968    }
969    (*ieExtend)->list.count = extensionCnt;
970    (*ieExtend)->list.size = \
971                             extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
972    DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
973    if((*ieExtend)->list.array == NULLP)
974    {
975       return RFAILED;
976    }
977    for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
978    {
979       DU_ALLOC((*ieExtend)->list.array[plmnidx],\
980             sizeof(ServedPLMNs_ItemExtIEs_t));
981       if((*ieExtend)->list.array[plmnidx] == NULLP)
982       {
983          return RFAILED;
984       }
985    }
986    idx = 0;
987    (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
988    (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
989    (*ieExtend)->list.array[idx]->extensionValue.present = \
990                                                           ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
991    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
992       list.count = 1;
993    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
994       list.size = sizeof(SliceSupportItem_t *);
995    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
996          list.array,sizeof(SliceSupportItem_t *));
997    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
998          list.array == NULLP)
999    {
1000       return RFAILED;
1001    }
1002    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1003          list.array[sliceId],sizeof(SliceSupportItem_t));
1004    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1005          list.array[sliceId] == NULLP) 
1006    {
1007       return RFAILED;
1008    }
1009    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1010       list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
1011    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
1012          .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
1013          extensionValue.choice.SliceSupportList.\
1014          list.array[sliceId]->sNSSAI.sST.size);
1015    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
1016          .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
1017    {
1018       return RFAILED;
1019    }
1020    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1021       list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
1022    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1023          list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1024    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1025          list.array[sliceId]->sNSSAI.sD == NULLP)
1026    {
1027       return RFAILED;
1028    }
1029    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1030       list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1031    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1032          list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
1033          SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
1034    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1035          list.array[sliceId]->sNSSAI.sD->buf == NULLP)
1036    {
1037       return RFAILED;
1038    }
1039    sdId = 0;
1040    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1041       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
1042    sdId++;
1043    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1044       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
1045    sdId++;
1046    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
1047       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
1048    return ROK;
1049 }
1050 /*******************************************************************
1051  *
1052  * @brief Builds Served PLMN 
1053  *
1054  * @details
1055  *
1056  *    Function : BuildServedPlmn
1057  *
1058  *    Functionality: Building the Served PLMN
1059  *
1060  * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
1061  * @return ROK     - success
1062  *         RFAILED - failure
1063  *
1064  * ****************************************************************/
1065 uint8_t  BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
1066 {  
1067    uint8_t  plmnidx;
1068    uint8_t  servPlmnCnt=1;
1069    uint8_t buildPlmnIdret=0;
1070    uint8_t BuildExtensionsret=0;
1071    srvplmn->list.count = servPlmnCnt;
1072    srvplmn->list.size = \
1073                         servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
1074    DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
1075    if(srvplmn->list.array == NULLP)
1076    {
1077       return RFAILED;
1078    }
1079    for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
1080    {   
1081       DU_ALLOC(srvplmn->list.array[plmnidx],\
1082             sizeof(ServedPLMNs_Item_t));
1083       if(srvplmn->list.array[plmnidx] == NULLP)
1084       {
1085          return RFAILED;
1086       }  
1087    }
1088    srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
1089    DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
1090    buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
1091          srvplmn->list.array[0]->pLMN_Identity.buf);
1092    if(buildPlmnIdret!= ROK)
1093    {
1094       return RFAILED;
1095    }
1096    BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
1097    if(BuildExtensionsret!= ROK)
1098    {
1099       return RFAILED;
1100    }
1101    return ROK;
1102 }
1103 /*******************************************************************
1104  *
1105  * @brief Builds Served Cell List
1106  *
1107  * @details
1108  *
1109  *    Function : BuildServedCellList
1110  *
1111  *    Functionality: Building Served Cell List
1112  *
1113  * @params[in] PLMNID plmn
1114  * @return ROK     - success
1115  *         RFAILED - failure
1116  *
1117  * ****************************************************************/
1118
1119 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
1120 {
1121    uint8_t  BuildNrcgiret=0;
1122    uint8_t  BuildFiveGSTacret=0;
1123    uint8_t  BuildServedPlmnret=0;
1124    uint8_t  BuildNrModeret=0;
1125    uint8_t  idx;
1126    uint8_t  plmnidx;
1127    uint8_t  plmnCnt=1;
1128    GNB_DU_Served_Cells_Item_t *srvCellItem;
1129    duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
1130    duServedCell->list.count = plmnCnt;
1131
1132    DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
1133    if(duServedCell->list.array == NULLP)
1134    {
1135       return RFAILED;
1136    }
1137    for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
1138    {
1139       DU_ALLOC(duServedCell->list.array[plmnidx],\
1140             sizeof(GNB_DU_Served_Cells_ItemIEs_t));
1141       if(duServedCell->list.array[plmnidx] == NULLP)
1142       {
1143          return RFAILED;
1144       }
1145    }
1146    idx = 0;
1147    duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
1148    duServedCell->list.array[idx]->criticality = Criticality_reject;
1149    duServedCell->list.array[idx]->value.present = \
1150                                                   GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
1151    srvCellItem = \
1152                  &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
1153    /*nRCGI*/
1154    BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
1155    if(BuildNrcgiret != ROK)
1156    {
1157       return RFAILED;
1158    }
1159    /*nRPCI*/
1160    srvCellItem->served_Cell_Information.nRPCI = \
1161                                                 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
1162
1163    /*fiveGS_TAC*/
1164    BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
1165    if(BuildFiveGSTacret != ROK)
1166    {
1167       return RFAILED;
1168    }
1169    /*Served PLMNs*/
1170    BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
1171    if(BuildServedPlmnret !=ROK)
1172    {
1173       return RFAILED;
1174    }
1175    /*nR Mode Info with FDD*/
1176    BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
1177    if(BuildNrModeret != ROK)
1178    {
1179       return RFAILED;
1180    }
1181    /*Measurement timing Config*/
1182    srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
1183       size = sizeof(uint8_t);
1184    DU_ALLOC(srvCellItem->served_Cell_Information.\
1185          measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
1186    if(srvCellItem->served_Cell_Information.\
1187          measurementTimingConfiguration.buf == NULLP)
1188    {
1189       return RFAILED;
1190    }
1191    srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
1192                                                                                 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
1193
1194    /* GNB DU System Information */
1195    DU_ALLOC(srvCellItem->gNB_DU_System_Information,
1196          sizeof(GNB_DU_System_Information_t));
1197    if(!srvCellItem->gNB_DU_System_Information)
1198    {
1199       return RFAILED;
1200    }
1201    /* MIB */
1202    srvCellItem->gNB_DU_System_Information->mIB_message.size = duCfgParam.srvdCellLst[0].duSysInfo.mibLen;
1203    DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
1204          srvCellItem->gNB_DU_System_Information->mIB_message.size);
1205    if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
1206    {
1207       return RFAILED;
1208    }
1209    memcpy(srvCellItem->gNB_DU_System_Information->mIB_message.buf, duCfgParam.srvdCellLst[0].duSysInfo.mibMsg, \
1210                    srvCellItem->gNB_DU_System_Information->mIB_message.size);
1211
1212    /* SIB1 */
1213    srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
1214                                                               duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
1215
1216    DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
1217          srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1218    if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
1219    {
1220       return RFAILED;
1221    }
1222    for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
1223    {
1224       srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
1225                                                                   duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
1226    }
1227    return ROK; 
1228 }                                                                                                                  
1229 /*******************************************************************
1230  *
1231  * @brief Builds RRC Version 
1232  *
1233  * @details
1234  *
1235  *    Function : BuildRrcVer
1236  *
1237  *    Functionality: Building RRC Version
1238  *
1239  * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
1240  * @return ROK     - success
1241  *         RFAILED - failure
1242  *
1243  * ****************************************************************/
1244 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
1245 {
1246    uint8_t rrcExt;
1247    uint8_t rrcLatest;
1248    rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
1249    DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
1250    if(rrcVer->latest_RRC_Version.buf == NULLP)
1251    {
1252       return RFAILED;
1253    }
1254    rrcVer->latest_RRC_Version.buf[0] = 0;
1255    rrcVer->latest_RRC_Version.bits_unused = 5;
1256    DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
1257    if(rrcVer->iE_Extensions == NULLP)
1258    {  
1259       return RFAILED;
1260    }
1261    rrcVer->iE_Extensions->list.count = 1;
1262    rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
1263    DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
1264    if(rrcVer->iE_Extensions->list.array == NULLP)
1265    {
1266       return RFAILED;
1267    }
1268    rrcExt = 0;
1269    DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
1270          sizeof(RRC_Version_ExtIEs_t));
1271    if(rrcVer->iE_Extensions->list.array[0] == NULLP)
1272    {
1273       return RFAILED;
1274    }
1275    rrcVer->iE_Extensions->list.array[rrcExt]->id = \
1276                                                    ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
1277    rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
1278    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
1279                                                                       RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
1280    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1281       .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
1282    DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1283          .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
1284          array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
1285    if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1286          .Latest_RRC_Version_Enhanced.buf == NULLP)
1287    {
1288       return RFAILED;
1289    }
1290    rrcLatest = 0;
1291    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1292       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
1293    rrcLatest++;
1294    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1295       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
1296    rrcLatest++;
1297    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1298       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
1299    return ROK;
1300 }
1301 /*******************************************************************
1302  *
1303  * @brief Sends F1 msg over SCTP
1304  *
1305  * @details
1306  *
1307  *    Function : sendF1APMsg
1308  *
1309  *    Functionality: Sends F1 msg over SCTP
1310  *
1311  * @params[in] Region region
1312  *             Pool pool
1313  * @return ROK     - success
1314  *         RFAILED - failure
1315  *
1316  * ****************************************************************/
1317 uint8_t sendF1APMsg()
1318 {
1319    Buffer *mBuf = NULLP;
1320   
1321    if(ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &mBuf) == ROK)
1322    {
1323       if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
1324       {
1325             ODU_PRINT_MSG(mBuf, 0,0);
1326
1327             if(sctpSend(mBuf, F1_INTERFACE) != ROK)
1328             {
1329                DU_LOG("\nERROR  -->  F1AP : SCTP Send failed");
1330                ODU_PUT_MSG_BUF(mBuf);
1331                return RFAILED;
1332             }
1333       }
1334       else
1335       {
1336          DU_LOG("\nERROR  -->  F1AP : ODU_ADD_POST_MSG_MULT failed");
1337          ODU_PUT_MSG_BUF(mBuf);
1338          return RFAILED;
1339       }
1340       ODU_PUT_MSG_BUF(mBuf);
1341    }
1342    else
1343    {
1344       DU_LOG("\nERROR  -->  F1AP : Failed to allocate memory");
1345       return RFAILED;
1346    }
1347    return ROK; 
1348 } /* sendF1APMsg */
1349
1350 /*******************************************************************
1351  *
1352  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1353  *
1354  * @details
1355  *
1356  *    Function :  FreeRrcVer
1357  *
1358  *    Functionality: deallocating the memory of function BuildRrcVer
1359  *
1360  * @params[in] RRC_Version_t *rrcVer
1361  * 
1362  * @return void
1363  *
1364  *****************************************************************/
1365 void FreeRrcVer(RRC_Version_t *rrcVer)
1366 {
1367    if(rrcVer->latest_RRC_Version.buf != NULLP)
1368    {
1369       if(rrcVer->iE_Extensions != NULLP)
1370       {
1371          if(rrcVer->iE_Extensions->list.array != NULLP)
1372          {
1373             if(rrcVer->iE_Extensions->list.array[0] != NULLP)
1374             {
1375                if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
1376                      != NULLP)
1377                {
1378                   DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
1379                         .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
1380                         array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
1381                }
1382                DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
1383             }
1384             DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
1385          }
1386          DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
1387       }
1388       DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
1389    }
1390 }
1391 /*******************************************************************
1392  *
1393  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1394  *
1395  * @details
1396  *
1397  *    Function :  FreeServedCellList
1398  *
1399  *    Functionality:  deallocating the memory of function BuildServedCellList
1400
1401  *
1402  * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
1403  *
1404  * @return void
1405  *
1406  * ****************************************************************/
1407 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
1408 {
1409    uint8_t   plmnCnt=1;
1410    uint8_t  sliceId=0;
1411    uint8_t  extensionCnt=1;
1412    uint8_t  plmnIdx=0;
1413    GNB_DU_Served_Cells_Item_t *srvCellItem;
1414    ServedPLMNs_Item_t  *servedPlmnItem;
1415    SliceSupportItem_t  *sliceSupportItem;
1416
1417    if(duServedCell->list.array!=NULLP)
1418    {
1419       if(duServedCell->list.array[0]!=NULLP)
1420       {
1421          srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
1422
1423          DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1424                srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size * sizeof(uint8_t));
1425          DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1426                srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size * sizeof(uint8_t));
1427
1428          if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
1429          {
1430             DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
1431                   sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
1432             DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
1433          }
1434
1435          if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
1436          {
1437             if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx] != NULLP)
1438             {
1439                servedPlmnItem = srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx];
1440                DU_FREE(servedPlmnItem->pLMN_Identity.buf, servedPlmnItem->pLMN_Identity.size * sizeof(uint8_t));
1441
1442                if(servedPlmnItem->iE_Extensions != NULLP)
1443                {
1444                   if(servedPlmnItem->iE_Extensions->list.array != NULLP)
1445                   {
1446                      if(servedPlmnItem->iE_Extensions->list.array[0] != NULLP)
1447                      {
1448                         if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.\
1449                               array != NULLP)
1450                         {
1451                            if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.\
1452                                  array[sliceId] != NULLP)
1453                            {
1454                               sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
1455                                                  SliceSupportList.list.array[sliceId];
1456
1457                               DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sizeof(uint8_t));
1458
1459                               if(sliceSupportItem->sNSSAI.sD != NULLP)
1460                               {
1461                                  DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size);
1462                                  DU_FREE(sliceSupportItem->sNSSAI.sD, sizeof(OCTET_STRING_t));
1463                               }
1464
1465                               DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1466                                     list.array[sliceId], sizeof(SliceSupportItem_t));
1467                            }
1468                            DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1469                                  list.array, sizeof(SliceSupportItem_t*));
1470                         }
1471                         DU_FREE(servedPlmnItem->iE_Extensions->list.array[0], sizeof(ServedPLMNs_ItemExtIEs_t));
1472                      }
1473                      DU_FREE(servedPlmnItem->iE_Extensions->list.array, extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
1474                   }
1475                   DU_FREE(servedPlmnItem->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P3_t));
1476                }
1477                DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx], sizeof(ServedPLMNs_Item_t));
1478             }
1479             DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array, sizeof(ServedPLMNs_Item_t *));
1480          }
1481
1482          if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP)
1483          {
1484             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1485                   freqBandListNr.list.array != NULLP)
1486             {
1487                DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
1488                      list.array[0],sizeof(FreqBandNrItem_t));
1489                DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
1490                      list.array,sizeof(FreqBandNrItem_t*));
1491             }
1492
1493             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1494                   freqBandListNr.list.array)
1495             {
1496                DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1497                      freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1498                DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1499                      freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
1500             }
1501             DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD, sizeof(FDD_Info_t));
1502          }
1503
1504          DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
1505                srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
1506
1507          if(srvCellItem->gNB_DU_System_Information != NULLP)
1508          {
1509             if(srvCellItem->gNB_DU_System_Information->mIB_message.buf != NULLP)
1510             {
1511                DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
1512                      srvCellItem->gNB_DU_System_Information->mIB_message.size);
1513             }
1514
1515             if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf != NULLP)
1516             { 
1517                DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
1518                      srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1519             }
1520
1521             DU_FREE(srvCellItem->gNB_DU_System_Information, sizeof(GNB_DU_System_Information_t));
1522          }
1523
1524          DU_FREE(duServedCell->list.array[0], sizeof(GNB_DU_Served_Cells_ItemIEs_t));
1525       }
1526       DU_FREE(duServedCell->list.array, plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
1527    }
1528 }
1529
1530 /*******************************************************************
1531  *
1532  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1533  *
1534  * @details
1535  *
1536  *    Function :  FreeF1SetupReq
1537  *
1538  *    Functionality:  deallocating the memory of function BuildAndSendF1SetupReq
1539  *
1540  * @params[in] F1AP_PDU_t *f1apMsg
1541  *
1542  * @return void
1543  *
1544  * ****************************************************************/
1545 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
1546 {
1547    uint8_t ieIdx, ieIdx2;
1548    F1SetupRequest_t *f1SetupReq=NULLP;
1549
1550    if(f1apMsg != NULLP)
1551    {
1552       if(f1apMsg->choice.initiatingMessage != NULLP)
1553       {
1554          f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1555          if(f1SetupReq->protocolIEs.list.array != NULLP)
1556          {
1557             for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
1558             {
1559                if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP)
1560                {
1561                   switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
1562                   {
1563                      case ProtocolIE_ID_id_TransactionID:
1564                         break;
1565                      case ProtocolIE_ID_id_gNB_DU_ID:
1566                         DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1567                               f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1568                         break;
1569                      case ProtocolIE_ID_id_gNB_DU_Name:
1570                         DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\
1571                               strlen((char *)duCfgParam.duName));
1572                         break;
1573                      case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
1574                         FreeServedCellList(&f1SetupReq->protocolIEs.list.\
1575                               array[ieIdx]->value.choice.GNB_DU_Served_Cells_List);
1576                         break;
1577                      case ProtocolIE_ID_id_GNB_DU_RRC_Version:
1578                         FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version);
1579                         break;
1580                      default:
1581                         DU_LOG("\nERROR  -->  Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id);
1582                         break;
1583                   }
1584                }
1585             }
1586             for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++)
1587             {
1588                DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t));
1589             }
1590             DU_FREE(f1SetupReq->protocolIEs.list.array,\
1591                   f1SetupReq->protocolIEs.list.size);
1592          }
1593          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1594       }
1595       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1596    }
1597 }
1598 /*******************************************************************
1599  *
1600  * @brief Builds and Send the F1SetupRequest
1601  *
1602  * @details
1603  *
1604  *    Function : BuildAndSendF1SetupReq
1605  *
1606  * Functionality:Fills the F1SetupRequest
1607  *
1608  * @return ROK     - success
1609  *         RFAILED - failure
1610  *
1611  ******************************************************************/
1612 uint8_t BuildAndSendF1SetupReq()
1613 {
1614    uint8_t   ret, ieIdx, elementCnt;
1615    F1AP_PDU_t                 *f1apMsg = NULLP;
1616    F1SetupRequest_t           *f1SetupReq=NULLP;
1617    GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1618    RRC_Version_t              *rrcVer=NULLP;
1619    asn_enc_rval_t             encRetVal;        /* Encoder return value */
1620    ret= RFAILED;
1621
1622    DU_LOG("\nINFO   -->  F1AP : Building F1 Setup Request\n");
1623    do
1624    {
1625       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1626       if(f1apMsg == NULLP)
1627       {
1628          break;
1629       }
1630       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1631       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1632       if(f1apMsg->choice.initiatingMessage == NULLP)
1633       {
1634          break;
1635       }
1636       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1637       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1638       f1apMsg->choice.initiatingMessage->value.present = \
1639                                                          InitiatingMessage__value_PR_F1SetupRequest;
1640
1641       f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1642
1643       elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1644
1645       f1SetupReq->protocolIEs.list.count = elementCnt;
1646       f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1647
1648       /* Initialize the F1Setup members */
1649       DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1650       if(f1SetupReq->protocolIEs.list.array == NULLP)
1651       {
1652          break;
1653       }
1654       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
1655       {
1656          DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\
1657                sizeof(F1SetupRequestIEs_t));
1658          if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP)
1659          {
1660             break;
1661          }
1662       }
1663
1664       ieIdx = 0;
1665       /*TransactionID*/
1666       f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID;
1667       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1668       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\
1669                                                                F1SetupRequestIEs__value_PR_TransactionID;
1670       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \
1671                                                                              TRANS_ID;
1672
1673       /*DU ID*/
1674       ieIdx++;
1675       f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
1676       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1677       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1678                                                                 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1679       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\
1680                                                                              sizeof(uint8_t);
1681
1682       DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1683             f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1684       if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \
1685             NULLP)
1686       {
1687          break;
1688       }
1689
1690       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\
1691          duCfgParam.duId;
1692
1693       /*DU Name*/
1694       if(duCfgParam.duName != NULL)
1695       {
1696          ieIdx++;
1697          f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name;
1698          f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
1699          f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1700          f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\
1701             strlen((char *)duCfgParam.duName);
1702          DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\
1703                GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1704          if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\
1705                buf == NULLP)
1706          {
1707             break;
1708          }
1709          strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\
1710                choice.GNB_DU_Name.buf,
1711                (char*)&duCfgParam.duName);
1712
1713       }
1714
1715       /*Served Cell list */
1716       ieIdx++;
1717       f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1718                                                      ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1719       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1720       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1721                                                                 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1722       duServedCell = &f1SetupReq->protocolIEs.list.\
1723                      array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
1724       if(BuildServedCellList(duServedCell))
1725       {
1726          break;
1727       }
1728       /*RRC Version*/
1729       ieIdx++;
1730       f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1731                                                      ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1732       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1733       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1734                                                                 F1SetupRequestIEs__value_PR_RRC_Version;
1735       rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
1736       if(BuildRrcVer(rrcVer))
1737       {
1738          break;
1739       }
1740       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1741
1742       /* Encode the F1SetupRequest type as APER */
1743       memset(encBuf, 0, ENC_BUF_MAX_LEN);
1744       encBufSize = 0;
1745       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1746             encBuf);
1747
1748       /* Encode results */
1749       if(encRetVal.encoded == ENCODE_FAIL)
1750       {
1751          DU_LOG("\nERROR  -->  F1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1752                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1753          break;
1754       }
1755       else
1756       {
1757          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1SetupRequest\n");
1758          for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
1759          {
1760             printf("%x",encBuf[ieIdx]);
1761          }
1762       }
1763
1764       /* Sending msg */
1765       if(sendF1APMsg() != ROK)
1766       {
1767          DU_LOG("\nERROR  -->  F1AP : Sending F1 Setup request failed");
1768          break;
1769       }
1770
1771       ret=ROK;
1772       break;
1773    }while(true);
1774
1775    FreeF1SetupReq(f1apMsg);
1776
1777    return ret;
1778 }/* End of BuildAndSendF1SetupReq */
1779
1780 /*******************************************************************
1781  *
1782  * @brief Deallocating memory allocated for Served_Cells_To_Modify_Item_t
1783  *
1784  * @details
1785  *
1786  *    Function : freeCellsToModifyItem 
1787  *
1788  *    Functionality: Deallocating memory of variables allocated in
1789  *                    BuildAndSendDUConfigUpdate function
1790  *
1791  * @params[in]  Served_Cells_To_Modify_Item_t *modifyItem
1792  *
1793  * @return ROK     - void
1794  *
1795  * ****************************************************************/
1796
1797 void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem)
1798 {
1799    uint8_t arrIdx=0,i=0;
1800    ServedPLMNs_Item_t *servedPlmnItem = NULLP;
1801    SliceSupportItem_t *sliceSupportItem = NULLP;
1802
1803    DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf, modifyItem->oldNRCGI.pLMN_Identity.size);
1804    DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf, modifyItem->oldNRCGI.nRCellIdentity.size);
1805
1806    DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1807            modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1808    DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1809          modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
1810
1811    if(modifyItem->served_Cell_Information.servedPLMNs.list.array != NULLP)
1812    {
1813       if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx] != NULLP)
1814       {
1815          servedPlmnItem = modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx];
1816
1817          DU_FREE(servedPlmnItem->pLMN_Identity.buf,servedPlmnItem->pLMN_Identity.size);
1818
1819          if(servedPlmnItem->iE_Extensions != NULLP)
1820          {
1821             if(servedPlmnItem->iE_Extensions->list.array != NULLP)
1822             {
1823                if(servedPlmnItem->iE_Extensions->list.array[arrIdx] != NULLP)
1824                {
1825                   if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array != NULLP)
1826                   {
1827                      if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array[arrIdx] != NULLP)
1828                      {
1829                         sliceSupportItem = modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->iE_Extensions->\
1830                                            list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array[arrIdx];
1831
1832                         DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sliceSupportItem->sNSSAI.sST.size);
1833                         if(sliceSupportItem->sNSSAI.sD != NULLP)
1834                         {
1835                            DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size);
1836                            DU_FREE(sliceSupportItem->sNSSAI.sD,sizeof(OCTET_STRING_t));
1837                         }
1838                         DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
1839                               list.array[arrIdx], sizeof(SliceSupportItem_t));
1840                      }
1841                      DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array,
1842                            servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.size);
1843                   }
1844                }
1845                for(i=0; i < servedPlmnItem->iE_Extensions->list.count ; i++)
1846                {
1847                   DU_FREE(servedPlmnItem->iE_Extensions->list.array[i], sizeof(ServedPLMNs_ItemExtIEs_t ));
1848                }
1849                DU_FREE(servedPlmnItem->iE_Extensions->list.array, servedPlmnItem->iE_Extensions->list.size);
1850             }
1851             DU_FREE(servedPlmnItem->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1852          }
1853       }
1854       for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1855       {
1856          DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i], sizeof(ServedPLMNs_Item_t));
1857       }
1858       DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1859             modifyItem->served_Cell_Information.servedPLMNs.list.size);
1860    }
1861
1862    if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP)
1863    {
1864       if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array != NULLP)
1865       {
1866          DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1867                array[arrIdx], sizeof(FreqBandNrItem_t));
1868          DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array, \
1869                modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1870       }
1871
1872       if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array != NULLP)
1873       {
1874          DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1875              array[arrIdx], sizeof(FreqBandNrItem_t));
1876          DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1877                modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1878       }
1879       DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
1880    }
1881
1882    DU_FREE(modifyItem->served_Cell_Information.measurementTimingConfiguration.buf,\
1883       modifyItem->served_Cell_Information.measurementTimingConfiguration.size);
1884 }
1885
1886 /*******************************************************************
1887  *
1888  * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1889  *
1890  * @details
1891  *
1892  *    Function : FreeDUConfigUpdate
1893  *
1894  *    Functionality: Deallocating memory of variables allocated in
1895  *                    BuildAndSendDUConfigUpdate function
1896  *
1897  * @params[in]  F1AP_PDU_t *f1apDuCfg
1898  *
1899  * @return ROK     - void
1900  *
1901  * ****************************************************************/
1902 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1903 {
1904    uint8_t  ieIdx=0, cellModifyIdx=0, cellDeleteIdx=0;
1905    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
1906    Served_Cells_To_Modify_List_t  *cellsToModify=NULLP;
1907    Served_Cells_To_Delete_List_t  *cellsToDelete=NULLP;
1908    Served_Cells_To_Delete_Item_t  *deleteItem = NULLP;
1909    Served_Cells_To_Delete_ItemIEs_t *deleteItemIe = NULLP;
1910
1911    if(f1apDuCfg != NULLP)
1912    {
1913       if(f1apDuCfg->choice.initiatingMessage != NULLP)
1914       {
1915          duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1916                        value.choice.GNBDUConfigurationUpdate;
1917          if(duCfgUpdate->protocolIEs.list.array != NULLP)
1918          {
1919             for(ieIdx=0; ieIdx<duCfgUpdate->protocolIEs.list.count; ieIdx++)
1920             {
1921                if(duCfgUpdate->protocolIEs.list.array[ieIdx] != NULLP)
1922                {
1923                   switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
1924                   {
1925                      case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
1926                         {
1927                            cellsToModify = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\
1928                                            value.choice.Served_Cells_To_Modify_List;
1929                            if(cellsToModify->list.array != NULLP)
1930                            {
1931                               for(cellModifyIdx=0; cellModifyIdx<cellsToModify->list.count ;cellModifyIdx++)
1932                               {
1933                                  if(cellsToModify->list.array[cellModifyIdx] != NULLP)
1934                                  {
1935                                     freeCellsToModifyItem(&cellsToModify->list.array[cellModifyIdx]->value.choice.\
1936                                           Served_Cells_To_Modify_Item);
1937                                     DU_FREE(cellsToModify->list.array[cellModifyIdx],\
1938                                           sizeof(Served_Cells_To_Modify_ItemIEs_t));
1939                                  }
1940                               }
1941                               DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1942                            }
1943                            break;
1944                         }
1945                      case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
1946                         {
1947                            cellsToDelete = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\
1948                                            value.choice.Served_Cells_To_Delete_List;
1949                            if(cellsToDelete->list.array != NULLP)
1950                            {
1951                               for(cellDeleteIdx=0; cellDeleteIdx<cellsToDelete->list.count ;cellDeleteIdx++)
1952                               {
1953                                  if(cellsToDelete->list.array[cellDeleteIdx] != NULLP)
1954                                  {
1955                                     deleteItemIe = ((Served_Cells_To_Delete_ItemIEs_t*)\
1956                                           cellsToDelete->list.array[cellDeleteIdx]);
1957                                     deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
1958                                     DU_FREE(deleteItem->oldNRCGI.pLMN_Identity.buf,\
1959                                           deleteItem->oldNRCGI.pLMN_Identity.size); 
1960                                     DU_FREE(deleteItem->oldNRCGI.nRCellIdentity.buf,\
1961                                           deleteItem->oldNRCGI.nRCellIdentity.size);
1962                                     DU_FREE(cellsToDelete->list.array[cellDeleteIdx],\
1963                                           sizeof(Served_Cells_To_Delete_ItemIEs_t));
1964                                  }
1965                               }
1966                               DU_FREE(cellsToDelete->list.array,cellsToDelete->list.size);
1967                            }
1968
1969                            break;
1970                         }
1971                      case ProtocolIE_ID_id_gNB_DU_ID:
1972                         {
1973                            DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1974                                  duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1975                            break;
1976                         }
1977                   }
1978                   DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx],\
1979                         sizeof(GNBDUConfigurationUpdateIEs_t));
1980                }
1981             }
1982             DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1983          }
1984          DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1985       }
1986       DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1987    }
1988 }
1989
1990 /*******************************************************************
1991  *
1992  * @brief Fills Served Plmns required in ServCellInfo IE
1993  *
1994  * @details
1995  *
1996  *    Function : fillServedPlmns
1997  *
1998  *    Functionality: Fills Served Plmns required in ServCellInfo IE
1999  *
2000  * @params[in] Pointer to ServedPLMNs_List_t *
2001  *
2002  * @return ROK     - success
2003  *         RFAILED - failure
2004  *
2005  *****************************************************************/
2006
2007 uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
2008 {
2009    uint8_t ieIdx, ieListCnt;
2010
2011    servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
2012    DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\
2013          array[0]->pLMN_Identity.size);
2014    if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP)
2015    {
2016       return RFAILED;
2017    }
2018    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
2019          servedPlmn->list.array[0]->pLMN_Identity.buf);
2020    DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
2021    if(servedPlmn->list.array[0]->iE_Extensions == NULLP)
2022    {
2023       return RFAILED;
2024    }
2025
2026    ieListCnt=1;
2027    servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt;
2028    servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
2029    DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\
2030          iE_Extensions->list.size);
2031    if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP)
2032    {
2033       return RFAILED;
2034    }
2035    for(ieIdx=0;ieIdx<ieListCnt;ieIdx++)
2036    {
2037       DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx],\
2038             sizeof(ServedPLMNs_ItemExtIEs_t));
2039       if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP)
2040       {
2041          return RFAILED;
2042       }
2043    }
2044    //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions; 
2045    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
2046    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore;
2047    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \
2048       ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
2049    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2050       list.count = 1;
2051    servedPlmn->list.array[0]->\
2052       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2053       list.size = sizeof(SliceSupportItem_t *);
2054    DU_ALLOC(servedPlmn->list.array[0]->\
2055          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2056          list.array,servedPlmn->list.array[0]->\
2057          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
2058    if(servedPlmn->list.array[0]->\
2059          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2060          list.array == NULLP)
2061    {
2062       return RFAILED;
2063    }
2064
2065    DU_ALLOC(servedPlmn->list.array[0]->\
2066          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2067          list.array[0],sizeof( SliceSupportItem_t));
2068    if(servedPlmn->list.array[0]->\
2069          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2070          list.array[0] == NULLP)
2071    {
2072       return RFAILED;
2073    }
2074    servedPlmn->list.array[0]->\
2075       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2076       list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
2077    DU_ALLOC(servedPlmn->list.array[0]->\
2078          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2079          list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\
2080          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
2081    if(servedPlmn->list.array[0]->\
2082          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2083          list.array[0]->sNSSAI.sST.buf == NULLP)
2084    {
2085       return RFAILED;
2086    }
2087    servedPlmn->list.array[0]->\
2088       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2089       list.array[0]->sNSSAI.sST.buf[0] = 3;
2090    DU_ALLOC(servedPlmn->list.array[0]->\
2091          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2092          list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
2093    if(servedPlmn->list.array[0]->\
2094          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2095          list.array[0]->sNSSAI.sD == NULLP)
2096    {
2097       return RFAILED;
2098    }
2099    servedPlmn->list.array[0]->\
2100       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2101       list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
2102    DU_ALLOC(servedPlmn->list.array[0]->\
2103          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2104          list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\
2105          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2106          list.array[0]->sNSSAI.sD->size);
2107    if(servedPlmn->list.array[0]->\
2108          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2109          list.array[0]->sNSSAI.sD->buf == NULLP)
2110    {
2111       return RFAILED;
2112    }
2113    servedPlmn->list.array[0]->\
2114       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2115       list.array[0]->sNSSAI.sD->buf[0] = 3;
2116    servedPlmn->list.array[0]->\
2117       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2118       list.array[0]->sNSSAI.sD->buf[1] = 6;
2119    servedPlmn->list.array[0]->\
2120       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
2121       list.array[0]->sNSSAI.sD->buf[2] = 9;
2122    return ROK;
2123 }
2124
2125 /*******************************************************************
2126  *
2127  * @brief Fills Nr Fdd Info required in ServCellInfo IE
2128  *
2129  * @details
2130  *
2131  *    Function : fillNrFddInfo
2132  *
2133  *    Functionality: Fills Nr Fdd Info required in ServCellInfo IE
2134  *
2135  * @params[in] Pointer to NR_Mode_Info_t *
2136  *
2137  * @return ROK     - success
2138  *         RFAILED - failure
2139  *
2140  *****************************************************************/
2141
2142 uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd)
2143 {
2144    nrFdd->choice.fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
2145       f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
2146    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1;
2147    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
2148    DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
2149          array, nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
2150    if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
2151    {
2152       return RFAILED;
2153    }
2154    DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \
2155       sizeof(FreqBandNrItem_t));
2156    if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
2157    {
2158       return RFAILED;
2159    }
2160    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
2161       duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
2162       freqBand[0].nrFreqBand;
2163    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
2164    nrFdd->choice.fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
2165       dlNrFreqInfo.nrArfcn;
2166    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1;
2167    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
2168    DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,nrFdd->\
2169          choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
2170    if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
2171    {
2172       return RFAILED;
2173    }
2174    DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0],\
2175          sizeof(FreqBandNrItem_t));
2176    if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
2177    {
2178       return RFAILED;
2179    }
2180    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
2181       duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
2182       freqBand[0].nrFreqBand;
2183    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
2184    
2185    /*Transmission Bandwidth*/
2186    nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
2187       f1Mode.mode.fdd.ulTxBw.nrScs;
2188    nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
2189       f1Mode.mode.fdd.ulTxBw.nrb;
2190    nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
2191       f1Mode.mode.fdd.dlTxBw.nrScs;
2192    nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
2193       f1Mode.mode.fdd.dlTxBw.nrb;
2194
2195    return ROK;
2196 }
2197
2198 /*******************************************************************
2199  *
2200  * @brief Fills ServCellInfo IE
2201  *
2202  * @details
2203  *
2204  *    Function : fillServedCellInfo
2205  *
2206  *    Functionality: Fills ServCellInfo
2207  *
2208  * @params[in] Pointer to Served_Cell_Information_t *
2209  *
2210  * @return ROK     - success
2211  *         RFAILED - failure
2212  *
2213  *****************************************************************/
2214
2215 uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo)
2216 {
2217    uint8_t tmp, ieIdx, ieListCnt;
2218
2219    /*nRCGI*/
2220    srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
2221    DU_ALLOC(srvCellInfo->nRCGI.pLMN_Identity.buf,\
2222          srvCellInfo->nRCGI.pLMN_Identity.size);
2223    if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP)
2224    {
2225       return RFAILED;
2226    }
2227    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2228          srvCellInfo->nRCGI.pLMN_Identity.buf);
2229    srvCellInfo->nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
2230    DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\
2231          srvCellInfo->nRCGI.nRCellIdentity.size);
2232    if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP)
2233    {
2234       return RFAILED;
2235    }
2236    for (tmp = 0 ; tmp < srvCellInfo->\
2237          nRCGI.nRCellIdentity.size-1 ; tmp++)
2238    {
2239       srvCellInfo->nRCGI.nRCellIdentity.buf[tmp] = 0;
2240    }
2241    srvCellInfo->nRCGI.nRCellIdentity.buf[4] = 16;
2242    srvCellInfo->nRCGI.nRCellIdentity.bits_unused =4;
2243
2244    /*nRPCI*/
2245    srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
2246
2247    /*servedPLMNs*/
2248    ieListCnt = 1;
2249    srvCellInfo->servedPLMNs.list.count = ieListCnt;
2250    srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *);
2251    DU_ALLOC(srvCellInfo->servedPLMNs.list.array,\
2252          srvCellInfo->servedPLMNs.list.size);
2253    if(srvCellInfo->servedPLMNs.list.array == NULLP)
2254    {
2255       return RFAILED;
2256    }
2257    for(ieIdx=0; ieIdx < ieListCnt; ieIdx++)
2258    {
2259       DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx],\
2260             sizeof(ServedPLMNs_Item_t));
2261       if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP)
2262       {
2263          return RFAILED;
2264       }
2265    }
2266    if(fillServedPlmns(&srvCellInfo->servedPLMNs))
2267    {
2268       return RFAILED;
2269    }
2270
2271    /*nR Mode Info with FDD*/
2272    srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD;
2273    DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD,\
2274          sizeof(FDD_Info_t));
2275    if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP)
2276    {
2277       return RFAILED;
2278    }
2279    if(fillNrFddInfo(&srvCellInfo->nR_Mode_Info))
2280       return RFAILED;
2281
2282    /*Measurement timing Config*/
2283    srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t);
2284    DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\
2285          buf,srvCellInfo->measurementTimingConfiguration.size);
2286    if(srvCellInfo->measurementTimingConfiguration.buf == NULLP)
2287    {
2288       return RFAILED;
2289    }
2290    srvCellInfo->measurementTimingConfiguration.\
2291          buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
2292
2293    return ROK;
2294 }
2295
2296 /*******************************************************************
2297  *
2298  * @brief Fills ServCellToModItem IE
2299  *
2300  * @details
2301  *
2302  *    Function : fillServCellToModItem
2303  *
2304  *    Functionality: Fills ServCellToModItem IE
2305  *
2306  * @params[in] Pointer to Served_Cells_To_Modify_Item_t *
2307  *
2308  * @return ROK     - success
2309  *         RFAILED - failure
2310  *
2311  *****************************************************************/
2312
2313 uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem)
2314 {
2315    uint8_t ieIdx;
2316
2317    /*pLMN_Identity*/
2318    modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
2319    DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
2320    if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
2321    {
2322       return RFAILED;
2323    }
2324    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2325          modifyItem->oldNRCGI.pLMN_Identity.buf);
2326
2327    /*nRCellIdentity*/
2328    modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
2329    DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
2330          modifyItem->oldNRCGI.nRCellIdentity.size);
2331    if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
2332    {
2333       return RFAILED;
2334    }
2335    for(ieIdx = 0; ieIdx < modifyItem->oldNRCGI.nRCellIdentity.size-1; ieIdx++)
2336    {
2337       modifyItem->oldNRCGI.nRCellIdentity.buf[ieIdx] = 0;
2338    }
2339    modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
2340    modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
2341
2342    if(fillServedCellInfo(&modifyItem->served_Cell_Information))
2343       return RFAILED;
2344    else
2345       return ROK;
2346 }
2347
2348 /*******************************************************************
2349  *
2350  * @brief Builds ServCellToModList
2351  *
2352  * @details
2353  *
2354  *    Function : buildServCellToModList
2355  *
2356  *    Functionality: Builds the serv cell to Mod List
2357  *
2358  * @params[in] Pointer to Served_Cells_To_Modify_List_t *
2359  *
2360  * @return ROK     - success
2361  *         RFAILED - failure
2362  *
2363  *****************************************************************/
2364
2365 uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify)
2366 {
2367    uint8_t ieListCnt, ieIdx;
2368    Served_Cells_To_Modify_Item_t *modifyItem = NULLP;
2369
2370    ieListCnt = 1;
2371    cellsToModify->list.count = ieListCnt;
2372    cellsToModify->list.size = ieListCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
2373    DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
2374    if(cellsToModify->list.array == NULLP)
2375    {
2376       return RFAILED;
2377    }
2378    for(ieIdx=0; ieIdx< ieListCnt; ieIdx++)
2379    {
2380       DU_ALLOC(cellsToModify->list.array[ieIdx],sizeof(Served_Cells_To_Modify_ItemIEs_t));
2381       if(cellsToModify->list.array[ieIdx] == NULLP)
2382       {
2383          return RFAILED;
2384       }
2385    }
2386    cellsToModify->list.array[0]->id = ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
2387    cellsToModify->list.array[0]->criticality = Criticality_reject;
2388    cellsToModify->list.array[0]->value.present =\
2389       Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
2390    modifyItem=&cellsToModify->list.array[0]->value.choice.Served_Cells_To_Modify_Item;
2391
2392    if(fillServCellToModItem(modifyItem))
2393       return RFAILED;
2394    else
2395       return ROK;
2396 }
2397 /*******************************************************************
2398  *
2399  * @brief filling the DeleteItemList
2400  *
2401  * @details
2402  *
2403  *    Function : fillCellToDeleteItem 
2404  *
2405  *    Functionality: Filling the DeleteItemIe 
2406  *
2407  * @params[in] Pointer to Served_Cells_To_Delete_ItemIEs_t 
2408  *
2409  * @return ROK     - success
2410  *         RFAILED - failure
2411  *
2412  *****************************************************************/
2413 uint8_t fillCellToDeleteItem(struct Served_Cells_To_Delete_ItemIEs *deleteItemIe)
2414 {
2415    uint8_t arrIdx;
2416    Served_Cells_To_Delete_Item_t *deleteItem=NULLP;
2417    
2418    deleteItemIe->id = ProtocolIE_ID_id_Served_Cells_To_Delete_Item;
2419    deleteItemIe->criticality = Criticality_reject;
2420    deleteItemIe->value.present =\
2421    Served_Cells_To_Delete_ItemIEs__value_PR_Served_Cells_To_Delete_Item;
2422    deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
2423
2424    /*pLMN_Identity*/
2425    deleteItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
2426    DU_ALLOC(deleteItem->oldNRCGI.pLMN_Identity.buf,deleteItem->oldNRCGI.pLMN_Identity.size);
2427    if(deleteItem->oldNRCGI.pLMN_Identity.buf == NULLP)
2428    {
2429       DU_LOG("ERROR  --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory");
2430       return RFAILED;
2431    }
2432    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2433          deleteItem->oldNRCGI.pLMN_Identity.buf);
2434
2435    /*nRCellIdentity*/
2436    deleteItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
2437    DU_ALLOC(deleteItem->oldNRCGI.nRCellIdentity.buf,\
2438          deleteItem->oldNRCGI.nRCellIdentity.size);
2439    if(deleteItem->oldNRCGI.nRCellIdentity.buf == NULLP)
2440    {
2441       DU_LOG("ERROR  --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory");
2442       return RFAILED;
2443    }
2444    for(arrIdx = 0; arrIdx < deleteItem->oldNRCGI.nRCellIdentity.size-1; arrIdx++)
2445    {
2446       deleteItem->oldNRCGI.nRCellIdentity.buf[arrIdx] = 0;
2447    }
2448    deleteItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
2449    deleteItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
2450    return ROK;
2451
2452 /*******************************************************************
2453  *
2454  * @brief Builds ServCellToDeleteList
2455  *
2456  * @details
2457  *
2458  *    Function : buildServCellToDeleteList
2459  *
2460  *    Functionality: Builds the serv cell to delete List
2461  *
2462  * @params[in] Pointer to Served_Cells_To_Delete_List_t *
2463  *
2464  * @return ROK     - success
2465  *         RFAILED - failure
2466  *
2467  *****************************************************************/
2468  
2469 uint8_t buildServCellToDeleteList(Served_Cells_To_Delete_List_t *cellsToDelete)
2470 {
2471    uint8_t ieListCnt, arrIdx;
2472    
2473    ieListCnt = 1;
2474    cellsToDelete->list.count = ieListCnt;
2475    cellsToDelete->list.size = ieListCnt*sizeof(Served_Cells_To_Delete_ItemIEs_t *);
2476    
2477    DU_ALLOC(cellsToDelete->list.array,cellsToDelete->list.size);
2478    if(cellsToDelete->list.array == NULLP)
2479    {
2480       DU_LOG("\nERROR  --> F1AP : buildServCellToDeleteList(): Memory allocation failed");
2481       return RFAILED;
2482    }
2483    
2484    for(arrIdx=0; arrIdx< ieListCnt; arrIdx++)
2485    {
2486       DU_ALLOC(cellsToDelete->list.array[arrIdx],sizeof(Served_Cells_To_Delete_ItemIEs_t));
2487       if(cellsToDelete->list.array[arrIdx] == NULLP)
2488       {
2489          DU_LOG("\nERROR  --> F1AP : buildServCellToDeleteList(): Memory allocation failed");
2490          return RFAILED;
2491       }
2492    }
2493    
2494    arrIdx=0;
2495    if(fillCellToDeleteItem((Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx]) !=ROK)
2496    {
2497       DU_LOG("\nERROR  -->  F1AP: buildServCellToDeleteList(): failed to fill Served_Cells_To_Delete_ItemIEs");
2498       return RFAILED;
2499    }
2500    return ROK;
2501 }
2502
2503 /*******************************************************************
2504  *
2505  * @brief Builds and sends the DUConfigUpdate
2506  *
2507  * @details
2508  *
2509  *    Function : BuildAndSendDUConfigUpdate
2510  *
2511  *    Functionality: Constructs the DU Update message and sends
2512  *                   it to the CU through SCTP.
2513  *
2514  * @params[in] void **buf,Buffer to which encoded pattern is written into
2515  * @params[in] int *size,size of buffer
2516  *
2517  * @return ROK     - success
2518  *         RFAILED - failure
2519  *
2520  * ****************************************************************/
2521 uint8_t BuildAndSendDUConfigUpdate(ServCellAction servCellAction)
2522 {
2523    uint8_t ret =0, ieIdx=0, elementCnt=0;
2524    bool memAlloctionFailure = false;
2525    F1AP_PDU_t                 *f1apDuCfg = NULLP;
2526    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
2527    asn_enc_rval_t encRetVal;     /* Encoder return value */
2528    
2529    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2530    ret= RFAILED;
2531
2532    while(true)
2533    {
2534       DU_LOG("\nINFO   -->  F1AP : Building DU config update\n");
2535       /* Allocate the memory for F1DuCfg */
2536       DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
2537       if(f1apDuCfg == NULLP)
2538       {
2539          DU_LOG("\nERROR  -->  F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed");
2540          break;
2541       }
2542
2543       f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
2544       DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2545       if(f1apDuCfg->choice.initiatingMessage == NULLP)
2546       {
2547          DU_LOG("\nERROR  -->  F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed");
2548          break;
2549       }
2550
2551       f1apDuCfg->choice.initiatingMessage->procedureCode = \
2552                                                            ProcedureCode_id_gNBDUConfigurationUpdate;
2553       f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
2554       f1apDuCfg->choice.initiatingMessage->value.present = \
2555                                                            InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
2556       duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
2557                     choice.GNBDUConfigurationUpdate;
2558       elementCnt = 3;
2559       duCfgUpdate->protocolIEs.list.count = elementCnt;
2560       duCfgUpdate->protocolIEs.list.size = \
2561                                            elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
2562
2563       /* Initialize the F1Setup members */
2564       DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
2565       if(duCfgUpdate->protocolIEs.list.array == NULLP)
2566       {
2567          DU_LOG("ERROR  -->  F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed");
2568          break;
2569       }
2570       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
2571       {
2572          DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t));
2573          if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP)
2574          {
2575             DU_LOG("ERROR  -->  F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed");
2576             memAlloctionFailure = true;
2577             break;
2578          }
2579       }
2580       
2581       if(memAlloctionFailure == true)
2582       {
2583          break;
2584       }
2585       /*TransactionID*/
2586       ieIdx = 0;
2587       duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID;
2588       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
2589       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2590       GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
2591       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID;
2592       
2593       ieIdx++;
2594       if(servCellAction == SERV_CELL_TO_MODIFY)
2595       {
2596          /*Served Cell to Modify */
2597          duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
2598          ProtocolIE_ID_id_Served_Cells_To_Modify_List;
2599          duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
2600          duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2601          GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
2602          if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
2603                   Served_Cells_To_Modify_List))
2604          {
2605             DU_LOG("ERROR  --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToModList");
2606             break;
2607          }
2608       }
2609       else
2610       {
2611          /*Served Cell to Delete */ 
2612          duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
2613          ProtocolIE_ID_id_Served_Cells_To_Delete_List;
2614          duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
2615          duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2616          GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Delete_List;
2617          if(buildServCellToDeleteList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
2618          Served_Cells_To_Delete_List)!=ROK)
2619          {
2620             DU_LOG("ERROR  --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToDeleteList");
2621             break;
2622          }
2623          
2624       }
2625       // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
2626       /*GNB DU ID */
2627       ieIdx++;
2628       duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
2629       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
2630       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2631       GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
2632       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t);
2633       DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
2634             duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
2635       if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP)
2636       {
2637          DU_LOG("ERROR  --> DU APP : BuildAndSendDUConfigUpdate(): Memory allocation failed for GNB_DU_ID");
2638          break;
2639       }
2640       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId;
2641
2642       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
2643
2644       /* Encode the DU Config Update type as APER */
2645       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2646       encBufSize = 0;
2647       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
2648
2649       /* Checking encode results */
2650       if(encRetVal.encoded == ENCODE_FAIL)
2651       {
2652          DU_LOG("ERROR  -->  F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\
2653                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2654          break;
2655       }
2656       else
2657       {
2658          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for DUConfigUpdate\n");
2659          for(ieIdx =0; ieIdx < encBufSize; ieIdx++)
2660          {
2661             printf("%x",encBuf[ieIdx]);
2662          }
2663       }
2664       /* Sending msg */
2665       if(sendF1APMsg() != ROK)
2666       {
2667          DU_LOG("\nERROR  -->  F1AP : Sending GNB-DU Config Update failed");
2668          break;
2669       }
2670
2671       ret = ROK;
2672       break;
2673    }
2674   
2675    addToReservedF1apPduList(TRANS_ID,f1apDuCfg);
2676    return ret;
2677 }
2678
2679
2680 /*******************************************************************
2681  *
2682  * @brief free the ULRRCMessageTransfer
2683  *
2684  * @details
2685  *
2686  *    Function : FreeULRRCMessageTransfer
2687  *
2688  *    Functionality: Deallocating the memory of variable allocated in
2689  *                      FreeULRRCMessageTransfer
2690  *
2691  * @params[in]
2692  *
2693  * @return ROK     - void
2694  *
2695  ******************************************************************/
2696 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
2697 {
2698    uint8_t idx1;
2699    ULRRCMessageTransfer_t  *ulRRCMsg;
2700
2701    if(f1apMsg != NULLP)
2702    { 
2703       if(f1apMsg->choice.initiatingMessage != NULLP)
2704       {
2705          ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2706          if(ulRRCMsg->protocolIEs.list.array != NULLP)
2707          {
2708             for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
2709             {
2710                if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
2711                {
2712                   if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
2713                         ULRRCMessageTransferIEs__value_PR_RRCContainer)
2714                   {
2715                      DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2716                            ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2717                   }
2718                   DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
2719                }
2720             }
2721             DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
2722          }
2723          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2724       }
2725       DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2726    }
2727 }
2728 /*******************************************************************
2729  *
2730  * @brief Builds and sends the ULRRCMessageTransfer 
2731  *
2732  * @details
2733  *
2734  *    Function : BuildAndSendULRRCMessageTransfer
2735  *
2736  *    Functionality: Constructs the UL RRC Message Transfer and sends
2737  *                   it to the CU through SCTP.
2738  *
2739  * @params[in] 
2740  *
2741  * @return ROK     - success
2742  *         RFAILED - failure
2743  *
2744  * ****************************************************************/
2745 uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb  ueCb, uint8_t lcId, \
2746       uint16_t msgLen, uint8_t *rrcMsg)
2747 {
2748    uint8_t   elementCnt =0;
2749    uint8_t   idx1 =0;
2750    uint8_t   idx =0;
2751    F1AP_PDU_t                   *f1apMsg = NULLP;
2752    ULRRCMessageTransfer_t       *ulRRCMsg = NULLP;
2753    asn_enc_rval_t               encRetVal;        /* Encoder return value */
2754    uint8_t ret =RFAILED;
2755    
2756    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2757
2758    while(true)
2759    {
2760       DU_LOG("\n INFO   -->  F1AP : Building UL RRC Message Transfer Message\n");
2761
2762       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2763       if(f1apMsg == NULLP)
2764       {
2765          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
2766          break;
2767       }
2768       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2769       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2770       if(f1apMsg->choice.initiatingMessage == NULLP)
2771       {
2772          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
2773          break;
2774       }
2775       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
2776       f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2777       f1apMsg->choice.initiatingMessage->value.present = \
2778                                                          InitiatingMessage__value_PR_ULRRCMessageTransfer;
2779       ulRRCMsg =
2780          &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2781       elementCnt = 4;
2782       ulRRCMsg->protocolIEs.list.count = elementCnt;
2783       ulRRCMsg->protocolIEs.list.size = \
2784                                         elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
2785
2786       /* Initialize the F1Setup members */
2787       DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
2788       if(ulRRCMsg->protocolIEs.list.array == NULLP)
2789       {
2790          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
2791          break;
2792       }
2793       for(idx=0; idx<elementCnt; idx++)
2794       {
2795          DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
2796          if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2797          {
2798             break;
2799          }
2800       }
2801
2802       idx1 = 0;
2803
2804       /*GNB CU UE F1AP ID*/
2805       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2806       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2807       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2808                                                               ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2809       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
2810
2811       /*GNB DU UE F1AP ID*/
2812       idx1++;
2813       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2814       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2815       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2816                                                               ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2817       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
2818
2819       /*SRBID*/
2820       idx1++;
2821       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
2822       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2823       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2824                                                               ULRRCMessageTransferIEs__value_PR_SRBID;
2825       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
2826
2827       /*RRCContainer*/
2828       idx1++;
2829       ulRRCMsg->protocolIEs.list.array[idx1]->id  = ProtocolIE_ID_id_RRCContainer;
2830       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2831       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2832                                                               ULRRCMessageTransferIEs__value_PR_RRCContainer;
2833       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
2834       DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2835             ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
2836       if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
2837       {
2838          DU_LOG(" ERROR  -->  F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
2839          break;
2840       }
2841       memset(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, 0, msgLen);
2842       memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
2843             rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2844
2845       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2846
2847       /* Encode the F1SetupRequest type as APER */
2848       memset(encBuf, 0, ENC_BUF_MAX_LEN);
2849       encBufSize = 0;
2850       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2851             encBuf);
2852       /* Encode results */
2853       if(encRetVal.encoded == ENCODE_FAIL)
2854       {
2855          DU_LOG( "\nERROR  -->  F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2856                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2857          break;
2858       }
2859       else
2860       {
2861          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2862          for(int i=0; i< encBufSize; i++)
2863          {
2864             printf("%x",encBuf[i]);
2865          }
2866       }
2867
2868       /* Sending  msg  */
2869       if(sendF1APMsg()  !=      ROK)
2870       {
2871          DU_LOG("\nERROR  -->   F1AP : Sending  UL RRC Message Transfer Failed");
2872          break;
2873       }
2874       ret = ROK;
2875       break;
2876    }
2877    FreeULRRCMessageTransfer(f1apMsg);
2878
2879    return ret;
2880 }/* End of BuildAndSendULRRCMessageTransfer*/
2881
2882 /*******************************************************************
2883  *
2884  * @brief Builds tag config 
2885  *
2886  * @details
2887  *
2888  *    Function : BuildTagConfig 
2889  *
2890  *    Functionality: Builds tag config in MacCellGroupConfig
2891  *
2892  * @params[in] TAG_Config *tag_Config
2893  *
2894  * @return ROK     - success
2895  *         RFAILED - failure
2896  *
2897  * ****************************************************************/
2898 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2899 {
2900    struct TAG_Config__tag_ToAddModList *tagList;
2901    uint8_t                     idx, elementCnt;
2902
2903    tagConfig->tag_ToReleaseList = NULLP;
2904    tagConfig->tag_ToAddModList = NULLP;
2905    DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2906    if(!tagConfig->tag_ToAddModList)
2907    {
2908       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2909       return RFAILED;
2910    }
2911
2912    elementCnt = 1; //ODU_VALUE_ONE;
2913    tagList = tagConfig->tag_ToAddModList;
2914    tagList->list.count = elementCnt;
2915    tagList->list.size  =  elementCnt * sizeof(struct TAG *);
2916
2917    tagList->list.array = NULLP;
2918    DU_ALLOC(tagList->list.array, tagList->list.size);
2919    if(!tagList->list.array)
2920    {
2921       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2922       return RFAILED;
2923    }
2924
2925    for(idx=0; idx<tagList->list.count; idx++)
2926    {
2927       tagList->list.array[idx] = NULLP;
2928       DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2929       if(!tagList->list.array[idx])
2930       {
2931          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2932          return RFAILED;
2933       }
2934    }
2935
2936    idx = 0;
2937    tagList->list.array[idx]->tag_Id = TAG_ID;
2938    tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2939
2940    return ROK;
2941 }
2942
2943 /*******************************************************************
2944  *
2945  * @brief Builds PHR Config 
2946  *
2947  * @details
2948  *
2949  *    Function : BuildPhrConfig
2950  *
2951  *    Functionality: Builds phrConfig in MacCellGroupConfig
2952  *
2953  * @params[in] PHR Config *
2954  *
2955  * @return ROK     - success
2956  *         RFAILED - failure
2957  *
2958  * ****************************************************************/
2959 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2960 {
2961
2962    phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2963    phrConfig->choice.setup = NULLP;
2964    DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2965    if(!phrConfig->choice.setup)
2966    {
2967       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildPhrConfig");
2968       return RFAILED;
2969    }
2970
2971    phrConfig->choice.setup->phr_PeriodicTimer        = PHR_PERIODIC_TMR;
2972    phrConfig->choice.setup->phr_ProhibitTimer        = PHR_PROHIBHIT_TMR;
2973    phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2974    phrConfig->choice.setup->multiplePHR              = false;
2975    phrConfig->choice.setup->dummy                    = false;
2976    phrConfig->choice.setup->phr_Type2OtherCell       = false;
2977    phrConfig->choice.setup->phr_ModeOtherCG          = PHR_MODE_OTHER_CG;
2978
2979    return ROK;
2980 }
2981
2982 /*******************************************************************
2983  *
2984  * @brief Builds BSR Config 
2985  *
2986  * @details
2987  *
2988  *    Function : BuildBsrConfig
2989  *
2990  *    Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2991  *
2992  * @params[in] BSR_Config *bsrConfig
2993  *
2994  * @return ROK     - success
2995  *         RFAILED - failure
2996  *
2997  * ****************************************************************/
2998 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2999 {
3000    bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
3001    bsrConfig->retxBSR_Timer     = RETX_BSR_TMR;
3002    bsrConfig->logicalChannelSR_DelayTimer = NULLP;
3003
3004    return ROK;
3005 }
3006
3007 /*******************************************************************
3008  *
3009  * @brief Builds scheduling request config 
3010  *
3011  * @details
3012  *
3013  *    Function : BuildSchedulingReqConfig 
3014  *
3015  *    Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
3016  *
3017  * @params[in] SchedulingRequestConfig *schedulingRequestConfig
3018  *
3019  * @return ROK     - success
3020  *         RFAILED - failure
3021  *
3022  * ****************************************************************/
3023 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
3024 {
3025    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
3026    uint8_t                     idx, elementCnt;
3027
3028    schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
3029    DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
3030          sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
3031    if(!schedulingRequestConfig->schedulingRequestToAddModList)
3032    {
3033       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
3034       return RFAILED;
3035    }
3036
3037    elementCnt = 1; //ODU_VALUE_ONE;
3038    schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
3039    schReqList->list.count = elementCnt;
3040    schReqList->list.size  = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
3041
3042    schReqList->list.array = NULLP;
3043    DU_ALLOC(schReqList->list.array, schReqList->list.size);
3044    if(!schReqList->list.array)
3045    {
3046       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
3047       return RFAILED;
3048    }
3049
3050    for(idx=0;idx<schReqList->list.count; idx++)
3051    {
3052       schReqList->list.array[idx] = NULLP;
3053       DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
3054       if(!schReqList->list.array[idx])
3055       {
3056          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
3057          return RFAILED;
3058       }
3059    }
3060
3061    idx = 0;
3062    schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
3063
3064    schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
3065    DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
3066    if(!schReqList->list.array[idx]->sr_ProhibitTimer)
3067    {
3068       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
3069       return RFAILED;
3070    }
3071    *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
3072    schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
3073    schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
3074
3075    return ROK;
3076 }
3077
3078 /*******************************************************************
3079  *
3080  * @brief Builds RLC Config
3081  *
3082  * @details
3083  *
3084  *    Function : BuildRlcConfig
3085  *
3086  *    Functionality: Builds RLC Config in BuildRlcBearerToAddModList 
3087  *
3088  * @params[in] RLC_Config *rlcConfig
3089  *
3090  * @return ROK     - success
3091  *         RFAILED - failure
3092  *
3093  * ****************************************************************/
3094 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
3095 {
3096
3097    rlcConfig->present = RLC_Config_PR_am;
3098
3099    rlcConfig->choice.am = NULLP;
3100    DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
3101    if(!rlcConfig->choice.am)
3102    {
3103       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
3104       return RFAILED;
3105    }
3106
3107    /* UL */
3108    rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
3109    DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
3110    if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
3111    {
3112       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
3113       return RFAILED;
3114    }
3115    *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
3116    rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit  = T_POLL_RETRANSMIT;
3117    rlcConfig->choice.am->ul_AM_RLC.pollPDU           = POLL_PDU;
3118    rlcConfig->choice.am->ul_AM_RLC.pollByte          = POLL_BYTE;
3119    rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold  = MAX_RETX_THRESHOLD;
3120
3121    /* DL */
3122    rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
3123    DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
3124    if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
3125    {
3126       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
3127       return RFAILED;
3128    }
3129    *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
3130    rlcConfig->choice.am->dl_AM_RLC.t_Reassembly      = T_REASSEMBLY;
3131    rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit  = T_STATUS_PROHIBHIT;
3132
3133    return ROK;
3134 }
3135
3136 /*******************************************************************
3137  *
3138  * @brief Builds MAC LC Config
3139  *
3140  * @details
3141  *
3142  *    Function : BuildMacLCConfig 
3143  *
3144  *    Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList 
3145  *
3146  * @params[in] struct LogicalChannelConfig macLcConfig
3147  *
3148  * @return ROK     - success
3149  *         RFAILED - failure
3150  *
3151  * ****************************************************************/
3152 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
3153 {
3154
3155    macLcConfig->ul_SpecificParameters = NULLP;
3156    DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
3157    if(!macLcConfig->ul_SpecificParameters)
3158    {
3159       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
3160       return RFAILED;
3161    }
3162
3163    macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
3164    macLcConfig->ul_SpecificParameters->prioritisedBitRate =     PRIORTISIED_BIT_RATE;
3165    macLcConfig->ul_SpecificParameters->bucketSizeDuration =     BUCKET_SIZE_DURATION;
3166    macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
3167    macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
3168    macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
3169    macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
3170
3171    macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
3172    DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup,    sizeof(long));
3173    if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
3174    {
3175       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
3176       return RFAILED;
3177    }
3178    *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
3179
3180    macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
3181    DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID,    sizeof(SchedulingRequestId_t));
3182    if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
3183    {
3184       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
3185       return RFAILED;
3186    }
3187    *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
3188
3189    macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
3190    macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
3191    macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
3192
3193    return ROK;
3194 }
3195
3196 /*******************************************************************
3197  *
3198  * @brief Builds RLC Bearer to Add/Mod list
3199  *
3200  * @details
3201  *
3202  *    Function :BuildRlcBearerToAddModList 
3203  *
3204  *    Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
3205  *
3206  * @params[in] rlc_BearerToAddModList
3207  *
3208  * @return ROK     - success
3209  *         RFAILED - failure
3210  *
3211  * ****************************************************************/
3212 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
3213 {
3214    uint8_t                     idx, elementCnt;
3215
3216    elementCnt = 1;
3217    rlcBearerList->list.count = elementCnt;
3218    rlcBearerList->list.size  = elementCnt * sizeof(struct RLC_BearerConfig *);
3219
3220    rlcBearerList->list.array = NULLP;
3221    DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
3222    if(!rlcBearerList->list.array)
3223    {
3224       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3225       return RFAILED;
3226    }
3227
3228    for(idx=0; idx<rlcBearerList->list.count; idx++)
3229    {
3230       rlcBearerList->list.array[idx] = NULLP;
3231       DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
3232       if(!rlcBearerList->list.array[idx])
3233       {
3234          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3235          return RFAILED;
3236       }
3237    }
3238
3239    idx = 0;
3240    rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
3241
3242    DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \
3243       sizeof(struct RLC_BearerConfig__servedRadioBearer));
3244    if(!rlcBearerList->list.array[idx]->servedRadioBearer)
3245    {
3246       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3247       return RFAILED;
3248    }
3249
3250    rlcBearerList->list.array[idx]->servedRadioBearer->present = \
3251       RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
3252    rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \
3253       SRB1_LCID;
3254
3255    rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
3256    rlcBearerList->list.array[idx]->rlc_Config = NULLP;
3257    DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
3258    if(!rlcBearerList->list.array[idx]->rlc_Config)
3259    {
3260       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3261       return RFAILED;
3262    }
3263
3264    if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
3265    {
3266       DU_LOG("\nERROR  -->  F1AP : BuildRlcConfig failed");
3267       return RFAILED;
3268    }
3269
3270    rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
3271    DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \
3272       sizeof(struct LogicalChannelConfig));
3273    if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
3274    {
3275       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
3276       return RFAILED;
3277    }
3278
3279    if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
3280    {
3281       DU_LOG("\nERROR  -->  F1AP : BuildMacLCConfig failed");
3282       return RFAILED;
3283    }
3284
3285    return ROK;
3286 }
3287
3288 /*******************************************************************
3289  *
3290  * @brief Build Control resource set to add/modify list 
3291  *
3292  * @details
3293  *
3294  *    Function : BuildControlRSetToAddModList
3295  *
3296  *    Functionality: Build Control resource set to add/modify list
3297  *
3298  * @params[in] 
3299  * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3300  *
3301  * @return ROK     - success
3302  *         RFAILED - failure
3303  *
3304  * ****************************************************************/
3305    uint8_t BuildControlRSetToAddModList
3306 (
3307  struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3308  )
3309 {
3310    uint8_t idx;
3311    uint8_t elementCnt;
3312    uint8_t numBytes, bitsUnused;
3313    struct ControlResourceSet *controlRSet;
3314    uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3315    uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3316
3317
3318    elementCnt = 1;
3319    controlRSetList->list.count = elementCnt;
3320    controlRSetList->list.size = \
3321                                 elementCnt * sizeof(struct ControlResourceSet *);
3322
3323    controlRSetList->list.array = NULLP;
3324    DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3325    if(!controlRSetList->list.array)
3326    {
3327       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3328       return RFAILED;
3329    }
3330
3331    for(idx = 0; idx < elementCnt; idx++)
3332    {
3333       controlRSetList->list.array[idx] = NULLP;
3334       DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3335       if(!controlRSetList->list.array[idx])
3336       {
3337          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3338          return RFAILED;
3339       }
3340    }
3341
3342    idx=0;
3343    controlRSet = controlRSetList->list.array[idx];
3344
3345    controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3346
3347    /* size 6 bytes
3348     * 3 LSBs unsued
3349     * Bit string stored ff0000000000
3350     */
3351    numBytes = 6;
3352    bitsUnused = 3;
3353    controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3354
3355    controlRSet->frequencyDomainResources.buf = NULLP;
3356    DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3357          controlRSet->frequencyDomainResources.size);
3358    if(!controlRSet->frequencyDomainResources.buf)
3359    {
3360       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3361       return RFAILED;
3362    }
3363
3364    memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3365    coreset0EndPrb = CORESET0_END_PRB;
3366    coreset1StartPrb = coreset0EndPrb + 6;
3367    coreset1NumPrb = CORESET1_NUM_PRB;
3368    /* calculate the PRBs */
3369    freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3370    memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3371    controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3372
3373    controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3374    controlRSet->cce_REG_MappingType.present = \
3375                                               ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3376
3377    controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3378    controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3379    controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3380    controlRSet->tci_PresentInDCI = NULLP;
3381 #if 0
3382    uint8_t tciStateIdx;
3383
3384    DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3385          sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3386    if(!controlRset->tci_StatesPDCCH_ToAddList)
3387    {
3388       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3389       return RFAILED;
3390    }
3391
3392    elementCnt = 1;
3393    controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3394    controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3395    DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3396          controlRset->tci_StatesPDCCH_ToAddList->list.size)
3397       if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3398       {
3399          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3400          return RFAILED;
3401       }
3402
3403    for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3404    {
3405       DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3406       if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3407       {
3408          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3409          return RFAILED;
3410       }
3411    }
3412
3413    tciStateIdx = 0;
3414    /* TODO */
3415    *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3416
3417    DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3418    if(!controlRset->tci_PresentInDCI)
3419    {
3420       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3421       return RFAILED;
3422    }
3423    /* TODO */
3424    *(controlRset->tci_PresentInDCI);
3425 #endif
3426
3427    controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3428    DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3429    if(!controlRSet->pdcch_DMRS_ScramblingID)
3430    {
3431       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3432       return RFAILED;
3433    }
3434    *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3435
3436    return ROK;
3437 } /* End BuildControlRSetToAddModList */
3438
3439 /*******************************************************************
3440  *
3441  * @brief Build search space to add/modify list
3442  *
3443  * @details
3444  *
3445  *    Function : BuildSearchSpcToAddModList
3446  *
3447  *    Functionality: Build search space to add/modify list
3448  *
3449  * @params[in] 
3450  * @return ROK     - success
3451  *         RFAILED - failure
3452  *
3453  * ****************************************************************/
3454    uint8_t BuildSearchSpcToAddModList
3455 (
3456  struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3457  )
3458 {
3459    uint8_t idx;
3460    uint8_t numBytes;
3461    uint8_t byteIdx;
3462    uint8_t bitsUnused;
3463    uint8_t elementCnt;
3464    struct SearchSpace *searchSpc;
3465
3466    elementCnt = 1;
3467    searchSpcList->list.count = elementCnt;
3468    searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3469
3470    searchSpcList->list.array = NULLP;
3471    DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3472    if(!searchSpcList->list.array)
3473    {
3474       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3475       return RFAILED;
3476    }
3477
3478    for(idx = 0; idx < elementCnt; idx++)
3479    {
3480       searchSpcList->list.array[idx] = NULLP;
3481       DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3482       if(!searchSpcList->list.array[idx])
3483       {
3484          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3485          return RFAILED;
3486       }
3487    }
3488
3489    idx = 0;
3490    searchSpc = searchSpcList->list.array[idx];
3491
3492    searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3493
3494    searchSpc->controlResourceSetId = NULLP;
3495    DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3496    if(!searchSpc->controlResourceSetId)
3497    {
3498       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3499       return RFAILED;
3500    }
3501    *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3502
3503    searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3504    DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3505          sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3506    if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3507    {
3508       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3509       return RFAILED;
3510    }
3511    searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3512                                                             SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3513
3514    searchSpc->duration = NULLP;
3515    searchSpc->monitoringSymbolsWithinSlot = NULLP;
3516    DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3517    if(!searchSpc->monitoringSymbolsWithinSlot)
3518    {
3519       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3520       return RFAILED;
3521    }
3522
3523    /* Values taken from reference logs :
3524     * size 2 bytes
3525     * 2 LSBs unsued
3526     * Bit string stores 8000
3527     */
3528    numBytes = 2;
3529    bitsUnused = 2;
3530
3531    searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3532    searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3533    DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3534          searchSpc->monitoringSymbolsWithinSlot->size);
3535    if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3536    {
3537       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3538       return RFAILED;
3539    }
3540
3541    byteIdx = 0;
3542    searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3543                                                             PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3544    searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3545    searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3546
3547    searchSpc->nrofCandidates = NULLP;
3548    DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3549    if(!searchSpc->nrofCandidates)
3550    {
3551       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3552       return RFAILED;
3553    }
3554
3555    searchSpc->nrofCandidates->aggregationLevel1 = \
3556                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3557    searchSpc->nrofCandidates->aggregationLevel2 = \
3558                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3559    searchSpc->nrofCandidates->aggregationLevel4 = \
3560                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3561    searchSpc->nrofCandidates->aggregationLevel8 = \
3562                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3563    searchSpc->nrofCandidates->aggregationLevel16 = \
3564                                                    PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3565
3566    searchSpc->searchSpaceType = NULLP;
3567    DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3568    if(!searchSpc->searchSpaceType)
3569    {
3570       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3571       return RFAILED;
3572    }
3573
3574    searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3575
3576    searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3577    DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3578          sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3579    if(!searchSpc->searchSpaceType->choice.ue_Specific)
3580    {
3581       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3582       return RFAILED;
3583    }  
3584    searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3585                                                                  PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3586
3587    return ROK;
3588 }/* End BuildSearchSpcToAddModList */
3589
3590 /*******************************************************************
3591  *
3592  * @brief Builds BWP DL dedicated PDCCH config
3593  *
3594  * @details
3595  *
3596  *    Function : BuildBWPDlDedPdcchCfg
3597  *
3598  *    Functionality: Builds BWP DL dedicated PDCCH config
3599  *
3600  * @params[in] struct PDCCH_Config *pdcchCfg
3601  *
3602  * @return ROK     - success
3603  *         RFAILED - failure
3604  *
3605  * ****************************************************************/
3606 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3607 {
3608    pdcchCfg->controlResourceSetToAddModList = NULLP;
3609    DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3610          sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3611    if(!pdcchCfg->controlResourceSetToAddModList)
3612    {
3613       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3614       return RFAILED;
3615    }
3616
3617    if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3618    {
3619       return RFAILED;
3620    }
3621
3622    pdcchCfg->controlResourceSetToReleaseList = NULLP;
3623
3624    pdcchCfg->searchSpacesToAddModList = NULLP;
3625    DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3626          sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3627    if(!pdcchCfg->searchSpacesToAddModList)
3628    {
3629       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3630       return RFAILED;
3631    }
3632
3633    if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3634    {
3635       return RFAILED;
3636    }
3637
3638    pdcchCfg->searchSpacesToReleaseList = NULLP;
3639    pdcchCfg->downlinkPreemption = NULLP;
3640    pdcchCfg->tpc_PUSCH = NULLP;
3641    pdcchCfg->tpc_PUCCH = NULLP;
3642    pdcchCfg->tpc_SRS = NULLP;
3643
3644    return ROK;
3645 }
3646
3647 /*******************************************************************
3648  *
3649  * @brief Builds DMRS DL PDSCH Mapping type A
3650  *
3651  * @details
3652  *
3653  *    Function : BuildDMRSDLPdschMapTypeA
3654  *
3655  *    Functionality: Builds DMRS DL PDSCH Mapping type A
3656  *
3657  * @params[in]
3658  * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3659  * @return ROK     - success
3660  *         RFAILED - failure
3661  *
3662  * ****************************************************************/
3663    uint8_t BuildDMRSDLPdschMapTypeA
3664 (
3665  struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3666  )
3667 {
3668    dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3669    dmrsDlCfg->choice.setup = NULLP;
3670    DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3671    if(!dmrsDlCfg->choice.setup)
3672    {
3673       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3674       return RFAILED;
3675    }
3676
3677    dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3678    dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3679    DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3680    if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3681    {
3682       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3683       return RFAILED;
3684    }
3685    *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3686
3687    dmrsDlCfg->choice.setup->maxLength = NULLP;
3688    dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3689    dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3690    dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3691
3692    return ROK;
3693 }
3694
3695 /*******************************************************************
3696  *
3697  * @brief Builds TCI states to add/modify list
3698  *
3699  * @details
3700  *
3701  *    Function : BuildTCIStatesToAddModList
3702  *
3703  *    Functionality:Builds TCI states to add/modify list
3704  *
3705  * @params[in] 
3706  * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3707  *
3708  * @return ROK     - success
3709  *         RFAILED - failure
3710  *
3711  * ****************************************************************/
3712 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3713 {
3714    return ROK;
3715 }
3716
3717 /*******************************************************************
3718  *
3719  * @brief Builds PDSCH time domain allocation list
3720  *
3721  * @details
3722  *
3723  *    Function : BuildPdschTimeDomAllocList
3724  *
3725  *    Functionality: Builds PDSCH time domain allocation list
3726  *
3727  * @params[in] 
3728  * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3729  *
3730  * @return ROK     - success
3731  *         RFAILED - failure
3732  *
3733  * ****************************************************************/
3734    uint8_t BuildPdschTimeDomAllocList
3735 (
3736  struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3737  )
3738 {
3739    uint8_t idx;
3740    uint8_t elementCnt;
3741    struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3742
3743    timeDomAllocList->present = \
3744                                PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3745
3746    timeDomAllocList->choice.setup = NULLP;
3747    DU_ALLOC(timeDomAllocList->choice.setup, \
3748          sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3749    if(!timeDomAllocList->choice.setup)
3750    {
3751       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3752       return RFAILED;
3753    }
3754
3755    elementCnt = 2;
3756    timeDomAllocList->choice.setup->list.count = elementCnt;
3757    timeDomAllocList->choice.setup->list.size = \
3758                                                elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3759
3760    timeDomAllocList->choice.setup->list.array = NULLP;
3761    DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3762          timeDomAllocList->choice.setup->list.size);
3763    if(!timeDomAllocList->choice.setup->list.array)
3764    {
3765       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3766       return RFAILED;
3767    }
3768
3769    for(idx = 0; idx < elementCnt; idx++)
3770    {
3771       timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3772       DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3773             sizeof(struct PDSCH_TimeDomainResourceAllocation));
3774       if(!timeDomAllocList->choice.setup->list.array[idx])
3775       {
3776          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3777          return RFAILED;
3778       }
3779    }
3780
3781    idx = 0;
3782    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3783    DU_ALLOC(timeDomAlloc->k0, sizeof(long));
3784    if(!timeDomAlloc->k0)
3785    {
3786       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3787       return RFAILED;
3788    }
3789    *(timeDomAlloc->k0) = 0;
3790    timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3791    timeDomAlloc->startSymbolAndLength = \
3792                                         calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
3793
3794    idx++;
3795    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3796    DU_ALLOC(timeDomAlloc->k0, sizeof(long));
3797    if(!timeDomAlloc->k0)
3798    {
3799       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3800       return RFAILED;
3801    }
3802    *(timeDomAlloc->k0) = 1;
3803    timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3804    timeDomAlloc->startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
3805
3806    return ROK;
3807 }
3808
3809 /*******************************************************************
3810  *
3811  * @brief Builds PDSCH PRB Bundling type
3812  *
3813  * @details
3814  *
3815  *    Function : BuildPdschPrbBundlingType
3816  *
3817  *    Functionality: Builds PDSCH PRB Bundling type
3818  *
3819  * @params[in] 
3820  * struct PDSCH_Config__prb_BundlingType *prbBndlType
3821  *
3822  * @return ROK     - success
3823  *         RFAILED - failure
3824  *
3825  * ****************************************************************/
3826    uint8_t BuildPdschPrbBundlingType
3827 (
3828  struct PDSCH_Config__prb_BundlingType *prbBndlType
3829  )
3830 {
3831    prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3832
3833    prbBndlType->choice.staticBundling = NULLP;
3834    DU_ALLOC(prbBndlType->choice.staticBundling, \
3835          sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3836    if(!prbBndlType->choice.staticBundling)
3837    {
3838       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3839       return RFAILED;
3840    }
3841    prbBndlType->choice.staticBundling->bundleSize = NULLP;
3842
3843    return ROK;
3844 }
3845
3846 /*******************************************************************
3847  *
3848  * @brief Builds BWP DL dedicated PDSCH config 
3849  *
3850  * @details
3851  *
3852  *    Function : BuildBWPDlDedPdschCfg
3853  *
3854  *    Functionality: Builds BWP DL dedicated PDSCH config
3855  *
3856  * @params[in] struct PDSCH_Config *pdschCfg
3857  *
3858  * @return ROK     - success
3859  *         RFAILED - failure
3860  *
3861  * ****************************************************************/
3862 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3863 {
3864    pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3865
3866    pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3867    DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3868          sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3869    if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3870    {
3871       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3872       return RFAILED;
3873    }
3874
3875    if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3876    {
3877       return RFAILED;
3878    }
3879
3880    pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3881    pdschCfg->tci_StatesToAddModList = NULLP;
3882    pdschCfg->tci_StatesToReleaseList = NULLP;
3883    pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3884 #if 0
3885    DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3886    if(!pdschCfg->tci_StatesToAddModList)
3887    {
3888       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3889       return RFAILED;
3890    }
3891    if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3892    {
3893       return RFAILED;
3894    }
3895 #endif
3896
3897    pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3898
3899    pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3900    DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3901          sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3902    if(!pdschCfg->pdsch_TimeDomainAllocationList)
3903    {
3904       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3905       return RFAILED;
3906    }
3907
3908    if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3909    {
3910       return RFAILED;
3911    }
3912
3913    pdschCfg->pdsch_AggregationFactor = NULLP;
3914    pdschCfg->rateMatchPatternToAddModList = NULLP;
3915    pdschCfg->rateMatchPatternToReleaseList = NULLP;
3916    pdschCfg->rateMatchPatternGroup1 = NULLP;
3917    pdschCfg->rateMatchPatternGroup2 = NULLP;
3918    pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3919    pdschCfg->mcs_Table = NULLP;
3920
3921    pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3922    DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3923    if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3924    {
3925       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3926       return RFAILED;
3927    }
3928    *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3929
3930    if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3931    {
3932       return RFAILED;
3933    }
3934
3935    pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3936    pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3937    pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3938    pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3939    pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3940    pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3941    pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3942
3943    return ROK;
3944 }
3945
3946 /*******************************************************************
3947  *
3948  * @brief Builds intitial DL BWP
3949  * @details
3950  *
3951  *    Function : BuildInitialDlBWP 
3952  *
3953  *    Functionality: Builds intitial DL BWP in spCellCfgDed
3954  *
3955  * @params[in] BWP_DownlinkDedicated_t *dlBwp
3956  *
3957  * @return ROK     - success
3958  *         RFAILED - failure
3959  *
3960  * ****************************************************************/
3961 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3962 {
3963    dlBwp->pdcch_Config = NULLP;
3964    DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3965    if(!dlBwp->pdcch_Config)
3966    {
3967       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3968       return RFAILED;
3969    }
3970    dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup; 
3971
3972    dlBwp->pdcch_Config->choice.setup = NULLP;
3973    DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3974    if(!dlBwp->pdcch_Config->choice.setup)
3975    {
3976       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3977       return RFAILED;
3978    }
3979    if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3980    {
3981       return RFAILED;
3982    }
3983
3984    dlBwp->pdsch_Config = NULLP;
3985    DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3986    if(!dlBwp->pdsch_Config)
3987    {
3988       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3989       return RFAILED;
3990    }
3991    dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3992
3993    dlBwp->pdsch_Config->choice.setup = NULLP;
3994    DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3995    if(!dlBwp->pdsch_Config->choice.setup)
3996    {
3997       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3998       return RFAILED;
3999    }
4000
4001    if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
4002    {
4003       return RFAILED;
4004    }
4005
4006    dlBwp->sps_Config = NULLP;
4007    dlBwp->radioLinkMonitoringConfig = NULLP; 
4008    return ROK;
4009 }
4010
4011 /*******************************************************************
4012  *
4013  * @brief Builds DMRS UL Pusch Mapping type A
4014  *
4015  * @details
4016  *
4017  *    Function : BuildDMRSULPuschMapTypeA
4018  *
4019  *    Functionality: Builds DMRS UL Pusch Mapping type A
4020  *
4021  * @params[in] 
4022  *    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4023  * @return ROK     - success
4024  *         RFAILED - failure
4025  *
4026  * ****************************************************************/
4027    uint8_t BuildDMRSULPuschMapTypeA
4028 (
4029  struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
4030  )
4031 {
4032    dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
4033    dmrsUlCfg->choice.setup= NULLP;
4034    DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
4035    if(!dmrsUlCfg->choice.setup)
4036    {
4037       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4038       return RFAILED;
4039    }
4040
4041    dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
4042    dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
4043    DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
4044    if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4045    {
4046       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4047       return RFAILED;
4048    }
4049    *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS; 
4050
4051    dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
4052    dmrsUlCfg->choice.setup->maxLength = NULLP;
4053    dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
4054    DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
4055          sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4056    if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4057    {
4058       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4059       return RFAILED;
4060    }
4061
4062    dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
4063    DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4064          sizeof(long));
4065    if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
4066    {
4067       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
4068       return RFAILED;
4069    }
4070    *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
4071
4072    dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
4073    dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
4074    return ROK;
4075 }
4076
4077 /*******************************************************************
4078  *
4079  * @brief Build PUSCH time domain allocation list
4080  *
4081  * @details
4082  *
4083  *    Function : BuildPuschTimeDomAllocList
4084  *
4085  *    Functionality: Build PUSCH time domain allocation list
4086  *
4087  * @params[in] 
4088  * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4089  *
4090  * @return ROK     - success
4091  *         RFAILED - failure
4092  *
4093  * ****************************************************************/
4094    uint8_t BuildPuschTimeDomAllocList
4095 (
4096  struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
4097  )
4098 {
4099    uint8_t idx;
4100    uint8_t elementCnt;
4101    PUSCH_TimeDomainResourceAllocation_t  *timeDomAlloc;
4102
4103    timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
4104    timeDomAllocList->choice.setup = NULLP;
4105    DU_ALLOC(timeDomAllocList->choice.setup, \
4106          sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4107    if(!timeDomAllocList->choice.setup)
4108    {
4109       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4110       return RFAILED;
4111    }
4112
4113    elementCnt = 2;
4114    timeDomAllocList->choice.setup->list.count = elementCnt;
4115    timeDomAllocList->choice.setup->list.size = \
4116                                                elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
4117    timeDomAllocList->choice.setup->list.array = NULLP;
4118    DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
4119          timeDomAllocList->choice.setup->list.size);
4120    if(!timeDomAllocList->choice.setup->list.array)
4121    {
4122       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4123       return RFAILED;
4124    }
4125
4126    for(idx = 0; idx < elementCnt; idx++)
4127    {
4128       timeDomAllocList->choice.setup->list.array[idx] = NULLP;
4129       DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
4130             sizeof(PUSCH_TimeDomainResourceAllocation_t));
4131       if(!timeDomAllocList->choice.setup->list.array[idx])
4132       {
4133          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4134          return RFAILED;
4135       }
4136    }
4137
4138    idx = 0;
4139    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4140    DU_ALLOC(timeDomAlloc->k2, sizeof(long));
4141    if(!timeDomAlloc->k2)
4142    {
4143       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4144       return RFAILED;
4145    }
4146    *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
4147    timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4148    timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
4149
4150    idx++;
4151    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
4152    DU_ALLOC(timeDomAlloc->k2, sizeof(long));
4153    if(!timeDomAlloc->k2)
4154    {
4155       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
4156       return RFAILED;
4157    }
4158    *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
4159    timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
4160    timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
4161
4162    return ROK;
4163 }
4164
4165 /*******************************************************************
4166  *
4167  * @brief Builds BWP UL dedicated PUSCH Config
4168  *
4169  * @details
4170  *
4171  *    Function : BuildBWPUlDedPuschCfg
4172  *
4173  *    Functionality:
4174  *      Builds BWP UL dedicated PUSCH Config
4175  *
4176  * @params[in] : PUSCH_Config_t *puschCfg
4177  *    
4178  * @return ROK     - success
4179  *         RFAILED - failure
4180  *
4181  * ****************************************************************/
4182 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
4183 {
4184    puschCfg->dataScramblingIdentityPUSCH = NULLP;
4185    DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4186    if(!puschCfg->dataScramblingIdentityPUSCH)
4187    {
4188       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4189       return RFAILED;
4190    }
4191    *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
4192
4193    puschCfg->txConfig = NULLP;
4194    puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
4195    DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4196          sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4197    if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4198    {
4199       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4200       return RFAILED;
4201    }
4202
4203    if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
4204    {
4205       return RFAILED;
4206    }
4207
4208    puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
4209    puschCfg->pusch_PowerControl = NULLP;
4210    puschCfg->frequencyHopping = NULLP;
4211    puschCfg->frequencyHoppingOffsetLists = NULLP;
4212    puschCfg->resourceAllocation = RES_ALLOC_TYPE;
4213
4214    puschCfg->pusch_TimeDomainAllocationList = NULLP;
4215    DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
4216          sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4217    if(!puschCfg->pusch_TimeDomainAllocationList)
4218    {
4219       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4220       return RFAILED;
4221    }
4222
4223    if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
4224    {
4225       return RFAILED;
4226    }
4227
4228    puschCfg->pusch_AggregationFactor = NULLP;
4229    puschCfg->mcs_Table = NULLP;
4230    puschCfg->mcs_TableTransformPrecoder = NULLP;
4231    puschCfg->transformPrecoder = NULLP;
4232    DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
4233    if(!puschCfg->transformPrecoder)
4234    {
4235       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
4236       return RFAILED;
4237    }
4238    *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
4239
4240    puschCfg->codebookSubset = NULLP;
4241    puschCfg->maxRank = NULLP;
4242    puschCfg->rbg_Size = NULLP;
4243    puschCfg->uci_OnPUSCH = NULLP;
4244    puschCfg->tp_pi2BPSK = NULLP;
4245
4246    return ROK;
4247 }
4248
4249 /*******************************************************************
4250  *
4251  * @brief Builds BWP UL dedicated PUCCH Config
4252  *
4253  * @details
4254  *
4255  *    Function : BuildBWPUlDedPucchCfg
4256  *
4257  *    Functionality:
4258  *      Builds BWP UL dedicated PUCCH Config
4259  *
4260  * @params[in] : PUCCH_Config_t *pucchCfg
4261  *
4262  * @return ROK     - success
4263  *         RFAILED - failure
4264  *
4265  * ****************************************************************/
4266 uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
4267 {
4268    uint8_t arrIdx, elementCnt;
4269
4270    DU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
4271    if(pucchCfg->dl_DataToUL_ACK == NULLP)
4272    {
4273       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4274       return RFAILED;
4275    }
4276    
4277    elementCnt = 2;
4278    pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
4279    pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
4280    DU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
4281    if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
4282    {
4283       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4284       return RFAILED;
4285    }   
4286
4287    for(arrIdx = 0; arrIdx <  pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
4288    {
4289       DU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
4290       if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
4291       {
4292           DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
4293           return RFAILED;
4294       }   
4295    }
4296    
4297    arrIdx = 0;
4298    *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1;
4299    *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2;
4300    return ROK;
4301 }
4302
4303 /*******************************************************************
4304  *
4305  * @brief Fills SRS resource to add/modify list 
4306  *
4307  * @details
4308  *
4309  *    Function : BuildSrsRsrcAddModList
4310  *
4311  *    Functionality: Fills SRS resource to add/modify list
4312  *
4313  * @params[in] 
4314  * @return ROK     - success
4315  *         RFAILED - failure
4316  *
4317  * ****************************************************************/
4318 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
4319 {
4320    uint8_t   elementCnt;
4321    uint8_t   rsrcIdx;
4322
4323    elementCnt = 1;
4324    resourceList->list.count = elementCnt;
4325    resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
4326    resourceList->list.array = NULLP;
4327    DU_ALLOC(resourceList->list.array, resourceList->list.size);
4328    if(!resourceList->list.array)
4329    {
4330       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4331       return RFAILED;
4332    }
4333
4334    for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4335    {
4336       DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4337       if(!resourceList->list.array[rsrcIdx])
4338       {
4339          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4340          return RFAILED;
4341       }
4342    }
4343
4344    rsrcIdx = 0;
4345    resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
4346    resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
4347    resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
4348
4349    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
4350    DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
4351          sizeof(struct SRS_Resource__transmissionComb__n2));
4352    if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
4353    {
4354       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4355       return RFAILED;
4356    }
4357    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
4358       = SRS_COMB_OFFSET_N2;
4359    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
4360       = SRS_CYCLIC_SHIFT_N2;
4361
4362    resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
4363                                                                       PUSCH_START_SYMBOL;
4364    resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols =  \
4365                                                                      SRS_Resource__resourceMapping__nrofSymbols_n1;
4366    resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
4367                                                                          SRS_Resource__resourceMapping__repetitionFactor_n1;
4368
4369    resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
4370    resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
4371    resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
4372    resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
4373    resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
4374    resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
4375                                                                SRS_Resource__groupOrSequenceHopping_neither;
4376
4377    /* Setting resource type to aperiodic for intergration purposes */
4378    resourceList->list.array[rsrcIdx]->resourceType.present = \
4379                                                              SRS_Resource__resourceType_PR_aperiodic;
4380    resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
4381    DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
4382          sizeof(struct SRS_Resource__resourceType__aperiodic));
4383    if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
4384    {
4385       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4386       return RFAILED;
4387    }
4388    resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4389
4390    return ROK;
4391 }
4392
4393 /*******************************************************************
4394  *
4395  * @brief Build SRS resource set Add/mod list
4396  *
4397  * @details
4398  *
4399  *    Function : BuildSrsRsrcSetAddModList
4400  *
4401  *    Functionality: Build SRS resource set Add/mod list
4402  *
4403  * @params[in] 
4404  * @return ROK     - success
4405  *         RFAILED - failure
4406  *
4407  * ****************************************************************/
4408    uint8_t BuildSrsRsrcSetAddModList
4409 (
4410  struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4411  )
4412 {
4413    uint8_t  elementCnt;
4414    uint8_t  rSetIdx;
4415    uint8_t  rsrcIdx;
4416    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4417
4418    elementCnt = 1;
4419    rsrcSetList->list.count = elementCnt;
4420    rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4421    rsrcSetList->list.array = NULLP;
4422    DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4423    if(!rsrcSetList->list.array)
4424    {
4425       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4426       return RFAILED;
4427    }
4428
4429    for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4430    {
4431       DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4432       if(!rsrcSetList->list.array[rSetIdx])
4433       {
4434          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4435          return RFAILED;
4436       }
4437    }
4438
4439    rSetIdx = 0;
4440    rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4441
4442    /* Fill Resource Id list in resource set */
4443    rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4444    DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4445          sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4446    if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4447    {
4448       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4449       return RFAILED;
4450    }
4451
4452    elementCnt = 1;
4453    rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4454    rsrcIdList->list.count = elementCnt;
4455    rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4456    rsrcIdList->list.array = NULLP;
4457    DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4458    if(!rsrcIdList->list.array)
4459    {
4460       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4461       return RFAILED;
4462    }
4463
4464    for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4465    {
4466       DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4467       if(!rsrcIdList->list.array[rsrcIdx])
4468       {
4469          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4470          return RFAILED;
4471       }
4472    }
4473
4474    rsrcIdx = 0;
4475    *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4476
4477    /* Fill resource type */
4478    rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4479                                                             SRS_ResourceSet__resourceType_PR_aperiodic;
4480
4481    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4482    DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4483          sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4484    if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4485    {
4486       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4487       return RFAILED;
4488    }
4489    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4490       = APERIODIC_SRS_RESRC_TRIGGER;
4491
4492    /* TODO : Fill values for below IEs as expected by Viavi */
4493    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4494    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4495
4496
4497    rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4498    rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4499    rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4500    rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4501    rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4502
4503    return ROK;
4504 }
4505
4506 /*******************************************************************
4507  *
4508  * @brief Builds BWP UL dedicated SRS Config
4509  *
4510  * @details
4511  *
4512  *    Function : BuildBWPUlDedSrsCfg
4513  *
4514  *    Functionality: Builds BWP UL dedicated SRS Config
4515  *
4516  * @params[in] SRS Config 
4517  * @return ROK     - success
4518  *         RFAILED - failure
4519  *
4520  * ****************************************************************/
4521 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4522 {
4523    srsCfg->srs_ResourceSetToReleaseList = NULLP;
4524    srsCfg->srs_ResourceSetToAddModList = NULLP;
4525    DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4526          sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4527    if(!srsCfg->srs_ResourceSetToAddModList)
4528    {
4529       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
4530       return RFAILED;
4531    }
4532    if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4533    {
4534       return RFAILED;
4535    }
4536
4537    srsCfg->srs_ResourceToReleaseList = NULLP;
4538
4539    /* Resource to Add/Modify list */
4540    srsCfg->srs_ResourceToAddModList = NULLP;
4541    DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4542          sizeof(struct SRS_Config__srs_ResourceToAddModList));
4543    if(!srsCfg->srs_ResourceToAddModList)
4544    {
4545       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
4546       return RFAILED;
4547    }
4548
4549    if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4550    {
4551       return RFAILED;
4552    }
4553
4554    srsCfg->tpc_Accumulation = NULLP;
4555
4556    return ROK;
4557 }
4558
4559
4560
4561 /*******************************************************************
4562  *
4563  * @brief Builds Pusch Serving cell Config
4564  *
4565  * @details
4566  *
4567  *    Function : BuildPuschSrvCellCfg
4568  *
4569  *    Functionality: Builds Pusch Serving cell Config
4570  *
4571  * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4572  *
4573  * @return ROK     - success
4574  *         RFAILED - failure
4575  *
4576  * ****************************************************************/
4577 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4578 {
4579    puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4580    puschCfg->choice.setup = NULLP;
4581    DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4582    if(!puschCfg->choice.setup)
4583    {
4584       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4585       return RFAILED;
4586    }
4587
4588    puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4589    puschCfg->choice.setup->rateMatching = NULLP;
4590    puschCfg->choice.setup->xOverhead = NULLP;
4591    puschCfg->choice.setup->ext1 = NULLP;
4592    DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4593    if(!puschCfg->choice.setup->ext1)
4594    {
4595       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4596       return RFAILED;
4597    }
4598
4599    puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4600    DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4601    if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4602    {
4603       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4604       return RFAILED;
4605    }
4606    *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4607
4608    puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4609    DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4610    if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4611    {
4612       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4613       return RFAILED;
4614    }
4615    *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4616    return ROK;
4617 }
4618
4619 /*******************************************************************
4620  *
4621  * @brief Builds inital UL BWP
4622  *
4623  * @details
4624  *
4625  *    Function : BuildInitialUlBWP
4626  *
4627  *    Functionality: Builds initial UL BWP
4628  *
4629  * @params[in] BWP_UplinkDedicated_t *ulBwp
4630  * @return ROK     - success
4631  *         RFAILED - failure
4632  *
4633  * ****************************************************************/
4634 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4635 {
4636    ulBwp->pucch_Config = NULLP;
4637    DU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
4638    if(!ulBwp->pucch_Config)
4639    {
4640       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4641       return RFAILED;
4642    }
4643
4644    ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
4645    ulBwp->pucch_Config->choice.setup = NULLP;
4646    DU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
4647    if(!ulBwp->pucch_Config->choice.setup)
4648    {
4649       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4650       return RFAILED;
4651    }
4652
4653    if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
4654    {
4655       return RFAILED;
4656    }
4657
4658    /* Fill BWP UL dedicated PUSCH config */
4659    ulBwp->pusch_Config = NULLP;
4660    DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4661    if(!ulBwp->pusch_Config)
4662    {
4663       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4664       return RFAILED;
4665    }
4666
4667    ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4668    ulBwp->pusch_Config->choice.setup = NULLP;
4669    DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4670    if(!ulBwp->pusch_Config->choice.setup)
4671    {
4672       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4673       return RFAILED;
4674    }
4675
4676    if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4677    {
4678       return RFAILED;
4679    }
4680
4681    ulBwp->configuredGrantConfig = NULLP;
4682
4683    /* Fill BPW UL dedicated SRS config */
4684    ulBwp->srs_Config = NULLP;
4685    DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4686    if(!ulBwp->srs_Config)
4687    {
4688       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4689       return RFAILED;
4690    }
4691
4692    ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4693    ulBwp->srs_Config->choice.setup = NULLP;
4694    DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4695    if(!ulBwp->srs_Config->choice.setup)
4696    {
4697       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4698       return RFAILED;
4699    }
4700
4701    if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4702    {
4703       return RFAILED;   
4704    }
4705
4706    ulBwp->beamFailureRecoveryConfig = NULLP;
4707
4708    return ROK;
4709 }
4710
4711 /*******************************************************************
4712  *
4713  * @brief Builds UL config
4714  * @details
4715  *
4716  *    Function : BuildUlCfg 
4717  *
4718  *    Functionality: Builds UL config in spCellCfgDed
4719  *
4720  * @params[in] UplinkConfig_t *ulCfg
4721  *
4722  * @return ROK     - success
4723  *         RFAILED - failure
4724  *
4725  * ****************************************************************/
4726 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4727 {
4728    ulCfg->initialUplinkBWP = NULLP;
4729    DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4730    if(!ulCfg->initialUplinkBWP)
4731    {
4732       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4733       return RFAILED;
4734    }
4735
4736    if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4737    {
4738       return RFAILED;
4739    }
4740
4741    ulCfg->uplinkBWP_ToReleaseList = NULLP;
4742    ulCfg->uplinkBWP_ToAddModList = NULLP;
4743    ulCfg->firstActiveUplinkBWP_Id = NULLP;
4744    DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4745    if(!ulCfg->firstActiveUplinkBWP_Id)
4746    {
4747       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4748       return RFAILED;
4749    }
4750    *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4751
4752    ulCfg->pusch_ServingCellConfig = NULLP;
4753    DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4754          sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4755    if(!ulCfg->pusch_ServingCellConfig)
4756    {
4757       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4758       return RFAILED;
4759    }
4760
4761    if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4762    {
4763       return RFAILED;
4764    }
4765
4766    ulCfg->carrierSwitching = NULLP;
4767    ulCfg->ext1 = NULLP;
4768    return ROK;
4769 }
4770
4771 /*******************************************************************
4772  *
4773  * @brief Builds PDSCH serving cell config
4774  * @details
4775  *
4776  *    Function : BuildPdschSrvCellCfg
4777  *
4778  *    Functionality: Builds PDSCH serving cell config in spCellCfgDed
4779  *
4780  * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg 
4781  *
4782  * @return ROK     - success
4783  *         RFAILED - failure
4784  *
4785  * ****************************************************************/
4786 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4787 {
4788    pdschCfg->present =  ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4789    pdschCfg->choice.setup = NULLP;
4790    DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4791    if(!pdschCfg->choice.setup)
4792    {
4793       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4794       return RFAILED;
4795    }
4796
4797    pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4798    pdschCfg->choice.setup->xOverhead = NULLP;
4799    pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4800    DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4801    if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4802    {
4803       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4804       return RFAILED;
4805    }
4806    *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4807    pdschCfg->choice.setup->pucch_Cell = NULLP;
4808    pdschCfg->choice.setup->ext1 = NULLP;
4809
4810    return ROK;
4811 }
4812
4813 /*******************************************************************
4814  *
4815  * @brief Builds CSI Meas config
4816  * @details
4817  *
4818  *    Function : BuildCsiMeasCfg 
4819  *
4820  *    Functionality: Builds CSI Meas config in spCellCfgDed
4821  *
4822  * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4823  *
4824  * @return ROK     - success
4825  *         RFAILED - failure
4826  *
4827  * ****************************************************************/
4828 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4829 {
4830
4831    return ROK;
4832 }
4833
4834 /*******************************************************************
4835  *
4836  * @brief Builds Spcell config dedicated
4837  * @details
4838  *
4839  *    Function : BuildSpCellCfgDed
4840  *
4841  *    Functionality: Builds sp cell config dedicated in spCellCfg
4842  *
4843  * @params[in] ServingCellConfig_t srvCellCfg
4844  *
4845  * @return ROK     - success
4846  *         RFAILED - failure
4847  *
4848  * ****************************************************************/
4849 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4850 {
4851    srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4852    DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
4853    if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
4854    {
4855       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4856       return RFAILED;
4857    }
4858
4859    srvCellCfg->initialDownlinkBWP = NULLP;
4860    DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4861    if(!srvCellCfg->initialDownlinkBWP)
4862    {
4863       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4864       return RFAILED;
4865    }
4866
4867    if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4868    {
4869       DU_LOG("\nERROR  -->  F1AP : BuildInitialDlBWP failed");
4870       return RFAILED;
4871    }
4872    srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4873    srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4874
4875    srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4876    DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4877    if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4878    {
4879       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4880       return RFAILED;
4881    }
4882    *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4883
4884    srvCellCfg->bwp_InactivityTimer = NULLP;
4885
4886    srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4887    DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4888    if(!srvCellCfg->defaultDownlinkBWP_Id)
4889    {
4890       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4891       return RFAILED;
4892    }
4893    *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4894
4895    srvCellCfg->uplinkConfig = NULLP;
4896    DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4897    if(!srvCellCfg->uplinkConfig)
4898    {
4899       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4900       return RFAILED;
4901    }
4902
4903    if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4904    {
4905       DU_LOG("\nERROR  -->  F1AP : BuildUlCfg failed");
4906       return RFAILED;
4907    }
4908    srvCellCfg->supplementaryUplink = NULLP;
4909    srvCellCfg->pdcch_ServingCellConfig = NULLP;
4910
4911    srvCellCfg->pdsch_ServingCellConfig = NULLP;
4912    DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct  ServingCellConfig__pdsch_ServingCellConfig));
4913    if(!srvCellCfg->pdsch_ServingCellConfig)
4914    {
4915       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4916       return RFAILED;
4917    }
4918
4919    if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4920    {
4921       DU_LOG("\nERROR  -->  F1AP : BuildPdschSrvCellCfg failed");
4922       return RFAILED;
4923    }
4924
4925    srvCellCfg->csi_MeasConfig = NULLP;
4926 #if 0
4927    DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct   ServingCellConfig__csi_MeasConfig))
4928       if(!srvCellCfg->csi_MeasConfig)
4929       {
4930          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4931          return RFAILED;
4932       }
4933
4934    if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4935    {
4936       DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4937       return RFAILED;
4938    }
4939 #endif
4940    srvCellCfg->sCellDeactivationTimer = NULLP;
4941    srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4942    srvCellCfg->tag_Id = TAG_ID;
4943    srvCellCfg->dummy = NULLP;
4944    srvCellCfg->pathlossReferenceLinking = NULLP;
4945    srvCellCfg->servingCellMO = NULLP;
4946    srvCellCfg->ext1 = NULLP;
4947
4948    return ROK;
4949 }
4950 /*******************************************************************
4951  *
4952  * @brief Builds Spcell config 
4953  *
4954  * @details
4955  *
4956  *    Function : BuildSpCellCfg 
4957  *
4958  *    Functionality: Builds sp cell config in DuToCuRrcContainer
4959  *
4960  * @params[in] SpCellConfig_t spCellCfg
4961  *
4962  * @return ROK     - success
4963  *         RFAILED - failure
4964  *
4965  * ****************************************************************/
4966 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4967 {
4968
4969    spCellCfg->servCellIndex = NULLP;
4970    DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4971    if(!spCellCfg->servCellIndex)
4972    {
4973       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4974       return RFAILED;
4975    }
4976    *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4977
4978    spCellCfg->reconfigurationWithSync = NULLP;
4979    spCellCfg->rlf_TimersAndConstants = NULLP;
4980    spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4981    DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4982    if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4983    {
4984       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4985       return RFAILED;
4986    }
4987    *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4988
4989    spCellCfg->spCellConfigDedicated = NULLP;
4990    DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4991    if(!spCellCfg->spCellConfigDedicated)
4992    {
4993       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4994       return RFAILED;
4995    }
4996    if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4997    {
4998       DU_LOG("\nERROR  -->  F1AP : BuildSpCellCfgDed failed");
4999       return RFAILED;
5000    }
5001    return ROK;
5002 }
5003 /*******************************************************************
5004  *
5005  * @brief Builds Phy cell group config 
5006  *
5007  * @details
5008  *
5009  *    Function : BuildPhyCellGrpCfg 
5010  *
5011  *    Functionality: Builds Phy cell group config in DuToCuRrcContainer
5012  *
5013  * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg 
5014  *
5015  * @return ROK     - success
5016  *         RFAILED - failure
5017  *
5018  * ****************************************************************/
5019 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
5020 {
5021    phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
5022    phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
5023
5024    phyCellGrpCfg->p_NR_FR1 = NULLP;
5025    DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5026    if(!phyCellGrpCfg->p_NR_FR1)
5027    {
5028       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
5029       return RFAILED;
5030    }
5031    *(phyCellGrpCfg->p_NR_FR1)             = P_NR_FR1;
5032    phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
5033    phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
5034    phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
5035    phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
5036    phyCellGrpCfg->sp_CSI_RNTI = NULLP;
5037    phyCellGrpCfg->cs_RNTI = NULLP;
5038    phyCellGrpCfg->ext1 = NULLP;
5039    phyCellGrpCfg->ext2 = NULLP;
5040
5041    return ROK;
5042 }
5043 /*******************************************************************
5044  *
5045  * @brief Builds Mac cell group config 
5046  *
5047  * @details
5048  *
5049  *    Function : BuildMacCellGrpCfg 
5050  *
5051  *    Functionality: Builds Mac cell group config in DuToCuRrcContainer
5052  *
5053  * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
5054  *
5055  * @return ROK     - success
5056  *         RFAILED - failure
5057  *
5058  * ****************************************************************/
5059 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
5060 {
5061    macCellGrpCfg->drx_Config = NULLP;
5062    macCellGrpCfg->schedulingRequestConfig = NULLP;
5063    DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5064    if(!macCellGrpCfg->schedulingRequestConfig)
5065    {
5066       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5067       return RFAILED;
5068    }
5069
5070    if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
5071    {
5072       DU_LOG("\nERROR  -->  F1AP : BuildSchedulingReqConfig failed");
5073       return RFAILED;
5074    }
5075
5076    macCellGrpCfg->bsr_Config = NULLP;
5077    DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5078    if(!macCellGrpCfg->bsr_Config)
5079    {
5080       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5081       return RFAILED;
5082    }
5083
5084    if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
5085    {
5086       DU_LOG("\nERROR  -->  F1AP : BuildBsrConfig failed");
5087       return RFAILED;
5088    }
5089
5090    macCellGrpCfg->tag_Config = NULLP;
5091    DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
5092    if(!macCellGrpCfg->tag_Config)
5093    {
5094       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5095       return RFAILED;
5096    }
5097
5098    if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
5099    {
5100       DU_LOG("\nERROR  -->  F1AP : BuildTagConfig failed");
5101       return RFAILED;
5102    }
5103
5104    macCellGrpCfg->phr_Config = NULLP;
5105    DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
5106    if(!macCellGrpCfg->phr_Config)
5107    {
5108       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
5109       return RFAILED;
5110    }
5111
5112    if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
5113    {
5114       DU_LOG("\nERROR  -->  F1AP : BuildPhrConfig failed");
5115       return RFAILED;
5116    }
5117
5118    macCellGrpCfg->skipUplinkTxDynamic = false;
5119    macCellGrpCfg->ext1 = NULLP;
5120
5121    return ROK;
5122 }
5123 /*******************************************************************
5124  *
5125  * @brief Frees memeory allocated for SearchSpcToAddModList
5126  *
5127  * @details
5128  *
5129  *    Function : FreeSearchSpcToAddModList
5130  *
5131  *    Functionality: Deallocating memory of SearchSpcToAddModList
5132  *
5133  * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5134  *
5135  * @return void
5136  *
5137  4221 * ****************************************************************/
5138 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5139 {
5140    uint8_t idx1=0;
5141    uint8_t idx2=0;
5142    struct  SearchSpace *searchSpc=NULLP;
5143
5144    if(searchSpcList->list.array)
5145    {
5146       if(searchSpcList->list.array[idx2])
5147       {
5148          searchSpc = searchSpcList->list.array[idx2];
5149          if(searchSpc->controlResourceSetId)
5150          {
5151             if(searchSpc->monitoringSlotPeriodicityAndOffset)
5152             {
5153                if(searchSpc->monitoringSymbolsWithinSlot)
5154                {
5155                   if(searchSpc->monitoringSymbolsWithinSlot->buf)
5156                   {
5157                      if(searchSpc->nrofCandidates)
5158                      {
5159                         if(searchSpc->searchSpaceType)
5160                         {
5161                            DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
5162                                  sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
5163                            DU_FREE(searchSpc->searchSpaceType, sizeof(struct
5164                                     SearchSpace__searchSpaceType));
5165                         }
5166                         DU_FREE(searchSpc->nrofCandidates,
5167                               sizeof(struct SearchSpace__nrofCandidates));
5168                      }
5169                      DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
5170                            searchSpc->monitoringSymbolsWithinSlot->size);
5171                   }
5172                   DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
5173                         sizeof(BIT_STRING_t));
5174                }
5175                DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
5176                      sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
5177             }
5178             DU_FREE(searchSpc->controlResourceSetId,
5179                   sizeof(ControlResourceSetId_t));
5180          }
5181       }
5182       for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
5183       {
5184          DU_FREE(searchSpcList->list.array[idx1],
5185                sizeof(struct SearchSpace));
5186       }
5187       DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
5188    }
5189 }
5190 /*******************************************************************
5191  *
5192  * @brief Frees memory allocated for PdschTimeDomAllocList
5193  *
5194  * @details
5195  *
5196  *    Function : FreePdschTimeDomAllocList
5197  *
5198  *    Functionality: Deallocating memory of PdschTimeDomAllocList
5199  *
5200  * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
5201  *
5202  * @return void
5203  *
5204  * ****************************************************************/
5205 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
5206 {
5207    uint8_t idx1=0;
5208
5209    if(timeDomAllocList->choice.setup)
5210    {
5211       if(timeDomAllocList->choice.setup->list.array)
5212       {
5213          for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
5214          {
5215             DU_FREE(timeDomAllocList->choice.setup->list.array[idx1]->k0, sizeof(long));
5216             DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
5217                   sizeof(struct PDSCH_TimeDomainResourceAllocation));
5218          }
5219          DU_FREE(timeDomAllocList->choice.setup->list.array, \
5220                timeDomAllocList->choice.setup->list.size);
5221       }
5222       DU_FREE(timeDomAllocList->choice.setup,\
5223             sizeof(struct PDSCH_TimeDomainResourceAllocationList));
5224    }
5225 }
5226 /*******************************************************************
5227  *
5228  * @brief Frees memory allocated for PuschTimeDomAllocList
5229  *
5230  *@details
5231  *
5232  *    Function : FreePuschTimeDomAllocList
5233  *
5234  *    Functionality: Deallocating memory of PuschTimeDomAllocList
5235  *
5236  * @params[in] PUSCH_Config_t *puschCfg
5237  *
5238  * @return void
5239  *
5240  * ****************************************************************/
5241 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
5242 {
5243    uint8_t idx1=0;
5244    uint8_t idx2=0;
5245    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5246
5247    if(puschCfg->pusch_TimeDomainAllocationList)
5248    {
5249       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5250       if(timeDomAllocList_t->choice.setup)
5251       {
5252          if(timeDomAllocList_t->choice.setup->list.array)
5253          {
5254             DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
5255             for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
5256             {
5257                DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
5258                      sizeof(PUSCH_TimeDomainResourceAllocation_t));
5259             }
5260             DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5261                   timeDomAllocList_t->choice.setup->list.size);
5262          }
5263          DU_FREE(timeDomAllocList_t->choice.setup, \
5264                sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5265       }
5266       DU_FREE(puschCfg->transformPrecoder, sizeof(long));
5267       DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5268             sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5269    }
5270
5271 }
5272 /*******************************************************************
5273  *
5274  * @brief Frees memory allocated for InitialUlBWP
5275  *
5276  * @details
5277  *
5278  *    Function : FreeInitialUlBWP
5279  *
5280  *    Functionality: Deallocating memory of InitialUlBWP
5281  *
5282  * @params[in] BWP_UplinkDedicated_t *ulBwp
5283  *
5284  * @return void
5285  *
5286  * ****************************************************************/
5287 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5288 {
5289    uint8_t  rSetIdx, rsrcIdx, k1Idx;
5290    SRS_Config_t   *srsCfg = NULLP;
5291    PUSCH_Config_t *puschCfg = NULLP;
5292    PUCCH_Config_t *pucchCfg = NULLP;
5293    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5294    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5295    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5296    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5297
5298    if(ulBwp->pucch_Config)
5299    {
5300       if(ulBwp->pucch_Config->choice.setup)
5301       {
5302           pucchCfg = ulBwp->pucch_Config->choice.setup;
5303           if(pucchCfg->dl_DataToUL_ACK)
5304           {
5305              if(pucchCfg->dl_DataToUL_ACK->list.array)
5306              {
5307                 for(k1Idx = 0; k1Idx < pucchCfg->dl_DataToUL_ACK->list.count; k1Idx++)
5308                 {
5309                    DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[k1Idx], sizeof(long));
5310                 }
5311                 DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5312              }
5313              DU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5314           }
5315           DU_FREE(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
5316       }
5317       DU_FREE(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5318    }
5319
5320    if(ulBwp->pusch_Config)
5321    {
5322       if(ulBwp->pusch_Config->choice.setup)
5323       {
5324          puschCfg=ulBwp->pusch_Config->choice.setup;
5325          if(puschCfg->dataScramblingIdentityPUSCH)
5326          {
5327             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5328             {
5329                FreePuschTimeDomAllocList(puschCfg);
5330                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5331                if(dmrsUlCfg->choice.setup)
5332                {
5333                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5334                   {
5335                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5336                      {
5337                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5338                               sizeof(long));
5339                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5340                               sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5341                      }
5342                      DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5343                            sizeof(long));
5344                   }
5345                   DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5346                }
5347                DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5348                      sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5349             }
5350             DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5351          }
5352          DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5353       }
5354       DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5355
5356       /* Free SRS-Config */
5357       if(ulBwp->srs_Config)
5358       {
5359          if(ulBwp->srs_Config->choice.setup)
5360          {
5361             srsCfg = ulBwp->srs_Config->choice.setup;
5362
5363             /* Free Resource Set to add/mod list */
5364             if(srsCfg->srs_ResourceSetToAddModList)
5365             {
5366                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5367                if(rsrcSetList->list.array)
5368                {
5369                   rSetIdx = 0;
5370
5371                   /* Free SRS resource Id list in this SRS resource set */
5372                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5373                   {
5374                      rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5375
5376                      if(rsrcIdList->list.array)
5377                      {
5378                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5379                         {
5380                            DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5381                         }
5382                         DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5383                      }
5384                      DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5385                            sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5386                   }
5387
5388                   /* Free resource type info for this SRS resource set */
5389                   DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5390                         sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5391
5392                   /* Free memory for each resource set */
5393                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5394                   {
5395                      DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5396                   }
5397                   DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size); 
5398                }
5399                DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5400                      sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5401             }
5402
5403             /* Free resource to add/modd list */
5404             if(srsCfg->srs_ResourceToAddModList)
5405             {
5406                resourceList = srsCfg->srs_ResourceToAddModList;
5407                if(resourceList->list.array)
5408                {
5409                   rsrcIdx = 0;
5410                   DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5411                         sizeof(struct SRS_Resource__transmissionComb__n2));
5412                   DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5413                         sizeof(struct SRS_Resource__resourceType__aperiodic));
5414
5415                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5416                   {
5417                      DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5418                   }
5419                   DU_FREE(resourceList->list.array, resourceList->list.size);
5420                }
5421                DU_FREE(srsCfg->srs_ResourceToAddModList, \
5422                      sizeof(struct SRS_Config__srs_ResourceToAddModList));
5423             }
5424
5425             DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5426          }
5427          DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5428       }
5429    }
5430 }       
5431 /*******************************************************************
5432  *
5433  * @brief Frees memory allocated for initialUplinkBWP
5434  *
5435  * @details
5436  *
5437  *    Function : FreeinitialUplinkBWP
5438  *
5439  *    Functionality: Deallocating memory of initialUplinkBWP
5440  *
5441  * @params[in] UplinkConfig_t *ulCfg
5442  *
5443  * @return void
5444  *         
5445  *
5446  * ****************************************************************/
5447 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5448 {
5449    BWP_UplinkDedicated_t *ulBwp=NULLP; 
5450    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5451
5452    if(ulCfg->initialUplinkBWP)
5453    {
5454       ulBwp=ulCfg->initialUplinkBWP;
5455       if(ulCfg->firstActiveUplinkBWP_Id)
5456       {
5457          if(ulCfg->pusch_ServingCellConfig)
5458          {
5459             puschCfg=ulCfg->pusch_ServingCellConfig;
5460             if(puschCfg->choice.setup)
5461             {
5462                if(puschCfg->choice.setup->ext1)
5463                {
5464                   DU_FREE(puschCfg->choice.setup->ext1->\
5465                         processingType2Enabled,sizeof(BOOLEAN_t));
5466                   DU_FREE(puschCfg->choice.setup->ext1->\
5467                         maxMIMO_Layers,sizeof(long));
5468                   DU_FREE(puschCfg->choice.setup->ext1, \
5469                         sizeof(struct PUSCH_ServingCellConfig__ext1));
5470                }
5471                DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5472             }
5473             DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5474          }
5475          DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5476       }
5477       FreeInitialUlBWP(ulBwp);
5478       DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5479    }
5480 }
5481 /*******************************************************************
5482  *
5483  * @brief Frees emmory allocated for BWPDlDedPdschCfg
5484  *
5485  * @details
5486  *
5487  *    Function : FreeBWPDlDedPdschCfg
5488  *
5489  *    Functionality: Deallocating memory of BWPDlDedPdschCfg
5490  *
5491  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5492  *
5493  * @return void
5494  *
5495  *
5496  * ****************************************************************/
5497 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5498 {
5499    struct PDSCH_Config *pdschCfg=NULLP;
5500    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5501    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5502    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5503
5504    if(dlBwp->pdsch_Config->choice.setup)
5505    {
5506       pdschCfg=dlBwp->pdsch_Config->choice.setup;
5507       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5508       {
5509          if(pdschCfg->pdsch_TimeDomainAllocationList)
5510          {
5511             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5512             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5513             {
5514                prbBndlType=&pdschCfg->prb_BundlingType;
5515                DU_FREE(prbBndlType->choice.staticBundling,\
5516                      sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5517                DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5518             }
5519             FreePdschTimeDomAllocList(timeDomAllocList);
5520             DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5521                   sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5522          }
5523          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5524          if(dmrsDlCfg->choice.setup)
5525          {
5526             DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5527                   sizeof(long));
5528             DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5529          }
5530          DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5531                sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5532       }
5533       DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5534    }
5535 }
5536 /*******************************************************************
5537  *
5538  * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5539  *
5540  * @details
5541  *
5542  *    Function : FreeBWPDlDedPdcchCfg
5543  *
5544  *    Functionality: Deallocating memory of BWPDlDedPdcchCfg
5545  *
5546  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5547  *
5548  * @return void
5549  *         
5550  *
5551  * ****************************************************************/
5552 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5553 {
5554    uint8_t idx1=0;
5555    uint8_t idx2=0;
5556    struct PDCCH_Config *pdcchCfg=NULLP;
5557    struct ControlResourceSet *controlRSet=NULLP;
5558    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5559
5560    if(dlBwp->pdcch_Config->choice.setup)
5561    {
5562       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5563       if(pdcchCfg->controlResourceSetToAddModList)
5564       {
5565          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5566          if(controlRSetList->list.array)
5567          {
5568             controlRSet = controlRSetList->list.array[idx2];
5569             if(controlRSet)
5570             {
5571                if(controlRSet->frequencyDomainResources.buf)
5572                {
5573                   if(controlRSet->pdcch_DMRS_ScramblingID)
5574                   {
5575                      if(pdcchCfg->searchSpacesToAddModList)
5576                      {
5577                         FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5578                         DU_FREE(pdcchCfg->searchSpacesToAddModList, \
5579                               sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5580                      }
5581                      DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5582                   }
5583                   DU_FREE(controlRSet->frequencyDomainResources.buf, \
5584                         controlRSet->frequencyDomainResources.size);
5585                }
5586             }
5587             for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5588             {
5589                DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5590             }
5591             DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5592          }
5593          DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5594                sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5595       }
5596       DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5597    }
5598 }       
5599
5600 /*******************************************************************
5601  *
5602  * @brief Frees emmory allocated for DUToCURRCContainer 
5603  *
5604  * @details
5605  *
5606  *    Function : FreeMemDuToCuRrcCont
5607  *
5608  *    Functionality: Deallocating memory of DuToCuRrcContainer
5609  *
5610  * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
5611  *
5612  * @return ROK     - success
5613  *         RFAILED - failure
5614  *
5615  * ****************************************************************/
5616 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
5617 {
5618    uint8_t idx=0;
5619    SpCellConfig_t *spCellCfg=NULLP;
5620    ServingCellConfig_t *srvCellCfg=NULLP;
5621    BWP_DownlinkDedicated_t *dlBwp=NULLP;
5622    MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5623    PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5624    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5625    struct RLC_Config *rlcConfig=NULLP;
5626    struct LogicalChannelConfig *macLcConfig=NULLP;
5627    struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5628    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5629    struct TAG_Config *tagConfig=NULLP;
5630    struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5631    struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5632    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5633
5634    rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5635    if(rlcBearerList)
5636    {
5637       if(rlcBearerList->list.array)
5638       {
5639          for(idx=0; idx<rlcBearerList->list.count; idx++)
5640          {
5641             if(rlcBearerList->list.array[idx])
5642             {  
5643                rlcConfig   = rlcBearerList->list.array[idx]->rlc_Config;
5644                macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5645                if(rlcConfig)
5646                {
5647                   if(rlcConfig->choice.am)
5648                   {
5649                      DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5650                      DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
5651                      DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5652                   }     
5653                   DU_FREE(rlcConfig, sizeof(struct RLC_Config));
5654                }
5655                DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5656                if(macLcConfig)
5657                {
5658                   if(macLcConfig->ul_SpecificParameters)
5659                   {
5660                      DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID,   sizeof(SchedulingRequestId_t));
5661                      DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup,   sizeof(long));
5662                      DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5663                   }
5664                   DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5665                }
5666                DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5667             }   
5668          }
5669          DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5670       }
5671       DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5672    }
5673
5674    macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5675    if(macCellGrpCfg)
5676    {
5677       schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; 
5678       if(schedulingRequestConfig)
5679       {
5680          schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5681          if(schReqList)
5682          {
5683             if(schReqList->list.array)
5684             {
5685                for(idx=0;idx<schReqList->list.count; idx++)
5686                {
5687                   if(schReqList->list.array[idx])
5688                   {
5689                      DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5690                      DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5691                   }
5692                }
5693                DU_FREE(schReqList->list.array, schReqList->list.size);
5694             }
5695             DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5696                   sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));    }
5697             DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5698       }
5699       if(macCellGrpCfg->bsr_Config)
5700       {
5701          DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5702       }
5703       tagConfig = macCellGrpCfg->tag_Config;
5704       if(tagConfig)
5705       {
5706          tagList = tagConfig->tag_ToAddModList;
5707          if(tagList)
5708          {
5709             if(tagList->list.array)
5710             {
5711                for(idx=0; idx<tagList->list.count; idx++)
5712                {
5713                   DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5714                }
5715                DU_FREE(tagList->list.array, tagList->list.size);
5716             }
5717             DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5718          }
5719          DU_FREE(tagConfig, sizeof(struct TAG_Config));
5720       }
5721
5722       phrConfig = macCellGrpCfg->phr_Config;
5723       if(phrConfig)
5724       {
5725          DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5726          DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5727       }
5728
5729       DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5730    }
5731
5732    phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5733    if(phyCellGrpCfg)
5734    {
5735       DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5736       DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5737    }
5738
5739    spCellCfg = cellGrpCfg->spCellConfig;
5740    if(spCellCfg)
5741    {
5742       if(spCellCfg->servCellIndex)
5743       {
5744          if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5745          {
5746             if(spCellCfg->spCellConfigDedicated)
5747             {
5748                srvCellCfg = spCellCfg->spCellConfigDedicated;
5749                if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
5750                {
5751                   if(srvCellCfg->initialDownlinkBWP)
5752                   {
5753                      dlBwp = srvCellCfg->initialDownlinkBWP;
5754                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
5755                      {
5756                         if(srvCellCfg->defaultDownlinkBWP_Id)
5757                         {
5758                            if(srvCellCfg->uplinkConfig)
5759                            {
5760                               if(srvCellCfg->pdsch_ServingCellConfig)
5761                               {
5762                                  pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5763                                  if(pdschCfg->choice.setup)
5764                                  {
5765                                     DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5766                                     DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5767                                  }
5768                                  DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5769                                           ServingCellConfig__pdsch_ServingCellConfig));
5770                               }  
5771                               FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5772                               DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));        
5773                            }
5774                            DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5775                         }
5776                         DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5777                      }
5778                      if(dlBwp->pdcch_Config)
5779                      {
5780                         if(dlBwp->pdsch_Config)
5781                         {
5782                            FreeBWPDlDedPdschCfg(dlBwp);
5783                            DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5784                         }
5785                         FreeBWPDlDedPdcchCfg(dlBwp);
5786                         DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5787                      }
5788                      DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5789                   }
5790                   DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
5791                }
5792                DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5793             }
5794             DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5795          }
5796          DU_FREE(spCellCfg->servCellIndex, sizeof(long));
5797       }
5798       DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5799    }
5800    return ROK;
5801 }
5802 /*******************************************************************
5803  *
5804  * @brief Builds DU To CU RRC Container 
5805  *
5806  * @details
5807  *
5808  *    Function : BuildDuToCuRrcContainer 
5809  *
5810  *    Functionality: Builds DuToCuRrcContainer
5811  *
5812  * @params[in] idx, index in F1AP msg
5813  *             DuToCuRRCContainer, DuToCuRRCContainer
5814  *
5815  * @return ROK     - success
5816  *         RFAILED - failure
5817  *
5818  * ****************************************************************/
5819 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
5820 {
5821    uint8_t  ret = ROK;
5822    CellGroupConfigRrc_t  cellGrpCfg;
5823    asn_enc_rval_t        encRetVal;
5824    memset(&cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
5825    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5826
5827    while(true)
5828    {
5829       cellGrpCfg.cellGroupId = CELL_GRP_ID;
5830
5831       cellGrpCfg.rlc_BearerToAddModList = NULLP;
5832       DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5833       if(!cellGrpCfg.rlc_BearerToAddModList)
5834       {
5835          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5836          ret = RFAILED;
5837          break;
5838       }
5839       if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5840       {
5841          DU_LOG("\nERROR  -->  F1AP : BuildRlcBearerToAddModList failed");
5842          ret = RFAILED;
5843          break;
5844       }
5845
5846       cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5847       cellGrpCfg.mac_CellGroupConfig = NULLP;
5848       DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5849       if(!cellGrpCfg.mac_CellGroupConfig)
5850       {
5851          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5852          ret = RFAILED;
5853          break;
5854       }
5855       if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5856       {
5857          DU_LOG("\nERROR  -->  F1AP : BuildMacCellGrpCfg failed");
5858          ret = RFAILED;
5859          break;
5860       }
5861
5862       cellGrpCfg.physicalCellGroupConfig = NULLP;
5863       DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5864       if(!cellGrpCfg.physicalCellGroupConfig)
5865       {
5866          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5867          ret = RFAILED;
5868          break;
5869       }
5870       if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5871       {
5872          DU_LOG("\nERROR  -->  F1AP : BuildPhyCellGrpCfg failed");
5873          ret = RFAILED;
5874          break;
5875       }
5876
5877       cellGrpCfg.spCellConfig = NULLP;
5878       DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5879       if(!cellGrpCfg.spCellConfig)
5880       {
5881          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5882          ret = RFAILED;
5883          break;
5884       }
5885       if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5886       {
5887          DU_LOG("\nERROR  -->  F1AP : BuildSpCellCfg failed");
5888          ret = RFAILED;
5889          break;
5890       }
5891
5892       cellGrpCfg.sCellToAddModList = NULLP;
5893       cellGrpCfg.sCellToReleaseList = NULLP;
5894       cellGrpCfg.ext1 = NULLP;
5895
5896       /* encode cellGrpCfg into duToCuRrcContainer */
5897       xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5898       memset(encBuf, 0, ENC_BUF_MAX_LEN);
5899       encBufSize = 0;
5900       encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5901       /* Encode results */
5902       if(encRetVal.encoded == ENCODE_FAIL)
5903       {
5904          DU_LOG( "\nERROR  --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5905                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5906          ret = RFAILED;
5907          break;
5908       }
5909       else
5910       {
5911          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5912          for(int i=0; i< encBufSize; i++)
5913          {
5914             printf("%x",encBuf[i]);
5915          }
5916       }
5917
5918       duToCuRrcContainer->size = encBufSize;
5919       DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
5920       if(!duToCuRrcContainer->buf)
5921       {
5922          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5923          ret = RFAILED;
5924          break;
5925       }
5926       if(ret == ROK)
5927       {
5928          memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
5929       }
5930       break;
5931    }
5932    FreeMemDuToCuRrcCont(&cellGrpCfg);
5933    return ret;
5934 }
5935
5936 /*******************************************************************
5937  *
5938  * @brief Free memory allocated in InitialULRRCMessage
5939  *
5940  * @details
5941  *
5942  *    Function : freeInitUlRrcMsgTransfer
5943  *
5944  *    Functionality: Free memory allocated in InitialULRRCMessage
5945  *
5946  * @params[in]F1AP_PDU_t  *f1apMsg)
5947  *
5948  * @return ROK     - success
5949  *         RFAILED - failure
5950  *
5951  * ****************************************************************/
5952
5953 uint8_t freeInitUlRrcMsgTransfer(F1AP_PDU_t  *f1apMsg)
5954 {
5955    uint8_t ieIdx, arrIdx;
5956    InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
5957
5958    if(f1apMsg)
5959    {
5960       if(f1apMsg->choice.initiatingMessage)
5961       {
5962          initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.\
5963             choice.InitialULRRCMessageTransfer;
5964          if(initULRRCMsg->protocolIEs.list.array)
5965          {
5966             for(ieIdx = 0; ieIdx < initULRRCMsg->protocolIEs.list.count; ieIdx++)
5967             {
5968                switch(initULRRCMsg->protocolIEs.list.array[ieIdx]->id)
5969                {
5970                   case ProtocolIE_ID_id_NRCGI:
5971                   {
5972                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf)
5973                      {
5974                         if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf)
5975                         {
5976                            DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf,\
5977                            initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.size);
5978                         }
5979                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf,\
5980                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.size);
5981                      }
5982                      break;
5983                   }
5984                   case ProtocolIE_ID_id_RRCContainer:
5985                   {
5986                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5987                      {
5988                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
5989                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5990                      }
5991                      break;
5992                   }
5993                   case ProtocolIE_ID_id_DUtoCURRCContainer:
5994                   {
5995                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf)
5996                      {
5997                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf,
5998                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.size);
5999                      }
6000                      break;
6001                   }
6002                   default:
6003                      break;
6004                }
6005              }
6006              for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
6007              {
6008                 if(initULRRCMsg->protocolIEs.list.array[arrIdx])
6009                 {
6010                    DU_FREE(initULRRCMsg->protocolIEs.list.array[arrIdx],\
6011                       sizeof(InitialULRRCMessageTransferIEs_t));
6012                 }
6013              }
6014              DU_FREE(initULRRCMsg->protocolIEs.list.array, initULRRCMsg->protocolIEs.list.size);
6015           }
6016          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6017       }
6018       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6019    }
6020    else
6021    {
6022       DU_LOG("\nERROR  -->  DU_APP : Recevied F1ap Pdu is null at freeInitUlRrcMsgTransfer()");
6023       return RFAILED;
6024    }
6025    return ROK;
6026 }
6027
6028 /*******************************************************************
6029  *
6030  * @brief Builds and sends the InitialULRRCMessage 
6031  *
6032  * @details
6033  *
6034  *    Function : BuildAndSendInitialRrcMsgTransfer 
6035  *
6036  *    Functionality: Constructs the Initial UL RRC Message Transfer and sends
6037  *                   it to the CU through SCTP.
6038  *
6039  * @params[in] 
6040  *
6041  * @return ROK     - success
6042  *         RFAILED - failure
6043  *
6044  * ****************************************************************/
6045 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
6046       uint16_t rrcContSize, uint8_t *rrcContainer)
6047 {
6048    uint8_t   ret;
6049    uint8_t   elementCnt;
6050    uint8_t   ieIdx;
6051    asn_enc_rval_t  encRetVal;
6052    F1AP_PDU_t  *f1apMsg = NULLP;
6053    InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
6054    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6055
6056    while(true)
6057    {
6058       DU_LOG("\n INFO   -->  F1AP : Building RRC Setup Request\n");
6059       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6060       if(f1apMsg == NULLP)
6061       {
6062          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
6063          break;
6064       }
6065       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6066       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6067       if(f1apMsg->choice.initiatingMessage == NULLP)
6068       {
6069          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU failed");
6070          break;
6071       }
6072       f1apMsg->choice.initiatingMessage->procedureCode =\
6073                                                         ProcedureCode_id_InitialULRRCMessageTransfer;
6074       f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
6075       f1apMsg->choice.initiatingMessage->value.present = \
6076                                                          InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
6077       initULRRCMsg =\
6078                     &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
6079       elementCnt = 5;
6080       initULRRCMsg->protocolIEs.list.count = elementCnt;
6081       initULRRCMsg->protocolIEs.list.size = \
6082                                             elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
6083       /* Initialize the F1Setup members */
6084       DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
6085       if(initULRRCMsg->protocolIEs.list.array == NULLP)
6086       {
6087          DU_LOG(" ERROR  -->  F1AP : Memory allocation for\
6088                RRCSetupRequestMessageTransferIEs failed");
6089          break;
6090       }
6091       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
6092       {
6093          DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx],\
6094                sizeof(InitialULRRCMessageTransferIEs_t));
6095          if(initULRRCMsg->protocolIEs.list.array[ieIdx] == NULLP)
6096          {
6097             break;
6098          }
6099       }
6100       ieIdx = 0;
6101       /*GNB DU UE F1AP ID*/
6102       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6103                                                         ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6104       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  = Criticality_reject;
6105       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
6106                                                                   InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
6107       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
6108
6109
6110       /*NRCGI*/
6111       ieIdx++;
6112       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6113                                                         ProtocolIE_ID_id_NRCGI;
6114       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  =Criticality_reject;
6115       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
6116                                                                   InitialULRRCMessageTransferIEs__value_PR_NRCGI;
6117
6118       ret =\
6119            BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
6120       if(ret!=ROK)
6121       {
6122          break;
6123       }
6124
6125       /*CRNTI*/
6126       ieIdx++;
6127       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6128                                                         ProtocolIE_ID_id_C_RNTI;
6129       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
6130       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
6131                                                                  InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
6132       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.C_RNTI = crnti;
6133
6134       /*RRCContainer*/
6135       ieIdx++;
6136       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6137                                                         ProtocolIE_ID_id_RRCContainer;
6138       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
6139       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
6140                                                                  InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
6141
6142       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = rrcContSize;
6143       DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
6144             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size)
6145       if(!initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
6146       {
6147          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
6148          break;
6149       
6150       }
6151       memcpy(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, rrcContainer,
6152             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
6153
6154
6155       /*DUtoCURRCContainer*/
6156       ieIdx++;
6157       initULRRCMsg->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCContainer;
6158       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
6159       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
6160                                                                  InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
6161
6162       ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer);
6163       if(ret != ROK)
6164       {
6165          break;
6166       }
6167
6168       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6169
6170       /* Encode the F1SetupRequest type as APER */
6171       memset(encBuf, 0, ENC_BUF_MAX_LEN);
6172       encBufSize = 0;
6173       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6174       /* Encode results */
6175       if(encRetVal.encoded == ENCODE_FAIL)
6176       {
6177          DU_LOG( "\nERROR  --> F1AP : Could not encode Initial UL RRC Message Transfer\
6178                structure (at %s)\n",encRetVal.failed_type ? \
6179                encRetVal.failed_type->name : "unknown");
6180          ret = RFAILED;
6181          break;
6182       }
6183       else
6184       {
6185
6186          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for Initial UL RRC\
6187                Message transfer\n");
6188          for(int i=0; i< encBufSize; i++)
6189          {
6190             printf("%x",encBuf[i]);
6191          }
6192       }
6193       /* Sending  msg  */
6194       if(sendF1APMsg() != ROK)
6195       {
6196          DU_LOG("\nERROR  -->  F1AP : Sending Initial UL RRC Message Transfer Failed");
6197          ret = RFAILED;
6198          break;
6199       }
6200       break;
6201    }
6202    freeInitUlRrcMsgTransfer(f1apMsg);
6203    return ret;
6204 }/* End of BuildAndSendInitialRrcMsgTransfer*/
6205
6206 /*****  UE SETUP REQUEST *****/
6207
6208 /*******************************************************************
6209  *
6210  * @brief Free Qos And Snssai Drb Info
6211  *
6212  * @details
6213  *
6214  *    Function : freeDrbQosAndSnssaiInfo
6215  *
6216  *    Functionality: Free Qos And Snssai Drb Info
6217  *
6218  * @params[in] LcCfg *lcCfg,
6219  * @return void
6220  *
6221  * ****************************************************************/
6222 void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
6223 {
6224    if(lcCfg->snssai)
6225    {
6226       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
6227    }
6228    if(lcCfg->drbQos)
6229    {
6230       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
6231    }
6232 }
6233
6234 /******************************************************************
6235 *
6236 * @brief Function to delete the RLC Lc cfg from UE APP DB
6237 *
6238 * @details
6239 *
6240 *  Function : freeRlcLcCfg
6241 *
6242 *  Functionality: Function to delete the RLC Lc cfg from UE APP DB
6243 *
6244 *
6245  *****************************************************************/
6246
6247 void freeRlcLcCfg(RlcBearerCfg *lcCfg)
6248 {
6249    switch(lcCfg->rlcMode)
6250    {
6251       case RLC_AM :
6252          {
6253             if(lcCfg->u.amCfg)
6254             {
6255                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
6256             }
6257             break;
6258          }
6259       case RLC_UM_BI_DIRECTIONAL :
6260          {
6261             if(lcCfg->u.umBiDirCfg)
6262             {
6263                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
6264             }
6265             break;
6266          }
6267       case RLC_UM_UNI_DIRECTIONAL_UL :
6268          {
6269             if(lcCfg->u.umUniDirUlCfg)
6270             {
6271                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
6272             }
6273             break;
6274
6275          }
6276       case RLC_UM_UNI_DIRECTIONAL_DL :
6277          {
6278             if(lcCfg->u.umUniDirDlCfg)
6279             {
6280                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
6281             }
6282             break;
6283          }
6284       default:
6285          DU_LOG("\nERROR  -->  DU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode);
6286          break;
6287    }
6288 }
6289
6290 /*******************************************************************
6291  *
6292  * @brief Function to free MacLcCfg
6293  *
6294  * @details
6295  *
6296  *    Function : freeMacLcCfg
6297  *
6298  *    Functionality: Function to free MacLcCfg
6299  *
6300  * @params[in] LcCfg *lcCfg,
6301  * @return void
6302  *
6303  * ****************************************************************/
6304
6305 void  freeMacLcCfg(LcCfg *lcCfg)
6306 {
6307     /* Deleting DRBQOS */
6308    if(lcCfg->drbQos)
6309    {
6310       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
6311    }
6312    /* Deleting SNSSAI */
6313    if(lcCfg->snssai)
6314    {
6315       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
6316    }
6317 }
6318 /*******************************************************************
6319  *
6320  * @brief Free UE NR Capability received in UE Context setup request
6321  *
6322  * @details
6323  *
6324  *    Function : freeAperDecodeUeNrCapability
6325  *
6326  *    Functionality:  
6327  *       Free UE NR Capability received in UE Context setup request
6328  *
6329  * @params[in] 
6330  * @return ROK     - success
6331  *         RFAILED - failure
6332  *
6333  * ****************************************************************/
6334 void freeAperDecodeUeNrCapability(void *ueNrCapability)
6335 {
6336    uint8_t arrIdx =0;
6337    FeatureSets_t *featureSets =NULLP;
6338    UE_NR_Capability_t *ueNrCap = (UE_NR_Capability_t *)ueNrCapability;
6339
6340    if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6341    {
6342       for(arrIdx = 0; arrIdx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; arrIdx++)
6343       {
6344          if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx])
6345             free(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx]);
6346       }
6347       free(ueNrCap->rf_Parameters.supportedBandListNR.list.array);
6348    }
6349
6350    if(ueNrCap->featureSets)
6351    {
6352       featureSets = ueNrCap->featureSets;
6353       if(featureSets->featureSetsDownlinkPerCC)
6354       {
6355          if(featureSets->featureSetsDownlinkPerCC->list.array)
6356          {
6357             for(arrIdx = 0; arrIdx < featureSets->featureSetsDownlinkPerCC->list.count; arrIdx++)
6358             {
6359                if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx])
6360                {
6361                   if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL)
6362                      free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL);
6363                   free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]);
6364                }
6365             }
6366             free(featureSets->featureSetsDownlinkPerCC->list.array);
6367          }
6368          free(featureSets->featureSetsDownlinkPerCC);
6369       }
6370       if(featureSets->featureSetsUplinkPerCC)
6371       {
6372          if(featureSets->featureSetsUplinkPerCC->list.array)
6373          {
6374             for(arrIdx = 0; arrIdx < featureSets->featureSetsUplinkPerCC->list.count; arrIdx++)
6375             {
6376                if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx])
6377                {
6378                   if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL)
6379                      free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL);
6380                   free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]);
6381                }
6382             }
6383             free(featureSets->featureSetsUplinkPerCC->list.array);
6384          }
6385          free(featureSets->featureSetsUplinkPerCC);
6386       }
6387       free(ueNrCap->featureSets);
6388    }   
6389 }
6390
6391 /*******************************************************************
6392 *
6393 * @brief Function to free PdcchSearchSpcToAddModList
6394          where memory allocated by aper_decoder
6395 *
6396 * @details
6397 *
6398 *    Function : freeAperDecodePdcchSearchSpcToAddModList 
6399 *
6400 *    Functionality: Function to free PdcchSearchSpcToAddModList
6401 *
6402 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
6403 * @return void
6404 *
6405 * ****************************************************************/
6406
6407 void freeAperDecodePdcchSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
6408 {
6409    uint8_t searchSpcArrIdx=0;
6410    uint8_t searchSpcArrIdx1=0;
6411    struct  SearchSpace *searchSpc=NULLP;
6412
6413
6414    if(searchSpcList->list.array)
6415    {
6416       if(searchSpcList->list.array[searchSpcArrIdx1])
6417       {
6418          searchSpc = searchSpcList->list.array[searchSpcArrIdx1];
6419          if(searchSpc->controlResourceSetId)
6420          {
6421             if(searchSpc->monitoringSlotPeriodicityAndOffset)
6422             {
6423                if(searchSpc->monitoringSymbolsWithinSlot)
6424                {
6425                   if(searchSpc->monitoringSymbolsWithinSlot->buf)
6426                   {
6427                      if(searchSpc->nrofCandidates)
6428                      {
6429                         if(searchSpc->searchSpaceType)
6430                         {
6431                            free(searchSpc->searchSpaceType->choice.ue_Specific);
6432                            free(searchSpc->searchSpaceType);
6433                         }
6434                         free(searchSpc->nrofCandidates);
6435                      }
6436                      free(searchSpc->monitoringSymbolsWithinSlot->buf);
6437                   }
6438                   free(searchSpc->monitoringSymbolsWithinSlot);
6439                }
6440                free(searchSpc->monitoringSlotPeriodicityAndOffset);
6441             }
6442             free(searchSpc->controlResourceSetId);
6443          }
6444       }
6445       for(searchSpcArrIdx = 0; searchSpcArrIdx < searchSpcList->list.count; searchSpcArrIdx++)
6446       {
6447          free(searchSpcList->list.array[searchSpcArrIdx]);
6448       }
6449       free(searchSpcList->list.array);
6450    }
6451 }
6452 /*******************************************************************
6453 *
6454 * @brief Function for free part for the memory allocated by aper_decoder
6455
6456 * @details
6457 *
6458 *    Function : freeAperDecodeBWPDlDedPdcchConfig
6459 *
6460 *    Functionality: Function to free BWPDlDedPdcchConfig
6461 *
6462 * @params[in] 
6463 * @return void
6464 *
6465 * ****************************************************************/
6466
6467
6468 void freeAperDecodeBWPDlDedPdcchConfig(BWP_DownlinkDedicated_t *dlBwp)
6469 {
6470    uint8_t arrIdx1=0;
6471    uint8_t arrIdx2=0;
6472    struct PDCCH_Config *pdcchCfg=NULLP;
6473    struct ControlResourceSet *controlRSet=NULLP;
6474    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6475    
6476    if(dlBwp->pdcch_Config->choice.setup)
6477    {
6478       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6479       if(pdcchCfg->controlResourceSetToAddModList)
6480       {
6481          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6482          if(controlRSetList->list.array)
6483          {
6484             controlRSet = controlRSetList->list.array[arrIdx2];
6485             if(controlRSet)
6486             {
6487                if(controlRSet->frequencyDomainResources.buf)
6488                {
6489                   if(controlRSet->pdcch_DMRS_ScramblingID)
6490                   {
6491                      if(pdcchCfg->searchSpacesToAddModList)
6492                      {
6493                         freeAperDecodePdcchSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6494                         free(pdcchCfg->searchSpacesToAddModList);
6495                      }
6496                      free(controlRSet->pdcch_DMRS_ScramblingID);
6497                   }
6498                   free(controlRSet->frequencyDomainResources.buf);
6499                }
6500             }
6501             for(arrIdx1 = 0; arrIdx1 <controlRSetList->list.count; arrIdx1++)
6502             {
6503                free(controlRSetList->list.array[arrIdx1]);
6504             }
6505             free(controlRSetList->list.array);
6506          }
6507          free(pdcchCfg->controlResourceSetToAddModList);
6508       }
6509       free(dlBwp->pdcch_Config->choice.setup);
6510    }
6511 }
6512 /*******************************************************************
6513 *
6514 * @brief Function to free PdschTimeDomAllocationList 
6515 *     where the memory allocated by aper_decoder
6516
6517 * @details
6518 *
6519 *    Function : freeAperDecodePdschTimeDomAllocationList
6520 *
6521 *    Functionality: Function to free PdschTimeDomAllocationList
6522 *
6523 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList 
6524 * @return void
6525 *
6526 * ****************************************************************/
6527
6528
6529 void freeAperDecodePdschTimeDomAllocationList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
6530 {
6531    uint8_t arrIdx=0;
6532
6533    if(timeDomAllocList->choice.setup)
6534    {
6535       if(timeDomAllocList->choice.setup->list.array)
6536       {
6537          for(arrIdx = 0; arrIdx <timeDomAllocList->choice.setup->list.count ; arrIdx++)
6538          {
6539             free(timeDomAllocList->choice.setup->list.array[arrIdx]);
6540          }
6541          free(timeDomAllocList->choice.setup->list.array);
6542       }
6543       free(timeDomAllocList->choice.setup);
6544    }
6545 }
6546
6547 /*******************************************************************
6548 *
6549 * @brief Function to free BWPDlDedPdschConfig 
6550 *        where the memory allocated by aper_decoder
6551 *  
6552 * @details
6553 *
6554 *    Function : freeAperDecodeBWPDlDedPdschConfig 
6555 *
6556 *    Functionality: Function to free BWPDlDedPdschConfig 
6557 *
6558 * @params[in] BWP_DownlinkDedicated_t *dlBwp 
6559 * @return void
6560 *
6561 * ****************************************************************/
6562
6563
6564 void freeAperDecodeBWPDlDedPdschConfig(BWP_DownlinkDedicated_t *dlBwp)
6565 {
6566    struct PDSCH_Config *pdschCfg=NULLP;
6567    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6568    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6569    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6570
6571    if(dlBwp->pdsch_Config->choice.setup)
6572    {
6573       pdschCfg=dlBwp->pdsch_Config->choice.setup;
6574       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6575       {
6576          if(pdschCfg->pdsch_TimeDomainAllocationList)
6577          {
6578             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6579             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6580             {
6581                prbBndlType=&pdschCfg->prb_BundlingType;
6582                free(prbBndlType->choice.staticBundling);
6583                free(pdschCfg->maxNrofCodeWordsScheduledByDCI);
6584             }
6585             freeAperDecodePdschTimeDomAllocationList(timeDomAllocList);
6586             free(pdschCfg->pdsch_TimeDomainAllocationList);
6587          }
6588          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6589          if(dmrsDlCfg->choice.setup)
6590          {
6591             free(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition);
6592             free(dmrsDlCfg->choice.setup);
6593          }
6594          free(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA);
6595       }
6596       free(dlBwp->pdsch_Config->choice.setup);
6597    }
6598 }
6599 /*******************************************************************
6600 *
6601 * @brief Function to free PuschTimeDomAllocListCfg
6602                  where the memory allocated by aper_decoder
6603 *
6604 * @details
6605 *
6606 *    Function : freeAperDecodePuschTimeDomAllocListCfg
6607 *
6608 *    Functionality: Function to free PuschTimeDomAllocListCfg
6609 *
6610 * @params[in] PUSCH_Config_t *puschCfg 
6611 * @return void
6612 *
6613 * ****************************************************************/
6614
6615
6616 void freeAperDecodePuschTimeDomAllocListCfg(PUSCH_Config_t *puschCfg)
6617 {
6618    uint8_t arrIdx=0;
6619    uint8_t arrIdx1=0;
6620    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
6621
6622    if(puschCfg->pusch_TimeDomainAllocationList)
6623    {
6624       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
6625       if(timeDomAllocList_t->choice.setup)
6626       {
6627          if(timeDomAllocList_t->choice.setup->list.array)
6628          {
6629             free(timeDomAllocList_t->choice.setup->list.array[arrIdx1]->k2);
6630             for(arrIdx = 0; arrIdx<timeDomAllocList_t->choice.setup->list.count; arrIdx++)
6631             {
6632                free(timeDomAllocList_t->choice.setup->list.array[arrIdx]);
6633             }
6634             free(timeDomAllocList_t->choice.setup->list.array);
6635          }
6636          free(timeDomAllocList_t->choice.setup);
6637       }
6638       free(puschCfg->transformPrecoder);
6639       free(puschCfg->pusch_TimeDomainAllocationList);
6640    }
6641 }
6642 /*******************************************************************
6643 *
6644 * @brief Function to free InitialUlBWPConfig where memory allocated by aper_decoder
6645 *
6646 * @details
6647 *
6648 *    Function : freeAperDecodeInitialUlBWPConfig 
6649 *
6650 *    Functionality: Function to free InitialUlBWPConfig
6651 *
6652 * @params[in]  BWP_UplinkDedicated_t *ulBwp
6653 * @return void
6654 *
6655 * ****************************************************************/
6656
6657
6658 void freeAperDecodeInitialUlBWPConfig(BWP_UplinkDedicated_t *ulBwp)
6659 {
6660    uint8_t  rSetIdx =0;
6661    uint8_t  rsrcIdx =0;
6662    SRS_Config_t   *srsCfg = NULLP;
6663    PUSCH_Config_t *puschCfg = NULLP;
6664    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
6665    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
6666    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
6667    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
6668
6669    if(ulBwp->pusch_Config)
6670    {
6671       if(ulBwp->pusch_Config->choice.setup)
6672       {
6673          puschCfg=ulBwp->pusch_Config->choice.setup;
6674          if(puschCfg->dataScramblingIdentityPUSCH)
6675          {
6676             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
6677             {
6678                freeAperDecodePuschTimeDomAllocListCfg(puschCfg);
6679                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
6680                if(dmrsUlCfg->choice.setup)
6681                {
6682                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
6683                   {
6684                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
6685                      {
6686                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0);
6687                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled);
6688                      }
6689                      free(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition);
6690                   }
6691                   free(dmrsUlCfg->choice.setup);
6692                }
6693                free(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA);
6694             }
6695             free(puschCfg->dataScramblingIdentityPUSCH);
6696          }
6697          free(ulBwp->pusch_Config->choice.setup);
6698       }
6699       free(ulBwp->pusch_Config);
6700
6701       /* Free SRS-Config */
6702       if(ulBwp->srs_Config)
6703       {
6704          if(ulBwp->srs_Config->choice.setup)
6705          {
6706             srsCfg = ulBwp->srs_Config->choice.setup;
6707
6708             /* Free Resource Set to add/mod list */
6709             if(srsCfg->srs_ResourceSetToAddModList)
6710             {
6711                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
6712                if(rsrcSetList->list.array)
6713                {
6714                   rSetIdx = 0;
6715
6716                   /* Free SRS resource Id list in this SRS resource set */
6717                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
6718                   {
6719                      rsrcIdList =
6720                         rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
6721
6722                      if(rsrcIdList->list.array)
6723                      {
6724                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count;
6725                               rsrcIdx++)
6726                         {
6727                            free(rsrcIdList->list.array[rsrcIdx]);
6728                         }
6729                         free(rsrcIdList->list.array);
6730                      }
6731                      free(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList);
6732                   }
6733
6734                   /* Free resource type info for this SRS resource set */
6735
6736                   free(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic);
6737
6738                   /* Free memory for each resource set */
6739                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
6740                   {
6741                      free(rsrcSetList->list.array[rSetIdx]);
6742                   }
6743                   free(rsrcSetList->list.array);
6744                }
6745                free(srsCfg->srs_ResourceSetToAddModList);
6746             }
6747
6748             /* Free resource to add/modd list */
6749             if(srsCfg->srs_ResourceToAddModList)
6750             {
6751                resourceList = srsCfg->srs_ResourceToAddModList;
6752                if(resourceList->list.array)
6753                {
6754                   rsrcIdx = 0;
6755
6756                   free(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2);
6757                   free(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic);
6758
6759                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
6760                   {
6761                      free(resourceList->list.array[rsrcIdx]);
6762                   }
6763                   free(resourceList->list.array);
6764                }
6765                free(srsCfg->srs_ResourceToAddModList);
6766             }
6767
6768             free(ulBwp->srs_Config->choice.setup);
6769          }
6770          free(ulBwp->srs_Config);
6771       }
6772    }
6773 }
6774 /*******************************************************************
6775 *
6776 * @brief Function to free initialUplinkBWPConfig where memory allocated by aper_decoder
6777 *
6778 * @details
6779 *
6780 *    Function : freeAperDecodeinitialUplinkBWPConfig
6781 *
6782 *    Functionality: Function to free initialUplinkBWPConfig
6783 *
6784 * @params[in] UplinkConfig_t *ulCfg 
6785 * @return void
6786 *
6787 * ****************************************************************/
6788
6789
6790 void freeAperDecodeinitialUplinkBWPConfig(UplinkConfig_t *ulCfg)
6791 {
6792    BWP_UplinkDedicated_t *ulBwp=NULLP;
6793    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6794    
6795    if(ulCfg->initialUplinkBWP)
6796    {
6797       ulBwp=ulCfg->initialUplinkBWP;
6798       if(ulCfg->firstActiveUplinkBWP_Id)
6799       {
6800          if(ulCfg->pusch_ServingCellConfig)
6801          {
6802             puschCfg=ulCfg->pusch_ServingCellConfig;
6803             if(puschCfg->choice.setup)
6804             {
6805                if(puschCfg->choice.setup->ext1)
6806                {
6807                   free(puschCfg->choice.setup->ext1->processingType2Enabled);
6808                   free(puschCfg->choice.setup->ext1->maxMIMO_Layers);
6809                   free(puschCfg->choice.setup->ext1);
6810                }
6811                free(puschCfg->choice.setup);
6812             }
6813             free(ulCfg->pusch_ServingCellConfig);
6814          }
6815          free(ulCfg->firstActiveUplinkBWP_Id);
6816       }
6817       freeAperDecodeInitialUlBWPConfig(ulBwp);
6818       free(ulCfg->initialUplinkBWP);
6819    }
6820 }
6821
6822 /*******************************************************************
6823  *
6824  * @brief Function to free DuUeCfg
6825  *
6826  * @details
6827  *
6828  *    Function : freeDuUeCfg
6829  *
6830  *    Functionality: Function to free DuUeCfg
6831  *
6832  * @params[in] DuUeCfg *ueCfg
6833  * @return void
6834  *
6835  * ****************************************************************/
6836 void freeDuUeCfg(DuUeCfg *ueCfg)
6837 {
6838    uint8_t lcIdx = 0;
6839    uint8_t arrIdx = 0;
6840    SpCellConfig_t *spCellCfg = NULLP;
6841    ServingCellConfig_t *srvCellCfg = NULLP;
6842    BWP_DownlinkDedicated_t *dlBwp = NULLP;
6843    MAC_CellGroupConfig_t *macCellGrpCfg = NULLP;
6844    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
6845    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList = NULLP;
6846    struct RLC_Config *rlcConfig = NULLP;
6847    struct LogicalChannelConfig *macLcConfig = NULLP;
6848    struct SchedulingRequestConfig *schedulingRequestConfig = NULLP;
6849    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList = NULLP;
6850    struct TAG_Config *tagConfig = NULLP;
6851    struct TAG_Config__tag_ToAddModList *tagList = NULLP;
6852    struct MAC_CellGroupConfig__phr_Config *phrConfig = NULLP;
6853    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg = NULLP;
6854    CellGroupConfigRrc_t *cellGrpCfg = ueCfg->cellGrpCfg;
6855   
6856    if(ueCfg->ueNrCapability)
6857    {
6858       freeAperDecodeUeNrCapability(ueCfg->ueNrCapability);
6859       DU_FREE(ueCfg->ueNrCapability, sizeof(UE_NR_Capability_t));
6860       ueCfg->ueNrCapability = NULLP;
6861    }
6862
6863    if(ueCfg->cellGrpCfg)
6864    {
6865       
6866       rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6867       if(rlcBearerList)
6868       {
6869          if(rlcBearerList->list.array)
6870          {
6871             for(arrIdx=0; arrIdx<rlcBearerList->list.count; arrIdx++)
6872             {
6873                if(rlcBearerList->list.array[arrIdx])
6874                {
6875                   rlcConfig   = rlcBearerList->list.array[arrIdx]->rlc_Config;
6876                   macLcConfig = rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig;
6877                   
6878                   if(rlcBearerList->list.array[arrIdx]->servedRadioBearer)
6879                   {
6880                      free(rlcBearerList->list.array[arrIdx]->servedRadioBearer);
6881                   }
6882                   if(rlcConfig)
6883                   {
6884                      if(rlcConfig->choice.am)
6885                      {
6886                         free(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength);
6887                         free(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength);
6888                         free(rlcConfig->choice.am);
6889                      }
6890                      free(rlcBearerList->list.array[arrIdx]->rlc_Config);
6891                   }
6892                   if(macLcConfig)
6893                   {
6894                      if(macLcConfig->ul_SpecificParameters)
6895                      {
6896                         free(macLcConfig->ul_SpecificParameters->schedulingRequestID);
6897                         free(macLcConfig->ul_SpecificParameters->logicalChannelGroup);
6898                         free(macLcConfig->ul_SpecificParameters);
6899                      }
6900                      free(rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig);
6901                   }
6902                   free(rlcBearerList->list.array[arrIdx]); 
6903                }
6904             }
6905             free(rlcBearerList->list.array);
6906          }
6907          free(cellGrpCfg->rlc_BearerToAddModList);
6908       }
6909
6910       macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6911       if(macCellGrpCfg)
6912       {
6913          schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6914          if(schedulingRequestConfig)
6915          {
6916             schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6917             if(schReqList)
6918             {
6919                if(schReqList->list.array)
6920                {
6921                   for(arrIdx=0;arrIdx<schReqList->list.count; arrIdx++)
6922                   {
6923                      if(schReqList->list.array[arrIdx])
6924                      {
6925                         free(schReqList->list.array[arrIdx]->sr_ProhibitTimer); 
6926                         free(schReqList->list.array[arrIdx]);
6927                      }
6928                   }
6929                   free(schReqList->list.array);
6930                }
6931                free(schedulingRequestConfig->schedulingRequestToAddModList);
6932             }
6933             free(macCellGrpCfg->schedulingRequestConfig);
6934          }
6935          if(macCellGrpCfg->bsr_Config)
6936          {
6937             free(macCellGrpCfg->bsr_Config);
6938          }
6939          tagConfig = macCellGrpCfg->tag_Config;
6940          if(tagConfig)
6941          {
6942             tagList = tagConfig->tag_ToAddModList;
6943             if(tagList)
6944             {
6945                if(tagList->list.array)
6946                {
6947                   for(arrIdx=0; arrIdx<tagList->list.count; arrIdx++)
6948                   {
6949                      free(tagList->list.array[arrIdx]);
6950                   }
6951                   free(tagList->list.array);
6952                }
6953                free(tagConfig->tag_ToAddModList);
6954             }
6955             free(tagConfig); 
6956          }
6957
6958          phrConfig = macCellGrpCfg->phr_Config;
6959          if(phrConfig)
6960          {
6961             free(phrConfig->choice.setup); 
6962             free(phrConfig); 
6963          }
6964
6965          free(macCellGrpCfg); 
6966       }
6967
6968       phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6969       if(phyCellGrpCfg)
6970       {
6971          free(phyCellGrpCfg->p_NR_FR1);
6972          free(phyCellGrpCfg); 
6973       }
6974
6975       spCellCfg = cellGrpCfg->spCellConfig;
6976       if(spCellCfg)
6977       {
6978          if(spCellCfg->servCellIndex)
6979          {
6980             if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6981             {
6982                if(spCellCfg->spCellConfigDedicated)
6983                {
6984                   srvCellCfg = spCellCfg->spCellConfigDedicated;
6985                   if(srvCellCfg->initialDownlinkBWP)
6986                   {
6987                      dlBwp = srvCellCfg->initialDownlinkBWP;
6988                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
6989                      {
6990                         if(srvCellCfg->defaultDownlinkBWP_Id)
6991                         {
6992                            if(srvCellCfg->uplinkConfig)
6993                            {
6994
6995                               if(srvCellCfg->pdsch_ServingCellConfig)
6996                               {
6997                                  pdschCfg=
6998                                     srvCellCfg->pdsch_ServingCellConfig;
6999                                  if(pdschCfg->choice.setup)
7000                                  {
7001
7002                                     free(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH);
7003                                     free(pdschCfg->choice.setup);
7004                                  }
7005
7006                                  free(srvCellCfg->pdsch_ServingCellConfig);
7007                               }
7008
7009                               freeAperDecodeinitialUplinkBWPConfig(srvCellCfg->uplinkConfig);
7010                               free(srvCellCfg->uplinkConfig);
7011                            }
7012                            free(srvCellCfg->defaultDownlinkBWP_Id);
7013                         }
7014
7015                         free(srvCellCfg->firstActiveDownlinkBWP_Id);
7016                      }
7017                      if(dlBwp->pdcch_Config)
7018                      {
7019                         if(dlBwp->pdsch_Config)
7020                         {
7021                            freeAperDecodeBWPDlDedPdschConfig(dlBwp);
7022                            free(dlBwp->pdsch_Config);
7023                         }
7024                         freeAperDecodeBWPDlDedPdcchConfig(dlBwp);
7025                         free(dlBwp->pdcch_Config);
7026                      }
7027                      free(srvCellCfg->initialDownlinkBWP);
7028                   }
7029
7030                   free(spCellCfg->spCellConfigDedicated);
7031                }
7032                free(spCellCfg->rlmInSyncOutOfSyncThreshold);
7033             }
7034             free(spCellCfg->servCellIndex); 
7035          }
7036          free(spCellCfg);
7037       }
7038       DU_FREE(ueCfg->cellGrpCfg, sizeof(CellGroupConfigRrc_t));
7039       ueCfg->cellGrpCfg = NULLP;
7040    }
7041    if(ueCfg->ambrCfg)
7042    {
7043       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->ambrCfg, sizeof(AmbrCfg));
7044    }
7045    for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++)
7046    {
7047       freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]);
7048    }
7049    for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
7050    {
7051       freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
7052    }
7053    for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++)
7054    {
7055       DU_FREE(ueCfg->upTnlInfo[lcIdx].tnlCfg1, sizeof(GtpTnlCfg));
7056    }
7057 }
7058
7059 /*******************************************************************
7060  *
7061  * @brief Function to free UecontextSetupDb
7062  *
7063  * @details
7064  *
7065  *    Function : freeF1UeDb
7066  *
7067  *    Functionality: Function to free UecontextSetupDb
7068  *
7069  * @params[in] UecontextSetupDb *
7070  * @return void
7071  *
7072  * ****************************************************************/
7073
7074 void freeF1UeDb(F1UeContextSetupDb *f1UeDb)
7075 {
7076    
7077    if(f1UeDb->dlRrcMsg)
7078    {
7079       if(f1UeDb->dlRrcMsg->rrcMsgPdu)
7080       {
7081         //DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,\
7082                f1UeDb->dlRrcMsg->rrcMsgPdu, f1UeDb->dlRrcMsg->rrcMsgSize);
7083       }
7084       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
7085    }
7086    freeDuUeCfg(&f1UeDb->duUeCfg);
7087    memset(f1UeDb, 0, sizeof(F1UeContextSetupDb));
7088    DU_FREE(f1UeDb, sizeof(F1UeContextSetupDb));
7089 }
7090
7091 /*******************************************************************
7092  *
7093  * @brief Function to build Am cfg Info
7094  *
7095  * @details
7096  *
7097  *    Function : extractRlcAmCfg
7098  *
7099  *    Functionality: Function to build Am cfg Info
7100  *
7101  * @params[in] AmBearerCfg *
7102  *             void *
7103  *
7104  * @return ROK/RFAILED
7105  *
7106  * ****************************************************************/
7107
7108 void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg)
7109 {
7110    if(rlcAmCfg)
7111    {
7112       /* UL AM */
7113       if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
7114       {
7115          amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength);
7116          /*TODO: Check the timer value when sent by real CU */
7117          amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly; 
7118          amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit;
7119       }
7120
7121       /* DL AM */
7122       if(rlcAmCfg->ul_AM_RLC.sn_FieldLength)
7123       {
7124          amCfgToSet->dlAmCfg.snLenDl = *(rlcAmCfg->ul_AM_RLC.sn_FieldLength);
7125          amCfgToSet->dlAmCfg.pollRetxTmr = rlcAmCfg->ul_AM_RLC.t_PollRetransmit;
7126          amCfgToSet->dlAmCfg.pollPdu   = rlcAmCfg->ul_AM_RLC.pollPDU;
7127          amCfgToSet->dlAmCfg.pollByte  = rlcAmCfg->ul_AM_RLC.pollByte;
7128          amCfgToSet->dlAmCfg.maxRetxTh = rlcAmCfg->ul_AM_RLC.maxRetxThreshold;
7129       }
7130    }
7131 }
7132
7133 /*******************************************************************
7134  *
7135  * @brief Function to build Um Bi Info
7136  *
7137  * @details
7138  *
7139  *    Function : extractRlcUmBiCfg
7140  *
7141  *    Functionality: Function to build Um Bi Info
7142  *
7143  * @params[in] UmBiDirBearerCfg *
7144  *             void *
7145  *
7146  * @return ROK/RFAILED
7147  *
7148  * ****************************************************************/
7149
7150 void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_Directional *rlcBiCfg)
7151 {
7152    if(rlcBiCfg)
7153    {
7154       /* UL UM BI DIR Cfg */
7155       if(rlcBiCfg->dl_UM_RLC.sn_FieldLength)
7156       {
7157          umBiCfgToSet->ulUmCfg.snLenUlUm  = *(rlcBiCfg->dl_UM_RLC.sn_FieldLength);
7158          umBiCfgToSet->ulUmCfg.reAssemTmr = rlcBiCfg->dl_UM_RLC.t_Reassembly;
7159       }
7160
7161       /* DL UM BI DIR Cfg */
7162       if(rlcBiCfg->ul_UM_RLC.sn_FieldLength)
7163          umBiCfgToSet->dlUmCfg.snLenDlUm  = *(rlcBiCfg->ul_UM_RLC.sn_FieldLength);
7164    }
7165 }
7166
7167 /*******************************************************************
7168  *
7169  * @brief Function to build Um Ul Info
7170  *
7171  * @details
7172  *
7173  *    Function : extractRlcUmUlCfg
7174  *
7175  *    Functionality: Function to build Um Ul Info
7176  *
7177  * @params[in] UmUniDirUlBearerCfg *
7178  *             void *
7179  *
7180  * @return ROK/RFAILED
7181  *
7182  * ****************************************************************/
7183
7184 void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_Uni_Directional_DL *umUlCfg)
7185 {
7186    if(umUlCfg)
7187    {
7188       if(umUlCfg->dl_UM_RLC.sn_FieldLength)
7189       {
7190          umUlCfgToSet->ulUmCfg.snLenUlUm  = *(umUlCfg->dl_UM_RLC.sn_FieldLength);
7191          umUlCfgToSet->ulUmCfg.reAssemTmr = umUlCfg->dl_UM_RLC.t_Reassembly;
7192       }
7193    }
7194 }
7195
7196 /*******************************************************************
7197  *
7198  * @brief Function to build Um Uni Dl Info
7199  *
7200  * @details
7201  *
7202  *    Function : extractRlcUmDlCfg
7203  *
7204  *    Functionality: Function to build Um Uni Dl Info
7205  *
7206  * @params[in] UmUniDirDlBearerCfg *
7207  *             void *
7208  *
7209  * @return ROK/RFAILED
7210  *
7211  * ****************************************************************/
7212 void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_Uni_Directional_UL *umDlCfg)
7213 {
7214    if(umDlCfg)
7215    {
7216       if(umDlCfg->ul_UM_RLC.sn_FieldLength)
7217          umDlCfgToSet->dlUmCfg.snLenDlUm  = *(umDlCfg->ul_UM_RLC.sn_FieldLength);
7218    }
7219 }
7220
7221 /*******************************************************************
7222  *
7223  * @brief Function to extractRlcModeCfg
7224  *
7225  * @details
7226  *
7227  *    Function : extractRlcModeCfg
7228  *
7229  *    Functionality: Function to extractRlcModeCfg
7230  *
7231  * @params[in] RLC_Config_t *
7232  *             RlcBearerCfg *
7233  *             void  *    
7234  * @return ROK/RFAILED
7235  *
7236  * ****************************************************************/
7237 void extractRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *rlcDbCfg, RLC_Config_t *lcCfg)
7238 {
7239    if(lcCfg)
7240    {
7241       switch(rlcMode)
7242       {
7243          case RLC_AM :
7244             {
7245                if(lcCfg->choice.am)
7246                {
7247                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
7248                   if(rlcDbCfg->u.amCfg)
7249                      extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
7250                }
7251                break;
7252             }
7253          case RLC_UM_BI_DIRECTIONAL :
7254             {
7255                if(lcCfg->choice.um_Bi_Directional)
7256                {
7257                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
7258                   if(rlcDbCfg->u.umBiDirCfg)
7259                      extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
7260                }
7261                break;
7262             }
7263          case RLC_UM_UNI_DIRECTIONAL_UL :
7264             {
7265                if(lcCfg->choice.um_Uni_Directional_DL)
7266                {
7267                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
7268                   if(rlcDbCfg->u.umUniDirUlCfg)
7269                      extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
7270                }
7271                break;
7272             }
7273          case RLC_UM_UNI_DIRECTIONAL_DL :
7274             {
7275                if(lcCfg->choice.um_Uni_Directional_UL)
7276                {
7277                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
7278                   if(rlcDbCfg->u.umUniDirDlCfg)
7279                      extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
7280                }
7281                break;
7282             }
7283          default:
7284             DU_LOG("\nERROR  -->  DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
7285             break;
7286       }
7287    }
7288 }
7289
7290 /*******************************************************************
7291  *
7292  * @brief Function to extract extractUlLcCfg
7293  *
7294  * @details
7295  *
7296  *    Function : extractUlLcCfg
7297  *
7298  *    Functionality: Function to extract extractUlLcCfg
7299  *
7300  * @params[in] UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg
7301  * @return void
7302  *
7303  * ****************************************************************/
7304
7305 void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg)
7306 {
7307    if(ulLcCfg)
7308    {
7309       if(ulLcCfg->ul_SpecificParameters)
7310       {
7311          f1UlLcCfg->priority = \
7312             ulLcCfg->ul_SpecificParameters->priority;
7313       if(ulLcCfg->ul_SpecificParameters->logicalChannelGroup)
7314       {
7315          f1UlLcCfg->lcGroup = \
7316            *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup);
7317       }
7318       if(ulLcCfg->ul_SpecificParameters->schedulingRequestID)
7319       {
7320          f1UlLcCfg->schReqId = \
7321            *(ulLcCfg->ul_SpecificParameters->schedulingRequestID);
7322       }
7323       f1UlLcCfg->pbr = \
7324          ulLcCfg->ul_SpecificParameters->prioritisedBitRate;
7325       f1UlLcCfg->bsd = \
7326          ulLcCfg->ul_SpecificParameters->bucketSizeDuration;
7327       }
7328    }
7329 }
7330
7331 /*******************************************************************
7332  *
7333  * @brief Function to procRlcLcCfg
7334  *
7335  * @details
7336  *
7337  *    Function : procRlcLcCfg
7338  *
7339  *    Functionality: Function to procRlcLcCfg
7340  *
7341  * @params[in] rbId, lcId, rbType, rlcMod
7342  *             RLC_Config_t *, RlcBearerCfg * , 
7343  * @return void
7344  *
7345  * ****************************************************************/
7346
7347 void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\
7348    uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg)
7349 {
7350
7351    lcCfg->rbId   = rbId;
7352    lcCfg->configType = configType;
7353
7354    if(rbType == RB_TYPE_SRB)
7355    {
7356       lcCfg->rbType = RB_TYPE_SRB;
7357       lcCfg->lcId   = rbId;
7358       lcCfg->lcType = LCH_DCCH;
7359       lcCfg->rlcMode = RLC_AM;
7360    }
7361    else if(rbType == RB_TYPE_DRB)
7362    {
7363       lcCfg->rbType = RB_TYPE_DRB;
7364       lcCfg->lcId   = lcId;
7365       lcCfg->lcType = LCH_DTCH;
7366       lcCfg->rlcMode = rlcMode;
7367    }
7368    if(f1RlcCfg) /* rlc mode config recived */
7369    {
7370       extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg);
7371    }
7372 }
7373
7374
7375
7376 /*******************************************************************
7377  *
7378  * @brief Fills DrbQos Info received by CU
7379  *
7380  * @details
7381  *
7382  *    Function : extractQosInfo
7383  *
7384  *    Functionality: Fills DrbQos Info received  by CU
7385  *
7386  * @params[in] DrbQosInfo *qosToAdd, 
7387  *             QoSFlowLevelQoSParameters_t *qosFlowCfg
7388  * @return void
7389  *
7390  * ****************************************************************/
7391
7392 void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg)
7393 {
7394    qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present;
7395    qosToAdd->u.nonDyn5Qi.fiveQi     =\
7396          qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
7397    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow)
7398    {
7399       qosToAdd->u.nonDyn5Qi.avgWindow = \
7400         *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
7401    }
7402    qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \
7403       *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
7404    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel)
7405    {
7406       qosToAdd->u.nonDyn5Qi.priorLevel = \
7407          *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel);
7408    }
7409    qosToAdd->ngRanRetPri.priorityLevel = \
7410       qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; 
7411    qosToAdd->ngRanRetPri.preEmptionCap = \
7412       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability;
7413    qosToAdd->ngRanRetPri.preEmptionVul = \
7414       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability;
7415    if(qosFlowCfg->gBR_QoS_Flow_Information)
7416    {
7417       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \
7418          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \
7419          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size);
7420       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \
7421          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \
7422          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size);
7423       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\
7424          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \
7425          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size);
7426       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\
7427          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \
7428          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size);
7429    }
7430    qosToAdd->pduSessionId = 0;
7431    qosToAdd->ulPduSessAggMaxBitRate = 0;
7432 }
7433
7434 /*******************************************************************
7435  *
7436  * @brief Function to extract GTP Tunnel Info from CU
7437  *
7438  * @details
7439  *
7440  *    Function : extractUpTnlInfo
7441  *
7442  *    Functionality: Function to extract GTP Tunnel Info from CU
7443  *
7444  * @params[in] F1AP message
7445  * @return ROK/RFAILED
7446  *
7447  * ****************************************************************/
7448
7449 uint8_t extractUpTnlInfo(uint8_t drbId, uint8_t configType,\
7450    ULUPTNLInformation_ToBeSetup_List_t *tnlInfo, UpTnlCfg *upTnlInfo)
7451 {
7452    uint8_t tnlIdx;
7453    uint32_t ipv4_du = 0;
7454    GTPTunnel_t *gtpTunnel = NULLP;
7455
7456    upTnlInfo->drbId = drbId; 
7457    upTnlInfo->configType = configType;
7458 #ifdef O1_ENABLE
7459    cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du);
7460 #else
7461    cmInetAddr((char *)DU_IP_V4_ADDR, &ipv4_du);
7462 #endif
7463
7464    for(tnlIdx=0; tnlIdx < tnlInfo->list.count; tnlIdx++)
7465    {
7466       if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
7467       {
7468          if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel)
7469          {
7470             gtpTunnel = tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel;
7471             DU_ALLOC(upTnlInfo->tnlCfg1, sizeof(GtpTnlCfg));
7472             if(upTnlInfo->tnlCfg1 == NULLP)
7473             {
7474                DU_LOG("\nERROR  -->  F1AP : extractUpTnlInfo: Failed to allocate mmeory for tunnel cfg 1");
7475                return RFAILED;
7476             }
7477             bitStringToInt(&gtpTunnel->transportLayerAddress, &upTnlInfo->tnlCfg1->ulTnlAddress);
7478             upTnlInfo->tnlCfg1->dlTnlAddress = ipv4_du;
7479             if(gtpTunnel->gTP_TEID.size > 0)
7480             {
7481                teIdStringToInt(gtpTunnel->gTP_TEID.buf, &upTnlInfo->tnlCfg1->teId);
7482             }
7483          }
7484          break;
7485       }
7486    }
7487    return ROK;
7488 }
7489 /*******************************************************************
7490 *
7491 * @brief Function to extract Drb Qos Cfg Info from CU
7492 *
7493 * @details
7494 *
7495 *    Function : extractDrbQosCfg 
7496 *
7497 *    Functionality: Function to extract Drb Qos Cfg Info from CU
7498 *
7499 * @params[in] DRB_Information_t *drbInfo, LcCfg *macLcToAdd
7500 * @return ROK/RFAILED
7501 *
7502 * ****************************************************************/
7503
7504 uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) 
7505 {
7506    if(!macLcToAdd->drbQos)
7507    {
7508       DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
7509       if(macLcToAdd->drbQos == NULLP)
7510       {
7511          DU_LOG("\nERROR  -->  DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
7512          return RFAILED;
7513       }
7514
7515    }
7516    if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
7517    {
7518       extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
7519       macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
7520    }
7521    if(!macLcToAdd->snssai)
7522    {
7523       DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
7524       if(macLcToAdd->snssai == NULLP)
7525       {
7526          DU_LOG("\nERROR  -->  DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()");
7527          return RFAILED;
7528       }
7529    }
7530    memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
7531          drbInfo->sNSSAI.sST.size);
7532    if(drbInfo->sNSSAI.sD)
7533    {
7534       memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
7535             drbInfo->sNSSAI.sD->size);
7536    }
7537    return ROK;
7538 }
7539 /*******************************************************************
7540  *
7541  * @brief Function to extract DRB info received from CU
7542  *
7543  * @details
7544  *
7545  *    Function : extractDrbCfg
7546  *
7547  *    Functionality: Function to extract DRB info received from CU
7548  *
7549  * @params[in] F1AP message
7550  * @return void
7551  *
7552  * ****************************************************************/
7553 uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem,DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\
7554 LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo)
7555 {
7556    DRB_Information_t *drbInfo = NULLP;
7557
7558    if(drbItem != NULLP)
7559    {
7560       if(extractUpTnlInfo(drbItem->dRBID, CONFIG_ADD, &drbItem->uLUPTNLInformation_ToBeSetup_List, upTnlInfo) != ROK)
7561       {
7562          DU_LOG("\nERROR  -->  DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
7563          return RFAILED;
7564       }
7565       if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
7566       {
7567          if(drbItem->qoSInformation.choice.choice_extension->value.present == QoSInformation_ExtIEs__value_PR_DRB_Information)
7568          {
7569             drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
7570             if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
7571             {
7572                DU_LOG("\nERROR  -->  DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
7573                return RFAILED;
7574             }
7575          }
7576       }
7577    }
7578    else if(drbSetupModItem != NULLP)
7579    {
7580       if(extractUpTnlInfo(drbSetupModItem->dRBID, CONFIG_ADD, &drbSetupModItem->uLUPTNLInformation_ToBeSetup_List,\
7581       upTnlInfo) != ROK)
7582       {
7583          DU_LOG("\nERROR  -->  DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
7584          return RFAILED;
7585       }
7586       if(drbSetupModItem->qoSInformation.present == QoSInformation_PR_choice_extension)
7587       {
7588          if(drbSetupModItem->qoSInformation.choice.choice_extension->value.present ==\
7589          QoSInformation_ExtIEs__value_PR_DRB_Information)
7590          {
7591             drbInfo = &drbSetupModItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
7592             if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
7593             {
7594                DU_LOG("\nERROR  -->  DUAPP : Failed to extract qos Cfg at extractDrbCfg()");  
7595                return RFAILED;
7596             }
7597
7598          }
7599       }
7600    }
7601
7602    return ROK;
7603 }
7604
7605 /*******************************************************************
7606  *
7607  * @brief Function to extract RB info received from CU
7608  *
7609  * @details
7610  *
7611  *    Function : extractMacRbCfg
7612  *
7613  *    Functionality: Function to extract RB info received from CU
7614  *
7615  * @params[in] F1AP message
7616  * @return ROK/RFAILED
7617  *
7618  * ****************************************************************/
7619
7620 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\
7621 DRBs_ToBeSetupMod_Item_t *drbSetupModCfg,  LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
7622 {
7623    if(drbCfg != NULLP)
7624    {
7625       if(extractDrbCfg(drbCfg, NULL, lcCfg, upTnlInfo) != ROK)
7626       {
7627          DU_LOG("ERROR  -->  F1AP : Failed to build Drb Qos at extractMacRbCfg()");
7628          return RFAILED;
7629       }
7630    }
7631    else if(drbSetupModCfg != NULLP)
7632    { 
7633       if(extractDrbCfg(NULL, drbSetupModCfg, lcCfg, upTnlInfo) != ROK)
7634       {
7635          DU_LOG("ERROR  -->  F1AP : Failed to build Drb Qos at extractMacRbCfg()");
7636          return RFAILED;
7637       }
7638    }
7639    else
7640    {
7641       lcCfg->drbQos = NULLP;
7642       lcCfg->snssai = NULLP;
7643       if(lcCfg->lcId == SRB2_LCID)
7644          lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
7645       else
7646          lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
7647    }
7648    if(ulLcCfg)
7649    {
7650       lcCfg->ulLcCfgPres = true;
7651       extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
7652    }
7653    else
7654       lcCfg->ulLcCfgPres = false;
7655    return ROK;
7656 }
7657
7658 /*******************************************************************
7659  *
7660  * @brief Function processing LC config info received from CU
7661  *
7662  * @details
7663  *
7664  *    Function : procMacLcCfg
7665  *
7666  *    Functionality: Function processing LC config info received from CU
7667  *
7668  * @params[in] F1AP message
7669  * @return ROK/RFAILED
7670  *
7671  * ****************************************************************/
7672
7673 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
7674 DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LogicalChannelConfig_t *ulLcCfg,\
7675 LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
7676 {
7677    uint8_t ret = ROK;
7678
7679    lcCfg->lcId = lcId;
7680    lcCfg->configType = configType;
7681    if(rbType == RB_TYPE_SRB)
7682    {
7683       ret = extractMacRbCfg(lcId, NULL,NULL, ulLcCfg, lcCfg, NULL);
7684    }
7685    else if(rbType == RB_TYPE_DRB)
7686    {
7687       if(drbItem != NULL)
7688         ret = extractMacRbCfg(lcId, drbItem, NULL, ulLcCfg, lcCfg, upTnlInfo);
7689       else if(drbSetupModItem != NULL)
7690         ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, ulLcCfg, lcCfg, upTnlInfo);
7691    }
7692    return ret;
7693 }
7694
7695 /*******************************************************************
7696  *
7697  * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
7698  *
7699  * @details
7700  *
7701  *    Function : extractRlcCfgToAddMod
7702  *
7703  *    Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
7704  *
7705  * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
7706  *             DuUeCfg Pointer
7707  * @return ROK/RFAILED
7708  *
7709  * ****************************************************************/
7710
7711 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, DuUeCfg *ueCfgDb)
7712 {
7713   uint8_t idx, rbId, lcId, rlcMode, rbType;
7714   RLC_Config_t *f1RlcCfg = NULLP;
7715   LogicalChannelConfig_t *macUlLcCfg = NULLP;
7716
7717   for(idx = 0; idx < lcCfg->list.count; idx++)
7718   {
7719      lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
7720      if(lcCfg->list.array[idx]->servedRadioBearer)
7721      {
7722         /* RadioBearer for SRB/DRB */
7723         if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7724         RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
7725         {
7726            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
7727            rbType = RB_TYPE_SRB;
7728         }
7729         else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7730         RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
7731         {
7732            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
7733            rbType = RB_TYPE_DRB;
7734         }
7735         else
7736         {
7737            DU_LOG("\nERROR  -->  No components present in Bearer config to ADD/MOD");
7738            return RFAILED;
7739         }
7740         /* MAC UL LC Config */
7741         if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
7742         {
7743            macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
7744         }
7745      }
7746      else
7747      {
7748         DU_LOG("\nERROR  -->  DUAPP: Received RadioBearer config is NULL");
7749         return RFAILED;
7750      }
7751      /* RLC Mode Config */
7752      if(lcCfg->list.array[idx]->rlc_Config)
7753      {
7754         rlcMode  = lcCfg->list.array[idx]->rlc_Config->present;
7755         f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
7756      }
7757      
7758      /* Filling RLC/MAC Config*/
7759      memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
7760      memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
7761      procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
7762      if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK)
7763      {
7764         DU_LOG("\nERROR  -->  DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()");
7765         return RFAILED;
7766      }
7767      (ueCfgDb->numRlcLcs)++;
7768      (ueCfgDb->numMacLcs)++;
7769   }
7770   //TODO: To send the failure cause in UeContextSetupRsp 
7771   return ROK;
7772 }
7773
7774 /*******************************************************************
7775  *
7776  * @brief DeAlloc pdsch serv cell config info
7777  *
7778  * @details
7779  *
7780  *    Function : freeMacPdschServCellInfo
7781  *
7782  *    Functionality: DeAlloc pdsch serv cell config info
7783  *
7784  * @params[in] PdschServCellCfg pointer
7785  * @return void
7786  *
7787  * ****************************************************************/
7788
7789 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
7790 {
7791    if(pdsch->xOverhead)
7792    {
7793       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(PdschXOverhead));
7794    }
7795    if(pdsch->codeBlkGrpFlushInd)
7796    {
7797       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
7798    }
7799    if(pdsch->maxCodeBlkGrpPerTb)
7800    {
7801       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB));
7802    }
7803    if(pdsch->maxMimoLayers)
7804    {
7805       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
7806    }
7807 }
7808
7809 /*******************************************************************
7810  *
7811  * @brief Free Serving cell Info
7812  *
7813  * @details
7814  *
7815  *    Function : freeMacServingCellInfo
7816  *
7817  *    Functionality: Free Serving cell Info
7818  *
7819  * @params[in] ServCellCfgInfo *srvCellCfg
7820  * @return void
7821  *
7822  * ****************************************************************/
7823 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
7824 {
7825    uint8_t timeDomRsrcIdx;
7826
7827    if(srvCellCfg->initDlBwp.pdschPresent)
7828    {
7829       for(timeDomRsrcIdx = 0; timeDomRsrcIdx < srvCellCfg->initDlBwp.pdschCfg.numTimeDomRsrcAlloc; timeDomRsrcIdx++)
7830       {
7831          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, \
7832             srvCellCfg->initDlBwp.pdschCfg.timeDomRsrcAllociList[timeDomRsrcIdx].k0, sizeof(uint8_t));
7833       }
7834    }
7835
7836    freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
7837    if(srvCellCfg->bwpInactivityTmr)
7838    {
7839       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
7840    }
7841
7842    if(srvCellCfg->initUlBwp.pucchPresent)
7843    {
7844       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->initUlBwp.pucchCfg.dlDataToUlAck, sizeof(PucchDlDataToUlAck));
7845    }
7846 }
7847
7848 /*******************************************************************
7849  *
7850  * @brief Free cell Grp Cfg Info
7851  *
7852  * @details
7853  *
7854  *    Function : freeUeReCfgCellGrpInfo
7855  *
7856  *    Functionality: Free cell Grp Cfg Info
7857  *
7858  * @params[in] MacUeCfg*  duUeCfg
7859  * @return void
7860  *
7861  * ****************************************************************/
7862
7863 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
7864 {
7865    freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
7866 }
7867
7868 /*******************************************************************
7869  *
7870  * @brief Fills Reconfig SchReqReConfig
7871  *
7872  * @details
7873  *
7874  *    Function : extractSchReqReConfig
7875  *
7876  *    Functionality: Fills Reconfig SchReqReConfig
7877  *
7878  * @params[in] SchedulingRequestConfig_t *cuSchedReq
7879  *             SchedReqCfg*  macSchedReq
7880  * @return void
7881  *
7882  * ****************************************************************/
7883 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
7884 {
7885    uint8_t schReqIdx = 0;
7886    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
7887    struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
7888
7889    if(cuSchedReq->schedulingRequestToAddModList)
7890    {
7891       schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
7892       if(schReqListToAdd->list.count)
7893       {
7894          macSchedReq->addModListCount = schReqListToAdd->list.count;
7895          for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
7896          {
7897             macSchedReq->addModList[schReqIdx].schedReqId = \
7898                schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
7899             macSchedReq->addModList[schReqIdx].srProhibitTmr = \
7900                *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
7901             macSchedReq->addModList[schReqIdx].srTransMax    =\
7902                schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
7903          }
7904       }
7905    }
7906    /* Scheduling Req To release */
7907    if(cuSchedReq->schedulingRequestToReleaseList)
7908    {
7909       schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
7910       if(schReqListToRel->list.count)
7911       {
7912          macSchedReq->relListCount = schReqListToRel->list.count;
7913          for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
7914          {
7915             macSchedReq->relList[schReqIdx] = \
7916                *schReqListToRel->list.array[schReqIdx];
7917          }
7918       }
7919    }
7920 }
7921
7922 /*******************************************************************
7923  *
7924  * @brief Fills TagReconfig
7925  *
7926  * @details
7927  *
7928  *    Function : extractTagReconfig
7929  *
7930  *    Functionality: Fills extractTagReconfig
7931  *
7932  * @params[in] TAG_Config_t *cuTagCfg
7933  *             TagCfg *macTagCfg
7934  * @return void
7935  *
7936  * ****************************************************************/
7937
7938 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
7939 {
7940   uint8_t tagIdx = 0;
7941   struct TAG_Config__tag_ToAddModList  *tagListToAddMod = NULLP;
7942   struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
7943
7944   /* Tag config to AddMod */
7945   if(cuTagCfg->tag_ToAddModList)
7946   {
7947      tagListToAddMod = cuTagCfg->tag_ToAddModList; 
7948      if(tagListToAddMod->list.count)
7949      {
7950         macTagCfg->addModListCount = tagListToAddMod->list.count;
7951         for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
7952         {
7953            macTagCfg->addModList[tagIdx].tagId =\
7954               tagListToAddMod->list.array[tagIdx]->tag_Id;     
7955            macTagCfg->addModList[tagIdx].timeAlignTimer = \
7956
7957               tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
7958         }
7959      }
7960   }
7961   /* Tag config to release */
7962   if(cuTagCfg->tag_ToReleaseList)
7963   {
7964      tagListToRel = cuTagCfg->tag_ToReleaseList;
7965      if(tagListToRel->list.count)
7966      {
7967         macTagCfg->relListCount = tagListToRel->list.count;
7968         for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
7969         {
7970            macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];     
7971         }
7972      }
7973   }
7974 }
7975
7976 /*******************************************************************
7977  *
7978  * @brief Fills PdcchCfg received by CU
7979  *
7980  * @details
7981  *
7982  *    Function : extractPdcchCfg
7983  *
7984  *    Functionality: Fills PdcchCfg received  by CU
7985  *
7986  * @params[in] PDCCH_Config_t *cuPdcchCfg,
7987  *             PdcchConfig *duPdcchCfg
7988  * @return void
7989  *
7990  * ****************************************************************/
7991
7992 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
7993 {
7994    uint8_t cRsetIdx = 0;
7995    uint8_t srchSpcIdx = 0;
7996
7997    struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
7998    struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
7999    struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
8000    struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
8001
8002
8003    /* Control Resource Set To Add/Mod List */
8004    if(cuPdcchCfg->controlResourceSetToAddModList)
8005    {
8006       cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
8007       if(cRsetToAddModList->list.count)
8008       {
8009          macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
8010          for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
8011          {
8012             macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
8013               cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
8014             bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
8015                macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
8016             macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
8017               cRsetToAddModList->list.array[cRsetIdx]->duration;
8018
8019             macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
8020               cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;   
8021             if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
8022             {
8023                //TODO: handle the case for Interleaved
8024             }
8025             macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
8026               cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
8027             if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
8028             {
8029                macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
8030                   *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
8031             }
8032          }
8033       }
8034
8035    }
8036    /* Control Resource Set To Release List */
8037    if(cuPdcchCfg->controlResourceSetToReleaseList)
8038    {
8039       cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
8040       if(cRsetToRelList->list.count)
8041       {
8042          macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
8043          for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
8044          {
8045             macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
8046          }
8047       }
8048    }
8049
8050    /* Search space To Add/Mod List */
8051    if(cuPdcchCfg->searchSpacesToAddModList)
8052    {
8053       srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
8054       if(srchSpcToAddModList->list.count)
8055       {
8056          macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
8057          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
8058          {
8059             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
8060                srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
8061             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
8062                *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
8063             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
8064             {
8065                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
8066                   srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
8067             }
8068             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
8069             {
8070                bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
8071                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
8072             }
8073             if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
8074             {
8075               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
8076                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
8077               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
8078                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
8079               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
8080                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
8081               
8082               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
8083                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
8084               
8085               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
8086                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
8087             }
8088             if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
8089             {
8090                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
8091                   srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
8092                if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
8093                {
8094                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
8095                      srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
8096                }
8097          
8098             }
8099          }
8100       }
8101    }
8102    /* Search space To Rel List */
8103    if(cuPdcchCfg->searchSpacesToReleaseList)
8104    {
8105       srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
8106       if(srchSpcToRelList->list.count)
8107       {
8108          macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
8109          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
8110          {
8111             macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
8112                *(srchSpcToRelList->list.array[srchSpcIdx]);
8113          }
8114       }
8115    }
8116 }
8117
8118 /*******************************************************************
8119  *
8120  * @brief Fills PdschCfg received by CU
8121  *
8122  * @details
8123  *
8124  *    Function : extractPdschCfg
8125  *
8126  *    Functionality: Fills PdschCfg received  by CU
8127  *
8128  * @params[in] PDSCH_Config_t *cuPdschCfg,
8129  *             PdschConfig *macPdschCfg
8130  * @return void
8131  *
8132  * ****************************************************************/
8133
8134 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
8135 {
8136    uint8_t timeDomIdx;
8137    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
8138
8139    if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
8140    {
8141       if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
8142             PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
8143       {
8144          if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
8145          {
8146             macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
8147                *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
8148          }
8149       }
8150    }
8151    macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
8152    if(cuPdschCfg->pdsch_TimeDomainAllocationList)
8153    {
8154       timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
8155       if(timeDomAlloc->present ==\
8156             PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
8157       {
8158          if(timeDomAlloc->choice.setup)
8159          {
8160             macPdschCfg->numTimeDomRsrcAlloc  = timeDomAlloc->choice.setup->list.count;
8161             for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
8162             {
8163                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 = NULLP;
8164                if(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0)
8165                {
8166                   if(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 == NULL)
8167                   {
8168                      DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
8169                      if(!macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0)
8170                      {
8171                         DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for k0 at extractPdschCfg()");
8172                         return RFAILED;
8173                      }
8174                   }
8175                   *(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0) = \
8176                        *(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0);
8177                }
8178                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
8179                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
8180                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
8181                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
8182             }
8183          }
8184       }
8185    }
8186    macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
8187    if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
8188       macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
8189    if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
8190    {
8191       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
8192       if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
8193       {
8194          if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
8195          {
8196             macPdschCfg->bundlingInfo.StaticBundling.size = \
8197                *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
8198          }
8199       }
8200    }
8201    else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
8202    {
8203       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
8204    }
8205
8206 }
8207
8208 /*******************************************************************
8209  *
8210  * @brief Fills PdschServingCellCfg received by CU
8211  *
8212  * @details
8213  *
8214  *    Function : extractPdschServingCellCfg
8215  *
8216  *    Functionality: Fills PdschCfg received  by CU
8217  *
8218  * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
8219  *             PdschServCellCfg *macUePdschSrvCellCfg
8220  * @return ROK/RFAILED
8221  *
8222  * ****************************************************************/
8223
8224 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
8225 {
8226    if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
8227    {
8228       if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
8229       {
8230          if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
8231          {
8232             *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
8233                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
8234          }
8235          else
8236          {
8237             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB));
8238             if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
8239             {
8240                *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
8241                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
8242             }
8243             else
8244             {
8245                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
8246                return RFAILED;
8247             }
8248          }
8249          if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
8250          {
8251             *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
8252                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
8253          }
8254          else
8255          {
8256             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->codeBlkGrpFlushInd , sizeof(bool));
8257             if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
8258             {
8259                *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
8260                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
8261             }
8262             else
8263             {
8264                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
8265                return RFAILED;
8266             }
8267          }
8268       }
8269    }
8270    if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
8271    {
8272       macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH); 
8273    }
8274    if(cuPdschSrvCellCfg->ext1)
8275    {
8276       if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
8277       {
8278         if(macUePdschSrvCellCfg->maxMimoLayers)
8279         {
8280            *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
8281         }
8282         else
8283         {
8284            DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
8285            if(macUePdschSrvCellCfg->maxMimoLayers)
8286            {
8287               *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
8288            }
8289            else
8290            {
8291               DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
8292               return RFAILED;
8293            }
8294         }
8295       }
8296    }
8297    if(cuPdschSrvCellCfg->xOverhead)
8298    {
8299       if(macUePdschSrvCellCfg->xOverhead)
8300       {
8301          *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
8302       }
8303       else
8304       {
8305          DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(PdschXOverhead));
8306          if(macUePdschSrvCellCfg->xOverhead)
8307          {
8308             *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
8309          }
8310          else
8311          {
8312             DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
8313             return RFAILED;
8314          }
8315       }
8316    }
8317    return ROK;
8318 }
8319
8320 /*******************************************************************
8321  *
8322  * @brief Fills PuschCfg received by CU
8323  *
8324  * @details
8325  *
8326  *    Function : extractPuschCfg
8327  *
8328  *    Functionality: Fills PuschCfg received  by CU
8329  *
8330  * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
8331  *             PuschCfg *macPuschCfg
8332  * @return void
8333  *
8334  * ****************************************************************/
8335
8336 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
8337 {
8338    uint8_t timeDomIdx = 0;
8339    DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
8340    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
8341
8342    if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
8343    {
8344       if(cuPuschCfg->choice.setup)
8345       {
8346          if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
8347          {
8348              macPuschCfg->dataScramblingId = \
8349                 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
8350          }
8351          if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
8352          {
8353             if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
8354             {
8355                if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
8356                {
8357                   dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
8358                   if(dmrsUlCfg->dmrs_AdditionalPosition)
8359                   {
8360                      macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
8361                         *(dmrsUlCfg->dmrs_AdditionalPosition);
8362                   }
8363                   if(dmrsUlCfg->transformPrecodingDisabled)
8364                   {
8365                      if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
8366                      {
8367                         macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
8368                            *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
8369                      }
8370                   }
8371                }
8372             }
8373          }
8374          /*Res Alloc Type for UL */
8375          if(cuPuschCfg->choice.setup->resourceAllocation)
8376          {
8377             macPuschCfg->resourceAllocType = \
8378                cuPuschCfg->choice.setup->resourceAllocation;
8379          }
8380          if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
8381          {
8382             timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
8383             if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
8384             {
8385                if(timeDomAllocList->choice.setup)
8386                {
8387                   macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
8388                   for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
8389                   {
8390                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
8391                         *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
8392                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
8393                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
8394                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
8395                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
8396                   }
8397                }
8398             }
8399          }
8400          if(cuPuschCfg->choice.setup->transformPrecoder)
8401             macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
8402       }
8403    }
8404 }
8405
8406 /*******************************************************************
8407  *
8408  * @brief Function to fill pucch Power Control
8409  *
8410  * @details
8411  *
8412  *    Function : extractPucchPowerControl
8413  *
8414  *    Functionality: Function to fill pucch Power Control
8415  *
8416  * @params[in] PucchPowerControl *pwrCtrl,
8417  *             struct PUCCH_PowerControl *cuPwrCtrlCfg
8418  * @return void
8419  *
8420  * ****************************************************************/
8421
8422 void extractPucchPowerControl(PucchPowerControl *pwrCtrl, struct PUCCH_PowerControl *cuPwrCtrlCfg)
8423 {
8424    uint8_t arrIdx;
8425
8426    if(cuPwrCtrlCfg->deltaF_PUCCH_f0)
8427       pwrCtrl->deltaF_Format0 = *cuPwrCtrlCfg->deltaF_PUCCH_f0;
8428    if(cuPwrCtrlCfg->deltaF_PUCCH_f1)
8429       pwrCtrl->deltaF_Format1 = *cuPwrCtrlCfg->deltaF_PUCCH_f1;
8430    if(cuPwrCtrlCfg->deltaF_PUCCH_f2)
8431       pwrCtrl->deltaF_Format2 = *cuPwrCtrlCfg->deltaF_PUCCH_f2;
8432    if(cuPwrCtrlCfg->deltaF_PUCCH_f3)
8433       pwrCtrl->deltaF_Format3 = *cuPwrCtrlCfg->deltaF_PUCCH_f3;
8434    if(cuPwrCtrlCfg->deltaF_PUCCH_f4)
8435       pwrCtrl->deltaF_Format4 = *cuPwrCtrlCfg->deltaF_PUCCH_f4;
8436    if(cuPwrCtrlCfg->p0_Set)
8437    {
8438       pwrCtrl->p0SetCount = cuPwrCtrlCfg->p0_Set->list.count;
8439       for(arrIdx=0; arrIdx < pwrCtrl->p0SetCount; arrIdx++)
8440       {
8441          pwrCtrl->p0Set[arrIdx].p0PucchId =\
8442             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Id;
8443          pwrCtrl->p0Set[arrIdx].p0PucchVal =\
8444             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Value;
8445       }
8446    }
8447    if(cuPwrCtrlCfg->pathlossReferenceRSs)
8448    {
8449       pwrCtrl->pathLossRefRSListCount = cuPwrCtrlCfg->pathlossReferenceRSs->list.count;
8450       for(arrIdx = 0; arrIdx < pwrCtrl->pathLossRefRSListCount; arrIdx++)
8451       {
8452          pwrCtrl->pathLossRefRSList[arrIdx].pathLossRefRSId =\
8453             cuPwrCtrlCfg->pathlossReferenceRSs->list.array[arrIdx]->pucch_PathlossReferenceRS_Id;
8454       }
8455    }
8456 }
8457  
8458  /*******************************************************************
8459  *
8460  * @brief Function to extractResrcSetToAddModList sent by CU
8461  *
8462  * @details
8463  *
8464  *    Function : extractResrcSetToAddModList
8465  *
8466  *    Functionality: Fucntion to extractResrcSetToAddModList
8467  *
8468  * @params[in] PucchResrcSetCfg pointer,
8469  *             struct PUCCH_Config__resourceSetToAddModList pointer
8470  * @return void
8471  *
8472  * ****************************************************************/
8473
8474 void extractResrcSetToAddModList(PucchResrcSetCfg *macRsrcSetList, struct PUCCH_Config__resourceSetToAddModList *cuRsrcSetList)
8475 {
8476    uint8_t arrIdx, rsrcListIdx;
8477
8478    macRsrcSetList->resrcSetToAddModListCount = cuRsrcSetList->list.count; 
8479    for(arrIdx = 0; arrIdx < macRsrcSetList->resrcSetToAddModListCount; arrIdx++)
8480    {
8481       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcSetId     =\
8482          cuRsrcSetList->list.array[arrIdx]->pucch_ResourceSetId;
8483       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount =\
8484          cuRsrcSetList->list.array[arrIdx]->resourceList.list.count;
8485       for(rsrcListIdx = 0; rsrcListIdx < macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount; rsrcListIdx++)
8486       {
8487          macRsrcSetList->resrcSetToAddModList[arrIdx].resrcList[rsrcListIdx] =\
8488             *cuRsrcSetList->list.array[arrIdx]->resourceList.list.array[rsrcListIdx];
8489       }
8490       macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\
8491          *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1;
8492    }
8493 }/* End of extractResrcSetToAddModList */
8494
8495 /*******************************************************************
8496  *
8497  * @brief Fills extractResrcToAddModList sent by CU
8498  *
8499  * @details
8500  *
8501  *    Function : extractResrcToAddModList
8502  *
8503  *    Functionality: Fills extractResrcToAddModList
8504  *
8505  * @params[in] PucchResrcCfg pointer,
8506  *             struct PUCCH_Config__resourceToAddModList pointer
8507  * @return ROk/RFAILED
8508  *
8509  * ****************************************************************/
8510
8511 uint8_t extractResrcToAddModList(PucchResrcCfg *macResrcList, struct PUCCH_Config__resourceToAddModList *cuResrcList)
8512 {
8513    uint8_t arrIdx;
8514    
8515    macResrcList->resrcToAddModListCount = cuResrcList->list.count;
8516    for(arrIdx = 0; arrIdx < macResrcList->resrcToAddModListCount; arrIdx++)
8517    {
8518       macResrcList->resrcToAddModList[arrIdx].resrcId      =\
8519         cuResrcList->list.array[arrIdx]->pucch_ResourceId; 
8520       macResrcList->resrcToAddModList[arrIdx].startPrb     =\
8521         cuResrcList->list.array[arrIdx]->startingPRB;
8522       if(cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping)
8523       {
8524          macResrcList->resrcToAddModList[arrIdx].intraFreqHop =\
8525            *cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping;
8526       }
8527       if(cuResrcList->list.array[arrIdx]->secondHopPRB)
8528       {
8529          macResrcList->resrcToAddModList[arrIdx].secondPrbHop =\
8530            *cuResrcList->list.array[arrIdx]->secondHopPRB;
8531       }
8532       /* PUCCH RSRC FORMAT */
8533       if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format0)
8534       {
8535          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_0;
8536          if(cuResrcList->list.array[arrIdx]->format.choice.format0)
8537          {
8538             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0, sizeof(PucchFormat0));
8539             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0 == NULLP)
8540             {
8541                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format0 in extractResrcToAddModList()");
8542                return RFAILED;
8543             }
8544             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->initialCyclicShift =\
8545                cuResrcList->list.array[arrIdx]->format.choice.format0->initialCyclicShift;
8546             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->numSymbols =\
8547                cuResrcList->list.array[arrIdx]->format.choice.format0->nrofSymbols;
8548             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->startSymbolIdx =\
8549                cuResrcList->list.array[arrIdx]->format.choice.format0->startingSymbolIndex;
8550          }
8551       }
8552       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format1)
8553       {
8554          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_1;
8555          if(cuResrcList->list.array[arrIdx]->format.choice.format1)
8556          {
8557             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1, sizeof(PucchFormat1));
8558             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1 == NULLP)
8559             {
8560                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format1 in extractResrcToAddModList()");
8561                return RFAILED;
8562             }
8563             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->initialCyclicShift =\
8564                 cuResrcList->list.array[arrIdx]->format.choice.format1->initialCyclicShift;
8565             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->numSymbols =\
8566                 cuResrcList->list.array[arrIdx]->format.choice.format1->nrofSymbols;
8567             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->startSymbolIdx =\
8568                 cuResrcList->list.array[arrIdx]->format.choice.format1->startingSymbolIndex;
8569             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->timeDomOCC =\
8570                 cuResrcList->list.array[arrIdx]->format.choice.format1->timeDomainOCC;
8571          }
8572       }
8573       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format2)
8574       {
8575          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_2;
8576          if(cuResrcList->list.array[arrIdx]->format.choice.format2)
8577          {
8578             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2, sizeof(PucchFormat2_3));
8579             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2 == NULLP)
8580             {
8581                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format2 in extractResrcToAddModList()");
8582                return RFAILED;
8583             }
8584             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numPrbs =\
8585                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofPRBs;
8586             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numSymbols =\
8587                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofSymbols;
8588             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->startSymbolIdx =\
8589                 cuResrcList->list.array[arrIdx]->format.choice.format2->startingSymbolIndex;
8590          }
8591       }
8592       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format3)
8593       {
8594          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_3;
8595          if(cuResrcList->list.array[arrIdx]->format.choice.format3)
8596          {
8597             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3, sizeof(PucchFormat2_3));
8598             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3 == NULLP)
8599             {
8600                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format3 in extractResrcToAddModList()");
8601                return RFAILED;
8602             }
8603             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numPrbs =\
8604                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofPRBs;
8605             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numSymbols =\
8606                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofSymbols;
8607             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->startSymbolIdx =\
8608                 cuResrcList->list.array[arrIdx]->format.choice.format3->startingSymbolIndex;
8609          }
8610       }
8611       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format4)
8612       {
8613          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_4;
8614          if(cuResrcList->list.array[arrIdx]->format.choice.format4)
8615          {
8616             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4, sizeof(PucchFormat4));
8617             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4 == NULLP)
8618             {
8619                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format4 in extractResrcToAddModList()");
8620                return RFAILED;
8621             }
8622             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->numSymbols =\
8623                 cuResrcList->list.array[arrIdx]->format.choice.format4->nrofSymbols;
8624             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occLen =\
8625                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Length;
8626             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occIdx =\
8627                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Index;
8628             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->startSymbolIdx =\
8629                 cuResrcList->list.array[arrIdx]->format.choice.format4->startingSymbolIndex;
8630          }
8631       }
8632    }
8633    return ROK;
8634
8635 }/* End of extractResrcToAddModList */
8636
8637 /*******************************************************************
8638  *
8639  * @brief Fills fillPucchSchedReqPeriodAndOffset sent by CU
8640  *
8641  * @details
8642  *
8643  *    Function : fillPucchSchedReqPeriodAndOffset
8644  *
8645  *    Functionality: To fillPucchSchedReqPeriodAndOffset
8646  *
8647  * @params[in] macPeriodicty,
8648  *     SchedulingRequestResourceConfig__periodicityAndOffset pointer
8649  * @return void
8650  *
8651  * ****************************************************************/
8652
8653 void fillPucchSchedReqPeriodAndOffset(uint8_t macPeriodicty, uint16_t  macOffset,\
8654    struct SchedulingRequestResourceConfig__periodicityAndOffset *cuPeriodicty)
8655 {
8656    macPeriodicty = cuPeriodicty->present;
8657    switch(macPeriodicty)
8658    {
8659       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2:
8660          {
8661             macOffset     = cuPeriodicty->choice.sym2;
8662             break;
8663          }
8664       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7:
8665          {
8666             macOffset     = cuPeriodicty->choice.sym6or7;
8667             break;
8668          }
8669       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
8670          {
8671             macOffset     = cuPeriodicty->choice.sl1;
8672             break;
8673          }
8674       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
8675          {
8676             macOffset = cuPeriodicty->choice.sl2;
8677             break;
8678          }
8679       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
8680          {
8681             macOffset = cuPeriodicty->choice.sl4;
8682             break;
8683          }
8684       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
8685          {
8686             macOffset = cuPeriodicty->choice.sl5;
8687             break;
8688          }
8689       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
8690          {
8691             macOffset = cuPeriodicty->choice.sl8;
8692             break;
8693          }
8694       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
8695          {
8696             macOffset = cuPeriodicty->choice.sl10;
8697             break;
8698          }
8699       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
8700          {
8701             macOffset = cuPeriodicty->choice.sl16;
8702             break;
8703          }
8704       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
8705          {
8706             macOffset = cuPeriodicty->choice.sl20;
8707             break;
8708          }
8709       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
8710          {
8711             macOffset = cuPeriodicty->choice.sl40;
8712             break;
8713          }
8714       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
8715          {
8716             macOffset = cuPeriodicty->choice.sl80;
8717             break;
8718          }
8719       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
8720          {
8721             macOffset = cuPeriodicty->choice.sl160;
8722             break;
8723          }
8724       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
8725          {
8726             macOffset = cuPeriodicty->choice.sl320;
8727             break;
8728          }
8729       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
8730          {
8731             macOffset = cuPeriodicty->choice.sl640;
8732             break;
8733          }
8734       default :
8735          DU_LOG("\nERROR  -->  F1AP : Invalid periodicity %d", macPeriodicty);
8736    }
8737 }
8738
8739 /*******************************************************************
8740  *
8741  * @brief Function to extractPucchFormatCfg sent by CU
8742  *
8743  * @details
8744  *
8745  *    Function : extractPucchFormatCfg
8746  *
8747  *    Functionality: Function to extractPucchFormatCfg
8748  *
8749  * @params[in] PucchFormatCfg pointer,
8750  *             PUCCH_FormatConfig_t pointer
8751  * @return void
8752  *
8753  * ****************************************************************/
8754
8755 void extractPucchFormatCfg(PucchFormatCfg *macFormatCfg, PUCCH_FormatConfig_t *cuFormatCfg)
8756  {
8757     if(cuFormatCfg->interslotFrequencyHopping)
8758        macFormatCfg->interSlotFreqHop = *cuFormatCfg->interslotFrequencyHopping;
8759     if(cuFormatCfg->additionalDMRS)  
8760        macFormatCfg->addDmrs = *cuFormatCfg->additionalDMRS;
8761     if(cuFormatCfg->maxCodeRate)
8762        macFormatCfg->maxCodeRate = *cuFormatCfg->maxCodeRate;
8763     if(cuFormatCfg->nrofSlots)  
8764        macFormatCfg->numSlots = *cuFormatCfg->nrofSlots;
8765     if(cuFormatCfg->pi2BPSK)  
8766        macFormatCfg->pi2BPSK = *cuFormatCfg->pi2BPSK;
8767     if(cuFormatCfg->simultaneousHARQ_ACK_CSI)  
8768        macFormatCfg->harqAckCSI = *cuFormatCfg->simultaneousHARQ_ACK_CSI;
8769  }/* End of extractPucchFormatCfg */
8770
8771 /*******************************************************************
8772  *
8773  * @brief Function to extractSchedReqCfgToAddMod sent by CU
8774  *
8775  * @details
8776  *
8777  *    Function : extractSchedReqCfgToAddMod
8778  *
8779  *    Functionality: Function to extractSchedReqCfgToAddMod
8780  *
8781  * @params[in] PucchSchedReqCfg pointer,
8782  *      PUCCH_Config__schedulingRequestResourceToAddModList pointer
8783  * @return void
8784  *
8785  * ****************************************************************/
8786
8787 void extractSchedReqCfgToAddMod(PucchSchedReqCfg *macSchedReqCfg, struct PUCCH_Config__schedulingRequestResourceToAddModList *cuSchedReqList)
8788 {
8789    uint8_t arrIdx;
8790
8791    macSchedReqCfg->schedAddModListCount = cuSchedReqList->list.count;
8792    for(arrIdx = 0; arrIdx <  macSchedReqCfg->schedAddModListCount; arrIdx++)
8793    {
8794       macSchedReqCfg->schedAddModList[arrIdx].resrcId =\
8795          cuSchedReqList->list.array[arrIdx]->schedulingRequestResourceId;
8796       macSchedReqCfg->schedAddModList[arrIdx].requestId =\
8797          cuSchedReqList->list.array[arrIdx]->schedulingRequestID;
8798       if(cuSchedReqList->list.array[arrIdx]->periodicityAndOffset)
8799       {
8800          fillPucchSchedReqPeriodAndOffset(macSchedReqCfg->schedAddModList[arrIdx].periodicity,\
8801             macSchedReqCfg->schedAddModList[arrIdx].offset, cuSchedReqList->list.array[arrIdx]->periodicityAndOffset);
8802       }
8803       if(cuSchedReqList->list.array[arrIdx]->resource)
8804       {
8805          macSchedReqCfg->schedAddModList[arrIdx].resrc =\
8806             *cuSchedReqList->list.array[arrIdx]->resource;
8807       }
8808    }
8809
8810 }/* End of extractSchedReqCfgToAddMod */
8811
8812  /*******************************************************************
8813  *
8814  * @brief Fills PucchCfg received by CU
8815  *
8816  * @details
8817  *
8818  *    Function : extractPucchCfg
8819  *
8820  *    Functionality: Fills PucchCfg received  by CU
8821  *
8822  * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg,
8823  *             PucchCfg *macPucchCfg
8824  * @return ROK/RFAILED
8825  *
8826  * ****************************************************************/
8827
8828 uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg)         
8829 {
8830    uint8_t arrIdx;
8831
8832    if(cuPucchCfg->present == BWP_UplinkDedicated__pucch_Config_PR_setup)
8833    {
8834       if(cuPucchCfg->choice.setup)
8835       {
8836          /* Resource Set Cfg */ 
8837          if(cuPucchCfg->choice.setup->resourceSetToAddModList)
8838          {
8839             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrcSet, sizeof(PucchResrcSetCfg));
8840             if(macPucchCfg->resrcSet == NULLP)
8841             {
8842                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc set List in extractPucchCfg()");
8843                return RFAILED;
8844             }
8845             memset(macPucchCfg->resrcSet, 0, sizeof(PucchResrcSetCfg));
8846             extractResrcSetToAddModList(macPucchCfg->resrcSet, cuPucchCfg->choice.setup->resourceSetToAddModList);
8847          }
8848          
8849          /* Resource Cfg */ 
8850          if(cuPucchCfg->choice.setup->resourceToAddModList)
8851          {
8852             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrc, sizeof(PucchResrcCfg));
8853             if(macPucchCfg->resrc == NULLP)
8854             {
8855                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc List in extractPucchCfg()");
8856                return RFAILED;
8857             }
8858             memset(macPucchCfg->resrc, 0, sizeof(PucchResrcCfg));
8859             extractResrcToAddModList(macPucchCfg->resrc, cuPucchCfg->choice.setup->resourceToAddModList);
8860          }
8861          
8862          /* Format 1 Cfg */ 
8863          if(cuPucchCfg->choice.setup->format1)
8864          {
8865             DU_ALLOC_SHRABL_BUF(macPucchCfg->format1, sizeof(PucchFormatCfg));
8866             if(macPucchCfg->format1 == NULLP)
8867             {
8868                DU_LOG("\nERROR --> F1AP : Failed to extract format 1 Cfg in  extractPucchCfg()");
8869                return RFAILED;
8870             }
8871             memset(macPucchCfg->format1, 0, sizeof(PucchFormatCfg));
8872             extractPucchFormatCfg(macPucchCfg->format1,\
8873                cuPucchCfg->choice.setup->format1->choice.setup);
8874          }
8875          
8876          /* Format 2 Cfg */
8877          if(cuPucchCfg->choice.setup->format2)
8878          {
8879             DU_ALLOC_SHRABL_BUF(macPucchCfg->format2, sizeof(PucchFormatCfg));
8880             if(macPucchCfg->format2 == NULLP)
8881             {
8882                DU_LOG("\nERROR --> F1AP : Failed to extract format 2 Cfg in  extractPucchCfg()");
8883                return RFAILED;
8884             }
8885             memset(macPucchCfg->format2, 0, sizeof(PucchFormatCfg));
8886             extractPucchFormatCfg(macPucchCfg->format2,\
8887                cuPucchCfg->choice.setup->format2->choice.setup);
8888          }
8889          
8890          /* Format 3 Cfg */
8891          if(cuPucchCfg->choice.setup->format3)
8892          {
8893             DU_ALLOC_SHRABL_BUF(macPucchCfg->format3, sizeof(PucchFormatCfg));
8894             if(macPucchCfg->format3 == NULLP)
8895             {
8896                DU_LOG("\nERROR --> F1AP : Failed to extract format 3 Cfg in  extractPucchCfg()");
8897                return RFAILED;
8898             }
8899             memset(macPucchCfg->format3, 0, sizeof(PucchFormatCfg));
8900             extractPucchFormatCfg(macPucchCfg->format3,\
8901                cuPucchCfg->choice.setup->format3->choice.setup);
8902          }
8903
8904          /* Format 4 Cfg */
8905          if(cuPucchCfg->choice.setup->format4)
8906          {
8907             DU_ALLOC_SHRABL_BUF(macPucchCfg->format4, sizeof(PucchFormatCfg));
8908             if(macPucchCfg->format4 == NULLP)
8909             {
8910                DU_LOG("\nERROR --> F1AP : Failed to extract format 4 Cfg in  extractPucchCfg()");
8911                return RFAILED;
8912             }
8913             memset(macPucchCfg->format4, 0, sizeof(PucchFormatCfg));
8914             extractPucchFormatCfg(macPucchCfg->format4,\
8915                cuPucchCfg->choice.setup->format4->choice.setup);
8916          }
8917
8918          /* Sched Req List */
8919          if(cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList)
8920          {
8921             DU_ALLOC_SHRABL_BUF(macPucchCfg->schedReq, sizeof(PucchSchedReqCfg));
8922             if(macPucchCfg->schedReq == NULLP)
8923             {
8924                DU_LOG("\nERROR --> F1AP : Failed to extract schedReqCfg in  extractPucchCfg()");
8925                return RFAILED;
8926             }
8927             memset(macPucchCfg->schedReq, 0, sizeof(PucchSchedReqCfg));
8928             extractSchedReqCfgToAddMod(macPucchCfg->schedReq,\
8929             cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList);
8930          }
8931
8932          /*TODO: Add support for  Spatial Info */
8933
8934          /* MultiCsiCfg */
8935          if(cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList)
8936          {
8937             DU_ALLOC_SHRABL_BUF(macPucchCfg->multiCsiCfg, sizeof(PucchMultiCsiCfg));
8938             if(macPucchCfg->multiCsiCfg == NULLP)
8939             {
8940                DU_LOG("\nERROR --> F1AP : Failed to extract multiCsiCfg in  extractPucchCfg()");
8941                return RFAILED;
8942             }
8943             memset(macPucchCfg->multiCsiCfg, 0, sizeof(PucchMultiCsiCfg));
8944             macPucchCfg->multiCsiCfg->multiCsiResrcListCount = cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.count;
8945             for(arrIdx =0; arrIdx < macPucchCfg->multiCsiCfg->multiCsiResrcListCount; arrIdx++)
8946             {
8947                macPucchCfg->multiCsiCfg->multiCsiResrcList[arrIdx] =\
8948                  *cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.array[arrIdx];
8949             }
8950          }
8951
8952          /* Dl_DataToUL_ACK */ 
8953          if(cuPucchCfg->choice.setup->dl_DataToUL_ACK)
8954          {
8955             DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
8956             if(macPucchCfg->dlDataToUlAck == NULLP)
8957             {
8958                DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
8959                return RFAILED;
8960             }
8961             memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
8962             macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
8963             for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
8964             {
8965                macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
8966                   *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
8967             }
8968          }
8969
8970          /* Power Control */
8971          if(cuPucchCfg->choice.setup->pucch_PowerControl)
8972          {
8973             DU_ALLOC_SHRABL_BUF(macPucchCfg->powerControl, sizeof(PucchPowerControl));
8974             if(macPucchCfg->powerControl == NULLP)
8975             {
8976                DU_LOG("\nERROR --> F1AP : Failed to extract power control in extractPucchCfg()");
8977                return RFAILED;
8978             }
8979             extractPucchPowerControl(macPucchCfg->powerControl,\
8980                cuPucchCfg->choice.setup->pucch_PowerControl);
8981          }
8982       }
8983    }
8984    return ROK;
8985 }
8986
8987 /*******************************************************************
8988  *
8989  * @brief Fills ServingCellReconfig received by CU
8990  *
8991  * @details
8992  *
8993  *    Function : extractSpCellDedicatedCfg
8994  *
8995  *    Functionality: Fills ServingCellReconfig received  by CU
8996  *
8997  * @params[in] ServingCellConfig_t *cuSrvCellCfg
8998  *             ServCellCfgInfo *macSrvCellCfg
8999  * @return ROK/RFAILD
9000  *
9001  * ****************************************************************/
9002 uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg)
9003 {
9004    uint8_t ret = ROK;
9005    BWP_DownlinkDedicated_t *dlBwp = NULLP;
9006    BWP_UplinkDedicated_t   *ulBwp = NULLP;
9007
9008    if(cuSrvCellCfg->initialDownlinkBWP)
9009    {
9010       dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
9011       if(dlBwp->pdcch_Config)
9012       {
9013          if(dlBwp->pdcch_Config->choice.setup)
9014          {
9015             macSrvCellCfg->initDlBwp.pdcchPresent = true;
9016             extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
9017          }
9018       }
9019       if(dlBwp->pdsch_Config)
9020       {
9021          if(dlBwp->pdsch_Config->choice.setup)
9022          {
9023             macSrvCellCfg->initDlBwp.pdschPresent = true;
9024             extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg);
9025          }
9026       }
9027    }
9028    if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
9029       macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
9030    if(cuSrvCellCfg->defaultDownlinkBWP_Id)
9031       macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
9032    if(cuSrvCellCfg->bwp_InactivityTimer)
9033    {
9034       if(macSrvCellCfg->bwpInactivityTmr)
9035       {
9036          memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
9037       }
9038       else
9039       {
9040          macSrvCellCfg->bwpInactivityTmr = NULLP;
9041          DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
9042          if(macSrvCellCfg->bwpInactivityTmr)
9043          {
9044             memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
9045          }
9046          else
9047          {
9048             DU_LOG("\nERROR  --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
9049             return RFAILED;
9050          }
9051       }
9052    }
9053    if(cuSrvCellCfg->pdsch_ServingCellConfig)
9054    {
9055       if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
9056       {
9057          ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
9058          if(ret == RFAILED)
9059          {
9060             DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
9061             return RFAILED;
9062          }
9063       }
9064    }
9065    if(cuSrvCellCfg->uplinkConfig)
9066    {
9067      if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
9068      {
9069         ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
9070         if(ulBwp->pusch_Config)
9071         {
9072            macSrvCellCfg->initUlBwp.puschPresent = true;
9073            extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
9074         }
9075         if(ulBwp->pucch_Config)
9076         {
9077            macSrvCellCfg->initUlBwp.pucchPresent = true;
9078            memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
9079            extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg); 
9080         }
9081      }
9082      if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
9083         macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
9084    }
9085    return ret;
9086 }
9087 /*******************************************************************
9088  *
9089  * @brief Fills Reconfig Cell group Info received by CU
9090  *
9091  * @details
9092  *
9093  *    Function : extractUeReCfgCellInfo
9094  *
9095  *    Functionality: Fills Reconfig Cell group Info received by CU
9096  *
9097  * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
9098  *             MacUeCfg*  macUeCfg
9099  * @return ROK/RFAILED
9100  *
9101  * ****************************************************************/
9102 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg)
9103 {
9104    uint8_t ret = ROK;
9105    MAC_CellGroupConfig_t     *macCellGroup = NULLP;
9106    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
9107    SpCellConfig_t            *spcellCfg = NULLP;
9108    ServingCellConfig_t       *servCellCfg = NULLP;
9109
9110    if(cellGrp)
9111    {
9112       /* Fill MacCell Group Reconfig  */
9113       if(cellGrp->mac_CellGroupConfig)
9114       {
9115          macUeCfg->macCellGrpCfgPres = true;
9116          macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
9117          if(macCellGroup->schedulingRequestConfig)
9118          {
9119             extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
9120          }
9121          if(macCellGroup->tag_Config)
9122          {
9123             extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
9124          }
9125          if(macCellGroup->bsr_Config)
9126          {
9127             macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
9128             macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer     = macCellGroup->bsr_Config->retxBSR_Timer;
9129             if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
9130             {
9131                macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer  =\
9132                *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
9133             }
9134          }
9135          if(macCellGroup->phr_Config)
9136          {
9137             if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
9138             {
9139                macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
9140                if(macCellGroup->phr_Config->choice.setup)
9141                {
9142                   macUeCfg->macCellGrpCfg.phrCfg.periodicTimer     = \
9143                   macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
9144                   macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer     = \
9145                   macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
9146                   macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor     = \
9147                   macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
9148                   macUeCfg->macCellGrpCfg.phrCfg.multiplePHR       = \
9149                   macCellGroup->phr_Config->choice.setup->multiplePHR;
9150                   macUeCfg->macCellGrpCfg.phrCfg.dummy             = \
9151                   macCellGroup->phr_Config->choice.setup->dummy;
9152                   macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
9153                   macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
9154                   macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG        = \
9155                   macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
9156                }
9157             }
9158          }
9159       }
9160       /* Fill Physical Cell Group Reconfig */
9161       if(cellGrp->physicalCellGroupConfig)
9162       {
9163          macUeCfg->phyCellGrpCfgPres = true;
9164          phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
9165          if(phyCellGrpCfg->p_NR_FR1)
9166          {
9167             if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
9168                macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
9169          }
9170          macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
9171       }
9172       /* Fill SpCell Reconfig */
9173       if(cellGrp->spCellConfig)
9174       {
9175          macUeCfg->spCellCfgPres = true;
9176          spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));  
9177          if(spcellCfg->servCellIndex)
9178          {
9179             macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
9180          }
9181          /* Fill Serving cell Reconfig info */
9182          if(cellGrp->spCellConfig->spCellConfigDedicated)
9183          {
9184             servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
9185             ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
9186             if(ret == RFAILED)
9187             {
9188                DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
9189             }
9190          }
9191       }
9192    }
9193    return ret;
9194 }
9195 /*******************************************************************
9196 *
9197 * @brief free the memory allocated by decoder
9198 *
9199 * @details
9200 *
9201 *    Function : freeAperDecodeNrcgi 
9202 *
9203 *    Functionality: Free Nrcgi values
9204 *
9205 * @params[in] NRCGI_t *nrcgi
9206 * @return void
9207 *
9208 * ****************************************************************/
9209
9210
9211 void freeAperDecodeNrcgi(NRCGI_t *nrcgi)
9212 {
9213     if(nrcgi->pLMN_Identity.buf != NULLP)
9214     {
9215        free(nrcgi->pLMN_Identity.buf);
9216     }
9217     if(nrcgi->nRCellIdentity.buf != NULLP)
9218     {
9219        free(nrcgi->nRCellIdentity.buf);
9220     }
9221 }
9222 /*******************************************************************
9223 *
9224 * @brief free the memory allocated by decoder
9225 *
9226 * @details
9227 *
9228 *    Function : freeAperDecodeCuToDuInfo 
9229 *
9230 *    Functionality:  Free Cu To Du Information
9231 *
9232 * @params[in] CUtoDURRCInformation_t *rrcMsg
9233 * @return void
9234 *
9235 * ****************************************************************/
9236
9237
9238 void freeAperDecodeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9239 {
9240    uint8_t ieIdx =0;
9241    uint8_t arrIdx =0;
9242
9243    if(rrcMsg->uE_CapabilityRAT_ContainerList)
9244    {
9245       if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9246          free(rrcMsg->uE_CapabilityRAT_ContainerList->buf);
9247       free(rrcMsg->uE_CapabilityRAT_ContainerList);
9248    }
9249
9250    if(rrcMsg->iE_Extensions)
9251    {
9252       if(rrcMsg->iE_Extensions->list.array)
9253       {
9254          for(ieIdx= 0; ieIdx < rrcMsg->iE_Extensions->list.count; ieIdx++)
9255          {
9256             if(rrcMsg->iE_Extensions->list.array[ieIdx])
9257             {
9258                switch(rrcMsg->iE_Extensions->list.array[ieIdx]->id)
9259                {
9260                   case ProtocolIE_ID_id_CellGroupConfig:
9261                      if(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9262                      {
9263                         free(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf);
9264                      }
9265                      break;
9266                   default:
9267                      DU_LOG("\nERROR  -->  F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9268                            rrcMsg->iE_Extensions->list.array[ieIdx]->id);
9269                      break;
9270                }
9271             }
9272          }
9273          for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
9274          {
9275             free(rrcMsg->iE_Extensions->list.array[arrIdx]);
9276          }
9277          free(rrcMsg->iE_Extensions->list.array);
9278
9279       }
9280
9281       free(rrcMsg->iE_Extensions);
9282    }
9283 }
9284 /*******************************************************************
9285 *
9286 * @brief free the memory allocated by decoder
9287 *
9288 * @details 
9289 *
9290 *    Function : freeAperDecodeSplCellList
9291 *
9292 *    Functionality: Free Spl Cell List 
9293                     where memory allocated by aper_decoder
9294 *
9295 * @params[in]  SCell_ToBeSetup_List_t *spCellLst
9296 * @return void
9297 *
9298 * ****************************************************************/
9299
9300
9301 void freeAperDecodeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
9302 {
9303     uint8_t  cellIdx =0;
9304
9305     if(spCellLst->list.array != NULLP)
9306     {
9307        for(cellIdx=0; cellIdx<spCellLst->list.count; cellIdx++)
9308        {
9309           if(cellIdx==0&&spCellLst->list.array[cellIdx]!=NULLP)
9310           {
9311              freeAperDecodeNrcgi(&spCellLst->list.array[cellIdx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
9312           }
9313           if(spCellLst->list.array[cellIdx]!=NULLP)
9314           {
9315              free(spCellLst->list.array[cellIdx]);
9316           }
9317        }
9318        free(spCellLst->list.array);
9319     }
9320 }
9321 /*******************************************************************
9322 *
9323 * @brief free the memory allocated by decoder
9324 *
9325 * @details
9326 *
9327 *    Function : freeAperDecodeSRBSetup 
9328 *
9329 *    Functionality: added free part for the memory allocated by aper_decoder
9330 *
9331 * @params[in] SRBs_ToBeSetup_List_t *srbSet
9332 * @return void
9333 *
9334 ****************************************************************/
9335
9336
9337 void freeAperDecodeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
9338 {
9339     uint8_t srbIdx =0;
9340     if(srbSet->list.array != NULLP)
9341     {
9342        for(srbIdx=0; srbIdx<srbSet->list.count; srbIdx++)
9343        {
9344           if(srbSet->list.array[srbIdx]!=NULLP)
9345           {
9346              free(srbSet->list.array[srbIdx]);
9347           }
9348        }
9349        free(srbSet->list.array);
9350     }
9351 }
9352
9353 /*******************************************************************
9354 *
9355 * @brief free the memory allocated by decoder
9356 *
9357 * @details
9358 *
9359 *    Function : freeAperDecodeULTnlInfo
9360 *
9361 *    Functionality: added free part for the memory allocated by aper_decoder
9362 *
9363 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
9364 * @return void
9365 *
9366 * ****************************************************************/
9367
9368
9369 void freeAperDecodeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9370 {
9371    uint8_t ulIdx=0;
9372    if(ulInfo->list.array != NULLP)
9373    {
9374       for(ulIdx=0; ulIdx<ulInfo->list.count; ulIdx++)
9375       {
9376          if(ulIdx==0&&ulInfo->list.array[ulIdx]!=NULLP)
9377          {
9378             if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
9379             {
9380                if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9381                      transportLayerAddress.buf != NULLP)
9382                {
9383                   if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
9384                         !=NULLP)
9385                   {
9386                      free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf);
9387                   }
9388                   free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9389                         transportLayerAddress.buf);
9390                }
9391                free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel);
9392             }
9393          }
9394          if(ulInfo->list.array[ulIdx]!=NULLP)
9395          {
9396             free(ulInfo->list.array[ulIdx]);
9397          }
9398       }
9399       free(ulInfo->list.array);
9400    }
9401 }
9402 /*******************************************************************
9403 *
9404 * @brief free the memory allocated by decoder
9405 *
9406 * @details
9407 *
9408 *    Function : freeAperDecodeDRBSetup  
9409 *
9410 *    Functionality: free DRBSetup which is allocated by decoder
9411 *
9412 * @params[in]  DRBs_ToBeSetup_List_t *drbSet
9413 * @return void
9414 *
9415 * ****************************************************************/
9416
9417 void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
9418 {
9419    DRBs_ToBeSetup_Item_t *drbSetItem = NULLP;
9420    uint8_t  flowIdx =0;
9421    uint8_t  drbIdx =0;
9422
9423    if(drbSet->list.array != NULLP)
9424    {
9425       for(drbIdx=0; drbIdx<drbSet->list.count; drbIdx++)
9426       {
9427          if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
9428          {
9429             drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9430             if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
9431             {
9432                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9433                      qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
9434                {
9435                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9436                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9437                   {
9438                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9439                            qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9440                      {
9441
9442                         if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
9443                         {
9444
9445                            if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
9446                            {
9447
9448                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
9449                                     buf!=NULLP)
9450                               {
9451
9452                                  if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
9453                                        flows_Mapped_To_DRB_List.list.array != NULLP)
9454                                  {
9455
9456                                     for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9457                                           DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
9458                                     {
9459
9460                                        if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9461                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9462                                        {
9463                                           if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9464                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9465                                                 qoSFlowLevelQoSParameters.\
9466                                                 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
9467                                           {
9468                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9469                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9470                                                    qoSFlowLevelQoSParameters.\
9471                                                    qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9472                                              {
9473
9474                                                 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9475                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9476                                                       qoSFlowLevelQoSParameters.\
9477                                                       qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9478                                                 {
9479
9480
9481                                                    free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9482                                                          DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9483                                                          qoSFlowLevelQoSParameters.\
9484                                                          qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9485                                                 }
9486
9487                                                 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9488                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9489                                                       qoSFlowLevelQoSParameters.\
9490                                                       qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9491                                              }
9492
9493                                              free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9494
9495                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9496                                                    qoSFlowLevelQoSParameters.\
9497                                                    qoS_Characteristics.choice.non_Dynamic_5QI);
9498                                           }
9499                                        }
9500                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9501                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9502                                        {
9503
9504                                           free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9505                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
9506                                        }
9507                                     }
9508
9509                                     free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9510                                           DRB_Information.flows_Mapped_To_DRB_List.list.array);
9511                                  }
9512
9513                                  free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9514                                        DRB_Information.sNSSAI.sD->buf);
9515                               }
9516
9517                               free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
9518                            }
9519
9520                            free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
9521
9522                         }
9523
9524                         free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9525
9526                               qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9527                      }
9528
9529                      free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9530                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9531                   }
9532
9533                   free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9534                         qoS_Characteristics.choice.non_Dynamic_5QI);
9535                }
9536                free(drbSetItem->qoSInformation.choice.choice_extension);
9537             }
9538             freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
9539             if(drbSetItem->uLConfiguration)
9540             {
9541                free(drbSetItem->uLConfiguration);
9542             }
9543          }
9544          if(drbSet->list.array[drbIdx]!=NULLP)
9545          {
9546             free(drbSet->list.array[drbIdx]);
9547          }
9548       }
9549       free(drbSet->list.array);
9550    }
9551 }
9552
9553
9554 /*******************************************************************
9555  *
9556  * @brief builds Mac Cell Cfg
9557  *
9558  * @details
9559  *
9560  *    Function : procUeReCfgCellInfo
9561  *
9562  *    Functionality: builds Mac Cell Cfg
9563  *
9564  * @params[in] MacUeCfg pointer
9565  *             void pointer
9566  *
9567  * @return void 
9568  *
9569  * ****************************************************************/
9570 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, void *cellInfo)
9571 {
9572    uint8_t ret = ROK;
9573    CellGroupConfigRrc_t *cellGrp = NULLP;
9574
9575    if(cellInfo)
9576    {
9577       cellGrp = (CellGroupConfigRrc_t *)cellInfo;
9578       ret = extractUeReCfgCellInfo(cellGrp, macUeCfgToSend);
9579       if(ret == RFAILED)
9580          DU_LOG("\nERROR  -->  F1AP : Failed at procUeReCfgCellInfo()");
9581    }
9582    if(ret == RFAILED)
9583    {
9584       freeUeReCfgCellGrpInfo(macUeCfgToSend);
9585    }
9586    return ret;
9587 }
9588
9589 /*******************************************************************
9590  *
9591  * @brief Filling modulation info in mac ue cfg
9592  *
9593  * @details
9594  *
9595  *    Function : duFillModulationDetails
9596  *
9597  *    Functionality: Filling modulation info in mac ue cfg
9598  *
9599  * @params[in] MAC UE Config to be updated
9600  *             Current UE configuration
9601  *             UE NR capability from CU
9602  * @return ROK     - success
9603  *         RFAILED - failure
9604  *
9605  * ****************************************************************/
9606 void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
9607 {
9608    UE_NR_Capability_t *ueNrCap=NULLP;
9609
9610    if(!ueCap)
9611    {
9612       memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));     
9613       memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9614    }
9615    else
9616    {
9617       ueNrCap = (UE_NR_Capability_t *)ueCap;
9618
9619       /* Filling DL modulation info */
9620       if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
9621          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
9622          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
9623       {
9624          switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
9625          {
9626             case ModulationOrder_qpsk:
9627                {
9628                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
9629                   break;
9630                }
9631             case ModulationOrder_qam16:
9632                {
9633                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
9634                   break;
9635                }
9636             case ModulationOrder_qam64:
9637                {
9638                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
9639                   ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
9640                   ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
9641                   break;
9642                }
9643             case ModulationOrder_qam256:
9644                {
9645                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
9646                   break;
9647                }
9648             default:
9649                {
9650                   DU_LOG("\nERROR  -->  DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
9651                   memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9652                   break;
9653                }
9654          }
9655       }
9656       else
9657       {
9658          memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9659       }
9660
9661       /* Filling UL modulation info */
9662       if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
9663          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
9664          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
9665       {
9666          switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
9667          {
9668             case ModulationOrder_qpsk:
9669                {
9670                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
9671                   break;
9672                }
9673             case ModulationOrder_qam16:
9674                {
9675                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
9676                   ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
9677                   ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
9678                   break;
9679                }
9680             case ModulationOrder_qam64:
9681                {
9682                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
9683                   break;
9684                }
9685             case ModulationOrder_qam256:
9686                {
9687                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
9688                   break;
9689                }
9690             default:
9691                {
9692                   DU_LOG("\nERROR  -->  DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
9693                   memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9694                   break;
9695                }
9696          }
9697       }
9698       else
9699       {
9700          memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9701       }
9702    }
9703 }
9704
9705 /*******************************************************************
9706  *
9707  * @brief Function to extract cellGrp Info present in cutoDu cont
9708  *
9709  * @details
9710  *
9711  *    Function : extractCellGrpInfo
9712  *
9713  *    Functionality: Function to extract cellGrp Info present
9714  *                   in cutoDu cont
9715  *
9716  * @params[in] ProtocolExtensionContainer_4624P16_t pointer
9717  *
9718  * @return CellGroupConfigRrc_t *
9719  *
9720  * ****************************************************************/
9721
9722 CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
9723       DuUeCfg *ueCfgDb)
9724 {
9725    uint8_t idx2 =0;
9726    uint16_t id =0;
9727    uint16_t recvBufLen =0;
9728    CellGroupConfigRrc_t *cellGrpCfg = NULLP;
9729    CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
9730    asn_dec_rval_t rval; /* Decoder return value */
9731    memset(&rval, 0, sizeof(asn_dec_rval_t));
9732
9733    if(protocolIeExtn)
9734    {
9735       for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++)
9736       {
9737          extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2]));
9738          id = extIeInfo->id;
9739          switch(id)
9740          {
9741             case ProtocolIE_ID_id_CellGroupConfig:
9742             {
9743                recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
9744                /* decoding the CellGroup Buf received */
9745                DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
9746                if(cellGrpCfg)
9747                {
9748                   memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
9749                   rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
9750                      extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
9751                   if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9752                   {
9753                      DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9754                      return NULLP;
9755                   }
9756                   xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
9757                   if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
9758                      return NULLP;
9759                }
9760                break;
9761             }
9762             default:
9763                DU_LOG("\nERROR  -->  F1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id);
9764                break;
9765          }
9766       }
9767    }
9768    return cellGrpCfg;
9769 }
9770
9771 /*******************************************************************
9772  *
9773  * @brief Fills Srb List received by CU
9774  *
9775  * @details
9776  *
9777  *    Function : procSrbListToSetup
9778  *
9779  *    Functionality: Fills Srb List received  by CU
9780  *
9781  * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
9782  *             LcCfg pointer
9783  *             RlcBearerCfg pointer
9784  * @return void
9785  *
9786  * ****************************************************************/
9787 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
9788 {
9789    uint8_t ret = ROK;
9790
9791    /* Filling RLC INFO */
9792    procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
9793
9794    /* Filling MAC INFO */
9795    ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, macLcToAdd, NULL);
9796    if(ret == RFAILED)
9797    { 
9798       DU_LOG("\nERROR  -->  F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
9799       return ret;
9800    }
9801    return ret;
9802 }
9803
9804
9805
9806 /*******************************************************************
9807  *
9808  * @brief extract Srb List received by CU
9809  *
9810  * @details
9811  *
9812  *    Function : extractSrbListToSetup
9813  *
9814  *    Functionality: extract Srb List received by CU
9815  *                   for both MAC and RLC
9816  *
9817  * @params[in] SRBs_ToBeSetup_Item_t pointer
9818  *             DuUeCfg pointer
9819  * @return ROK/RFAIED
9820  *
9821  * ****************************************************************/
9822
9823 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
9824 {
9825    uint8_t ret, srbIdx;
9826    SRBs_ToBeSetup_Item_t *srbItem = NULLP;
9827
9828    if(srbCfg)
9829    {
9830       for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
9831       {
9832          srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
9833          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9834          { 
9835             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in MAC");
9836             ret = RFAILED;
9837             break;
9838          }
9839          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9840          {
9841             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in RLC");
9842             ret = RFAILED;
9843             break;
9844          }
9845          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9846          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9847          ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9848             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
9849          ueCfgDb->numRlcLcs++;
9850          ueCfgDb->numMacLcs++;
9851          if(ret == RFAILED)
9852          {
9853             DU_LOG("\nERROR  -->  F1AP:  Failed at extractSrbListToSetup()");
9854             break;
9855          }
9856       }
9857    }
9858    else
9859       ret = RFAILED;
9860
9861    return ret;
9862 }
9863
9864 /*******************************************************************
9865  *
9866  * @brief Fills Drb List received by CU
9867  *
9868  * @details
9869  *
9870  *    Function : procDrbListToSetup
9871  *
9872  *    Functionality: Fills Drb List received by CU
9873  *                   for both MAC and RLC
9874  *
9875  * @params[in] SRBs_ToBeSetup_Item_t pointer
9876  *             LcCfg pointer,
9877  *             RlcBearerCfg pointer
9878  * @return void
9879  *
9880  * ****************************************************************/
9881
9882 uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\
9883 DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo)
9884 {
9885
9886    if(drbItem != NULLP)
9887    {
9888       /* Filling RLC INFO */
9889       procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
9890
9891       /* Filling MAC INFO */
9892       if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK)
9893       { 
9894          DU_LOG("\nERROR  --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
9895          return RFAILED;
9896       }
9897    }
9898    else if(drbSetupModItem != NULLP)
9899    {
9900       procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
9901
9902       if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, macLcToAdd, upTnlInfo) != ROK)
9903       {
9904          DU_LOG("\nERROR  --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
9905          return RFAILED;
9906       }
9907    }
9908    return ROK;
9909 }
9910
9911 /*******************************************************************
9912  *
9913  * @brief extract Drb List received by CU
9914  *
9915  * @details
9916  *
9917  *    Function : extractDrbListToSetup
9918  *
9919  *    Functionality: extract Drb List received by CU
9920  *                   for both MAC and RLC
9921  *
9922  * @params[in] DRBs_ToBeSetup_Item_t pointer
9923  *             DuUeCfg pointer
9924  * @return ROK/RFAIED
9925  *
9926  * ****************************************************************/
9927
9928 uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg,DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\
9929 uint8_t drbCount, DuUeCfg *ueCfgDb)
9930 {
9931    uint8_t ret, drbIdx;
9932    DRBs_ToBeSetup_Item_t *drbItem = NULLP;
9933    DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP;
9934
9935    ret = ROK;
9936    if(drbCount > 0)
9937    {
9938       for(drbIdx = 0; drbIdx < drbCount; drbIdx++)
9939       {
9940          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9941          { 
9942             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in MAC at extractDrbListToSetup()");
9943             ret = RFAILED;
9944             break;
9945          }
9946          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9947          {
9948             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in RLC at extractDrbListToSetup()");
9949             ret = RFAILED;
9950             break;
9951          }
9952          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9953          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9954    
9955          if(drbCfg != NULL)
9956          {
9957             drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9958             ret = procDrbListToSetup(lcId, drbItem, NULL, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9959                &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
9960             if(ret == RFAILED)
9961             {
9962                DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
9963                break;
9964             }
9965          }
9966          else if(drbSetupModCfg != NULL)
9967          {
9968             drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx];
9969             ret = procDrbListToSetup(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item) ,\
9970             &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs],\
9971             &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
9972             if(ret == RFAILED)
9973             {
9974                DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
9975                break;
9976             }
9977          }
9978          ueCfgDb->numRlcLcs++;
9979          ueCfgDb->numMacLcs++;
9980          ueCfgDb->numDrb++;
9981          if(ret == RFAILED)
9982          {
9983             DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
9984             break;
9985          }
9986       }
9987    }
9988    else
9989       ret = RFAILED;
9990
9991    return ret;
9992 }
9993
9994 /*******************************************************************
9995  *
9996  * @brief Function to extract Dl RRC Msg received from CU
9997  *
9998  * @details
9999  *
10000  *    Function : extractDlRrcMsg
10001  *
10002  *    Functionality: Function to extract Dl RRC Msg received from CU
10003  *
10004  * @params[in] F1AP message
10005  * @return ROK     - success
10006  *         RFAILED - failure
10007  *
10008  * ****************************************************************/
10009
10010 uint8_t extractDlRrcMsg(uint32_t gnbDuUeF1apId, uint32_t gnbCuUeF1apId, \
10011    F1DlRrcMsg *dlRrcMsg, RRCContainer_t *rrcContainer)
10012 {
10013    uint8_t ret = ROK;
10014    dlRrcMsg->rrcMsgSize = rrcContainer->size;
10015    if(dlRrcMsg->rrcMsgSize > 0)
10016    {
10017       DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
10018       if(!dlRrcMsg->rrcMsgPdu)
10019       {
10020          DU_LOG("\nERROR  --> DU APP : Memory allocation failed for RRC Msg in extractDlRrcMsg()");
10021          ret = RFAILED;
10022       }
10023       else
10024       {
10025          dlRrcMsg->gnbDuUeF1apId = gnbDuUeF1apId;
10026          dlRrcMsg->gnbCuUeF1apId = gnbCuUeF1apId;
10027          dlRrcMsg->srbId = SRB1_LCID;
10028          memcpy(dlRrcMsg->rrcMsgPdu, rrcContainer->buf, dlRrcMsg->rrcMsgSize);
10029       }
10030    }
10031    return ret;
10032 }
10033
10034 /*******************************************************************
10035  *
10036  * @brief Extract UE capability info 
10037  *
10038  * @details
10039  *
10040  *    Function : extractUeCapability
10041  *
10042  *    Functionality: Extract UE capability info and stores in ue Cb
10043  *
10044  * @params[in] Octet string of UE capability RAT container list
10045  * @return ROK     - success
10046  *         RFAILED - failure
10047  *
10048  * ****************************************************************/
10049 UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf, DuUeCb *ueCb)
10050 {
10051    uint8_t  idx;
10052    uint16_t recvBufLen;
10053    asn_dec_rval_t rval;
10054    UE_NR_Capability_t  *ueNrCap = NULLP;
10055    UE_CapabilityRAT_ContainerListRRC_t  *ueCapRatContList = NULLP;
10056
10057    /* Decoding UE Capability RAT Container List */
10058    recvBufLen = ueCapablityListBuf->size;
10059    DU_ALLOC(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10060    if(!ueCapRatContList)
10061    {
10062       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
10063       return NULLP;
10064    }
10065    memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10066    memset(&rval, 0, sizeof(asn_dec_rval_t));
10067    rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList,
10068           ueCapablityListBuf->buf, recvBufLen, 0, 0);
10069    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
10070    {
10071       DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
10072       return NULLP;
10073    }
10074    xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, ueCapRatContList);
10075
10076    /* Free encoded buffer after decoding */
10077
10078    for(idx = 0; idx < ueCapRatContList->list.count; idx++)
10079    {
10080       if(ueCapRatContList->list.array[idx]->rat_Type == RAT_Type_nr)
10081       {
10082          /* Decoding UE NR Capability */
10083           recvBufLen = ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.size;
10084           DU_ALLOC(ueNrCap, sizeof(UE_NR_Capability_t));
10085           if(!ueNrCap)
10086           {
10087              DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
10088              DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10089              return NULLP;
10090           } 
10091           memset(ueNrCap, 0, sizeof(UE_NR_Capability_t));
10092           memset(&rval, 0, sizeof(asn_dec_rval_t));
10093           rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap,
10094                  ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0);
10095           if(rval.code == RC_FAIL || rval.code == RC_WMORE)
10096           {
10097              DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
10098              return NULLP;
10099           }
10100           xer_fprint(stdout, &asn_DEF_UE_NR_Capability, ueNrCap);
10101           
10102           /* Free encoded buffer after decoding */
10103           free(ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf);
10104       }
10105       free(ueCapRatContList->list.array[idx]);
10106    }
10107
10108    /* Free Memory*/
10109    free(ueCapRatContList->list.array);
10110    DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10111    return ueNrCap;
10112 }
10113  
10114 /*******************************************************************
10115 *
10116 * @brief free UE context setup request from CU
10117 *
10118 * @details
10119 *
10120 *    Function : freeAperDecodeF1UeContextSetupReq
10121 *
10122 *    Functionality: freeing part for the memory allocated by aper_decoder
10123 *
10124 * @params[in] F1AP message
10125 * @return ROK     - success
10126 *         RFAILED - failure
10127 *
10128 * ****************************************************************/
10129 void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t   *ueSetReq)
10130 {
10131    uint8_t ieIdx = 0;
10132
10133    if(ueSetReq->protocolIEs.list.array != NULLP)
10134    {
10135       for(ieIdx = 0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++)
10136       {
10137          if(ueSetReq->protocolIEs.list.array[ieIdx])
10138          {
10139             switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
10140             {
10141                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10142                   break;
10143                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10144                   break;
10145                case ProtocolIE_ID_id_SpCell_ID:
10146                   freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
10147                   break;
10148                case ProtocolIE_ID_id_ServCellIndex:
10149                   break;
10150                case ProtocolIE_ID_id_SpCellULConfigured:
10151                   break;
10152                case ProtocolIE_ID_id_CUtoDURRCInformation:
10153
10154                   freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation);
10155                   break;
10156                case ProtocolIE_ID_id_SCell_ToBeSetup_List:
10157
10158                   freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List);
10159                   break;
10160                case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
10161
10162                   freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List);
10163                   break;
10164                case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
10165
10166                   freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List);
10167                   break;
10168                case ProtocolIE_ID_id_RRCContainer:
10169                   {
10170
10171                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP)
10172                      {
10173
10174                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
10175                      }
10176                      break;
10177                   }
10178                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
10179                   break;
10180                case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
10181                   {
10182                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf)
10183                      {
10184                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf);
10185                      }
10186                      break;
10187                   }
10188                default:
10189                   DU_LOG("\nERROR  -->  F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id);
10190             } 
10191             free(ueSetReq->protocolIEs.list.array[ieIdx]);
10192          }
10193       }
10194       free(ueSetReq->protocolIEs.list.array);
10195    }
10196 }
10197 /*******************************************************************
10198  *
10199  * @brief Process UE context setup request from CU
10200  *
10201  * @details
10202  *
10203  *    Function : procF1UeContextSetupReq
10204  *
10205  *    Functionality: Process UE context setup request from CU
10206  *
10207  * @params[in] F1AP message
10208  * @return ROK     - success
10209  *         RFAILED - failure
10210  *
10211  * ****************************************************************/
10212 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
10213 {
10214    uint8_t  ret=0, ieIdx=0, ueIdx=0, lcId=0, cellIdx=0;
10215    bool ueCbFound = false;
10216    uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0;
10217    DuUeCb   *duUeCb = NULL;
10218    UEContextSetupRequest_t   *ueSetReq = NULL;
10219    DRBs_ToBeSetup_List_t *drbCfg = NULL;
10220
10221    ret = ROK;
10222
10223    ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
10224    for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
10225    {
10226       switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
10227       {
10228          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10229             {
10230                gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
10231                break;
10232             }
10233          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10234             {
10235                gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
10236                break;
10237             }
10238          case ProtocolIE_ID_id_ServCellIndex:
10239             {
10240                cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
10241                for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
10242                {
10243                   if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
10244                         (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
10245                   {
10246                      ueCbFound = true;
10247                      duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
10248                      DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
10249                      if(duUeCb->f1UeDb)
10250                      {
10251                         memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
10252                         duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
10253                         duUeCb->f1UeDb->cellIdx = cellIdx;
10254                      }
10255                      else
10256                      {
10257                         DU_LOG("\nERROR  -->  F1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
10258                         ret = RFAILED;
10259                      }
10260                   }
10261                   else
10262                      ueCbFound = false;
10263
10264                }
10265                if(!ueCbFound)
10266                {
10267                   DU_LOG("\nERROR  -->  F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
10268                   ret = RFAILED;
10269                }
10270                break;
10271             }
10272          case ProtocolIE_ID_id_SpCellULConfigured:
10273             /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL, 
10274                UL, SUL or UL+SUL for the indicated cell for the UE */
10275             break;
10276          case ProtocolIE_ID_id_CUtoDURRCInformation:
10277             {
10278                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList)
10279                {
10280                   duUeCb->f1UeDb->duUeCfg.ueNrCapability = \
10281                   extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
10282                   uE_CapabilityRAT_ContainerList, duUeCb);
10283                }
10284                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
10285                {
10286                   duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
10287                         value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
10288                   if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
10289                   {
10290                      DU_LOG("\nERROR  -->  F1AP: Failed to extract cell Grp Info");
10291                      //TODO: Update the failure cause in ue context Setup Response
10292                      ret = RFAILED;
10293                   }
10294                }
10295                break;
10296             } 
10297          case ProtocolIE_ID_id_SCell_ToBeSetup_List:
10298             {
10299                DU_LOG("\nINFO   -->  DU_APP: Received SCell_ToBeSetup_List but  Not processing the list");
10300                break;
10301             }
10302          case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
10303             {
10304                if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
10305                &duUeCb->f1UeDb->duUeCfg))
10306                {
10307                   DU_LOG("\nERROR  -->  DU APP : Failed at extractSrbListToSetup()");
10308                   //TODO: Update the failure cause in ue context Setup Response
10309                   ret = RFAILED;
10310                }
10311                break;
10312             }
10313          case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
10314             {
10315                lcId = getDrbLcId(&duUeCb->drbBitMap);
10316                if(lcId != RFAILED)
10317                {
10318                   drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List;
10319                   if(extractDrbListToSetup(lcId, drbCfg, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg))
10320                   {
10321                      DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
10322                      //TODO: Update the failure cause in ue context Setup Response
10323                      ret = RFAILED;
10324                   }
10325                }
10326                else 
10327                   ret = RFAILED;
10328                break;
10329             }
10330          case ProtocolIE_ID_id_RRCContainer:
10331             {
10332                /* Filling Dl RRC Msg Info */
10333                DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
10334                if(!duUeCb->f1UeDb->dlRrcMsg)
10335                {
10336                   DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
10337                   ret = RFAILED;
10338                }
10339                else
10340                {
10341                   duUeCb->f1UeDb->dlRrcMsgPres = true;
10342                   memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
10343                   ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
10344                         &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
10345                }          
10346                break;
10347             }
10348          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
10349             {
10350                if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
10351                {
10352                   duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
10353                }
10354                else
10355                {
10356                   DU_LOG("\nERROR  -->  Ignoring delivery report, since rrcContainer is not present");
10357                }
10358                break;
10359             }
10360          case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
10361             {
10362                /* MaximumBitRate Uplink */
10363                bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
10364                if(bitRateSize > 0)
10365                {
10366                   DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
10367                   if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
10368                   {
10369                      DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
10370                      ret = RFAILED;
10371                   }
10372                   else
10373                   {
10374                      memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg)); 
10375                      memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
10376                            ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
10377                   }
10378                }
10379                else
10380                   ret = RFAILED;
10381                break;
10382             }
10383          default:
10384             {
10385                break;
10386             }
10387       }
10388    }
10389    if(ret == RFAILED)
10390    {
10391       /*TODO : Negative case*/
10392       // BuildAndSendUeContextSetupRsp(cellId,ueIdx);
10393       DU_LOG("\nERROR  -->  F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); 
10394    }
10395    else
10396       ret = duProcUeContextSetupRequest(duUeCb);
10397
10398    freeAperDecodeF1UeContextSetupReq(ueSetReq); 
10399    return ret;
10400
10401 }
10402 /*******************************************************************
10403  * @brief Free the memory allocated for Dl Tunnel Info
10404  *
10405  * @details
10406  *
10407  *    Function : freeDlTnlInfo
10408  *
10409  *    Functionality:
10410  *       Free the memory allocated for Dl Tunnel Info
10411  *
10412  * @params[in] DLUPTNLInformation_ToBeSetup_List_t *
10413  * @return void
10414  *
10415  * ****************************************************************/
10416
10417 void freeDlTnlInfo(DLUPTNLInformation_ToBeSetup_List_t *tnlInfo)
10418 {
10419    uint8_t arrIdx = 0;
10420
10421    if(tnlInfo)
10422    {
10423       for(arrIdx=0; arrIdx < tnlInfo->list.count; arrIdx++)
10424       {
10425          DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf,\
10426                tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10427          DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf,\
10428                tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
10429          DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
10430          DU_FREE(tnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
10431       }
10432       DU_FREE(tnlInfo->list.array, tnlInfo->list.size);
10433    }
10434 }
10435
10436 /*******************************************************************
10437  * @brief Free the memory allocated for DRB setup List
10438  *
10439  * @details
10440  *
10441  *    Function : freeDrbSetupList
10442  *
10443  *    Functionality:
10444  *       Free the memory allocated for DRB setup list
10445  *
10446  * @params[in] DRBs_Setup_List_t *
10447  * @return void
10448  *
10449  * ****************************************************************/
10450 void freeDrbSetupList(DRBs_Setup_List_t *drbSetupList)
10451 {
10452    uint8_t arrIdx = 0;
10453    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
10454
10455    for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
10456    {
10457       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
10458       freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
10459       DU_FREE(drbSetupList->list.array[arrIdx],  sizeof(DRBs_Setup_Item_t));
10460    }
10461    DU_FREE(drbSetupList->list.array, drbSetupList->list.size);
10462 }
10463
10464 /*******************************************************************
10465  * @brief Free the memory allocated for UE Setup response
10466  *
10467  * @details
10468  *
10469  *    Function : FreeUeContextSetupRsp
10470  *
10471  *    Functionality:
10472  *       Free the memory allocated for UE Setup response
10473  *
10474  * @params[in] F1AP PDU for UE setup response
10475  * @return ROK     - success
10476  *         RFAILED - failure
10477  *
10478  * ****************************************************************/
10479 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
10480 {
10481    uint8_t idx;
10482    UEContextSetupResponse_t *ueSetRsp = NULLP;
10483
10484    if(f1apMsg)
10485    {
10486       if(f1apMsg->choice.successfulOutcome)
10487       {
10488          ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
10489                     UEContextSetupResponse;
10490          if(ueSetRsp->protocolIEs.list.array)
10491          {
10492             for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
10493             {
10494                if(ueSetRsp->protocolIEs.list.array[idx])
10495                {
10496                   switch(ueSetRsp->protocolIEs.list.array[idx]->id)
10497                   {
10498                      case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10499                         break;
10500                      case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10501                         break;
10502                      case ProtocolIE_ID_id_DUtoCURRCInformation:
10503                         {
10504                            CellGroupConfig_t *cellGrpCfg = NULLP;
10505                            cellGrpCfg  = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
10506                                          DUtoCURRCInformation.cellGroupConfig;
10507                            if(cellGrpCfg->buf != NULLP)
10508                            {
10509                               DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
10510                               cellGrpCfg = NULLP;
10511                            }
10512                            break;
10513                         }
10514                     case ProtocolIE_ID_id_DRBs_Setup_List:
10515                         {
10516                            freeDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List); 
10517                            break;
10518                         }
10519                      default:
10520                         DU_LOG("\nERROR  -->  DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
10521                         ueSetRsp->protocolIEs.list.array[idx]->id);
10522                         break;
10523                   }
10524                   DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
10525                         sizeof(UEContextSetupResponseIEs_t));
10526                }
10527             }
10528             DU_FREE(ueSetRsp->protocolIEs.list.array, \
10529                   ueSetRsp->protocolIEs.list.size);
10530          }
10531          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10532       }
10533       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10534    }
10535 }
10536
10537 /*******************************************************************
10538  *
10539  * @brief Builds Ue context Setup Rsp DU To CU Info
10540  *
10541  * @details
10542  *
10543  *    Function : EncodeUeCntxtDuToCuInfo
10544  *
10545  *    Functionality: Builds Ue context Setup Rsp DU To CU Info
10546  *
10547  * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t * 
10548  *
10549  * @return ROK     - success
10550  *         RFAILED - failure
10551  *
10552  ******************************************************************/
10553
10554 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
10555 {
10556    asn_enc_rval_t        encRetVal;
10557
10558    xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
10559    memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
10560    encBufSize = 0;
10561    encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
10562    /* Encode results */
10563    if(encRetVal.encoded == ENCODE_FAIL)
10564    {
10565       DU_LOG( "\nERROR  -->  F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
10566             encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10567       return RFAILED;
10568    }
10569    else
10570    {
10571       DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
10572       for(int i=0; i< encBufSize; i++)
10573       {
10574          printf("%x",encBuf[i]);
10575       }
10576    }
10577    duToCuCellGrp->size = encBufSize;
10578    DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
10579    if(!duToCuCellGrp->buf)
10580    {
10581       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
10582    }
10583    memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
10584    return ROK;
10585 }
10586
10587 /*******************************************************************
10588  *
10589  * @brief Fills Dl Gtp tunnel Info
10590  *
10591  * @details
10592  *
10593  *    Function : fillGtpTunnelforDl
10594  *
10595  *    Functionality: Fills Dl Gtp tunnel Info
10596  *
10597  * @params[in] 
10598  *
10599  * @return ROK     - success
10600  *         RFAILED - failure
10601  *
10602  * ****************************************************************/
10603
10604 uint8_t fillGtpTunnelforDl(GTPTunnel_t *gtpDl, GtpTnlCfg *gtpUeCfg)
10605 {
10606    uint8_t bufSize = 0;
10607
10608    gtpDl->transportLayerAddress.size    = 4*sizeof(uint8_t);
10609    DU_ALLOC(gtpDl->transportLayerAddress.buf, gtpDl->transportLayerAddress.size);
10610    if(gtpDl->transportLayerAddress.buf == NULLP)
10611    {
10612       return RFAILED;
10613    }
10614    memcpy(gtpDl->transportLayerAddress.buf, &gtpUeCfg->dlTnlAddress, gtpDl->transportLayerAddress.size);
10615
10616    /*GTP TEID*/
10617    gtpDl->gTP_TEID.size = 4 * sizeof(uint8_t);
10618    DU_ALLOC(gtpDl->gTP_TEID.buf, gtpDl->gTP_TEID.size);
10619    if(gtpDl->gTP_TEID.buf == NULLP)
10620    {
10621       return RFAILED;
10622    }
10623    bufSize = 3; /*forming an Octect String*/
10624    fillTeIdString(bufSize, gtpUeCfg->teId, gtpDl->gTP_TEID.buf);
10625
10626    return ROK;
10627 }
10628
10629 /*******************************************************************
10630  *
10631  * @brief Fills DL Tunnel Setup List
10632  *
10633  * @details
10634  *
10635  *    Function : fillDlTnlSetupList
10636  *
10637  *    Functionality: Fills the DL Tunnel Setup List
10638  *
10639  * @params[in] 
10640  *
10641  * @return ROK     - success
10642  *         RFAILED - failure
10643  *
10644  * ****************************************************************/
10645
10646 uint8_t fillDlTnlSetupList(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo, UpTnlCfg *tnlCfg)
10647 {
10648    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10649
10650    eleCount = 1;
10651    dlTnlInfo->list.count = eleCount; 
10652    dlTnlInfo->list.size = (eleCount * sizeof(DLUPTNLInformation_ToBeSetup_Item_t *));
10653
10654    /* Initialize the DL Tnl Setup List Members */
10655    DU_ALLOC(dlTnlInfo->list.array, dlTnlInfo->list.size);
10656    if(dlTnlInfo->list.array == NULLP)
10657    {
10658       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL Tnl Setup List in fillDlTnlSetupList()");
10659       ret = RFAILED;
10660    }
10661    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10662    {
10663       DU_ALLOC(dlTnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
10664       if(dlTnlInfo->list.array[arrIdx] == NULLP)
10665       {
10666          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDlTnlSetupList()", arrIdx);
10667          return RFAILED;
10668       }
10669       dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
10670       DU_ALLOC(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
10671       if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel == NULLP)
10672       {
10673          DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL tunnel info in fillDlTnlSetupList()");
10674          return RFAILED;
10675       }
10676       ret = fillGtpTunnelforDl(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel,\
10677                tnlCfg->tnlCfg1);
10678       if(ret != ROK)
10679          break;
10680    }
10681    return ret;
10682 }
10683
10684 /*******************************************************************
10685  *
10686  * @brief Fills the Drb Setup List for Ue Context Setup Response
10687  *
10688  * @details
10689  *
10690  *    Function : fillDrbSetupList
10691  *
10692  *    Functionality: Fills the Drb Setup List for Ue Context Setup Response
10693  *
10694  * @params[in] 
10695  *
10696  * @return ROK     - success
10697  *         RFAILED - failure
10698  *
10699  * ****************************************************************/
10700 uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg)
10701 {
10702    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10703    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
10704
10705    eleCount = ueCfg->numDrb;
10706    drbSetupList->list.count = eleCount;
10707    drbSetupList->list.size = \
10708         (eleCount * sizeof(DRBs_Setup_Item_t *));
10709
10710    /* Initialize the Drb Setup List Members */
10711    DU_ALLOC(drbSetupList->list.array, drbSetupList->list.size);
10712    if(drbSetupList->list.array == NULLP)
10713    {
10714       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DRB Setup List in fillDrbSetupList()");
10715       ret = RFAILED;
10716    }
10717
10718    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10719    {
10720       DU_ALLOC(drbSetupList->list.array[arrIdx], sizeof(DRBs_Setup_Item_t));
10721       if(drbSetupList->list.array[arrIdx] == NULLP)
10722       {
10723          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDrbSetupList()", arrIdx);
10724          return RFAILED;
10725       }
10726       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
10727       drbItemIe->id = ProtocolIE_ID_id_DRBs_Setup_Item;
10728       drbItemIe->criticality = Criticality_reject;
10729       drbItemIe->value.present = DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
10730       drbItemIe->value.choice.DRBs_Setup_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
10731       ret = fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List,\
10732           &ueCfg->upTnlInfo[arrIdx]);
10733       if(ret != ROK)
10734          break;
10735    }
10736    return ret;
10737 }
10738
10739 /*******************************************************************
10740  *
10741  * @brief Builds and sends the UE Setup Response
10742  *
10743  * @details
10744  *
10745  *    Function : BuildAndSendUeContextSetupRsp
10746  *
10747  *    Functionality: Constructs the UE Setup Response and sends
10748  *                   it to the DU through SCTP.
10749  *
10750  * @params[in] uint8_t cellId,uint8_t ueIdx
10751  *
10752  * @return ROK     - success
10753  *         RFAILED - failure
10754  *
10755  * ****************************************************************/
10756 uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx)
10757 {
10758    uint8_t   idx, ret, cellIdx, elementCnt;
10759    uint32_t  gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
10760    uint32_t  gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
10761    asn_enc_rval_t  encRetVal;        /* Encoder return value */
10762    F1AP_PDU_t               *f1apMsg = NULLP;
10763    UEContextSetupResponse_t *ueSetRsp = NULLP;
10764    CellGroupConfigRrc_t     *cellGrpCfg = NULLP;
10765    DuUeCb                   *ueCb = NULLP;
10766
10767    DU_LOG("\n INFO   -->  F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
10768
10769    while(true)
10770    {
10771       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10772       if(f1apMsg == NULLP)
10773       {
10774          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10775          ret = RFAILED;
10776          break;
10777       }
10778
10779       f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
10780       DU_ALLOC(f1apMsg->choice.successfulOutcome,
10781             sizeof(SuccessfulOutcome_t));
10782       if(f1apMsg->choice.successfulOutcome == NULLP)
10783       {
10784          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
10785          ret = RFAILED;
10786          break;
10787       }
10788
10789       f1apMsg->choice.successfulOutcome->procedureCode = \
10790                                                          ProcedureCode_id_UEContextSetup;
10791       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
10792       f1apMsg->choice.successfulOutcome->value.present = \
10793                                                          SuccessfulOutcome__value_PR_UEContextSetupResponse;
10794
10795       ueSetRsp =
10796          &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
10797       elementCnt = 4;
10798       ueSetRsp->protocolIEs.list.count = elementCnt;
10799       ueSetRsp->protocolIEs.list.size = \
10800                                         elementCnt * sizeof(UEContextSetupResponse_t *);
10801
10802       /* Initialize the UESetup members */
10803       DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
10804             ueSetRsp->protocolIEs.list.size);
10805       if(ueSetRsp->protocolIEs.list.array == NULLP)
10806       {
10807          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10808          ret = RFAILED;
10809          break;
10810       }
10811
10812       for(idx=0; idx<elementCnt; idx++)
10813       {
10814          DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
10815                sizeof(UEContextSetupResponseIEs_t));
10816          if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
10817          {
10818             DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10819             ret = RFAILED;
10820             break;
10821          }
10822       }
10823       /* Fetching Ue Cb Info*/
10824       GET_CELL_IDX(cellId, cellIdx);
10825       gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
10826       gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
10827       ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
10828
10829       idx = 0;
10830       /*GNB CU UE F1AP ID*/
10831       ueSetRsp->protocolIEs.list.array[idx]->id = \
10832                                                   ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10833       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10834       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10835                                                              UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
10836       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
10837
10838       /*GNB DU UE F1AP ID*/
10839       idx++;
10840       ueSetRsp->protocolIEs.list.array[idx]->id = \
10841                                                   ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10842       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10843       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10844                                                              UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
10845       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
10846
10847
10848       /*DUtoCURRC Information */
10849       idx++;
10850       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10851                                                    ProtocolIE_ID_id_DUtoCURRCInformation;
10852       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10853       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10854                                                             UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
10855       if(ueCb->f1UeDb)
10856       {
10857          if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
10858          {
10859             cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
10860             ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
10861                      choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
10862             if(ret == RFAILED)
10863             {
10864                DU_LOG("\nERROR  -->  F1AP : Failed to EncodeUeCntxtDuToCuInfo in BuildAndSendUeContextSetupRsp()");
10865                freeF1UeDb(ueCb->f1UeDb);
10866                ueCb->f1UeDb = NULLP;
10867                break;
10868             }
10869          }
10870       }
10871       else
10872       {
10873          DU_LOG("\nERROR  -->  F1AP : Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
10874          ret = RFAILED;
10875          break;
10876       }
10877
10878       /* Drb Setup List */
10879       idx++;
10880       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10881                                  ProtocolIE_ID_id_DRBs_Setup_List;
10882       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10883       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10884                                  UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
10885       ret = fillDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List,\
10886                &ueCb->f1UeDb->duUeCfg);
10887       if(ret == RFAILED)
10888       {
10889          DU_LOG("\nERROR  -->  F1AP : Failed to fillDrbSetupList in BuildAndSendUeContextSetupRsp()");
10890          freeF1UeDb(ueCb->f1UeDb);
10891          ueCb->f1UeDb = NULLP;
10892          break;
10893       }
10894
10895        /* Free UeContext Db created during Ue context Req */
10896        freeF1UeDb(ueCb->f1UeDb);
10897        ueCb->f1UeDb = NULLP;
10898
10899       /* TODO: To send Drb list */
10900       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10901
10902       /* Encode the UE context setup response type as APER */
10903       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
10904       encBufSize = 0;
10905       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10906             encBuf);
10907       /* Encode results */
10908       if(encRetVal.encoded == ENCODE_FAIL)
10909       {
10910          DU_LOG( "\nERROR  -->  F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\
10911                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10912          ret = RFAILED;
10913          break;
10914       }
10915       else
10916       {
10917          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UE Context Setup Response\n");
10918          for(int i=0; i< encBufSize; i++)
10919          {
10920             printf("%x",encBuf[i]);
10921          }
10922       }
10923
10924       /* Sending  msg  */
10925       if(sendF1APMsg()  != ROK)
10926       {
10927          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Setup Response failed");
10928          ret = RFAILED;
10929          break;
10930       }
10931       break;
10932    }
10933    FreeUeContextSetupRsp(f1apMsg);
10934    return ret;
10935 }/* End of BuildAndSendUeContextSetupRsp */
10936 /*******************************************************************
10937 *
10938 * @brief  Build And Send Ue Context Rsp 
10939 *
10940 * @details
10941 *
10942 *    Function : BuildAndSendUeCtxtRsp 
10943 *
10944 *    Functionality : Build And Send Ue Context Rsp
10945
10946 * @params[in]
10947 * @return sucess = ROK
10948 *         failure = RFAILED
10949 *
10950 * ****************************************************************/
10951 uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueIdx)
10952 {
10953    uint8_t cellIdx = 0, actionType = 0; 
10954
10955    GET_CELL_IDX(cellId, cellIdx);
10956    actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
10957
10958    switch(actionType)
10959    {
10960       case UE_CTXT_SETUP:
10961          {
10962             BuildAndSendUeContextSetupRsp(cellId,ueIdx);
10963             break;
10964          }
10965       case UE_CTXT_MOD:
10966          {
10967             BuildAndSendUeContextModRsp(cellId, ueIdx);
10968             break;
10969          }
10970       default:
10971          DU_LOG("ERROR  -->  F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
10972          break;
10973
10974    }
10975    return ROK;
10976 }
10977
10978 /*******************************************************************
10979  *
10980  * @brief deallocating the memory of  F1reset msg
10981  *
10982  * @details
10983  *
10984  *    Function : FreeF1ResetReq
10985  *
10986  *    Functionality :
10987  *         - freeing memory of F1reset request msg
10988  *
10989  * @params[in]
10990  * @return void
10991  *
10992  *
10993  * ****************************************************************/
10994 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
10995 {
10996    uint8_t idx =0 ;
10997    Reset_t *f1ResetMsg;
10998
10999    if(f1apMsg)
11000    {
11001       if(f1apMsg->choice.initiatingMessage)
11002       {
11003          f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
11004
11005          if(f1ResetMsg->protocolIEs.list.array)
11006          {
11007             for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
11008             {
11009                if(f1ResetMsg->protocolIEs.list.array[idx])
11010                {
11011                   DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
11012                }
11013             }
11014             DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
11015          }
11016          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11017       }
11018       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11019    }
11020 }
11021 /*******************************************************************
11022  *
11023  * @brief Build and Send F1reset request 
11024  *
11025  * @details
11026  *
11027  *    Function : BuildAndSendF1ResetReq
11028  *
11029  *    Functionality:
11030  *         - Build and Send F1reset request msg
11031  *
11032  * @params[in]
11033  * @return ROK     - success
11034  *         RFAILED - failure
11035  *
11036  * ****************************************************************/
11037 uint8_t BuildAndSendF1ResetReq()
11038 {
11039    uint8_t          elementCnt=0;
11040    uint8_t          idx=0;
11041    uint8_t          ret= RFAILED;
11042    Reset_t          *f1ResetMsg = NULLP;
11043    F1AP_PDU_t       *f1apMsg = NULLP;
11044    asn_enc_rval_t   encRetVal;
11045    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset request \n");
11046    do
11047    {
11048       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11049       if(f1apMsg == NULLP)
11050       {
11051          break;
11052       }
11053       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11054       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11055       if(f1apMsg->choice.initiatingMessage == NULLP)
11056       {
11057          break;
11058       }
11059       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
11060       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11061       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
11062
11063       f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
11064
11065       elementCnt = 3;
11066       f1ResetMsg->protocolIEs.list.count = elementCnt;
11067       f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
11068
11069       /* Initialize the F1Setup members */
11070       DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
11071       if(f1ResetMsg->protocolIEs.list.array == NULLP)
11072       {
11073          break;
11074       }
11075       for(idx=0; idx<elementCnt; idx++)
11076       {
11077          DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
11078          if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
11079          {
11080             break;
11081          }
11082       }
11083
11084       /*TransactionID*/
11085       idx=0;
11086       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
11087       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
11088       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
11089       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
11090
11091       /*Cause*/
11092       idx++;
11093       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
11094       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
11095       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
11096       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11097       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
11098
11099       /*Reset Type*/
11100       idx++;
11101       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
11102       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
11103       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
11104       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
11105       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
11106
11107       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11108
11109       /* Encode the F1SetupRequest type as APER */
11110       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11111       encBufSize = 0;
11112       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11113             encBuf);
11114
11115       /* Encode results */
11116       if(encRetVal.encoded == ENCODE_FAIL)
11117       {
11118          DU_LOG("\nERROR  -->  F1AP : Could not encode F1Reset structure (at %s)\n",\
11119                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11120          break;
11121       }
11122       else
11123       {
11124          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1Reset\n");
11125          for(idx=0; idx< encBufSize; idx++)
11126          {
11127             printf("%x",encBuf[idx]);
11128          }
11129       }
11130
11131       if(sendF1APMsg() != ROK)
11132       {
11133          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset request failed");
11134          break;
11135       }
11136
11137       ret = ROK;
11138       break;
11139    }while(true);
11140
11141    FreeF1ResetReq(f1apMsg);
11142    return ret;
11143 }
11144 /*******************************************************************
11145  *
11146  * @brief Build And Send F1ResetAck
11147  *
11148  * @details
11149  *
11150  *    Function : BuildAndSendF1ResetAck
11151  *
11152  *    Functionality:
11153  *         - Build And Send  F1ResetRSP
11154  *
11155  * @return ROK     - success
11156  *         RFAILED - failure
11157  *
11158  * ****************************************************************/
11159 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
11160 {
11161    uint8_t idx;
11162    ResetAcknowledge_t *f1ResetAck;
11163
11164    if(f1apMsg)
11165    {
11166       if(f1apMsg->choice.successfulOutcome)
11167       {
11168          f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
11169
11170          if(f1ResetAck->protocolIEs.list.array)
11171          {
11172             for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
11173             {
11174                if(f1ResetAck->protocolIEs.list.array[idx])
11175                {
11176                   DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
11177                }
11178             }
11179             DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
11180          }
11181          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
11182       }
11183       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11184    }
11185 }
11186
11187 /*******************************************************************
11188  *
11189  * @brief Build And Send F1ResetAck
11190  *
11191  * @details
11192  *
11193  *    Function : BuildAndSendF1ResetAck
11194  *
11195  *    Functionality:
11196  *         - Build And Send  F1ResetRSP
11197  *
11198  *  @params[in]
11199  * @return ROK     - success
11200  *         RFAILED - failure
11201  *
11202  * ****************************************************************/
11203 uint8_t BuildAndSendF1ResetAck()
11204 {
11205    uint8_t                idx = 0;
11206    uint8_t                elementCnt = 0;
11207    uint8_t                ret = RFAILED;
11208    F1AP_PDU_t             *f1apMsg = NULL;
11209    ResetAcknowledge_t     *f1ResetAck = NULLP;
11210    asn_enc_rval_t         encRetVal;
11211    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset Acknowledgment \n");
11212
11213    do{
11214       /* Allocate the memory for F1ResetRequest_t */
11215       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11216       if(f1apMsg == NULLP)
11217       {
11218          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
11219          break;
11220       }
11221
11222       f1apMsg->present =  F1AP_PDU_PR_successfulOutcome;
11223
11224       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
11225       if(f1apMsg->choice.successfulOutcome == NULLP)
11226       {
11227          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
11228          break;
11229       }
11230       f1apMsg->choice.successfulOutcome->criticality   = Criticality_reject;
11231       f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
11232       f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
11233
11234       elementCnt = 1;
11235
11236       f1ResetAck->protocolIEs.list.count = elementCnt;
11237       f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
11238
11239       DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
11240       if(f1ResetAck->protocolIEs.list.array == NULLP)
11241       {
11242          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1ResetAckIEs failed");
11243          break;
11244       }
11245
11246       for(idx=0; idx<elementCnt; idx++)
11247       {
11248          DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
11249          if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
11250          {
11251             break;
11252          }
11253       }
11254       /*TransactionID*/
11255       idx = 0;
11256       f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
11257       f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
11258       f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
11259       f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
11260
11261       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11262
11263       /* Encode the F1SetupRequest type as UPER */
11264       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11265       encBufSize = 0;
11266       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11267
11268       /* Check encode results */
11269       if(encRetVal.encoded == ENCODE_FAIL)
11270       {
11271          DU_LOG("\nERROR  -->  F1AP : Could not encode F1ResetAck structure (at %s)\n",\
11272                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11273          break;
11274       }
11275       else
11276       {
11277          DU_LOG("\nDUBUG   -->  F1AP : Created APER encoded buffer for F1ResetAck\n");
11278          for(int i=0; i< encBufSize; i++)
11279          {
11280             printf("%x",encBuf[i]);
11281          }
11282       }
11283       /* Sending msg */
11284       if(sendF1APMsg() != ROK)
11285       {
11286          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset Acknowledgement failed");
11287          break;
11288       }
11289
11290       ret = ROK;
11291       break;
11292    }while(true);
11293
11294    FreeF1ResetAck(f1apMsg);
11295    return ret;
11296 }
11297 /******************************************************************
11298 *
11299 * @brief free F1 reset msg allocated by aper_decoder 
11300 *
11301 * @details
11302 *
11303 *    Function : freeAperDecodeF1ResetMsg 
11304 *
11305 *    Functionality: free F1 reset msg allocated by aper_decoder 
11306 *
11307 * @params[in] Reset_t *f1ResetMsg 
11308 * @return void 
11309 *
11310 * ****************************************************************/
11311
11312 void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
11313 {
11314    uint8_t ieIdx =0;
11315    if(f1ResetMsg->protocolIEs.list.array)
11316    {
11317       for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
11318       {
11319          if(f1ResetMsg->protocolIEs.list.array[ieIdx])
11320          {
11321             free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
11322          }
11323       }
11324       free(f1ResetMsg->protocolIEs.list.array);
11325    }
11326 }
11327
11328 /******************************************************************
11329  *
11330  * @brief Processes DL RRC Message Transfer  sent by CU
11331  *
11332  * @details
11333  *
11334  *    Function : procF1ResetReq
11335  *
11336  *    Functionality: Processes DL RRC Message Transfer sent by CU
11337  *
11338  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11339  * @return ROK     - success
11340  *         RFAILED - failure
11341  *
11342  * ****************************************************************/
11343 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
11344 {
11345    /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
11346    uint8_t       ieIdx = 0;
11347    uint8_t        ret = ROK;
11348    Reset_t       *f1ResetMsg = NULLP;
11349
11350    DU_LOG("\nINFO   -->  Processing F1 reset request");
11351    f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
11352
11353    for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
11354    {
11355       switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
11356       {
11357          case ProtocolIE_ID_id_TransactionID:
11358             break;
11359
11360          case ProtocolIE_ID_id_Cause:
11361             break;
11362
11363          case ProtocolIE_ID_id_ResetType:
11364             {
11365                break;
11366             }
11367
11368          default:
11369             break;
11370       }
11371    }
11372    ret = BuildAndSendF1ResetAck();
11373    DU_LOG("\nINFO   -->  UE release is not supported for now");
11374
11375    freeAperDecodeF1ResetMsg(f1ResetMsg);
11376
11377    return ret;
11378 }
11379
11380 /*******************************************************************
11381  *
11382  * @brief free the RRC delivery report
11383  *
11384  * @details
11385  *
11386  *    Function : freeRrcDeliveryReport
11387  *
11388  *    Functionality: free the RRC delivery report
11389  *
11390  * @params[in]
11391  * @return ROK     - success
11392  *         RFAILED - failure
11393  *
11394  * ****************************************************************/
11395 void freeRrcDeliveryReport(F1AP_PDU_t  *f1apMsg )
11396 {
11397    uint8_t idx=0;
11398    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
11399
11400    if(f1apMsg)
11401    {
11402       if(f1apMsg->choice.initiatingMessage)
11403       {
11404          rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
11405          if(rrcDeliveryReport->protocolIEs.list.array)
11406          {
11407             for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
11408                   idx++)
11409             {
11410                if(rrcDeliveryReport->protocolIEs.list.array[idx])
11411                {
11412                   DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
11413                         sizeof(RRCDeliveryReportIEs_t));
11414                }   
11415             }
11416             DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
11417                   rrcDeliveryReport->protocolIEs.list.size);
11418          }
11419          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
11420       }
11421       DU_FREE(f1apMsg,
11422             sizeof(F1AP_PDU_t));
11423    }
11424 }
11425
11426 /*******************************************************************
11427 *
11428 * @brief Builds and sends the RRC delivery report
11429 *
11430 * @details
11431 *
11432 *    Function : BuildAndSendRrcDeliveryReport
11433 *
11434 *    Functionality: Builds and sends the RRC delivery report
11435 *
11436 * @params[in]
11437 *
11438 * @return ROK     - success
11439 *         RFAILED - failure
11440 *
11441 * ****************************************************************/
11442 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
11443    uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
11444 {
11445    uint8_t             ret = RFAILED;
11446    uint8_t             idx    = 0;
11447    uint8_t             idx1   = 0;
11448    uint8_t             elementCnt = 0;
11449    F1AP_PDU_t          *f1apMsg = NULLP;
11450    asn_enc_rval_t      encRetVal;  
11451    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
11452
11453    do{
11454
11455       DU_LOG("\nINFO   -->  F1AP : Building RRC delivery Message Transfer Message\n");
11456       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11457       if(f1apMsg == NULLP)
11458       {
11459          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
11460          break;
11461       }
11462       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11463       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
11464       if(f1apMsg->choice.initiatingMessage == NULLP)
11465       {
11466          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU  failed");
11467          break;
11468       }
11469       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
11470       f1apMsg->choice.initiatingMessage->criticality   = Criticality_ignore;
11471       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
11472
11473       rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
11474       elementCnt = 4;
11475       rrcDeliveryReport->protocolIEs.list.count = elementCnt;
11476       rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
11477
11478       /* Initialize the F1Setup members */
11479       DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
11480       if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
11481       {
11482          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRC Delivery  failed");
11483          break;
11484       }
11485       for(idx =0 ;idx <elementCnt; idx++)
11486       {
11487          DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
11488          if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
11489          {
11490             break;
11491          }
11492       }
11493
11494       idx1 = 0;
11495
11496       /*GNB CU UE F1AP ID*/
11497       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11498       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11499       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
11500       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
11501
11502       /*GNB DU UE F1AP ID*/
11503       idx1++;
11504       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11505       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11506       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
11507       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
11508
11509       /*RRC delivery status*/
11510       idx1++;
11511       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
11512       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11513       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
11514       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
11515       rrcDelivery->rrcDeliveryStatus.deliveryStatus;
11516       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
11517       rrcDelivery->rrcDeliveryStatus.triggeringMessage;
11518
11519       /* SRB ID */ 
11520       idx1++;
11521       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
11522       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11523       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
11524       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID =  rrcDelivery->srbId;
11525
11526       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11527
11528       /* Encode the RRC DELIVERY REPORT type as APER */
11529       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11530       encBufSize = 0;
11531       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11532             encBuf);
11533
11534       /* Encode results */
11535       if(encRetVal.encoded == ENCODE_FAIL)
11536       {
11537          DU_LOG("\nERROR  -->  F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
11538                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11539          break;
11540       }
11541       else
11542       {
11543          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
11544          for(idx=0; idx< encBufSize; idx++)
11545          {
11546             printf("%x",encBuf[idx]);
11547          }
11548       }
11549
11550       /* Sending msg */
11551       if(sendF1APMsg() != ROK)
11552       {
11553          DU_LOG("\nERROR  -->  F1AP : Sending RRC delivery  msg request failed");
11554          break;
11555       }
11556       ret = ROK;
11557       break;
11558
11559    }while(true);
11560
11561    freeRrcDeliveryReport(f1apMsg);
11562    return ret;
11563 }
11564
11565 /*******************************************************************
11566  *
11567  * @brief Processes cells to be activated
11568  *
11569  * @details
11570  *
11571  *    Function : extractCellsToBeActivated
11572  *
11573  *    Functionality:
11574  *      - Processes cells to be activated list received in F1SetupRsp
11575  *
11576  * @params[in] void
11577  * @return ROK     - success
11578  *         RFAILED - failure
11579  *
11580  * ****************************************************************/
11581
11582 uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
11583 {
11584    uint8_t  ret = ROK;
11585    uint16_t idx, nci, pci = 0;
11586    Cells_to_be_Activated_List_Item_t cell;
11587
11588    for(idx=0; idx<cellsToActivate.list.count; idx++)
11589    {
11590       nci = 0;
11591       cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
11592       bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
11593
11594       if(cell.nRPCI)
11595       {
11596          pci = *cell.nRPCI;
11597       }
11598       ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
11599    }
11600    return ret;
11601 }
11602 /******************************************************************
11603 *
11604 * @brief Processes F1 Setup Response allocated by aper_decoder 
11605 *
11606 * @details
11607 *
11608 *    Function : freeF1SetupRsp 
11609 *
11610 *    Functionality: free F1 Setup Response allocated by aper_decoder 
11611 *
11612 * @params[in] F1SetupResponse_t *f1SetRspMsg 
11613 * @return void 
11614 *
11615 * ****************************************************************/
11616
11617 void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
11618 {
11619    uint8_t ieIdx =0;
11620    uint8_t arrIdx =0;
11621    Cells_to_be_Activated_List_t *cellToActivate =NULLP;
11622    RRC_Version_t      *rrcVer =NULLP;
11623
11624    if(f1SetRspMsg->protocolIEs.list.array)
11625    {
11626       for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
11627       {
11628          if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
11629          {
11630             switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
11631             {
11632                case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11633                   {
11634                      cellToActivate =
11635                         &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
11636                      if(cellToActivate->list.array)
11637                      {
11638                         for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
11639                         {
11640                            if(cellToActivate->list.array[arrIdx])
11641                            {
11642
11643                               if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
11644                               pLMN_Identity.buf)
11645                               {
11646                                  if(cellToActivate->list.array[0]->value.choice.\
11647                                        Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
11648                                  {
11649                                     free(cellToActivate->list.array[0]->value.choice.\
11650                                           Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
11651                                  }
11652
11653                                  free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
11654                                        nRCGI.pLMN_Identity.buf);
11655                               }
11656                               free(cellToActivate->list.array[arrIdx]);
11657                            }
11658                         }
11659                         free(cellToActivate->list.array);
11660                      }
11661                      break;
11662                   }
11663                case ProtocolIE_ID_id_TransactionID:
11664                   {
11665                      break;
11666                   }
11667                case ProtocolIE_ID_id_gNB_CU_Name:
11668                   {
11669                      free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
11670                      break;
11671                   }
11672                case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11673                   {
11674                      rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
11675                      if(rrcVer->latest_RRC_Version.buf)
11676                      {
11677                         if(rrcVer->iE_Extensions)
11678                         {
11679                            if(rrcVer->iE_Extensions->list.array)
11680                            {
11681                               if(rrcVer->iE_Extensions->list.array[0])
11682                               {
11683                                  if(rrcVer->iE_Extensions->list.\
11684                                        array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
11685                                  {
11686                                     free(rrcVer->iE_Extensions->list.\
11687                                           array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
11688                                  }
11689                                  free(rrcVer->iE_Extensions->list.array[0]);
11690                               }
11691                               free(rrcVer->iE_Extensions->list.array);
11692                            }
11693                            free(rrcVer->iE_Extensions);
11694                         }
11695                         free(rrcVer->latest_RRC_Version.buf);
11696                      }
11697                      break;
11698
11699                   }
11700                default:
11701                   {
11702                      DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11703                            f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
11704                   }
11705             }
11706             free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
11707          }
11708       }
11709       free(f1SetRspMsg->protocolIEs.list.array);
11710    }
11711 }
11712 /******************************************************************
11713  *
11714  * @brief Processes F1 Setup Response sent by CU
11715  *
11716  * @details
11717  *
11718  *    Function : procF1SetupRsp
11719  *
11720  *    Functionality: Processes F1 Setup Response sent by CU
11721  *
11722  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11723  * @return ROK     - success
11724  *         RFAILED - failure
11725  *
11726  * ****************************************************************/
11727 uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
11728 {
11729    uint8_t ret = ROK;
11730    uint16_t idx =0;
11731    F1SetupResponse_t *f1SetRspMsg = NULLP;
11732    GNB_CU_Name_t     *cuName = NULLP;
11733    F1SetupRsp  f1SetRspDb;
11734    RRC_Version_t      *rrcVer =NULLP;
11735    
11736    memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
11737
11738    DU_LOG("\nINFO   -->  F1AP : F1 Setup Response received");
11739    f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
11740
11741    for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
11742    {
11743       switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
11744       {
11745          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11746             {
11747                extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
11748                      value.choice.Cells_to_be_Activated_List);
11749                break;
11750             }
11751          case ProtocolIE_ID_id_TransactionID:
11752             {
11753                f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
11754                                     value.choice.TransactionID;
11755                break;
11756             }
11757          case ProtocolIE_ID_id_gNB_CU_Name:
11758             {
11759                cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
11760                         value.choice.GNB_CU_Name;
11761                strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
11762                break;
11763             }
11764          case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11765             {
11766                rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
11767                strcpy(f1SetRspDb.rrcVersion.rrcVer,
11768                      (const char*)rrcVer->latest_RRC_Version.buf);
11769                break;
11770             }
11771          default:
11772             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11773                   f1SetRspMsg->protocolIEs.list.array[idx]->id);
11774       }
11775       duProcF1SetupRsp();
11776    }
11777    
11778    freeAperDecodeF1SetupRsp(f1SetRspMsg);
11779    return ret;
11780 }
11781 /*******************************************************************
11782 *
11783 * @brief free GNB DU config update ack
11784 *
11785 * @details
11786 *
11787 *    Function : freeAperDecodeGnbDuAck 
11788 *
11789 *    Functionality: Processes GNB DU config update ack And
11790 *                     added free part for the memory allocated by aper_decoder
11791 *
11792 * @params[in] F1AP_PDU_t ASN decoded F1AP message
11793 * @return ROK     - success
11794 *         RFAILED - failure
11795 *
11796 * ****************************************************************/
11797
11798 void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
11799 {
11800    uint8_t ieIdx = 0;
11801
11802    if(gnbDuAck->protocolIEs.list.array)
11803    {
11804       for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
11805       {
11806          if(gnbDuAck->protocolIEs.list.array[ieIdx])
11807          {
11808             free(gnbDuAck->protocolIEs.list.array[ieIdx]);
11809          }
11810       }
11811       free(gnbDuAck->protocolIEs.list.array);
11812    }
11813 }
11814
11815 /*******************************************************************
11816 *
11817 * @brief Building  result of gnb-du config update ack output
11818 *
11819 * @details
11820 *
11821 *    Function : duProcGnbDuCfgUpdAckMsg 
11822 *
11823 *    Functionality: 
11824 *        Building output of gnb-du config update ack 
11825 *
11826 * @params[in] transId
11827 * @return void
11828 *
11829 * ****************************************************************/
11830
11831 uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId)
11832 {
11833    uint8_t  ieIdx=0, arrIdx=0,ret=ROK;
11834    uint8_t  ueId =0 , ueIdx =0;
11835    uint16_t cellId =0, cellIdx =0, crnti=0;
11836    CmLList *f1apPduNode = NULLP;
11837    ReservedF1apPduInfo *f1apPduInfo =NULLP;
11838    F1AP_PDU_t *f1apMsgPdu = NULLP;
11839    GNBDUConfigurationUpdate_t *gnbDuConfigUpdate = NULLP;
11840    BIT_STRING_t *cellIdentity=NULLP;
11841    struct Served_Cells_To_Delete_ItemIEs *deleteItemIe=NULLP;
11842    Served_Cells_To_Delete_List_t *cellsToDelete=NULLP;
11843    Served_Cells_To_Delete_Item_t *deleteItem=NULLP;
11844
11845    DU_LOG("\nINFO   -->  DU APP: GNB-DU config update Ack received ");
11846    f1apPduNode = searchFromReservedF1apPduList(transId);
11847    f1apPduInfo = (ReservedF1apPduInfo *)f1apPduNode->node;
11848    f1apMsgPdu = (F1AP_PDU_t *)f1apPduInfo->f1apMsg;
11849
11850    if(f1apMsgPdu)
11851    {
11852       if(f1apMsgPdu->choice.initiatingMessage)
11853       {
11854          gnbDuConfigUpdate = &f1apMsgPdu->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11855          for(ieIdx=0; ieIdx < gnbDuConfigUpdate->protocolIEs.list.count; ieIdx++)
11856          {
11857             switch(gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->id)
11858             {
11859                case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11860                   {
11861                      cellsToDelete = &gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11862                                      Served_Cells_To_Delete_List;
11863                      if(cellsToDelete->list.array)
11864                      {
11865                         if(cellsToDelete->list.array[arrIdx])
11866                         {
11867                            deleteItemIe = (Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx];
11868                            deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
11869                            if(deleteItem->oldNRCGI.nRCellIdentity.buf)
11870                            {
11871                               cellIdentity = &deleteItem->oldNRCGI.nRCellIdentity;
11872                               bitStringToInt(cellIdentity, &cellId);
11873                            }
11874                         }
11875                      }
11876
11877                      GET_CELL_IDX(cellId, cellIdx);
11878                      if(duCb.actvCellLst[cellIdx] != NULLP)
11879                      {
11880                         if(duCb.actvCellLst[cellIdx]->numActvUes == 0)
11881                         {
11882                            duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS;
11883                            ret = duSendCellDeletReq(cellId);
11884                            if(ret == RFAILED)
11885                            {
11886                               DU_LOG("ERROR  --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\
11887                               request for cellId[%d]", cellId);
11888                            }
11889                         }
11890                         else
11891                         {
11892                            for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++)
11893                            {
11894                               crnti = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti;
11895                               GET_UE_IDX(crnti,ueId);
11896                               ret = BuildAndSendUeContextReleaseReq(cellId, ueId);
11897                               if(ret == RFAILED)
11898                               {
11899                                  DU_LOG("ERROR  --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\
11900                                  request for cellId[%d]", cellId);
11901                               }
11902                            }
11903                         }
11904                      }
11905                      else
11906                      {
11907                         DU_LOG("ERROR  --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId);
11908                         ret = RFAILED;
11909                      }
11910                      break;
11911                   }
11912
11913                default:
11914                   break;
11915             }
11916          }
11917       }
11918    }
11919    
11920    FreeDUConfigUpdate(f1apMsgPdu);
11921    deleteFromReservedF1apPduList(f1apPduNode);
11922    return ret;
11923 }
11924
11925 /*******************************************************************
11926 *
11927 * @brief Processes GNB DU config update ack
11928 *
11929 * @details
11930 *
11931 *    Function : procF1GNBDUCfgUpdAck
11932 *
11933 *    Functionality: added free part for the memory allocated by aper_decoder
11934 *
11935 * @params[in] F1AP_PDU_t *f1apMsg 
11936 * @return void 
11937 *
11938 * ****************************************************************/
11939 uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
11940 {
11941    uint8_t ieIdx=0,transId=0;
11942    GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
11943
11944    DU_LOG("\nINFO   -->  F1AP : GNB-DU config update acknowledgment");
11945    gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
11946
11947    for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
11948    {
11949       switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
11950       {
11951          case ProtocolIE_ID_id_TransactionID:
11952             {
11953                transId = gnbDuAck->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
11954                break;
11955             }
11956          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11957             {
11958                break;
11959             }
11960          default :
11961             {
11962                DU_LOG("\nERROR  -->  F1AP: procF1GNBDUCfgUpdAck(): Invalid IE Received: %ld", \
11963                      gnbDuAck->protocolIEs.list.array[ieIdx]->id);
11964                break;
11965             }
11966       }
11967    }
11968    
11969    duProcGnbDuCfgUpdAckMsg(transId);
11970     
11971 #if 0
11972    /* presently we are not supporting F1 Reset from DU to CU , we are only
11973     * supporting F1 Reset from CU to DU */
11974
11975    if(BuildAndSendF1ResetReq() != ROK)
11976    {
11977       return RFAILED;
11978    }
11979 #endif
11980
11981    freeAperDecodeGnbDuAck(gnbDuAck);
11982    return ROK;
11983 }
11984 /******************************************************************
11985 *
11986 * @brief free DL RRC Message Transfer allocated by aper_decoder 
11987 *
11988 * @details
11989 *
11990 *    Function : freeAperDecodef1DlRrcMsg 
11991 *
11992 *    Functionality: free DL RRC Message Transfer allocated by aper_decoder 
11993 *
11994 * @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg 
11995 * @return ROK     - success
11996 *         RFAILED - failure
11997 *
11998 * ****************************************************************/
11999
12000 void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
12001 {
12002    uint8_t ieIdx =0;
12003    RRCContainer_t *rrcContainer = NULLP;
12004
12005    if(f1DlRrcMsg->protocolIEs.list.array)
12006    {
12007       for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
12008       {
12009          if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
12010          {
12011             switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
12012             {
12013                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12014                   break;
12015                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12016                   break;
12017                case ProtocolIE_ID_id_SRBID:
12018                   break;
12019                case ProtocolIE_ID_id_RRCContainer:
12020                   {
12021                      rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
12022                      free(rrcContainer->buf);
12023                   }
12024                case ProtocolIE_ID_id_ExecuteDuplication:
12025                   break;
12026                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
12027                   break;
12028                   break;
12029             }
12030             free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
12031          }
12032       }
12033       free(f1DlRrcMsg->protocolIEs.list.array);
12034    }
12035 }
12036 /******************************************************************
12037  *
12038  * @brief Processes DL RRC Message Transfer  sent by CU
12039  *
12040  * @details
12041  *
12042  *    Function : procF1DlRrcMsgTrans
12043  *
12044  *    Functionality: Processes DL RRC Message Transfer sent by CU
12045  *
12046  * @params[in] F1AP_PDU_t ASN decoded F1AP message
12047  * @return ROK     - success
12048  *         RFAILED - failure
12049  *
12050  * ****************************************************************/
12051 uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
12052 {
12053    uint8_t  idx, ret;
12054    DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
12055    F1DlRrcMsg dlMsg;
12056    memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
12057
12058    DU_LOG("\nINFO   -->  DU_APP : DL RRC message transfer Recevied");
12059    f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
12060
12061    ret = ROK;
12062
12063    for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
12064    {
12065       switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
12066       {
12067          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12068             {
12069                dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
12070                break;
12071             }
12072          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12073             {
12074                dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
12075                break;
12076             }
12077          case ProtocolIE_ID_id_SRBID:
12078             {
12079                dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
12080                break;
12081             }
12082          case ProtocolIE_ID_id_ExecuteDuplication:
12083             dlMsg.execDup = true;
12084             break;
12085
12086          case ProtocolIE_ID_id_RRCContainer:
12087             {
12088                if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
12089                {
12090                   dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
12091                   DU_ALLOC_SHRABL_BUF(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
12092                   if(dlMsg.rrcMsgPdu)
12093                   {
12094                      memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
12095                         dlMsg.rrcMsgSize);
12096                   }
12097                   else
12098                   {
12099                      DU_LOG("\nERROR  -->  DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
12100                      return RFAILED;
12101                   }
12102                }
12103                else
12104                {
12105                   DU_LOG("\nERROR  -->  DU_APP : RRC Container Size is invalid:%ld",\
12106                   f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
12107                   return RFAILED;
12108                }
12109                break;
12110             }
12111          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
12112             {
12113                dlMsg.deliveryStatRpt = true;
12114                break;
12115             }
12116          default:
12117             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
12118                   f1DlRrcMsg->protocolIEs.list.array[idx]->id);
12119       }
12120    }
12121
12122    ret = duProcDlRrcMsg(&dlMsg);
12123
12124    freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
12125    return ret;
12126 }
12127 /*******************************************************************
12128  *
12129 * @brief Builds the DRB to be Setup Mod list
12130 *
12131 * @details
12132 *
12133 *    Function : 
12134 *
12135 *    Functionality: Constructs the DRB to be Setup Mod list
12136 *
12137 * @params[in] DRBs_SetupMod_List_t *drbSet
12138 *
12139 * @return ROK     - success
12140 *         RFAILED - failure
12141 *
12142 * ****************************************************************/
12143
12144 uint8_t BuildDrbSetupModList(DRBs_SetupMod_List_t *drbSet , DuUeCfg *ueCfg)
12145 {
12146    uint8_t arrIdx =0;
12147    uint8_t drbCnt =0;
12148    struct DRBs_SetupMod_ItemIEs *drbItemIe;
12149
12150    drbCnt = 1;
12151    drbSet->list.count = drbCnt;
12152    drbSet->list.size = drbCnt * sizeof(DRBs_SetupMod_ItemIEs_t *);
12153    DU_ALLOC(drbSet->list.array, drbSet->list.size);
12154    if(drbSet->list.array == NULLP)
12155    {
12156       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
12157       return  RFAILED;
12158    }
12159    for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
12160    {
12161       DU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_SetupMod_ItemIEs_t));
12162       if(drbSet->list.array[arrIdx] == NULLP)
12163       {
12164               DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
12165               return  RFAILED;
12166       }
12167
12168       drbItemIe = (struct DRBs_SetupMod_ItemIEs *)drbSet->list.array[arrIdx];
12169       drbItemIe->id = ProtocolIE_ID_id_DRBs_SetupMod_Item;
12170       drbItemIe->criticality = Criticality_reject;
12171       drbItemIe->value.present = DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
12172       drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
12173       if(fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List,\
12174       &ueCfg->upTnlInfo[arrIdx])!= ROK)
12175       {
12176          DU_LOG("\nERROR  -->  F1AP : Failed to fill DlTnl SetupList in BuildDrbToBeSetupModList");
12177          return RFAILED;
12178       }
12179       
12180    }
12181
12182    return ROK;
12183 }
12184 /*******************************************************************
12185 * @brief Free the memory allocated for DRB setup List
12186 *
12187 * @details
12188 *
12189 *    Function : FreeDrbSetupModList 
12190 *
12191 *    Functionality:
12192 *       Free the memory allocated for DRB setup list
12193 *
12194 * @params[in] DRBs_Setup_List_t *
12195 * @return void
12196 *
12197 * ****************************************************************/
12198 void FreeDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
12199 {
12200    uint8_t arrIdx = 0;
12201    DRBs_SetupMod_ItemIEs_t *drbItemIe = NULLP;
12202
12203    for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
12204    {
12205       drbItemIe = ((DRBs_SetupMod_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
12206       freeDlTnlInfo(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
12207       DU_FREE(drbSetupList->list.array[arrIdx], sizeof(DRBs_SetupMod_ItemIEs_t));
12208    }
12209    DU_FREE(drbSetupList->list.array, drbSetupList->list.size);
12210 }
12211 /*******************************************************************
12212 * @brief Free the memory allocated for UE Context Mod Response
12213 *
12214 * @details
12215 *
12216 *    Function : FreeUeContextModResp 
12217 *
12218 *    Functionality:
12219 *       Free the memory allocated for UE Context Mod Response
12220 *
12221 * @params[in] F1AP_PDU_t *f1apMsg
12222 * @return void
12223 *
12224 * ****************************************************************/
12225
12226 void FreeUeContextModResp(F1AP_PDU_t *f1apMsg)
12227 {
12228    uint8_t ieIdx;
12229    UEContextModificationResponse_t *ueContextModifyRes = NULLP;
12230    if(f1apMsg)
12231    {
12232       if(f1apMsg->choice.successfulOutcome)
12233       {
12234          ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
12235          if(ueContextModifyRes->protocolIEs.list.array)
12236          {
12237             for(ieIdx=0 ; ieIdx<ueContextModifyRes->protocolIEs.list.count; ieIdx++)
12238             {
12239                if(ueContextModifyRes->protocolIEs.list.array[ieIdx])
12240                {
12241                   switch(ueContextModifyRes->protocolIEs.list.array[ieIdx]->id)
12242                   {
12243                      case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12244                         break;
12245                      case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12246                         break;
12247                      case ProtocolIE_ID_id_DRBs_SetupMod_List:
12248                         {
12249                             FreeDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
12250                             value.choice.DRBs_SetupMod_List));
12251                             break; 
12252                         }
12253                   }
12254                   DU_FREE(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
12255                }
12256
12257             }
12258             DU_FREE(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
12259          }
12260          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12261       }
12262       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12263    }
12264 }
12265
12266 /*****************************************************************i
12267 *
12268 * @brief Creating the ue context modifcation response and sending
12269 *
12270 * @details
12271 *
12272 *    Function : BuildAndSendUeContextModRsp 
12273 *
12274 *    Functionality:
12275 *         - Creating the ue context modifcation response 
12276 *
12277 * @params[in] uint8_t cellId,uint8_t ueIdx
12278 * @return ROK     - success
12279 *         RFAILED - failure
12280 *
12281 * ****************************************************************/
12282 uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx)
12283 {
12284    uint8_t   ieIdx = 0;
12285    uint8_t   cellIdx =0;
12286    uint8_t   elementCnt = 0;
12287    uint8_t   ret = RFAILED;
12288    uint32_t  gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
12289    uint32_t  gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
12290    F1AP_PDU_t *f1apMsg = NULLP;
12291    asn_enc_rval_t         encRetVal;
12292    UEContextModificationResponse_t *ueContextModifyRes = NULLP;
12293    DuUeCb                   *ueCb = NULLP;
12294
12295    DU_LOG("\nINFO  -->  F1AP : Building Ue context modification response\n");
12296
12297    while(1)
12298    {
12299       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12300       if(f1apMsg == NULLP)
12301       {
12302          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
12303          break;
12304       }
12305
12306       f1apMsg->present =  F1AP_PDU_PR_successfulOutcome;
12307
12308       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12309       if(f1apMsg->choice.successfulOutcome == NULLP)
12310       {
12311          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
12312          break;
12313       }
12314       f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextModification;
12315       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
12316       f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_UEContextModificationResponse;
12317
12318       ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
12319
12320       elementCnt = 3;
12321       ueContextModifyRes->protocolIEs.list.count = elementCnt;
12322       ueContextModifyRes->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationResponse_t*);
12323
12324       /* Initialize the UE context modification members */
12325       DU_ALLOC(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
12326       if(ueContextModifyRes->protocolIEs.list.array == NULLP)
12327       {
12328          DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE context modifcation Request failed");
12329          break;
12330       }
12331
12332       for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12333       {
12334          DU_ALLOC(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
12335          if(ueContextModifyRes->protocolIEs.list.array[ieIdx] == NULLP)
12336          {
12337             DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE context modifcation Request failed");
12338             break;
12339          }
12340       }
12341
12342       /* Fetching Ue Cb Info*/
12343       GET_CELL_IDX(cellId, cellIdx);
12344       gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
12345       gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
12346       ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
12347
12348       ieIdx=0;
12349       ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
12350       ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12351       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
12352       UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
12353       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
12354
12355       ieIdx++;
12356       ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
12357       ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12358       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present=\
12359       UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
12360       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
12361
12362       ieIdx++;
12363       ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List;
12364       ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12365       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
12366       UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
12367       if(ueCb->f1UeDb)
12368       {
12369          ret = BuildDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
12370                   value.choice.DRBs_SetupMod_List) , &ueCb->f1UeDb->duUeCfg);
12371          if(ret != ROK)
12372          {
12373             DU_LOG( "\nERROR  -->  F1AP : Failed to build drb setupmod List ");
12374             break;
12375          }
12376          freeF1UeDb(ueCb->f1UeDb);
12377          ueCb->f1UeDb = NULLP;
12378       }
12379       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12380
12381       /* Encode the F1SetupRequest type as APER */
12382       memset(encBuf, 0, ENC_BUF_MAX_LEN);
12383       encBufSize = 0;
12384       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,encBuf);
12385
12386       /* Encode results */
12387       if(encRetVal.encoded == ENCODE_FAIL)
12388       {
12389          DU_LOG( "\nERROR  -->  F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
12390                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12391          ret = RFAILED;
12392          break;
12393       }
12394       else
12395       {
12396          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UE Context Modification Response\n");
12397          for(int i=0; i< encBufSize; i++)
12398          {
12399             printf("%x",encBuf[i]);
12400          }
12401       }
12402
12403       /* Sending  msg  */
12404       if(sendF1APMsg() != ROK)
12405       {
12406          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Setup Res Failed");
12407          ret = RFAILED;
12408          break;
12409       }
12410       break;
12411    }
12412    FreeUeContextModResp(f1apMsg);
12413    return ret;
12414 }
12415 /*******************************************************************
12416  *
12417  * @brief Deallocating the memory allocated by the aper decoder
12418  *          for QOSInfo
12419  *
12420  * @details
12421  *
12422  *    Function : freeAperDecodeQosInfo
12423  *
12424  *    Functionality:  Deallocating the memory allocated for QOSInfo
12425  *
12426  * @params[in] QoSFlowLevelQoSParameters_t *drbQos
12427  *
12428  * @return void
12429  *
12430  * ****************************************************************/
12431
12432 void freeAperDecodeQosInfo(QoSFlowLevelQoSParameters_t *drbQos)
12433 {
12434    if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
12435    {
12436       if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
12437       {
12438          if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
12439          {
12440             free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
12441          }
12442          free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
12443       }
12444       free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI);
12445    }
12446 }
12447 /*******************************************************************
12448  *
12449  * @brief Deallocating the memory allocated by the aper decoder
12450  *          for UlTnlInfoforDrb
12451  *
12452  * @details
12453  *
12454  *    Function : freeAperDecodeUlTnlInfoforDrbSetupMod 
12455  *
12456  *    Functionality:  Deallocating memory allocated for UlTnlInfoforDrb
12457  *
12458  * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
12459  *
12460  * @return void
12461  *
12462  * ****************************************************************/
12463 void freeAperDecodeUlTnlInfoforDrbSetupMod(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
12464 {
12465    uint8_t arrIdx =0;
12466
12467    if(ulInfo->list.array)
12468    {
12469       for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
12470       {
12471          if(ulInfo->list.array[arrIdx])
12472          {
12473             if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
12474             {
12475                if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
12476                {
12477                   if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
12478                   {
12479                      free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
12480                            gTP_TEID.buf);
12481                   }
12482                   free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
12483                         transportLayerAddress.buf);
12484                }
12485                free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel);
12486             }
12487             free(ulInfo->list.array[arrIdx]);
12488          }
12489       }
12490       free(ulInfo->list.array);
12491    }
12492 }
12493 /*******************************************************************
12494  *
12495  * @brief Deallocating the memory allocated by the aper decoder
12496  *          for DrbSetupModItem  
12497  *
12498  * @details
12499  *
12500  *    Function : freeAperDecodeDrbSetupModItem 
12501  *
12502  *    Functionality:  Deallocating memory allocated for DrbSetupModItem
12503  *
12504  * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
12505  *
12506  * @return void
12507  *
12508  * ****************************************************************/
12509
12510 void freeAperDecodeDrbSetupModItem(DRBs_ToBeSetupMod_Item_t *drbItem)
12511 {
12512    uint8_t arrIdx =0;
12513    SNSSAI_t *snssai =NULLP;
12514    Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
12515
12516    drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
12517    switch(drbItem->qoSInformation.present)
12518    {
12519       case QoSInformation_PR_NOTHING:
12520          break;
12521       case QoSInformation_PR_eUTRANQoS:
12522          {
12523             if(drbItem->qoSInformation.choice.eUTRANQoS)
12524             {
12525                free(drbItem->qoSInformation.choice.eUTRANQoS);
12526             }
12527             break;
12528          }
12529       case QoSInformation_PR_choice_extension:
12530          {
12531             if(drbItem->qoSInformation.choice.choice_extension)
12532             {
12533                freeAperDecodeQosInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.\
12534                      DRB_Information.dRB_QoS);
12535                snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
12536                if(snssai->sST.buf)
12537                {
12538                   free(snssai->sST.buf);
12539                }
12540                if(snssai->sD)
12541                {
12542                   if(snssai->sD->buf)
12543                   {
12544                      free(snssai->sD->buf);
12545                   }
12546                   free(snssai->sD);
12547                }
12548
12549                flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.\
12550                          DRB_Information.flows_Mapped_To_DRB_List;
12551                if(flowMap->list.array)
12552                {
12553                   for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
12554                   {
12555                      if(flowMap->list.array[arrIdx] )
12556                      {
12557                         freeAperDecodeQosInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
12558                         free(flowMap->list.array[arrIdx]);
12559                      }
12560                   }
12561                   free(flowMap->list.array);
12562                }
12563
12564                free(drbItem->qoSInformation.choice.choice_extension);
12565             }
12566             break;
12567          }
12568
12569    }
12570    freeAperDecodeUlTnlInfoforDrbSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List);
12571    if(drbItem->uLConfiguration)
12572    {
12573       free(drbItem->uLConfiguration);
12574    }
12575 }
12576
12577 /*******************************************************************
12578  *
12579  * @brief Deallocating the memory allocated by the aper decoder
12580  *          for DrbToBeSetupModList
12581  *
12582  * @details
12583  *
12584  *    Function : freeAperDecodeDrbToBeSetupModList
12585  *
12586  *    Functionality:  Deallocating memory allocated for DrbToBeSetupModList
12587  *
12588  * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
12589  *
12590  * @return void
12591  *
12592  * ****************************************************************/
12593
12594 void freeAperDecodeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
12595 {
12596    uint8_t arrIdx =0;
12597    struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
12598
12599    if(drbSet->list.array)
12600    {
12601       for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
12602       {
12603          if(drbSet->list.array[arrIdx] != NULLP)
12604          {
12605             if(arrIdx == 0)
12606             {
12607                drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
12608                freeAperDecodeDrbSetupModItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
12609             }
12610             free(drbSet->list.array[arrIdx]);
12611          }
12612       }
12613       free(drbSet->list.array);
12614    }
12615
12616 }
12617 /*******************************************************************
12618  *
12619  * @brief Deallocating the memory allocated by the aper decoder
12620  *          for UeContextModificationReqMsg
12621  *
12622  * @details
12623  *
12624  *    Function : freeAperDecodeUeContextModificationReqMsg
12625  *
12626  *    Functionality:  Deallocating memory allocated for
12627  *                  UeContextModificationReqMsg
12628  *
12629  * @params[in] UEContextModificationRequest_t *UeContextModifyReq
12630  *
12631  * @return void
12632  *
12633  * ****************************************************************/
12634 void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *UeContextModifyReq )
12635 {
12636    uint8_t arrIdx, ieId;
12637
12638    if(UeContextModifyReq->protocolIEs.list.array)
12639    {
12640       for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
12641       {
12642          if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
12643          {
12644             ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
12645             switch(ieId)
12646             {
12647                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12648                   break;
12649                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12650                   break;
12651                case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
12652                   {
12653                      freeAperDecodeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->\
12654                            value.choice.DRBs_ToBeSetupMod_List);
12655                      break;
12656                   }
12657             }
12658             free(UeContextModifyReq->protocolIEs.list.array[arrIdx]);
12659          }
12660       }
12661       free(UeContextModifyReq->protocolIEs.list.array);
12662    }
12663 }
12664 /*******************************************************************
12665  *
12666  * @brief processing the F1 UeContextModificationReq
12667  *
12668  * @details
12669  *
12670  *    Function : procF1UeContextModificationReq
12671  *
12672  *    Functionality:  processing the F1 UeContextModificationReq
12673  *
12674  * @params[in] F1AP_PDU_t *f1apMsg
12675  *
12676  * @return
12677  * ****************************************************************/
12678 uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg)
12679 {
12680    UEContextModificationRequest_t *ueContextModifyReq = NULLP;
12681    uint8_t  ret = ROK, ieIdx = 0, lcId =0,cellIdx=0, ueIdx=0;
12682    DuUeCb   *duUeCb = NULLP;
12683    DRBs_ToBeSetupMod_List_t *drbSetupModCfg;
12684    uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
12685
12686    ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
12687    for(ieIdx=0; (ieIdx < ueContextModifyReq->protocolIEs.list.count && ret == ROK); ieIdx++)
12688    {
12689       switch(ueContextModifyReq->protocolIEs.list.array[ieIdx]->id)
12690       {
12691          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12692             {
12693                gnbCuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
12694                break;
12695             }
12696          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12697             {
12698                gnbDuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
12699                break;
12700             }
12701          case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
12702             {
12703                for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++)
12704                {
12705                   for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++)
12706                   {
12707                      if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
12708                            (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
12709                      {
12710
12711                         duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
12712                         lcId = getDrbLcId(&duUeCb->drbBitMap);
12713                         if(lcId != RFAILED)
12714                         {
12715                            DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
12716                            if(duUeCb->f1UeDb)
12717                            {
12718                               duUeCb->f1UeDb->actionType = UE_CTXT_MOD;
12719                               drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\
12720                               choice.DRBs_ToBeSetupMod_List;
12721                               if(extractDrbListToSetup(lcId, NULL, drbSetupModCfg ,drbSetupModCfg->list.count, \
12722                               &duUeCb->f1UeDb->duUeCfg))
12723                               {
12724                                  DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
12725                                  ret = RFAILED;
12726                               }
12727                            }
12728                         }
12729                      }
12730                      else
12731                      {
12732                         DU_LOG("\nERROR  -->  DU APP : wrong values of gnbCuUeF1apId and gnbDuUeF1apId ");
12733                         ret = RFAILED;
12734                      }
12735                   }
12736                }
12737                break;
12738             }
12739       }
12740    }
12741    if(ret != RFAILED)
12742    {
12743       ret = duProcUeContextModReq(duUeCb);
12744    }
12745    freeAperDecodeUeContextModificationReqMsg(ueContextModifyReq);
12746    return ret; 
12747 }
12748 /*****************************************************************i
12749 *
12750 * @brief Free memory allocated for UE Context Release Request
12751 *
12752 * @details
12753 *
12754 *    Function : FreeUeContextReleaseReq
12755 *
12756 *    Functionality:
12757 *         - Free memory allocated for UE Context Release Request
12758 *
12759 * @params[in] F1AP_PDU_t *f1apMsg
12760 * @return void 
12761 *
12762 * *************************************************************/
12763 void FreeUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
12764 {
12765    uint8_t ieIdx;
12766    UEContextReleaseRequest_t *ueReleaseReq = NULLP;
12767    
12768    if(f1apMsg)
12769    {
12770       if(f1apMsg->choice.initiatingMessage)
12771       {
12772          ueReleaseReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
12773          if(ueReleaseReq->protocolIEs.list.array)
12774          {
12775             for(ieIdx=0 ; ieIdx<ueReleaseReq->protocolIEs.list.count; ieIdx++)
12776             {
12777                DU_FREE(ueReleaseReq->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseRequest_t));
12778             }
12779             DU_FREE(ueReleaseReq->protocolIEs.list.array, ueReleaseReq->protocolIEs.list.size);
12780          }
12781          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12782       }
12783       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12784    }
12785
12786 }
12787 /*****************************************************************i
12788 *
12789 * @brief Build and Send UE Context Release Request  
12790 *
12791 * @details
12792 *
12793 *    Function : BuildAndSendUeContextReleaseReq
12794 *
12795 *    Functionality:
12796 *         - Build and Send UE Context Release Request 
12797 *
12798 * @params[in]
12799 * @return ROK     - success
12800 *         RFAILED - failure
12801 *
12802 * *************************************************************/
12803 uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueIdx)
12804 {
12805    bool memAllocFail = false;
12806    uint8_t ieIdx =0;
12807    uint8_t ret = RFAILED;
12808    uint16_t cellIdx =0;
12809    uint16_t crnti = 0;
12810    uint8_t  elementCnt = 0;
12811    uint32_t  gnbCuUeF1apId =0;   /* gNB-CU UE F1AP Id */
12812    uint32_t  gnbDuUeF1apId =0;   /* gNB-DU UE F1AP Id */
12813    asn_enc_rval_t encRetVal; 
12814    F1AP_PDU_t *f1apMsg = NULLP;
12815    UEContextReleaseRequest_t *ueReleaseReq = NULLP;
12816
12817    DU_LOG("\nINFO  --> Building the UE Context Release Request");
12818    do
12819    {
12820       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12821       if(f1apMsg == NULLP)
12822       {
12823          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for f1apMsg");
12824          break;
12825       }
12826
12827       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12828       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12829       if(f1apMsg->choice.initiatingMessage == NULLP)
12830       {
12831          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for\
12832          initiatingMessage");   
12833          break;
12834       }
12835       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextReleaseRequest;
12836       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12837       f1apMsg->choice.initiatingMessage->value.present = \
12838       InitiatingMessage__value_PR_UEContextReleaseRequest;
12839
12840       ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
12841
12842       elementCnt = 2;
12843
12844       ueReleaseReq->protocolIEs.list.count = elementCnt;
12845       ueReleaseReq->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseRequest_t *);
12846
12847       /* Initialize the F1Setup members */
12848       DU_ALLOC(ueReleaseReq->protocolIEs.list.array,ueReleaseReq->protocolIEs.list.size);
12849       if(ueReleaseReq->protocolIEs.list.array == NULLP)
12850       {
12851          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE array");
12852          break;
12853       }
12854       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
12855       {
12856          DU_ALLOC(ueReleaseReq->protocolIEs.list.array[ieIdx],\
12857                sizeof(UEContextReleaseRequest_t));
12858          if(ueReleaseReq->protocolIEs.list.array[ieIdx] == NULLP)
12859          {
12860             DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE elements");
12861             memAllocFail = true;  
12862             break;
12863          }
12864       }
12865       if(memAllocFail == true)
12866          break;
12867
12868       /* Fetching Ue Cb Info*/
12869       GET_CELL_IDX(cellId, cellIdx);
12870       if(duCb.actvCellLst[cellIdx] == NULLP)
12871       {
12872          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): CellId[%d] does not exist", cellId);
12873          break;
12874       }
12875       else
12876       {
12877          GET_CRNTI(crnti, ueIdx);
12878          if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti != crnti)
12879          {
12880             DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): crnti[%d] does not exist", crnti);
12881             break;
12882          }
12883          gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
12884          gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
12885       }
12886
12887       ieIdx=0; 
12888       ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; 
12889       ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
12890       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present = \
12891       UEContextReleaseRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
12892       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
12893       
12894       ieIdx++;
12895       ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
12896       ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
12897       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present =\
12898       UEContextReleaseRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
12899       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
12900       
12901       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12902
12903       /* Encode the F1SetupRequest type as APER */
12904       memset(encBuf, 0, ENC_BUF_MAX_LEN);
12905       encBufSize = 0;
12906       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
12907       /* Encode results */
12908       if(encRetVal.encoded == ENCODE_FAIL)
12909       {
12910          DU_LOG("\nERROR  -->  F1AP : Could not encode UEContextReleaseRequest structure (at %s)\n",\
12911                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12912          break;
12913       }
12914       else
12915       {
12916          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UEContextReleaseRequest\n");
12917          for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
12918          {
12919             printf("%x",encBuf[ieIdx]);
12920          }
12921       }
12922
12923       /* Sending msg */
12924       if(sendF1APMsg() != ROK)
12925       {
12926          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Release Request failed");
12927          break;
12928       }
12929       ret = ROK;
12930       break;
12931    }while(true);
12932
12933    FreeUeContextReleaseReq(f1apMsg);
12934    return ret;
12935 }
12936 /*****************************************************************i
12937  *
12938  * @brief Free memory allocated for UE Context Release Complete
12939  *
12940  * @details
12941  *
12942  *    Function : FreeUeContextReleaseComplete
12943  *
12944  *    Functionality:
12945  *         - Free memory allocated for UE Context Release Complete
12946  *
12947  * @params[in] F1AP_PDU_t *f1apMsg
12948  * @return void
12949  *
12950  * *************************************************************/
12951 void FreeUeContextReleaseComplete(F1AP_PDU_t *f1apMsg)
12952 {
12953    uint8_t ieIdx;
12954    UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
12955
12956    if(f1apMsg)
12957    {
12958       if(f1apMsg->choice.successfulOutcome)
12959       {
12960          ueReleaseComplete =&f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
12961          if(ueReleaseComplete->protocolIEs.list.array)
12962          {
12963             for(ieIdx=0 ; ieIdx<ueReleaseComplete->protocolIEs.list.count; ieIdx++)
12964             {
12965                DU_FREE(ueReleaseComplete->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseComplete_t));
12966             }
12967             DU_FREE(ueReleaseComplete->protocolIEs.list.array, ueReleaseComplete->protocolIEs.list.size);
12968          }
12969          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12970       }
12971       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12972    }
12973
12974 }
12975 /*****************************************************************i
12976  *
12977  * @brief Build and Send UE Context Release Complete
12978  *
12979  * @details
12980  *
12981  *    Function : BuildAndSendUeContextReleaseComplete
12982  *
12983  *    Functionality:
12984  *         - Build and Send UE Context Release Complete
12985  *
12986  * @params[in]  cellId,  gnbCuUeF1apId, gnbDuUeF1apId
12987  * @return ROK     - success
12988  *         RFAILED - failure
12989  *
12990  * *************************************************************/
12991 uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1apId, uint32_t gnbDuUeF1apId)
12992 {
12993    bool memAllocFail = false;
12994    uint8_t ieIdx =0, ret = RFAILED, elementCnt = 0;
12995    asn_enc_rval_t encRetVal;
12996    F1AP_PDU_t *f1apMsg = NULLP;
12997    UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
12998
12999    DU_LOG("\nINFO  --> Building the UE Context Release Complete");
13000    do
13001    {
13002       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
13003       if(f1apMsg == NULLP)
13004       {
13005          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for f1apMsg");
13006          break;
13007       }
13008
13009       f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
13010       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
13011       if(f1apMsg->choice.successfulOutcome == NULLP)
13012       {
13013          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for\
13014                successfulOutcome");
13015          break;
13016       }
13017       f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextRelease;
13018       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
13019       f1apMsg->choice.successfulOutcome->value.present = \
13020       SuccessfulOutcome__value_PR_UEContextReleaseComplete;
13021
13022       ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
13023
13024       elementCnt = 2;
13025       ueReleaseComplete->protocolIEs.list.count = elementCnt;
13026       ueReleaseComplete->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseComplete_t *);
13027
13028       /* Initialize the UE Release Complete members */
13029       DU_ALLOC(ueReleaseComplete->protocolIEs.list.array,ueReleaseComplete->protocolIEs.list.size);
13030       if(ueReleaseComplete->protocolIEs.list.array == NULLP)
13031       {
13032          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE array");
13033          break;
13034       }
13035       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
13036       {
13037          DU_ALLOC(ueReleaseComplete->protocolIEs.list.array[ieIdx],\
13038                sizeof(UEContextReleaseComplete_t));
13039          if(ueReleaseComplete->protocolIEs.list.array[ieIdx] == NULLP)
13040          {
13041             DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE\
13042             elements");
13043             memAllocFail = true;
13044             break;
13045          }
13046       }
13047       if(memAllocFail == true)
13048          break;
13049
13050
13051       ieIdx=0;
13052       ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
13053       ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
13054       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present = \
13055       UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID;
13056       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
13057
13058       ieIdx++;
13059       ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
13060       ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
13061       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present =\
13062       UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID;
13063       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
13064
13065       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
13066
13067       /* Encode the F1SetupComplete type as APER */
13068       memset(encBuf, 0, ENC_BUF_MAX_LEN);
13069       encBufSize = 0;
13070       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
13071       /* Encode results */
13072       if(encRetVal.encoded == ENCODE_FAIL)
13073       {
13074          DU_LOG("\nERROR  -->  F1AP : Could not encode UEContextReleaseComplete structure (at %s)\n",\
13075                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
13076          break;
13077       }
13078       else
13079       {
13080          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UEContextReleaseComplete\n");
13081          for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
13082          {
13083             printf("%x",encBuf[ieIdx]);
13084          }
13085       }
13086
13087       /* Sending msg */
13088       if(sendF1APMsg() != ROK)
13089       {
13090          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Release Complete failed");
13091          break;
13092       }
13093       ret = ROK;
13094       break;
13095    }while(true);
13096    
13097    if(ret == ROK)
13098    {
13099       duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS;
13100       ret = duSendCellDeletReq(cellId);
13101       if(ret != ROK)
13102       {
13103          DU_LOG("\nERROR  -->  F1AP: BuildAndSendUeContextReleaseComplete(): Failed to process cell\
13104                Delete req for CellId");
13105       }
13106    }
13107    FreeUeContextReleaseComplete(f1apMsg);
13108    return ret;
13109
13110 }
13111
13112 /*******************************************************************
13113 *
13114 * @brief added free part for the memory allocated by aper_decoder 
13115 *
13116 * @details
13117 *
13118 *    Function : freeAperDecodeUeContextReleaseCommand 
13119 *
13120 *    Functionality: added free part for the memory allocated by aper_decoder
13121 *
13122 * @params[in] F1AP_PDU_t *f1apMsg
13123 * @return void
13124 *
13125 * ****************************************************************/
13126 void freeAperDecodeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
13127 {
13128    uint8_t ieIdx=0;
13129    UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
13130
13131    ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
13132    
13133    if(ueContextReleaseCommand->protocolIEs.list.array)
13134    {
13135       for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
13136       {
13137          if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
13138          {
13139             switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
13140             {
13141                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
13142                   break;
13143                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
13144                   break;
13145                case ProtocolIE_ID_id_Cause:
13146                   break;
13147                case ProtocolIE_ID_id_RRCContainer:
13148                {
13149                   if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
13150                   {
13151                      free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
13152                   }
13153                   break;
13154                }
13155                default :
13156                   DU_LOG("\nERROR  -->  F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
13157                        ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
13158                   break;
13159             }
13160          }
13161          free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]);
13162       }
13163       free(ueContextReleaseCommand->protocolIEs.list.array);
13164    }
13165 }
13166 /*******************************************************************
13167 *
13168 * @brief processing of UE Context Release Command
13169 *
13170 * @details
13171 *
13172 *    Function : procF1UeContextReleaseCommand 
13173 *
13174 *    Functionality: processing of UE Context Release Command
13175 *
13176 * @params[in] F1AP_PDU_t *f1apMsg
13177 * @return void
13178 *
13179 * ****************************************************************/
13180 uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
13181 {
13182    uint8_t  ieIdx=0, ret=ROK, ueIdx=0;
13183    uint16_t cellIdx =0;
13184    bool ueIdxFound;
13185    uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0;
13186    DuUeCb   *duUeCb = NULLP;
13187    UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
13188
13189    ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
13190
13191    if(ueContextReleaseCommand->protocolIEs.list.array)
13192    {
13193       for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
13194       {
13195          if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
13196          {
13197             switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
13198             {
13199                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
13200                   {
13201                      gnbCuUeF1apId= ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
13202                                     value.choice.GNB_CU_UE_F1AP_ID;
13203                      break;
13204                   }
13205
13206                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
13207                   {
13208                      gnbDuUeF1apId = ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
13209                                      value.choice.GNB_DU_UE_F1AP_ID;
13210                      break;
13211                   }
13212
13213                case ProtocolIE_ID_id_Cause:
13214                   {
13215                      break;
13216                   }
13217
13218                case ProtocolIE_ID_id_RRCContainer:
13219                   {
13220                      for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++)
13221                      {
13222                         for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++)
13223                         {
13224                            if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
13225                                  (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
13226                            {
13227                               duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
13228                               DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
13229                               if(duUeCb->f1UeDb)
13230                               {
13231                                  memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
13232                                  duUeCb->f1UeDb->actionType = UE_CTXT_RELEASE;
13233                                  duUeCb->f1UeDb->cellIdx = cellIdx;
13234                                  /* Filling Dl RRC Msg Info */
13235                                  DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
13236                                  if(!duUeCb->f1UeDb->dlRrcMsg)
13237                                  {
13238                                     DU_LOG("\nERROR  -->  DU APP : procF1UeContextReleaseCommand(): \
13239                                     Memory allocation failed ");
13240                                     ret = RFAILED;
13241                                  }
13242                                  else
13243                                  {
13244                                     duUeCb->f1UeDb->dlRrcMsgPres = true;
13245                                     memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
13246                                     ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
13247                                           &ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
13248                                           value.choice.RRCContainer);
13249                                  }
13250
13251                               }
13252                               else
13253                               {
13254                                  DU_LOG("\nERROR  -->  DU APP : procF1UeContextReleaseCommand(): \
13255                                  Memory allocation failed ");
13256                                  ret = RFAILED;
13257
13258                               }
13259
13260                               ueIdxFound = true;
13261                               break;
13262                            }
13263                         }
13264                         if(ueIdxFound == true)
13265                         {
13266                            break;
13267                         }
13268                      }
13269                      if(!ueIdxFound)
13270                      {
13271                         DU_LOG("\nERROR  -->  F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
13272                         ret = RFAILED;
13273                      }
13274
13275
13276                      break;
13277                   }
13278                default :
13279                   DU_LOG("\nERROR  -->  F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
13280                         ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
13281                   break;
13282             }
13283          }
13284       }
13285    }
13286    if(ret != RFAILED)
13287    {
13288       duProcUeContextReleaseCommand(duUeCb);
13289    }
13290    freeAperDecodeUeContextReleaseCommand(f1apMsg);
13291    return ret;
13292 }
13293 /**************************************************************
13294  *
13295  * @brief Handles received F1AP message and sends back response  
13296  *
13297  * @details
13298  *
13299  *    Function : F1APMsgHdlr
13300  *
13301  *    Functionality:
13302  *         - Decodes received F1AP control message
13303  *         - Prepares response message, encodes and sends to SCTP
13304  *
13305  * @params[in] 
13306  * @return ROK     - success
13307  *         RFAILED - failure
13308  *
13309  * ****************************************************************/
13310 void F1APMsgHdlr(Buffer *mBuf)
13311 {
13312    int i =0;
13313    char *recvBuf =NULLP;
13314    MsgLen copyCnt =0;
13315    MsgLen recvBufLen =0;
13316    F1AP_PDU_t *f1apMsg =NULLP;
13317    asn_dec_rval_t rval; /* Decoder return value */
13318    F1AP_PDU_t f1apasnmsg ;
13319    DU_LOG("\nINFO  -->  F1AP : Received F1AP message buffer");
13320    ODU_PRINT_MSG(mBuf, 0,0);
13321
13322    /* Copy mBuf into char array to decode it */
13323    ODU_GET_MSG_LEN(mBuf, &recvBufLen);
13324    DU_ALLOC(recvBuf, (Size)recvBufLen);
13325
13326    if(recvBuf == NULLP)
13327    {
13328       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed");
13329       return;
13330    }
13331    if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
13332    {
13333       DU_LOG("\nERROR   -->  F1AP : Failed while copying %d", copyCnt);
13334       return;
13335    }
13336
13337    printf("\nDEBUG   -->  F1AP : Received flat buffer to be decoded : ");
13338    for(i=0; i< recvBufLen; i++)
13339    {
13340       printf("%x",recvBuf[i]);
13341    }
13342
13343    /* Decoding flat buffer into F1AP messsage */
13344    f1apMsg = &f1apasnmsg;
13345    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
13346
13347    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
13348    DU_FREE(recvBuf, (Size)recvBufLen);
13349
13350    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
13351    {
13352       DU_LOG("\nERROR  -->  F1AP : ASN decode failed");
13353       return;
13354    }
13355    printf("\n");
13356    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
13357
13358    switch(f1apMsg->present)
13359    {
13360       case F1AP_PDU_PR_successfulOutcome:
13361          {
13362             switch(f1apMsg->choice.successfulOutcome->value.present)
13363             {
13364                case SuccessfulOutcome__value_PR_ResetAcknowledge:
13365                   {
13366                      DU_LOG("\nINFO   -->  F1AP : F1ResetAcknowledge is received successfully ");
13367                      break;
13368                   }
13369                case SuccessfulOutcome__value_PR_F1SetupResponse:
13370                   {                             
13371 #ifndef ODU_TEST_STUB
13372                      procF1SetupRsp(f1apMsg);
13373 #endif
13374                      break;
13375                   }
13376
13377                case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
13378                   {
13379                      procF1GNBDUCfgUpdAck(f1apMsg);
13380                      break;
13381                   }
13382
13383                default:
13384                   {
13385                      DU_LOG("\nERROR  -->  F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
13386                            f1apMsg->choice.successfulOutcome->value.present);
13387                      return;
13388                   }
13389             }/* End of switch(successfulOutcome) */
13390             free(f1apMsg->choice.successfulOutcome);
13391             break;
13392          }
13393       case F1AP_PDU_PR_initiatingMessage:
13394          {
13395             switch(f1apMsg->choice.initiatingMessage->value.present)
13396             {
13397                case InitiatingMessage__value_PR_Reset:
13398                   {
13399                      procF1ResetReq(f1apMsg);
13400                      break;
13401                   }
13402                case InitiatingMessage__value_PR_DLRRCMessageTransfer:
13403                   {
13404                      procF1DlRrcMsgTrans(f1apMsg);
13405                      break;
13406                   }
13407                case InitiatingMessage__value_PR_UEContextSetupRequest:
13408                   {
13409                      procF1UeContextSetupReq(f1apMsg);
13410                      break;
13411                   }
13412                case InitiatingMessage__value_PR_UEContextModificationRequest:
13413                   {
13414                      procF1UeContextModificationReq(f1apMsg);
13415                      break;
13416                   }
13417                case InitiatingMessage__value_PR_UEContextReleaseCommand:
13418                   {
13419                       procF1UeContextReleaseCommand(f1apMsg);
13420                       break;
13421                   }
13422                default:
13423                   {
13424                      DU_LOG("\nERROR  -->  F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
13425                            f1apMsg->choice.initiatingMessage->value.present);
13426                      return;
13427                   }
13428             }/* End of switch(initiatingMessage) */
13429             free(f1apMsg->choice.initiatingMessage);
13430             break;
13431          }
13432
13433       default:
13434          {
13435             DU_LOG("\nERROR  -->  F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
13436             return;
13437          }
13438          free(f1apMsg);
13439
13440    }/* End of switch(f1apMsg->present) */
13441
13442 } /* End of F1APMsgHdlr */
13443
13444 /**********************************************************************
13445   End of file
13446  **********************************************************************/