2ef72011477120c9c06e5aa9fcc860d2297b006a
[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 rsrcListIdx=0;
5244    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
5245
5246    if(puschCfg->pusch_TimeDomainAllocationList)
5247    {
5248       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
5249       if(timeDomAllocList_t->choice.setup)
5250       {
5251          if(timeDomAllocList_t->choice.setup->list.array)
5252          {
5253             for(rsrcListIdx = 0; rsrcListIdx<timeDomAllocList_t->choice.setup->list.count; rsrcListIdx++)
5254             {
5255                DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx]->k2, sizeof(long));
5256                DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx],\
5257                      sizeof(PUSCH_TimeDomainResourceAllocation_t));
5258             }
5259             DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
5260                   timeDomAllocList_t->choice.setup->list.size);
5261          }
5262          DU_FREE(timeDomAllocList_t->choice.setup, \
5263                sizeof(struct PUSCH_TimeDomainResourceAllocationList));
5264       }
5265       DU_FREE(puschCfg->transformPrecoder, sizeof(long));
5266       DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
5267             sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
5268    }
5269
5270 }
5271 /*******************************************************************
5272  *
5273  * @brief Frees memory allocated for InitialUlBWP
5274  *
5275  * @details
5276  *
5277  *    Function : FreeInitialUlBWP
5278  *
5279  *    Functionality: Deallocating memory of InitialUlBWP
5280  *
5281  * @params[in] BWP_UplinkDedicated_t *ulBwp
5282  *
5283  * @return void
5284  *
5285  * ****************************************************************/
5286 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
5287 {
5288    uint8_t  rSetIdx, rsrcIdx, k1Idx;
5289    SRS_Config_t   *srsCfg = NULLP;
5290    PUSCH_Config_t *puschCfg = NULLP;
5291    PUCCH_Config_t *pucchCfg = NULLP;
5292    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
5293    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
5294    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
5295    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
5296
5297    if(ulBwp->pucch_Config)
5298    {
5299       if(ulBwp->pucch_Config->choice.setup)
5300       {
5301           pucchCfg = ulBwp->pucch_Config->choice.setup;
5302           if(pucchCfg->dl_DataToUL_ACK)
5303           {
5304              if(pucchCfg->dl_DataToUL_ACK->list.array)
5305              {
5306                 for(k1Idx = 0; k1Idx < pucchCfg->dl_DataToUL_ACK->list.count; k1Idx++)
5307                 {
5308                    DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array[k1Idx], sizeof(long));
5309                 }
5310                 DU_FREE(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
5311              }
5312              DU_FREE(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
5313           }
5314           DU_FREE(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
5315       }
5316       DU_FREE(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
5317    }
5318
5319    if(ulBwp->pusch_Config)
5320    {
5321       if(ulBwp->pusch_Config->choice.setup)
5322       {
5323          puschCfg=ulBwp->pusch_Config->choice.setup;
5324          if(puschCfg->dataScramblingIdentityPUSCH)
5325          {
5326             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
5327             {
5328                FreePuschTimeDomAllocList(puschCfg);
5329                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
5330                if(dmrsUlCfg->choice.setup)
5331                {
5332                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
5333                   {
5334                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
5335                      {
5336                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
5337                               sizeof(long));
5338                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
5339                               sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
5340                      }
5341                      DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
5342                            sizeof(long));
5343                   }
5344                   DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
5345                }
5346                DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
5347                      sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
5348             }
5349             DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
5350          }
5351          DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
5352       }
5353       DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
5354
5355       /* Free SRS-Config */
5356       if(ulBwp->srs_Config)
5357       {
5358          if(ulBwp->srs_Config->choice.setup)
5359          {
5360             srsCfg = ulBwp->srs_Config->choice.setup;
5361
5362             /* Free Resource Set to add/mod list */
5363             if(srsCfg->srs_ResourceSetToAddModList)
5364             {
5365                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
5366                if(rsrcSetList->list.array)
5367                {
5368                   rSetIdx = 0;
5369
5370                   /* Free SRS resource Id list in this SRS resource set */
5371                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
5372                   {
5373                      rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
5374
5375                      if(rsrcIdList->list.array)
5376                      {
5377                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
5378                         {
5379                            DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
5380                         }
5381                         DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
5382                      }
5383                      DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
5384                            sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
5385                   }
5386
5387                   /* Free resource type info for this SRS resource set */
5388                   DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
5389                         sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
5390
5391                   /* Free memory for each resource set */
5392                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
5393                   {
5394                      DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
5395                   }
5396                   DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size); 
5397                }
5398                DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
5399                      sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
5400             }
5401
5402             /* Free resource to add/modd list */
5403             if(srsCfg->srs_ResourceToAddModList)
5404             {
5405                resourceList = srsCfg->srs_ResourceToAddModList;
5406                if(resourceList->list.array)
5407                {
5408                   rsrcIdx = 0;
5409                   DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
5410                         sizeof(struct SRS_Resource__transmissionComb__n2));
5411                   DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
5412                         sizeof(struct SRS_Resource__resourceType__aperiodic));
5413
5414                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
5415                   {
5416                      DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
5417                   }
5418                   DU_FREE(resourceList->list.array, resourceList->list.size);
5419                }
5420                DU_FREE(srsCfg->srs_ResourceToAddModList, \
5421                      sizeof(struct SRS_Config__srs_ResourceToAddModList));
5422             }
5423
5424             DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
5425          }
5426          DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
5427       }
5428    }
5429 }       
5430 /*******************************************************************
5431  *
5432  * @brief Frees memory allocated for initialUplinkBWP
5433  *
5434  * @details
5435  *
5436  *    Function : FreeinitialUplinkBWP
5437  *
5438  *    Functionality: Deallocating memory of initialUplinkBWP
5439  *
5440  * @params[in] UplinkConfig_t *ulCfg
5441  *
5442  * @return void
5443  *         
5444  *
5445  * ****************************************************************/
5446 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5447 {
5448    BWP_UplinkDedicated_t *ulBwp=NULLP; 
5449    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5450
5451    if(ulCfg->initialUplinkBWP)
5452    {
5453       ulBwp=ulCfg->initialUplinkBWP;
5454       if(ulCfg->firstActiveUplinkBWP_Id)
5455       {
5456          if(ulCfg->pusch_ServingCellConfig)
5457          {
5458             puschCfg=ulCfg->pusch_ServingCellConfig;
5459             if(puschCfg->choice.setup)
5460             {
5461                if(puschCfg->choice.setup->ext1)
5462                {
5463                   DU_FREE(puschCfg->choice.setup->ext1->\
5464                         processingType2Enabled,sizeof(BOOLEAN_t));
5465                   DU_FREE(puschCfg->choice.setup->ext1->\
5466                         maxMIMO_Layers,sizeof(long));
5467                   DU_FREE(puschCfg->choice.setup->ext1, \
5468                         sizeof(struct PUSCH_ServingCellConfig__ext1));
5469                }
5470                DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5471             }
5472             DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5473          }
5474          DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5475       }
5476       FreeInitialUlBWP(ulBwp);
5477       DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5478    }
5479 }
5480 /*******************************************************************
5481  *
5482  * @brief Frees emmory allocated for BWPDlDedPdschCfg
5483  *
5484  * @details
5485  *
5486  *    Function : FreeBWPDlDedPdschCfg
5487  *
5488  *    Functionality: Deallocating memory of BWPDlDedPdschCfg
5489  *
5490  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5491  *
5492  * @return void
5493  *
5494  *
5495  * ****************************************************************/
5496 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5497 {
5498    struct PDSCH_Config *pdschCfg=NULLP;
5499    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5500    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5501    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5502
5503    if(dlBwp->pdsch_Config->choice.setup)
5504    {
5505       pdschCfg=dlBwp->pdsch_Config->choice.setup;
5506       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5507       {
5508          if(pdschCfg->pdsch_TimeDomainAllocationList)
5509          {
5510             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5511             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5512             {
5513                prbBndlType=&pdschCfg->prb_BundlingType;
5514                DU_FREE(prbBndlType->choice.staticBundling,\
5515                      sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5516                DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5517             }
5518             FreePdschTimeDomAllocList(timeDomAllocList);
5519             DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5520                   sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5521          }
5522          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5523          if(dmrsDlCfg->choice.setup)
5524          {
5525             DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5526                   sizeof(long));
5527             DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5528          }
5529          DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5530                sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5531       }
5532       DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5533    }
5534 }
5535 /*******************************************************************
5536  *
5537  * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5538  *
5539  * @details
5540  *
5541  *    Function : FreeBWPDlDedPdcchCfg
5542  *
5543  *    Functionality: Deallocating memory of BWPDlDedPdcchCfg
5544  *
5545  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5546  *
5547  * @return void
5548  *         
5549  *
5550  * ****************************************************************/
5551 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5552 {
5553    uint8_t idx1=0;
5554    uint8_t idx2=0;
5555    struct PDCCH_Config *pdcchCfg=NULLP;
5556    struct ControlResourceSet *controlRSet=NULLP;
5557    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5558
5559    if(dlBwp->pdcch_Config->choice.setup)
5560    {
5561       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5562       if(pdcchCfg->controlResourceSetToAddModList)
5563       {
5564          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5565          if(controlRSetList->list.array)
5566          {
5567             controlRSet = controlRSetList->list.array[idx2];
5568             if(controlRSet)
5569             {
5570                if(controlRSet->frequencyDomainResources.buf)
5571                {
5572                   if(controlRSet->pdcch_DMRS_ScramblingID)
5573                   {
5574                      if(pdcchCfg->searchSpacesToAddModList)
5575                      {
5576                         FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5577                         DU_FREE(pdcchCfg->searchSpacesToAddModList, \
5578                               sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5579                      }
5580                      DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5581                   }
5582                   DU_FREE(controlRSet->frequencyDomainResources.buf, \
5583                         controlRSet->frequencyDomainResources.size);
5584                }
5585             }
5586             for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5587             {
5588                DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5589             }
5590             DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5591          }
5592          DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5593                sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5594       }
5595       DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5596    }
5597 }       
5598
5599 /*******************************************************************
5600  *
5601  * @brief Frees emmory allocated for DUToCURRCContainer 
5602  *
5603  * @details
5604  *
5605  *    Function : FreeMemDuToCuRrcCont
5606  *
5607  *    Functionality: Deallocating memory of DuToCuRrcContainer
5608  *
5609  * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
5610  *
5611  * @return ROK     - success
5612  *         RFAILED - failure
5613  *
5614  * ****************************************************************/
5615 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
5616 {
5617    uint8_t idx=0;
5618    SpCellConfig_t *spCellCfg=NULLP;
5619    ServingCellConfig_t *srvCellCfg=NULLP;
5620    BWP_DownlinkDedicated_t *dlBwp=NULLP;
5621    MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5622    PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5623    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5624    struct RLC_Config *rlcConfig=NULLP;
5625    struct LogicalChannelConfig *macLcConfig=NULLP;
5626    struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5627    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5628    struct TAG_Config *tagConfig=NULLP;
5629    struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5630    struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5631    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5632
5633    rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5634    if(rlcBearerList)
5635    {
5636       if(rlcBearerList->list.array)
5637       {
5638          for(idx=0; idx<rlcBearerList->list.count; idx++)
5639          {
5640             if(rlcBearerList->list.array[idx])
5641             {  
5642                rlcConfig   = rlcBearerList->list.array[idx]->rlc_Config;
5643                macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5644                if(rlcConfig)
5645                {
5646                   if(rlcConfig->choice.am)
5647                   {
5648                      DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5649                      DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
5650                      DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5651                   }     
5652                   DU_FREE(rlcConfig, sizeof(struct RLC_Config));
5653                }
5654                DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5655                if(macLcConfig)
5656                {
5657                   if(macLcConfig->ul_SpecificParameters)
5658                   {
5659                      DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID,   sizeof(SchedulingRequestId_t));
5660                      DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup,   sizeof(long));
5661                      DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5662                   }
5663                   DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5664                }
5665                DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5666             }   
5667          }
5668          DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5669       }
5670       DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5671    }
5672
5673    macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5674    if(macCellGrpCfg)
5675    {
5676       schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; 
5677       if(schedulingRequestConfig)
5678       {
5679          schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5680          if(schReqList)
5681          {
5682             if(schReqList->list.array)
5683             {
5684                for(idx=0;idx<schReqList->list.count; idx++)
5685                {
5686                   if(schReqList->list.array[idx])
5687                   {
5688                      DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5689                      DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5690                   }
5691                }
5692                DU_FREE(schReqList->list.array, schReqList->list.size);
5693             }
5694             DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5695                   sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));    }
5696             DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5697       }
5698       if(macCellGrpCfg->bsr_Config)
5699       {
5700          DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5701       }
5702       tagConfig = macCellGrpCfg->tag_Config;
5703       if(tagConfig)
5704       {
5705          tagList = tagConfig->tag_ToAddModList;
5706          if(tagList)
5707          {
5708             if(tagList->list.array)
5709             {
5710                for(idx=0; idx<tagList->list.count; idx++)
5711                {
5712                   DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5713                }
5714                DU_FREE(tagList->list.array, tagList->list.size);
5715             }
5716             DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5717          }
5718          DU_FREE(tagConfig, sizeof(struct TAG_Config));
5719       }
5720
5721       phrConfig = macCellGrpCfg->phr_Config;
5722       if(phrConfig)
5723       {
5724          DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5725          DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5726       }
5727
5728       DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5729    }
5730
5731    phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5732    if(phyCellGrpCfg)
5733    {
5734       DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5735       DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5736    }
5737
5738    spCellCfg = cellGrpCfg->spCellConfig;
5739    if(spCellCfg)
5740    {
5741       if(spCellCfg->servCellIndex)
5742       {
5743          if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5744          {
5745             if(spCellCfg->spCellConfigDedicated)
5746             {
5747                srvCellCfg = spCellCfg->spCellConfigDedicated;
5748                if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
5749                {
5750                   if(srvCellCfg->initialDownlinkBWP)
5751                   {
5752                      dlBwp = srvCellCfg->initialDownlinkBWP;
5753                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
5754                      {
5755                         if(srvCellCfg->defaultDownlinkBWP_Id)
5756                         {
5757                            if(srvCellCfg->uplinkConfig)
5758                            {
5759                               if(srvCellCfg->pdsch_ServingCellConfig)
5760                               {
5761                                  pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5762                                  if(pdschCfg->choice.setup)
5763                                  {
5764                                     DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5765                                     DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5766                                  }
5767                                  DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5768                                           ServingCellConfig__pdsch_ServingCellConfig));
5769                               }  
5770                               FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5771                               DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));        
5772                            }
5773                            DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5774                         }
5775                         DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5776                      }
5777                      if(dlBwp->pdcch_Config)
5778                      {
5779                         if(dlBwp->pdsch_Config)
5780                         {
5781                            FreeBWPDlDedPdschCfg(dlBwp);
5782                            DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5783                         }
5784                         FreeBWPDlDedPdcchCfg(dlBwp);
5785                         DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5786                      }
5787                      DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5788                   }
5789                   DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
5790                }
5791                DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5792             }
5793             DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5794          }
5795          DU_FREE(spCellCfg->servCellIndex, sizeof(long));
5796       }
5797       DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5798    }
5799    return ROK;
5800 }
5801 /*******************************************************************
5802  *
5803  * @brief Builds DU To CU RRC Container 
5804  *
5805  * @details
5806  *
5807  *    Function : BuildDuToCuRrcContainer 
5808  *
5809  *    Functionality: Builds DuToCuRrcContainer
5810  *
5811  * @params[in] idx, index in F1AP msg
5812  *             DuToCuRRCContainer, DuToCuRRCContainer
5813  *
5814  * @return ROK     - success
5815  *         RFAILED - failure
5816  *
5817  * ****************************************************************/
5818 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
5819 {
5820    uint8_t  ret = ROK;
5821    CellGroupConfigRrc_t  cellGrpCfg;
5822    asn_enc_rval_t        encRetVal;
5823    memset(&cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
5824    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5825
5826    while(true)
5827    {
5828       cellGrpCfg.cellGroupId = CELL_GRP_ID;
5829
5830       cellGrpCfg.rlc_BearerToAddModList = NULLP;
5831       DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5832       if(!cellGrpCfg.rlc_BearerToAddModList)
5833       {
5834          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5835          ret = RFAILED;
5836          break;
5837       }
5838       if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5839       {
5840          DU_LOG("\nERROR  -->  F1AP : BuildRlcBearerToAddModList failed");
5841          ret = RFAILED;
5842          break;
5843       }
5844
5845       cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5846       cellGrpCfg.mac_CellGroupConfig = NULLP;
5847       DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5848       if(!cellGrpCfg.mac_CellGroupConfig)
5849       {
5850          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5851          ret = RFAILED;
5852          break;
5853       }
5854       if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5855       {
5856          DU_LOG("\nERROR  -->  F1AP : BuildMacCellGrpCfg failed");
5857          ret = RFAILED;
5858          break;
5859       }
5860
5861       cellGrpCfg.physicalCellGroupConfig = NULLP;
5862       DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5863       if(!cellGrpCfg.physicalCellGroupConfig)
5864       {
5865          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5866          ret = RFAILED;
5867          break;
5868       }
5869       if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5870       {
5871          DU_LOG("\nERROR  -->  F1AP : BuildPhyCellGrpCfg failed");
5872          ret = RFAILED;
5873          break;
5874       }
5875
5876       cellGrpCfg.spCellConfig = NULLP;
5877       DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5878       if(!cellGrpCfg.spCellConfig)
5879       {
5880          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5881          ret = RFAILED;
5882          break;
5883       }
5884       if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5885       {
5886          DU_LOG("\nERROR  -->  F1AP : BuildSpCellCfg failed");
5887          ret = RFAILED;
5888          break;
5889       }
5890
5891       cellGrpCfg.sCellToAddModList = NULLP;
5892       cellGrpCfg.sCellToReleaseList = NULLP;
5893       cellGrpCfg.ext1 = NULLP;
5894
5895       /* encode cellGrpCfg into duToCuRrcContainer */
5896       xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5897       memset(encBuf, 0, ENC_BUF_MAX_LEN);
5898       encBufSize = 0;
5899       encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5900       /* Encode results */
5901       if(encRetVal.encoded == ENCODE_FAIL)
5902       {
5903          DU_LOG( "\nERROR  --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5904                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5905          ret = RFAILED;
5906          break;
5907       }
5908       else
5909       {
5910          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5911          for(int i=0; i< encBufSize; i++)
5912          {
5913             printf("%x",encBuf[i]);
5914          }
5915       }
5916
5917       duToCuRrcContainer->size = encBufSize;
5918       DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
5919       if(!duToCuRrcContainer->buf)
5920       {
5921          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5922          ret = RFAILED;
5923          break;
5924       }
5925       if(ret == ROK)
5926       {
5927          memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
5928       }
5929       break;
5930    }
5931    FreeMemDuToCuRrcCont(&cellGrpCfg);
5932    return ret;
5933 }
5934
5935 /*******************************************************************
5936  *
5937  * @brief Free memory allocated in InitialULRRCMessage
5938  *
5939  * @details
5940  *
5941  *    Function : freeInitUlRrcMsgTransfer
5942  *
5943  *    Functionality: Free memory allocated in InitialULRRCMessage
5944  *
5945  * @params[in]F1AP_PDU_t  *f1apMsg)
5946  *
5947  * @return ROK     - success
5948  *         RFAILED - failure
5949  *
5950  * ****************************************************************/
5951
5952 uint8_t freeInitUlRrcMsgTransfer(F1AP_PDU_t  *f1apMsg)
5953 {
5954    uint8_t ieIdx, arrIdx;
5955    InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
5956
5957    if(f1apMsg)
5958    {
5959       if(f1apMsg->choice.initiatingMessage)
5960       {
5961          initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.\
5962             choice.InitialULRRCMessageTransfer;
5963          if(initULRRCMsg->protocolIEs.list.array)
5964          {
5965             for(ieIdx = 0; ieIdx < initULRRCMsg->protocolIEs.list.count; ieIdx++)
5966             {
5967                switch(initULRRCMsg->protocolIEs.list.array[ieIdx]->id)
5968                {
5969                   case ProtocolIE_ID_id_NRCGI:
5970                   {
5971                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf)
5972                      {
5973                         if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf)
5974                         {
5975                            DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf,\
5976                            initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.size);
5977                         }
5978                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf,\
5979                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.size);
5980                      }
5981                      break;
5982                   }
5983                   case ProtocolIE_ID_id_RRCContainer:
5984                   {
5985                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5986                      {
5987                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
5988                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5989                      }
5990                      break;
5991                   }
5992                   case ProtocolIE_ID_id_DUtoCURRCContainer:
5993                   {
5994                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf)
5995                      {
5996                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf,
5997                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.size);
5998                      }
5999                      break;
6000                   }
6001                   default:
6002                      break;
6003                }
6004              }
6005              for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
6006              {
6007                 if(initULRRCMsg->protocolIEs.list.array[arrIdx])
6008                 {
6009                    DU_FREE(initULRRCMsg->protocolIEs.list.array[arrIdx],\
6010                       sizeof(InitialULRRCMessageTransferIEs_t));
6011                 }
6012              }
6013              DU_FREE(initULRRCMsg->protocolIEs.list.array, initULRRCMsg->protocolIEs.list.size);
6014           }
6015          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6016       }
6017       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6018    }
6019    else
6020    {
6021       DU_LOG("\nERROR  -->  DU_APP : Recevied F1ap Pdu is null at freeInitUlRrcMsgTransfer()");
6022       return RFAILED;
6023    }
6024    return ROK;
6025 }
6026
6027 /*******************************************************************
6028  *
6029  * @brief Builds and sends the InitialULRRCMessage 
6030  *
6031  * @details
6032  *
6033  *    Function : BuildAndSendInitialRrcMsgTransfer 
6034  *
6035  *    Functionality: Constructs the Initial UL RRC Message Transfer and sends
6036  *                   it to the CU through SCTP.
6037  *
6038  * @params[in] 
6039  *
6040  * @return ROK     - success
6041  *         RFAILED - failure
6042  *
6043  * ****************************************************************/
6044 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
6045       uint16_t rrcContSize, uint8_t *rrcContainer)
6046 {
6047    uint8_t   ret;
6048    uint8_t   elementCnt;
6049    uint8_t   ieIdx;
6050    asn_enc_rval_t  encRetVal;
6051    F1AP_PDU_t  *f1apMsg = NULLP;
6052    InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
6053    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
6054
6055    while(true)
6056    {
6057       DU_LOG("\n INFO   -->  F1AP : Building RRC Setup Request\n");
6058       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6059       if(f1apMsg == NULLP)
6060       {
6061          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
6062          break;
6063       }
6064       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
6065       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
6066       if(f1apMsg->choice.initiatingMessage == NULLP)
6067       {
6068          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU failed");
6069          break;
6070       }
6071       f1apMsg->choice.initiatingMessage->procedureCode =\
6072                                                         ProcedureCode_id_InitialULRRCMessageTransfer;
6073       f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
6074       f1apMsg->choice.initiatingMessage->value.present = \
6075                                                          InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
6076       initULRRCMsg =\
6077                     &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
6078       elementCnt = 5;
6079       initULRRCMsg->protocolIEs.list.count = elementCnt;
6080       initULRRCMsg->protocolIEs.list.size = \
6081                                             elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
6082       /* Initialize the F1Setup members */
6083       DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
6084       if(initULRRCMsg->protocolIEs.list.array == NULLP)
6085       {
6086          DU_LOG(" ERROR  -->  F1AP : Memory allocation for\
6087                RRCSetupRequestMessageTransferIEs failed");
6088          break;
6089       }
6090       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
6091       {
6092          DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx],\
6093                sizeof(InitialULRRCMessageTransferIEs_t));
6094          if(initULRRCMsg->protocolIEs.list.array[ieIdx] == NULLP)
6095          {
6096             break;
6097          }
6098       }
6099       ieIdx = 0;
6100       /*GNB DU UE F1AP ID*/
6101       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6102                                                         ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
6103       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  = Criticality_reject;
6104       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
6105                                                                   InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
6106       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
6107
6108
6109       /*NRCGI*/
6110       ieIdx++;
6111       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6112                                                         ProtocolIE_ID_id_NRCGI;
6113       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  =Criticality_reject;
6114       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
6115                                                                   InitialULRRCMessageTransferIEs__value_PR_NRCGI;
6116
6117       ret =\
6118            BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
6119       if(ret!=ROK)
6120       {
6121          break;
6122       }
6123
6124       /*CRNTI*/
6125       ieIdx++;
6126       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6127                                                         ProtocolIE_ID_id_C_RNTI;
6128       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
6129       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
6130                                                                  InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
6131       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.C_RNTI = crnti;
6132
6133       /*RRCContainer*/
6134       ieIdx++;
6135       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
6136                                                         ProtocolIE_ID_id_RRCContainer;
6137       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
6138       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
6139                                                                  InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
6140
6141       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = rrcContSize;
6142       DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
6143             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size)
6144       if(!initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
6145       {
6146          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
6147          break;
6148       
6149       }
6150       memcpy(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, rrcContainer,
6151             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
6152
6153
6154       /*DUtoCURRCContainer*/
6155       ieIdx++;
6156       initULRRCMsg->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCContainer;
6157       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
6158       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
6159                                                                  InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
6160
6161       ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer);
6162       if(ret != ROK)
6163       {
6164          break;
6165       }
6166
6167       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6168
6169       /* Encode the F1SetupRequest type as APER */
6170       memset(encBuf, 0, ENC_BUF_MAX_LEN);
6171       encBufSize = 0;
6172       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6173       /* Encode results */
6174       if(encRetVal.encoded == ENCODE_FAIL)
6175       {
6176          DU_LOG( "\nERROR  --> F1AP : Could not encode Initial UL RRC Message Transfer\
6177                structure (at %s)\n",encRetVal.failed_type ? \
6178                encRetVal.failed_type->name : "unknown");
6179          ret = RFAILED;
6180          break;
6181       }
6182       else
6183       {
6184
6185          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for Initial UL RRC\
6186                Message transfer\n");
6187          for(int i=0; i< encBufSize; i++)
6188          {
6189             printf("%x",encBuf[i]);
6190          }
6191       }
6192       /* Sending  msg  */
6193       if(sendF1APMsg() != ROK)
6194       {
6195          DU_LOG("\nERROR  -->  F1AP : Sending Initial UL RRC Message Transfer Failed");
6196          ret = RFAILED;
6197          break;
6198       }
6199       break;
6200    }
6201    freeInitUlRrcMsgTransfer(f1apMsg);
6202    return ret;
6203 }/* End of BuildAndSendInitialRrcMsgTransfer*/
6204
6205 /*****  UE SETUP REQUEST *****/
6206
6207 /*******************************************************************
6208  *
6209  * @brief Free Qos And Snssai Drb Info
6210  *
6211  * @details
6212  *
6213  *    Function : freeDrbQosAndSnssaiInfo
6214  *
6215  *    Functionality: Free Qos And Snssai Drb Info
6216  *
6217  * @params[in] LcCfg *lcCfg,
6218  * @return void
6219  *
6220  * ****************************************************************/
6221 void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
6222 {
6223    if(lcCfg->snssai)
6224    {
6225       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
6226    }
6227    if(lcCfg->drbQos)
6228    {
6229       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
6230    }
6231 }
6232
6233 /******************************************************************
6234 *
6235 * @brief Function to delete the RLC Lc cfg from UE APP DB
6236 *
6237 * @details
6238 *
6239 *  Function : freeRlcLcCfg
6240 *
6241 *  Functionality: Function to delete the RLC Lc cfg from UE APP DB
6242 *
6243 *
6244  *****************************************************************/
6245
6246 void freeRlcLcCfg(RlcBearerCfg *lcCfg)
6247 {
6248    switch(lcCfg->rlcMode)
6249    {
6250       case RLC_AM :
6251          {
6252             if(lcCfg->u.amCfg)
6253             {
6254                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
6255             }
6256             break;
6257          }
6258       case RLC_UM_BI_DIRECTIONAL :
6259          {
6260             if(lcCfg->u.umBiDirCfg)
6261             {
6262                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
6263             }
6264             break;
6265          }
6266       case RLC_UM_UNI_DIRECTIONAL_UL :
6267          {
6268             if(lcCfg->u.umUniDirUlCfg)
6269             {
6270                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
6271             }
6272             break;
6273
6274          }
6275       case RLC_UM_UNI_DIRECTIONAL_DL :
6276          {
6277             if(lcCfg->u.umUniDirDlCfg)
6278             {
6279                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
6280             }
6281             break;
6282          }
6283       default:
6284          DU_LOG("\nERROR  -->  DU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode);
6285          break;
6286    }
6287 }
6288
6289 /*******************************************************************
6290  *
6291  * @brief Function to free MacLcCfg
6292  *
6293  * @details
6294  *
6295  *    Function : freeMacLcCfg
6296  *
6297  *    Functionality: Function to free MacLcCfg
6298  *
6299  * @params[in] LcCfg *lcCfg,
6300  * @return void
6301  *
6302  * ****************************************************************/
6303
6304 void  freeMacLcCfg(LcCfg *lcCfg)
6305 {
6306     /* Deleting DRBQOS */
6307    if(lcCfg->drbQos)
6308    {
6309       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
6310    }
6311    /* Deleting SNSSAI */
6312    if(lcCfg->snssai)
6313    {
6314       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
6315    }
6316 }
6317 /*******************************************************************
6318  *
6319  * @brief Free UE NR Capability received in UE Context setup request
6320  *
6321  * @details
6322  *
6323  *    Function : freeAperDecodeUeNrCapability
6324  *
6325  *    Functionality:  
6326  *       Free UE NR Capability received in UE Context setup request
6327  *
6328  * @params[in] 
6329  * @return ROK     - success
6330  *         RFAILED - failure
6331  *
6332  * ****************************************************************/
6333 void freeAperDecodeUeNrCapability(void *ueNrCapability)
6334 {
6335    uint8_t arrIdx =0;
6336    FeatureSets_t *featureSets =NULLP;
6337    UE_NR_Capability_t *ueNrCap = (UE_NR_Capability_t *)ueNrCapability;
6338
6339    if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
6340    {
6341       for(arrIdx = 0; arrIdx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; arrIdx++)
6342       {
6343          if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx])
6344             free(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx]);
6345       }
6346       free(ueNrCap->rf_Parameters.supportedBandListNR.list.array);
6347    }
6348
6349    if(ueNrCap->featureSets)
6350    {
6351       featureSets = ueNrCap->featureSets;
6352       if(featureSets->featureSetsDownlinkPerCC)
6353       {
6354          if(featureSets->featureSetsDownlinkPerCC->list.array)
6355          {
6356             for(arrIdx = 0; arrIdx < featureSets->featureSetsDownlinkPerCC->list.count; arrIdx++)
6357             {
6358                if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx])
6359                {
6360                   if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL)
6361                      free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL);
6362                   free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]);
6363                }
6364             }
6365             free(featureSets->featureSetsDownlinkPerCC->list.array);
6366          }
6367          free(featureSets->featureSetsDownlinkPerCC);
6368       }
6369       if(featureSets->featureSetsUplinkPerCC)
6370       {
6371          if(featureSets->featureSetsUplinkPerCC->list.array)
6372          {
6373             for(arrIdx = 0; arrIdx < featureSets->featureSetsUplinkPerCC->list.count; arrIdx++)
6374             {
6375                if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx])
6376                {
6377                   if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL)
6378                      free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL);
6379                   free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]);
6380                }
6381             }
6382             free(featureSets->featureSetsUplinkPerCC->list.array);
6383          }
6384          free(featureSets->featureSetsUplinkPerCC);
6385       }
6386       free(ueNrCap->featureSets);
6387    }   
6388 }
6389
6390 /*******************************************************************
6391 *
6392 * @brief Function to free PdcchSearchSpcToAddModList
6393          where memory allocated by aper_decoder
6394 *
6395 * @details
6396 *
6397 *    Function : freeAperDecodePdcchSearchSpcToAddModList 
6398 *
6399 *    Functionality: Function to free PdcchSearchSpcToAddModList
6400 *
6401 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
6402 * @return void
6403 *
6404 * ****************************************************************/
6405
6406 void freeAperDecodePdcchSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
6407 {
6408    uint8_t searchSpcArrIdx=0;
6409    uint8_t searchSpcArrIdx1=0;
6410    struct  SearchSpace *searchSpc=NULLP;
6411
6412
6413    if(searchSpcList->list.array)
6414    {
6415       if(searchSpcList->list.array[searchSpcArrIdx1])
6416       {
6417          searchSpc = searchSpcList->list.array[searchSpcArrIdx1];
6418          if(searchSpc->controlResourceSetId)
6419          {
6420             if(searchSpc->monitoringSlotPeriodicityAndOffset)
6421             {
6422                if(searchSpc->monitoringSymbolsWithinSlot)
6423                {
6424                   if(searchSpc->monitoringSymbolsWithinSlot->buf)
6425                   {
6426                      if(searchSpc->nrofCandidates)
6427                      {
6428                         if(searchSpc->searchSpaceType)
6429                         {
6430                            free(searchSpc->searchSpaceType->choice.ue_Specific);
6431                            free(searchSpc->searchSpaceType);
6432                         }
6433                         free(searchSpc->nrofCandidates);
6434                      }
6435                      free(searchSpc->monitoringSymbolsWithinSlot->buf);
6436                   }
6437                   free(searchSpc->monitoringSymbolsWithinSlot);
6438                }
6439                free(searchSpc->monitoringSlotPeriodicityAndOffset);
6440             }
6441             free(searchSpc->controlResourceSetId);
6442          }
6443       }
6444       for(searchSpcArrIdx = 0; searchSpcArrIdx < searchSpcList->list.count; searchSpcArrIdx++)
6445       {
6446          free(searchSpcList->list.array[searchSpcArrIdx]);
6447       }
6448       free(searchSpcList->list.array);
6449    }
6450 }
6451 /*******************************************************************
6452 *
6453 * @brief Function for free part for the memory allocated by aper_decoder
6454
6455 * @details
6456 *
6457 *    Function : freeAperDecodeBWPDlDedPdcchConfig
6458 *
6459 *    Functionality: Function to free BWPDlDedPdcchConfig
6460 *
6461 * @params[in] 
6462 * @return void
6463 *
6464 * ****************************************************************/
6465
6466
6467 void freeAperDecodeBWPDlDedPdcchConfig(BWP_DownlinkDedicated_t *dlBwp)
6468 {
6469    uint8_t arrIdx1=0;
6470    uint8_t arrIdx2=0;
6471    struct PDCCH_Config *pdcchCfg=NULLP;
6472    struct ControlResourceSet *controlRSet=NULLP;
6473    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6474    
6475    if(dlBwp->pdcch_Config->choice.setup)
6476    {
6477       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6478       if(pdcchCfg->controlResourceSetToAddModList)
6479       {
6480          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6481          if(controlRSetList->list.array)
6482          {
6483             controlRSet = controlRSetList->list.array[arrIdx2];
6484             if(controlRSet)
6485             {
6486                if(controlRSet->frequencyDomainResources.buf)
6487                {
6488                   if(controlRSet->pdcch_DMRS_ScramblingID)
6489                   {
6490                      if(pdcchCfg->searchSpacesToAddModList)
6491                      {
6492                         freeAperDecodePdcchSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6493                         free(pdcchCfg->searchSpacesToAddModList);
6494                      }
6495                      free(controlRSet->pdcch_DMRS_ScramblingID);
6496                   }
6497                   free(controlRSet->frequencyDomainResources.buf);
6498                }
6499             }
6500             for(arrIdx1 = 0; arrIdx1 <controlRSetList->list.count; arrIdx1++)
6501             {
6502                free(controlRSetList->list.array[arrIdx1]);
6503             }
6504             free(controlRSetList->list.array);
6505          }
6506          free(pdcchCfg->controlResourceSetToAddModList);
6507       }
6508       free(dlBwp->pdcch_Config->choice.setup);
6509    }
6510 }
6511 /*******************************************************************
6512 *
6513 * @brief Function to free PdschTimeDomAllocationList 
6514 *     where the memory allocated by aper_decoder
6515
6516 * @details
6517 *
6518 *    Function : freeAperDecodePdschTimeDomAllocationList
6519 *
6520 *    Functionality: Function to free PdschTimeDomAllocationList
6521 *
6522 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList 
6523 * @return void
6524 *
6525 * ****************************************************************/
6526
6527
6528 void freeAperDecodePdschTimeDomAllocationList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
6529 {
6530    uint8_t arrIdx=0;
6531
6532    if(timeDomAllocList->choice.setup)
6533    {
6534       if(timeDomAllocList->choice.setup->list.array)
6535       {
6536          for(arrIdx = 0; arrIdx <timeDomAllocList->choice.setup->list.count ; arrIdx++)
6537          {
6538             free(timeDomAllocList->choice.setup->list.array[arrIdx]);
6539          }
6540          free(timeDomAllocList->choice.setup->list.array);
6541       }
6542       free(timeDomAllocList->choice.setup);
6543    }
6544 }
6545
6546 /*******************************************************************
6547 *
6548 * @brief Function to free BWPDlDedPdschConfig 
6549 *        where the memory allocated by aper_decoder
6550 *  
6551 * @details
6552 *
6553 *    Function : freeAperDecodeBWPDlDedPdschConfig 
6554 *
6555 *    Functionality: Function to free BWPDlDedPdschConfig 
6556 *
6557 * @params[in] BWP_DownlinkDedicated_t *dlBwp 
6558 * @return void
6559 *
6560 * ****************************************************************/
6561
6562
6563 void freeAperDecodeBWPDlDedPdschConfig(BWP_DownlinkDedicated_t *dlBwp)
6564 {
6565    struct PDSCH_Config *pdschCfg=NULLP;
6566    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6567    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6568    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6569
6570    if(dlBwp->pdsch_Config->choice.setup)
6571    {
6572       pdschCfg=dlBwp->pdsch_Config->choice.setup;
6573       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6574       {
6575          if(pdschCfg->pdsch_TimeDomainAllocationList)
6576          {
6577             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6578             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6579             {
6580                prbBndlType=&pdschCfg->prb_BundlingType;
6581                free(prbBndlType->choice.staticBundling);
6582                free(pdschCfg->maxNrofCodeWordsScheduledByDCI);
6583             }
6584             freeAperDecodePdschTimeDomAllocationList(timeDomAllocList);
6585             free(pdschCfg->pdsch_TimeDomainAllocationList);
6586          }
6587          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6588          if(dmrsDlCfg->choice.setup)
6589          {
6590             free(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition);
6591             free(dmrsDlCfg->choice.setup);
6592          }
6593          free(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA);
6594       }
6595       free(dlBwp->pdsch_Config->choice.setup);
6596    }
6597 }
6598 /*******************************************************************
6599 *
6600 * @brief Function to free PuschTimeDomAllocListCfg
6601                  where the memory allocated by aper_decoder
6602 *
6603 * @details
6604 *
6605 *    Function : freeAperDecodePuschTimeDomAllocListCfg
6606 *
6607 *    Functionality: Function to free PuschTimeDomAllocListCfg
6608 *
6609 * @params[in] PUSCH_Config_t *puschCfg 
6610 * @return void
6611 *
6612 * ****************************************************************/
6613
6614
6615 void freeAperDecodePuschTimeDomAllocListCfg(PUSCH_Config_t *puschCfg)
6616 {
6617    uint8_t arrIdx=0;
6618    uint8_t arrIdx1=0;
6619    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
6620
6621    if(puschCfg->pusch_TimeDomainAllocationList)
6622    {
6623       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
6624       if(timeDomAllocList_t->choice.setup)
6625       {
6626          if(timeDomAllocList_t->choice.setup->list.array)
6627          {
6628             free(timeDomAllocList_t->choice.setup->list.array[arrIdx1]->k2);
6629             for(arrIdx = 0; arrIdx<timeDomAllocList_t->choice.setup->list.count; arrIdx++)
6630             {
6631                free(timeDomAllocList_t->choice.setup->list.array[arrIdx]);
6632             }
6633             free(timeDomAllocList_t->choice.setup->list.array);
6634          }
6635          free(timeDomAllocList_t->choice.setup);
6636       }
6637       free(puschCfg->transformPrecoder);
6638       free(puschCfg->pusch_TimeDomainAllocationList);
6639    }
6640 }
6641 /*******************************************************************
6642 *
6643 * @brief Function to free InitialUlBWPConfig where memory allocated by aper_decoder
6644 *
6645 * @details
6646 *
6647 *    Function : freeAperDecodeInitialUlBWPConfig 
6648 *
6649 *    Functionality: Function to free InitialUlBWPConfig
6650 *
6651 * @params[in]  BWP_UplinkDedicated_t *ulBwp
6652 * @return void
6653 *
6654 * ****************************************************************/
6655
6656
6657 void freeAperDecodeInitialUlBWPConfig(BWP_UplinkDedicated_t *ulBwp)
6658 {
6659    uint8_t  rSetIdx =0;
6660    uint8_t  rsrcIdx =0;
6661    SRS_Config_t   *srsCfg = NULLP;
6662    PUSCH_Config_t *puschCfg = NULLP;
6663    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
6664    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
6665    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
6666    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
6667
6668    if(ulBwp->pusch_Config)
6669    {
6670       if(ulBwp->pusch_Config->choice.setup)
6671       {
6672          puschCfg=ulBwp->pusch_Config->choice.setup;
6673          if(puschCfg->dataScramblingIdentityPUSCH)
6674          {
6675             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
6676             {
6677                freeAperDecodePuschTimeDomAllocListCfg(puschCfg);
6678                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
6679                if(dmrsUlCfg->choice.setup)
6680                {
6681                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
6682                   {
6683                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
6684                      {
6685                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0);
6686                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled);
6687                      }
6688                      free(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition);
6689                   }
6690                   free(dmrsUlCfg->choice.setup);
6691                }
6692                free(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA);
6693             }
6694             free(puschCfg->dataScramblingIdentityPUSCH);
6695          }
6696          free(ulBwp->pusch_Config->choice.setup);
6697       }
6698       free(ulBwp->pusch_Config);
6699
6700       /* Free SRS-Config */
6701       if(ulBwp->srs_Config)
6702       {
6703          if(ulBwp->srs_Config->choice.setup)
6704          {
6705             srsCfg = ulBwp->srs_Config->choice.setup;
6706
6707             /* Free Resource Set to add/mod list */
6708             if(srsCfg->srs_ResourceSetToAddModList)
6709             {
6710                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
6711                if(rsrcSetList->list.array)
6712                {
6713                   rSetIdx = 0;
6714
6715                   /* Free SRS resource Id list in this SRS resource set */
6716                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
6717                   {
6718                      rsrcIdList =
6719                         rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
6720
6721                      if(rsrcIdList->list.array)
6722                      {
6723                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count;
6724                               rsrcIdx++)
6725                         {
6726                            free(rsrcIdList->list.array[rsrcIdx]);
6727                         }
6728                         free(rsrcIdList->list.array);
6729                      }
6730                      free(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList);
6731                   }
6732
6733                   /* Free resource type info for this SRS resource set */
6734
6735                   free(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic);
6736
6737                   /* Free memory for each resource set */
6738                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
6739                   {
6740                      free(rsrcSetList->list.array[rSetIdx]);
6741                   }
6742                   free(rsrcSetList->list.array);
6743                }
6744                free(srsCfg->srs_ResourceSetToAddModList);
6745             }
6746
6747             /* Free resource to add/modd list */
6748             if(srsCfg->srs_ResourceToAddModList)
6749             {
6750                resourceList = srsCfg->srs_ResourceToAddModList;
6751                if(resourceList->list.array)
6752                {
6753                   rsrcIdx = 0;
6754
6755                   free(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2);
6756                   free(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic);
6757
6758                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
6759                   {
6760                      free(resourceList->list.array[rsrcIdx]);
6761                   }
6762                   free(resourceList->list.array);
6763                }
6764                free(srsCfg->srs_ResourceToAddModList);
6765             }
6766
6767             free(ulBwp->srs_Config->choice.setup);
6768          }
6769          free(ulBwp->srs_Config);
6770       }
6771    }
6772 }
6773 /*******************************************************************
6774 *
6775 * @brief Function to free initialUplinkBWPConfig where memory allocated by aper_decoder
6776 *
6777 * @details
6778 *
6779 *    Function : freeAperDecodeinitialUplinkBWPConfig
6780 *
6781 *    Functionality: Function to free initialUplinkBWPConfig
6782 *
6783 * @params[in] UplinkConfig_t *ulCfg 
6784 * @return void
6785 *
6786 * ****************************************************************/
6787
6788
6789 void freeAperDecodeinitialUplinkBWPConfig(UplinkConfig_t *ulCfg)
6790 {
6791    BWP_UplinkDedicated_t *ulBwp=NULLP;
6792    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6793    
6794    if(ulCfg->initialUplinkBWP)
6795    {
6796       ulBwp=ulCfg->initialUplinkBWP;
6797       if(ulCfg->firstActiveUplinkBWP_Id)
6798       {
6799          if(ulCfg->pusch_ServingCellConfig)
6800          {
6801             puschCfg=ulCfg->pusch_ServingCellConfig;
6802             if(puschCfg->choice.setup)
6803             {
6804                if(puschCfg->choice.setup->ext1)
6805                {
6806                   free(puschCfg->choice.setup->ext1->processingType2Enabled);
6807                   free(puschCfg->choice.setup->ext1->maxMIMO_Layers);
6808                   free(puschCfg->choice.setup->ext1);
6809                }
6810                free(puschCfg->choice.setup);
6811             }
6812             free(ulCfg->pusch_ServingCellConfig);
6813          }
6814          free(ulCfg->firstActiveUplinkBWP_Id);
6815       }
6816       freeAperDecodeInitialUlBWPConfig(ulBwp);
6817       free(ulCfg->initialUplinkBWP);
6818    }
6819 }
6820
6821 /*******************************************************************
6822  *
6823  * @brief Function to free DuUeCfg
6824  *
6825  * @details
6826  *
6827  *    Function : freeDuUeCfg
6828  *
6829  *    Functionality: Function to free DuUeCfg
6830  *
6831  * @params[in] DuUeCfg *ueCfg
6832  * @return void
6833  *
6834  * ****************************************************************/
6835 void freeDuUeCfg(DuUeCfg *ueCfg)
6836 {
6837    uint8_t lcIdx = 0;
6838    uint8_t arrIdx = 0;
6839    SpCellConfig_t *spCellCfg = NULLP;
6840    ServingCellConfig_t *srvCellCfg = NULLP;
6841    BWP_DownlinkDedicated_t *dlBwp = NULLP;
6842    MAC_CellGroupConfig_t *macCellGrpCfg = NULLP;
6843    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
6844    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList = NULLP;
6845    struct RLC_Config *rlcConfig = NULLP;
6846    struct LogicalChannelConfig *macLcConfig = NULLP;
6847    struct SchedulingRequestConfig *schedulingRequestConfig = NULLP;
6848    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList = NULLP;
6849    struct TAG_Config *tagConfig = NULLP;
6850    struct TAG_Config__tag_ToAddModList *tagList = NULLP;
6851    struct MAC_CellGroupConfig__phr_Config *phrConfig = NULLP;
6852    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg = NULLP;
6853    CellGroupConfigRrc_t *cellGrpCfg = ueCfg->cellGrpCfg;
6854   
6855    if(ueCfg->ueNrCapability)
6856    {
6857       freeAperDecodeUeNrCapability(ueCfg->ueNrCapability);
6858       DU_FREE(ueCfg->ueNrCapability, sizeof(UE_NR_Capability_t));
6859       ueCfg->ueNrCapability = NULLP;
6860    }
6861
6862    if(ueCfg->cellGrpCfg)
6863    {
6864       
6865       rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6866       if(rlcBearerList)
6867       {
6868          if(rlcBearerList->list.array)
6869          {
6870             for(arrIdx=0; arrIdx<rlcBearerList->list.count; arrIdx++)
6871             {
6872                if(rlcBearerList->list.array[arrIdx])
6873                {
6874                   rlcConfig   = rlcBearerList->list.array[arrIdx]->rlc_Config;
6875                   macLcConfig = rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig;
6876                   
6877                   if(rlcBearerList->list.array[arrIdx]->servedRadioBearer)
6878                   {
6879                      free(rlcBearerList->list.array[arrIdx]->servedRadioBearer);
6880                   }
6881                   if(rlcConfig)
6882                   {
6883                      if(rlcConfig->choice.am)
6884                      {
6885                         free(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength);
6886                         free(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength);
6887                         free(rlcConfig->choice.am);
6888                      }
6889                      free(rlcBearerList->list.array[arrIdx]->rlc_Config);
6890                   }
6891                   if(macLcConfig)
6892                   {
6893                      if(macLcConfig->ul_SpecificParameters)
6894                      {
6895                         free(macLcConfig->ul_SpecificParameters->schedulingRequestID);
6896                         free(macLcConfig->ul_SpecificParameters->logicalChannelGroup);
6897                         free(macLcConfig->ul_SpecificParameters);
6898                      }
6899                      free(rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig);
6900                   }
6901                   free(rlcBearerList->list.array[arrIdx]); 
6902                }
6903             }
6904             free(rlcBearerList->list.array);
6905          }
6906          free(cellGrpCfg->rlc_BearerToAddModList);
6907       }
6908
6909       macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6910       if(macCellGrpCfg)
6911       {
6912          schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6913          if(schedulingRequestConfig)
6914          {
6915             schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6916             if(schReqList)
6917             {
6918                if(schReqList->list.array)
6919                {
6920                   for(arrIdx=0;arrIdx<schReqList->list.count; arrIdx++)
6921                   {
6922                      if(schReqList->list.array[arrIdx])
6923                      {
6924                         free(schReqList->list.array[arrIdx]->sr_ProhibitTimer); 
6925                         free(schReqList->list.array[arrIdx]);
6926                      }
6927                   }
6928                   free(schReqList->list.array);
6929                }
6930                free(schedulingRequestConfig->schedulingRequestToAddModList);
6931             }
6932             free(macCellGrpCfg->schedulingRequestConfig);
6933          }
6934          if(macCellGrpCfg->bsr_Config)
6935          {
6936             free(macCellGrpCfg->bsr_Config);
6937          }
6938          tagConfig = macCellGrpCfg->tag_Config;
6939          if(tagConfig)
6940          {
6941             tagList = tagConfig->tag_ToAddModList;
6942             if(tagList)
6943             {
6944                if(tagList->list.array)
6945                {
6946                   for(arrIdx=0; arrIdx<tagList->list.count; arrIdx++)
6947                   {
6948                      free(tagList->list.array[arrIdx]);
6949                   }
6950                   free(tagList->list.array);
6951                }
6952                free(tagConfig->tag_ToAddModList);
6953             }
6954             free(tagConfig); 
6955          }
6956
6957          phrConfig = macCellGrpCfg->phr_Config;
6958          if(phrConfig)
6959          {
6960             free(phrConfig->choice.setup); 
6961             free(phrConfig); 
6962          }
6963
6964          free(macCellGrpCfg); 
6965       }
6966
6967       phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6968       if(phyCellGrpCfg)
6969       {
6970          free(phyCellGrpCfg->p_NR_FR1);
6971          free(phyCellGrpCfg); 
6972       }
6973
6974       spCellCfg = cellGrpCfg->spCellConfig;
6975       if(spCellCfg)
6976       {
6977          if(spCellCfg->servCellIndex)
6978          {
6979             if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6980             {
6981                if(spCellCfg->spCellConfigDedicated)
6982                {
6983                   srvCellCfg = spCellCfg->spCellConfigDedicated;
6984                   if(srvCellCfg->initialDownlinkBWP)
6985                   {
6986                      dlBwp = srvCellCfg->initialDownlinkBWP;
6987                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
6988                      {
6989                         if(srvCellCfg->defaultDownlinkBWP_Id)
6990                         {
6991                            if(srvCellCfg->uplinkConfig)
6992                            {
6993
6994                               if(srvCellCfg->pdsch_ServingCellConfig)
6995                               {
6996                                  pdschCfg=
6997                                     srvCellCfg->pdsch_ServingCellConfig;
6998                                  if(pdschCfg->choice.setup)
6999                                  {
7000
7001                                     free(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH);
7002                                     free(pdschCfg->choice.setup);
7003                                  }
7004
7005                                  free(srvCellCfg->pdsch_ServingCellConfig);
7006                               }
7007
7008                               freeAperDecodeinitialUplinkBWPConfig(srvCellCfg->uplinkConfig);
7009                               free(srvCellCfg->uplinkConfig);
7010                            }
7011                            free(srvCellCfg->defaultDownlinkBWP_Id);
7012                         }
7013
7014                         free(srvCellCfg->firstActiveDownlinkBWP_Id);
7015                      }
7016                      if(dlBwp->pdcch_Config)
7017                      {
7018                         if(dlBwp->pdsch_Config)
7019                         {
7020                            freeAperDecodeBWPDlDedPdschConfig(dlBwp);
7021                            free(dlBwp->pdsch_Config);
7022                         }
7023                         freeAperDecodeBWPDlDedPdcchConfig(dlBwp);
7024                         free(dlBwp->pdcch_Config);
7025                      }
7026                      free(srvCellCfg->initialDownlinkBWP);
7027                   }
7028
7029                   free(spCellCfg->spCellConfigDedicated);
7030                }
7031                free(spCellCfg->rlmInSyncOutOfSyncThreshold);
7032             }
7033             free(spCellCfg->servCellIndex); 
7034          }
7035          free(spCellCfg);
7036       }
7037       DU_FREE(ueCfg->cellGrpCfg, sizeof(CellGroupConfigRrc_t));
7038       ueCfg->cellGrpCfg = NULLP;
7039    }
7040    if(ueCfg->ambrCfg)
7041    {
7042       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->ambrCfg, sizeof(AmbrCfg));
7043    }
7044    for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++)
7045    {
7046       freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]);
7047    }
7048    for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
7049    {
7050       freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
7051    }
7052    for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++)
7053    {
7054       DU_FREE(ueCfg->upTnlInfo[lcIdx].tnlCfg1, sizeof(GtpTnlCfg));
7055    }
7056 }
7057
7058 /*******************************************************************
7059  *
7060  * @brief Function to free UecontextSetupDb
7061  *
7062  * @details
7063  *
7064  *    Function : freeF1UeDb
7065  *
7066  *    Functionality: Function to free UecontextSetupDb
7067  *
7068  * @params[in] UecontextSetupDb *
7069  * @return void
7070  *
7071  * ****************************************************************/
7072
7073 void freeF1UeDb(F1UeContextSetupDb *f1UeDb)
7074 {
7075    
7076    if(f1UeDb->dlRrcMsg)
7077    {
7078       if(f1UeDb->dlRrcMsg->rrcMsgPdu)
7079       {
7080         //DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,\
7081                f1UeDb->dlRrcMsg->rrcMsgPdu, f1UeDb->dlRrcMsg->rrcMsgSize);
7082       }
7083       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
7084    }
7085    freeDuUeCfg(&f1UeDb->duUeCfg);
7086    memset(f1UeDb, 0, sizeof(F1UeContextSetupDb));
7087    DU_FREE(f1UeDb, sizeof(F1UeContextSetupDb));
7088 }
7089
7090 /*******************************************************************
7091  *
7092  * @brief Function to build Am cfg Info
7093  *
7094  * @details
7095  *
7096  *    Function : extractRlcAmCfg
7097  *
7098  *    Functionality: Function to build Am cfg Info
7099  *
7100  * @params[in] AmBearerCfg *
7101  *             void *
7102  *
7103  * @return ROK/RFAILED
7104  *
7105  * ****************************************************************/
7106
7107 void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg)
7108 {
7109    if(rlcAmCfg)
7110    {
7111       /* UL AM */
7112       if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
7113       {
7114          amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength);
7115          /*TODO: Check the timer value when sent by real CU */
7116          amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly; 
7117          amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit;
7118       }
7119
7120       /* DL AM */
7121       if(rlcAmCfg->ul_AM_RLC.sn_FieldLength)
7122       {
7123          amCfgToSet->dlAmCfg.snLenDl = *(rlcAmCfg->ul_AM_RLC.sn_FieldLength);
7124          amCfgToSet->dlAmCfg.pollRetxTmr = rlcAmCfg->ul_AM_RLC.t_PollRetransmit;
7125          amCfgToSet->dlAmCfg.pollPdu   = rlcAmCfg->ul_AM_RLC.pollPDU;
7126          amCfgToSet->dlAmCfg.pollByte  = rlcAmCfg->ul_AM_RLC.pollByte;
7127          amCfgToSet->dlAmCfg.maxRetxTh = rlcAmCfg->ul_AM_RLC.maxRetxThreshold;
7128       }
7129    }
7130 }
7131
7132 /*******************************************************************
7133  *
7134  * @brief Function to build Um Bi Info
7135  *
7136  * @details
7137  *
7138  *    Function : extractRlcUmBiCfg
7139  *
7140  *    Functionality: Function to build Um Bi Info
7141  *
7142  * @params[in] UmBiDirBearerCfg *
7143  *             void *
7144  *
7145  * @return ROK/RFAILED
7146  *
7147  * ****************************************************************/
7148
7149 void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_Directional *rlcBiCfg)
7150 {
7151    if(rlcBiCfg)
7152    {
7153       /* UL UM BI DIR Cfg */
7154       if(rlcBiCfg->dl_UM_RLC.sn_FieldLength)
7155       {
7156          umBiCfgToSet->ulUmCfg.snLenUlUm  = *(rlcBiCfg->dl_UM_RLC.sn_FieldLength);
7157          umBiCfgToSet->ulUmCfg.reAssemTmr = rlcBiCfg->dl_UM_RLC.t_Reassembly;
7158       }
7159
7160       /* DL UM BI DIR Cfg */
7161       if(rlcBiCfg->ul_UM_RLC.sn_FieldLength)
7162          umBiCfgToSet->dlUmCfg.snLenDlUm  = *(rlcBiCfg->ul_UM_RLC.sn_FieldLength);
7163    }
7164 }
7165
7166 /*******************************************************************
7167  *
7168  * @brief Function to build Um Ul Info
7169  *
7170  * @details
7171  *
7172  *    Function : extractRlcUmUlCfg
7173  *
7174  *    Functionality: Function to build Um Ul Info
7175  *
7176  * @params[in] UmUniDirUlBearerCfg *
7177  *             void *
7178  *
7179  * @return ROK/RFAILED
7180  *
7181  * ****************************************************************/
7182
7183 void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_Uni_Directional_DL *umUlCfg)
7184 {
7185    if(umUlCfg)
7186    {
7187       if(umUlCfg->dl_UM_RLC.sn_FieldLength)
7188       {
7189          umUlCfgToSet->ulUmCfg.snLenUlUm  = *(umUlCfg->dl_UM_RLC.sn_FieldLength);
7190          umUlCfgToSet->ulUmCfg.reAssemTmr = umUlCfg->dl_UM_RLC.t_Reassembly;
7191       }
7192    }
7193 }
7194
7195 /*******************************************************************
7196  *
7197  * @brief Function to build Um Uni Dl Info
7198  *
7199  * @details
7200  *
7201  *    Function : extractRlcUmDlCfg
7202  *
7203  *    Functionality: Function to build Um Uni Dl Info
7204  *
7205  * @params[in] UmUniDirDlBearerCfg *
7206  *             void *
7207  *
7208  * @return ROK/RFAILED
7209  *
7210  * ****************************************************************/
7211 void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_Uni_Directional_UL *umDlCfg)
7212 {
7213    if(umDlCfg)
7214    {
7215       if(umDlCfg->ul_UM_RLC.sn_FieldLength)
7216          umDlCfgToSet->dlUmCfg.snLenDlUm  = *(umDlCfg->ul_UM_RLC.sn_FieldLength);
7217    }
7218 }
7219
7220 /*******************************************************************
7221  *
7222  * @brief Function to extractRlcModeCfg
7223  *
7224  * @details
7225  *
7226  *    Function : extractRlcModeCfg
7227  *
7228  *    Functionality: Function to extractRlcModeCfg
7229  *
7230  * @params[in] RLC_Config_t *
7231  *             RlcBearerCfg *
7232  *             void  *    
7233  * @return ROK/RFAILED
7234  *
7235  * ****************************************************************/
7236 void extractRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *rlcDbCfg, RLC_Config_t *lcCfg)
7237 {
7238    if(lcCfg)
7239    {
7240       switch(rlcMode)
7241       {
7242          case RLC_AM :
7243             {
7244                if(lcCfg->choice.am)
7245                {
7246                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
7247                   if(rlcDbCfg->u.amCfg)
7248                      extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
7249                }
7250                break;
7251             }
7252          case RLC_UM_BI_DIRECTIONAL :
7253             {
7254                if(lcCfg->choice.um_Bi_Directional)
7255                {
7256                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
7257                   if(rlcDbCfg->u.umBiDirCfg)
7258                      extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
7259                }
7260                break;
7261             }
7262          case RLC_UM_UNI_DIRECTIONAL_UL :
7263             {
7264                if(lcCfg->choice.um_Uni_Directional_DL)
7265                {
7266                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
7267                   if(rlcDbCfg->u.umUniDirUlCfg)
7268                      extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
7269                }
7270                break;
7271             }
7272          case RLC_UM_UNI_DIRECTIONAL_DL :
7273             {
7274                if(lcCfg->choice.um_Uni_Directional_UL)
7275                {
7276                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
7277                   if(rlcDbCfg->u.umUniDirDlCfg)
7278                      extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
7279                }
7280                break;
7281             }
7282          default:
7283             DU_LOG("\nERROR  -->  DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
7284             break;
7285       }
7286    }
7287 }
7288
7289 /*******************************************************************
7290  *
7291  * @brief Function to extract extractUlLcCfg
7292  *
7293  * @details
7294  *
7295  *    Function : extractUlLcCfg
7296  *
7297  *    Functionality: Function to extract extractUlLcCfg
7298  *
7299  * @params[in] UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg
7300  * @return void
7301  *
7302  * ****************************************************************/
7303
7304 void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg)
7305 {
7306    if(ulLcCfg)
7307    {
7308       if(ulLcCfg->ul_SpecificParameters)
7309       {
7310          f1UlLcCfg->priority = \
7311             ulLcCfg->ul_SpecificParameters->priority;
7312       if(ulLcCfg->ul_SpecificParameters->logicalChannelGroup)
7313       {
7314          f1UlLcCfg->lcGroup = \
7315            *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup);
7316       }
7317       if(ulLcCfg->ul_SpecificParameters->schedulingRequestID)
7318       {
7319          f1UlLcCfg->schReqId = \
7320            *(ulLcCfg->ul_SpecificParameters->schedulingRequestID);
7321       }
7322       f1UlLcCfg->pbr = \
7323          ulLcCfg->ul_SpecificParameters->prioritisedBitRate;
7324       f1UlLcCfg->bsd = \
7325          ulLcCfg->ul_SpecificParameters->bucketSizeDuration;
7326       }
7327    }
7328 }
7329
7330 /*******************************************************************
7331  *
7332  * @brief Function to procRlcLcCfg
7333  *
7334  * @details
7335  *
7336  *    Function : procRlcLcCfg
7337  *
7338  *    Functionality: Function to procRlcLcCfg
7339  *
7340  * @params[in] rbId, lcId, rbType, rlcMod
7341  *             RLC_Config_t *, RlcBearerCfg * , 
7342  * @return void
7343  *
7344  * ****************************************************************/
7345
7346 void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\
7347    uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg)
7348 {
7349
7350    lcCfg->rbId   = rbId;
7351    lcCfg->configType = configType;
7352
7353    if(rbType == RB_TYPE_SRB)
7354    {
7355       lcCfg->rbType = RB_TYPE_SRB;
7356       lcCfg->lcId   = rbId;
7357       lcCfg->lcType = LCH_DCCH;
7358       lcCfg->rlcMode = RLC_AM;
7359    }
7360    else if(rbType == RB_TYPE_DRB)
7361    {
7362       lcCfg->rbType = RB_TYPE_DRB;
7363       lcCfg->lcId   = lcId;
7364       lcCfg->lcType = LCH_DTCH;
7365       lcCfg->rlcMode = rlcMode;
7366    }
7367    if(f1RlcCfg) /* rlc mode config recived */
7368    {
7369       extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg);
7370    }
7371 }
7372
7373
7374
7375 /*******************************************************************
7376  *
7377  * @brief Fills DrbQos Info received by CU
7378  *
7379  * @details
7380  *
7381  *    Function : extractQosInfo
7382  *
7383  *    Functionality: Fills DrbQos Info received  by CU
7384  *
7385  * @params[in] DrbQosInfo *qosToAdd, 
7386  *             QoSFlowLevelQoSParameters_t *qosFlowCfg
7387  * @return void
7388  *
7389  * ****************************************************************/
7390
7391 void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg)
7392 {
7393    qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present;
7394    qosToAdd->u.nonDyn5Qi.fiveQi     =\
7395          qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
7396    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow)
7397    {
7398       qosToAdd->u.nonDyn5Qi.avgWindow = \
7399         *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
7400    }
7401    qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \
7402       *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
7403    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel)
7404    {
7405       qosToAdd->u.nonDyn5Qi.priorLevel = \
7406          *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel);
7407    }
7408    qosToAdd->ngRanRetPri.priorityLevel = \
7409       qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; 
7410    qosToAdd->ngRanRetPri.preEmptionCap = \
7411       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability;
7412    qosToAdd->ngRanRetPri.preEmptionVul = \
7413       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability;
7414    if(qosFlowCfg->gBR_QoS_Flow_Information)
7415    {
7416       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \
7417          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \
7418          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size);
7419       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \
7420          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \
7421          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size);
7422       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\
7423          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \
7424          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size);
7425       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\
7426          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \
7427          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size);
7428    }
7429    qosToAdd->pduSessionId = 0;
7430    qosToAdd->ulPduSessAggMaxBitRate = 0;
7431 }
7432
7433 /*******************************************************************
7434  *
7435  * @brief Function to extract GTP Tunnel Info from CU
7436  *
7437  * @details
7438  *
7439  *    Function : extractUpTnlInfo
7440  *
7441  *    Functionality: Function to extract GTP Tunnel Info from CU
7442  *
7443  * @params[in] F1AP message
7444  * @return ROK/RFAILED
7445  *
7446  * ****************************************************************/
7447
7448 uint8_t extractUpTnlInfo(uint8_t drbId, uint8_t configType,\
7449    ULUPTNLInformation_ToBeSetup_List_t *tnlInfo, UpTnlCfg *upTnlInfo)
7450 {
7451    uint8_t tnlIdx;
7452    uint32_t ipv4_du = 0;
7453    GTPTunnel_t *gtpTunnel = NULLP;
7454
7455    upTnlInfo->drbId = drbId; 
7456    upTnlInfo->configType = configType;
7457 #ifdef O1_ENABLE
7458    cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du);
7459 #else
7460    cmInetAddr((char *)DU_IP_V4_ADDR, &ipv4_du);
7461 #endif
7462
7463    for(tnlIdx=0; tnlIdx < tnlInfo->list.count; tnlIdx++)
7464    {
7465       if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
7466       {
7467          if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel)
7468          {
7469             gtpTunnel = tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel;
7470             DU_ALLOC(upTnlInfo->tnlCfg1, sizeof(GtpTnlCfg));
7471             if(upTnlInfo->tnlCfg1 == NULLP)
7472             {
7473                DU_LOG("\nERROR  -->  F1AP : extractUpTnlInfo: Failed to allocate mmeory for tunnel cfg 1");
7474                return RFAILED;
7475             }
7476             bitStringToInt(&gtpTunnel->transportLayerAddress, &upTnlInfo->tnlCfg1->ulTnlAddress);
7477             upTnlInfo->tnlCfg1->dlTnlAddress = ipv4_du;
7478             if(gtpTunnel->gTP_TEID.size > 0)
7479             {
7480                teIdStringToInt(gtpTunnel->gTP_TEID.buf, &upTnlInfo->tnlCfg1->teId);
7481             }
7482          }
7483          break;
7484       }
7485    }
7486    return ROK;
7487 }
7488 /*******************************************************************
7489 *
7490 * @brief Function to extract Drb Qos Cfg Info from CU
7491 *
7492 * @details
7493 *
7494 *    Function : extractDrbQosCfg 
7495 *
7496 *    Functionality: Function to extract Drb Qos Cfg Info from CU
7497 *
7498 * @params[in] DRB_Information_t *drbInfo, LcCfg *macLcToAdd
7499 * @return ROK/RFAILED
7500 *
7501 * ****************************************************************/
7502
7503 uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd ) 
7504 {
7505    if(!macLcToAdd->drbQos)
7506    {
7507       DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
7508       if(macLcToAdd->drbQos == NULLP)
7509       {
7510          DU_LOG("\nERROR  -->  DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
7511          return RFAILED;
7512       }
7513
7514    }
7515    if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
7516    {
7517       extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
7518       macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
7519    }
7520    if(!macLcToAdd->snssai)
7521    {
7522       DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
7523       if(macLcToAdd->snssai == NULLP)
7524       {
7525          DU_LOG("\nERROR  -->  DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()");
7526          return RFAILED;
7527       }
7528    }
7529    memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
7530          drbInfo->sNSSAI.sST.size);
7531    if(drbInfo->sNSSAI.sD)
7532    {
7533       memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
7534             drbInfo->sNSSAI.sD->size);
7535    }
7536    return ROK;
7537 }
7538 /*******************************************************************
7539  *
7540  * @brief Function to extract DRB info received from CU
7541  *
7542  * @details
7543  *
7544  *    Function : extractDrbCfg
7545  *
7546  *    Functionality: Function to extract DRB info received from CU
7547  *
7548  * @params[in] F1AP message
7549  * @return void
7550  *
7551  * ****************************************************************/
7552 uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem,DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\
7553 LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo)
7554 {
7555    DRB_Information_t *drbInfo = NULLP;
7556
7557    if(drbItem != NULLP)
7558    {
7559       if(extractUpTnlInfo(drbItem->dRBID, CONFIG_ADD, &drbItem->uLUPTNLInformation_ToBeSetup_List, upTnlInfo) != ROK)
7560       {
7561          DU_LOG("\nERROR  -->  DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
7562          return RFAILED;
7563       }
7564       if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
7565       {
7566          if(drbItem->qoSInformation.choice.choice_extension->value.present == QoSInformation_ExtIEs__value_PR_DRB_Information)
7567          {
7568             drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
7569             if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
7570             {
7571                DU_LOG("\nERROR  -->  DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
7572                return RFAILED;
7573             }
7574          }
7575       }
7576    }
7577    else if(drbSetupModItem != NULLP)
7578    {
7579       if(extractUpTnlInfo(drbSetupModItem->dRBID, CONFIG_ADD, &drbSetupModItem->uLUPTNLInformation_ToBeSetup_List,\
7580       upTnlInfo) != ROK)
7581       {
7582          DU_LOG("\nERROR  -->  DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
7583          return RFAILED;
7584       }
7585       if(drbSetupModItem->qoSInformation.present == QoSInformation_PR_choice_extension)
7586       {
7587          if(drbSetupModItem->qoSInformation.choice.choice_extension->value.present ==\
7588          QoSInformation_ExtIEs__value_PR_DRB_Information)
7589          {
7590             drbInfo = &drbSetupModItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
7591             if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
7592             {
7593                DU_LOG("\nERROR  -->  DUAPP : Failed to extract qos Cfg at extractDrbCfg()");  
7594                return RFAILED;
7595             }
7596
7597          }
7598       }
7599    }
7600
7601    return ROK;
7602 }
7603
7604 /*******************************************************************
7605  *
7606  * @brief Function to extract RB info received from CU
7607  *
7608  * @details
7609  *
7610  *    Function : extractMacRbCfg
7611  *
7612  *    Functionality: Function to extract RB info received from CU
7613  *
7614  * @params[in] F1AP message
7615  * @return ROK/RFAILED
7616  *
7617  * ****************************************************************/
7618
7619 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\
7620 DRBs_ToBeSetupMod_Item_t *drbSetupModCfg,  LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
7621 {
7622    if(drbCfg != NULLP)
7623    {
7624       if(extractDrbCfg(drbCfg, NULL, lcCfg, upTnlInfo) != ROK)
7625       {
7626          DU_LOG("ERROR  -->  F1AP : Failed to build Drb Qos at extractMacRbCfg()");
7627          return RFAILED;
7628       }
7629    }
7630    else if(drbSetupModCfg != NULLP)
7631    { 
7632       if(extractDrbCfg(NULL, drbSetupModCfg, lcCfg, upTnlInfo) != ROK)
7633       {
7634          DU_LOG("ERROR  -->  F1AP : Failed to build Drb Qos at extractMacRbCfg()");
7635          return RFAILED;
7636       }
7637    }
7638    else
7639    {
7640       lcCfg->drbQos = NULLP;
7641       lcCfg->snssai = NULLP;
7642       if(lcCfg->lcId == SRB2_LCID)
7643          lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
7644       else
7645          lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
7646    }
7647    if(ulLcCfg)
7648    {
7649       lcCfg->ulLcCfgPres = true;
7650       extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
7651    }
7652    else
7653       lcCfg->ulLcCfgPres = false;
7654    return ROK;
7655 }
7656
7657 /*******************************************************************
7658  *
7659  * @brief Function processing LC config info received from CU
7660  *
7661  * @details
7662  *
7663  *    Function : procMacLcCfg
7664  *
7665  *    Functionality: Function processing LC config info received from CU
7666  *
7667  * @params[in] F1AP message
7668  * @return ROK/RFAILED
7669  *
7670  * ****************************************************************/
7671
7672 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
7673 DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LogicalChannelConfig_t *ulLcCfg,\
7674 LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
7675 {
7676    uint8_t ret = ROK;
7677
7678    lcCfg->lcId = lcId;
7679    lcCfg->configType = configType;
7680    if(rbType == RB_TYPE_SRB)
7681    {
7682       ret = extractMacRbCfg(lcId, NULL,NULL, ulLcCfg, lcCfg, NULL);
7683    }
7684    else if(rbType == RB_TYPE_DRB)
7685    {
7686       if(drbItem != NULL)
7687         ret = extractMacRbCfg(lcId, drbItem, NULL, ulLcCfg, lcCfg, upTnlInfo);
7688       else if(drbSetupModItem != NULL)
7689         ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, ulLcCfg, lcCfg, upTnlInfo);
7690    }
7691    return ret;
7692 }
7693
7694 /*******************************************************************
7695  *
7696  * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
7697  *
7698  * @details
7699  *
7700  *    Function : extractRlcCfgToAddMod
7701  *
7702  *    Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
7703  *
7704  * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
7705  *             DuUeCfg Pointer
7706  * @return ROK/RFAILED
7707  *
7708  * ****************************************************************/
7709
7710 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, DuUeCfg *ueCfgDb)
7711 {
7712   uint8_t idx, rbId, lcId, rlcMode, rbType;
7713   RLC_Config_t *f1RlcCfg = NULLP;
7714   LogicalChannelConfig_t *macUlLcCfg = NULLP;
7715
7716   for(idx = 0; idx < lcCfg->list.count; idx++)
7717   {
7718      lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
7719      if(lcCfg->list.array[idx]->servedRadioBearer)
7720      {
7721         /* RadioBearer for SRB/DRB */
7722         if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7723         RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
7724         {
7725            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
7726            rbType = RB_TYPE_SRB;
7727         }
7728         else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7729         RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
7730         {
7731            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
7732            rbType = RB_TYPE_DRB;
7733         }
7734         else
7735         {
7736            DU_LOG("\nERROR  -->  No components present in Bearer config to ADD/MOD");
7737            return RFAILED;
7738         }
7739         /* MAC UL LC Config */
7740         if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
7741         {
7742            macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
7743         }
7744      }
7745      else
7746      {
7747         DU_LOG("\nERROR  -->  DUAPP: Received RadioBearer config is NULL");
7748         return RFAILED;
7749      }
7750      /* RLC Mode Config */
7751      if(lcCfg->list.array[idx]->rlc_Config)
7752      {
7753         rlcMode  = lcCfg->list.array[idx]->rlc_Config->present;
7754         f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
7755      }
7756      
7757      /* Filling RLC/MAC Config*/
7758      memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
7759      memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
7760      procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
7761      if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK)
7762      {
7763         DU_LOG("\nERROR  -->  DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()");
7764         return RFAILED;
7765      }
7766      (ueCfgDb->numRlcLcs)++;
7767      (ueCfgDb->numMacLcs)++;
7768   }
7769   //TODO: To send the failure cause in UeContextSetupRsp 
7770   return ROK;
7771 }
7772
7773 /*******************************************************************
7774  *
7775  * @brief DeAlloc pdsch serv cell config info
7776  *
7777  * @details
7778  *
7779  *    Function : freeMacPdschServCellInfo
7780  *
7781  *    Functionality: DeAlloc pdsch serv cell config info
7782  *
7783  * @params[in] PdschServCellCfg pointer
7784  * @return void
7785  *
7786  * ****************************************************************/
7787
7788 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
7789 {
7790    if(pdsch->xOverhead)
7791    {
7792       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(PdschXOverhead));
7793    }
7794    if(pdsch->codeBlkGrpFlushInd)
7795    {
7796       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
7797    }
7798    if(pdsch->maxCodeBlkGrpPerTb)
7799    {
7800       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB));
7801    }
7802    if(pdsch->maxMimoLayers)
7803    {
7804       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
7805    }
7806 }
7807
7808 /*******************************************************************
7809  *
7810  * @brief Free Serving cell Info
7811  *
7812  * @details
7813  *
7814  *    Function : freeMacServingCellInfo
7815  *
7816  *    Functionality: Free Serving cell Info
7817  *
7818  * @params[in] ServCellCfgInfo *srvCellCfg
7819  * @return void
7820  *
7821  * ****************************************************************/
7822 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
7823 {
7824    uint8_t timeDomRsrcIdx;
7825
7826    if(srvCellCfg->initDlBwp.pdschPresent)
7827    {
7828       for(timeDomRsrcIdx = 0; timeDomRsrcIdx < srvCellCfg->initDlBwp.pdschCfg.numTimeDomRsrcAlloc; timeDomRsrcIdx++)
7829       {
7830          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, \
7831             srvCellCfg->initDlBwp.pdschCfg.timeDomRsrcAllociList[timeDomRsrcIdx].k0, sizeof(uint8_t));
7832       }
7833    }
7834
7835    freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
7836    if(srvCellCfg->bwpInactivityTmr)
7837    {
7838       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
7839    }
7840
7841    if(srvCellCfg->initUlBwp.pucchPresent)
7842    {
7843       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->initUlBwp.pucchCfg.dlDataToUlAck, sizeof(PucchDlDataToUlAck));
7844    }
7845 }
7846
7847 /*******************************************************************
7848  *
7849  * @brief Free cell Grp Cfg Info
7850  *
7851  * @details
7852  *
7853  *    Function : freeUeReCfgCellGrpInfo
7854  *
7855  *    Functionality: Free cell Grp Cfg Info
7856  *
7857  * @params[in] MacUeCfg*  duUeCfg
7858  * @return void
7859  *
7860  * ****************************************************************/
7861
7862 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
7863 {
7864    freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
7865 }
7866
7867 /*******************************************************************
7868  *
7869  * @brief Fills Reconfig SchReqReConfig
7870  *
7871  * @details
7872  *
7873  *    Function : extractSchReqReConfig
7874  *
7875  *    Functionality: Fills Reconfig SchReqReConfig
7876  *
7877  * @params[in] SchedulingRequestConfig_t *cuSchedReq
7878  *             SchedReqCfg*  macSchedReq
7879  * @return void
7880  *
7881  * ****************************************************************/
7882 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
7883 {
7884    uint8_t schReqIdx = 0;
7885    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
7886    struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
7887
7888    if(cuSchedReq->schedulingRequestToAddModList)
7889    {
7890       schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
7891       if(schReqListToAdd->list.count)
7892       {
7893          macSchedReq->addModListCount = schReqListToAdd->list.count;
7894          for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
7895          {
7896             macSchedReq->addModList[schReqIdx].schedReqId = \
7897                schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
7898             macSchedReq->addModList[schReqIdx].srProhibitTmr = \
7899                *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
7900             macSchedReq->addModList[schReqIdx].srTransMax    =\
7901                schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
7902          }
7903       }
7904    }
7905    /* Scheduling Req To release */
7906    if(cuSchedReq->schedulingRequestToReleaseList)
7907    {
7908       schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
7909       if(schReqListToRel->list.count)
7910       {
7911          macSchedReq->relListCount = schReqListToRel->list.count;
7912          for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
7913          {
7914             macSchedReq->relList[schReqIdx] = \
7915                *schReqListToRel->list.array[schReqIdx];
7916          }
7917       }
7918    }
7919 }
7920
7921 /*******************************************************************
7922  *
7923  * @brief Fills TagReconfig
7924  *
7925  * @details
7926  *
7927  *    Function : extractTagReconfig
7928  *
7929  *    Functionality: Fills extractTagReconfig
7930  *
7931  * @params[in] TAG_Config_t *cuTagCfg
7932  *             TagCfg *macTagCfg
7933  * @return void
7934  *
7935  * ****************************************************************/
7936
7937 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
7938 {
7939   uint8_t tagIdx = 0;
7940   struct TAG_Config__tag_ToAddModList  *tagListToAddMod = NULLP;
7941   struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
7942
7943   /* Tag config to AddMod */
7944   if(cuTagCfg->tag_ToAddModList)
7945   {
7946      tagListToAddMod = cuTagCfg->tag_ToAddModList; 
7947      if(tagListToAddMod->list.count)
7948      {
7949         macTagCfg->addModListCount = tagListToAddMod->list.count;
7950         for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
7951         {
7952            macTagCfg->addModList[tagIdx].tagId =\
7953               tagListToAddMod->list.array[tagIdx]->tag_Id;     
7954            macTagCfg->addModList[tagIdx].timeAlignTimer = \
7955
7956               tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
7957         }
7958      }
7959   }
7960   /* Tag config to release */
7961   if(cuTagCfg->tag_ToReleaseList)
7962   {
7963      tagListToRel = cuTagCfg->tag_ToReleaseList;
7964      if(tagListToRel->list.count)
7965      {
7966         macTagCfg->relListCount = tagListToRel->list.count;
7967         for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
7968         {
7969            macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];     
7970         }
7971      }
7972   }
7973 }
7974
7975 /*******************************************************************
7976  *
7977  * @brief Fills PdcchCfg received by CU
7978  *
7979  * @details
7980  *
7981  *    Function : extractPdcchCfg
7982  *
7983  *    Functionality: Fills PdcchCfg received  by CU
7984  *
7985  * @params[in] PDCCH_Config_t *cuPdcchCfg,
7986  *             PdcchConfig *duPdcchCfg
7987  * @return void
7988  *
7989  * ****************************************************************/
7990
7991 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
7992 {
7993    uint8_t cRsetIdx = 0;
7994    uint8_t srchSpcIdx = 0;
7995
7996    struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
7997    struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
7998    struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
7999    struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
8000
8001
8002    /* Control Resource Set To Add/Mod List */
8003    if(cuPdcchCfg->controlResourceSetToAddModList)
8004    {
8005       cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
8006       if(cRsetToAddModList->list.count)
8007       {
8008          macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
8009          for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
8010          {
8011             macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
8012               cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
8013             bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
8014                macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
8015             macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
8016               cRsetToAddModList->list.array[cRsetIdx]->duration;
8017
8018             macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
8019               cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;   
8020             if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
8021             {
8022                //TODO: handle the case for Interleaved
8023             }
8024             macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
8025               cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
8026             if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
8027             {
8028                macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
8029                   *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
8030             }
8031          }
8032       }
8033
8034    }
8035    /* Control Resource Set To Release List */
8036    if(cuPdcchCfg->controlResourceSetToReleaseList)
8037    {
8038       cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
8039       if(cRsetToRelList->list.count)
8040       {
8041          macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
8042          for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
8043          {
8044             macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
8045          }
8046       }
8047    }
8048
8049    /* Search space To Add/Mod List */
8050    if(cuPdcchCfg->searchSpacesToAddModList)
8051    {
8052       srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
8053       if(srchSpcToAddModList->list.count)
8054       {
8055          macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
8056          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
8057          {
8058             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
8059                srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
8060             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
8061                *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
8062             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
8063             {
8064                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
8065                   srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
8066             }
8067             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
8068             {
8069                bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
8070                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
8071             }
8072             if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
8073             {
8074               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
8075                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
8076               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
8077                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
8078               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
8079                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
8080               
8081               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
8082                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
8083               
8084               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
8085                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
8086             }
8087             if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
8088             {
8089                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
8090                   srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
8091                if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
8092                {
8093                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
8094                      srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
8095                }
8096          
8097             }
8098          }
8099       }
8100    }
8101    /* Search space To Rel List */
8102    if(cuPdcchCfg->searchSpacesToReleaseList)
8103    {
8104       srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
8105       if(srchSpcToRelList->list.count)
8106       {
8107          macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
8108          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
8109          {
8110             macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
8111                *(srchSpcToRelList->list.array[srchSpcIdx]);
8112          }
8113       }
8114    }
8115 }
8116
8117 /*******************************************************************
8118  *
8119  * @brief Fills PdschCfg received by CU
8120  *
8121  * @details
8122  *
8123  *    Function : extractPdschCfg
8124  *
8125  *    Functionality: Fills PdschCfg received  by CU
8126  *
8127  * @params[in] PDSCH_Config_t *cuPdschCfg = Information which is send by CU,
8128  *                   which we have stored in F1UeContextSetupDb,
8129  *             PdschConfig *macPdschCfg = Used to Store the information which
8130  *                   needs to send in other layer, as well as this can be the variable
8131  *                   which stores the information in DuCb,
8132  *             PdschConfig *storedPdschCfg =  Null in case of sending the
8133  *                   information to other layer else it will have stored pdsch 
8134  *                   configuration in copyOfmacUeCfg.
8135  * @return void
8136  *
8137  * ****************************************************************/
8138
8139 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg, PdschConfig *storedPdschCfg)
8140 {
8141    uint8_t timeDomIdx;
8142    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
8143
8144    if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
8145    {
8146       if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
8147             PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
8148       {
8149          if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
8150          {
8151             macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
8152                *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
8153          }
8154       }
8155    }
8156    macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
8157    if(cuPdschCfg->pdsch_TimeDomainAllocationList)
8158    {
8159       timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
8160       if(timeDomAlloc->present ==\
8161             PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
8162       {
8163          if(timeDomAlloc->choice.setup)
8164          {
8165             macPdschCfg->numTimeDomRsrcAlloc  = timeDomAlloc->choice.setup->list.count;
8166             for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
8167             {
8168                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 = NULLP;
8169                if(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0)
8170                {
8171                   if(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 == NULL)
8172                   {
8173                      if(storedPdschCfg)
8174                      {
8175                         if(storedPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0)
8176                         {
8177                            macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 =\
8178                            storedPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0;
8179                         }
8180                         else
8181                         {
8182                            DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
8183                         }
8184                      }
8185                      else
8186                      {
8187                         DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
8188                      }
8189                      if(!macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0)
8190                      {
8191                         DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for k0 at extractPdschCfg()");
8192                         return RFAILED;
8193                      }
8194                   }
8195                   *(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0) = \
8196                   *(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0);
8197                }
8198                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
8199                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
8200                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
8201                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
8202             }
8203          }
8204       }
8205    }
8206    macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
8207    if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
8208       macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
8209    if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
8210    {
8211       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
8212       if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
8213       {
8214          if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
8215          {
8216             macPdschCfg->bundlingInfo.StaticBundling.size = \
8217                *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
8218          }
8219       }
8220    }
8221    else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
8222    {
8223       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
8224    }
8225
8226 }
8227
8228 /*******************************************************************
8229  *
8230  * @brief Fills PdschServingCellCfg received by CU
8231  *
8232  * @details
8233  *
8234  *    Function : extractPdschServingCellCfg
8235  *
8236  *    Functionality: Fills PdschCfg received  by CU
8237  *
8238  * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
8239  *             PdschServCellCfg *macUePdschSrvCellCfg
8240  * @return ROK/RFAILED
8241  *
8242  * ****************************************************************/
8243
8244 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
8245 {
8246    if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
8247    {
8248       if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
8249       {
8250          if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
8251          {
8252             *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
8253                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
8254          }
8255          else
8256          {
8257             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB));
8258             if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
8259             {
8260                *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
8261                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
8262             }
8263             else
8264             {
8265                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
8266                return RFAILED;
8267             }
8268          }
8269          if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
8270          {
8271             *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
8272                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
8273          }
8274          else
8275          {
8276             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->codeBlkGrpFlushInd , sizeof(bool));
8277             if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
8278             {
8279                *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
8280                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
8281             }
8282             else
8283             {
8284                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
8285                return RFAILED;
8286             }
8287          }
8288       }
8289    }
8290    if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
8291    {
8292       macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH); 
8293    }
8294    if(cuPdschSrvCellCfg->ext1)
8295    {
8296       if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
8297       {
8298         if(macUePdschSrvCellCfg->maxMimoLayers)
8299         {
8300            *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
8301         }
8302         else
8303         {
8304            DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
8305            if(macUePdschSrvCellCfg->maxMimoLayers)
8306            {
8307               *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
8308            }
8309            else
8310            {
8311               DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
8312               return RFAILED;
8313            }
8314         }
8315       }
8316    }
8317    if(cuPdschSrvCellCfg->xOverhead)
8318    {
8319       if(macUePdschSrvCellCfg->xOverhead)
8320       {
8321          *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
8322       }
8323       else
8324       {
8325          DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(PdschXOverhead));
8326          if(macUePdschSrvCellCfg->xOverhead)
8327          {
8328             *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
8329          }
8330          else
8331          {
8332             DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
8333             return RFAILED;
8334          }
8335       }
8336    }
8337    return ROK;
8338 }
8339
8340 /*******************************************************************
8341  *
8342  * @brief Fills PuschCfg received by CU
8343  *
8344  * @details
8345  *
8346  *    Function : extractPuschCfg
8347  *
8348  *    Functionality: Fills PuschCfg received  by CU
8349  *
8350  * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
8351  *             PuschCfg *macPuschCfg
8352  * @return void
8353  *
8354  * ****************************************************************/
8355
8356 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
8357 {
8358    uint8_t timeDomIdx = 0;
8359    DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
8360    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
8361
8362    if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
8363    {
8364       if(cuPuschCfg->choice.setup)
8365       {
8366          if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
8367          {
8368              macPuschCfg->dataScramblingId = \
8369                 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
8370          }
8371          if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
8372          {
8373             if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
8374             {
8375                if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
8376                {
8377                   dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
8378                   if(dmrsUlCfg->dmrs_AdditionalPosition)
8379                   {
8380                      macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
8381                         *(dmrsUlCfg->dmrs_AdditionalPosition);
8382                   }
8383                   if(dmrsUlCfg->transformPrecodingDisabled)
8384                   {
8385                      if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
8386                      {
8387                         macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
8388                            *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
8389                      }
8390                   }
8391                }
8392             }
8393          }
8394          /*Res Alloc Type for UL */
8395          if(cuPuschCfg->choice.setup->resourceAllocation)
8396          {
8397             macPuschCfg->resourceAllocType = \
8398                cuPuschCfg->choice.setup->resourceAllocation;
8399          }
8400          if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
8401          {
8402             timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
8403             if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
8404             {
8405                if(timeDomAllocList->choice.setup)
8406                {
8407                   macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
8408                   for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
8409                   {
8410                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
8411                         *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
8412                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
8413                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
8414                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
8415                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
8416                   }
8417                }
8418             }
8419          }
8420          if(cuPuschCfg->choice.setup->transformPrecoder)
8421             macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
8422       }
8423    }
8424 }
8425
8426 /*******************************************************************
8427  *
8428  * @brief Function to fill pucch Power Control
8429  *
8430  * @details
8431  *
8432  *    Function : extractPucchPowerControl
8433  *
8434  *    Functionality: Function to fill pucch Power Control
8435  *
8436  * @params[in] PucchPowerControl *pwrCtrl,
8437  *             struct PUCCH_PowerControl *cuPwrCtrlCfg
8438  * @return void
8439  *
8440  * ****************************************************************/
8441
8442 void extractPucchPowerControl(PucchPowerControl *pwrCtrl, struct PUCCH_PowerControl *cuPwrCtrlCfg)
8443 {
8444    uint8_t arrIdx;
8445
8446    if(cuPwrCtrlCfg->deltaF_PUCCH_f0)
8447       pwrCtrl->deltaF_Format0 = *cuPwrCtrlCfg->deltaF_PUCCH_f0;
8448    if(cuPwrCtrlCfg->deltaF_PUCCH_f1)
8449       pwrCtrl->deltaF_Format1 = *cuPwrCtrlCfg->deltaF_PUCCH_f1;
8450    if(cuPwrCtrlCfg->deltaF_PUCCH_f2)
8451       pwrCtrl->deltaF_Format2 = *cuPwrCtrlCfg->deltaF_PUCCH_f2;
8452    if(cuPwrCtrlCfg->deltaF_PUCCH_f3)
8453       pwrCtrl->deltaF_Format3 = *cuPwrCtrlCfg->deltaF_PUCCH_f3;
8454    if(cuPwrCtrlCfg->deltaF_PUCCH_f4)
8455       pwrCtrl->deltaF_Format4 = *cuPwrCtrlCfg->deltaF_PUCCH_f4;
8456    if(cuPwrCtrlCfg->p0_Set)
8457    {
8458       pwrCtrl->p0SetCount = cuPwrCtrlCfg->p0_Set->list.count;
8459       for(arrIdx=0; arrIdx < pwrCtrl->p0SetCount; arrIdx++)
8460       {
8461          pwrCtrl->p0Set[arrIdx].p0PucchId =\
8462             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Id;
8463          pwrCtrl->p0Set[arrIdx].p0PucchVal =\
8464             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Value;
8465       }
8466    }
8467    if(cuPwrCtrlCfg->pathlossReferenceRSs)
8468    {
8469       pwrCtrl->pathLossRefRSListCount = cuPwrCtrlCfg->pathlossReferenceRSs->list.count;
8470       for(arrIdx = 0; arrIdx < pwrCtrl->pathLossRefRSListCount; arrIdx++)
8471       {
8472          pwrCtrl->pathLossRefRSList[arrIdx].pathLossRefRSId =\
8473             cuPwrCtrlCfg->pathlossReferenceRSs->list.array[arrIdx]->pucch_PathlossReferenceRS_Id;
8474       }
8475    }
8476 }
8477  
8478  /*******************************************************************
8479  *
8480  * @brief Function to extractResrcSetToAddModList sent by CU
8481  *
8482  * @details
8483  *
8484  *    Function : extractResrcSetToAddModList
8485  *
8486  *    Functionality: Fucntion to extractResrcSetToAddModList
8487  *
8488  * @params[in] PucchResrcSetCfg pointer,
8489  *             struct PUCCH_Config__resourceSetToAddModList pointer
8490  * @return void
8491  *
8492  * ****************************************************************/
8493
8494 void extractResrcSetToAddModList(PucchResrcSetCfg *macRsrcSetList, struct PUCCH_Config__resourceSetToAddModList *cuRsrcSetList)
8495 {
8496    uint8_t arrIdx, rsrcListIdx;
8497
8498    macRsrcSetList->resrcSetToAddModListCount = cuRsrcSetList->list.count; 
8499    for(arrIdx = 0; arrIdx < macRsrcSetList->resrcSetToAddModListCount; arrIdx++)
8500    {
8501       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcSetId     =\
8502          cuRsrcSetList->list.array[arrIdx]->pucch_ResourceSetId;
8503       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount =\
8504          cuRsrcSetList->list.array[arrIdx]->resourceList.list.count;
8505       for(rsrcListIdx = 0; rsrcListIdx < macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount; rsrcListIdx++)
8506       {
8507          macRsrcSetList->resrcSetToAddModList[arrIdx].resrcList[rsrcListIdx] =\
8508             *cuRsrcSetList->list.array[arrIdx]->resourceList.list.array[rsrcListIdx];
8509       }
8510       macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\
8511          *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1;
8512    }
8513 }/* End of extractResrcSetToAddModList */
8514
8515 /*******************************************************************
8516  *
8517  * @brief Fills extractResrcToAddModList sent by CU
8518  *
8519  * @details
8520  *
8521  *    Function : extractResrcToAddModList
8522  *
8523  *    Functionality: Fills extractResrcToAddModList
8524  *
8525  * @params[in] PucchResrcCfg pointer,
8526  *             struct PUCCH_Config__resourceToAddModList pointer
8527  * @return ROk/RFAILED
8528  *
8529  * ****************************************************************/
8530
8531 uint8_t extractResrcToAddModList(PucchResrcCfg *macResrcList, struct PUCCH_Config__resourceToAddModList *cuResrcList)
8532 {
8533    uint8_t arrIdx;
8534    
8535    macResrcList->resrcToAddModListCount = cuResrcList->list.count;
8536    for(arrIdx = 0; arrIdx < macResrcList->resrcToAddModListCount; arrIdx++)
8537    {
8538       macResrcList->resrcToAddModList[arrIdx].resrcId      =\
8539         cuResrcList->list.array[arrIdx]->pucch_ResourceId; 
8540       macResrcList->resrcToAddModList[arrIdx].startPrb     =\
8541         cuResrcList->list.array[arrIdx]->startingPRB;
8542       if(cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping)
8543       {
8544          macResrcList->resrcToAddModList[arrIdx].intraFreqHop =\
8545            *cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping;
8546       }
8547       if(cuResrcList->list.array[arrIdx]->secondHopPRB)
8548       {
8549          macResrcList->resrcToAddModList[arrIdx].secondPrbHop =\
8550            *cuResrcList->list.array[arrIdx]->secondHopPRB;
8551       }
8552       /* PUCCH RSRC FORMAT */
8553       if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format0)
8554       {
8555          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_0;
8556          if(cuResrcList->list.array[arrIdx]->format.choice.format0)
8557          {
8558             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0, sizeof(PucchFormat0));
8559             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0 == NULLP)
8560             {
8561                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format0 in extractResrcToAddModList()");
8562                return RFAILED;
8563             }
8564             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->initialCyclicShift =\
8565                cuResrcList->list.array[arrIdx]->format.choice.format0->initialCyclicShift;
8566             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->numSymbols =\
8567                cuResrcList->list.array[arrIdx]->format.choice.format0->nrofSymbols;
8568             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->startSymbolIdx =\
8569                cuResrcList->list.array[arrIdx]->format.choice.format0->startingSymbolIndex;
8570          }
8571       }
8572       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format1)
8573       {
8574          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_1;
8575          if(cuResrcList->list.array[arrIdx]->format.choice.format1)
8576          {
8577             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1, sizeof(PucchFormat1));
8578             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1 == NULLP)
8579             {
8580                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format1 in extractResrcToAddModList()");
8581                return RFAILED;
8582             }
8583             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->initialCyclicShift =\
8584                 cuResrcList->list.array[arrIdx]->format.choice.format1->initialCyclicShift;
8585             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->numSymbols =\
8586                 cuResrcList->list.array[arrIdx]->format.choice.format1->nrofSymbols;
8587             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->startSymbolIdx =\
8588                 cuResrcList->list.array[arrIdx]->format.choice.format1->startingSymbolIndex;
8589             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->timeDomOCC =\
8590                 cuResrcList->list.array[arrIdx]->format.choice.format1->timeDomainOCC;
8591          }
8592       }
8593       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format2)
8594       {
8595          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_2;
8596          if(cuResrcList->list.array[arrIdx]->format.choice.format2)
8597          {
8598             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2, sizeof(PucchFormat2_3));
8599             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2 == NULLP)
8600             {
8601                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format2 in extractResrcToAddModList()");
8602                return RFAILED;
8603             }
8604             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numPrbs =\
8605                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofPRBs;
8606             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numSymbols =\
8607                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofSymbols;
8608             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->startSymbolIdx =\
8609                 cuResrcList->list.array[arrIdx]->format.choice.format2->startingSymbolIndex;
8610          }
8611       }
8612       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format3)
8613       {
8614          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_3;
8615          if(cuResrcList->list.array[arrIdx]->format.choice.format3)
8616          {
8617             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3, sizeof(PucchFormat2_3));
8618             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3 == NULLP)
8619             {
8620                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format3 in extractResrcToAddModList()");
8621                return RFAILED;
8622             }
8623             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numPrbs =\
8624                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofPRBs;
8625             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numSymbols =\
8626                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofSymbols;
8627             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->startSymbolIdx =\
8628                 cuResrcList->list.array[arrIdx]->format.choice.format3->startingSymbolIndex;
8629          }
8630       }
8631       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format4)
8632       {
8633          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_4;
8634          if(cuResrcList->list.array[arrIdx]->format.choice.format4)
8635          {
8636             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4, sizeof(PucchFormat4));
8637             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4 == NULLP)
8638             {
8639                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format4 in extractResrcToAddModList()");
8640                return RFAILED;
8641             }
8642             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->numSymbols =\
8643                 cuResrcList->list.array[arrIdx]->format.choice.format4->nrofSymbols;
8644             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occLen =\
8645                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Length;
8646             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occIdx =\
8647                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Index;
8648             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->startSymbolIdx =\
8649                 cuResrcList->list.array[arrIdx]->format.choice.format4->startingSymbolIndex;
8650          }
8651       }
8652    }
8653    return ROK;
8654
8655 }/* End of extractResrcToAddModList */
8656
8657 /*******************************************************************
8658  *
8659  * @brief Fills fillPucchSchedReqPeriodAndOffset sent by CU
8660  *
8661  * @details
8662  *
8663  *    Function : fillPucchSchedReqPeriodAndOffset
8664  *
8665  *    Functionality: To fillPucchSchedReqPeriodAndOffset
8666  *
8667  * @params[in] macPeriodicty,
8668  *     SchedulingRequestResourceConfig__periodicityAndOffset pointer
8669  * @return void
8670  *
8671  * ****************************************************************/
8672
8673 void fillPucchSchedReqPeriodAndOffset(uint8_t macPeriodicty, uint16_t  macOffset,\
8674    struct SchedulingRequestResourceConfig__periodicityAndOffset *cuPeriodicty)
8675 {
8676    macPeriodicty = cuPeriodicty->present;
8677    switch(macPeriodicty)
8678    {
8679       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2:
8680          {
8681             macOffset     = cuPeriodicty->choice.sym2;
8682             break;
8683          }
8684       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7:
8685          {
8686             macOffset     = cuPeriodicty->choice.sym6or7;
8687             break;
8688          }
8689       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
8690          {
8691             macOffset     = cuPeriodicty->choice.sl1;
8692             break;
8693          }
8694       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
8695          {
8696             macOffset = cuPeriodicty->choice.sl2;
8697             break;
8698          }
8699       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
8700          {
8701             macOffset = cuPeriodicty->choice.sl4;
8702             break;
8703          }
8704       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
8705          {
8706             macOffset = cuPeriodicty->choice.sl5;
8707             break;
8708          }
8709       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
8710          {
8711             macOffset = cuPeriodicty->choice.sl8;
8712             break;
8713          }
8714       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
8715          {
8716             macOffset = cuPeriodicty->choice.sl10;
8717             break;
8718          }
8719       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
8720          {
8721             macOffset = cuPeriodicty->choice.sl16;
8722             break;
8723          }
8724       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
8725          {
8726             macOffset = cuPeriodicty->choice.sl20;
8727             break;
8728          }
8729       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
8730          {
8731             macOffset = cuPeriodicty->choice.sl40;
8732             break;
8733          }
8734       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
8735          {
8736             macOffset = cuPeriodicty->choice.sl80;
8737             break;
8738          }
8739       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
8740          {
8741             macOffset = cuPeriodicty->choice.sl160;
8742             break;
8743          }
8744       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
8745          {
8746             macOffset = cuPeriodicty->choice.sl320;
8747             break;
8748          }
8749       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
8750          {
8751             macOffset = cuPeriodicty->choice.sl640;
8752             break;
8753          }
8754       default :
8755          DU_LOG("\nERROR  -->  F1AP : Invalid periodicity %d", macPeriodicty);
8756    }
8757 }
8758
8759 /*******************************************************************
8760  *
8761  * @brief Function to extractPucchFormatCfg sent by CU
8762  *
8763  * @details
8764  *
8765  *    Function : extractPucchFormatCfg
8766  *
8767  *    Functionality: Function to extractPucchFormatCfg
8768  *
8769  * @params[in] PucchFormatCfg pointer,
8770  *             PUCCH_FormatConfig_t pointer
8771  * @return void
8772  *
8773  * ****************************************************************/
8774
8775 void extractPucchFormatCfg(PucchFormatCfg *macFormatCfg, PUCCH_FormatConfig_t *cuFormatCfg)
8776  {
8777     if(cuFormatCfg->interslotFrequencyHopping)
8778        macFormatCfg->interSlotFreqHop = *cuFormatCfg->interslotFrequencyHopping;
8779     if(cuFormatCfg->additionalDMRS)  
8780        macFormatCfg->addDmrs = *cuFormatCfg->additionalDMRS;
8781     if(cuFormatCfg->maxCodeRate)
8782        macFormatCfg->maxCodeRate = *cuFormatCfg->maxCodeRate;
8783     if(cuFormatCfg->nrofSlots)  
8784        macFormatCfg->numSlots = *cuFormatCfg->nrofSlots;
8785     if(cuFormatCfg->pi2BPSK)  
8786        macFormatCfg->pi2BPSK = *cuFormatCfg->pi2BPSK;
8787     if(cuFormatCfg->simultaneousHARQ_ACK_CSI)  
8788        macFormatCfg->harqAckCSI = *cuFormatCfg->simultaneousHARQ_ACK_CSI;
8789  }/* End of extractPucchFormatCfg */
8790
8791 /*******************************************************************
8792  *
8793  * @brief Function to extractSchedReqCfgToAddMod sent by CU
8794  *
8795  * @details
8796  *
8797  *    Function : extractSchedReqCfgToAddMod
8798  *
8799  *    Functionality: Function to extractSchedReqCfgToAddMod
8800  *
8801  * @params[in] PucchSchedReqCfg pointer,
8802  *      PUCCH_Config__schedulingRequestResourceToAddModList pointer
8803  * @return void
8804  *
8805  * ****************************************************************/
8806
8807 void extractSchedReqCfgToAddMod(PucchSchedReqCfg *macSchedReqCfg, struct PUCCH_Config__schedulingRequestResourceToAddModList *cuSchedReqList)
8808 {
8809    uint8_t arrIdx;
8810
8811    macSchedReqCfg->schedAddModListCount = cuSchedReqList->list.count;
8812    for(arrIdx = 0; arrIdx <  macSchedReqCfg->schedAddModListCount; arrIdx++)
8813    {
8814       macSchedReqCfg->schedAddModList[arrIdx].resrcId =\
8815          cuSchedReqList->list.array[arrIdx]->schedulingRequestResourceId;
8816       macSchedReqCfg->schedAddModList[arrIdx].requestId =\
8817          cuSchedReqList->list.array[arrIdx]->schedulingRequestID;
8818       if(cuSchedReqList->list.array[arrIdx]->periodicityAndOffset)
8819       {
8820          fillPucchSchedReqPeriodAndOffset(macSchedReqCfg->schedAddModList[arrIdx].periodicity,\
8821             macSchedReqCfg->schedAddModList[arrIdx].offset, cuSchedReqList->list.array[arrIdx]->periodicityAndOffset);
8822       }
8823       if(cuSchedReqList->list.array[arrIdx]->resource)
8824       {
8825          macSchedReqCfg->schedAddModList[arrIdx].resrc =\
8826             *cuSchedReqList->list.array[arrIdx]->resource;
8827       }
8828    }
8829
8830 }/* End of extractSchedReqCfgToAddMod */
8831
8832  /*******************************************************************
8833  *
8834  * @brief Fills PucchCfg received by CU
8835  *
8836  * @details
8837  *
8838  *    Function : extractPucchCfg
8839  *
8840  *    Functionality: Fills PucchCfg received  by CU
8841  *
8842  * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg = Information which
8843  *                is send by CU, which we have stored in F1UeContextSetupDb,
8844  *             PucchCfg *macPucchCfg = Used to Store the information which
8845  *                needs to send in other layer, as well as this can be the variable
8846  *                which stores the information in DuCb,
8847  *             PucchCfg *storedPucchCfg = Null in case of sending the
8848  *                information to other layer else it will have Pucch Cfg which
8849  *                we have stored in copyOfmacUeCfg.
8850  * @return ROK/RFAILED
8851  *
8852  * ****************************************************************/
8853
8854 uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg,\
8855 PucchCfg *storedPucchCfg)        
8856 {
8857    uint8_t arrIdx;
8858
8859    if(cuPucchCfg->present == BWP_UplinkDedicated__pucch_Config_PR_setup)
8860    {
8861       if(cuPucchCfg->choice.setup)
8862       {
8863          /* Resource Set Cfg */ 
8864          if(cuPucchCfg->choice.setup->resourceSetToAddModList)
8865          {
8866             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrcSet, sizeof(PucchResrcSetCfg));
8867             if(macPucchCfg->resrcSet == NULLP)
8868             {
8869                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc set List in extractPucchCfg()");
8870                return RFAILED;
8871             }
8872             memset(macPucchCfg->resrcSet, 0, sizeof(PucchResrcSetCfg));
8873             extractResrcSetToAddModList(macPucchCfg->resrcSet, cuPucchCfg->choice.setup->resourceSetToAddModList);
8874          }
8875          
8876          /* Resource Cfg */ 
8877          if(cuPucchCfg->choice.setup->resourceToAddModList)
8878          {
8879             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrc, sizeof(PucchResrcCfg));
8880             if(macPucchCfg->resrc == NULLP)
8881             {
8882                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc List in extractPucchCfg()");
8883                return RFAILED;
8884             }
8885             memset(macPucchCfg->resrc, 0, sizeof(PucchResrcCfg));
8886             extractResrcToAddModList(macPucchCfg->resrc, cuPucchCfg->choice.setup->resourceToAddModList);
8887          }
8888          
8889          /* Format 1 Cfg */ 
8890          if(cuPucchCfg->choice.setup->format1)
8891          {
8892             DU_ALLOC_SHRABL_BUF(macPucchCfg->format1, sizeof(PucchFormatCfg));
8893             if(macPucchCfg->format1 == NULLP)
8894             {
8895                DU_LOG("\nERROR --> F1AP : Failed to extract format 1 Cfg in  extractPucchCfg()");
8896                return RFAILED;
8897             }
8898             memset(macPucchCfg->format1, 0, sizeof(PucchFormatCfg));
8899             extractPucchFormatCfg(macPucchCfg->format1,\
8900                cuPucchCfg->choice.setup->format1->choice.setup);
8901          }
8902          
8903          /* Format 2 Cfg */
8904          if(cuPucchCfg->choice.setup->format2)
8905          {
8906             DU_ALLOC_SHRABL_BUF(macPucchCfg->format2, sizeof(PucchFormatCfg));
8907             if(macPucchCfg->format2 == NULLP)
8908             {
8909                DU_LOG("\nERROR --> F1AP : Failed to extract format 2 Cfg in  extractPucchCfg()");
8910                return RFAILED;
8911             }
8912             memset(macPucchCfg->format2, 0, sizeof(PucchFormatCfg));
8913             extractPucchFormatCfg(macPucchCfg->format2,\
8914                cuPucchCfg->choice.setup->format2->choice.setup);
8915          }
8916          
8917          /* Format 3 Cfg */
8918          if(cuPucchCfg->choice.setup->format3)
8919          {
8920             DU_ALLOC_SHRABL_BUF(macPucchCfg->format3, sizeof(PucchFormatCfg));
8921             if(macPucchCfg->format3 == NULLP)
8922             {
8923                DU_LOG("\nERROR --> F1AP : Failed to extract format 3 Cfg in  extractPucchCfg()");
8924                return RFAILED;
8925             }
8926             memset(macPucchCfg->format3, 0, sizeof(PucchFormatCfg));
8927             extractPucchFormatCfg(macPucchCfg->format3,\
8928                cuPucchCfg->choice.setup->format3->choice.setup);
8929          }
8930
8931          /* Format 4 Cfg */
8932          if(cuPucchCfg->choice.setup->format4)
8933          {
8934             DU_ALLOC_SHRABL_BUF(macPucchCfg->format4, sizeof(PucchFormatCfg));
8935             if(macPucchCfg->format4 == NULLP)
8936             {
8937                DU_LOG("\nERROR --> F1AP : Failed to extract format 4 Cfg in  extractPucchCfg()");
8938                return RFAILED;
8939             }
8940             memset(macPucchCfg->format4, 0, sizeof(PucchFormatCfg));
8941             extractPucchFormatCfg(macPucchCfg->format4,\
8942                cuPucchCfg->choice.setup->format4->choice.setup);
8943          }
8944
8945          /* Sched Req List */
8946          if(cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList)
8947          {
8948             DU_ALLOC_SHRABL_BUF(macPucchCfg->schedReq, sizeof(PucchSchedReqCfg));
8949             if(macPucchCfg->schedReq == NULLP)
8950             {
8951                DU_LOG("\nERROR --> F1AP : Failed to extract schedReqCfg in  extractPucchCfg()");
8952                return RFAILED;
8953             }
8954             memset(macPucchCfg->schedReq, 0, sizeof(PucchSchedReqCfg));
8955             extractSchedReqCfgToAddMod(macPucchCfg->schedReq,\
8956             cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList);
8957          }
8958
8959          /*TODO: Add support for  Spatial Info */
8960
8961          /* MultiCsiCfg */
8962          if(cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList)
8963          {
8964             DU_ALLOC_SHRABL_BUF(macPucchCfg->multiCsiCfg, sizeof(PucchMultiCsiCfg));
8965             if(macPucchCfg->multiCsiCfg == NULLP)
8966             {
8967                DU_LOG("\nERROR --> F1AP : Failed to extract multiCsiCfg in  extractPucchCfg()");
8968                return RFAILED;
8969             }
8970             memset(macPucchCfg->multiCsiCfg, 0, sizeof(PucchMultiCsiCfg));
8971             macPucchCfg->multiCsiCfg->multiCsiResrcListCount = cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.count;
8972             for(arrIdx =0; arrIdx < macPucchCfg->multiCsiCfg->multiCsiResrcListCount; arrIdx++)
8973             {
8974                macPucchCfg->multiCsiCfg->multiCsiResrcList[arrIdx] =\
8975                  *cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.array[arrIdx];
8976             }
8977          }
8978
8979          /* Dl_DataToUL_ACK */ 
8980          if(cuPucchCfg->choice.setup->dl_DataToUL_ACK)
8981     {
8982        if(storedPucchCfg)
8983        {
8984           if(storedPucchCfg->dlDataToUlAck)
8985           {
8986              macPucchCfg->dlDataToUlAck = storedPucchCfg->dlDataToUlAck; 
8987           }
8988           else
8989           {
8990             DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
8991           }
8992        }
8993        else
8994        {
8995           DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
8996        }
8997        if(macPucchCfg->dlDataToUlAck == NULLP)
8998        {
8999           DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
9000           return RFAILED;
9001        }
9002        memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
9003        macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
9004        for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
9005        {
9006           macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
9007           *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
9008        }
9009          }
9010
9011          /* Power Control */
9012          if(cuPucchCfg->choice.setup->pucch_PowerControl)
9013          {
9014             DU_ALLOC_SHRABL_BUF(macPucchCfg->powerControl, sizeof(PucchPowerControl));
9015             if(macPucchCfg->powerControl == NULLP)
9016             {
9017                DU_LOG("\nERROR --> F1AP : Failed to extract power control in extractPucchCfg()");
9018                return RFAILED;
9019             }
9020             extractPucchPowerControl(macPucchCfg->powerControl,\
9021                cuPucchCfg->choice.setup->pucch_PowerControl);
9022          }
9023       }
9024    }
9025    return ROK;
9026 }
9027
9028 /*******************************************************************
9029  *
9030  * @brief Fills ServingCellReconfig received by CU
9031  *
9032  * @details
9033  *
9034  *    Function : extractSpCellDedicatedCfg
9035  *
9036  *    Functionality: Fills ServingCellReconfig received  by CU
9037  *
9038  * @params[in] ServingCellConfig_t *cuSrvCellCfg = Information which is send by
9039  *                  CU, which we have stored in F1UeContextSetupDb,
9040  *             ServCellCfgInfo *macSrvCellCfg = Used to Store the information
9041  *                  which  needs to send in other layer, as well as this can be the
9042  *                  variable which stores the information in DuCb, 
9043  *             ServCellCfgInfo *storedSrvCellCfg = Null in case of sending the
9044  *                  information to other layer else it will have ServCellCfgInfo which
9045  *                  we have stored in copyOfmacUeCfg.
9046  * @return ROK/RFAILD
9047  *
9048  * ****************************************************************/
9049 uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg,\
9050 ServCellCfgInfo *storedSrvCellCfg)
9051 {
9052    uint8_t ret = ROK;
9053    BWP_DownlinkDedicated_t *dlBwp = NULLP;
9054    BWP_UplinkDedicated_t   *ulBwp = NULLP;
9055
9056    if(cuSrvCellCfg->initialDownlinkBWP)
9057    {
9058       dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
9059       if(dlBwp->pdcch_Config)
9060       {
9061          if(dlBwp->pdcch_Config->choice.setup)
9062          {
9063             macSrvCellCfg->initDlBwp.pdcchPresent = true;
9064             extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
9065          }
9066       }
9067       if(dlBwp->pdsch_Config)
9068       {
9069          if(dlBwp->pdsch_Config->choice.setup)
9070          {
9071             macSrvCellCfg->initDlBwp.pdschPresent = true;
9072             
9073             if(storedSrvCellCfg)
9074             {
9075                if(!storedSrvCellCfg->initDlBwp.pdschPresent)
9076                {
9077                   extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg, NULL);
9078                }
9079                else
9080                {
9081                   extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg,\
9082                         &storedSrvCellCfg->initDlBwp.pdschCfg);
9083                }
9084             }
9085             else
9086             {
9087                extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg, NULL);
9088             }
9089          }
9090       }
9091    }
9092    if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
9093       macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
9094    if(cuSrvCellCfg->defaultDownlinkBWP_Id)
9095       macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
9096    if(cuSrvCellCfg->bwp_InactivityTimer)
9097    {
9098       if(macSrvCellCfg->bwpInactivityTmr)
9099       {
9100          memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
9101       }
9102       else
9103       {
9104          macSrvCellCfg->bwpInactivityTmr = NULLP;
9105          DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
9106          if(macSrvCellCfg->bwpInactivityTmr)
9107          {
9108             memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
9109          }
9110          else
9111          {
9112             DU_LOG("\nERROR  --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
9113             return RFAILED;
9114          }
9115       }
9116    }
9117    if(cuSrvCellCfg->pdsch_ServingCellConfig)
9118    {
9119       if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
9120       {
9121          ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
9122          if(ret == RFAILED)
9123          {
9124             DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
9125             return RFAILED;
9126          }
9127       }
9128    }
9129    if(cuSrvCellCfg->uplinkConfig)
9130    {
9131       if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
9132       {
9133          ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
9134          if(ulBwp->pusch_Config)
9135          {
9136             macSrvCellCfg->initUlBwp.puschPresent = true;
9137             extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
9138          }
9139          if(ulBwp->pucch_Config)
9140          {
9141             macSrvCellCfg->initUlBwp.pucchPresent = true;
9142             memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
9143             if(storedSrvCellCfg)
9144             {
9145                if(!storedSrvCellCfg->initUlBwp.pucchPresent)
9146                   extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg, NULL);
9147                else
9148                   extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg,\
9149                   &storedSrvCellCfg->initUlBwp.pucchCfg);
9150             }
9151             else
9152             {
9153                extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg, NULL);
9154             }
9155          }
9156       }
9157       if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
9158          macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
9159    }
9160    return ret;
9161 }
9162 /*******************************************************************
9163  *
9164  * @brief Fills Reconfig Cell group Info received by CU
9165  *
9166  * @details
9167  *
9168  *    Function : extractUeReCfgCellInfo
9169  *
9170  *    Functionality: Fills Reconfig Cell group Info received by CU
9171  *   
9172  * @params[in] CellGroupConfigRrc_t *cellGrp = CellGroupConfigRrc_t information which
9173  *                       is send by CU, which we have stored in F1UeContextSetupDb
9174  *             MacUeCfg *MacUeCfg = Used to Store the information,
9175  *                      which needs to send in other layer, as well as this can be
9176  *                      the variable which stores the information in DuCb,
9177  *             MacUeCfg *storedMacUeCfg = Null in case of sending the
9178  *                      information to other layer else it will have copyOfmacUeCfg
9179  *                      which we have stored in F1UeContextSetupDb.
9180  *
9181  * @return ROK/RFAILED
9182  *
9183  * ****************************************************************/
9184 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg, MacUeCfg *storedMacUeCfg)
9185 {
9186    uint8_t ret = ROK;
9187    MAC_CellGroupConfig_t     *macCellGroup = NULLP;
9188    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
9189    SpCellConfig_t            *spcellCfg = NULLP;
9190    ServingCellConfig_t       *servCellCfg = NULLP;
9191
9192    if(cellGrp)
9193    {
9194       /* Fill MacCell Group Reconfig  */
9195       if(cellGrp->mac_CellGroupConfig)
9196       {
9197          macUeCfg->macCellGrpCfgPres = true;
9198          macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
9199          if(macCellGroup->schedulingRequestConfig)
9200          {
9201             extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
9202          }
9203          if(macCellGroup->tag_Config)
9204          {
9205             extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
9206          }
9207          if(macCellGroup->bsr_Config)
9208          {
9209             macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
9210             macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer     = macCellGroup->bsr_Config->retxBSR_Timer;
9211             if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
9212             {
9213                macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer  =\
9214                *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
9215             }
9216          }
9217          if(macCellGroup->phr_Config)
9218          {
9219             if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
9220             {
9221                macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
9222                if(macCellGroup->phr_Config->choice.setup)
9223                {
9224                   macUeCfg->macCellGrpCfg.phrCfg.periodicTimer     = \
9225                   macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
9226                   macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer     = \
9227                   macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
9228                   macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor     = \
9229                   macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
9230                   macUeCfg->macCellGrpCfg.phrCfg.multiplePHR       = \
9231                   macCellGroup->phr_Config->choice.setup->multiplePHR;
9232                   macUeCfg->macCellGrpCfg.phrCfg.dummy             = \
9233                   macCellGroup->phr_Config->choice.setup->dummy;
9234                   macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
9235                   macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
9236                   macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG        = \
9237                   macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
9238                }
9239             }
9240          }
9241       }
9242       /* Fill Physical Cell Group Reconfig */
9243       if(cellGrp->physicalCellGroupConfig)
9244       {
9245          macUeCfg->phyCellGrpCfgPres = true;
9246          phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
9247          if(phyCellGrpCfg->p_NR_FR1)
9248          {
9249             if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
9250                macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
9251          }
9252          macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
9253       }
9254       /* Fill SpCell Reconfig */
9255       if(cellGrp->spCellConfig)
9256       {
9257          macUeCfg->spCellCfgPres = true;
9258          spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));  
9259          if(spcellCfg->servCellIndex)
9260          {
9261             macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
9262          }
9263          /* Fill Serving cell Reconfig info */
9264          if(cellGrp->spCellConfig->spCellConfigDedicated)
9265          {
9266             servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
9267             if(storedMacUeCfg)
9268             {
9269                if(!storedMacUeCfg->spCellCfgPres)
9270                   ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg, NULL);
9271                else
9272                   ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg,\
9273                         &storedMacUeCfg->spCellCfg.servCellCfg);
9274             }
9275             else
9276             {
9277                ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg, NULL);
9278             }
9279             if(ret == RFAILED)
9280             {
9281                DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
9282             }
9283          }
9284       }
9285    }
9286    return ret;
9287 }
9288 /*******************************************************************
9289 *
9290 * @brief free the memory allocated by decoder
9291 *
9292 * @details
9293 *
9294 *    Function : freeAperDecodeNrcgi 
9295 *
9296 *    Functionality: Free Nrcgi values
9297 *
9298 * @params[in] NRCGI_t *nrcgi
9299 * @return void
9300 *
9301 * ****************************************************************/
9302
9303
9304 void freeAperDecodeNrcgi(NRCGI_t *nrcgi)
9305 {
9306     if(nrcgi->pLMN_Identity.buf != NULLP)
9307     {
9308        free(nrcgi->pLMN_Identity.buf);
9309     }
9310     if(nrcgi->nRCellIdentity.buf != NULLP)
9311     {
9312        free(nrcgi->nRCellIdentity.buf);
9313     }
9314 }
9315 /*******************************************************************
9316 *
9317 * @brief free the memory allocated by decoder
9318 *
9319 * @details
9320 *
9321 *    Function : freeAperDecodeCuToDuInfo 
9322 *
9323 *    Functionality:  Free Cu To Du Information
9324 *
9325 * @params[in] CUtoDURRCInformation_t *rrcMsg
9326 * @return void
9327 *
9328 * ****************************************************************/
9329
9330
9331 void freeAperDecodeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
9332 {
9333    uint8_t ieIdx =0;
9334    uint8_t arrIdx =0;
9335
9336    if(rrcMsg->uE_CapabilityRAT_ContainerList)
9337    {
9338       if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
9339          free(rrcMsg->uE_CapabilityRAT_ContainerList->buf);
9340       free(rrcMsg->uE_CapabilityRAT_ContainerList);
9341    }
9342
9343    if(rrcMsg->iE_Extensions)
9344    {
9345       if(rrcMsg->iE_Extensions->list.array)
9346       {
9347          for(ieIdx= 0; ieIdx < rrcMsg->iE_Extensions->list.count; ieIdx++)
9348          {
9349             if(rrcMsg->iE_Extensions->list.array[ieIdx])
9350             {
9351                switch(rrcMsg->iE_Extensions->list.array[ieIdx]->id)
9352                {
9353                   case ProtocolIE_ID_id_CellGroupConfig:
9354                      if(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
9355                      {
9356                         free(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf);
9357                      }
9358                      break;
9359                   default:
9360                      DU_LOG("\nERROR  -->  F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
9361                            rrcMsg->iE_Extensions->list.array[ieIdx]->id);
9362                      break;
9363                }
9364             }
9365          }
9366          for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
9367          {
9368             free(rrcMsg->iE_Extensions->list.array[arrIdx]);
9369          }
9370          free(rrcMsg->iE_Extensions->list.array);
9371
9372       }
9373
9374       free(rrcMsg->iE_Extensions);
9375    }
9376 }
9377 /*******************************************************************
9378 *
9379 * @brief free the memory allocated by decoder
9380 *
9381 * @details 
9382 *
9383 *    Function : freeAperDecodeSplCellList
9384 *
9385 *    Functionality: Free Spl Cell List 
9386                     where memory allocated by aper_decoder
9387 *
9388 * @params[in]  SCell_ToBeSetup_List_t *spCellLst
9389 * @return void
9390 *
9391 * ****************************************************************/
9392
9393
9394 void freeAperDecodeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
9395 {
9396     uint8_t  cellIdx =0;
9397
9398     if(spCellLst->list.array != NULLP)
9399     {
9400        for(cellIdx=0; cellIdx<spCellLst->list.count; cellIdx++)
9401        {
9402           if(cellIdx==0&&spCellLst->list.array[cellIdx]!=NULLP)
9403           {
9404              freeAperDecodeNrcgi(&spCellLst->list.array[cellIdx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
9405           }
9406           if(spCellLst->list.array[cellIdx]!=NULLP)
9407           {
9408              free(spCellLst->list.array[cellIdx]);
9409           }
9410        }
9411        free(spCellLst->list.array);
9412     }
9413 }
9414 /*******************************************************************
9415 *
9416 * @brief free the memory allocated by decoder
9417 *
9418 * @details
9419 *
9420 *    Function : freeAperDecodeSRBSetup 
9421 *
9422 *    Functionality: added free part for the memory allocated by aper_decoder
9423 *
9424 * @params[in] SRBs_ToBeSetup_List_t *srbSet
9425 * @return void
9426 *
9427 ****************************************************************/
9428
9429
9430 void freeAperDecodeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
9431 {
9432     uint8_t srbIdx =0;
9433     if(srbSet->list.array != NULLP)
9434     {
9435        for(srbIdx=0; srbIdx<srbSet->list.count; srbIdx++)
9436        {
9437           if(srbSet->list.array[srbIdx]!=NULLP)
9438           {
9439              free(srbSet->list.array[srbIdx]);
9440           }
9441        }
9442        free(srbSet->list.array);
9443     }
9444 }
9445
9446 /*******************************************************************
9447 *
9448 * @brief free the memory allocated by decoder
9449 *
9450 * @details
9451 *
9452 *    Function : freeAperDecodeULTnlInfo
9453 *
9454 *    Functionality: added free part for the memory allocated by aper_decoder
9455 *
9456 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
9457 * @return void
9458 *
9459 * ****************************************************************/
9460
9461
9462 void freeAperDecodeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
9463 {
9464    uint8_t ulIdx=0;
9465    if(ulInfo->list.array != NULLP)
9466    {
9467       for(ulIdx=0; ulIdx<ulInfo->list.count; ulIdx++)
9468       {
9469          if(ulIdx==0&&ulInfo->list.array[ulIdx]!=NULLP)
9470          {
9471             if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
9472             {
9473                if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9474                      transportLayerAddress.buf != NULLP)
9475                {
9476                   if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
9477                         !=NULLP)
9478                   {
9479                      free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf);
9480                   }
9481                   free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
9482                         transportLayerAddress.buf);
9483                }
9484                free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel);
9485             }
9486          }
9487          if(ulInfo->list.array[ulIdx]!=NULLP)
9488          {
9489             free(ulInfo->list.array[ulIdx]);
9490          }
9491       }
9492       free(ulInfo->list.array);
9493    }
9494 }
9495 /*******************************************************************
9496 *
9497 * @brief free the memory allocated by decoder
9498 *
9499 * @details
9500 *
9501 *    Function : freeAperDecodeDRBSetup  
9502 *
9503 *    Functionality: free DRBSetup which is allocated by decoder
9504 *
9505 * @params[in]  DRBs_ToBeSetup_List_t *drbSet
9506 * @return void
9507 *
9508 * ****************************************************************/
9509
9510 void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
9511 {
9512    DRBs_ToBeSetup_Item_t *drbSetItem = NULLP;
9513    uint8_t  flowIdx =0;
9514    uint8_t  drbIdx =0;
9515
9516    if(drbSet->list.array != NULLP)
9517    {
9518       for(drbIdx=0; drbIdx<drbSet->list.count; drbIdx++)
9519       {
9520          if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
9521          {
9522             drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9523             if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
9524             {
9525                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9526                      qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
9527                {
9528                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9529                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9530                   {
9531                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9532                            qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9533                      {
9534
9535                         if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
9536                         {
9537
9538                            if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
9539                            {
9540
9541                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
9542                                     buf!=NULLP)
9543                               {
9544
9545                                  if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
9546                                        flows_Mapped_To_DRB_List.list.array != NULLP)
9547                                  {
9548
9549                                     for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9550                                           DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
9551                                     {
9552
9553                                        if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9554                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9555                                        {
9556                                           if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9557                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9558                                                 qoSFlowLevelQoSParameters.\
9559                                                 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
9560                                           {
9561                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9562                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9563                                                    qoSFlowLevelQoSParameters.\
9564                                                    qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
9565                                              {
9566
9567                                                 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9568                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9569                                                       qoSFlowLevelQoSParameters.\
9570                                                       qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
9571                                                 {
9572
9573
9574                                                    free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9575                                                          DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9576                                                          qoSFlowLevelQoSParameters.\
9577                                                          qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9578                                                 }
9579
9580                                                 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9581                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9582                                                       qoSFlowLevelQoSParameters.\
9583                                                       qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9584                                              }
9585
9586                                              free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9587
9588                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
9589                                                    qoSFlowLevelQoSParameters.\
9590                                                    qoS_Characteristics.choice.non_Dynamic_5QI);
9591                                           }
9592                                        }
9593                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9594                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
9595                                        {
9596
9597                                           free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9598                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
9599                                        }
9600                                     }
9601
9602                                     free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9603                                           DRB_Information.flows_Mapped_To_DRB_List.list.array);
9604                                  }
9605
9606                                  free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
9607                                        DRB_Information.sNSSAI.sD->buf);
9608                               }
9609
9610                               free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
9611                            }
9612
9613                            free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
9614
9615                         }
9616
9617                         free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9618
9619                               qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
9620                      }
9621
9622                      free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9623                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
9624                   }
9625
9626                   free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
9627                         qoS_Characteristics.choice.non_Dynamic_5QI);
9628                }
9629                free(drbSetItem->qoSInformation.choice.choice_extension);
9630             }
9631             freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
9632             if(drbSetItem->uLConfiguration)
9633             {
9634                free(drbSetItem->uLConfiguration);
9635             }
9636          }
9637          if(drbSet->list.array[drbIdx]!=NULLP)
9638          {
9639             free(drbSet->list.array[drbIdx]);
9640          }
9641       }
9642       free(drbSet->list.array);
9643    }
9644 }
9645
9646
9647 /*******************************************************************
9648  *
9649  * @brief builds Mac Cell Cfg
9650  *
9651  * @details
9652  *
9653  *    Function : procUeReCfgCellInfo
9654  *
9655  *    Functionality: builds Mac Cell Cfg
9656  *
9657  * @params[in] MacUeCfg *macUeCfgToSend = Used to Store the information which
9658  *                       needs to send in other layer, as well as this can be
9659  *                       the variable which stores the information in DuCb.
9660  *             MacUeCfg *storedMacUeCfg = Null in case of sending the
9661  *                       information to other layer else it will have copyOfmacUeCfg  
9662  *                       which we have stored in F1UeContextSetupDb
9663  *             void *cellInfo = CellGroupConfigRrc_t information which is send
9664  *                        by CU, which we have stored in F1UeContextSetupDb 
9665  *
9666  * @return void 
9667  *
9668  * ****************************************************************/
9669 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend,MacUeCfg *storedMacUeCfg, void *cellInfo)
9670 {
9671    uint8_t ret = ROK;
9672    CellGroupConfigRrc_t *cellGrp = NULLP;
9673
9674    if(cellInfo)
9675    {
9676       cellGrp = (CellGroupConfigRrc_t *)cellInfo;
9677       ret = extractUeReCfgCellInfo(cellGrp, macUeCfgToSend, storedMacUeCfg);
9678       if(ret == RFAILED)
9679          DU_LOG("\nERROR  -->  F1AP : Failed at procUeReCfgCellInfo()");
9680    }
9681    if(ret == RFAILED)
9682    {
9683       freeUeReCfgCellGrpInfo(macUeCfgToSend);
9684    }
9685    return ret;
9686 }
9687
9688 /*******************************************************************
9689  *
9690  * @brief Filling modulation info in mac ue cfg
9691  *
9692  * @details
9693  *
9694  *    Function : duFillModulationDetails
9695  *
9696  *    Functionality: Filling modulation info in mac ue cfg
9697  *
9698  * @params[in] MAC UE Config to be updated
9699  *             Current UE configuration
9700  *             UE NR capability from CU
9701  * @return ROK     - success
9702  *         RFAILED - failure
9703  *
9704  * ****************************************************************/
9705 void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
9706 {
9707    UE_NR_Capability_t *ueNrCap=NULLP;
9708
9709    if(!ueCap)
9710    {
9711       memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));     
9712       memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9713    }
9714    else
9715    {
9716       ueNrCap = (UE_NR_Capability_t *)ueCap;
9717
9718       /* Filling DL modulation info */
9719       if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
9720          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
9721          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
9722       {
9723          switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
9724          {
9725             case ModulationOrder_qpsk:
9726                {
9727                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
9728                   break;
9729                }
9730             case ModulationOrder_qam16:
9731                {
9732                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
9733                   break;
9734                }
9735             case ModulationOrder_qam64:
9736                {
9737                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
9738                   ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
9739                   ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
9740                   break;
9741                }
9742             case ModulationOrder_qam256:
9743                {
9744                   ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
9745                   break;
9746                }
9747             default:
9748                {
9749                   DU_LOG("\nERROR  -->  DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
9750                   memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9751                   break;
9752                }
9753          }
9754       }
9755       else
9756       {
9757          memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9758       }
9759
9760       /* Filling UL modulation info */
9761       if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
9762          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
9763          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
9764       {
9765          switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
9766          {
9767             case ModulationOrder_qpsk:
9768                {
9769                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
9770                   break;
9771                }
9772             case ModulationOrder_qam16:
9773                {
9774                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
9775                   ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
9776                   ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
9777                   break;
9778                }
9779             case ModulationOrder_qam64:
9780                {
9781                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
9782                   break;
9783                }
9784             case ModulationOrder_qam256:
9785                {
9786                   ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
9787                   break;
9788                }
9789             default:
9790                {
9791                   DU_LOG("\nERROR  -->  DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
9792                   memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9793                   break;
9794                }
9795          }
9796       }
9797       else
9798       {
9799          memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9800       }
9801    }
9802 }
9803
9804 /*******************************************************************
9805  *
9806  * @brief Function to extract cellGrp Info present in cutoDu cont
9807  *
9808  * @details
9809  *
9810  *    Function : extractCellGrpInfo
9811  *
9812  *    Functionality: Function to extract cellGrp Info present
9813  *                   in cutoDu cont
9814  *
9815  * @params[in] ProtocolExtensionContainer_4624P16_t pointer
9816  *
9817  * @return CellGroupConfigRrc_t *
9818  *
9819  * ****************************************************************/
9820
9821 CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
9822       DuUeCfg *ueCfgDb)
9823 {
9824    uint8_t idx2 =0;
9825    uint16_t id =0;
9826    uint16_t recvBufLen =0;
9827    CellGroupConfigRrc_t *cellGrpCfg = NULLP;
9828    CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
9829    asn_dec_rval_t rval; /* Decoder return value */
9830    memset(&rval, 0, sizeof(asn_dec_rval_t));
9831
9832    if(protocolIeExtn)
9833    {
9834       for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++)
9835       {
9836          extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2]));
9837          id = extIeInfo->id;
9838          switch(id)
9839          {
9840             case ProtocolIE_ID_id_CellGroupConfig:
9841             {
9842                recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
9843                /* decoding the CellGroup Buf received */
9844                DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
9845                if(cellGrpCfg)
9846                {
9847                   memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
9848                   rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
9849                      extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
9850                   if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9851                   {
9852                      DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9853                      return NULLP;
9854                   }
9855                   xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
9856                   if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
9857                      return NULLP;
9858                }
9859                break;
9860             }
9861             default:
9862                DU_LOG("\nERROR  -->  F1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id);
9863                break;
9864          }
9865       }
9866    }
9867    return cellGrpCfg;
9868 }
9869
9870 /*******************************************************************
9871  *
9872  * @brief Fills Srb List received by CU
9873  *
9874  * @details
9875  *
9876  *    Function : procSrbListToSetup
9877  *
9878  *    Functionality: Fills Srb List received  by CU
9879  *
9880  * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
9881  *             LcCfg pointer
9882  *             RlcBearerCfg pointer
9883  * @return void
9884  *
9885  * ****************************************************************/
9886 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
9887 {
9888    uint8_t ret = ROK;
9889
9890    /* Filling RLC INFO */
9891    procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
9892
9893    /* Filling MAC INFO */
9894    ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, macLcToAdd, NULL);
9895    if(ret == RFAILED)
9896    { 
9897       DU_LOG("\nERROR  -->  F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
9898       return ret;
9899    }
9900    return ret;
9901 }
9902
9903
9904
9905 /*******************************************************************
9906  *
9907  * @brief extract Srb List received by CU
9908  *
9909  * @details
9910  *
9911  *    Function : extractSrbListToSetup
9912  *
9913  *    Functionality: extract Srb List received by CU
9914  *                   for both MAC and RLC
9915  *
9916  * @params[in] SRBs_ToBeSetup_Item_t pointer
9917  *             DuUeCfg pointer
9918  * @return ROK/RFAIED
9919  *
9920  * ****************************************************************/
9921
9922 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
9923 {
9924    uint8_t ret, srbIdx;
9925    SRBs_ToBeSetup_Item_t *srbItem = NULLP;
9926
9927    if(srbCfg)
9928    {
9929       for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
9930       {
9931          srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
9932          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9933          { 
9934             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in MAC");
9935             ret = RFAILED;
9936             break;
9937          }
9938          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9939          {
9940             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in RLC");
9941             ret = RFAILED;
9942             break;
9943          }
9944          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9945          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9946          ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9947             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
9948          ueCfgDb->numRlcLcs++;
9949          ueCfgDb->numMacLcs++;
9950          if(ret == RFAILED)
9951          {
9952             DU_LOG("\nERROR  -->  F1AP:  Failed at extractSrbListToSetup()");
9953             break;
9954          }
9955       }
9956    }
9957    else
9958       ret = RFAILED;
9959
9960    return ret;
9961 }
9962
9963 /*******************************************************************
9964  *
9965  * @brief Fills Drb List received by CU
9966  *
9967  * @details
9968  *
9969  *    Function : procDrbListToSetup
9970  *
9971  *    Functionality: Fills Drb List received by CU
9972  *                   for both MAC and RLC
9973  *
9974  * @params[in] SRBs_ToBeSetup_Item_t pointer
9975  *             LcCfg pointer,
9976  *             RlcBearerCfg pointer
9977  * @return void
9978  *
9979  * ****************************************************************/
9980
9981 uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\
9982 DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo)
9983 {
9984
9985    if(drbItem != NULLP)
9986    {
9987       /* Filling RLC INFO */
9988       procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
9989
9990       /* Filling MAC INFO */
9991       if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK)
9992       { 
9993          DU_LOG("\nERROR  --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
9994          return RFAILED;
9995       }
9996    }
9997    else if(drbSetupModItem != NULLP)
9998    {
9999       procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
10000
10001       if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, macLcToAdd, upTnlInfo) != ROK)
10002       {
10003          DU_LOG("\nERROR  --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
10004          return RFAILED;
10005       }
10006    }
10007    return ROK;
10008 }
10009
10010 /*******************************************************************
10011  *
10012  * @brief extract Drb List received by CU
10013  *
10014  * @details
10015  *
10016  *    Function : extractDrbListToSetup
10017  *
10018  *    Functionality: extract Drb List received by CU
10019  *                   for both MAC and RLC
10020  *
10021  * @params[in] DRBs_ToBeSetup_Item_t pointer
10022  *             DuUeCfg pointer
10023  * @return ROK/RFAIED
10024  *
10025  * ****************************************************************/
10026
10027 uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg,DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\
10028 uint8_t drbCount, DuUeCfg *ueCfgDb)
10029 {
10030    uint8_t ret, drbIdx;
10031    DRBs_ToBeSetup_Item_t *drbItem = NULLP;
10032    DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP;
10033
10034    ret = ROK;
10035    if(drbCount > 0)
10036    {
10037       for(drbIdx = 0; drbIdx < drbCount; drbIdx++)
10038       {
10039          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
10040          { 
10041             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in MAC at extractDrbListToSetup()");
10042             ret = RFAILED;
10043             break;
10044          }
10045          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
10046          {
10047             DU_LOG("\nERROR  -->  F1AP :  MAX LC Reached in RLC at extractDrbListToSetup()");
10048             ret = RFAILED;
10049             break;
10050          }
10051          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
10052          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
10053    
10054          if(drbCfg != NULL)
10055          {
10056             drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
10057             ret = procDrbListToSetup(lcId, drbItem, NULL, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
10058                &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
10059             if(ret == RFAILED)
10060             {
10061                DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
10062                break;
10063             }
10064          }
10065          else if(drbSetupModCfg != NULL)
10066          {
10067             drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx];
10068             ret = procDrbListToSetup(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item) ,\
10069             &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs],\
10070             &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
10071             if(ret == RFAILED)
10072             {
10073                DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
10074                break;
10075             }
10076          }
10077          ueCfgDb->numRlcLcs++;
10078          ueCfgDb->numMacLcs++;
10079          ueCfgDb->numDrb++;
10080          if(ret == RFAILED)
10081          {
10082             DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
10083             break;
10084          }
10085       }
10086    }
10087    else
10088       ret = RFAILED;
10089
10090    return ret;
10091 }
10092
10093 /*******************************************************************
10094  *
10095  * @brief Function to extract Dl RRC Msg received from CU
10096  *
10097  * @details
10098  *
10099  *    Function : extractDlRrcMsg
10100  *
10101  *    Functionality: Function to extract Dl RRC Msg received from CU
10102  *
10103  * @params[in] F1AP message
10104  * @return ROK     - success
10105  *         RFAILED - failure
10106  *
10107  * ****************************************************************/
10108
10109 uint8_t extractDlRrcMsg(uint32_t gnbDuUeF1apId, uint32_t gnbCuUeF1apId, \
10110    F1DlRrcMsg *dlRrcMsg, RRCContainer_t *rrcContainer)
10111 {
10112    uint8_t ret = ROK;
10113    dlRrcMsg->rrcMsgSize = rrcContainer->size;
10114    if(dlRrcMsg->rrcMsgSize > 0)
10115    {
10116       DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
10117       if(!dlRrcMsg->rrcMsgPdu)
10118       {
10119          DU_LOG("\nERROR  --> DU APP : Memory allocation failed for RRC Msg in extractDlRrcMsg()");
10120          ret = RFAILED;
10121       }
10122       else
10123       {
10124          dlRrcMsg->gnbDuUeF1apId = gnbDuUeF1apId;
10125          dlRrcMsg->gnbCuUeF1apId = gnbCuUeF1apId;
10126          dlRrcMsg->srbId = SRB1_LCID;
10127          memcpy(dlRrcMsg->rrcMsgPdu, rrcContainer->buf, dlRrcMsg->rrcMsgSize);
10128       }
10129    }
10130    return ret;
10131 }
10132
10133 /*******************************************************************
10134  *
10135  * @brief Extract UE capability info 
10136  *
10137  * @details
10138  *
10139  *    Function : extractUeCapability
10140  *
10141  *    Functionality: Extract UE capability info and stores in ue Cb
10142  *
10143  * @params[in] Octet string of UE capability RAT container list
10144  * @return ROK     - success
10145  *         RFAILED - failure
10146  *
10147  * ****************************************************************/
10148 UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf, DuUeCb *ueCb)
10149 {
10150    uint8_t  idx;
10151    uint16_t recvBufLen;
10152    asn_dec_rval_t rval;
10153    UE_NR_Capability_t  *ueNrCap = NULLP;
10154    UE_CapabilityRAT_ContainerListRRC_t  *ueCapRatContList = NULLP;
10155
10156    /* Decoding UE Capability RAT Container List */
10157    recvBufLen = ueCapablityListBuf->size;
10158    DU_ALLOC(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10159    if(!ueCapRatContList)
10160    {
10161       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
10162       return NULLP;
10163    }
10164    memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10165    memset(&rval, 0, sizeof(asn_dec_rval_t));
10166    rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList,
10167           ueCapablityListBuf->buf, recvBufLen, 0, 0);
10168    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
10169    {
10170       DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
10171       return NULLP;
10172    }
10173    xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, ueCapRatContList);
10174
10175    /* Free encoded buffer after decoding */
10176
10177    for(idx = 0; idx < ueCapRatContList->list.count; idx++)
10178    {
10179       if(ueCapRatContList->list.array[idx]->rat_Type == RAT_Type_nr)
10180       {
10181          /* Decoding UE NR Capability */
10182           recvBufLen = ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.size;
10183           DU_ALLOC(ueNrCap, sizeof(UE_NR_Capability_t));
10184           if(!ueNrCap)
10185           {
10186              DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
10187              DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10188              return NULLP;
10189           } 
10190           memset(ueNrCap, 0, sizeof(UE_NR_Capability_t));
10191           memset(&rval, 0, sizeof(asn_dec_rval_t));
10192           rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap,
10193                  ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0);
10194           if(rval.code == RC_FAIL || rval.code == RC_WMORE)
10195           {
10196              DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
10197              return NULLP;
10198           }
10199           xer_fprint(stdout, &asn_DEF_UE_NR_Capability, ueNrCap);
10200           
10201           /* Free encoded buffer after decoding */
10202           free(ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf);
10203       }
10204       free(ueCapRatContList->list.array[idx]);
10205    }
10206
10207    /* Free Memory*/
10208    free(ueCapRatContList->list.array);
10209    DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
10210    return ueNrCap;
10211 }
10212  
10213 /*******************************************************************
10214 *
10215 * @brief free UE context setup request from CU
10216 *
10217 * @details
10218 *
10219 *    Function : freeAperDecodeF1UeContextSetupReq
10220 *
10221 *    Functionality: freeing part for the memory allocated by aper_decoder
10222 *
10223 * @params[in] F1AP message
10224 * @return ROK     - success
10225 *         RFAILED - failure
10226 *
10227 * ****************************************************************/
10228 void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t   *ueSetReq)
10229 {
10230    uint8_t ieIdx = 0;
10231
10232    if(ueSetReq->protocolIEs.list.array != NULLP)
10233    {
10234       for(ieIdx = 0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++)
10235       {
10236          if(ueSetReq->protocolIEs.list.array[ieIdx])
10237          {
10238             switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
10239             {
10240                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10241                   break;
10242                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10243                   break;
10244                case ProtocolIE_ID_id_SpCell_ID:
10245                   freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
10246                   break;
10247                case ProtocolIE_ID_id_ServCellIndex:
10248                   break;
10249                case ProtocolIE_ID_id_SpCellULConfigured:
10250                   break;
10251                case ProtocolIE_ID_id_CUtoDURRCInformation:
10252
10253                   freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation);
10254                   break;
10255                case ProtocolIE_ID_id_SCell_ToBeSetup_List:
10256
10257                   freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List);
10258                   break;
10259                case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
10260
10261                   freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List);
10262                   break;
10263                case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
10264
10265                   freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List);
10266                   break;
10267                case ProtocolIE_ID_id_RRCContainer:
10268                   {
10269
10270                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP)
10271                      {
10272
10273                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
10274                      }
10275                      break;
10276                   }
10277                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
10278                   break;
10279                case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
10280                   {
10281                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf)
10282                      {
10283                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf);
10284                      }
10285                      break;
10286                   }
10287                default:
10288                   DU_LOG("\nERROR  -->  F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id);
10289             } 
10290             free(ueSetReq->protocolIEs.list.array[ieIdx]);
10291          }
10292       }
10293       free(ueSetReq->protocolIEs.list.array);
10294    }
10295 }
10296 /*******************************************************************
10297  *
10298  * @brief Process UE context setup request from CU
10299  *
10300  * @details
10301  *
10302  *    Function : procF1UeContextSetupReq
10303  *
10304  *    Functionality: Process UE context setup request from CU
10305  *
10306  * @params[in] F1AP message
10307  * @return ROK     - success
10308  *         RFAILED - failure
10309  *
10310  * ****************************************************************/
10311 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
10312 {
10313    uint8_t  ret=0, ieIdx=0, ueIdx=0, lcId=0, cellIdx=0;
10314    bool ueCbFound = false;
10315    uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0;
10316    DuUeCb   *duUeCb = NULL;
10317    UEContextSetupRequest_t   *ueSetReq = NULL;
10318    DRBs_ToBeSetup_List_t *drbCfg = NULL;
10319
10320    ret = ROK;
10321
10322    ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
10323    for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
10324    {
10325       switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
10326       {
10327          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10328             {
10329                gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
10330                break;
10331             }
10332          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10333             {
10334                gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
10335                break;
10336             }
10337          case ProtocolIE_ID_id_ServCellIndex:
10338             {
10339                cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
10340                for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
10341                {
10342                   if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
10343                         (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
10344                   {
10345                      ueCbFound = true;
10346                      duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
10347                      DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
10348                      if(duUeCb->f1UeDb)
10349                      {
10350                         memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
10351                         duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
10352                         duUeCb->f1UeDb->cellIdx = cellIdx;
10353                      }
10354                      else
10355                      {
10356                         DU_LOG("\nERROR  -->  F1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
10357                         ret = RFAILED;
10358                      }
10359                      break;
10360                   }
10361                   else
10362                      ueCbFound = false;
10363
10364                }
10365                if(!ueCbFound)
10366                {
10367                   DU_LOG("\nERROR  -->  F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
10368                   ret = RFAILED;
10369                }
10370                break;
10371             }
10372          case ProtocolIE_ID_id_SpCellULConfigured:
10373             /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL, 
10374                UL, SUL or UL+SUL for the indicated cell for the UE */
10375             break;
10376          case ProtocolIE_ID_id_CUtoDURRCInformation:
10377             {
10378                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList)
10379                {
10380                   duUeCb->f1UeDb->duUeCfg.ueNrCapability = \
10381                   extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
10382                   uE_CapabilityRAT_ContainerList, duUeCb);
10383                }
10384                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
10385                {
10386                   duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
10387                         value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
10388                   if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
10389                   {
10390                      DU_LOG("\nERROR  -->  F1AP: Failed to extract cell Grp Info");
10391                      //TODO: Update the failure cause in ue context Setup Response
10392                      ret = RFAILED;
10393                   }
10394                }
10395                break;
10396             } 
10397          case ProtocolIE_ID_id_SCell_ToBeSetup_List:
10398             {
10399                DU_LOG("\nINFO   -->  DU_APP: Received SCell_ToBeSetup_List but  Not processing the list");
10400                break;
10401             }
10402          case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
10403             {
10404                if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
10405                &duUeCb->f1UeDb->duUeCfg))
10406                {
10407                   DU_LOG("\nERROR  -->  DU APP : Failed at extractSrbListToSetup()");
10408                   //TODO: Update the failure cause in ue context Setup Response
10409                   ret = RFAILED;
10410                }
10411                break;
10412             }
10413          case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
10414             {
10415                lcId = getDrbLcId(&duUeCb->drbBitMap);
10416                if(lcId != RFAILED)
10417                {
10418                   drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List;
10419                   if(extractDrbListToSetup(lcId, drbCfg, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg))
10420                   {
10421                      DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
10422                      //TODO: Update the failure cause in ue context Setup Response
10423                      ret = RFAILED;
10424                   }
10425                }
10426                else 
10427                   ret = RFAILED;
10428                break;
10429             }
10430          case ProtocolIE_ID_id_RRCContainer:
10431             {
10432                /* Filling Dl RRC Msg Info */
10433                DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
10434                if(!duUeCb->f1UeDb->dlRrcMsg)
10435                {
10436                   DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
10437                   ret = RFAILED;
10438                }
10439                else
10440                {
10441                   duUeCb->f1UeDb->dlRrcMsgPres = true;
10442                   memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
10443                   ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
10444                         &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
10445                }          
10446                break;
10447             }
10448          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
10449             {
10450                if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
10451                {
10452                   duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
10453                }
10454                else
10455                {
10456                   DU_LOG("\nERROR  -->  Ignoring delivery report, since rrcContainer is not present");
10457                }
10458                break;
10459             }
10460          case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
10461             {
10462                /* MaximumBitRate Uplink */
10463                bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
10464                if(bitRateSize > 0)
10465                {
10466                   DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
10467                   if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
10468                   {
10469                      DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
10470                      ret = RFAILED;
10471                   }
10472                   else
10473                   {
10474                      memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg)); 
10475                      memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
10476                            ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
10477                   }
10478                }
10479                else
10480                   ret = RFAILED;
10481                break;
10482             }
10483          default:
10484             {
10485                break;
10486             }
10487       }
10488    }
10489    if(ret == RFAILED)
10490    {
10491       /*TODO : Negative case*/
10492       // BuildAndSendUeContextSetupRsp(cellId,ueIdx);
10493       DU_LOG("\nERROR  -->  F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); 
10494    }
10495    else
10496       ret = duProcUeContextSetupRequest(duUeCb);
10497
10498    freeAperDecodeF1UeContextSetupReq(ueSetReq); 
10499    return ret;
10500
10501 }
10502 /*******************************************************************
10503  * @brief Free the memory allocated for Dl Tunnel Info
10504  *
10505  * @details
10506  *
10507  *    Function : freeDlTnlInfo
10508  *
10509  *    Functionality:
10510  *       Free the memory allocated for Dl Tunnel Info
10511  *
10512  * @params[in] DLUPTNLInformation_ToBeSetup_List_t *
10513  * @return void
10514  *
10515  * ****************************************************************/
10516
10517 void freeDlTnlInfo(DLUPTNLInformation_ToBeSetup_List_t *tnlInfo)
10518 {
10519    uint8_t arrIdx = 0;
10520
10521    if(tnlInfo)
10522    {
10523       for(arrIdx=0; arrIdx < tnlInfo->list.count; arrIdx++)
10524       {
10525          DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf,\
10526                tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
10527          DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf,\
10528                tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size);
10529          DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
10530          DU_FREE(tnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
10531       }
10532       DU_FREE(tnlInfo->list.array, tnlInfo->list.size);
10533    }
10534 }
10535
10536 /*******************************************************************
10537  * @brief Free the memory allocated for DRB setup List
10538  *
10539  * @details
10540  *
10541  *    Function : freeDrbSetupList
10542  *
10543  *    Functionality:
10544  *       Free the memory allocated for DRB setup list
10545  *
10546  * @params[in] DRBs_Setup_List_t *
10547  * @return void
10548  *
10549  * ****************************************************************/
10550 void freeDrbSetupList(DRBs_Setup_List_t *drbSetupList)
10551 {
10552    uint8_t arrIdx = 0;
10553    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
10554
10555    for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
10556    {
10557       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
10558       freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
10559       DU_FREE(drbSetupList->list.array[arrIdx],  sizeof(DRBs_Setup_Item_t));
10560    }
10561    DU_FREE(drbSetupList->list.array, drbSetupList->list.size);
10562 }
10563
10564 /*******************************************************************
10565  * @brief Free the memory allocated for UE Setup response
10566  *
10567  * @details
10568  *
10569  *    Function : FreeUeContextSetupRsp
10570  *
10571  *    Functionality:
10572  *       Free the memory allocated for UE Setup response
10573  *
10574  * @params[in] F1AP PDU for UE setup response
10575  * @return ROK     - success
10576  *         RFAILED - failure
10577  *
10578  * ****************************************************************/
10579 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
10580 {
10581    uint8_t idx;
10582    UEContextSetupResponse_t *ueSetRsp = NULLP;
10583
10584    if(f1apMsg)
10585    {
10586       if(f1apMsg->choice.successfulOutcome)
10587       {
10588          ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
10589                     UEContextSetupResponse;
10590          if(ueSetRsp->protocolIEs.list.array)
10591          {
10592             for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
10593             {
10594                if(ueSetRsp->protocolIEs.list.array[idx])
10595                {
10596                   switch(ueSetRsp->protocolIEs.list.array[idx]->id)
10597                   {
10598                      case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10599                         break;
10600                      case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10601                         break;
10602                      case ProtocolIE_ID_id_DUtoCURRCInformation:
10603                         {
10604                            CellGroupConfig_t *cellGrpCfg = NULLP;
10605                            cellGrpCfg  = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
10606                                          DUtoCURRCInformation.cellGroupConfig;
10607                            if(cellGrpCfg->buf != NULLP)
10608                            {
10609                               DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
10610                               cellGrpCfg = NULLP;
10611                            }
10612                            break;
10613                         }
10614                     case ProtocolIE_ID_id_DRBs_Setup_List:
10615                         {
10616                            freeDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List); 
10617                            break;
10618                         }
10619                      default:
10620                         DU_LOG("\nERROR  -->  DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
10621                         ueSetRsp->protocolIEs.list.array[idx]->id);
10622                         break;
10623                   }
10624                   DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
10625                         sizeof(UEContextSetupResponseIEs_t));
10626                }
10627             }
10628             DU_FREE(ueSetRsp->protocolIEs.list.array, \
10629                   ueSetRsp->protocolIEs.list.size);
10630          }
10631          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10632       }
10633       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10634    }
10635 }
10636
10637 /*******************************************************************
10638  *
10639  * @brief Builds Ue context Setup Rsp DU To CU Info
10640  *
10641  * @details
10642  *
10643  *    Function : EncodeUeCntxtDuToCuInfo
10644  *
10645  *    Functionality: Builds Ue context Setup Rsp DU To CU Info
10646  *
10647  * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t * 
10648  *
10649  * @return ROK     - success
10650  *         RFAILED - failure
10651  *
10652  ******************************************************************/
10653
10654 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
10655 {
10656    asn_enc_rval_t        encRetVal;
10657
10658    xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
10659    memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
10660    encBufSize = 0;
10661    encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
10662    /* Encode results */
10663    if(encRetVal.encoded == ENCODE_FAIL)
10664    {
10665       DU_LOG( "\nERROR  -->  F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
10666             encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10667       return RFAILED;
10668    }
10669    else
10670    {
10671       DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
10672       for(int i=0; i< encBufSize; i++)
10673       {
10674          printf("%x",encBuf[i]);
10675       }
10676    }
10677    duToCuCellGrp->size = encBufSize;
10678    DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
10679    if(!duToCuCellGrp->buf)
10680    {
10681       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
10682    }
10683    memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
10684    return ROK;
10685 }
10686
10687 /*******************************************************************
10688  *
10689  * @brief Fills Dl Gtp tunnel Info
10690  *
10691  * @details
10692  *
10693  *    Function : fillGtpTunnelforDl
10694  *
10695  *    Functionality: Fills Dl Gtp tunnel Info
10696  *
10697  * @params[in] 
10698  *
10699  * @return ROK     - success
10700  *         RFAILED - failure
10701  *
10702  * ****************************************************************/
10703
10704 uint8_t fillGtpTunnelforDl(GTPTunnel_t *gtpDl, GtpTnlCfg *gtpUeCfg)
10705 {
10706    uint8_t bufSize = 0;
10707
10708    gtpDl->transportLayerAddress.size    = 4*sizeof(uint8_t);
10709    DU_ALLOC(gtpDl->transportLayerAddress.buf, gtpDl->transportLayerAddress.size);
10710    if(gtpDl->transportLayerAddress.buf == NULLP)
10711    {
10712       return RFAILED;
10713    }
10714    memcpy(gtpDl->transportLayerAddress.buf, &gtpUeCfg->dlTnlAddress, gtpDl->transportLayerAddress.size);
10715
10716    /*GTP TEID*/
10717    gtpDl->gTP_TEID.size = 4 * sizeof(uint8_t);
10718    DU_ALLOC(gtpDl->gTP_TEID.buf, gtpDl->gTP_TEID.size);
10719    if(gtpDl->gTP_TEID.buf == NULLP)
10720    {
10721       return RFAILED;
10722    }
10723    bufSize = 3; /*forming an Octect String*/
10724    fillTeIdString(bufSize, gtpUeCfg->teId, gtpDl->gTP_TEID.buf);
10725
10726    return ROK;
10727 }
10728
10729 /*******************************************************************
10730  *
10731  * @brief Fills DL Tunnel Setup List
10732  *
10733  * @details
10734  *
10735  *    Function : fillDlTnlSetupList
10736  *
10737  *    Functionality: Fills the DL Tunnel Setup List
10738  *
10739  * @params[in] 
10740  *
10741  * @return ROK     - success
10742  *         RFAILED - failure
10743  *
10744  * ****************************************************************/
10745
10746 uint8_t fillDlTnlSetupList(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo, UpTnlCfg *tnlCfg)
10747 {
10748    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10749
10750    eleCount = 1;
10751    dlTnlInfo->list.count = eleCount; 
10752    dlTnlInfo->list.size = (eleCount * sizeof(DLUPTNLInformation_ToBeSetup_Item_t *));
10753
10754    /* Initialize the DL Tnl Setup List Members */
10755    DU_ALLOC(dlTnlInfo->list.array, dlTnlInfo->list.size);
10756    if(dlTnlInfo->list.array == NULLP)
10757    {
10758       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL Tnl Setup List in fillDlTnlSetupList()");
10759       ret = RFAILED;
10760    }
10761    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10762    {
10763       DU_ALLOC(dlTnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
10764       if(dlTnlInfo->list.array[arrIdx] == NULLP)
10765       {
10766          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDlTnlSetupList()", arrIdx);
10767          return RFAILED;
10768       }
10769       dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
10770       DU_ALLOC(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
10771       if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel == NULLP)
10772       {
10773          DU_LOG(" ERROR  -->  F1AP : Memory allocation for DL tunnel info in fillDlTnlSetupList()");
10774          return RFAILED;
10775       }
10776       ret = fillGtpTunnelforDl(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel,\
10777                tnlCfg->tnlCfg1);
10778       if(ret != ROK)
10779          break;
10780    }
10781    return ret;
10782 }
10783
10784 /*******************************************************************
10785  *
10786  * @brief Fills the Drb Setup List for Ue Context Setup Response
10787  *
10788  * @details
10789  *
10790  *    Function : fillDrbSetupList
10791  *
10792  *    Functionality: Fills the Drb Setup List for Ue Context Setup Response
10793  *
10794  * @params[in] 
10795  *
10796  * @return ROK     - success
10797  *         RFAILED - failure
10798  *
10799  * ****************************************************************/
10800 uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg)
10801 {
10802    uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
10803    DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
10804
10805    eleCount = ueCfg->numDrb;
10806    drbSetupList->list.count = eleCount;
10807    drbSetupList->list.size = \
10808         (eleCount * sizeof(DRBs_Setup_Item_t *));
10809
10810    /* Initialize the Drb Setup List Members */
10811    DU_ALLOC(drbSetupList->list.array, drbSetupList->list.size);
10812    if(drbSetupList->list.array == NULLP)
10813    {
10814       DU_LOG(" ERROR  -->  F1AP : Memory allocation for DRB Setup List in fillDrbSetupList()");
10815       ret = RFAILED;
10816    }
10817
10818    for(arrIdx=0; arrIdx < eleCount; arrIdx++)
10819    {
10820       DU_ALLOC(drbSetupList->list.array[arrIdx], sizeof(DRBs_Setup_Item_t));
10821       if(drbSetupList->list.array[arrIdx] == NULLP)
10822       {
10823          DU_LOG(" ERROR  -->  F1AP : Memory allocation for arrIdx [%d] failed in fillDrbSetupList()", arrIdx);
10824          return RFAILED;
10825       }
10826       drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
10827       drbItemIe->id = ProtocolIE_ID_id_DRBs_Setup_Item;
10828       drbItemIe->criticality = Criticality_reject;
10829       drbItemIe->value.present = DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
10830       drbItemIe->value.choice.DRBs_Setup_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
10831       ret = fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List,\
10832           &ueCfg->upTnlInfo[arrIdx]);
10833       if(ret != ROK)
10834          break;
10835    }
10836    return ret;
10837 }
10838
10839 /*******************************************************************
10840  *
10841  * @brief Builds and sends the UE Setup Response
10842  *
10843  * @details
10844  *
10845  *    Function : BuildAndSendUeContextSetupRsp
10846  *
10847  *    Functionality: Constructs the UE Setup Response and sends
10848  *                   it to the DU through SCTP.
10849  *
10850  * @params[in] uint8_t cellId,uint8_t ueIdx
10851  *
10852  * @return ROK     - success
10853  *         RFAILED - failure
10854  *
10855  * ****************************************************************/
10856 uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx)
10857 {
10858    uint8_t   idx, ret, cellIdx, elementCnt;
10859    uint32_t  gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
10860    uint32_t  gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
10861    asn_enc_rval_t  encRetVal;        /* Encoder return value */
10862    F1AP_PDU_t               *f1apMsg = NULLP;
10863    UEContextSetupResponse_t *ueSetRsp = NULLP;
10864    CellGroupConfigRrc_t     *cellGrpCfg = NULLP;
10865    DuUeCb                   *ueCb = NULLP;
10866
10867    DU_LOG("\n INFO   -->  F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
10868
10869    while(true)
10870    {
10871       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10872       if(f1apMsg == NULLP)
10873       {
10874          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10875          ret = RFAILED;
10876          break;
10877       }
10878
10879       f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
10880       DU_ALLOC(f1apMsg->choice.successfulOutcome,
10881             sizeof(SuccessfulOutcome_t));
10882       if(f1apMsg->choice.successfulOutcome == NULLP)
10883       {
10884          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
10885          ret = RFAILED;
10886          break;
10887       }
10888
10889       f1apMsg->choice.successfulOutcome->procedureCode = \
10890                                                          ProcedureCode_id_UEContextSetup;
10891       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
10892       f1apMsg->choice.successfulOutcome->value.present = \
10893                                                          SuccessfulOutcome__value_PR_UEContextSetupResponse;
10894
10895       ueSetRsp =
10896          &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
10897       elementCnt = 4;
10898       ueSetRsp->protocolIEs.list.count = elementCnt;
10899       ueSetRsp->protocolIEs.list.size = \
10900                                         elementCnt * sizeof(UEContextSetupResponse_t *);
10901
10902       /* Initialize the UESetup members */
10903       DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
10904             ueSetRsp->protocolIEs.list.size);
10905       if(ueSetRsp->protocolIEs.list.array == NULLP)
10906       {
10907          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10908          ret = RFAILED;
10909          break;
10910       }
10911
10912       for(idx=0; idx<elementCnt; idx++)
10913       {
10914          DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
10915                sizeof(UEContextSetupResponseIEs_t));
10916          if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
10917          {
10918             DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
10919             ret = RFAILED;
10920             break;
10921          }
10922       }
10923       /* Fetching Ue Cb Info*/
10924       GET_CELL_IDX(cellId, cellIdx);
10925       gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
10926       gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
10927       ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
10928
10929       idx = 0;
10930       /*GNB CU UE F1AP ID*/
10931       ueSetRsp->protocolIEs.list.array[idx]->id = \
10932                                                   ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10933       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10934       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10935                                                              UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
10936       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
10937
10938       /*GNB DU UE F1AP ID*/
10939       idx++;
10940       ueSetRsp->protocolIEs.list.array[idx]->id = \
10941                                                   ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10942       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10943       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
10944                                                              UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
10945       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
10946
10947
10948       /*DUtoCURRC Information */
10949       idx++;
10950       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10951                                                    ProtocolIE_ID_id_DUtoCURRCInformation;
10952       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10953       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10954                                                             UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
10955       if(ueCb->f1UeDb)
10956       {
10957          if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
10958          {
10959             cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
10960             ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
10961                      choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
10962             if(ret == RFAILED)
10963             {
10964                DU_LOG("\nERROR  -->  F1AP : Failed to EncodeUeCntxtDuToCuInfo in BuildAndSendUeContextSetupRsp()");
10965                freeF1UeDb(ueCb->f1UeDb);
10966                ueCb->f1UeDb = NULLP;
10967                break;
10968             }
10969          }
10970       }
10971       else
10972       {
10973          DU_LOG("\nERROR  -->  F1AP : Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
10974          ret = RFAILED;
10975          break;
10976       }
10977
10978       /* Drb Setup List */
10979       idx++;
10980       ueSetRsp->protocolIEs.list.array[idx]->id  = \
10981                                  ProtocolIE_ID_id_DRBs_Setup_List;
10982       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10983       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
10984                                  UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
10985       ret = fillDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List,\
10986                &ueCb->f1UeDb->duUeCfg);
10987       if(ret == RFAILED)
10988       {
10989          DU_LOG("\nERROR  -->  F1AP : Failed to fillDrbSetupList in BuildAndSendUeContextSetupRsp()");
10990          freeF1UeDb(ueCb->f1UeDb);
10991          ueCb->f1UeDb = NULLP;
10992          break;
10993       }
10994
10995        /* Free UeContext Db created during Ue context Req */
10996        freeF1UeDb(ueCb->f1UeDb);
10997        ueCb->f1UeDb = NULLP;
10998
10999       /* TODO: To send Drb list */
11000       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11001
11002       /* Encode the UE context setup response type as APER */
11003       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
11004       encBufSize = 0;
11005       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11006             encBuf);
11007       /* Encode results */
11008       if(encRetVal.encoded == ENCODE_FAIL)
11009       {
11010          DU_LOG( "\nERROR  -->  F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\
11011                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11012          ret = RFAILED;
11013          break;
11014       }
11015       else
11016       {
11017          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UE Context Setup Response\n");
11018          for(int i=0; i< encBufSize; i++)
11019          {
11020             printf("%x",encBuf[i]);
11021          }
11022       }
11023
11024       /* Sending  msg  */
11025       if(sendF1APMsg()  != ROK)
11026       {
11027          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Setup Response failed");
11028          ret = RFAILED;
11029          break;
11030       }
11031       break;
11032    }
11033    FreeUeContextSetupRsp(f1apMsg);
11034    return ret;
11035 }/* End of BuildAndSendUeContextSetupRsp */
11036 /*******************************************************************
11037 *
11038 * @brief  Build And Send Ue Context Rsp 
11039 *
11040 * @details
11041 *
11042 *    Function : BuildAndSendUeCtxtRsp 
11043 *
11044 *    Functionality : Build And Send Ue Context Rsp
11045
11046 * @params[in]
11047 * @return sucess = ROK
11048 *         failure = RFAILED
11049 *
11050 * ****************************************************************/
11051 uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueIdx)
11052 {
11053    uint8_t cellIdx = 0, actionType = 0; 
11054
11055    GET_CELL_IDX(cellId, cellIdx);
11056    actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
11057
11058    switch(actionType)
11059    {
11060       case UE_CTXT_SETUP:
11061          {
11062             BuildAndSendUeContextSetupRsp(cellId,ueIdx);
11063             break;
11064          }
11065       case UE_CTXT_MOD:
11066          {
11067             BuildAndSendUeContextModRsp(cellId, ueIdx);
11068             break;
11069          }
11070       default:
11071          DU_LOG("ERROR  -->  F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
11072          break;
11073
11074    }
11075    return ROK;
11076 }
11077
11078 /*******************************************************************
11079  *
11080  * @brief deallocating the memory of  F1reset msg
11081  *
11082  * @details
11083  *
11084  *    Function : FreeF1ResetReq
11085  *
11086  *    Functionality :
11087  *         - freeing memory of F1reset request msg
11088  *
11089  * @params[in]
11090  * @return void
11091  *
11092  *
11093  * ****************************************************************/
11094 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
11095 {
11096    uint8_t idx =0 ;
11097    Reset_t *f1ResetMsg;
11098
11099    if(f1apMsg)
11100    {
11101       if(f1apMsg->choice.initiatingMessage)
11102       {
11103          f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
11104
11105          if(f1ResetMsg->protocolIEs.list.array)
11106          {
11107             for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
11108             {
11109                if(f1ResetMsg->protocolIEs.list.array[idx])
11110                {
11111                   DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
11112                }
11113             }
11114             DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
11115          }
11116          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11117       }
11118       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11119    }
11120 }
11121 /*******************************************************************
11122  *
11123  * @brief Build and Send F1reset request 
11124  *
11125  * @details
11126  *
11127  *    Function : BuildAndSendF1ResetReq
11128  *
11129  *    Functionality:
11130  *         - Build and Send F1reset request msg
11131  *
11132  * @params[in]
11133  * @return ROK     - success
11134  *         RFAILED - failure
11135  *
11136  * ****************************************************************/
11137 uint8_t BuildAndSendF1ResetReq()
11138 {
11139    uint8_t          elementCnt=0;
11140    uint8_t          idx=0;
11141    uint8_t          ret= RFAILED;
11142    Reset_t          *f1ResetMsg = NULLP;
11143    F1AP_PDU_t       *f1apMsg = NULLP;
11144    asn_enc_rval_t   encRetVal;
11145    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset request \n");
11146    do
11147    {
11148       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11149       if(f1apMsg == NULLP)
11150       {
11151          break;
11152       }
11153       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11154       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
11155       if(f1apMsg->choice.initiatingMessage == NULLP)
11156       {
11157          break;
11158       }
11159       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
11160       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
11161       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
11162
11163       f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
11164
11165       elementCnt = 3;
11166       f1ResetMsg->protocolIEs.list.count = elementCnt;
11167       f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
11168
11169       /* Initialize the F1Setup members */
11170       DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
11171       if(f1ResetMsg->protocolIEs.list.array == NULLP)
11172       {
11173          break;
11174       }
11175       for(idx=0; idx<elementCnt; idx++)
11176       {
11177          DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
11178          if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
11179          {
11180             break;
11181          }
11182       }
11183
11184       /*TransactionID*/
11185       idx=0;
11186       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
11187       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
11188       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
11189       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
11190
11191       /*Cause*/
11192       idx++;
11193       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
11194       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
11195       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
11196       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
11197       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
11198
11199       /*Reset Type*/
11200       idx++;
11201       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
11202       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
11203       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
11204       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
11205       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
11206
11207       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11208
11209       /* Encode the F1SetupRequest type as APER */
11210       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11211       encBufSize = 0;
11212       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11213             encBuf);
11214
11215       /* Encode results */
11216       if(encRetVal.encoded == ENCODE_FAIL)
11217       {
11218          DU_LOG("\nERROR  -->  F1AP : Could not encode F1Reset structure (at %s)\n",\
11219                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11220          break;
11221       }
11222       else
11223       {
11224          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1Reset\n");
11225          for(idx=0; idx< encBufSize; idx++)
11226          {
11227             printf("%x",encBuf[idx]);
11228          }
11229       }
11230
11231       if(sendF1APMsg() != ROK)
11232       {
11233          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset request failed");
11234          break;
11235       }
11236
11237       ret = ROK;
11238       break;
11239    }while(true);
11240
11241    FreeF1ResetReq(f1apMsg);
11242    return ret;
11243 }
11244 /*******************************************************************
11245  *
11246  * @brief Build And Send F1ResetAck
11247  *
11248  * @details
11249  *
11250  *    Function : BuildAndSendF1ResetAck
11251  *
11252  *    Functionality:
11253  *         - Build And Send  F1ResetRSP
11254  *
11255  * @return ROK     - success
11256  *         RFAILED - failure
11257  *
11258  * ****************************************************************/
11259 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
11260 {
11261    uint8_t idx;
11262    ResetAcknowledge_t *f1ResetAck;
11263
11264    if(f1apMsg)
11265    {
11266       if(f1apMsg->choice.successfulOutcome)
11267       {
11268          f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
11269
11270          if(f1ResetAck->protocolIEs.list.array)
11271          {
11272             for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
11273             {
11274                if(f1ResetAck->protocolIEs.list.array[idx])
11275                {
11276                   DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
11277                }
11278             }
11279             DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
11280          }
11281          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
11282       }
11283       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
11284    }
11285 }
11286
11287 /*******************************************************************
11288  *
11289  * @brief Build And Send F1ResetAck
11290  *
11291  * @details
11292  *
11293  *    Function : BuildAndSendF1ResetAck
11294  *
11295  *    Functionality:
11296  *         - Build And Send  F1ResetRSP
11297  *
11298  *  @params[in]
11299  * @return ROK     - success
11300  *         RFAILED - failure
11301  *
11302  * ****************************************************************/
11303 uint8_t BuildAndSendF1ResetAck()
11304 {
11305    uint8_t                idx = 0;
11306    uint8_t                elementCnt = 0;
11307    uint8_t                ret = RFAILED;
11308    F1AP_PDU_t             *f1apMsg = NULL;
11309    ResetAcknowledge_t     *f1ResetAck = NULLP;
11310    asn_enc_rval_t         encRetVal;
11311    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset Acknowledgment \n");
11312
11313    do{
11314       /* Allocate the memory for F1ResetRequest_t */
11315       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11316       if(f1apMsg == NULLP)
11317       {
11318          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
11319          break;
11320       }
11321
11322       f1apMsg->present =  F1AP_PDU_PR_successfulOutcome;
11323
11324       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
11325       if(f1apMsg->choice.successfulOutcome == NULLP)
11326       {
11327          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
11328          break;
11329       }
11330       f1apMsg->choice.successfulOutcome->criticality   = Criticality_reject;
11331       f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
11332       f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
11333
11334       elementCnt = 1;
11335
11336       f1ResetAck->protocolIEs.list.count = elementCnt;
11337       f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
11338
11339       DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
11340       if(f1ResetAck->protocolIEs.list.array == NULLP)
11341       {
11342          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1ResetAckIEs failed");
11343          break;
11344       }
11345
11346       for(idx=0; idx<elementCnt; idx++)
11347       {
11348          DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
11349          if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
11350          {
11351             break;
11352          }
11353       }
11354       /*TransactionID*/
11355       idx = 0;
11356       f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
11357       f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
11358       f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
11359       f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
11360
11361       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11362
11363       /* Encode the F1SetupRequest type as UPER */
11364       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11365       encBufSize = 0;
11366       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
11367
11368       /* Check encode results */
11369       if(encRetVal.encoded == ENCODE_FAIL)
11370       {
11371          DU_LOG("\nERROR  -->  F1AP : Could not encode F1ResetAck structure (at %s)\n",\
11372                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11373          break;
11374       }
11375       else
11376       {
11377          DU_LOG("\nDUBUG   -->  F1AP : Created APER encoded buffer for F1ResetAck\n");
11378          for(int i=0; i< encBufSize; i++)
11379          {
11380             printf("%x",encBuf[i]);
11381          }
11382       }
11383       /* Sending msg */
11384       if(sendF1APMsg() != ROK)
11385       {
11386          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset Acknowledgement failed");
11387          break;
11388       }
11389
11390       ret = ROK;
11391       break;
11392    }while(true);
11393
11394    FreeF1ResetAck(f1apMsg);
11395    return ret;
11396 }
11397 /******************************************************************
11398 *
11399 * @brief free F1 reset msg allocated by aper_decoder 
11400 *
11401 * @details
11402 *
11403 *    Function : freeAperDecodeF1ResetMsg 
11404 *
11405 *    Functionality: free F1 reset msg allocated by aper_decoder 
11406 *
11407 * @params[in] Reset_t *f1ResetMsg 
11408 * @return void 
11409 *
11410 * ****************************************************************/
11411
11412 void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
11413 {
11414    uint8_t ieIdx =0;
11415    if(f1ResetMsg->protocolIEs.list.array)
11416    {
11417       for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
11418       {
11419          if(f1ResetMsg->protocolIEs.list.array[ieIdx])
11420          {
11421             free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
11422          }
11423       }
11424       free(f1ResetMsg->protocolIEs.list.array);
11425    }
11426 }
11427
11428 /******************************************************************
11429  *
11430  * @brief Processes DL RRC Message Transfer  sent by CU
11431  *
11432  * @details
11433  *
11434  *    Function : procF1ResetReq
11435  *
11436  *    Functionality: Processes DL RRC Message Transfer sent by CU
11437  *
11438  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11439  * @return ROK     - success
11440  *         RFAILED - failure
11441  *
11442  * ****************************************************************/
11443 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
11444 {
11445    /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
11446    uint8_t       ieIdx = 0;
11447    uint8_t        ret = ROK;
11448    Reset_t       *f1ResetMsg = NULLP;
11449
11450    DU_LOG("\nINFO   -->  Processing F1 reset request");
11451    f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
11452
11453    for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
11454    {
11455       switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
11456       {
11457          case ProtocolIE_ID_id_TransactionID:
11458             break;
11459
11460          case ProtocolIE_ID_id_Cause:
11461             break;
11462
11463          case ProtocolIE_ID_id_ResetType:
11464             {
11465                break;
11466             }
11467
11468          default:
11469             break;
11470       }
11471    }
11472    ret = BuildAndSendF1ResetAck();
11473    DU_LOG("\nINFO   -->  UE release is not supported for now");
11474
11475    freeAperDecodeF1ResetMsg(f1ResetMsg);
11476
11477    return ret;
11478 }
11479
11480 /*******************************************************************
11481  *
11482  * @brief free the RRC delivery report
11483  *
11484  * @details
11485  *
11486  *    Function : freeRrcDeliveryReport
11487  *
11488  *    Functionality: free the RRC delivery report
11489  *
11490  * @params[in]
11491  * @return ROK     - success
11492  *         RFAILED - failure
11493  *
11494  * ****************************************************************/
11495 void freeRrcDeliveryReport(F1AP_PDU_t  *f1apMsg )
11496 {
11497    uint8_t idx=0;
11498    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
11499
11500    if(f1apMsg)
11501    {
11502       if(f1apMsg->choice.initiatingMessage)
11503       {
11504          rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
11505          if(rrcDeliveryReport->protocolIEs.list.array)
11506          {
11507             for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
11508                   idx++)
11509             {
11510                if(rrcDeliveryReport->protocolIEs.list.array[idx])
11511                {
11512                   DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
11513                         sizeof(RRCDeliveryReportIEs_t));
11514                }   
11515             }
11516             DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
11517                   rrcDeliveryReport->protocolIEs.list.size);
11518          }
11519          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
11520       }
11521       DU_FREE(f1apMsg,
11522             sizeof(F1AP_PDU_t));
11523    }
11524 }
11525
11526 /*******************************************************************
11527 *
11528 * @brief Builds and sends the RRC delivery report
11529 *
11530 * @details
11531 *
11532 *    Function : BuildAndSendRrcDeliveryReport
11533 *
11534 *    Functionality: Builds and sends the RRC delivery report
11535 *
11536 * @params[in]
11537 *
11538 * @return ROK     - success
11539 *         RFAILED - failure
11540 *
11541 * ****************************************************************/
11542 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
11543    uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
11544 {
11545    uint8_t             ret = RFAILED;
11546    uint8_t             idx    = 0;
11547    uint8_t             idx1   = 0;
11548    uint8_t             elementCnt = 0;
11549    F1AP_PDU_t          *f1apMsg = NULLP;
11550    asn_enc_rval_t      encRetVal;  
11551    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
11552
11553    do{
11554
11555       DU_LOG("\nINFO   -->  F1AP : Building RRC delivery Message Transfer Message\n");
11556       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
11557       if(f1apMsg == NULLP)
11558       {
11559          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
11560          break;
11561       }
11562       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
11563       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
11564       if(f1apMsg->choice.initiatingMessage == NULLP)
11565       {
11566          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU  failed");
11567          break;
11568       }
11569       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
11570       f1apMsg->choice.initiatingMessage->criticality   = Criticality_ignore;
11571       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
11572
11573       rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
11574       elementCnt = 4;
11575       rrcDeliveryReport->protocolIEs.list.count = elementCnt;
11576       rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
11577
11578       /* Initialize the F1Setup members */
11579       DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
11580       if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
11581       {
11582          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRC Delivery  failed");
11583          break;
11584       }
11585       for(idx =0 ;idx <elementCnt; idx++)
11586       {
11587          DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
11588          if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
11589          {
11590             break;
11591          }
11592       }
11593
11594       idx1 = 0;
11595
11596       /*GNB CU UE F1AP ID*/
11597       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
11598       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11599       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
11600       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
11601
11602       /*GNB DU UE F1AP ID*/
11603       idx1++;
11604       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
11605       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
11606       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
11607       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
11608
11609       /*RRC delivery status*/
11610       idx1++;
11611       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
11612       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11613       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
11614       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
11615       rrcDelivery->rrcDeliveryStatus.deliveryStatus;
11616       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
11617       rrcDelivery->rrcDeliveryStatus.triggeringMessage;
11618
11619       /* SRB ID */ 
11620       idx1++;
11621       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
11622       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
11623       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
11624       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID =  rrcDelivery->srbId;
11625
11626       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11627
11628       /* Encode the RRC DELIVERY REPORT type as APER */
11629       memset(encBuf, 0, ENC_BUF_MAX_LEN);
11630       encBufSize = 0;
11631       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
11632             encBuf);
11633
11634       /* Encode results */
11635       if(encRetVal.encoded == ENCODE_FAIL)
11636       {
11637          DU_LOG("\nERROR  -->  F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
11638                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
11639          break;
11640       }
11641       else
11642       {
11643          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
11644          for(idx=0; idx< encBufSize; idx++)
11645          {
11646             printf("%x",encBuf[idx]);
11647          }
11648       }
11649
11650       /* Sending msg */
11651       if(sendF1APMsg() != ROK)
11652       {
11653          DU_LOG("\nERROR  -->  F1AP : Sending RRC delivery  msg request failed");
11654          break;
11655       }
11656       ret = ROK;
11657       break;
11658
11659    }while(true);
11660
11661    freeRrcDeliveryReport(f1apMsg);
11662    return ret;
11663 }
11664
11665 /*******************************************************************
11666  *
11667  * @brief Processes cells to be activated
11668  *
11669  * @details
11670  *
11671  *    Function : extractCellsToBeActivated
11672  *
11673  *    Functionality:
11674  *      - Processes cells to be activated list received in F1SetupRsp
11675  *
11676  * @params[in] void
11677  * @return ROK     - success
11678  *         RFAILED - failure
11679  *
11680  * ****************************************************************/
11681
11682 uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
11683 {
11684    uint8_t  ret = ROK;
11685    uint16_t idx, nci, pci = 0;
11686    Cells_to_be_Activated_List_Item_t cell;
11687
11688    for(idx=0; idx<cellsToActivate.list.count; idx++)
11689    {
11690       nci = 0;
11691       cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
11692       bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
11693
11694       if(cell.nRPCI)
11695       {
11696          pci = *cell.nRPCI;
11697       }
11698       ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
11699    }
11700    return ret;
11701 }
11702 /******************************************************************
11703 *
11704 * @brief Processes F1 Setup Response allocated by aper_decoder 
11705 *
11706 * @details
11707 *
11708 *    Function : freeF1SetupRsp 
11709 *
11710 *    Functionality: free F1 Setup Response allocated by aper_decoder 
11711 *
11712 * @params[in] F1SetupResponse_t *f1SetRspMsg 
11713 * @return void 
11714 *
11715 * ****************************************************************/
11716
11717 void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
11718 {
11719    uint8_t ieIdx =0;
11720    uint8_t arrIdx =0;
11721    Cells_to_be_Activated_List_t *cellToActivate =NULLP;
11722    RRC_Version_t      *rrcVer =NULLP;
11723
11724    if(f1SetRspMsg->protocolIEs.list.array)
11725    {
11726       for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
11727       {
11728          if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
11729          {
11730             switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
11731             {
11732                case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11733                   {
11734                      cellToActivate =
11735                         &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
11736                      if(cellToActivate->list.array)
11737                      {
11738                         for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
11739                         {
11740                            if(cellToActivate->list.array[arrIdx])
11741                            {
11742
11743                               if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
11744                               pLMN_Identity.buf)
11745                               {
11746                                  if(cellToActivate->list.array[0]->value.choice.\
11747                                        Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
11748                                  {
11749                                     free(cellToActivate->list.array[0]->value.choice.\
11750                                           Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
11751                                  }
11752
11753                                  free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
11754                                        nRCGI.pLMN_Identity.buf);
11755                               }
11756                               free(cellToActivate->list.array[arrIdx]);
11757                            }
11758                         }
11759                         free(cellToActivate->list.array);
11760                      }
11761                      break;
11762                   }
11763                case ProtocolIE_ID_id_TransactionID:
11764                   {
11765                      break;
11766                   }
11767                case ProtocolIE_ID_id_gNB_CU_Name:
11768                   {
11769                      free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
11770                      break;
11771                   }
11772                case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11773                   {
11774                      rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
11775                      if(rrcVer->latest_RRC_Version.buf)
11776                      {
11777                         if(rrcVer->iE_Extensions)
11778                         {
11779                            if(rrcVer->iE_Extensions->list.array)
11780                            {
11781                               if(rrcVer->iE_Extensions->list.array[0])
11782                               {
11783                                  if(rrcVer->iE_Extensions->list.\
11784                                        array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
11785                                  {
11786                                     free(rrcVer->iE_Extensions->list.\
11787                                           array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
11788                                  }
11789                                  free(rrcVer->iE_Extensions->list.array[0]);
11790                               }
11791                               free(rrcVer->iE_Extensions->list.array);
11792                            }
11793                            free(rrcVer->iE_Extensions);
11794                         }
11795                         free(rrcVer->latest_RRC_Version.buf);
11796                      }
11797                      break;
11798
11799                   }
11800                default:
11801                   {
11802                      DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11803                            f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
11804                   }
11805             }
11806             free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
11807          }
11808       }
11809       free(f1SetRspMsg->protocolIEs.list.array);
11810    }
11811 }
11812 /******************************************************************
11813  *
11814  * @brief Processes F1 Setup Response sent by CU
11815  *
11816  * @details
11817  *
11818  *    Function : procF1SetupRsp
11819  *
11820  *    Functionality: Processes F1 Setup Response sent by CU
11821  *
11822  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11823  * @return ROK     - success
11824  *         RFAILED - failure
11825  *
11826  * ****************************************************************/
11827 uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
11828 {
11829    uint8_t ret = ROK;
11830    uint16_t idx =0;
11831    F1SetupResponse_t *f1SetRspMsg = NULLP;
11832    GNB_CU_Name_t     *cuName = NULLP;
11833    F1SetupRsp  f1SetRspDb;
11834    RRC_Version_t      *rrcVer =NULLP;
11835    
11836    memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
11837
11838    DU_LOG("\nINFO   -->  F1AP : F1 Setup Response received");
11839    f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
11840
11841    for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
11842    {
11843       switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
11844       {
11845          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
11846             {
11847                extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
11848                      value.choice.Cells_to_be_Activated_List);
11849                break;
11850             }
11851          case ProtocolIE_ID_id_TransactionID:
11852             {
11853                f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
11854                                     value.choice.TransactionID;
11855                break;
11856             }
11857          case ProtocolIE_ID_id_gNB_CU_Name:
11858             {
11859                cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
11860                         value.choice.GNB_CU_Name;
11861                strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
11862                break;
11863             }
11864          case ProtocolIE_ID_id_GNB_CU_RRC_Version:
11865             {
11866                rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
11867                strcpy(f1SetRspDb.rrcVersion.rrcVer,
11868                      (const char*)rrcVer->latest_RRC_Version.buf);
11869                break;
11870             }
11871          default:
11872             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
11873                   f1SetRspMsg->protocolIEs.list.array[idx]->id);
11874       }
11875       duProcF1SetupRsp();
11876    }
11877    
11878    freeAperDecodeF1SetupRsp(f1SetRspMsg);
11879    return ret;
11880 }
11881 /*******************************************************************
11882 *
11883 * @brief free GNB DU config update ack
11884 *
11885 * @details
11886 *
11887 *    Function : freeAperDecodeGnbDuAck 
11888 *
11889 *    Functionality: Processes GNB DU config update ack And
11890 *                     added free part for the memory allocated by aper_decoder
11891 *
11892 * @params[in] F1AP_PDU_t ASN decoded F1AP message
11893 * @return ROK     - success
11894 *         RFAILED - failure
11895 *
11896 * ****************************************************************/
11897
11898 void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
11899 {
11900    uint8_t ieIdx = 0;
11901
11902    if(gnbDuAck->protocolIEs.list.array)
11903    {
11904       for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
11905       {
11906          if(gnbDuAck->protocolIEs.list.array[ieIdx])
11907          {
11908             free(gnbDuAck->protocolIEs.list.array[ieIdx]);
11909          }
11910       }
11911       free(gnbDuAck->protocolIEs.list.array);
11912    }
11913 }
11914
11915 /*******************************************************************
11916 *
11917 * @brief Building  result of gnb-du config update ack output
11918 *
11919 * @details
11920 *
11921 *    Function : duProcGnbDuCfgUpdAckMsg 
11922 *
11923 *    Functionality: 
11924 *        Building output of gnb-du config update ack 
11925 *
11926 * @params[in] transId
11927 * @return void
11928 *
11929 * ****************************************************************/
11930
11931 uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId)
11932 {
11933    uint8_t  ieIdx=0, arrIdx=0,ret=ROK;
11934    uint8_t  ueId =0 , ueIdx =0;
11935    uint16_t cellId =0, cellIdx =0, crnti=0;
11936    CmLList *f1apPduNode = NULLP;
11937    ReservedF1apPduInfo *f1apPduInfo =NULLP;
11938    F1AP_PDU_t *f1apMsgPdu = NULLP;
11939    GNBDUConfigurationUpdate_t *gnbDuConfigUpdate = NULLP;
11940    BIT_STRING_t *cellIdentity=NULLP;
11941    struct Served_Cells_To_Delete_ItemIEs *deleteItemIe=NULLP;
11942    Served_Cells_To_Delete_List_t *cellsToDelete=NULLP;
11943    Served_Cells_To_Delete_Item_t *deleteItem=NULLP;
11944
11945    DU_LOG("\nINFO   -->  DU APP: GNB-DU config update Ack received ");
11946    f1apPduNode = searchFromReservedF1apPduList(transId);
11947    f1apPduInfo = (ReservedF1apPduInfo *)f1apPduNode->node;
11948    f1apMsgPdu = (F1AP_PDU_t *)f1apPduInfo->f1apMsg;
11949
11950    if(f1apMsgPdu)
11951    {
11952       if(f1apMsgPdu->choice.initiatingMessage)
11953       {
11954          gnbDuConfigUpdate = &f1apMsgPdu->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
11955          for(ieIdx=0; ieIdx < gnbDuConfigUpdate->protocolIEs.list.count; ieIdx++)
11956          {
11957             switch(gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->id)
11958             {
11959                case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
11960                   {
11961                      cellsToDelete = &gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
11962                                      Served_Cells_To_Delete_List;
11963                      if(cellsToDelete->list.array)
11964                      {
11965                         if(cellsToDelete->list.array[arrIdx])
11966                         {
11967                            deleteItemIe = (Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx];
11968                            deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
11969                            if(deleteItem->oldNRCGI.nRCellIdentity.buf)
11970                            {
11971                               cellIdentity = &deleteItem->oldNRCGI.nRCellIdentity;
11972                               bitStringToInt(cellIdentity, &cellId);
11973                            }
11974                         }
11975                      }
11976
11977                      GET_CELL_IDX(cellId, cellIdx);
11978                      if(duCb.actvCellLst[cellIdx] != NULLP)
11979                      {
11980                         if(duCb.actvCellLst[cellIdx]->numActvUes == 0)
11981                         {
11982                            duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS;
11983                            ret = duSendCellDeletReq(cellId);
11984                            if(ret == RFAILED)
11985                            {
11986                               DU_LOG("ERROR  --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to send cell delete\
11987                               request for cellId[%d]", cellId);
11988                            }
11989                         }
11990                         else
11991                         {
11992                            for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++)
11993                            {
11994                               crnti = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti;
11995                               GET_UE_IDX(crnti,ueId);
11996                               ret = BuildAndSendUeContextReleaseReq(cellId, ueId);
11997                               if(ret == RFAILED)
11998                               {
11999                                  DU_LOG("ERROR  --> DU_APP : duProcGnbDuCfgUpdAckMsg(): Failed to build and send UE delete\
12000                                  request for cellId[%d]", cellId);
12001                               }
12002                            }
12003                         }
12004                      }
12005                      else
12006                      {
12007                         DU_LOG("ERROR  --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId);
12008                         ret = RFAILED;
12009                      }
12010                      break;
12011                   }
12012
12013                default:
12014                   break;
12015             }
12016          }
12017       }
12018    }
12019    
12020    FreeDUConfigUpdate(f1apMsgPdu);
12021    deleteFromReservedF1apPduList(f1apPduNode);
12022    return ret;
12023 }
12024
12025 /*******************************************************************
12026 *
12027 * @brief Processes GNB DU config update ack
12028 *
12029 * @details
12030 *
12031 *    Function : procF1GNBDUCfgUpdAck
12032 *
12033 *    Functionality: added free part for the memory allocated by aper_decoder
12034 *
12035 * @params[in] F1AP_PDU_t *f1apMsg 
12036 * @return void 
12037 *
12038 * ****************************************************************/
12039 uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
12040 {
12041    uint8_t ieIdx=0,transId=0;
12042    GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
12043
12044    DU_LOG("\nINFO   -->  F1AP : GNB-DU config update acknowledgment");
12045    gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
12046
12047    for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
12048    {
12049       switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
12050       {
12051          case ProtocolIE_ID_id_TransactionID:
12052             {
12053                transId = gnbDuAck->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
12054                break;
12055             }
12056          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
12057             {
12058                break;
12059             }
12060          default :
12061             {
12062                DU_LOG("\nERROR  -->  F1AP: procF1GNBDUCfgUpdAck(): Invalid IE Received: %ld", \
12063                      gnbDuAck->protocolIEs.list.array[ieIdx]->id);
12064                break;
12065             }
12066       }
12067    }
12068    
12069    duProcGnbDuCfgUpdAckMsg(transId);
12070     
12071 #if 0
12072    /* presently we are not supporting F1 Reset from DU to CU , we are only
12073     * supporting F1 Reset from CU to DU */
12074
12075    if(BuildAndSendF1ResetReq() != ROK)
12076    {
12077       return RFAILED;
12078    }
12079 #endif
12080
12081    freeAperDecodeGnbDuAck(gnbDuAck);
12082    return ROK;
12083 }
12084 /******************************************************************
12085 *
12086 * @brief free DL RRC Message Transfer allocated by aper_decoder 
12087 *
12088 * @details
12089 *
12090 *    Function : freeAperDecodef1DlRrcMsg 
12091 *
12092 *    Functionality: free DL RRC Message Transfer allocated by aper_decoder 
12093 *
12094 * @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg 
12095 * @return ROK     - success
12096 *         RFAILED - failure
12097 *
12098 * ****************************************************************/
12099
12100 void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
12101 {
12102    uint8_t ieIdx =0;
12103    RRCContainer_t *rrcContainer = NULLP;
12104
12105    if(f1DlRrcMsg->protocolIEs.list.array)
12106    {
12107       for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
12108       {
12109          if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
12110          {
12111             switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
12112             {
12113                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12114                   break;
12115                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12116                   break;
12117                case ProtocolIE_ID_id_SRBID:
12118                   break;
12119                case ProtocolIE_ID_id_RRCContainer:
12120                   {
12121                      rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
12122                      free(rrcContainer->buf);
12123                   }
12124                case ProtocolIE_ID_id_ExecuteDuplication:
12125                   break;
12126                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
12127                   break;
12128                   break;
12129             }
12130             free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
12131          }
12132       }
12133       free(f1DlRrcMsg->protocolIEs.list.array);
12134    }
12135 }
12136 /******************************************************************
12137  *
12138  * @brief Processes DL RRC Message Transfer  sent by CU
12139  *
12140  * @details
12141  *
12142  *    Function : procF1DlRrcMsgTrans
12143  *
12144  *    Functionality: Processes DL RRC Message Transfer sent by CU
12145  *
12146  * @params[in] F1AP_PDU_t ASN decoded F1AP message
12147  * @return ROK     - success
12148  *         RFAILED - failure
12149  *
12150  * ****************************************************************/
12151 uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
12152 {
12153    uint8_t  idx, ret;
12154    DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
12155    F1DlRrcMsg dlMsg;
12156    memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
12157
12158    DU_LOG("\nINFO   -->  DU_APP : DL RRC message transfer Recevied");
12159    f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
12160
12161    ret = ROK;
12162
12163    for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
12164    {
12165       switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
12166       {
12167          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12168             {
12169                dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
12170                break;
12171             }
12172          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12173             {
12174                dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
12175                break;
12176             }
12177          case ProtocolIE_ID_id_SRBID:
12178             {
12179                dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
12180                break;
12181             }
12182          case ProtocolIE_ID_id_ExecuteDuplication:
12183             dlMsg.execDup = true;
12184             break;
12185
12186          case ProtocolIE_ID_id_RRCContainer:
12187             {
12188                if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
12189                {
12190                   dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
12191                   DU_ALLOC_SHRABL_BUF(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
12192                   if(dlMsg.rrcMsgPdu)
12193                   {
12194                      memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
12195                         dlMsg.rrcMsgSize);
12196                   }
12197                   else
12198                   {
12199                      DU_LOG("\nERROR  -->  DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
12200                      return RFAILED;
12201                   }
12202                }
12203                else
12204                {
12205                   DU_LOG("\nERROR  -->  DU_APP : RRC Container Size is invalid:%ld",\
12206                   f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
12207                   return RFAILED;
12208                }
12209                break;
12210             }
12211          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
12212             {
12213                dlMsg.deliveryStatRpt = true;
12214                break;
12215             }
12216          default:
12217             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
12218                   f1DlRrcMsg->protocolIEs.list.array[idx]->id);
12219       }
12220    }
12221
12222    ret = duProcDlRrcMsg(&dlMsg);
12223
12224    freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
12225    return ret;
12226 }
12227 /*******************************************************************
12228  *
12229 * @brief Builds the DRB to be Setup Mod list
12230 *
12231 * @details
12232 *
12233 *    Function : 
12234 *
12235 *    Functionality: Constructs the DRB to be Setup Mod list
12236 *
12237 * @params[in] DRBs_SetupMod_List_t *drbSet
12238 *
12239 * @return ROK     - success
12240 *         RFAILED - failure
12241 *
12242 * ****************************************************************/
12243
12244 uint8_t BuildDrbSetupModList(DRBs_SetupMod_List_t *drbSet , DuUeCfg *ueCfg)
12245 {
12246    uint8_t arrIdx =0;
12247    uint8_t drbCnt =0;
12248    struct DRBs_SetupMod_ItemIEs *drbItemIe;
12249
12250    drbCnt = 1;
12251    drbSet->list.count = drbCnt;
12252    drbSet->list.size = drbCnt * sizeof(DRBs_SetupMod_ItemIEs_t *);
12253    DU_ALLOC(drbSet->list.array, drbSet->list.size);
12254    if(drbSet->list.array == NULLP)
12255    {
12256       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
12257       return  RFAILED;
12258    }
12259    for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
12260    {
12261       DU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_SetupMod_ItemIEs_t));
12262       if(drbSet->list.array[arrIdx] == NULLP)
12263       {
12264               DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
12265               return  RFAILED;
12266       }
12267
12268       drbItemIe = (struct DRBs_SetupMod_ItemIEs *)drbSet->list.array[arrIdx];
12269       drbItemIe->id = ProtocolIE_ID_id_DRBs_SetupMod_Item;
12270       drbItemIe->criticality = Criticality_reject;
12271       drbItemIe->value.present = DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
12272       drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
12273       if(fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List,\
12274       &ueCfg->upTnlInfo[arrIdx])!= ROK)
12275       {
12276          DU_LOG("\nERROR  -->  F1AP : Failed to fill DlTnl SetupList in BuildDrbToBeSetupModList");
12277          return RFAILED;
12278       }
12279       
12280    }
12281
12282    return ROK;
12283 }
12284 /*******************************************************************
12285 * @brief Free the memory allocated for DRB setup List
12286 *
12287 * @details
12288 *
12289 *    Function : FreeDrbSetupModList 
12290 *
12291 *    Functionality:
12292 *       Free the memory allocated for DRB setup list
12293 *
12294 * @params[in] DRBs_Setup_List_t *
12295 * @return void
12296 *
12297 * ****************************************************************/
12298 void FreeDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
12299 {
12300    uint8_t arrIdx = 0;
12301    DRBs_SetupMod_ItemIEs_t *drbItemIe = NULLP;
12302
12303    for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
12304    {
12305       drbItemIe = ((DRBs_SetupMod_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
12306       freeDlTnlInfo(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
12307       DU_FREE(drbSetupList->list.array[arrIdx], sizeof(DRBs_SetupMod_ItemIEs_t));
12308    }
12309    DU_FREE(drbSetupList->list.array, drbSetupList->list.size);
12310 }
12311 /*******************************************************************
12312 * @brief Free the memory allocated for UE Context Mod Response
12313 *
12314 * @details
12315 *
12316 *    Function : FreeUeContextModResp 
12317 *
12318 *    Functionality:
12319 *       Free the memory allocated for UE Context Mod Response
12320 *
12321 * @params[in] F1AP_PDU_t *f1apMsg
12322 * @return void
12323 *
12324 * ****************************************************************/
12325
12326 void FreeUeContextModResp(F1AP_PDU_t *f1apMsg)
12327 {
12328    uint8_t ieIdx;
12329    UEContextModificationResponse_t *ueContextModifyRes = NULLP;
12330    if(f1apMsg)
12331    {
12332       if(f1apMsg->choice.successfulOutcome)
12333       {
12334          ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
12335          if(ueContextModifyRes->protocolIEs.list.array)
12336          {
12337             for(ieIdx=0 ; ieIdx<ueContextModifyRes->protocolIEs.list.count; ieIdx++)
12338             {
12339                if(ueContextModifyRes->protocolIEs.list.array[ieIdx])
12340                {
12341                   switch(ueContextModifyRes->protocolIEs.list.array[ieIdx]->id)
12342                   {
12343                      case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12344                         break;
12345                      case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12346                         break;
12347                      case ProtocolIE_ID_id_DRBs_SetupMod_List:
12348                         {
12349                             FreeDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
12350                             value.choice.DRBs_SetupMod_List));
12351                             break; 
12352                         }
12353                   }
12354                   DU_FREE(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
12355                }
12356
12357             }
12358             DU_FREE(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
12359          }
12360          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12361       }
12362       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12363    }
12364 }
12365
12366 /*****************************************************************i
12367 *
12368 * @brief Creating the ue context modifcation response and sending
12369 *
12370 * @details
12371 *
12372 *    Function : BuildAndSendUeContextModRsp 
12373 *
12374 *    Functionality:
12375 *         - Creating the ue context modifcation response 
12376 *
12377 * @params[in] uint8_t cellId,uint8_t ueIdx
12378 * @return ROK     - success
12379 *         RFAILED - failure
12380 *
12381 * ****************************************************************/
12382 uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx)
12383 {
12384    uint8_t   ieIdx = 0;
12385    uint8_t   cellIdx =0;
12386    uint8_t   elementCnt = 0;
12387    uint8_t   ret = RFAILED;
12388    uint32_t  gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
12389    uint32_t  gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
12390    F1AP_PDU_t *f1apMsg = NULLP;
12391    asn_enc_rval_t         encRetVal;
12392    UEContextModificationResponse_t *ueContextModifyRes = NULLP;
12393    DuUeCb                   *ueCb = NULLP;
12394
12395    DU_LOG("\nINFO  -->  F1AP : Building Ue context modification response\n");
12396
12397    while(1)
12398    {
12399       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12400       if(f1apMsg == NULLP)
12401       {
12402          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
12403          break;
12404       }
12405
12406       f1apMsg->present =  F1AP_PDU_PR_successfulOutcome;
12407
12408       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
12409       if(f1apMsg->choice.successfulOutcome == NULLP)
12410       {
12411          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
12412          break;
12413       }
12414       f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextModification;
12415       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
12416       f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_UEContextModificationResponse;
12417
12418       ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
12419
12420       elementCnt = 3;
12421       ueContextModifyRes->protocolIEs.list.count = elementCnt;
12422       ueContextModifyRes->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationResponse_t*);
12423
12424       /* Initialize the UE context modification members */
12425       DU_ALLOC(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
12426       if(ueContextModifyRes->protocolIEs.list.array == NULLP)
12427       {
12428          DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE context modifcation Request failed");
12429          break;
12430       }
12431
12432       for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
12433       {
12434          DU_ALLOC(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
12435          if(ueContextModifyRes->protocolIEs.list.array[ieIdx] == NULLP)
12436          {
12437             DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE context modifcation Request failed");
12438             break;
12439          }
12440       }
12441
12442       /* Fetching Ue Cb Info*/
12443       GET_CELL_IDX(cellId, cellIdx);
12444       gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
12445       gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
12446       ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
12447
12448       ieIdx=0;
12449       ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
12450       ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12451       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
12452       UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
12453       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
12454
12455       ieIdx++;
12456       ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
12457       ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12458       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present=\
12459       UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
12460       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
12461
12462       ieIdx++;
12463       ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List;
12464       ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
12465       ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
12466       UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
12467       if(ueCb->f1UeDb)
12468       {
12469          ret = BuildDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
12470                   value.choice.DRBs_SetupMod_List) , &ueCb->f1UeDb->duUeCfg);
12471          if(ret != ROK)
12472          {
12473             DU_LOG( "\nERROR  -->  F1AP : Failed to build drb setupmod List ");
12474             break;
12475          }
12476          freeF1UeDb(ueCb->f1UeDb);
12477          ueCb->f1UeDb = NULLP;
12478       }
12479       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
12480
12481       /* Encode the F1SetupRequest type as APER */
12482       memset(encBuf, 0, ENC_BUF_MAX_LEN);
12483       encBufSize = 0;
12484       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,encBuf);
12485
12486       /* Encode results */
12487       if(encRetVal.encoded == ENCODE_FAIL)
12488       {
12489          DU_LOG( "\nERROR  -->  F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
12490                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
12491          ret = RFAILED;
12492          break;
12493       }
12494       else
12495       {
12496          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UE Context Modification Response\n");
12497          for(int i=0; i< encBufSize; i++)
12498          {
12499             printf("%x",encBuf[i]);
12500          }
12501       }
12502
12503       /* Sending  msg  */
12504       if(sendF1APMsg() != ROK)
12505       {
12506          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Setup Res Failed");
12507          ret = RFAILED;
12508          break;
12509       }
12510       break;
12511    }
12512    FreeUeContextModResp(f1apMsg);
12513    return ret;
12514 }
12515 /*******************************************************************
12516  *
12517  * @brief Deallocating the memory allocated by the aper decoder
12518  *          for QOSInfo
12519  *
12520  * @details
12521  *
12522  *    Function : freeAperDecodeQosInfo
12523  *
12524  *    Functionality:  Deallocating the memory allocated for QOSInfo
12525  *
12526  * @params[in] QoSFlowLevelQoSParameters_t *drbQos
12527  *
12528  * @return void
12529  *
12530  * ****************************************************************/
12531
12532 void freeAperDecodeQosInfo(QoSFlowLevelQoSParameters_t *drbQos)
12533 {
12534    if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
12535    {
12536       if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
12537       {
12538          if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
12539          {
12540             free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
12541          }
12542          free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
12543       }
12544       free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI);
12545    }
12546 }
12547 /*******************************************************************
12548  *
12549  * @brief Deallocating the memory allocated by the aper decoder
12550  *          for UlTnlInfoforDrb
12551  *
12552  * @details
12553  *
12554  *    Function : freeAperDecodeUlTnlInfoforDrbSetupMod 
12555  *
12556  *    Functionality:  Deallocating memory allocated for UlTnlInfoforDrb
12557  *
12558  * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
12559  *
12560  * @return void
12561  *
12562  * ****************************************************************/
12563 void freeAperDecodeUlTnlInfoforDrbSetupMod(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
12564 {
12565    uint8_t arrIdx =0;
12566
12567    if(ulInfo->list.array)
12568    {
12569       for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
12570       {
12571          if(ulInfo->list.array[arrIdx])
12572          {
12573             if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
12574             {
12575                if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
12576                {
12577                   if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
12578                   {
12579                      free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
12580                            gTP_TEID.buf);
12581                   }
12582                   free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
12583                         transportLayerAddress.buf);
12584                }
12585                free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel);
12586             }
12587             free(ulInfo->list.array[arrIdx]);
12588          }
12589       }
12590       free(ulInfo->list.array);
12591    }
12592 }
12593 /*******************************************************************
12594  *
12595  * @brief Deallocating the memory allocated by the aper decoder
12596  *          for DrbSetupModItem  
12597  *
12598  * @details
12599  *
12600  *    Function : freeAperDecodeDrbSetupModItem 
12601  *
12602  *    Functionality:  Deallocating memory allocated for DrbSetupModItem
12603  *
12604  * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
12605  *
12606  * @return void
12607  *
12608  * ****************************************************************/
12609
12610 void freeAperDecodeDrbSetupModItem(DRBs_ToBeSetupMod_Item_t *drbItem)
12611 {
12612    uint8_t arrIdx =0;
12613    SNSSAI_t *snssai =NULLP;
12614    Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
12615
12616    drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
12617    switch(drbItem->qoSInformation.present)
12618    {
12619       case QoSInformation_PR_NOTHING:
12620          break;
12621       case QoSInformation_PR_eUTRANQoS:
12622          {
12623             if(drbItem->qoSInformation.choice.eUTRANQoS)
12624             {
12625                free(drbItem->qoSInformation.choice.eUTRANQoS);
12626             }
12627             break;
12628          }
12629       case QoSInformation_PR_choice_extension:
12630          {
12631             if(drbItem->qoSInformation.choice.choice_extension)
12632             {
12633                freeAperDecodeQosInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.\
12634                      DRB_Information.dRB_QoS);
12635                snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
12636                if(snssai->sST.buf)
12637                {
12638                   free(snssai->sST.buf);
12639                }
12640                if(snssai->sD)
12641                {
12642                   if(snssai->sD->buf)
12643                   {
12644                      free(snssai->sD->buf);
12645                   }
12646                   free(snssai->sD);
12647                }
12648
12649                flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.\
12650                          DRB_Information.flows_Mapped_To_DRB_List;
12651                if(flowMap->list.array)
12652                {
12653                   for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
12654                   {
12655                      if(flowMap->list.array[arrIdx] )
12656                      {
12657                         freeAperDecodeQosInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
12658                         free(flowMap->list.array[arrIdx]);
12659                      }
12660                   }
12661                   free(flowMap->list.array);
12662                }
12663
12664                free(drbItem->qoSInformation.choice.choice_extension);
12665             }
12666             break;
12667          }
12668
12669    }
12670    freeAperDecodeUlTnlInfoforDrbSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List);
12671    if(drbItem->uLConfiguration)
12672    {
12673       free(drbItem->uLConfiguration);
12674    }
12675 }
12676
12677 /*******************************************************************
12678  *
12679  * @brief Deallocating the memory allocated by the aper decoder
12680  *          for DrbToBeSetupModList
12681  *
12682  * @details
12683  *
12684  *    Function : freeAperDecodeDrbToBeSetupModList
12685  *
12686  *    Functionality:  Deallocating memory allocated for DrbToBeSetupModList
12687  *
12688  * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
12689  *
12690  * @return void
12691  *
12692  * ****************************************************************/
12693
12694 void freeAperDecodeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
12695 {
12696    uint8_t arrIdx =0;
12697    struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
12698
12699    if(drbSet->list.array)
12700    {
12701       for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
12702       {
12703          if(drbSet->list.array[arrIdx] != NULLP)
12704          {
12705             if(arrIdx == 0)
12706             {
12707                drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
12708                freeAperDecodeDrbSetupModItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
12709             }
12710             free(drbSet->list.array[arrIdx]);
12711          }
12712       }
12713       free(drbSet->list.array);
12714    }
12715
12716 }
12717 /*******************************************************************
12718  *
12719  * @brief Deallocating the memory allocated by the aper decoder
12720  *          for UeContextModificationReqMsg
12721  *
12722  * @details
12723  *
12724  *    Function : freeAperDecodeUeContextModificationReqMsg
12725  *
12726  *    Functionality:  Deallocating memory allocated for
12727  *                  UeContextModificationReqMsg
12728  *
12729  * @params[in] UEContextModificationRequest_t *UeContextModifyReq
12730  *
12731  * @return void
12732  *
12733  * ****************************************************************/
12734 void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *UeContextModifyReq )
12735 {
12736    uint8_t arrIdx, ieId;
12737
12738    if(UeContextModifyReq->protocolIEs.list.array)
12739    {
12740       for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
12741       {
12742          if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
12743          {
12744             ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
12745             switch(ieId)
12746             {
12747                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12748                   break;
12749                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12750                   break;
12751                case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
12752                   {
12753                      freeAperDecodeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->\
12754                            value.choice.DRBs_ToBeSetupMod_List);
12755                      break;
12756                   }
12757             }
12758             free(UeContextModifyReq->protocolIEs.list.array[arrIdx]);
12759          }
12760       }
12761       free(UeContextModifyReq->protocolIEs.list.array);
12762    }
12763 }
12764 /*******************************************************************
12765  *
12766  * @brief processing the F1 UeContextModificationReq
12767  *
12768  * @details
12769  *
12770  *    Function : procF1UeContextModificationReq
12771  *
12772  *    Functionality:  processing the F1 UeContextModificationReq
12773  *
12774  * @params[in] F1AP_PDU_t *f1apMsg
12775  *
12776  * @return
12777  * ****************************************************************/
12778 uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg)
12779 {
12780    UEContextModificationRequest_t *ueContextModifyReq = NULLP;
12781    uint8_t  ret = ROK, ieIdx = 0, lcId =0,cellIdx=0, ueIdx=0;
12782    DuUeCb   *duUeCb = NULLP;
12783    DRBs_ToBeSetupMod_List_t *drbSetupModCfg;
12784    uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
12785
12786    ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
12787    for(ieIdx=0; (ieIdx < ueContextModifyReq->protocolIEs.list.count && ret == ROK); ieIdx++)
12788    {
12789       switch(ueContextModifyReq->protocolIEs.list.array[ieIdx]->id)
12790       {
12791          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
12792             {
12793                gnbCuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
12794                break;
12795             }
12796          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
12797             {
12798                gnbDuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
12799                break;
12800             }
12801          case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
12802             {
12803                for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++)
12804                {
12805                   for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++)
12806                   {
12807                      if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
12808                            (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
12809                      {
12810
12811                         duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
12812                         lcId = getDrbLcId(&duUeCb->drbBitMap);
12813                         if(lcId != RFAILED)
12814                         {
12815                            DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
12816                            if(duUeCb->f1UeDb)
12817                            {
12818                               duUeCb->f1UeDb->actionType = UE_CTXT_MOD;
12819                               drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\
12820                               choice.DRBs_ToBeSetupMod_List;
12821                               if(extractDrbListToSetup(lcId, NULL, drbSetupModCfg ,drbSetupModCfg->list.count, \
12822                               &duUeCb->f1UeDb->duUeCfg))
12823                               {
12824                                  DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
12825                                  ret = RFAILED;
12826                               }
12827                            }
12828                         }
12829                         break;
12830                      }
12831                   }
12832                   if(ueIdx >= duCb.actvCellLst[cellIdx]->numActvUes)
12833                   {
12834                      DU_LOG("\nERROR  -->  DU APP : wrong values of gnbCuUeF1apId and gnbDuUeF1apId ");
12835                      ret = RFAILED;
12836                   }
12837                }
12838                break;
12839             }
12840       }
12841    }
12842    if(ret != RFAILED)
12843    {
12844       ret = duProcUeContextModReq(duUeCb);
12845    }
12846    freeAperDecodeUeContextModificationReqMsg(ueContextModifyReq);
12847    return ret; 
12848 }
12849 /*****************************************************************i
12850 *
12851 * @brief Free memory allocated for UE Context Release Request
12852 *
12853 * @details
12854 *
12855 *    Function : FreeUeContextReleaseReq
12856 *
12857 *    Functionality:
12858 *         - Free memory allocated for UE Context Release Request
12859 *
12860 * @params[in] F1AP_PDU_t *f1apMsg
12861 * @return void 
12862 *
12863 * *************************************************************/
12864 void FreeUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
12865 {
12866    uint8_t ieIdx;
12867    UEContextReleaseRequest_t *ueReleaseReq = NULLP;
12868    
12869    if(f1apMsg)
12870    {
12871       if(f1apMsg->choice.initiatingMessage)
12872       {
12873          ueReleaseReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
12874          if(ueReleaseReq->protocolIEs.list.array)
12875          {
12876             for(ieIdx=0 ; ieIdx<ueReleaseReq->protocolIEs.list.count; ieIdx++)
12877             {
12878                DU_FREE(ueReleaseReq->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseRequest_t));
12879             }
12880             DU_FREE(ueReleaseReq->protocolIEs.list.array, ueReleaseReq->protocolIEs.list.size);
12881          }
12882          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12883       }
12884       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
12885    }
12886
12887 }
12888 /*****************************************************************i
12889 *
12890 * @brief Build and Send UE Context Release Request  
12891 *
12892 * @details
12893 *
12894 *    Function : BuildAndSendUeContextReleaseReq
12895 *
12896 *    Functionality:
12897 *         - Build and Send UE Context Release Request 
12898 *
12899 * @params[in]
12900 * @return ROK     - success
12901 *         RFAILED - failure
12902 *
12903 * *************************************************************/
12904 uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueIdx)
12905 {
12906    bool memAllocFail = false;
12907    uint8_t ieIdx =0;
12908    uint8_t ret = RFAILED;
12909    uint16_t cellIdx =0;
12910    uint16_t crnti = 0;
12911    uint8_t  elementCnt = 0;
12912    uint32_t  gnbCuUeF1apId =0;   /* gNB-CU UE F1AP Id */
12913    uint32_t  gnbDuUeF1apId =0;   /* gNB-DU UE F1AP Id */
12914    asn_enc_rval_t encRetVal; 
12915    F1AP_PDU_t *f1apMsg = NULLP;
12916    UEContextReleaseRequest_t *ueReleaseReq = NULLP;
12917
12918    DU_LOG("\nINFO  --> Building the UE Context Release Request");
12919    do
12920    {
12921       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
12922       if(f1apMsg == NULLP)
12923       {
12924          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for f1apMsg");
12925          break;
12926       }
12927
12928       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
12929       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
12930       if(f1apMsg->choice.initiatingMessage == NULLP)
12931       {
12932          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for\
12933          initiatingMessage");   
12934          break;
12935       }
12936       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextReleaseRequest;
12937       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
12938       f1apMsg->choice.initiatingMessage->value.present = \
12939       InitiatingMessage__value_PR_UEContextReleaseRequest;
12940
12941       ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
12942
12943       elementCnt = 2;
12944
12945       ueReleaseReq->protocolIEs.list.count = elementCnt;
12946       ueReleaseReq->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseRequest_t *);
12947
12948       /* Initialize the F1Setup members */
12949       DU_ALLOC(ueReleaseReq->protocolIEs.list.array,ueReleaseReq->protocolIEs.list.size);
12950       if(ueReleaseReq->protocolIEs.list.array == NULLP)
12951       {
12952          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE array");
12953          break;
12954       }
12955       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
12956       {
12957          DU_ALLOC(ueReleaseReq->protocolIEs.list.array[ieIdx],\
12958                sizeof(UEContextReleaseRequest_t));
12959          if(ueReleaseReq->protocolIEs.list.array[ieIdx] == NULLP)
12960          {
12961             DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE elements");
12962             memAllocFail = true;  
12963             break;
12964          }
12965       }
12966       if(memAllocFail == true)
12967          break;
12968
12969       /* Fetching Ue Cb Info*/
12970       GET_CELL_IDX(cellId, cellIdx);
12971       if(duCb.actvCellLst[cellIdx] == NULLP)
12972       {
12973          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): CellId[%d] does not exist", cellId);
12974          break;
12975       }
12976       else
12977       {
12978          GET_CRNTI(crnti, ueIdx);
12979          if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti != crnti)
12980          {
12981             DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseReq(): crnti[%d] does not exist", crnti);
12982             break;
12983          }
12984          gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
12985          gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
12986       }
12987
12988       ieIdx=0; 
12989       ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; 
12990       ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
12991       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present = \
12992       UEContextReleaseRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
12993       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
12994       
12995       ieIdx++;
12996       ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
12997       ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
12998       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present =\
12999       UEContextReleaseRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
13000       ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
13001       
13002       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
13003
13004       /* Encode the F1SetupRequest type as APER */
13005       memset(encBuf, 0, ENC_BUF_MAX_LEN);
13006       encBufSize = 0;
13007       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
13008       /* Encode results */
13009       if(encRetVal.encoded == ENCODE_FAIL)
13010       {
13011          DU_LOG("\nERROR  -->  F1AP : Could not encode UEContextReleaseRequest structure (at %s)\n",\
13012                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
13013          break;
13014       }
13015       else
13016       {
13017          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UEContextReleaseRequest\n");
13018          for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
13019          {
13020             printf("%x",encBuf[ieIdx]);
13021          }
13022       }
13023
13024       /* Sending msg */
13025       if(sendF1APMsg() != ROK)
13026       {
13027          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Release Request failed");
13028          break;
13029       }
13030       ret = ROK;
13031       break;
13032    }while(true);
13033
13034    FreeUeContextReleaseReq(f1apMsg);
13035    return ret;
13036 }
13037 /*****************************************************************i
13038  *
13039  * @brief Free memory allocated for UE Context Release Complete
13040  *
13041  * @details
13042  *
13043  *    Function : FreeUeContextReleaseComplete
13044  *
13045  *    Functionality:
13046  *         - Free memory allocated for UE Context Release Complete
13047  *
13048  * @params[in] F1AP_PDU_t *f1apMsg
13049  * @return void
13050  *
13051  * *************************************************************/
13052 void FreeUeContextReleaseComplete(F1AP_PDU_t *f1apMsg)
13053 {
13054    uint8_t ieIdx;
13055    UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
13056
13057    if(f1apMsg)
13058    {
13059       if(f1apMsg->choice.successfulOutcome)
13060       {
13061          ueReleaseComplete =&f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
13062          if(ueReleaseComplete->protocolIEs.list.array)
13063          {
13064             for(ieIdx=0 ; ieIdx<ueReleaseComplete->protocolIEs.list.count; ieIdx++)
13065             {
13066                DU_FREE(ueReleaseComplete->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseComplete_t));
13067             }
13068             DU_FREE(ueReleaseComplete->protocolIEs.list.array, ueReleaseComplete->protocolIEs.list.size);
13069          }
13070          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
13071       }
13072       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
13073    }
13074
13075 }
13076 /*****************************************************************i
13077  *
13078  * @brief Build and Send UE Context Release Complete
13079  *
13080  * @details
13081  *
13082  *    Function : BuildAndSendUeContextReleaseComplete
13083  *
13084  *    Functionality:
13085  *         - Build and Send UE Context Release Complete
13086  *
13087  * @params[in]  cellId,  gnbCuUeF1apId, gnbDuUeF1apId
13088  * @return ROK     - success
13089  *         RFAILED - failure
13090  *
13091  * *************************************************************/
13092 uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1apId, uint32_t gnbDuUeF1apId)
13093 {
13094    bool memAllocFail = false;
13095    uint8_t ieIdx =0, ret = RFAILED, elementCnt = 0;
13096    asn_enc_rval_t encRetVal;
13097    F1AP_PDU_t *f1apMsg = NULLP;
13098    UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
13099
13100    DU_LOG("\nINFO  --> Building the UE Context Release Complete");
13101    do
13102    {
13103       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
13104       if(f1apMsg == NULLP)
13105       {
13106          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for f1apMsg");
13107          break;
13108       }
13109
13110       f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
13111       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
13112       if(f1apMsg->choice.successfulOutcome == NULLP)
13113       {
13114          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for\
13115                successfulOutcome");
13116          break;
13117       }
13118       f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextRelease;
13119       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
13120       f1apMsg->choice.successfulOutcome->value.present = \
13121       SuccessfulOutcome__value_PR_UEContextReleaseComplete;
13122
13123       ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
13124
13125       elementCnt = 2;
13126       ueReleaseComplete->protocolIEs.list.count = elementCnt;
13127       ueReleaseComplete->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseComplete_t *);
13128
13129       /* Initialize the UE Release Complete members */
13130       DU_ALLOC(ueReleaseComplete->protocolIEs.list.array,ueReleaseComplete->protocolIEs.list.size);
13131       if(ueReleaseComplete->protocolIEs.list.array == NULLP)
13132       {
13133          DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE array");
13134          break;
13135       }
13136       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
13137       {
13138          DU_ALLOC(ueReleaseComplete->protocolIEs.list.array[ieIdx],\
13139                sizeof(UEContextReleaseComplete_t));
13140          if(ueReleaseComplete->protocolIEs.list.array[ieIdx] == NULLP)
13141          {
13142             DU_LOG("\nERROR  -->  F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE\
13143             elements");
13144             memAllocFail = true;
13145             break;
13146          }
13147       }
13148       if(memAllocFail == true)
13149          break;
13150
13151
13152       ieIdx=0;
13153       ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
13154       ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
13155       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present = \
13156       UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID;
13157       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
13158
13159       ieIdx++;
13160       ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
13161       ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
13162       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present =\
13163       UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID;
13164       ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
13165
13166       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
13167
13168       /* Encode the F1SetupComplete type as APER */
13169       memset(encBuf, 0, ENC_BUF_MAX_LEN);
13170       encBufSize = 0;
13171       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
13172       /* Encode results */
13173       if(encRetVal.encoded == ENCODE_FAIL)
13174       {
13175          DU_LOG("\nERROR  -->  F1AP : Could not encode UEContextReleaseComplete structure (at %s)\n",\
13176                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
13177          break;
13178       }
13179       else
13180       {
13181          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UEContextReleaseComplete\n");
13182          for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
13183          {
13184             printf("%x",encBuf[ieIdx]);
13185          }
13186       }
13187
13188       /* Sending msg */
13189       if(sendF1APMsg() != ROK)
13190       {
13191          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Release Complete failed");
13192          break;
13193       }
13194       ret = ROK;
13195       break;
13196    }while(true);
13197    
13198    if(ret == ROK)
13199    {
13200       duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS;
13201       ret = duSendCellDeletReq(cellId);
13202       if(ret != ROK)
13203       {
13204          DU_LOG("\nERROR  -->  F1AP: BuildAndSendUeContextReleaseComplete(): Failed to process cell\
13205                Delete req for CellId");
13206       }
13207    }
13208    FreeUeContextReleaseComplete(f1apMsg);
13209    return ret;
13210
13211 }
13212
13213 /*******************************************************************
13214 *
13215 * @brief added free part for the memory allocated by aper_decoder 
13216 *
13217 * @details
13218 *
13219 *    Function : freeAperDecodeUeContextReleaseCommand 
13220 *
13221 *    Functionality: added free part for the memory allocated by aper_decoder
13222 *
13223 * @params[in] F1AP_PDU_t *f1apMsg
13224 * @return void
13225 *
13226 * ****************************************************************/
13227 void freeAperDecodeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
13228 {
13229    uint8_t ieIdx=0;
13230    UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
13231
13232    ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
13233    
13234    if(ueContextReleaseCommand->protocolIEs.list.array)
13235    {
13236       for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
13237       {
13238          if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
13239          {
13240             switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
13241             {
13242                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
13243                   break;
13244                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
13245                   break;
13246                case ProtocolIE_ID_id_Cause:
13247                   break;
13248                case ProtocolIE_ID_id_RRCContainer:
13249                {
13250                   if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
13251                   {
13252                      free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
13253                   }
13254                   break;
13255                }
13256                default :
13257                   DU_LOG("\nERROR  -->  F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
13258                        ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
13259                   break;
13260             }
13261          }
13262          free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]);
13263       }
13264       free(ueContextReleaseCommand->protocolIEs.list.array);
13265    }
13266 }
13267 /*******************************************************************
13268 *
13269 * @brief processing of UE Context Release Command
13270 *
13271 * @details
13272 *
13273 *    Function : procF1UeContextReleaseCommand 
13274 *
13275 *    Functionality: processing of UE Context Release Command
13276 *
13277 * @params[in] F1AP_PDU_t *f1apMsg
13278 * @return void
13279 *
13280 * ****************************************************************/
13281 uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
13282 {
13283    uint8_t  ieIdx=0, ret=ROK, ueIdx=0;
13284    uint16_t cellIdx =0;
13285    bool ueIdxFound;
13286    uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0;
13287    DuUeCb   *duUeCb = NULLP;
13288    UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
13289
13290    ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
13291
13292    if(ueContextReleaseCommand->protocolIEs.list.array)
13293    {
13294       for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
13295       {
13296          if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
13297          {
13298             switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
13299             {
13300                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
13301                   {
13302                      gnbCuUeF1apId= ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
13303                                     value.choice.GNB_CU_UE_F1AP_ID;
13304                      break;
13305                   }
13306
13307                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
13308                   {
13309                      gnbDuUeF1apId = ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
13310                                      value.choice.GNB_DU_UE_F1AP_ID;
13311                      break;
13312                   }
13313
13314                case ProtocolIE_ID_id_Cause:
13315                   {
13316                      break;
13317                   }
13318
13319                case ProtocolIE_ID_id_RRCContainer:
13320                   {
13321                      for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++)
13322                      {
13323                         for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++)
13324                         {
13325                            if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
13326                                  (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
13327                            {
13328                               duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
13329                               DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
13330                               if(duUeCb->f1UeDb)
13331                               {
13332                                  memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
13333                                  duUeCb->f1UeDb->actionType = UE_CTXT_RELEASE;
13334                                  duUeCb->f1UeDb->cellIdx = cellIdx;
13335                                  /* Filling Dl RRC Msg Info */
13336                                  DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
13337                                  if(!duUeCb->f1UeDb->dlRrcMsg)
13338                                  {
13339                                     DU_LOG("\nERROR  -->  DU APP : procF1UeContextReleaseCommand(): \
13340                                     Memory allocation failed ");
13341                                     ret = RFAILED;
13342                                  }
13343                                  else
13344                                  {
13345                                     duUeCb->f1UeDb->dlRrcMsgPres = true;
13346                                     memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
13347                                     ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
13348                                           &ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
13349                                           value.choice.RRCContainer);
13350                                  }
13351
13352                               }
13353                               else
13354                               {
13355                                  DU_LOG("\nERROR  -->  DU APP : procF1UeContextReleaseCommand(): \
13356                                  Memory allocation failed ");
13357                                  ret = RFAILED;
13358
13359                               }
13360
13361                               ueIdxFound = true;
13362                               break;
13363                            }
13364                         }
13365                         if(ueIdxFound == true)
13366                         {
13367                            break;
13368                         }
13369                      }
13370                      if(!ueIdxFound)
13371                      {
13372                         DU_LOG("\nERROR  -->  F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
13373                         ret = RFAILED;
13374                      }
13375
13376
13377                      break;
13378                   }
13379                default :
13380                   DU_LOG("\nERROR  -->  F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
13381                         ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
13382                   break;
13383             }
13384          }
13385       }
13386    }
13387    if(ret != RFAILED)
13388    {
13389       duProcUeContextReleaseCommand(duUeCb);
13390    }
13391    freeAperDecodeUeContextReleaseCommand(f1apMsg);
13392    return ret;
13393 }
13394 /**************************************************************
13395  *
13396  * @brief Handles received F1AP message and sends back response  
13397  *
13398  * @details
13399  *
13400  *    Function : F1APMsgHdlr
13401  *
13402  *    Functionality:
13403  *         - Decodes received F1AP control message
13404  *         - Prepares response message, encodes and sends to SCTP
13405  *
13406  * @params[in] 
13407  * @return ROK     - success
13408  *         RFAILED - failure
13409  *
13410  * ****************************************************************/
13411 void F1APMsgHdlr(Buffer *mBuf)
13412 {
13413    int i =0;
13414    char *recvBuf =NULLP;
13415    MsgLen copyCnt =0;
13416    MsgLen recvBufLen =0;
13417    F1AP_PDU_t *f1apMsg =NULLP;
13418    asn_dec_rval_t rval; /* Decoder return value */
13419    F1AP_PDU_t f1apasnmsg ;
13420    DU_LOG("\nINFO  -->  F1AP : Received F1AP message buffer");
13421    ODU_PRINT_MSG(mBuf, 0,0);
13422
13423    /* Copy mBuf into char array to decode it */
13424    ODU_GET_MSG_LEN(mBuf, &recvBufLen);
13425    DU_ALLOC(recvBuf, (Size)recvBufLen);
13426
13427    if(recvBuf == NULLP)
13428    {
13429       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed");
13430       return;
13431    }
13432    if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
13433    {
13434       DU_LOG("\nERROR   -->  F1AP : Failed while copying %d", copyCnt);
13435       return;
13436    }
13437
13438    printf("\nDEBUG   -->  F1AP : Received flat buffer to be decoded : ");
13439    for(i=0; i< recvBufLen; i++)
13440    {
13441       printf("%x",recvBuf[i]);
13442    }
13443
13444    /* Decoding flat buffer into F1AP messsage */
13445    f1apMsg = &f1apasnmsg;
13446    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
13447
13448    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
13449    DU_FREE(recvBuf, (Size)recvBufLen);
13450
13451    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
13452    {
13453       DU_LOG("\nERROR  -->  F1AP : ASN decode failed");
13454       return;
13455    }
13456    printf("\n");
13457    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
13458
13459    switch(f1apMsg->present)
13460    {
13461       case F1AP_PDU_PR_successfulOutcome:
13462          {
13463             switch(f1apMsg->choice.successfulOutcome->value.present)
13464             {
13465                case SuccessfulOutcome__value_PR_ResetAcknowledge:
13466                   {
13467                      DU_LOG("\nINFO   -->  F1AP : F1ResetAcknowledge is received successfully ");
13468                      break;
13469                   }
13470                case SuccessfulOutcome__value_PR_F1SetupResponse:
13471                   {                             
13472 #ifndef ODU_TEST_STUB
13473                      procF1SetupRsp(f1apMsg);
13474 #endif
13475                      break;
13476                   }
13477
13478                case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
13479                   {
13480                      procF1GNBDUCfgUpdAck(f1apMsg);
13481                      break;
13482                   }
13483
13484                default:
13485                   {
13486                      DU_LOG("\nERROR  -->  F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
13487                            f1apMsg->choice.successfulOutcome->value.present);
13488                      return;
13489                   }
13490             }/* End of switch(successfulOutcome) */
13491             free(f1apMsg->choice.successfulOutcome);
13492             break;
13493          }
13494       case F1AP_PDU_PR_initiatingMessage:
13495          {
13496             switch(f1apMsg->choice.initiatingMessage->value.present)
13497             {
13498                case InitiatingMessage__value_PR_Reset:
13499                   {
13500                      procF1ResetReq(f1apMsg);
13501                      break;
13502                   }
13503                case InitiatingMessage__value_PR_DLRRCMessageTransfer:
13504                   {
13505                      procF1DlRrcMsgTrans(f1apMsg);
13506                      break;
13507                   }
13508                case InitiatingMessage__value_PR_UEContextSetupRequest:
13509                   {
13510                      procF1UeContextSetupReq(f1apMsg);
13511                      break;
13512                   }
13513                case InitiatingMessage__value_PR_UEContextModificationRequest:
13514                   {
13515                      procF1UeContextModificationReq(f1apMsg);
13516                      break;
13517                   }
13518                case InitiatingMessage__value_PR_UEContextReleaseCommand:
13519                   {
13520                       procF1UeContextReleaseCommand(f1apMsg);
13521                       break;
13522                   }
13523                default:
13524                   {
13525                      DU_LOG("\nERROR  -->  F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
13526                            f1apMsg->choice.initiatingMessage->value.present);
13527                      return;
13528                   }
13529             }/* End of switch(initiatingMessage) */
13530             free(f1apMsg->choice.initiatingMessage);
13531             break;
13532          }
13533
13534       default:
13535          {
13536             DU_LOG("\nERROR  -->  F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
13537             return;
13538          }
13539          free(f1apMsg);
13540
13541    }/* End of switch(f1apMsg->present) */
13542
13543 } /* End of F1APMsgHdlr */
13544
13545 /**********************************************************************
13546   End of file
13547  **********************************************************************/