RLC DL AMD PDU changes [Issue-ID: ODUHIGH-290]
[o-du/l2.git] / src / du_app / du_f1ap_msg_hdl.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
5 #   Licensed under the Apache License, Version 2.0 (the "License");            #
6 #   you may not use this file except in compliance with the License.           #
7 #   You may obtain a copy of the License at                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
11 #   Unless required by applicable law or agreed to in writing, software        #
12 #   distributed under the License is distributed on an "AS IS" BASIS,          #
13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
14 #   See the License for the specific language governing permissions and        #
15 #   limitations under the License.                                             #
16 ################################################################################
17 *******************************************************************************/
18
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "lrg.h"
22 #include "legtp.h"
23 #include "lkw.x"
24 #include "lrg.x"
25 #include "du_app_mac_inf.h"
26 #include "du_cfg.h"
27 #include "du_app_rlc_inf.h"
28 #include "du_mgr_main.h"
29 #include "du_utils.h"
30 #include "RAT-Type.h"
31 #include "FeatureSetUplinkPerCC.h"
32 #include "FeatureSetDownlinkPerCC.h"
33 #include "FeatureSets.h"
34 #include "UE-NR-Capability.h"
35 #include "UE-CapabilityRAT-Container.h"
36 #include "UE-CapabilityRAT-ContainerListRRC.h"
37 #include "GNB-DU-System-Information.h"
38 #include "CellGroupConfigRrc.h"
39 #include "MAC-CellGroupConfig.h"
40 #include "SchedulingRequestConfig.h"
41 #include "SchedulingRequestToAddMod.h"
42 #include "BSR-Config.h"
43 #include "TAG-Config.h"
44 #include "TAG.h"
45 #include "PHR-Config.h"
46 #include "RLC-Config.h"
47 #include "UL-AM-RLC.h"
48 #include "DL-AM-RLC.h"
49 #include "LogicalChannelConfig.h"
50 #include "RLC-BearerConfig.h"
51 #include "PhysicalCellGroupConfig.h"
52 #include "SpCellConfig.h"
53 #include "TDD-UL-DL-ConfigDedicated.h"
54 #include "ServingCellConfig.h"
55 #include "ControlResourceSet.h"
56 #include "SearchSpace.h"
57 #include "PDCCH-Config.h"
58 #include "PDSCH-TimeDomainResourceAllocation.h"
59 #include "PDSCH-TimeDomainResourceAllocationList.h"
60 #include "PDSCH-CodeBlockGroupTransmission.h"
61 #include "PDSCH-ServingCellConfig.h"
62 #include "DMRS-DownlinkConfig.h"
63 #include "PDSCH-Config.h"
64 #include "BWP-DownlinkDedicated.h"
65 #include "PUSCH-TimeDomainResourceAllocation.h"
66 #include "PUSCH-TimeDomainResourceAllocationList.h"
67 #include "DMRS-UplinkConfig.h"
68 #include "PUSCH-Config.h"
69 #include "SRS-ResourceId.h"
70 #include "SRS-Resource.h"
71 #include "SRS-ResourceSet.h"
72 #include "SRS-Config.h"
73 #include "BWP-UplinkDedicated.h"
74 #include "PUSCH-ServingCellConfig.h"
75 #include "UplinkConfig.h"
76 #include "DUtoCURRCContainer.h"
77 #include "GBR-QoSFlowInformation.h"
78 #include "QoSFlowLevelQoSParameters.h"
79 #include "PUCCH-Config.h"
80 #include "PUCCH-ResourceSet.h"
81 #include "PUCCH-Resource.h"
82 #include "PUCCH-PowerControl.h"
83 #include "P0-PUCCH.h"
84 #include "PUCCH-PathlossReferenceRS.h"
85 #include "PUCCH-format0.h"
86 #include "PUCCH-format1.h"
87 #include "PUCCH-format2.h"
88 #include "PUCCH-format3.h"
89 #include "PUCCH-format4.h"
90 #include "PUCCH-FormatConfig.h"
91 #include "SchedulingRequestResourceConfig.h"
92 #include<ProtocolIE-Field.h>
93 #include "ProtocolExtensionField.h"
94 #include "F1AP-PDU.h"
95 #include "odu_common_codec.h"
96 #include "du_mgr.h"
97 #include "du_cell_mgr.h"
98 #include "du_f1ap_msg_hdl.h"
99
100 DuCfgParams duCfgParam;
101
102 /************************************************************************
103  *
104  * @brief Converts enum values into actual value of Poll retransmit timer
105  *
106  * @details
107  *
108  *    Function : getPollPdu
109  *
110  *    Functionality: Converts enum values into actual value of poll 
111  *    retransmit timer
112  *
113  * @params[in] Enum value of pollPdu
114  * @return Actual value of pollPdu
115  *
116  * **********************************************************************/
117 uint16_t getPollRetxTmr(uint8_t pollRetxTmrCfg)
118 {
119    uint16_t pollRetxTmr;
120
121    /* All values of poll retx timer are at interval of 5ms.
122     * This is valid upto 250ms
123     * Hence converting the enum value to actual value by multiplying it to 5
124     */
125    if(pollRetxTmrCfg <= T_PollRetransmit_ms250)
126       pollRetxTmr = (pollRetxTmrCfg + 1) * 5;
127    else
128    {
129       switch(pollRetxTmrCfg)
130       {
131          case T_PollRetransmit_ms300:
132             pollRetxTmr = 300;
133             break;
134          case T_PollRetransmit_ms350:
135             pollRetxTmr = 350;
136             break;
137          case T_PollRetransmit_ms400:
138             pollRetxTmr = 400;
139             break;
140          case T_PollRetransmit_ms450:
141             pollRetxTmr = 450;
142             break;
143          case T_PollRetransmit_ms500:
144             pollRetxTmr = 500;
145             break;
146          case T_PollRetransmit_ms800:
147             pollRetxTmr = 800;
148             break;
149          default:
150             DU_LOG("\nERROR  -->  F1AP: Invalid value of Poll Retransmit timer");
151             pollRetxTmr = 0;
152       }
153    }
154    return pollRetxTmr; 
155 }
156
157 /*******************************************************************
158  *
159  * @brief Converts enum values into actual value of PollPdu
160  *
161  * @details
162  *
163  *    Function : getPollPdu
164  *
165  *    Functionality: Converts enum values into actual value of PollPdu
166  *
167  * @params[in] Enum value of pollPdu
168  * @return Actual value of pollPdu
169  *
170  * ****************************************************************/
171 int16_t getPollPdu(uint8_t pollPduCfg)
172 {
173    int16_t pollPdu;
174    switch(pollPduCfg)
175    {
176       case PollPDU_p4:
177          pollPdu = 4;
178          break;
179       case PollPDU_p8:
180          pollPdu = 8;
181          break;
182       case PollPDU_p16:
183          pollPdu = 16;
184          break;
185       case PollPDU_p32:
186          pollPdu = 32;
187          break;
188       case PollPDU_p64:
189          pollPdu = 64;
190          break;
191       case PollPDU_p128:
192          pollPdu = 128;
193          break;
194       case PollPDU_p256:
195          pollPdu = 256;
196          break;
197       case PollPDU_p512:
198          pollPdu = 512;
199          break;
200       case PollPDU_p1024:
201          pollPdu = 1024;
202          break;
203       case PollPDU_p2048:
204          pollPdu = 2048;
205          break;
206       case PollPDU_p4096:
207          pollPdu = 4096;
208          break;
209       case PollPDU_p6144:
210          pollPdu = 6144;
211          break;
212       case PollPDU_p8192:
213          pollPdu = 8192;
214          break;
215       case PollPDU_p12288:
216          pollPdu = 12288;
217          break;
218       case PollPDU_p16384:
219          pollPdu = 16384;
220          break;
221       case PollPDU_p20480:
222          pollPdu = 20480;
223          break;
224       case PollPDU_p24576:
225          pollPdu = 24576;
226          break;
227       case PollPDU_p28672:
228          pollPdu = 28672;
229          break;
230       case PollPDU_p32768:
231          pollPdu = 32768;
232          break;
233       case PollPDU_p40960:
234          pollPdu = 40960;
235          break;
236       case PollPDU_p49152:
237          pollPdu = 49152;
238          break;
239       case PollPDU_p57344:
240          pollPdu = 57344;
241          break;
242       case PollPDU_p65536:
243          pollPdu = 65536;
244          break;
245       case PollPDU_infinity:
246          pollPdu = -1;
247          break;
248       default:
249          DU_LOG("\nERROR  -->  F1AP: Invalid value of poll pdu");
250          pollPdu = 0;
251          break;
252    }
253    return pollPdu;
254 }
255
256 /*******************************************************************
257  *
258  * @brief Converts enum values into actual value of poll bytes
259  *
260  * @details
261  *
262  *    Function : getPollByte
263  *
264  *    Functionality: Converts enum values into actual value of pollBytes
265  *
266  * @params[in] Enum value
267  * @return Actual value
268  *
269  * ****************************************************************/
270 int32_t getPollByte(uint16_t pollBytesCfg)
271 {
272    int32_t pollBytes;
273    switch(pollBytesCfg)
274    {
275       case PollByte_kB1:
276          pollBytes = 1000;
277          break;
278       case PollByte_kB2:
279          pollBytes = 2000;
280          break;
281       case PollByte_kB5:
282          pollBytes = 5000;
283          break;
284       case PollByte_kB8:
285          pollBytes = 8000;
286          break;
287       case PollByte_kB10:
288          pollBytes = 10000;
289          break;
290       case PollByte_kB15:
291          pollBytes = 15000;
292          break;
293       case PollByte_kB25:
294          pollBytes = 25000;
295          break;
296       case PollByte_kB50:
297          pollBytes = 50000;
298          break;
299       case PollByte_kB75:
300          pollBytes = 75000;
301          break;
302       case PollByte_kB100:
303          pollBytes = 100000;
304          break;
305       case PollByte_kB125:
306          pollBytes = 125000;
307          break;
308       case PollByte_kB250:
309          pollBytes = 250000;
310          break;
311       case PollByte_kB375:
312          pollBytes = 375000;
313          break;
314       case PollByte_kB500:
315          pollBytes = 500000;
316          break;
317       case PollByte_kB750:
318          pollBytes = 750000;
319          break;
320       case PollByte_kB1000:
321          pollBytes = 1000000;
322          break;
323       case PollByte_kB1250:
324          pollBytes = 1250000;
325          break;
326       case PollByte_kB1500:
327          pollBytes = 1500000;
328          break;
329       case PollByte_kB2000:
330          pollBytes = 2000000;
331          break;
332       case PollByte_kB3000:
333          pollBytes = 3000000;
334          break;
335       case PollByte_kB4000:
336          pollBytes = 4000000;
337          break;
338       case PollByte_kB4500:
339          pollBytes = 4500000;
340          break;
341       case PollByte_kB5000:
342          pollBytes = 5000000;
343          break;
344       case PollByte_kB5500:
345          pollBytes = 5500000;
346          break;
347       case PollByte_kB6000:
348          pollBytes = 6000000;
349          break;
350       case PollByte_kB6500:
351          pollBytes = 6500000;
352          break;
353       case PollByte_kB7000:
354          pollBytes = 7000000;
355          break;
356       case PollByte_kB7500:
357          pollBytes = 7500000;
358          break;
359       case PollByte_mB8:
360          pollBytes = 8000000;
361          break;
362       case PollByte_mB9:
363          pollBytes = 9000000;
364          break;
365       case PollByte_mB10:
366          pollBytes = 10000000;
367          break;
368       case PollByte_mB11:
369          pollBytes = 11000000;
370          break;
371       case PollByte_mB12:
372          pollBytes = 12000000;
373          break;
374       case PollByte_mB13:
375          pollBytes = 13000000;
376          break;
377       case PollByte_mB14:
378          pollBytes = 14000000;
379          break;
380       case PollByte_mB15:
381          pollBytes = 15000000;
382          break;
383       case PollByte_mB16:
384          pollBytes = 16000000;
385          break;
386       case PollByte_mB17:
387          pollBytes = 17000000;
388          break;
389       case PollByte_mB18:
390          pollBytes = 18000000;
391          break;
392       case PollByte_mB20:
393          pollBytes = 20000000;
394          break;
395       case PollByte_mB25:
396          pollBytes = 25000000;
397          break;
398       case PollByte_mB30:
399          pollBytes = 30000000;
400          break;
401       case PollByte_mB40:
402          pollBytes = 40000000;
403          break;
404       case PollByte_infinity:
405          pollBytes = -1;
406          break;
407       default:
408          DU_LOG("\nERROR  -->  F1AP: Invalid value of poll bytes");
409          pollBytes = 0;
410    }
411    return pollBytes;
412 }
413
414 /*******************************************************************
415  *
416  * @brief Converts enum values into actual value of maxRetx
417  *
418  * @details
419  *
420  *    Function : getMaxRetx
421  *
422  *    Functionality: Converts enum values into actual value of maxRetx
423  *
424  * @params[in] Enum value
425  * @return Actual value
426  *
427  * ****************************************************************/
428 uint8_t getMaxRetx(uint8_t maxRetxCfg)
429 {
430    uint8_t maxRetx;
431    switch(maxRetxCfg)
432    {
433       case UL_AM_RLC__maxRetxThreshold_t1:
434          maxRetx = 1;
435          break;
436       case UL_AM_RLC__maxRetxThreshold_t2:
437          maxRetx = 2;
438          break;
439       case UL_AM_RLC__maxRetxThreshold_t3:
440          maxRetx = 3;
441          break;
442       case UL_AM_RLC__maxRetxThreshold_t4:
443          maxRetx = 4;
444          break;
445       case UL_AM_RLC__maxRetxThreshold_t6:
446          maxRetx = 6;
447          break;
448       case UL_AM_RLC__maxRetxThreshold_t8:
449          maxRetx = 8;
450          break;
451       case UL_AM_RLC__maxRetxThreshold_t16:
452          maxRetx = 16;
453          break;
454       case UL_AM_RLC__maxRetxThreshold_t32:
455          maxRetx = 32;
456          break;
457       default:
458          DU_LOG("\nERROR  -->  F1AP: Invalid configuration for Max retransmission threshold");
459          maxRetx = 0;
460    }
461    return maxRetx;
462 }
463
464 /*******************************************************************
465  *
466  * @brief Builds Uplink Info for NR 
467  *
468  * @details
469  *
470  *    Function : BuildULNRInfo
471  *
472  *    Functionality: Building NR Uplink Info
473  *
474  * @params[in] NRFreqInfo_t *ulnrfreq
475  * @return ROK     - success
476  *         RFAILED - failure
477  *
478  * ****************************************************************/
479 uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
480 {
481    uint8_t idx=0;
482    ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
483                        fdd.ulNrFreqInfo.nrArfcn;
484    ulnrfreq->freqBandListNr.list.count = 1;
485    ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
486    DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
487    if(ulnrfreq->freqBandListNr.list.array == NULLP)
488    {
489       return RFAILED;
490    }
491    for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
492    {
493       DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
494       if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
495       {
496          return RFAILED;
497       }
498    }
499    ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
500                                                                  duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
501                                                                  freqBand[0].nrFreqBand;
502    ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
503    return ROK;
504 }
505 /*******************************************************************
506  *
507  * @brief Builds Downlink NR Info 
508  *
509  * @details
510  *
511  *    Function : BuildDLNRInfo
512  *
513  *    Functionality: Building Downlink NR Info
514  *    
515  * @params[in] NRFreqInfo_t *dlnrfreq
516  * @return ROK     - success
517  *         RFAILED - failure
518  *
519  * ****************************************************************/
520 uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
521 {
522    uint8_t idx=0;
523    dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
524                        fdd.dlNrFreqInfo.nrArfcn;
525    dlnrfreq->freqBandListNr.list.count = 1;
526    dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
527    DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
528    if(dlnrfreq->freqBandListNr.list.array == NULLP)
529    {
530       return RFAILED;   
531    }
532    for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
533    {
534       DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
535       if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
536       {
537          return RFAILED;
538       }
539    }   
540    dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
541                                                                  duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
542                                                                  freqBand[0].nrFreqBand;
543    dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
544
545    return ROK;
546 }
547
548 /*******************************************************************
549  *
550  * @brief Builds NRCell ID 
551  *
552  * @details
553  *
554  *    Function : BuildNrCellId
555  *
556  *    Functionality: Building the NR Cell ID
557  *
558  * @params[in] BIT_STRING_t *nrcell
559  * @return ROK     - success
560  *         RFAILED - failure
561  *
562  * ****************************************************************/
563
564 S16 BuildNrCellId(BIT_STRING_t *nrcell)
565 {
566    memset(nrcell->buf, 0, nrcell->size);
567    nrcell->buf[4]   = 16; 
568    nrcell->bits_unused = 4;
569    return ROK;
570 }
571
572 /*******************************************************************
573  *
574  * @brief Builds Nrcgi 
575  *
576  * @details
577  *
578  *    Function : BuildNrcgi
579  *
580  *    Functionality: Building the PLMN ID and NR Cell id
581  *
582  * @params[in] NRCGI_t *nrcgi
583  * @return ROK     - success
584  *         RFAILED - failure
585  *
586  * ****************************************************************/
587 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
588 {
589    uint8_t ret;
590    uint8_t byteSize = 5;
591    /* Allocate Buffer Memory */
592    nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
593    DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
594    if(nrcgi->pLMN_Identity.buf == NULLP)
595    {
596       return RFAILED;
597    }
598    ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
599          nrcgi->pLMN_Identity.buf); // Building PLMN function
600    if(ret != ROK)
601    {
602       return RFAILED;
603    }
604    /*nrCellIdentity*/
605    nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
606    DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size); 
607    if(nrcgi->nRCellIdentity.buf == NULLP)
608    {
609       return RFAILED;
610    }
611    BuildNrCellId(&nrcgi->nRCellIdentity);
612
613    return ROK;
614 }
615 /*******************************************************************
616  *
617  * @brief Builds FiveGStac 
618  *
619  * @details
620  *
621  *    Function : BuildFiveGSTac
622  *
623  *    Functionality: Building the FiveGSTac
624  *
625  * @params[in] OCTET_STRING_t *fivegsTac
626  * @return ROK     - success
627  *         RFAILED - failure
628  *
629  * ****************************************************************/
630 uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
631 {
632    DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
633    if(servcell->fiveGS_TAC == NULLP)
634    {
635       return RFAILED;
636    }
637    servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
638    DU_ALLOC(servcell->fiveGS_TAC->buf,\
639          sizeof(servcell->fiveGS_TAC->size));
640    if(servcell->fiveGS_TAC->buf == NULLP)
641    {
642       return RFAILED;
643    }
644    servcell->fiveGS_TAC->buf[0] = 0;
645    servcell->fiveGS_TAC->buf[1] = 0;
646    servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
647    return ROK;  
648 }
649 /*******************************************************************
650  *
651  * @brief Builds NR Mode 
652  *
653  * @details
654  *
655  *    Function : BuildNrMode
656  *
657  *    Functionality: Building the NR Mode
658  *
659  * @params[in] NR_Mode_Info_t *fdd
660  * @return ROK     - success
661  *         RFAILED - failure
662  *
663  * ****************************************************************/
664 uint8_t BuildNrMode(NR_Mode_Info_t *mode)
665 {
666    uint8_t BuildDLNRInforet=0;
667    uint8_t BuildULNRInforet=0; 
668    /* FDD Mode */
669    mode->present = NR_Mode_Info_PR_fDD;
670    if(mode->present == NR_Mode_Info_PR_fDD)
671    {
672       DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
673       if(mode->choice.fDD == NULLP)
674       {
675          return RFAILED;
676       }
677       BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
678       if(BuildULNRInforet != ROK)
679       {
680          return RFAILED;    
681       }
682       BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
683       if(BuildDLNRInforet != ROK)
684       {
685          return RFAILED;
686       }
687    }
688    mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
689                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
690                                                        f1Mode.mode.fdd.ulTxBw.nrScs;
691    mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
692                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
693                                                        f1Mode.mode.fdd.ulTxBw.nrb;
694    mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
695                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
696                                                        f1Mode.mode.fdd.dlTxBw.nrScs;
697    mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
698                                                        duCfgParam.srvdCellLst[0].duCellInfo.\
699                                                        f1Mode.mode.fdd.dlTxBw.nrb;
700    return ROK;
701 }
702 /*******************************************************************
703  *
704  * @brief Builds IE Extensions for Served PLMNs 
705  *
706  * @details
707  *
708  *    Function : BuildExtensions
709  *
710  *    Functionality: Building the IE Extensions
711  *
712  * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
713  * @return ROK     - success
714  *         RFAILED - failure
715  *
716  * ****************************************************************/
717 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
718 {
719    uint8_t idx;
720    uint8_t plmnidx;
721    uint8_t extensionCnt=1;
722    uint8_t sliceId=0;
723    uint8_t sdId;
724    DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
725    if((*ieExtend) == NULLP)
726    {
727       return RFAILED;
728    }
729    (*ieExtend)->list.count = extensionCnt;
730    (*ieExtend)->list.size = \
731                             extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
732    DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
733    if((*ieExtend)->list.array == NULLP)
734    {
735       return RFAILED;
736    }
737    for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
738    {
739       DU_ALLOC((*ieExtend)->list.array[plmnidx],\
740             sizeof(ServedPLMNs_ItemExtIEs_t));
741       if((*ieExtend)->list.array[plmnidx] == NULLP)
742       {
743          return RFAILED;
744       }
745    }
746    idx = 0;
747    (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
748    (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
749    (*ieExtend)->list.array[idx]->extensionValue.present = \
750                                                           ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
751    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
752       list.count = 1;
753    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
754       list.size = sizeof(SliceSupportItem_t *);
755    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
756          list.array,sizeof(SliceSupportItem_t *));
757    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
758          list.array == NULLP)
759    {
760       return RFAILED;
761    }
762    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
763          list.array[sliceId],sizeof(SliceSupportItem_t));
764    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
765          list.array[sliceId] == NULLP) 
766    {
767       return RFAILED;
768    }
769    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
770       list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
771    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
772          .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
773          extensionValue.choice.SliceSupportList.\
774          list.array[sliceId]->sNSSAI.sST.size);
775    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
776          .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
777    {
778       return RFAILED;
779    }
780    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
781       list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
782    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
783          list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
784    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
785          list.array[sliceId]->sNSSAI.sD == NULLP)
786    {
787       return RFAILED;
788    }
789    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
790       list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
791    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
792          list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
793          SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
794    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
795          list.array[sliceId]->sNSSAI.sD->buf == NULLP)
796    {
797       return RFAILED;
798    }
799    sdId = 0;
800    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
801       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
802    sdId++;
803    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
804       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
805    sdId++;
806    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
807       list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
808    return ROK;
809 }
810 /*******************************************************************
811  *
812  * @brief Builds Served PLMN 
813  *
814  * @details
815  *
816  *    Function : BuildServedPlmn
817  *
818  *    Functionality: Building the Served PLMN
819  *
820  * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
821  * @return ROK     - success
822  *         RFAILED - failure
823  *
824  * ****************************************************************/
825 uint8_t  BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
826 {  
827    uint8_t  plmnidx;
828    uint8_t  servPlmnCnt=1;
829    uint8_t buildPlmnIdret=0;
830    uint8_t BuildExtensionsret=0;
831    srvplmn->list.count = servPlmnCnt;
832    srvplmn->list.size = \
833                         servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
834    DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
835    if(srvplmn->list.array == NULLP)
836    {
837       return RFAILED;
838    }
839    for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
840    {   
841       DU_ALLOC(srvplmn->list.array[plmnidx],\
842             sizeof(ServedPLMNs_Item_t));
843       if(srvplmn->list.array[plmnidx] == NULLP)
844       {
845          return RFAILED;
846       }  
847    }
848    srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
849    DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
850    buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
851          srvplmn->list.array[0]->pLMN_Identity.buf);
852    if(buildPlmnIdret!= ROK)
853    {
854       return RFAILED;
855    }
856    BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
857    if(BuildExtensionsret!= ROK)
858    {
859       return RFAILED;
860    }
861    return ROK;
862 }
863 /*******************************************************************
864  *
865  * @brief Builds Served Cell List
866  *
867  * @details
868  *
869  *    Function : BuildServedCellList
870  *
871  *    Functionality: Building Served Cell List
872  *
873  * @params[in] PLMNID plmn
874  * @return ROK     - success
875  *         RFAILED - failure
876  *
877  * ****************************************************************/
878
879 uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
880 {
881    uint8_t  BuildNrcgiret=0;
882    uint8_t  BuildFiveGSTacret=0;
883    uint8_t  BuildServedPlmnret=0;
884    uint8_t  BuildNrModeret=0;
885    uint8_t  idx;
886    uint8_t  plmnidx;
887    uint8_t  plmnCnt=1;
888    GNB_DU_Served_Cells_Item_t *srvCellItem;
889    duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
890    duServedCell->list.count = plmnCnt;
891
892    DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
893    if(duServedCell->list.array == NULLP)
894    {
895       return RFAILED;
896    }
897    for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
898    {
899       DU_ALLOC(duServedCell->list.array[plmnidx],\
900             sizeof(GNB_DU_Served_Cells_ItemIEs_t));
901       if(duServedCell->list.array[plmnidx] == NULLP)
902       {
903          return RFAILED;
904       }
905    }
906    idx = 0;
907    duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
908    duServedCell->list.array[idx]->criticality = Criticality_reject;
909    duServedCell->list.array[idx]->value.present = \
910                                                   GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
911    srvCellItem = \
912                  &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
913    /*nRCGI*/
914    BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
915    if(BuildNrcgiret != ROK)
916    {
917       return RFAILED;
918    }
919    /*nRPCI*/
920    srvCellItem->served_Cell_Information.nRPCI = \
921                                                 duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
922
923    /*fiveGS_TAC*/
924    BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
925    if(BuildFiveGSTacret != ROK)
926    {
927       return RFAILED;
928    }
929    /*Served PLMNs*/
930    BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
931    if(BuildServedPlmnret !=ROK)
932    {
933       return RFAILED;
934    }
935    /*nR Mode Info with FDD*/
936    BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
937    if(BuildNrModeret != ROK)
938    {
939       return RFAILED;
940    }
941    /*Measurement timing Config*/
942    srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
943       size = sizeof(uint8_t);
944    DU_ALLOC(srvCellItem->served_Cell_Information.\
945          measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
946    if(srvCellItem->served_Cell_Information.\
947          measurementTimingConfiguration.buf == NULLP)
948    {
949       return RFAILED;
950    }
951    srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
952                                                                                 duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
953
954    /* GNB DU System Information */
955    DU_ALLOC(srvCellItem->gNB_DU_System_Information,
956          sizeof(GNB_DU_System_Information_t));
957    if(!srvCellItem->gNB_DU_System_Information)
958    {
959       return RFAILED;
960    }
961    /* MIB */
962    srvCellItem->gNB_DU_System_Information->mIB_message.size =\
963                                                              strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
964    DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
965          srvCellItem->gNB_DU_System_Information->mIB_message.size);
966    if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
967    {
968       return RFAILED;
969    }
970    strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
971          (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
972
973    /* SIB1 */
974    srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
975                                                               duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
976
977    DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
978          srvCellItem->gNB_DU_System_Information->sIB1_message.size);
979    if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
980    {
981       return RFAILED;
982    }
983    for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
984    {
985       srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
986                                                                   duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
987    }
988    return ROK; 
989 }                                                                                                                  
990 /*******************************************************************
991  *
992  * @brief Builds RRC Version 
993  *
994  * @details
995  *
996  *    Function : BuildRrcVer
997  *
998  *    Functionality: Building RRC Version
999  *
1000  * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
1001  * @return ROK     - success
1002  *         RFAILED - failure
1003  *
1004  * ****************************************************************/
1005 uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
1006 {
1007    uint8_t rrcExt;
1008    uint8_t rrcLatest;
1009    rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
1010    DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
1011    if(rrcVer->latest_RRC_Version.buf == NULLP)
1012    {
1013       return RFAILED;
1014    }
1015    rrcVer->latest_RRC_Version.buf[0] = 0;
1016    rrcVer->latest_RRC_Version.bits_unused = 5;
1017    DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
1018    if(rrcVer->iE_Extensions == NULLP)
1019    {  
1020       return RFAILED;
1021    }
1022    rrcVer->iE_Extensions->list.count = 1;
1023    rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
1024    DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
1025    if(rrcVer->iE_Extensions->list.array == NULLP)
1026    {
1027       return RFAILED;
1028    }
1029    rrcExt = 0;
1030    DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
1031          sizeof(RRC_Version_ExtIEs_t));
1032    if(rrcVer->iE_Extensions->list.array[0] == NULLP)
1033    {
1034       return RFAILED;
1035    }
1036    rrcVer->iE_Extensions->list.array[rrcExt]->id = \
1037                                                    ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
1038    rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
1039    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
1040                                                                       RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
1041    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1042       .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
1043    DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1044          .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
1045          array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
1046    if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
1047          .Latest_RRC_Version_Enhanced.buf == NULLP)
1048    {
1049       return RFAILED;
1050    }
1051    rrcLatest = 0;
1052    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1053       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
1054    rrcLatest++;
1055    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1056       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
1057    rrcLatest++;
1058    rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
1059       Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
1060    return ROK;
1061 }
1062 /*******************************************************************
1063  *
1064  * @brief Sends F1 msg over SCTP
1065  *
1066  * @details
1067  *
1068  *    Function : SendF1APMsg
1069  *
1070  *    Functionality: Sends F1 msg over SCTP
1071  *
1072  * @params[in] Region region
1073  *             Pool pool
1074  * @return ROK     - success
1075  *         RFAILED - failure
1076  *
1077  * ****************************************************************/
1078 uint8_t SendF1APMsg(Region region, Pool pool)
1079 {
1080    Buffer *mBuf = NULLP;
1081   
1082    if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
1083    {
1084       if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
1085       {
1086             ODU_PRINT_MSG(mBuf, 0,0);
1087
1088             if(sctpSend(mBuf, F1_INTERFACE) != ROK)
1089             {
1090                DU_LOG("\nERROR  -->  F1AP : SCTP Send failed");
1091                ODU_PUT_MSG_BUF(mBuf);
1092                return RFAILED;
1093             }
1094       }
1095       else
1096       {
1097          DU_LOG("\nERROR  -->  F1AP : ODU_ADD_POST_MSG_MULT failed");
1098          ODU_PUT_MSG_BUF(mBuf);
1099          return RFAILED;
1100       }
1101       ODU_PUT_MSG_BUF(mBuf);
1102    }
1103    else
1104    {
1105       DU_LOG("\nERROR  -->  F1AP : Failed to allocate memory");
1106       return RFAILED;
1107    }
1108    return ROK; 
1109 } /* SendF1APMsg */
1110
1111 /*******************************************************************
1112  *
1113  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1114  *
1115  * @details
1116  *
1117  *    Function :  FreeRrcVer
1118  *
1119  *    Functionality: deallocating the memory of function BuildRrcVer
1120  *
1121  * @params[in] RRC_Version_t *rrcVer
1122  * 
1123  * @return void
1124  *
1125  *****************************************************************/
1126 void FreeRrcVer(RRC_Version_t *rrcVer)
1127 {
1128    if(rrcVer->latest_RRC_Version.buf != NULLP)
1129    {
1130       if(rrcVer->iE_Extensions != NULLP)
1131       {
1132          if(rrcVer->iE_Extensions->list.array != NULLP)
1133          {
1134             if(rrcVer->iE_Extensions->list.array[0] != NULLP)
1135             {
1136                if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
1137                      != NULLP)
1138                {
1139                   DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
1140                         .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
1141                         array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
1142                }
1143                DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
1144             }
1145             DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
1146          }
1147          DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
1148       }
1149       DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
1150    }
1151 }
1152 /*******************************************************************
1153  *
1154  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1155  *
1156  * @details
1157  *
1158  *    Function :  FreeServedCellList
1159  *
1160  *    Functionality:  deallocating the memory of function BuildServedCellList
1161
1162  *
1163  * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
1164  *
1165  * @return void
1166  *
1167  * ****************************************************************/
1168 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
1169 {
1170    uint8_t   plmnCnt=1;
1171    uint8_t  servId=0;
1172    uint8_t sliceId=0;
1173    uint8_t  ieId=0;
1174    uint8_t   extensionCnt=1;
1175    uint8_t plmnidx=0;
1176    GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
1177    if(duServedCell->list.array!=NULLP)
1178    {
1179       if(duServedCell->list.array[0]!=NULLP)
1180       {
1181          if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
1182          {
1183             if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
1184             {
1185                if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
1186                {
1187                   if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
1188                   {
1189                      if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
1190                      {
1191                         if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
1192                         {
1193                            if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
1194                            {
1195                               if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
1196                               {
1197                                  if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
1198                                  {
1199                                     if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
1200                                     {
1201                                        if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1202                                              extensionValue.choice.SliceSupportList.list.array!=NULLP)
1203                                        {
1204                                           if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1205                                                 extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
1206                                           {
1207                                              if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1208                                                    extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
1209                                              {
1210                                                 if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1211                                                       extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
1212                                                 {
1213                                                    if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
1214                                                          list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
1215                                                    {
1216                                                       if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
1217                                                       {
1218                                                          if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1219                                                                freqBandListNr.list.array!=NULLP)
1220                                                          {
1221                                                             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
1222                                                                   freqBandListNr.list.array[0]!=NULLP)
1223                                                             {
1224                                                                if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1225                                                                      freqBandListNr.list.array)
1226                                                                {
1227                                                                   if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1228                                                                         freqBandListNr.list.array[0]!=NULLP)
1229                                                                   {
1230                                                                      if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
1231                                                                      {
1232                                                                         if(!srvCellItem->gNB_DU_System_Information)
1233                                                                         {
1234                                                                            if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
1235                                                                            {
1236                                                                               if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
1237                                                                               { 
1238                                                                                  DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
1239                                                                                        srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1240                                                                                  DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
1241                                                                                        srvCellItem->gNB_DU_System_Information->sIB1_message.size);
1242                                                                               }
1243                                                                               DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
1244                                                                                     srvCellItem->gNB_DU_System_Information->mIB_message.size);
1245                                                                               DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
1246                                                                                     strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
1247                                                                            }
1248                                                                            DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
1249                                                                         }
1250                                                                         DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
1251                                                                               srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
1252                                                                      }
1253                                                                      DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1254                                                                            freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
1255                                                                   }
1256                                                                   DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
1257                                                                         freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
1258                                                                }
1259                                                                DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
1260                                                                      list.array[0],sizeof(FreqBandNrItem_t));
1261                                                             }
1262                                                             DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
1263                                                                   list.array,sizeof(FreqBandNrItem_t*));
1264                                                          }
1265                                                          DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
1266                                                       }
1267                                                       DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
1268                                                             iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
1269                                                             sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
1270                                                             list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
1271                                                    }
1272                                                    DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
1273                                                          iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
1274                                                          list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1275                                                 }
1276                                                 DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
1277                                                       iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
1278                                                       sNSSAI.sST.buf,sizeof(uint8_t));
1279                                              }
1280                                              DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1281                                                    extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
1282                                           }
1283                                           DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
1284                                                 extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
1285                                        }
1286                                        DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1287                                              array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
1288                                     }
1289                                     DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1290                                           array[servId]->iE_Extensions->list.array,\
1291                                           extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
1292                                  }
1293                                  DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1294                                        array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1295                               }
1296                               DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
1297                                     array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
1298                                     servedPLMNs.list.array[servId]->pLMN_Identity.size
1299                                     * sizeof(uint8_t));
1300                            }
1301                            DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
1302                                  sizeof(ServedPLMNs_Item_t *));
1303                         }
1304                         DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
1305                               sizeof(ServedPLMNs_Item_t *));
1306                      }
1307                      DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
1308                            sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
1309                   }
1310                   DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
1311                }
1312                DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1313                      srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
1314                      sizeof(uint8_t));
1315             }
1316             DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1317                   srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
1318                   sizeof(uint8_t));
1319          }
1320          DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
1321       }
1322       DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
1323    }
1324 }
1325 /*******************************************************************
1326  *
1327  * @brief  deallocating the memory of function BuildAndSendF1SetupReq()
1328  *
1329  * @details
1330  *
1331  *    Function :  FreeF1SetupReq
1332  *
1333  *    Functionality:  deallocating the memory of function BuildAndSendF1SetupReq
1334  *
1335  * @params[in] F1AP_PDU_t *f1apMsg
1336  *
1337  * @return void
1338  *
1339  * ****************************************************************/
1340 void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
1341 {
1342    uint8_t ieIdx, ieIdx2;
1343    F1SetupRequest_t *f1SetupReq=NULLP;
1344
1345    if(f1apMsg != NULLP)
1346    {
1347       if(f1apMsg->choice.initiatingMessage != NULLP)
1348       {
1349          f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1350          if(f1SetupReq->protocolIEs.list.array != NULLP)
1351          {
1352             for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
1353             {
1354                if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP)
1355                {
1356                   switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
1357                   {
1358                      case ProtocolIE_ID_id_TransactionID:
1359                         break;
1360                      case ProtocolIE_ID_id_gNB_DU_ID:
1361                         DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1362                               f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1363                         break;
1364                      case ProtocolIE_ID_id_gNB_DU_Name:
1365                         DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\
1366                               strlen((char *)duCfgParam.duName));
1367                         break;
1368                      case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
1369                         FreeServedCellList(&f1SetupReq->protocolIEs.list.\
1370                               array[ieIdx]->value.choice.GNB_DU_Served_Cells_List);
1371                         break;
1372                      case ProtocolIE_ID_id_GNB_DU_RRC_Version:
1373                         FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version);
1374                         break;
1375                      default:
1376                         DU_LOG("\nERROR  -->  Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id);
1377                         break;
1378                   }
1379                }
1380                break;
1381             }
1382             for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++)
1383             {
1384                DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t));
1385             }
1386             DU_FREE(f1SetupReq->protocolIEs.list.array,\
1387                   f1SetupReq->protocolIEs.list.size);
1388          }
1389          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1390       }
1391       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1392    }
1393 }
1394 /*******************************************************************
1395  *
1396  * @brief Builds and Send the F1SetupRequest
1397  *
1398  * @details
1399  *
1400  *    Function : BuildAndSendF1SetupReq
1401  *
1402  * Functionality:Fills the F1SetupRequest
1403  *
1404  * @return ROK     - success
1405  *         RFAILED - failure
1406  *
1407  ******************************************************************/
1408 uint8_t BuildAndSendF1SetupReq()
1409 {
1410    uint8_t   ret, ieIdx, elementCnt;
1411    F1AP_PDU_t                 *f1apMsg = NULLP;
1412    F1SetupRequest_t           *f1SetupReq=NULLP;
1413    GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
1414    RRC_Version_t              *rrcVer=NULLP;
1415    asn_enc_rval_t             encRetVal;        /* Encoder return value */
1416    ret= RFAILED;
1417
1418    DU_LOG("\nINFO   -->  F1AP : Building F1 Setup Request\n");
1419    do
1420    {
1421       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1422       if(f1apMsg == NULLP)
1423       {
1424          break;
1425       }
1426       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1427       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1428       if(f1apMsg->choice.initiatingMessage == NULLP)
1429       {
1430          break;
1431       }
1432       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
1433       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
1434       f1apMsg->choice.initiatingMessage->value.present = \
1435                                                          InitiatingMessage__value_PR_F1SetupRequest;
1436
1437       f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
1438
1439       elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
1440
1441       f1SetupReq->protocolIEs.list.count = elementCnt;
1442       f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
1443
1444       /* Initialize the F1Setup members */
1445       DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
1446       if(f1SetupReq->protocolIEs.list.array == NULLP)
1447       {
1448          break;
1449       }
1450       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
1451       {
1452          DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\
1453                sizeof(F1SetupRequestIEs_t));
1454          if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP)
1455          {
1456             break;
1457          }
1458       }
1459
1460       ieIdx = 0;
1461       /*TransactionID*/
1462       f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID;
1463       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1464       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\
1465                                                                F1SetupRequestIEs__value_PR_TransactionID;
1466       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \
1467                                                                              TRANS_ID;
1468
1469       /*DU ID*/
1470       ieIdx++;
1471       f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
1472       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1473       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1474                                                                 F1SetupRequestIEs__value_PR_GNB_DU_ID;
1475       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\
1476                                                                              sizeof(uint8_t);
1477
1478       DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
1479             f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
1480       if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \
1481             NULLP)
1482       {
1483          break;
1484       }
1485
1486       f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\
1487          duCfgParam.duId;
1488
1489       /*DU Name*/
1490       if(duCfgParam.duName != NULL)
1491       {
1492          ieIdx++;
1493          f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name;
1494          f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
1495          f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
1496          f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\
1497             strlen((char *)duCfgParam.duName);
1498          DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\
1499                GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
1500          if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\
1501                buf == NULLP)
1502          {
1503             break;
1504          }
1505          strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\
1506                choice.GNB_DU_Name.buf,
1507                (char*)&duCfgParam.duName);
1508
1509       }
1510
1511       /*Served Cell list */
1512       ieIdx++;
1513       f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1514                                                      ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
1515       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1516       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1517                                                                 F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
1518       duServedCell = &f1SetupReq->protocolIEs.list.\
1519                      array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
1520       if(BuildServedCellList(duServedCell))
1521       {
1522          break;
1523       }
1524       /*RRC Version*/
1525       ieIdx++;
1526       f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
1527                                                      ProtocolIE_ID_id_GNB_DU_RRC_Version ;
1528       f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
1529       f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
1530                                                                 F1SetupRequestIEs__value_PR_RRC_Version;
1531       rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
1532       if(BuildRrcVer(rrcVer))
1533       {
1534          break;
1535       }
1536       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1537
1538       /* Encode the F1SetupRequest type as APER */
1539       memset(encBuf, 0, ENC_BUF_MAX_LEN);
1540       encBufSize = 0;
1541       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1542             encBuf);
1543
1544       /* Encode results */
1545       if(encRetVal.encoded == ENCODE_FAIL)
1546       {
1547          DU_LOG("\nERROR  -->  F1AP : Could not encode F1SetupRequest structure (at %s)\n",\
1548                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1549          break;
1550       }
1551       else
1552       {
1553          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1SetupRequest\n");
1554          for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
1555          {
1556             printf("%x",encBuf[ieIdx]);
1557          }
1558       }
1559
1560       /* Sending msg */
1561       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
1562       {
1563          DU_LOG("\nERROR  -->  F1AP : Sending F1 Setup request failed");
1564          break;
1565       }
1566
1567       ret=ROK;
1568       break;
1569    }while(true);
1570
1571    FreeF1SetupReq(f1apMsg);
1572
1573    return ret;
1574 }/* End of BuildAndSendF1SetupReq */
1575
1576 /*******************************************************************
1577  *
1578  * @brief Deallocating memory of BuildAndSendDUConfigUpdate
1579  *
1580  * @details
1581  *
1582  *    Function : FreeDUConfigUpdate
1583  *
1584  *    Functionality: Deallocating memory of variables allocated in
1585  *                    BuildAndSendDUConfigUpdate function
1586  *
1587  * @params[in]  F1AP_PDU_t *f1apDuCfg
1588  *
1589  * @return ROK     - void
1590  *
1591  * ****************************************************************/
1592 void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
1593 {
1594    uint8_t  i;
1595    uint8_t  idx;
1596    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
1597    Served_Cells_To_Modify_List_t  *cellsToModify;
1598    Served_Cells_To_Modify_Item_t *modifyItem;
1599    idx=0;
1600    i=1;
1601    if(f1apDuCfg != NULLP)
1602    {
1603       if(f1apDuCfg->choice.initiatingMessage != NULLP)
1604       {
1605          duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
1606                        value.choice.GNBDUConfigurationUpdate;
1607          if(duCfgUpdate->protocolIEs.list.array != NULLP)
1608          {
1609             if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
1610             {
1611                cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
1612                                value.choice.Served_Cells_To_Modify_List;
1613                if(cellsToModify->list.array != NULLP)
1614                {
1615                   if(cellsToModify->list.array[idx] != NULLP)
1616                   {
1617                      modifyItem=&cellsToModify->list.array[idx]->value.choice.\
1618                                 Served_Cells_To_Modify_Item;
1619                      if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
1620                      {
1621                         if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
1622                         {
1623                            if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
1624                            {
1625                               if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
1626                                     != NULLP)
1627                               { 
1628                                  if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
1629                                        != NULLP)
1630                                  {
1631                                     if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
1632                                     {
1633                                        if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1634                                              array[idx]->pLMN_Identity.buf != NULLP)
1635                                        {
1636                                           if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1637                                                 array[idx]->iE_Extensions!= NULLP)
1638                                           {
1639                                              if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1640                                                    array[idx]->iE_Extensions->list.array != NULLP)
1641                                              {
1642                                                 if(modifyItem->served_Cell_Information.servedPLMNs.list.\
1643                                                       array[idx]->iE_Extensions->list.array[idx])
1644                                                 {
1645                                                    if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1646                                                          iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1647                                                          list.array !=NULLP)
1648                                                    {
1649                                                       if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1650                                                             iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1651                                                             list.array[idx]!=NULLP)
1652                                                       {   
1653                                                          if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1654                                                                iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1655                                                                list.array[idx]->sNSSAI.sST.buf!=NULLP)
1656                                                          {
1657                                                             if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1658                                                                   iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1659                                                                   list.array[idx]->sNSSAI.sD != NULLP)
1660                                                             { 
1661                                                                if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1662                                                                      iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1663                                                                      list.array[idx]->sNSSAI.sD->buf!=NULLP)
1664                                                                {
1665                                                                   if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
1666                                                                         !=NULLP)
1667                                                                   {
1668                                                                      if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1669                                                                            fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
1670                                                                      {
1671                                                                         if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1672                                                                               fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
1673                                                                         {
1674                                                                            if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1675                                                                                  fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
1676                                                                            {
1677                                                                               if(modifyItem->served_Cell_Information.nR_Mode_Info.\
1678                                                                                     choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
1679                                                                                     array[idx]!= NULLP)
1680                                                                               {
1681                                                                                  if(modifyItem->served_Cell_Information.\
1682                                                                                        measurementTimingConfiguration.buf !=NULLP)
1683                                                                                  {
1684                                                                                     idx=2;
1685                                                                                     if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
1686                                                                                           choice.GNB_DU_ID.buf!=NULLP)
1687                                                                                     {
1688                                                                                        DU_FREE(duCfgUpdate->protocolIEs.list.\
1689                                                                                              array[idx]->value.choice.GNB_DU_ID.buf,\
1690                                                                                              duCfgUpdate->protocolIEs.list.array[idx]->\
1691                                                                                              value.choice.GNB_DU_ID.size);
1692                                                                                     }
1693                                                                                     idx=0;
1694                                                                                     DU_FREE(modifyItem->served_Cell_Information.\
1695                                                                                           measurementTimingConfiguration.\
1696                                                                                           buf,modifyItem->served_Cell_Information.\
1697                                                                                           measurementTimingConfiguration.size);
1698                                                                                  }
1699                                                                                  DU_FREE(modifyItem->served_Cell_Information.\
1700                                                                                        nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
1701                                                                                        list.array[idx],sizeof(FreqBandNrItem_t));
1702                                                                               }
1703                                                                               DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
1704                                                                                     .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
1705                                                                                     modifyItem->served_Cell_Information.nR_Mode_Info.\
1706                                                                                     choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
1707                                                                            }
1708                                                                            DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1709                                                                                  choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1710                                                                                  array[idx],sizeof(FreqBandNrItem_t));
1711                                                                         }
1712                                                                         DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
1713                                                                               choice.\
1714                                                                               fDD->uL_NRFreqInfo.freqBandListNr.list.\
1715                                                                               array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1716                                                                               fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1717                                                                      }
1718                                                                      DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
1719                                                                            fDD,sizeof(FDD_Info_t));
1720                                                                   }
1721                                                                   DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1722                                                                         array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1723                                                                         SliceSupportList.\
1724                                                                         list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
1725                                                                         servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
1726                                                                         extensionValue.choice.SliceSupportList.list.array[idx]->\
1727                                                                         sNSSAI.sD->size);
1728
1729                                                                }
1730                                                                DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1731                                                                      array[idx]->\
1732                                                                      iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1733                                                                      list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1734                                                             }
1735                                                             DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1736                                                                   iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1737                                                                   list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
1738                                                                   servedPLMNs.\
1739                                                                   list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
1740                                                                   SliceSupportList.list.array[idx]->sNSSAI.sST.size);
1741                                                          }
1742                                                          DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1743                                                                iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1744                                                                list.array[idx],sizeof(SliceSupportItem_t));
1745                                                       }
1746                                                       DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1747                                                             iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
1748                                                             list.array,\
1749                                                             modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
1750                                                             iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
1751                                                    }
1752                                                 }
1753                                                 for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
1754                                                       array[idx]->iE_Extensions->list.count;i++)
1755                                                 {
1756                                                    DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1757                                                          array[idx]->iE_Extensions->list.array[i],\
1758                                                          sizeof(ServedPLMNs_ItemExtIEs_t ));
1759                                                 }
1760                                                 DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1761                                                       array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
1762                                                       list.array[idx]->iE_Extensions->list.size);
1763                                              }
1764                                              DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1765                                                    array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1766                                           }
1767                                           DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
1768                                                 array[idx]->pLMN_Identity.buf,
1769                                                 modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
1770                                        }
1771                                     }
1772                                     for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
1773                                     {
1774                                        if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
1775                                              != NULLP)
1776                                        {
1777                                           DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
1778                                                 sizeof(ServedPLMNs_Item_t));
1779                                        }
1780                                     }
1781                                     DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
1782                                           modifyItem->served_Cell_Information.servedPLMNs.list.size);
1783                                  }
1784                                  DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
1785                                        modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);          
1786                               }
1787                               DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
1788                                     modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
1789                            }
1790                            DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
1791                                  modifyItem->oldNRCGI.nRCellIdentity.size);
1792                         }
1793                         DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
1794                               modifyItem->oldNRCGI.pLMN_Identity.size);
1795                      }
1796                   }
1797                   for(i=0; i<cellsToModify->list.count ;i++)
1798                   {
1799                      if(cellsToModify->list.array[i] != NULLP)
1800                      {
1801                         DU_FREE(cellsToModify->list.array[i],\
1802                               sizeof(Served_Cells_To_Modify_ItemIEs_t));
1803                      } 
1804                   }
1805                   DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
1806                }
1807             }
1808             for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
1809             {
1810                if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
1811                {
1812                   DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
1813                         sizeof(GNBDUConfigurationUpdateIEs_t));
1814                }
1815             }
1816             DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
1817          }
1818          DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
1819       }
1820       DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
1821    }
1822 }
1823
1824 /*******************************************************************
1825  *
1826  * @brief Fills Served Plmns required in ServCellInfo IE
1827  *
1828  * @details
1829  *
1830  *    Function : fillServedPlmns
1831  *
1832  *    Functionality: Fills Served Plmns required in ServCellInfo IE
1833  *
1834  * @params[in] Pointer to ServedPLMNs_List_t *
1835  *
1836  * @return ROK     - success
1837  *         RFAILED - failure
1838  *
1839  *****************************************************************/
1840
1841 uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
1842 {
1843    uint8_t ieIdx, ieListCnt;
1844
1845    servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
1846    DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\
1847          array[0]->pLMN_Identity.size);
1848    if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP)
1849    {
1850       return RFAILED;
1851    }
1852    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
1853          servedPlmn->list.array[0]->pLMN_Identity.buf);
1854    DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
1855    if(servedPlmn->list.array[0]->iE_Extensions == NULLP)
1856    {
1857       return RFAILED;
1858    }
1859
1860    ieListCnt=1;
1861    servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt;
1862    servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
1863    DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\
1864          iE_Extensions->list.size);
1865    if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP)
1866    {
1867       return RFAILED;
1868    }
1869    for(ieIdx=0;ieIdx<ieListCnt;ieIdx++)
1870    {
1871       DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx],\
1872             sizeof(ServedPLMNs_ItemExtIEs_t));
1873       if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP)
1874       {
1875          return RFAILED;
1876       }
1877    }
1878    //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions; 
1879    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
1880    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore;
1881    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \
1882       ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
1883    servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1884       list.count = 1;
1885    servedPlmn->list.array[0]->\
1886       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1887       list.size = sizeof(SliceSupportItem_t *);
1888    DU_ALLOC(servedPlmn->list.array[0]->\
1889          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1890          list.array,servedPlmn->list.array[0]->\
1891          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
1892    if(servedPlmn->list.array[0]->\
1893          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1894          list.array == NULLP)
1895    {
1896       return RFAILED;
1897    }
1898
1899    DU_ALLOC(servedPlmn->list.array[0]->\
1900          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1901          list.array[0],sizeof( SliceSupportItem_t));
1902    if(servedPlmn->list.array[0]->\
1903          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1904          list.array[0] == NULLP)
1905    {
1906       return RFAILED;
1907    }
1908    servedPlmn->list.array[0]->\
1909       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1910       list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
1911    DU_ALLOC(servedPlmn->list.array[0]->\
1912          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1913          list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\
1914          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
1915    if(servedPlmn->list.array[0]->\
1916          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1917          list.array[0]->sNSSAI.sST.buf == NULLP)
1918    {
1919       return RFAILED;
1920    }
1921    servedPlmn->list.array[0]->\
1922       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1923       list.array[0]->sNSSAI.sST.buf[0] = 3;
1924    DU_ALLOC(servedPlmn->list.array[0]->\
1925          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1926          list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
1927    if(servedPlmn->list.array[0]->\
1928          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1929          list.array[0]->sNSSAI.sD == NULLP)
1930    {
1931       return RFAILED;
1932    }
1933    servedPlmn->list.array[0]->\
1934       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1935       list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
1936    DU_ALLOC(servedPlmn->list.array[0]->\
1937          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1938          list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\
1939          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1940          list.array[0]->sNSSAI.sD->size);
1941    if(servedPlmn->list.array[0]->\
1942          iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1943          list.array[0]->sNSSAI.sD->buf == NULLP)
1944    {
1945       return RFAILED;
1946    }
1947    servedPlmn->list.array[0]->\
1948       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1949       list.array[0]->sNSSAI.sD->buf[0] = 3;
1950    servedPlmn->list.array[0]->\
1951       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1952       list.array[0]->sNSSAI.sD->buf[1] = 6;
1953    servedPlmn->list.array[0]->\
1954       iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
1955       list.array[0]->sNSSAI.sD->buf[2] = 9;
1956    return ROK;
1957 }
1958
1959 /*******************************************************************
1960  *
1961  * @brief Fills Nr Fdd Info required in ServCellInfo IE
1962  *
1963  * @details
1964  *
1965  *    Function : fillNrFddInfo
1966  *
1967  *    Functionality: Fills Nr Fdd Info required in ServCellInfo IE
1968  *
1969  * @params[in] Pointer to NR_Mode_Info_t *
1970  *
1971  * @return ROK     - success
1972  *         RFAILED - failure
1973  *
1974  *****************************************************************/
1975
1976 uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd)
1977 {
1978    nrFdd->choice.fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
1979       f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
1980    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1;
1981    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
1982    DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
1983          array, nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
1984    if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
1985    {
1986       return RFAILED;
1987    }
1988    DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \
1989       sizeof(FreqBandNrItem_t));
1990    if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
1991    {
1992       return RFAILED;
1993    }
1994    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
1995       duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
1996       freqBand[0].nrFreqBand;
1997    nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
1998    nrFdd->choice.fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
1999       dlNrFreqInfo.nrArfcn;
2000    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1;
2001    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
2002    DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,nrFdd->\
2003          choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
2004    if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
2005    {
2006       return RFAILED;
2007    }
2008    DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0],\
2009          sizeof(FreqBandNrItem_t));
2010    if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
2011    {
2012       return RFAILED;
2013    }
2014    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
2015       duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
2016       freqBand[0].nrFreqBand;
2017    nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
2018    
2019    /*Transmission Bandwidth*/
2020    nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
2021       f1Mode.mode.fdd.ulTxBw.nrScs;
2022    nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
2023       f1Mode.mode.fdd.ulTxBw.nrb;
2024    nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
2025       f1Mode.mode.fdd.dlTxBw.nrScs;
2026    nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
2027       f1Mode.mode.fdd.dlTxBw.nrb;
2028
2029    return ROK;
2030 }
2031
2032 /*******************************************************************
2033  *
2034  * @brief Fills ServCellInfo IE
2035  *
2036  * @details
2037  *
2038  *    Function : fillServedCellInfo
2039  *
2040  *    Functionality: Fills ServCellInfo
2041  *
2042  * @params[in] Pointer to Served_Cell_Information_t *
2043  *
2044  * @return ROK     - success
2045  *         RFAILED - failure
2046  *
2047  *****************************************************************/
2048
2049 uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo)
2050 {
2051    uint8_t tmp, ieIdx, ieListCnt;
2052
2053    /*nRCGI*/
2054    srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
2055    DU_ALLOC(srvCellInfo->nRCGI.pLMN_Identity.buf,\
2056          srvCellInfo->nRCGI.pLMN_Identity.size);
2057    if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP)
2058    {
2059       return RFAILED;
2060    }
2061    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2062          srvCellInfo->nRCGI.pLMN_Identity.buf);
2063    srvCellInfo->nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
2064    DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\
2065          srvCellInfo->nRCGI.nRCellIdentity.size);
2066    if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP)
2067    {
2068       return RFAILED;
2069    }
2070    for (tmp = 0 ; tmp < srvCellInfo->\
2071          nRCGI.nRCellIdentity.size-1 ; tmp++)
2072    {
2073       srvCellInfo->nRCGI.nRCellIdentity.buf[tmp] = 0;
2074    }
2075    srvCellInfo->nRCGI.nRCellIdentity.buf[4] = 16;
2076    srvCellInfo->nRCGI.nRCellIdentity.bits_unused =4;
2077
2078    /*nRPCI*/
2079    srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
2080
2081    /*servedPLMNs*/
2082    ieListCnt = 1;
2083    srvCellInfo->servedPLMNs.list.count = ieListCnt;
2084    srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *);
2085    DU_ALLOC(srvCellInfo->servedPLMNs.list.array,\
2086          srvCellInfo->servedPLMNs.list.size);
2087    if(srvCellInfo->servedPLMNs.list.array == NULLP)
2088    {
2089       return RFAILED;
2090    }
2091    for(ieIdx=0; ieIdx < ieListCnt; ieIdx++)
2092    {
2093       DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx],\
2094             sizeof(ServedPLMNs_Item_t));
2095       if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP)
2096       {
2097          return RFAILED;
2098       }
2099    }
2100    if(fillServedPlmns(&srvCellInfo->servedPLMNs))
2101    {
2102       return RFAILED;
2103    }
2104
2105    /*nR Mode Info with FDD*/
2106    srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD;
2107    DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD,\
2108          sizeof(FDD_Info_t));
2109    if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP)
2110    {
2111       return RFAILED;
2112    }
2113    if(fillNrFddInfo(&srvCellInfo->nR_Mode_Info))
2114       return RFAILED;
2115
2116    /*Measurement timing Config*/
2117    srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t);
2118    DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\
2119          buf,srvCellInfo->measurementTimingConfiguration.size);
2120    if(srvCellInfo->measurementTimingConfiguration.buf == NULLP)
2121    {
2122       return RFAILED;
2123    }
2124    srvCellInfo->measurementTimingConfiguration.\
2125          buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
2126
2127    return ROK;
2128 }
2129
2130 /*******************************************************************
2131  *
2132  * @brief Fills ServCellToModItem IE
2133  *
2134  * @details
2135  *
2136  *    Function : fillServCellToModItem
2137  *
2138  *    Functionality: Fills ServCellToModItem IE
2139  *
2140  * @params[in] Pointer to Served_Cells_To_Modify_Item_t *
2141  *
2142  * @return ROK     - success
2143  *         RFAILED - failure
2144  *
2145  *****************************************************************/
2146
2147 uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem)
2148 {
2149    uint8_t ieIdx;
2150
2151    /*pLMN_Identity*/
2152    modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
2153    DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
2154    if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
2155    {
2156       return RFAILED;
2157    }
2158    buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
2159          modifyItem->oldNRCGI.pLMN_Identity.buf);
2160
2161    /*nRCellIdentity*/
2162    modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
2163    DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
2164          modifyItem->oldNRCGI.nRCellIdentity.size);
2165    if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
2166    {
2167       return RFAILED;
2168    }
2169    for(ieIdx = 0; ieIdx < modifyItem->oldNRCGI.nRCellIdentity.size-1; ieIdx++)
2170    {
2171       modifyItem->oldNRCGI.nRCellIdentity.buf[ieIdx] = 0;
2172    }
2173    modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
2174    modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
2175
2176    if(fillServedCellInfo(&modifyItem->served_Cell_Information))
2177       return RFAILED;
2178    else
2179       return ROK;
2180 }
2181
2182 /*******************************************************************
2183  *
2184  * @brief Builds ServCellToModList
2185  *
2186  * @details
2187  *
2188  *    Function : buildServCellToModList
2189  *
2190  *    Functionality: Builds the serv cell to Mod List
2191  *
2192  * @params[in] Pointer to Served_Cells_To_Modify_List_t *
2193  *
2194  * @return ROK     - success
2195  *         RFAILED - failure
2196  *
2197  *****************************************************************/
2198
2199 uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify)
2200 {
2201    uint8_t ieListCnt, ieIdx;
2202    Served_Cells_To_Modify_Item_t *modifyItem = NULLP;
2203
2204    ieListCnt = 1;
2205    cellsToModify->list.count = ieListCnt;
2206    cellsToModify->list.size = ieListCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
2207    DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
2208    if(cellsToModify->list.array == NULLP)
2209    {
2210       return RFAILED;
2211    }
2212    for(ieIdx=0; ieIdx< ieListCnt; ieIdx++)
2213    {
2214       DU_ALLOC(cellsToModify->list.array[ieIdx],sizeof(Served_Cells_To_Modify_ItemIEs_t));
2215       if(cellsToModify->list.array[ieIdx] == NULLP)
2216       {
2217          return RFAILED;
2218       }
2219    }
2220    cellsToModify->list.array[0]->id = ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
2221    cellsToModify->list.array[0]->criticality = Criticality_reject;
2222    cellsToModify->list.array[0]->value.present =\
2223       Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
2224    modifyItem=&cellsToModify->list.array[0]->value.choice.Served_Cells_To_Modify_Item;
2225
2226    if(fillServCellToModItem(modifyItem))
2227       return RFAILED;
2228    else
2229       return ROK;
2230 }
2231
2232 /*******************************************************************
2233  *
2234  * @brief Builds and sends the DUConfigUpdate
2235  *
2236  * @details
2237  *
2238  *    Function : BuildAndSendDUConfigUpdate
2239  *
2240  *    Functionality: Constructs the DU Update message and sends
2241  *                   it to the CU through SCTP.
2242  *
2243  * @params[in] void **buf,Buffer to which encoded pattern is written into
2244  * @params[in] int *size,size of buffer
2245  *
2246  * @return ROK     - success
2247  *         RFAILED - failure
2248  *
2249  * ****************************************************************/
2250 uint8_t BuildAndSendDUConfigUpdate()
2251 {
2252    uint8_t ret, ieIdx, elementCnt;
2253    F1AP_PDU_t                 *f1apDuCfg = NULLP;
2254    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
2255    asn_enc_rval_t encRetVal;     /* Encoder return value */
2256    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2257    ret= RFAILED;
2258
2259    while(true)
2260    {
2261       DU_LOG("\nINFO   -->  F1AP : Building DU config update\n");
2262       /* Allocate the memory for F1DuCfg */
2263       DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
2264       if(f1apDuCfg == NULLP)
2265       {
2266          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
2267          break;
2268       }
2269
2270       f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
2271       DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2272       if(f1apDuCfg->choice.initiatingMessage == NULLP)
2273       {
2274          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
2275          break;
2276       }
2277
2278       f1apDuCfg->choice.initiatingMessage->procedureCode = \
2279                                                            ProcedureCode_id_gNBDUConfigurationUpdate;
2280       f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
2281       f1apDuCfg->choice.initiatingMessage->value.present = \
2282                                                            InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
2283       duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
2284                     choice.GNBDUConfigurationUpdate;
2285       elementCnt = 3;
2286       duCfgUpdate->protocolIEs.list.count = elementCnt;
2287       duCfgUpdate->protocolIEs.list.size = \
2288                                            elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
2289
2290       /* Initialize the F1Setup members */
2291       DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
2292       if(duCfgUpdate->protocolIEs.list.array == NULLP)
2293       {
2294          DU_LOG("ERROR  -->  F1AP : Memory allocation for F1RequestIEs failed");
2295          break;
2296       }
2297       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
2298       {
2299          DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t));
2300          if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP)
2301          {
2302             break;
2303          }
2304       }
2305
2306       /*TransactionID*/
2307       ieIdx = 0;
2308       duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID;
2309       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
2310       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2311          GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
2312       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID;
2313
2314       /*Served Cell to Modify */
2315       ieIdx++;
2316       duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
2317                                                       ProtocolIE_ID_id_Served_Cells_To_Modify_List;
2318       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
2319       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2320          GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
2321       if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
2322          Served_Cells_To_Modify_List))
2323          break;
2324
2325       // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
2326       /*GNB DU ID */
2327       ieIdx++;
2328       duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
2329       duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
2330       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
2331         GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
2332       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t);
2333       DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
2334             duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
2335       if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP)
2336       {
2337          break;
2338       }
2339       duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId;
2340
2341       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
2342
2343       /* Encode the DU Config Update type as APER */
2344       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2345       encBufSize = 0;
2346       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
2347
2348       /* Checking encode results */
2349       if(encRetVal.encoded == ENCODE_FAIL)
2350       {
2351          DU_LOG("ERROR  -->  F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\
2352          encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2353          break;
2354       }
2355       else
2356       {
2357          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for DUConfigUpdate\n");
2358          for(ieIdx =0; ieIdx < encBufSize; ieIdx++)
2359          {
2360             printf("%x",encBuf[ieIdx]);
2361          }
2362       }
2363       /* Sending msg */
2364       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
2365       {
2366          DU_LOG("\nERROR  -->  F1AP : Sending GNB-DU Config Update failed");
2367          break;
2368       }
2369
2370       ret = ROK;
2371       break;
2372    }
2373    FreeDUConfigUpdate(f1apDuCfg);
2374
2375    return ret;
2376 }
2377
2378
2379 /*******************************************************************
2380  *
2381  * @brief free the ULRRCMessageTransfer
2382  *
2383  * @details
2384  *
2385  *    Function : FreeULRRCMessageTransfer
2386  *
2387  *    Functionality: Deallocating the memory of variable allocated in
2388  *                      FreeULRRCMessageTransfer
2389  *
2390  * @params[in]
2391  *
2392  * @return ROK     - void
2393  *
2394  ******************************************************************/
2395 void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
2396 {
2397    uint8_t idx1;
2398    ULRRCMessageTransfer_t  *ulRRCMsg;
2399
2400    if(f1apMsg != NULLP)
2401    { 
2402       if(f1apMsg->choice.initiatingMessage != NULLP)
2403       {
2404          ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2405          if(ulRRCMsg->protocolIEs.list.array != NULLP)
2406          {
2407             for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
2408             {
2409                if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
2410                {
2411                   if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
2412                         ULRRCMessageTransferIEs__value_PR_RRCContainer)
2413                   {
2414                      DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2415                            ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2416                   }
2417                   DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
2418                }
2419             }
2420             DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
2421          }
2422          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2423       }
2424       DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
2425    }
2426 }
2427 /*******************************************************************
2428  *
2429  * @brief Builds and sends the ULRRCMessageTransfer 
2430  *
2431  * @details
2432  *
2433  *    Function : BuildAndSendULRRCMessageTransfer
2434  *
2435  *    Functionality: Constructs the UL RRC Message Transfer and sends
2436  *                   it to the CU through SCTP.
2437  *
2438  * @params[in] 
2439  *
2440  * @return ROK     - success
2441  *         RFAILED - failure
2442  *
2443  * ****************************************************************/
2444 uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb  ueCb, uint8_t lcId, \
2445       uint16_t msgLen, uint8_t *rrcMsg)
2446 {
2447    uint8_t   elementCnt =0;
2448    uint8_t   idx1 =0;
2449    uint8_t   idx =0;
2450    F1AP_PDU_t                   *f1apMsg = NULLP;
2451    ULRRCMessageTransfer_t       *ulRRCMsg = NULLP;
2452    asn_enc_rval_t               encRetVal;        /* Encoder return value */
2453    uint8_t ret =RFAILED;
2454    
2455    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2456
2457    while(true)
2458    {
2459       DU_LOG("\n INFO   -->  F1AP : Building UL RRC Message Transfer Message\n");
2460
2461       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2462       if(f1apMsg == NULLP)
2463       {
2464          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
2465          break;
2466       }
2467       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2468       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2469       if(f1apMsg->choice.initiatingMessage == NULLP)
2470       {
2471          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
2472          break;
2473       }
2474       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
2475       f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
2476       f1apMsg->choice.initiatingMessage->value.present = \
2477                                                          InitiatingMessage__value_PR_ULRRCMessageTransfer;
2478       ulRRCMsg =
2479          &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2480       elementCnt = 4;
2481       ulRRCMsg->protocolIEs.list.count = elementCnt;
2482       ulRRCMsg->protocolIEs.list.size = \
2483                                         elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
2484
2485       /* Initialize the F1Setup members */
2486       DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
2487       if(ulRRCMsg->protocolIEs.list.array == NULLP)
2488       {
2489          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
2490          break;
2491       }
2492       for(idx=0; idx<elementCnt; idx++)
2493       {
2494          DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
2495          if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
2496          {
2497             break;
2498          }
2499       }
2500
2501       idx1 = 0;
2502
2503       /*GNB CU UE F1AP ID*/
2504       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2505       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2506       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2507                                                               ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
2508       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
2509
2510       /*GNB DU UE F1AP ID*/
2511       idx1++;
2512       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2513       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2514       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2515                                                               ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
2516       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
2517
2518       /*SRBID*/
2519       idx1++;
2520       ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
2521       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2522       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2523                                                               ULRRCMessageTransferIEs__value_PR_SRBID;
2524       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
2525
2526       /*RRCContainer*/
2527       idx1++;
2528       ulRRCMsg->protocolIEs.list.array[idx1]->id  = ProtocolIE_ID_id_RRCContainer;
2529       ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
2530       ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
2531                                                               ULRRCMessageTransferIEs__value_PR_RRCContainer;
2532       ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
2533       DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
2534             ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
2535       if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
2536       {
2537          DU_LOG(" ERROR  -->  F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
2538          break;
2539       }
2540       memset(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, 0, msgLen);
2541       memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
2542             rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
2543
2544       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2545
2546       /* Encode the F1SetupRequest type as APER */
2547       memset(encBuf, 0, ENC_BUF_MAX_LEN);
2548       encBufSize = 0;
2549       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2550             encBuf);
2551       /* Encode results */
2552       if(encRetVal.encoded == ENCODE_FAIL)
2553       {
2554          DU_LOG( "\nERROR  -->  F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
2555                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2556          break;
2557       }
2558       else
2559       {
2560          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
2561          for(int i=0; i< encBufSize; i++)
2562          {
2563             printf("%x",encBuf[i]);
2564          }
2565       }
2566
2567       /* Sending  msg  */
2568       if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) !=      ROK)
2569       {
2570          DU_LOG("\nERROR  -->   F1AP : Sending  UL RRC Message Transfer Failed");
2571          break;
2572       }
2573       ret = ROK;
2574       break;
2575    }
2576    FreeULRRCMessageTransfer(f1apMsg);
2577
2578    return ret;
2579 }/* End of BuildAndSendULRRCMessageTransfer*/
2580
2581 /*******************************************************************
2582  *
2583  * @brief Builds tag config 
2584  *
2585  * @details
2586  *
2587  *    Function : BuildTagConfig 
2588  *
2589  *    Functionality: Builds tag config in MacCellGroupConfig
2590  *
2591  * @params[in] TAG_Config *tag_Config
2592  *
2593  * @return ROK     - success
2594  *         RFAILED - failure
2595  *
2596  * ****************************************************************/
2597 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
2598 {
2599    struct TAG_Config__tag_ToAddModList *tagList;
2600    uint8_t                     idx, elementCnt;
2601
2602    tagConfig->tag_ToReleaseList = NULLP;
2603    tagConfig->tag_ToAddModList = NULLP;
2604    DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
2605    if(!tagConfig->tag_ToAddModList)
2606    {
2607       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2608       return RFAILED;
2609    }
2610
2611    elementCnt = 1; //ODU_VALUE_ONE;
2612    tagList = tagConfig->tag_ToAddModList;
2613    tagList->list.count = elementCnt;
2614    tagList->list.size  =  elementCnt * sizeof(struct TAG *);
2615
2616    tagList->list.array = NULLP;
2617    DU_ALLOC(tagList->list.array, tagList->list.size);
2618    if(!tagList->list.array)
2619    {
2620       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2621       return RFAILED;
2622    }
2623
2624    for(idx=0; idx<tagList->list.count; idx++)
2625    {
2626       tagList->list.array[idx] = NULLP;
2627       DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
2628       if(!tagList->list.array[idx])
2629       {
2630          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildTagConfig");
2631          return RFAILED;
2632       }
2633    }
2634
2635    idx = 0;
2636    tagList->list.array[idx]->tag_Id = TAG_ID;
2637    tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
2638
2639    return ROK;
2640 }
2641
2642 /*******************************************************************
2643  *
2644  * @brief Builds PHR Config 
2645  *
2646  * @details
2647  *
2648  *    Function : BuildPhrConfig
2649  *
2650  *    Functionality: Builds phrConfig in MacCellGroupConfig
2651  *
2652  * @params[in] PHR Config *
2653  *
2654  * @return ROK     - success
2655  *         RFAILED - failure
2656  *
2657  * ****************************************************************/
2658 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
2659 {
2660
2661    phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
2662    phrConfig->choice.setup = NULLP;
2663    DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
2664    if(!phrConfig->choice.setup)
2665    {
2666       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildPhrConfig");
2667       return RFAILED;
2668    }
2669
2670    phrConfig->choice.setup->phr_PeriodicTimer        = PHR_PERIODIC_TMR;
2671    phrConfig->choice.setup->phr_ProhibitTimer        = PHR_PROHIBHIT_TMR;
2672    phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
2673    phrConfig->choice.setup->multiplePHR              = false;
2674    phrConfig->choice.setup->dummy                    = false;
2675    phrConfig->choice.setup->phr_Type2OtherCell       = false;
2676    phrConfig->choice.setup->phr_ModeOtherCG          = PHR_MODE_OTHER_CG;
2677
2678    return ROK;
2679 }
2680
2681 /*******************************************************************
2682  *
2683  * @brief Builds BSR Config 
2684  *
2685  * @details
2686  *
2687  *    Function : BuildBsrConfig
2688  *
2689  *    Functionality: Builds BuildBsrConfig in MacCellGroupConfig
2690  *
2691  * @params[in] BSR_Config *bsrConfig
2692  *
2693  * @return ROK     - success
2694  *         RFAILED - failure
2695  *
2696  * ****************************************************************/
2697 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
2698 {
2699    bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
2700    bsrConfig->retxBSR_Timer     = RETX_BSR_TMR;
2701    bsrConfig->logicalChannelSR_DelayTimer = NULLP;
2702
2703    return ROK;
2704 }
2705
2706 /*******************************************************************
2707  *
2708  * @brief Builds scheduling request config 
2709  *
2710  * @details
2711  *
2712  *    Function : BuildSchedulingReqConfig 
2713  *
2714  *    Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
2715  *
2716  * @params[in] SchedulingRequestConfig *schedulingRequestConfig
2717  *
2718  * @return ROK     - success
2719  *         RFAILED - failure
2720  *
2721  * ****************************************************************/
2722 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
2723 {
2724    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
2725    uint8_t                     idx, elementCnt;
2726
2727    schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
2728    DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
2729          sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
2730    if(!schedulingRequestConfig->schedulingRequestToAddModList)
2731    {
2732       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2733       return RFAILED;
2734    }
2735
2736    elementCnt = 1; //ODU_VALUE_ONE;
2737    schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
2738    schReqList->list.count = elementCnt;
2739    schReqList->list.size  = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
2740
2741    schReqList->list.array = NULLP;
2742    DU_ALLOC(schReqList->list.array, schReqList->list.size);
2743    if(!schReqList->list.array)
2744    {
2745       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2746       return RFAILED;
2747    }
2748
2749    for(idx=0;idx<schReqList->list.count; idx++)
2750    {
2751       schReqList->list.array[idx] = NULLP;
2752       DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
2753       if(!schReqList->list.array[idx])
2754       {
2755          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2756          return RFAILED;
2757       }
2758    }
2759
2760    idx = 0;
2761    schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
2762
2763    schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
2764    DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
2765    if(!schReqList->list.array[idx]->sr_ProhibitTimer)
2766    {
2767       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSchedulingReqConfig");
2768       return RFAILED;
2769    }
2770    *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
2771    schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
2772    schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
2773
2774    return ROK;
2775 }
2776
2777 /*******************************************************************
2778  *
2779  * @brief Builds RLC Config
2780  *
2781  * @details
2782  *
2783  *    Function : BuildRlcConfig
2784  *
2785  *    Functionality: Builds RLC Config in BuildRlcBearerToAddModList 
2786  *
2787  * @params[in] RLC_Config *rlcConfig
2788  *
2789  * @return ROK     - success
2790  *         RFAILED - failure
2791  *
2792  * ****************************************************************/
2793 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
2794 {
2795
2796    rlcConfig->present = RLC_Config_PR_am;
2797
2798    rlcConfig->choice.am = NULLP;
2799    DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
2800    if(!rlcConfig->choice.am)
2801    {
2802       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
2803       return RFAILED;
2804    }
2805
2806    /* UL */
2807    rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
2808    DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
2809    if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
2810    {
2811       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
2812       return RFAILED;
2813    }
2814    *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2815    rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit  = T_POLL_RETRANSMIT;
2816    rlcConfig->choice.am->ul_AM_RLC.pollPDU           = POLL_PDU;
2817    rlcConfig->choice.am->ul_AM_RLC.pollByte          = POLL_BYTE;
2818    rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold  = MAX_RETX_THRESHOLD;
2819
2820    /* DL */
2821    rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
2822    DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
2823    if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
2824    {
2825       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcConfig");
2826       return RFAILED;
2827    }
2828    *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
2829    rlcConfig->choice.am->dl_AM_RLC.t_Reassembly      = T_REASSEMBLY;
2830    rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit  = T_STATUS_PROHIBHIT;
2831
2832    return ROK;
2833 }
2834
2835 /*******************************************************************
2836  *
2837  * @brief Builds MAC LC Config
2838  *
2839  * @details
2840  *
2841  *    Function : BuildMacLCConfig 
2842  *
2843  *    Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList 
2844  *
2845  * @params[in] struct LogicalChannelConfig macLcConfig
2846  *
2847  * @return ROK     - success
2848  *         RFAILED - failure
2849  *
2850  * ****************************************************************/
2851 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
2852 {
2853
2854    macLcConfig->ul_SpecificParameters = NULLP;
2855    DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
2856    if(!macLcConfig->ul_SpecificParameters)
2857    {
2858       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
2859       return RFAILED;
2860    }
2861
2862    macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
2863    macLcConfig->ul_SpecificParameters->prioritisedBitRate =     PRIORTISIED_BIT_RATE;
2864    macLcConfig->ul_SpecificParameters->bucketSizeDuration =     BUCKET_SIZE_DURATION;
2865    macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
2866    macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
2867    macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
2868    macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
2869
2870    macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
2871    DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup,    sizeof(long));
2872    if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
2873    {
2874       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
2875       return RFAILED;
2876    }
2877    *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
2878
2879    macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
2880    DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID,    sizeof(SchedulingRequestId_t));
2881    if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
2882    {
2883       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacLCConfig");
2884       return RFAILED;
2885    }
2886    *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
2887
2888    macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
2889    macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
2890    macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
2891
2892    return ROK;
2893 }
2894
2895 /*******************************************************************
2896  *
2897  * @brief Builds RLC Bearer to Add/Mod list
2898  *
2899  * @details
2900  *
2901  *    Function :BuildRlcBearerToAddModList 
2902  *
2903  *    Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
2904  *
2905  * @params[in] rlc_BearerToAddModList
2906  *
2907  * @return ROK     - success
2908  *         RFAILED - failure
2909  *
2910  * ****************************************************************/
2911 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
2912 {
2913    uint8_t                     idx, elementCnt;
2914
2915    elementCnt = 1;
2916    rlcBearerList->list.count = elementCnt;
2917    rlcBearerList->list.size  = elementCnt * sizeof(struct RLC_BearerConfig *);
2918
2919    rlcBearerList->list.array = NULLP;
2920    DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
2921    if(!rlcBearerList->list.array)
2922    {
2923       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2924       return RFAILED;
2925    }
2926
2927    for(idx=0; idx<rlcBearerList->list.count; idx++)
2928    {
2929       rlcBearerList->list.array[idx] = NULLP;
2930       DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
2931       if(!rlcBearerList->list.array[idx])
2932       {
2933          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2934          return RFAILED;
2935       }
2936    }
2937
2938    idx = 0;
2939    rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
2940
2941    DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \
2942       sizeof(struct RLC_BearerConfig__servedRadioBearer));
2943    if(!rlcBearerList->list.array[idx]->servedRadioBearer)
2944    {
2945       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2946       return RFAILED;
2947    }
2948
2949    rlcBearerList->list.array[idx]->servedRadioBearer->present = \
2950       RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
2951    rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \
2952       SRB1_LCID;
2953
2954    rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
2955    rlcBearerList->list.array[idx]->rlc_Config = NULLP;
2956    DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
2957    if(!rlcBearerList->list.array[idx]->rlc_Config)
2958    {
2959       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2960       return RFAILED;
2961    }
2962
2963    if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
2964    {
2965       DU_LOG("\nERROR  -->  F1AP : BuildRlcConfig failed");
2966       return RFAILED;
2967    }
2968
2969    rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
2970    DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \
2971       sizeof(struct LogicalChannelConfig));
2972    if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
2973    {
2974       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
2975       return RFAILED;
2976    }
2977
2978    if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
2979    {
2980       DU_LOG("\nERROR  -->  F1AP : BuildMacLCConfig failed");
2981       return RFAILED;
2982    }
2983
2984    return ROK;
2985 }
2986
2987 /*******************************************************************
2988  *
2989  * @brief Build Control resource set to add/modify list 
2990  *
2991  * @details
2992  *
2993  *    Function : BuildControlRSetToAddModList
2994  *
2995  *    Functionality: Build Control resource set to add/modify list
2996  *
2997  * @params[in] 
2998  * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2999  *
3000  * @return ROK     - success
3001  *         RFAILED - failure
3002  *
3003  * ****************************************************************/
3004    uint8_t BuildControlRSetToAddModList
3005 (
3006  struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
3007  )
3008 {
3009    uint8_t idx;
3010    uint8_t elementCnt;
3011    uint8_t numBytes, bitsUnused;
3012    struct ControlResourceSet *controlRSet;
3013    uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
3014    uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
3015
3016
3017    elementCnt = 1;
3018    controlRSetList->list.count = elementCnt;
3019    controlRSetList->list.size = \
3020                                 elementCnt * sizeof(struct ControlResourceSet *);
3021
3022    controlRSetList->list.array = NULLP;
3023    DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
3024    if(!controlRSetList->list.array)
3025    {
3026       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3027       return RFAILED;
3028    }
3029
3030    for(idx = 0; idx < elementCnt; idx++)
3031    {
3032       controlRSetList->list.array[idx] = NULLP;
3033       DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
3034       if(!controlRSetList->list.array[idx])
3035       {
3036          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3037          return RFAILED;
3038       }
3039    }
3040
3041    idx=0;
3042    controlRSet = controlRSetList->list.array[idx];
3043
3044    controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
3045
3046    /* size 6 bytes
3047     * 3 LSBs unsued
3048     * Bit string stored ff0000000000
3049     */
3050    numBytes = 6;
3051    bitsUnused = 3;
3052    controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
3053
3054    controlRSet->frequencyDomainResources.buf = NULLP;
3055    DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
3056          controlRSet->frequencyDomainResources.size);
3057    if(!controlRSet->frequencyDomainResources.buf)
3058    {
3059       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3060       return RFAILED;
3061    }
3062
3063    memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
3064    coreset0EndPrb = CORESET0_END_PRB;
3065    coreset1StartPrb = coreset0EndPrb + 6;
3066    coreset1NumPrb = CORESET1_NUM_PRB;
3067    /* calculate the PRBs */
3068    freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
3069    memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
3070    controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
3071
3072    controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
3073    controlRSet->cce_REG_MappingType.present = \
3074                                               ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
3075
3076    controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
3077    controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
3078    controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
3079    controlRSet->tci_PresentInDCI = NULLP;
3080 #if 0
3081    uint8_t tciStateIdx;
3082
3083    DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
3084          sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
3085    if(!controlRset->tci_StatesPDCCH_ToAddList)
3086    {
3087       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3088       return RFAILED;
3089    }
3090
3091    elementCnt = 1;
3092    controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
3093    controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
3094    DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
3095          controlRset->tci_StatesPDCCH_ToAddList->list.size)
3096       if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
3097       {
3098          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3099          return RFAILED;
3100       }
3101
3102    for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
3103    {
3104       DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
3105       if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
3106       {
3107          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3108          return RFAILED;
3109       }
3110    }
3111
3112    tciStateIdx = 0;
3113    /* TODO */
3114    *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
3115
3116    DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
3117    if(!controlRset->tci_PresentInDCI)
3118    {
3119       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3120       return RFAILED;
3121    }
3122    /* TODO */
3123    *(controlRset->tci_PresentInDCI);
3124 #endif
3125
3126    controlRSet->pdcch_DMRS_ScramblingID = NULLP;
3127    DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
3128    if(!controlRSet->pdcch_DMRS_ScramblingID)
3129    {
3130       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildControlRSetToAddModList");
3131       return RFAILED;
3132    }
3133    *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
3134
3135    return ROK;
3136 } /* End BuildControlRSetToAddModList */
3137
3138 /*******************************************************************
3139  *
3140  * @brief Build search space to add/modify list
3141  *
3142  * @details
3143  *
3144  *    Function : BuildSearchSpcToAddModList
3145  *
3146  *    Functionality: Build search space to add/modify list
3147  *
3148  * @params[in] 
3149  * @return ROK     - success
3150  *         RFAILED - failure
3151  *
3152  * ****************************************************************/
3153    uint8_t BuildSearchSpcToAddModList
3154 (
3155  struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
3156  )
3157 {
3158    uint8_t idx;
3159    uint8_t numBytes;
3160    uint8_t byteIdx;
3161    uint8_t bitsUnused;
3162    uint8_t elementCnt;
3163    struct SearchSpace *searchSpc;
3164
3165    elementCnt = 1;
3166    searchSpcList->list.count = elementCnt;
3167    searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
3168
3169    searchSpcList->list.array = NULLP;
3170    DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
3171    if(!searchSpcList->list.array)
3172    {
3173       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3174       return RFAILED;
3175    }
3176
3177    for(idx = 0; idx < elementCnt; idx++)
3178    {
3179       searchSpcList->list.array[idx] = NULLP;
3180       DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
3181       if(!searchSpcList->list.array[idx])
3182       {
3183          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3184          return RFAILED;
3185       }
3186    }
3187
3188    idx = 0;
3189    searchSpc = searchSpcList->list.array[idx];
3190
3191    searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
3192
3193    searchSpc->controlResourceSetId = NULLP;
3194    DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
3195    if(!searchSpc->controlResourceSetId)
3196    {
3197       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3198       return RFAILED;
3199    }
3200    *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
3201
3202    searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
3203    DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
3204          sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
3205    if(!searchSpc->monitoringSlotPeriodicityAndOffset)
3206    {
3207       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3208       return RFAILED;
3209    }
3210    searchSpc->monitoringSlotPeriodicityAndOffset->present = \
3211                                                             SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
3212
3213    searchSpc->duration = NULLP;
3214    searchSpc->monitoringSymbolsWithinSlot = NULLP;
3215    DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
3216    if(!searchSpc->monitoringSymbolsWithinSlot)
3217    {
3218       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3219       return RFAILED;
3220    }
3221
3222    /* Values taken from reference logs :
3223     * size 2 bytes
3224     * 2 LSBs unsued
3225     * Bit string stores 8000
3226     */
3227    numBytes = 2;
3228    bitsUnused = 2;
3229
3230    searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
3231    searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
3232    DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
3233          searchSpc->monitoringSymbolsWithinSlot->size);
3234    if(!searchSpc->monitoringSymbolsWithinSlot->buf)
3235    {
3236       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3237       return RFAILED;
3238    }
3239
3240    byteIdx = 0;
3241    searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
3242                                                             PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
3243    searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
3244    searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
3245
3246    searchSpc->nrofCandidates = NULLP;
3247    DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
3248    if(!searchSpc->nrofCandidates)
3249    {
3250       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3251       return RFAILED;
3252    }
3253
3254    searchSpc->nrofCandidates->aggregationLevel1 = \
3255                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
3256    searchSpc->nrofCandidates->aggregationLevel2 = \
3257                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
3258    searchSpc->nrofCandidates->aggregationLevel4 = \
3259                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
3260    searchSpc->nrofCandidates->aggregationLevel8 = \
3261                                                   PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
3262    searchSpc->nrofCandidates->aggregationLevel16 = \
3263                                                    PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
3264
3265    searchSpc->searchSpaceType = NULLP;
3266    DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
3267    if(!searchSpc->searchSpaceType)
3268    {
3269       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3270       return RFAILED;
3271    }
3272
3273    searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3274
3275    searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3276    DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3277          sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3278    if(!searchSpc->searchSpaceType->choice.ue_Specific)
3279    {
3280       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3281       return RFAILED;
3282    }  
3283    searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3284                                                                  PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3285
3286    return ROK;
3287 }/* End BuildSearchSpcToAddModList */
3288
3289 /*******************************************************************
3290  *
3291  * @brief Builds BWP DL dedicated PDCCH config
3292  *
3293  * @details
3294  *
3295  *    Function : BuildBWPDlDedPdcchCfg
3296  *
3297  *    Functionality: Builds BWP DL dedicated PDCCH config
3298  *
3299  * @params[in] struct PDCCH_Config *pdcchCfg
3300  *
3301  * @return ROK     - success
3302  *         RFAILED - failure
3303  *
3304  * ****************************************************************/
3305 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3306 {
3307    pdcchCfg->controlResourceSetToAddModList = NULLP;
3308    DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3309          sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3310    if(!pdcchCfg->controlResourceSetToAddModList)
3311    {
3312       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3313       return RFAILED;
3314    }
3315
3316    if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3317    {
3318       return RFAILED;
3319    }
3320
3321    pdcchCfg->controlResourceSetToReleaseList = NULLP;
3322
3323    pdcchCfg->searchSpacesToAddModList = NULLP;
3324    DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3325          sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3326    if(!pdcchCfg->searchSpacesToAddModList)
3327    {
3328       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3329       return RFAILED;
3330    }
3331
3332    if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3333    {
3334       return RFAILED;
3335    }
3336
3337    pdcchCfg->searchSpacesToReleaseList = NULLP;
3338    pdcchCfg->downlinkPreemption = NULLP;
3339    pdcchCfg->tpc_PUSCH = NULLP;
3340    pdcchCfg->tpc_PUCCH = NULLP;
3341    pdcchCfg->tpc_SRS = NULLP;
3342
3343    return ROK;
3344 }
3345
3346 /*******************************************************************
3347  *
3348  * @brief Builds DMRS DL PDSCH Mapping type A
3349  *
3350  * @details
3351  *
3352  *    Function : BuildDMRSDLPdschMapTypeA
3353  *
3354  *    Functionality: Builds DMRS DL PDSCH Mapping type A
3355  *
3356  * @params[in]
3357  * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3358  * @return ROK     - success
3359  *         RFAILED - failure
3360  *
3361  * ****************************************************************/
3362    uint8_t BuildDMRSDLPdschMapTypeA
3363 (
3364  struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3365  )
3366 {
3367    dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3368    dmrsDlCfg->choice.setup = NULLP;
3369    DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3370    if(!dmrsDlCfg->choice.setup)
3371    {
3372       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3373       return RFAILED;
3374    }
3375
3376    dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3377    dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3378    DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3379    if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3380    {
3381       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3382       return RFAILED;
3383    }
3384    *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3385
3386    dmrsDlCfg->choice.setup->maxLength = NULLP;
3387    dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3388    dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3389    dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3390
3391    return ROK;
3392 }
3393
3394 /*******************************************************************
3395  *
3396  * @brief Builds TCI states to add/modify list
3397  *
3398  * @details
3399  *
3400  *    Function : BuildTCIStatesToAddModList
3401  *
3402  *    Functionality:Builds TCI states to add/modify list
3403  *
3404  * @params[in] 
3405  * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3406  *
3407  * @return ROK     - success
3408  *         RFAILED - failure
3409  *
3410  * ****************************************************************/
3411 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3412 {
3413    return ROK;
3414 }
3415
3416 /*******************************************************************
3417  *
3418  * @brief Builds PDSCH time domain allocation list
3419  *
3420  * @details
3421  *
3422  *    Function : BuildPdschTimeDomAllocList
3423  *
3424  *    Functionality: Builds PDSCH time domain allocation list
3425  *
3426  * @params[in] 
3427  * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3428  *
3429  * @return ROK     - success
3430  *         RFAILED - failure
3431  *
3432  * ****************************************************************/
3433    uint8_t BuildPdschTimeDomAllocList
3434 (
3435  struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3436  )
3437 {
3438    uint8_t idx;
3439    uint8_t elementCnt;
3440    struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3441
3442    timeDomAllocList->present = \
3443                                PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3444
3445    timeDomAllocList->choice.setup = NULLP;
3446    DU_ALLOC(timeDomAllocList->choice.setup, \
3447          sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3448    if(!timeDomAllocList->choice.setup)
3449    {
3450       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3451       return RFAILED;
3452    }
3453
3454    elementCnt = 1;
3455    timeDomAllocList->choice.setup->list.count = elementCnt;
3456    timeDomAllocList->choice.setup->list.size = \
3457                                                elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3458
3459    timeDomAllocList->choice.setup->list.array = NULLP;
3460    DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3461          timeDomAllocList->choice.setup->list.size);
3462    if(!timeDomAllocList->choice.setup->list.array)
3463    {
3464       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3465       return RFAILED;
3466    }
3467
3468    for(idx = 0; idx < elementCnt; idx++)
3469    {
3470       timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3471       DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3472             sizeof(struct PDSCH_TimeDomainResourceAllocation));
3473       if(!timeDomAllocList->choice.setup->list.array[idx])
3474       {
3475          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3476          return RFAILED;
3477       }
3478    }
3479
3480    idx = 0;
3481    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3482
3483    timeDomAlloc->k0 = NULLP;
3484    timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3485    timeDomAlloc->startSymbolAndLength = \
3486                                         calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
3487
3488    return ROK;
3489 }
3490
3491 /*******************************************************************
3492  *
3493  * @brief Builds PDSCH PRB Bundling type
3494  *
3495  * @details
3496  *
3497  *    Function : BuildPdschPrbBundlingType
3498  *
3499  *    Functionality: Builds PDSCH PRB Bundling type
3500  *
3501  * @params[in] 
3502  * struct PDSCH_Config__prb_BundlingType *prbBndlType
3503  *
3504  * @return ROK     - success
3505  *         RFAILED - failure
3506  *
3507  * ****************************************************************/
3508    uint8_t BuildPdschPrbBundlingType
3509 (
3510  struct PDSCH_Config__prb_BundlingType *prbBndlType
3511  )
3512 {
3513    prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3514
3515    prbBndlType->choice.staticBundling = NULLP;
3516    DU_ALLOC(prbBndlType->choice.staticBundling, \
3517          sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3518    if(!prbBndlType->choice.staticBundling)
3519    {
3520       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3521       return RFAILED;
3522    }
3523    prbBndlType->choice.staticBundling->bundleSize = NULLP;
3524
3525    return ROK;
3526 }
3527
3528 /*******************************************************************
3529  *
3530  * @brief Builds BWP DL dedicated PDSCH config 
3531  *
3532  * @details
3533  *
3534  *    Function : BuildBWPDlDedPdschCfg
3535  *
3536  *    Functionality: Builds BWP DL dedicated PDSCH config
3537  *
3538  * @params[in] struct PDSCH_Config *pdschCfg
3539  *
3540  * @return ROK     - success
3541  *         RFAILED - failure
3542  *
3543  * ****************************************************************/
3544 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3545 {
3546    pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3547
3548    pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3549    DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3550          sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3551    if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3552    {
3553       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3554       return RFAILED;
3555    }
3556
3557    if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3558    {
3559       return RFAILED;
3560    }
3561
3562    pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3563    pdschCfg->tci_StatesToAddModList = NULLP;
3564    pdschCfg->tci_StatesToReleaseList = NULLP;
3565    pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3566 #if 0
3567    DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3568    if(!pdschCfg->tci_StatesToAddModList)
3569    {
3570       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3571       return RFAILED;
3572    }
3573    if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3574    {
3575       return RFAILED;
3576    }
3577 #endif
3578
3579    pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3580
3581    pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3582    DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3583          sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3584    if(!pdschCfg->pdsch_TimeDomainAllocationList)
3585    {
3586       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3587       return RFAILED;
3588    }
3589
3590    if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3591    {
3592       return RFAILED;
3593    }
3594
3595    pdschCfg->pdsch_AggregationFactor = NULLP;
3596    pdschCfg->rateMatchPatternToAddModList = NULLP;
3597    pdschCfg->rateMatchPatternToReleaseList = NULLP;
3598    pdschCfg->rateMatchPatternGroup1 = NULLP;
3599    pdschCfg->rateMatchPatternGroup2 = NULLP;
3600    pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3601    pdschCfg->mcs_Table = NULLP;
3602
3603    pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3604    DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3605    if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3606    {
3607       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3608       return RFAILED;
3609    }
3610    *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3611
3612    if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3613    {
3614       return RFAILED;
3615    }
3616
3617    pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3618    pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3619    pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3620    pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3621    pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3622    pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3623    pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3624
3625    return ROK;
3626 }
3627
3628 /*******************************************************************
3629  *
3630  * @brief Builds intitial DL BWP
3631  * @details
3632  *
3633  *    Function : BuildInitialDlBWP 
3634  *
3635  *    Functionality: Builds intitial DL BWP in spCellCfgDed
3636  *
3637  * @params[in] BWP_DownlinkDedicated_t *dlBwp
3638  *
3639  * @return ROK     - success
3640  *         RFAILED - failure
3641  *
3642  * ****************************************************************/
3643 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3644 {
3645    dlBwp->pdcch_Config = NULLP;
3646    DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3647    if(!dlBwp->pdcch_Config)
3648    {
3649       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3650       return RFAILED;
3651    }
3652    dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup; 
3653
3654    dlBwp->pdcch_Config->choice.setup = NULLP;
3655    DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3656    if(!dlBwp->pdcch_Config->choice.setup)
3657    {
3658       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3659       return RFAILED;
3660    }
3661    if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3662    {
3663       return RFAILED;
3664    }
3665
3666    dlBwp->pdsch_Config = NULLP;
3667    DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3668    if(!dlBwp->pdsch_Config)
3669    {
3670       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3671       return RFAILED;
3672    }
3673    dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3674
3675    dlBwp->pdsch_Config->choice.setup = NULLP;
3676    DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3677    if(!dlBwp->pdsch_Config->choice.setup)
3678    {
3679       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failure in BuildInitialDlBWP");
3680       return RFAILED;
3681    }
3682
3683    if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3684    {
3685       return RFAILED;
3686    }
3687
3688    dlBwp->sps_Config = NULLP;
3689    dlBwp->radioLinkMonitoringConfig = NULLP; 
3690    return ROK;
3691 }
3692
3693 /*******************************************************************
3694  *
3695  * @brief Builds DMRS UL Pusch Mapping type A
3696  *
3697  * @details
3698  *
3699  *    Function : BuildDMRSULPuschMapTypeA
3700  *
3701  *    Functionality: Builds DMRS UL Pusch Mapping type A
3702  *
3703  * @params[in] 
3704  *    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3705  * @return ROK     - success
3706  *         RFAILED - failure
3707  *
3708  * ****************************************************************/
3709    uint8_t BuildDMRSULPuschMapTypeA
3710 (
3711  struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3712  )
3713 {
3714    dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3715    dmrsUlCfg->choice.setup= NULLP;
3716    DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3717    if(!dmrsUlCfg->choice.setup)
3718    {
3719       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3720       return RFAILED;
3721    }
3722
3723    dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3724    dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3725    DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3726    if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3727    {
3728       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3729       return RFAILED;
3730    }
3731    *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS; 
3732
3733    dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3734    dmrsUlCfg->choice.setup->maxLength = NULLP;
3735    dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3736    DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3737          sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3738    if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3739    {
3740       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3741       return RFAILED;
3742    }
3743
3744    dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3745    DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3746          sizeof(long));
3747    if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3748    {
3749       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3750       return RFAILED;
3751    }
3752    *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3753
3754    dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3755    dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3756    return ROK;
3757 }
3758
3759 /*******************************************************************
3760  *
3761  * @brief Build PUSCH time domain allocation list
3762  *
3763  * @details
3764  *
3765  *    Function : BuildPuschTimeDomAllocList
3766  *
3767  *    Functionality: Build PUSCH time domain allocation list
3768  *
3769  * @params[in] 
3770  * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3771  *
3772  * @return ROK     - success
3773  *         RFAILED - failure
3774  *
3775  * ****************************************************************/
3776    uint8_t BuildPuschTimeDomAllocList
3777 (
3778  struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3779  )
3780 {
3781    uint8_t idx;
3782    uint8_t elementCnt;
3783    PUSCH_TimeDomainResourceAllocation_t  *timeDomAlloc;
3784
3785    timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3786    timeDomAllocList->choice.setup = NULLP;
3787    DU_ALLOC(timeDomAllocList->choice.setup, \
3788          sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3789    if(!timeDomAllocList->choice.setup)
3790    {
3791       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3792       return RFAILED;
3793    }
3794
3795    elementCnt = 1;
3796    timeDomAllocList->choice.setup->list.count = elementCnt;
3797    timeDomAllocList->choice.setup->list.size = \
3798                                                elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3799    timeDomAllocList->choice.setup->list.array = NULLP;
3800    DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3801          timeDomAllocList->choice.setup->list.size);
3802    if(!timeDomAllocList->choice.setup->list.array)
3803    {
3804       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3805       return RFAILED;
3806    }
3807
3808    for(idx = 0; idx < elementCnt; idx++)
3809    {
3810       timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3811       DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3812             sizeof(PUSCH_TimeDomainResourceAllocation_t));
3813       if(!timeDomAllocList->choice.setup->list.array[idx])
3814       {
3815          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3816          return RFAILED;
3817       }
3818    }
3819
3820    idx = 0;
3821    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3822    DU_ALLOC(timeDomAlloc->k2, sizeof(long));
3823    if(!timeDomAlloc->k2)
3824    {
3825       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3826       return RFAILED;
3827    }
3828    *(timeDomAlloc->k2) = PUSCH_K2;
3829    timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3830    timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
3831    return ROK;
3832 }
3833
3834 /*******************************************************************
3835  *
3836  * @brief Builds BWP UL dedicated PUSCH Config
3837  *
3838  * @details
3839  *
3840  *    Function : BuildBWPUlDedPuschCfg
3841  *
3842  *    Functionality:
3843  *      Builds BWP UL dedicated PUSCH Config
3844  *
3845  * @params[in] : PUSCH_Config_t *puschCfg
3846  *    
3847  * @return ROK     - success
3848  *         RFAILED - failure
3849  *
3850  * ****************************************************************/
3851 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3852 {
3853    puschCfg->dataScramblingIdentityPUSCH = NULLP;
3854    DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3855    if(!puschCfg->dataScramblingIdentityPUSCH)
3856    {
3857       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3858       return RFAILED;
3859    }
3860    *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3861
3862    puschCfg->txConfig = NULLP;
3863    puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3864    DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3865          sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3866    if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3867    {
3868       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3869       return RFAILED;
3870    }
3871
3872    if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3873    {
3874       return RFAILED;
3875    }
3876
3877    puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3878    puschCfg->pusch_PowerControl = NULLP;
3879    puschCfg->frequencyHopping = NULLP;
3880    puschCfg->frequencyHoppingOffsetLists = NULLP;
3881    puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3882
3883    puschCfg->pusch_TimeDomainAllocationList = NULLP;
3884    DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3885          sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3886    if(!puschCfg->pusch_TimeDomainAllocationList)
3887    {
3888       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3889       return RFAILED;
3890    }
3891
3892    if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3893    {
3894       return RFAILED;
3895    }
3896
3897    puschCfg->pusch_AggregationFactor = NULLP;
3898    puschCfg->mcs_Table = NULLP;
3899    puschCfg->mcs_TableTransformPrecoder = NULLP;
3900    puschCfg->transformPrecoder = NULLP;
3901    DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3902    if(!puschCfg->transformPrecoder)
3903    {
3904       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
3905       return RFAILED;
3906    }
3907    *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3908
3909    puschCfg->codebookSubset = NULLP;
3910    puschCfg->maxRank = NULLP;
3911    puschCfg->rbg_Size = NULLP;
3912    puschCfg->uci_OnPUSCH = NULLP;
3913    puschCfg->tp_pi2BPSK = NULLP;
3914
3915    return ROK;
3916 }
3917
3918 /*******************************************************************
3919  *
3920  * @brief Fills SRS resource to add/modify list 
3921  *
3922  * @details
3923  *
3924  *    Function : BuildSrsRsrcAddModList
3925  *
3926  *    Functionality: Fills SRS resource to add/modify list
3927  *
3928  * @params[in] 
3929  * @return ROK     - success
3930  *         RFAILED - failure
3931  *
3932  * ****************************************************************/
3933 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3934 {
3935    uint8_t   elementCnt;
3936    uint8_t   rsrcIdx;
3937
3938    elementCnt = 1;
3939    resourceList->list.count = elementCnt;
3940    resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3941    resourceList->list.array = NULLP;
3942    DU_ALLOC(resourceList->list.array, resourceList->list.size);
3943    if(!resourceList->list.array)
3944    {
3945       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
3946       return RFAILED;
3947    }
3948
3949    for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3950    {
3951       DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3952       if(!resourceList->list.array[rsrcIdx])
3953       {
3954          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
3955          return RFAILED;
3956       }
3957    }
3958
3959    rsrcIdx = 0;
3960    resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3961    resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3962    resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3963
3964    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3965    DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3966          sizeof(struct SRS_Resource__transmissionComb__n2));
3967    if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3968    {
3969       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
3970       return RFAILED;
3971    }
3972    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3973       = SRS_COMB_OFFSET_N2;
3974    resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3975       = SRS_CYCLIC_SHIFT_N2;
3976
3977    resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3978                                                                       PUSCH_START_SYMBOL;
3979    resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols =  \
3980                                                                      SRS_Resource__resourceMapping__nrofSymbols_n1;
3981    resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3982                                                                          SRS_Resource__resourceMapping__repetitionFactor_n1;
3983
3984    resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3985    resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3986    resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3987    resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3988    resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3989    resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3990                                                                SRS_Resource__groupOrSequenceHopping_neither;
3991
3992    /* Setting resource type to aperiodic for intergration purposes */
3993    resourceList->list.array[rsrcIdx]->resourceType.present = \
3994                                                              SRS_Resource__resourceType_PR_aperiodic;
3995    resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3996    DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3997          sizeof(struct SRS_Resource__resourceType__aperiodic));
3998    if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3999    {
4000       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
4001       return RFAILED;
4002    }
4003    resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
4004
4005    return ROK;
4006 }
4007
4008 /*******************************************************************
4009  *
4010  * @brief Build SRS resource set Add/mod list
4011  *
4012  * @details
4013  *
4014  *    Function : BuildSrsRsrcSetAddModList
4015  *
4016  *    Functionality: Build SRS resource set Add/mod list
4017  *
4018  * @params[in] 
4019  * @return ROK     - success
4020  *         RFAILED - failure
4021  *
4022  * ****************************************************************/
4023    uint8_t BuildSrsRsrcSetAddModList
4024 (
4025  struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
4026  )
4027 {
4028    uint8_t  elementCnt;
4029    uint8_t  rSetIdx;
4030    uint8_t  rsrcIdx;
4031    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
4032
4033    elementCnt = 1;
4034    rsrcSetList->list.count = elementCnt;
4035    rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
4036    rsrcSetList->list.array = NULLP;
4037    DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
4038    if(!rsrcSetList->list.array)
4039    {
4040       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4041       return RFAILED;
4042    }
4043
4044    for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4045    {
4046       DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4047       if(!rsrcSetList->list.array[rSetIdx])
4048       {
4049          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4050          return RFAILED;
4051       }
4052    }
4053
4054    rSetIdx = 0;
4055    rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
4056
4057    /* Fill Resource Id list in resource set */
4058    rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
4059    DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4060          sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4061    if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4062    {
4063       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4064       return RFAILED;
4065    }
4066
4067    elementCnt = 1;
4068    rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4069    rsrcIdList->list.count = elementCnt;
4070    rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
4071    rsrcIdList->list.array = NULLP;
4072    DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
4073    if(!rsrcIdList->list.array)
4074    {
4075       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4076       return RFAILED;
4077    }
4078
4079    for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4080    {
4081       DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4082       if(!rsrcIdList->list.array[rsrcIdx])
4083       {
4084          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4085          return RFAILED;
4086       }
4087    }
4088
4089    rsrcIdx = 0;
4090    *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
4091
4092    /* Fill resource type */
4093    rsrcSetList->list.array[rSetIdx]->resourceType.present = \
4094                                                             SRS_ResourceSet__resourceType_PR_aperiodic;
4095
4096    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
4097    DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4098          sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4099    if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
4100    {
4101       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
4102       return RFAILED;
4103    }
4104    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
4105       = APERIODIC_SRS_RESRC_TRIGGER;
4106
4107    /* TODO : Fill values for below IEs as expected by Viavi */
4108    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
4109    rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
4110
4111
4112    rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
4113    rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
4114    rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
4115    rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
4116    rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
4117
4118    return ROK;
4119 }
4120
4121 /*******************************************************************
4122  *
4123  * @brief Builds BWP UL dedicated SRS Config
4124  *
4125  * @details
4126  *
4127  *    Function : BuildBWPUlDedSrsCfg
4128  *
4129  *    Functionality: Builds BWP UL dedicated SRS Config
4130  *
4131  * @params[in] SRS Config 
4132  * @return ROK     - success
4133  *         RFAILED - failure
4134  *
4135  * ****************************************************************/
4136 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
4137 {
4138    srsCfg->srs_ResourceSetToReleaseList = NULLP;
4139    srsCfg->srs_ResourceSetToAddModList = NULLP;
4140    DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
4141          sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4142    if(!srsCfg->srs_ResourceSetToAddModList)
4143    {
4144       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
4145       return RFAILED;
4146    }
4147    if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
4148    {
4149       return RFAILED;
4150    }
4151
4152    srsCfg->srs_ResourceToReleaseList = NULLP;
4153
4154    /* Resource to Add/Modify list */
4155    srsCfg->srs_ResourceToAddModList = NULLP;
4156    DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
4157          sizeof(struct SRS_Config__srs_ResourceToAddModList));
4158    if(!srsCfg->srs_ResourceToAddModList)
4159    {
4160       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
4161       return RFAILED;
4162    }
4163
4164    if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
4165    {
4166       return RFAILED;
4167    }
4168
4169    srsCfg->tpc_Accumulation = NULLP;
4170
4171    return ROK;
4172 }
4173
4174
4175
4176 /*******************************************************************
4177  *
4178  * @brief Builds Pusch Serving cell Config
4179  *
4180  * @details
4181  *
4182  *    Function : BuildPuschSrvCellCfg
4183  *
4184  *    Functionality: Builds Pusch Serving cell Config
4185  *
4186  * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
4187  *
4188  * @return ROK     - success
4189  *         RFAILED - failure
4190  *
4191  * ****************************************************************/
4192 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
4193 {
4194    puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
4195    puschCfg->choice.setup = NULLP;
4196    DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4197    if(!puschCfg->choice.setup)
4198    {
4199       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4200       return RFAILED;
4201    }
4202
4203    puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4204    puschCfg->choice.setup->rateMatching = NULLP;
4205    puschCfg->choice.setup->xOverhead = NULLP;
4206    puschCfg->choice.setup->ext1 = NULLP;
4207    DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4208    if(!puschCfg->choice.setup->ext1)
4209    {
4210       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4211       return RFAILED;
4212    }
4213
4214    puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4215    DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4216    if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4217    {
4218       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4219       return RFAILED;
4220    }
4221    *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4222
4223    puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4224    DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4225    if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4226    {
4227       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4228       return RFAILED;
4229    }
4230    *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4231    return ROK;
4232 }
4233
4234 /*******************************************************************
4235  *
4236  * @brief Builds inital UL BWP
4237  *
4238  * @details
4239  *
4240  *    Function : BuildInitialUlBWP
4241  *
4242  *    Functionality: Builds initial UL BWP
4243  *
4244  * @params[in] BWP_UplinkDedicated_t *ulBwp
4245  * @return ROK     - success
4246  *         RFAILED - failure
4247  *
4248  * ****************************************************************/
4249 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4250 {
4251    ulBwp->pucch_Config = NULLP;
4252
4253    /* Fill BWP UL dedicated PUSCH config */
4254    ulBwp->pusch_Config = NULLP;
4255    DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4256    if(!ulBwp->pusch_Config)
4257    {
4258       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4259       return RFAILED;
4260    }
4261
4262    ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
4263    ulBwp->pusch_Config->choice.setup = NULLP;
4264    DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4265    if(!ulBwp->pusch_Config->choice.setup)
4266    {
4267       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4268       return RFAILED;
4269    }
4270
4271    if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
4272    {
4273       return RFAILED;
4274    }
4275
4276    ulBwp->configuredGrantConfig = NULLP;
4277
4278    /* Fill BPW UL dedicated SRS config */
4279    ulBwp->srs_Config = NULLP;
4280    DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4281    if(!ulBwp->srs_Config)
4282    {
4283       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4284       return RFAILED;
4285    }
4286
4287    ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
4288    ulBwp->srs_Config->choice.setup = NULLP;
4289    DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4290    if(!ulBwp->srs_Config->choice.setup)
4291    {
4292       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
4293       return RFAILED;
4294    }
4295
4296    if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
4297    {
4298       return RFAILED;   
4299    }
4300
4301    ulBwp->beamFailureRecoveryConfig = NULLP;
4302
4303    return ROK;
4304 }
4305
4306 /*******************************************************************
4307  *
4308  * @brief Builds UL config
4309  * @details
4310  *
4311  *    Function : BuildUlCfg 
4312  *
4313  *    Functionality: Builds UL config in spCellCfgDed
4314  *
4315  * @params[in] UplinkConfig_t *ulCfg
4316  *
4317  * @return ROK     - success
4318  *         RFAILED - failure
4319  *
4320  * ****************************************************************/
4321 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4322 {
4323    ulCfg->initialUplinkBWP = NULLP;
4324    DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4325    if(!ulCfg->initialUplinkBWP)
4326    {
4327       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4328       return RFAILED;
4329    }
4330
4331    if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4332    {
4333       return RFAILED;
4334    }
4335
4336    ulCfg->uplinkBWP_ToReleaseList = NULLP;
4337    ulCfg->uplinkBWP_ToAddModList = NULLP;
4338    ulCfg->firstActiveUplinkBWP_Id = NULLP;
4339    DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4340    if(!ulCfg->firstActiveUplinkBWP_Id)
4341    {
4342       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4343       return RFAILED;
4344    }
4345    *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4346
4347    ulCfg->pusch_ServingCellConfig = NULLP;
4348    DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4349          sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4350    if(!ulCfg->pusch_ServingCellConfig)
4351    {
4352       DU_LOG("\nERROR  -->  F1AP : Memory Allocation failed in BuildUlCfg");
4353       return RFAILED;
4354    }
4355
4356    if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4357    {
4358       return RFAILED;
4359    }
4360
4361    ulCfg->carrierSwitching = NULLP;
4362    ulCfg->ext1 = NULLP;
4363    return ROK;
4364 }
4365
4366 /*******************************************************************
4367  *
4368  * @brief Builds PDSCH serving cell config
4369  * @details
4370  *
4371  *    Function : BuildPdschSrvCellCfg
4372  *
4373  *    Functionality: Builds PDSCH serving cell config in spCellCfgDed
4374  *
4375  * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg 
4376  *
4377  * @return ROK     - success
4378  *         RFAILED - failure
4379  *
4380  * ****************************************************************/
4381 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4382 {
4383    pdschCfg->present =  ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4384    pdschCfg->choice.setup = NULLP;
4385    DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4386    if(!pdschCfg->choice.setup)
4387    {
4388       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4389       return RFAILED;
4390    }
4391
4392    pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4393    pdschCfg->choice.setup->xOverhead = NULLP;
4394    pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4395    DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4396    if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4397    {
4398       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4399       return RFAILED;
4400    }
4401    *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4402    pdschCfg->choice.setup->pucch_Cell = NULLP;
4403    pdschCfg->choice.setup->ext1 = NULLP;
4404
4405    return ROK;
4406 }
4407
4408 /*******************************************************************
4409  *
4410  * @brief Builds CSI Meas config
4411  * @details
4412  *
4413  *    Function : BuildCsiMeasCfg 
4414  *
4415  *    Functionality: Builds CSI Meas config in spCellCfgDed
4416  *
4417  * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4418  *
4419  * @return ROK     - success
4420  *         RFAILED - failure
4421  *
4422  * ****************************************************************/
4423 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4424 {
4425
4426    return ROK;
4427 }
4428
4429 /*******************************************************************
4430  *
4431  * @brief Builds Spcell config dedicated
4432  * @details
4433  *
4434  *    Function : BuildSpCellCfgDed
4435  *
4436  *    Functionality: Builds sp cell config dedicated in spCellCfg
4437  *
4438  * @params[in] ServingCellConfig_t srvCellCfg
4439  *
4440  * @return ROK     - success
4441  *         RFAILED - failure
4442  *
4443  * ****************************************************************/
4444 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4445 {
4446    srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4447    DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
4448    if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
4449    {
4450       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4451       return RFAILED;
4452    }
4453
4454    srvCellCfg->initialDownlinkBWP = NULLP;
4455    DU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4456    if(!srvCellCfg->initialDownlinkBWP)
4457    {
4458       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4459       return RFAILED;
4460    }
4461
4462    if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4463    {
4464       DU_LOG("\nERROR  -->  F1AP : BuildInitialDlBWP failed");
4465       return RFAILED;
4466    }
4467    srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4468    srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4469
4470    srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4471    DU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4472    if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4473    {
4474       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4475       return RFAILED;
4476    }
4477    *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4478
4479    srvCellCfg->bwp_InactivityTimer = NULLP;
4480
4481    srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4482    DU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4483    if(!srvCellCfg->defaultDownlinkBWP_Id)
4484    {
4485       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4486       return RFAILED;
4487    }
4488    *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4489
4490    srvCellCfg->uplinkConfig = NULLP;
4491    DU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4492    if(!srvCellCfg->uplinkConfig)
4493    {
4494       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4495       return RFAILED;
4496    }
4497
4498    if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4499    {
4500       DU_LOG("\nERROR  -->  F1AP : BuildUlCfg failed");
4501       return RFAILED;
4502    }
4503    srvCellCfg->supplementaryUplink = NULLP;
4504    srvCellCfg->pdcch_ServingCellConfig = NULLP;
4505
4506    srvCellCfg->pdsch_ServingCellConfig = NULLP;
4507    DU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct  ServingCellConfig__pdsch_ServingCellConfig));
4508    if(!srvCellCfg->pdsch_ServingCellConfig)
4509    {
4510       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4511       return RFAILED;
4512    }
4513
4514    if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4515    {
4516       DU_LOG("\nERROR  -->  F1AP : BuildPdschSrvCellCfg failed");
4517       return RFAILED;
4518    }
4519
4520    srvCellCfg->csi_MeasConfig = NULLP;
4521 #if 0
4522    DU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct   ServingCellConfig__csi_MeasConfig))
4523       if(!srvCellCfg->csi_MeasConfig)
4524       {
4525          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfgDed");
4526          return RFAILED;
4527       }
4528
4529    if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4530    {
4531       DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4532       return RFAILED;
4533    }
4534 #endif
4535    srvCellCfg->sCellDeactivationTimer = NULLP;
4536    srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4537    srvCellCfg->tag_Id = TAG_ID;
4538    srvCellCfg->dummy = NULLP;
4539    srvCellCfg->pathlossReferenceLinking = NULLP;
4540    srvCellCfg->servingCellMO = NULLP;
4541    srvCellCfg->ext1 = NULLP;
4542
4543    return ROK;
4544 }
4545 /*******************************************************************
4546  *
4547  * @brief Builds Spcell config 
4548  *
4549  * @details
4550  *
4551  *    Function : BuildSpCellCfg 
4552  *
4553  *    Functionality: Builds sp cell config in DuToCuRrcContainer
4554  *
4555  * @params[in] SpCellConfig_t spCellCfg
4556  *
4557  * @return ROK     - success
4558  *         RFAILED - failure
4559  *
4560  * ****************************************************************/
4561 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4562 {
4563
4564    spCellCfg->servCellIndex = NULLP;
4565    DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4566    if(!spCellCfg->servCellIndex)
4567    {
4568       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4569       return RFAILED;
4570    }
4571    *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4572
4573    spCellCfg->reconfigurationWithSync = NULLP;
4574    spCellCfg->rlf_TimersAndConstants = NULLP;
4575    spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4576    DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4577    if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4578    {
4579       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4580       return RFAILED;
4581    }
4582    *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4583
4584    spCellCfg->spCellConfigDedicated = NULLP;
4585    DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4586    if(!spCellCfg->spCellConfigDedicated)
4587    {
4588       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildSpCellCfg");
4589       return RFAILED;
4590    }
4591    if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4592    {
4593       DU_LOG("\nERROR  -->  F1AP : BuildSpCellCfgDed failed");
4594       return RFAILED;
4595    }
4596    return ROK;
4597 }
4598 /*******************************************************************
4599  *
4600  * @brief Builds Phy cell group config 
4601  *
4602  * @details
4603  *
4604  *    Function : BuildPhyCellGrpCfg 
4605  *
4606  *    Functionality: Builds Phy cell group config in DuToCuRrcContainer
4607  *
4608  * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg 
4609  *
4610  * @return ROK     - success
4611  *         RFAILED - failure
4612  *
4613  * ****************************************************************/
4614 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4615 {
4616    phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4617    phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4618
4619    phyCellGrpCfg->p_NR_FR1 = NULLP;
4620    DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4621    if(!phyCellGrpCfg->p_NR_FR1)
4622    {
4623       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4624       return RFAILED;
4625    }
4626    *(phyCellGrpCfg->p_NR_FR1)             = P_NR_FR1;
4627    phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4628    phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4629    phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4630    phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4631    phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4632    phyCellGrpCfg->cs_RNTI = NULLP;
4633    phyCellGrpCfg->ext1 = NULLP;
4634    phyCellGrpCfg->ext2 = NULLP;
4635
4636    return ROK;
4637 }
4638 /*******************************************************************
4639  *
4640  * @brief Builds Mac cell group config 
4641  *
4642  * @details
4643  *
4644  *    Function : BuildMacCellGrpCfg 
4645  *
4646  *    Functionality: Builds Mac cell group config in DuToCuRrcContainer
4647  *
4648  * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4649  *
4650  * @return ROK     - success
4651  *         RFAILED - failure
4652  *
4653  * ****************************************************************/
4654 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4655 {
4656    macCellGrpCfg->drx_Config = NULLP;
4657    macCellGrpCfg->schedulingRequestConfig = NULLP;
4658    DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4659    if(!macCellGrpCfg->schedulingRequestConfig)
4660    {
4661       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4662       return RFAILED;
4663    }
4664
4665    if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4666    {
4667       DU_LOG("\nERROR  -->  F1AP : BuildSchedulingReqConfig failed");
4668       return RFAILED;
4669    }
4670
4671    macCellGrpCfg->bsr_Config = NULLP;
4672    DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4673    if(!macCellGrpCfg->bsr_Config)
4674    {
4675       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4676       return RFAILED;
4677    }
4678
4679    if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4680    {
4681       DU_LOG("\nERROR  -->  F1AP : BuildBsrConfig failed");
4682       return RFAILED;
4683    }
4684
4685    macCellGrpCfg->tag_Config = NULLP;
4686    DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4687    if(!macCellGrpCfg->tag_Config)
4688    {
4689       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4690       return RFAILED;
4691    }
4692
4693    if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4694    {
4695       DU_LOG("\nERROR  -->  F1AP : BuildTagConfig failed");
4696       return RFAILED;
4697    }
4698
4699    macCellGrpCfg->phr_Config = NULLP;
4700    DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4701    if(!macCellGrpCfg->phr_Config)
4702    {
4703       DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildMacCellGrpCfg");
4704       return RFAILED;
4705    }
4706
4707    if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4708    {
4709       DU_LOG("\nERROR  -->  F1AP : BuildPhrConfig failed");
4710       return RFAILED;
4711    }
4712
4713    macCellGrpCfg->skipUplinkTxDynamic = false;
4714    macCellGrpCfg->ext1 = NULLP;
4715
4716    return ROK;
4717 }
4718 /*******************************************************************
4719  *
4720  * @brief Frees memeory allocated for SearchSpcToAddModList
4721  *
4722  * @details
4723  *
4724  *    Function : FreeSearchSpcToAddModList
4725  *
4726  *    Functionality: Deallocating memory of SearchSpcToAddModList
4727  *
4728  * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4729  *
4730  * @return void
4731  *
4732  4221 * ****************************************************************/
4733 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4734 {
4735    uint8_t idx1=0;
4736    uint8_t idx2=0;
4737    struct  SearchSpace *searchSpc=NULLP;
4738
4739    if(searchSpcList->list.array)
4740    {
4741       if(searchSpcList->list.array[idx2])
4742       {
4743          searchSpc = searchSpcList->list.array[idx2];
4744          if(searchSpc->controlResourceSetId)
4745          {
4746             if(searchSpc->monitoringSlotPeriodicityAndOffset)
4747             {
4748                if(searchSpc->monitoringSymbolsWithinSlot)
4749                {
4750                   if(searchSpc->monitoringSymbolsWithinSlot->buf)
4751                   {
4752                      if(searchSpc->nrofCandidates)
4753                      {
4754                         if(searchSpc->searchSpaceType)
4755                         {
4756                            DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4757                                  sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4758                            DU_FREE(searchSpc->searchSpaceType, sizeof(struct
4759                                     SearchSpace__searchSpaceType));
4760                         }
4761                         DU_FREE(searchSpc->nrofCandidates,
4762                               sizeof(struct SearchSpace__nrofCandidates));
4763                      }
4764                      DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4765                            searchSpc->monitoringSymbolsWithinSlot->size);
4766                   }
4767                   DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4768                         sizeof(BIT_STRING_t));
4769                }
4770                DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4771                      sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4772             }
4773             DU_FREE(searchSpc->controlResourceSetId,
4774                   sizeof(ControlResourceSetId_t));
4775          }
4776       }
4777       for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4778       {
4779          DU_FREE(searchSpcList->list.array[idx1],
4780                sizeof(struct SearchSpace));
4781       }
4782       DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4783    }
4784 }
4785 /*******************************************************************
4786  *
4787  * @brief Frees memory allocated for PdschTimeDomAllocList
4788  *
4789  * @details
4790  *
4791  *    Function : FreePdschTimeDomAllocList
4792  *
4793  *    Functionality: Deallocating memory of PdschTimeDomAllocList
4794  *
4795  * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4796  *
4797  * @return void
4798  *
4799  4221 * ****************************************************************/
4800 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4801 {
4802    uint8_t idx1=0;
4803
4804    if(timeDomAllocList->choice.setup)
4805    {
4806       if(timeDomAllocList->choice.setup->list.array)
4807       {
4808          for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4809          {
4810             DU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4811                   sizeof(struct PDSCH_TimeDomainResourceAllocation));
4812          }
4813          DU_FREE(timeDomAllocList->choice.setup->list.array, \
4814                timeDomAllocList->choice.setup->list.size);
4815       }
4816       DU_FREE(timeDomAllocList->choice.setup,\
4817             sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4818    }
4819 }
4820 /*******************************************************************
4821  *
4822  * @brief Frees memory allocated for PuschTimeDomAllocList
4823  *
4824  *@details
4825  *
4826  *    Function : FreePuschTimeDomAllocList
4827  *
4828  *    Functionality: Deallocating memory of PuschTimeDomAllocList
4829  *
4830  * @params[in] PUSCH_Config_t *puschCfg
4831  *
4832  * @return void
4833  *
4834  * ****************************************************************/
4835 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4836 {
4837    uint8_t idx1=0;
4838    uint8_t idx2=0;
4839    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4840
4841    if(puschCfg->pusch_TimeDomainAllocationList)
4842    {
4843       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4844       if(timeDomAllocList_t->choice.setup)
4845       {
4846          if(timeDomAllocList_t->choice.setup->list.array)
4847          {
4848             DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4849             for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4850             {
4851                DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4852                      sizeof(PUSCH_TimeDomainResourceAllocation_t));
4853             }
4854             DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4855                   timeDomAllocList_t->choice.setup->list.size);
4856          }
4857          DU_FREE(timeDomAllocList_t->choice.setup, \
4858                sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4859       }
4860       DU_FREE(puschCfg->transformPrecoder, sizeof(long));
4861       DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4862             sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4863    }
4864
4865 }
4866 /*******************************************************************
4867  *
4868  * @brief Frees memory allocated for InitialUlBWP
4869  *
4870  * @details
4871  *
4872  *    Function : FreeInitialUlBWP
4873  *
4874  *    Functionality: Deallocating memory of InitialUlBWP
4875  *
4876  * @params[in] BWP_UplinkDedicated_t *ulBwp
4877  *
4878  * @return void
4879  *
4880  * ****************************************************************/
4881 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4882 {
4883    uint8_t  rSetIdx, rsrcIdx;
4884    SRS_Config_t   *srsCfg = NULLP;
4885    PUSCH_Config_t *puschCfg = NULLP;
4886    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4887    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4888    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4889    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4890
4891    if(ulBwp->pusch_Config)
4892    {
4893       if(ulBwp->pusch_Config->choice.setup)
4894       {
4895          puschCfg=ulBwp->pusch_Config->choice.setup;
4896          if(puschCfg->dataScramblingIdentityPUSCH)
4897          {
4898             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4899             {
4900                FreePuschTimeDomAllocList(puschCfg);
4901                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4902                if(dmrsUlCfg->choice.setup)
4903                {
4904                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4905                   {
4906                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4907                      {
4908                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4909                               sizeof(long));
4910                         DU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4911                               sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4912                      }
4913                      DU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4914                            sizeof(long));
4915                   }
4916                   DU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4917                }
4918                DU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4919                      sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4920             }
4921             DU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4922          }
4923          DU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4924       }
4925       DU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4926
4927       /* Free SRS-Config */
4928       if(ulBwp->srs_Config)
4929       {
4930          if(ulBwp->srs_Config->choice.setup)
4931          {
4932             srsCfg = ulBwp->srs_Config->choice.setup;
4933
4934             /* Free Resource Set to add/mod list */
4935             if(srsCfg->srs_ResourceSetToAddModList)
4936             {
4937                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4938                if(rsrcSetList->list.array)
4939                {
4940                   rSetIdx = 0;
4941
4942                   /* Free SRS resource Id list in this SRS resource set */
4943                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4944                   {
4945                      rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4946
4947                      if(rsrcIdList->list.array)
4948                      {
4949                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4950                         {
4951                            DU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4952                         }
4953                         DU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4954                      }
4955                      DU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4956                            sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4957                   }
4958
4959                   /* Free resource type info for this SRS resource set */
4960                   DU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4961                         sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4962
4963                   /* Free memory for each resource set */
4964                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4965                   {
4966                      DU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4967                   }
4968                   DU_FREE(rsrcSetList->list.array, rsrcSetList->list.size); 
4969                }
4970                DU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4971                      sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4972             }
4973
4974             /* Free resource to add/modd list */
4975             if(srsCfg->srs_ResourceToAddModList)
4976             {
4977                resourceList = srsCfg->srs_ResourceToAddModList;
4978                if(resourceList->list.array)
4979                {
4980                   rsrcIdx = 0;
4981                   DU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4982                         sizeof(struct SRS_Resource__transmissionComb__n2));
4983                   DU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4984                         sizeof(struct SRS_Resource__resourceType__aperiodic));
4985
4986                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4987                   {
4988                      DU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4989                   }
4990                   DU_FREE(resourceList->list.array, resourceList->list.size);
4991                }
4992                DU_FREE(srsCfg->srs_ResourceToAddModList, \
4993                      sizeof(struct SRS_Config__srs_ResourceToAddModList));
4994             }
4995
4996             DU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4997          }
4998          DU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4999       }
5000    }
5001 }       
5002 /*******************************************************************
5003  *
5004  * @brief Frees memory allocated for initialUplinkBWP
5005  *
5006  * @details
5007  *
5008  *    Function : FreeinitialUplinkBWP
5009  *
5010  *    Functionality: Deallocating memory of initialUplinkBWP
5011  *
5012  * @params[in] UplinkConfig_t *ulCfg
5013  *
5014  * @return void
5015  *         
5016  *
5017  * ****************************************************************/
5018 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
5019 {
5020    BWP_UplinkDedicated_t *ulBwp=NULLP; 
5021    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
5022
5023    if(ulCfg->initialUplinkBWP)
5024    {
5025       ulBwp=ulCfg->initialUplinkBWP;
5026       if(ulCfg->firstActiveUplinkBWP_Id)
5027       {
5028          if(ulCfg->pusch_ServingCellConfig)
5029          {
5030             puschCfg=ulCfg->pusch_ServingCellConfig;
5031             if(puschCfg->choice.setup)
5032             {
5033                if(puschCfg->choice.setup->ext1)
5034                {
5035                   DU_FREE(puschCfg->choice.setup->ext1->\
5036                         processingType2Enabled,sizeof(BOOLEAN_t));
5037                   DU_FREE(puschCfg->choice.setup->ext1->\
5038                         maxMIMO_Layers,sizeof(long));
5039                   DU_FREE(puschCfg->choice.setup->ext1, \
5040                         sizeof(struct PUSCH_ServingCellConfig__ext1));
5041                }
5042                DU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
5043             }
5044             DU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
5045          }
5046          DU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
5047       }
5048       FreeInitialUlBWP(ulBwp);
5049       DU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
5050    }
5051 }
5052 /*******************************************************************
5053  *
5054  * @brief Frees emmory allocated for BWPDlDedPdschCfg
5055  *
5056  * @details
5057  *
5058  *    Function : FreeBWPDlDedPdschCfg
5059  *
5060  *    Functionality: Deallocating memory of BWPDlDedPdschCfg
5061  *
5062  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5063  *
5064  * @return void
5065  *
5066  *
5067  * ****************************************************************/
5068 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
5069 {
5070    struct PDSCH_Config *pdschCfg=NULLP;
5071    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
5072    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
5073    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
5074
5075    if(dlBwp->pdsch_Config->choice.setup)
5076    {
5077       pdschCfg=dlBwp->pdsch_Config->choice.setup;
5078       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
5079       {
5080          if(pdschCfg->pdsch_TimeDomainAllocationList)
5081          {
5082             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
5083             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
5084             {
5085                prbBndlType=&pdschCfg->prb_BundlingType;
5086                DU_FREE(prbBndlType->choice.staticBundling,\
5087                      sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5088                DU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5089             }
5090             FreePdschTimeDomAllocList(timeDomAllocList);
5091             DU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5092                   sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5093          }
5094          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5095          if(dmrsDlCfg->choice.setup)
5096          {
5097             DU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5098                   sizeof(long));
5099             DU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5100          }
5101          DU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5102                sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5103       }
5104       DU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5105    }
5106 }
5107 /*******************************************************************
5108  *
5109  * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5110  *
5111  * @details
5112  *
5113  *    Function : FreeBWPDlDedPdcchCfg
5114  *
5115  *    Functionality: Deallocating memory of BWPDlDedPdcchCfg
5116  *
5117  * @params[in] BWP_DownlinkDedicated_t *dlBwp
5118  *
5119  * @return void
5120  *         
5121  *
5122  * ****************************************************************/
5123 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5124 {
5125    uint8_t idx1=0;
5126    uint8_t idx2=0;
5127    struct PDCCH_Config *pdcchCfg=NULLP;
5128    struct ControlResourceSet *controlRSet=NULLP;
5129    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5130
5131    if(dlBwp->pdcch_Config->choice.setup)
5132    {
5133       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5134       if(pdcchCfg->controlResourceSetToAddModList)
5135       {
5136          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5137          if(controlRSetList->list.array)
5138          {
5139             controlRSet = controlRSetList->list.array[idx2];
5140             if(controlRSet)
5141             {
5142                if(controlRSet->frequencyDomainResources.buf)
5143                {
5144                   if(controlRSet->pdcch_DMRS_ScramblingID)
5145                   {
5146                      if(pdcchCfg->searchSpacesToAddModList)
5147                      {
5148                         FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5149                         DU_FREE(pdcchCfg->searchSpacesToAddModList, \
5150                               sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5151                      }
5152                      DU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5153                   }
5154                   DU_FREE(controlRSet->frequencyDomainResources.buf, \
5155                         controlRSet->frequencyDomainResources.size);
5156                }
5157             }
5158             for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5159             {
5160                DU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5161             }
5162             DU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5163          }
5164          DU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5165                sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5166       }
5167       DU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5168    }
5169 }       
5170
5171 /*******************************************************************
5172  *
5173  * @brief Frees emmory allocated for DUToCURRCContainer 
5174  *
5175  * @details
5176  *
5177  *    Function : FreeMemDuToCuRrcCont
5178  *
5179  *    Functionality: Deallocating memory of DuToCuRrcContainer
5180  *
5181  * @params[in] DuToCuRRCContainer, DuToCuRRCContainer
5182  *
5183  * @return ROK     - success
5184  *         RFAILED - failure
5185  *
5186  * ****************************************************************/
5187 uint8_t FreeMemDuToCuRrcCont(CellGroupConfigRrc_t *cellGrpCfg)
5188 {
5189    uint8_t idx=0;
5190    SpCellConfig_t *spCellCfg=NULLP;
5191    ServingCellConfig_t *srvCellCfg=NULLP;
5192    BWP_DownlinkDedicated_t *dlBwp=NULLP;
5193    MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5194    PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5195    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5196    struct RLC_Config *rlcConfig=NULLP;
5197    struct LogicalChannelConfig *macLcConfig=NULLP;
5198    struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5199    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5200    struct TAG_Config *tagConfig=NULLP;
5201    struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5202    struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5203    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5204
5205    rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5206    if(rlcBearerList)
5207    {
5208       if(rlcBearerList->list.array)
5209       {
5210          for(idx=0; idx<rlcBearerList->list.count; idx++)
5211          {
5212             if(rlcBearerList->list.array[idx])
5213             {  
5214                rlcConfig   = rlcBearerList->list.array[idx]->rlc_Config;
5215                macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5216                if(rlcConfig)
5217                {
5218                   if(rlcConfig->choice.am)
5219                   {
5220                      DU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5221                      DU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t)); 
5222                      DU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5223                   }     
5224                   DU_FREE(rlcConfig, sizeof(struct RLC_Config));
5225                }
5226                DU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5227                if(macLcConfig)
5228                {
5229                   if(macLcConfig->ul_SpecificParameters)
5230                   {
5231                      DU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID,   sizeof(SchedulingRequestId_t));
5232                      DU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup,   sizeof(long));
5233                      DU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5234                   }
5235                   DU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5236                }
5237                DU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5238             }   
5239          }
5240          DU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5241       }
5242       DU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5243    }
5244
5245    macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5246    if(macCellGrpCfg)
5247    {
5248       schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig; 
5249       if(schedulingRequestConfig)
5250       {
5251          schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5252          if(schReqList)
5253          {
5254             if(schReqList->list.array)
5255             {
5256                for(idx=0;idx<schReqList->list.count; idx++)
5257                {
5258                   if(schReqList->list.array[idx])
5259                   {
5260                      DU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5261                      DU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5262                   }
5263                }
5264                DU_FREE(schReqList->list.array, schReqList->list.size);
5265             }
5266             DU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5267                   sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));    }
5268             DU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5269       }
5270       if(macCellGrpCfg->bsr_Config)
5271       {
5272          DU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5273       }
5274       tagConfig = macCellGrpCfg->tag_Config;
5275       if(tagConfig)
5276       {
5277          tagList = tagConfig->tag_ToAddModList;
5278          if(tagList)
5279          {
5280             if(tagList->list.array)
5281             {
5282                for(idx=0; idx<tagList->list.count; idx++)
5283                {
5284                   DU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5285                }
5286                DU_FREE(tagList->list.array, tagList->list.size);
5287             }
5288             DU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5289          }
5290          DU_FREE(tagConfig, sizeof(struct TAG_Config));
5291       }
5292
5293       phrConfig = macCellGrpCfg->phr_Config;
5294       if(phrConfig)
5295       {
5296          DU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5297          DU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5298       }
5299
5300       DU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5301    }
5302
5303    phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5304    if(phyCellGrpCfg)
5305    {
5306       DU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5307       DU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5308    }
5309
5310    spCellCfg = cellGrpCfg->spCellConfig;
5311    if(spCellCfg)
5312    {
5313       if(spCellCfg->servCellIndex)
5314       {
5315          if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5316          {
5317             if(spCellCfg->spCellConfigDedicated)
5318             {
5319                srvCellCfg = spCellCfg->spCellConfigDedicated;
5320                if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
5321                {
5322                   if(srvCellCfg->initialDownlinkBWP)
5323                   {
5324                      dlBwp = srvCellCfg->initialDownlinkBWP;
5325                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
5326                      {
5327                         if(srvCellCfg->defaultDownlinkBWP_Id)
5328                         {
5329                            if(srvCellCfg->uplinkConfig)
5330                            {
5331                               if(srvCellCfg->pdsch_ServingCellConfig)
5332                               {
5333                                  pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5334                                  if(pdschCfg->choice.setup)
5335                                  {
5336                                     DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5337                                     DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5338                                  }
5339                                  DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5340                                        ServingCellConfig__pdsch_ServingCellConfig));
5341                               }  
5342                               FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5343                               DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));        
5344                            }
5345                            DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5346                         }
5347                         DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5348                      }
5349                      if(dlBwp->pdcch_Config)
5350                      {
5351                         if(dlBwp->pdsch_Config)
5352                         {
5353                            FreeBWPDlDedPdschCfg(dlBwp);
5354                            DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5355                         }
5356                         FreeBWPDlDedPdcchCfg(dlBwp);
5357                         DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5358                     }
5359                     DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5360                   }
5361                   DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
5362                }
5363                DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5364             }
5365             DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5366          }
5367          DU_FREE(spCellCfg->servCellIndex, sizeof(long));
5368       }
5369       DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5370    }
5371    return ROK;
5372 }
5373 /*******************************************************************
5374  *
5375  * @brief Builds DU To CU RRC Container 
5376  *
5377  * @details
5378  *
5379  *    Function : BuildDuToCuRrcContainer 
5380  *
5381  *    Functionality: Builds DuToCuRrcContainer
5382  *
5383  * @params[in] idx, index in F1AP msg
5384  *             DuToCuRRCContainer, DuToCuRRCContainer
5385  *
5386  * @return ROK     - success
5387  *         RFAILED - failure
5388  *
5389  * ****************************************************************/
5390 uint8_t BuildDuToCuRrcContainer(DUtoCURRCContainer_t *duToCuRrcContainer)
5391 {
5392    uint8_t  ret = ROK;
5393    CellGroupConfigRrc_t  cellGrpCfg;
5394    asn_enc_rval_t        encRetVal;
5395    memset(&cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
5396    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5397
5398    while(true)
5399    {
5400       cellGrpCfg.cellGroupId = CELL_GRP_ID;
5401
5402       cellGrpCfg.rlc_BearerToAddModList = NULLP;
5403       DU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5404       if(!cellGrpCfg.rlc_BearerToAddModList)
5405       {
5406          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5407          ret = RFAILED;
5408          break;
5409       }
5410       if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5411       {
5412          DU_LOG("\nERROR  -->  F1AP : BuildRlcBearerToAddModList failed");
5413          ret = RFAILED;
5414          break;
5415       }
5416
5417       cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5418       cellGrpCfg.mac_CellGroupConfig = NULLP;
5419       DU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5420       if(!cellGrpCfg.mac_CellGroupConfig)
5421       {
5422          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5423          ret = RFAILED;
5424          break;
5425       }
5426       if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5427       {
5428          DU_LOG("\nERROR  -->  F1AP : BuildMacCellGrpCfg failed");
5429          ret = RFAILED;
5430          break;
5431       }
5432
5433       cellGrpCfg.physicalCellGroupConfig = NULLP;
5434       DU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5435       if(!cellGrpCfg.physicalCellGroupConfig)
5436       {
5437          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5438          ret = RFAILED;
5439          break;
5440       }
5441       if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5442       {
5443          DU_LOG("\nERROR  -->  F1AP : BuildPhyCellGrpCfg failed");
5444          ret = RFAILED;
5445          break;
5446       }
5447
5448       cellGrpCfg.spCellConfig = NULLP;
5449       DU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5450       if(!cellGrpCfg.spCellConfig)
5451       {
5452          DU_LOG("\nERROR  -->  F1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5453          ret = RFAILED;
5454          break;
5455       }
5456       if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5457       {
5458          DU_LOG("\nERROR  -->  F1AP : BuildSpCellCfg failed");
5459          ret = RFAILED;
5460          break;
5461       }
5462
5463       cellGrpCfg.sCellToAddModList = NULLP;
5464       cellGrpCfg.sCellToReleaseList = NULLP;
5465       cellGrpCfg.ext1 = NULLP;
5466
5467       /* encode cellGrpCfg into duToCuRrcContainer */
5468       xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5469       memset(encBuf, 0, ENC_BUF_MAX_LEN);
5470       encBufSize = 0;
5471       encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5472       /* Encode results */
5473       if(encRetVal.encoded == ENCODE_FAIL)
5474       {
5475          DU_LOG( "\nERROR  --> F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5476                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5477          ret = RFAILED;
5478          break;
5479       }
5480       else
5481       {
5482          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5483          for(int i=0; i< encBufSize; i++)
5484          {
5485             printf("%x",encBuf[i]);
5486          }
5487       }
5488
5489       duToCuRrcContainer->size = encBufSize;
5490       DU_ALLOC(duToCuRrcContainer->buf, duToCuRrcContainer->size);
5491       if(!duToCuRrcContainer->buf)
5492       {
5493          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5494          ret = RFAILED;
5495          break;
5496       }
5497       if(ret == ROK)
5498       {
5499          memcpy(duToCuRrcContainer->buf, encBuf, duToCuRrcContainer->size);
5500       }
5501       break;
5502    }
5503    FreeMemDuToCuRrcCont(&cellGrpCfg);
5504    return ret;
5505 }
5506
5507 /*******************************************************************
5508  *
5509  * @brief Free memory allocated in InitialULRRCMessage
5510  *
5511  * @details
5512  *
5513  *    Function : freeInitUlRrcMsgTransfer
5514  *
5515  *    Functionality: Free memory allocated in InitialULRRCMessage
5516  *
5517  * @params[in]F1AP_PDU_t  *f1apMsg)
5518  *
5519  * @return ROK     - success
5520  *         RFAILED - failure
5521  *
5522  * ****************************************************************/
5523
5524 uint8_t freeInitUlRrcMsgTransfer(F1AP_PDU_t  *f1apMsg)
5525 {
5526    uint8_t ieIdx, arrIdx;
5527    InitialULRRCMessageTransfer_t *initULRRCMsg=NULLP;
5528
5529    if(f1apMsg)
5530    {
5531       if(f1apMsg->choice.initiatingMessage)
5532       {
5533          initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.\
5534             choice.InitialULRRCMessageTransfer;
5535          if(initULRRCMsg->protocolIEs.list.array)
5536          {
5537             for(ieIdx = 0; ieIdx < initULRRCMsg->protocolIEs.list.count; ieIdx++)
5538             {
5539                switch(initULRRCMsg->protocolIEs.list.array[ieIdx]->id)
5540                {
5541                   case ProtocolIE_ID_id_NRCGI:
5542                   {
5543                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf)
5544                      {
5545                         if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf)
5546                         {
5547                            DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.buf,\
5548                            initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.nRCellIdentity.size);
5549                         }
5550                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.buf,\
5551                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI.pLMN_Identity.size);
5552                      }
5553                      break;
5554                   }
5555                   case ProtocolIE_ID_id_RRCContainer:
5556                   {
5557                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5558                      {
5559                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
5560                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5561                      }
5562                      break;
5563                   }
5564                   case ProtocolIE_ID_id_DUtoCURRCContainer:
5565                   {
5566                      if(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf)
5567                      {
5568                         DU_FREE(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.buf,
5569                         initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer.size);
5570                      }
5571                      break;
5572                   }
5573                   default:
5574                      break;
5575                }
5576              }
5577              for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
5578              {
5579                 if(initULRRCMsg->protocolIEs.list.array[arrIdx])
5580                 {
5581                    DU_FREE(initULRRCMsg->protocolIEs.list.array[arrIdx],\
5582                       sizeof(InitialULRRCMessageTransferIEs_t));
5583                 }
5584              }
5585              DU_FREE(initULRRCMsg->protocolIEs.list.array, initULRRCMsg->protocolIEs.list.size);
5586           }
5587          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5588       }
5589       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
5590    }
5591    else
5592    {
5593       DU_LOG("\nERROR  -->  DU_APP : Recevied F1ap Pdu is null at freeInitUlRrcMsgTransfer()");
5594       return RFAILED;
5595    }
5596    return ROK;
5597 }
5598
5599 /*******************************************************************
5600  *
5601  * @brief Builds and sends the InitialULRRCMessage 
5602  *
5603  * @details
5604  *
5605  *    Function : BuildAndSendInitialRrcMsgTransfer 
5606  *
5607  *    Functionality: Constructs the Initial UL RRC Message Transfer and sends
5608  *                   it to the CU through SCTP.
5609  *
5610  * @params[in] 
5611  *
5612  * @return ROK     - success
5613  *         RFAILED - failure
5614  *
5615  * ****************************************************************/
5616 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti,
5617       uint16_t rrcContSize, uint8_t *rrcContainer)
5618 {
5619    uint8_t   ret;
5620    uint8_t   elementCnt;
5621    uint8_t   ieIdx;
5622    asn_enc_rval_t  encRetVal;
5623    F1AP_PDU_t  *f1apMsg = NULLP;
5624    InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
5625    memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5626
5627    while(true)
5628    {
5629       DU_LOG("\n INFO   -->  F1AP : Building RRC Setup Request\n");
5630       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5631       if(f1apMsg == NULLP)
5632       {
5633          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
5634          break;
5635       }
5636       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5637       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5638       if(f1apMsg->choice.initiatingMessage == NULLP)
5639       {
5640          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU failed");
5641          break;
5642       }
5643       f1apMsg->choice.initiatingMessage->procedureCode =\
5644                                                         ProcedureCode_id_InitialULRRCMessageTransfer;
5645       f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
5646       f1apMsg->choice.initiatingMessage->value.present = \
5647                                                          InitiatingMessage__value_PR_InitialULRRCMessageTransfer;
5648       initULRRCMsg =\
5649                     &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
5650       elementCnt = 5;
5651       initULRRCMsg->protocolIEs.list.count = elementCnt;
5652       initULRRCMsg->protocolIEs.list.size = \
5653                                             elementCnt * sizeof(InitialULRRCMessageTransferIEs_t *);
5654       /* Initialize the F1Setup members */
5655       DU_ALLOC(initULRRCMsg->protocolIEs.list.array,initULRRCMsg->protocolIEs.list.size);
5656       if(initULRRCMsg->protocolIEs.list.array == NULLP)
5657       {
5658          DU_LOG(" ERROR  -->  F1AP : Memory allocation for\
5659                RRCSetupRequestMessageTransferIEs failed");
5660          break;
5661       }
5662       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
5663       {
5664          DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx],\
5665                sizeof(InitialULRRCMessageTransferIEs_t));
5666          if(initULRRCMsg->protocolIEs.list.array[ieIdx] == NULLP)
5667          {
5668             break;
5669          }
5670       }
5671       ieIdx = 0;
5672       /*GNB DU UE F1AP ID*/
5673       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5674                                                         ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5675       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  = Criticality_reject;
5676       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
5677                                                                   InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
5678       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
5679
5680
5681       /*NRCGI*/
5682       ieIdx++;
5683       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5684                                                         ProtocolIE_ID_id_NRCGI;
5685       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality  =Criticality_reject;
5686       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present = \
5687                                                                   InitialULRRCMessageTransferIEs__value_PR_NRCGI;
5688
5689       ret =\
5690            BuildNrcgi(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
5691       if(ret!=ROK)
5692       {
5693          break;
5694       }
5695
5696       /*CRNTI*/
5697       ieIdx++;
5698       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5699                                                         ProtocolIE_ID_id_C_RNTI;
5700       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5701       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5702                                                                  InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
5703       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.C_RNTI = crnti;
5704
5705       /*RRCContainer*/
5706       ieIdx++;
5707       initULRRCMsg->protocolIEs.list.array[ieIdx]->id  = \
5708                                                         ProtocolIE_ID_id_RRCContainer;
5709       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5710       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5711                                                                  InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
5712
5713       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size = rrcContSize;
5714       DU_ALLOC(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,
5715             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size)
5716       if(!initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
5717       {
5718          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRCSetupRequestMessageTransferIEs failed");
5719          break;
5720       
5721       }
5722       memcpy(initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, rrcContainer,
5723             initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
5724
5725
5726       /*DUtoCURRCContainer*/
5727       ieIdx++;
5728       initULRRCMsg->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DUtoCURRCContainer;
5729       initULRRCMsg->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
5730       initULRRCMsg->protocolIEs.list.array[ieIdx]->value.present =\
5731                                                                  InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
5732
5733       ret = BuildDuToCuRrcContainer(&initULRRCMsg->protocolIEs.list.array[ieIdx]->value.choice.DUtoCURRCContainer);
5734       if(ret != ROK)
5735       {
5736          break;
5737       }
5738
5739       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5740
5741       /* Encode the F1SetupRequest type as APER */
5742       memset(encBuf, 0, ENC_BUF_MAX_LEN);
5743       encBufSize = 0;
5744       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
5745       /* Encode results */
5746       if(encRetVal.encoded == ENCODE_FAIL)
5747       {
5748          DU_LOG( "\nERROR  --> F1AP : Could not encode Initial UL RRC Message Transfer\
5749                structure (at %s)\n",encRetVal.failed_type ? \
5750                encRetVal.failed_type->name : "unknown");
5751          ret = RFAILED;
5752          break;
5753       }
5754       else
5755       {
5756
5757          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for Initial UL RRC\
5758                Message transfer\n");
5759          for(int i=0; i< encBufSize; i++)
5760          {
5761             printf("%x",encBuf[i]);
5762          }
5763       }
5764       /* Sending  msg  */
5765       if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
5766       {
5767          DU_LOG("\nERROR  -->  F1AP : Sending Initial UL RRC Message Transfer Failed");
5768          ret = RFAILED;
5769          break;
5770       }
5771       break;
5772    }
5773    freeInitUlRrcMsgTransfer(f1apMsg);
5774    return ret;
5775 }/* End of BuildAndSendInitialRrcMsgTransfer*/
5776
5777 /*****  UE SETUP REQUEST *****/
5778
5779 /*******************************************************************
5780  *
5781  * @brief Free Qos And Snssai Drb Info
5782  *
5783  * @details
5784  *
5785  *    Function : freeDrbQosAndSnssaiInfo
5786  *
5787  *    Functionality: Free Qos And Snssai Drb Info
5788  *
5789  * @params[in] LcCfg *lcCfg,
5790  * @return void
5791  *
5792  * ****************************************************************/
5793 void freeDrbQosAndSnssaiInfo(LcCfg *lcCfg)
5794 {
5795    if(lcCfg->snssai)
5796    {
5797       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
5798    }
5799    if(lcCfg->drbQos)
5800    {
5801       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
5802    }
5803 }
5804
5805 /******************************************************************
5806 *
5807 * @brief Function to delete the RLC Lc cfg from UE APP DB
5808 *
5809 * @details
5810 *
5811 *  Function : freeRlcLcCfg
5812 *
5813 *  Functionality: Function to delete the RLC Lc cfg from UE APP DB
5814 *
5815 *
5816  *****************************************************************/
5817
5818 void freeRlcLcCfg(RlcBearerCfg *lcCfg)
5819 {
5820    switch(lcCfg->rlcMode)
5821    {
5822       case RLC_AM :
5823       {
5824          if(lcCfg->u.amCfg)
5825          {
5826             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
5827             lcCfg->u.amCfg = NULLP;
5828          }
5829          break;
5830       }
5831       case RLC_UM_BI_DIRECTIONAL :
5832       {
5833          if(lcCfg->u.umBiDirCfg)
5834          {
5835             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
5836             lcCfg->u.umBiDirCfg = NULLP;
5837          }
5838          break;
5839       }
5840       case RLC_UM_UNI_DIRECTIONAL_UL :
5841       {
5842          if(lcCfg->u.umUniDirUlCfg)
5843          {
5844             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
5845             lcCfg->u.umUniDirUlCfg = NULLP;
5846          }
5847          break;
5848
5849       }
5850       case RLC_UM_UNI_DIRECTIONAL_DL :
5851       {
5852          if(lcCfg->u.umUniDirDlCfg)
5853          {
5854             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
5855             lcCfg->u.umUniDirDlCfg = NULLP;
5856          }
5857          break;
5858       }
5859       default:
5860          DU_LOG("\nERROR  -->  DU_APP: Invalid Rlc Mode %d at freeRlcLcCfg()", lcCfg->rlcMode);
5861          break;
5862    }
5863    memset(lcCfg, 0, sizeof(LcCfg));
5864 }
5865 /*******************************************************************
5866  *
5867  * @brief Function to free MacLcCfg
5868  *
5869  * @details
5870  *
5871  *    Function : freeMacLcCfg
5872  *
5873  *    Functionality: Function to free MacLcCfg
5874  *
5875  * @params[in] LcCfg *lcCfg,
5876  * @return void
5877  *
5878  * ****************************************************************/
5879
5880 void  freeMacLcCfg(LcCfg *lcCfg)
5881 {
5882     /* Deleting DRBQOS */
5883    if(lcCfg->drbQos)
5884    {
5885       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
5886       lcCfg->drbQos = NULLP;
5887    }
5888    /* Deleting SNSSAI */
5889    if(lcCfg->snssai)
5890    {
5891       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
5892       lcCfg->snssai = NULLP;
5893    }
5894    memset(lcCfg, 0, sizeof(LcCfg));
5895 }
5896 /*******************************************************************
5897  *
5898  * @brief Free UE NR Capability received in UE Context setup request
5899  *
5900  * @details
5901  *
5902  *    Function : freeAperDecodeUeNrCapability
5903  *
5904  *    Functionality:  
5905  *       Free UE NR Capability received in UE Context setup request
5906  *
5907  * @params[in] 
5908  * @return ROK     - success
5909  *         RFAILED - failure
5910  *
5911  * ****************************************************************/
5912 void freeAperDecodeUeNrCapability(void *ueNrCapability)
5913 {
5914    uint8_t arrIdx =0;
5915    FeatureSets_t *featureSets =NULLP;
5916    UE_NR_Capability_t *ueNrCap = (UE_NR_Capability_t *)ueNrCapability;
5917
5918    if(ueNrCap->rf_Parameters.supportedBandListNR.list.array)
5919    {
5920       for(arrIdx = 0; arrIdx < ueNrCap->rf_Parameters.supportedBandListNR.list.count; arrIdx++)
5921       {
5922          if(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx])
5923             free(ueNrCap->rf_Parameters.supportedBandListNR.list.array[arrIdx]);
5924       }
5925       free(ueNrCap->rf_Parameters.supportedBandListNR.list.array);
5926    }
5927
5928    if(ueNrCap->featureSets)
5929    {
5930       featureSets = ueNrCap->featureSets;
5931       if(featureSets->featureSetsDownlinkPerCC)
5932       {
5933          if(featureSets->featureSetsDownlinkPerCC->list.array)
5934          {
5935             for(arrIdx = 0; arrIdx < featureSets->featureSetsDownlinkPerCC->list.count; arrIdx++)
5936             {
5937                if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx])
5938                {
5939                   if(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL)
5940                      free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]->supportedModulationOrderDL);
5941                   free(featureSets->featureSetsDownlinkPerCC->list.array[arrIdx]);
5942                }
5943             }
5944             free(featureSets->featureSetsDownlinkPerCC->list.array);
5945          }
5946          free(featureSets->featureSetsDownlinkPerCC);
5947       }
5948       if(featureSets->featureSetsUplinkPerCC)
5949       {
5950          if(featureSets->featureSetsUplinkPerCC->list.array)
5951          {
5952             for(arrIdx = 0; arrIdx < featureSets->featureSetsUplinkPerCC->list.count; arrIdx++)
5953             {
5954                if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx])
5955                {
5956                   if(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL)
5957                      free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]->supportedModulationOrderUL);
5958                   free(featureSets->featureSetsUplinkPerCC->list.array[arrIdx]);
5959                }
5960             }
5961             free(featureSets->featureSetsUplinkPerCC->list.array);
5962          }
5963          free(featureSets->featureSetsUplinkPerCC);
5964       }
5965       free(ueNrCap->featureSets);
5966    }   
5967 }
5968
5969 /*******************************************************************
5970 *
5971 * @brief Function to free PdcchSearchSpcToAddModList
5972          where memory allocated by aper_decoder
5973 *
5974 * @details
5975 *
5976 *    Function : freeAperDecodePdcchSearchSpcToAddModList 
5977 *
5978 *    Functionality: Function to free PdcchSearchSpcToAddModList
5979 *
5980 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
5981 * @return void
5982 *
5983 * ****************************************************************/
5984
5985 void freeAperDecodePdcchSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
5986 {
5987    uint8_t searchSpcArrIdx=0;
5988    uint8_t searchSpcArrIdx1=0;
5989    struct  SearchSpace *searchSpc=NULLP;
5990
5991
5992    if(searchSpcList->list.array)
5993    {
5994       if(searchSpcList->list.array[searchSpcArrIdx1])
5995       {
5996          searchSpc = searchSpcList->list.array[searchSpcArrIdx1];
5997          if(searchSpc->controlResourceSetId)
5998          {
5999             if(searchSpc->monitoringSlotPeriodicityAndOffset)
6000             {
6001                if(searchSpc->monitoringSymbolsWithinSlot)
6002                {
6003                   if(searchSpc->monitoringSymbolsWithinSlot->buf)
6004                   {
6005                      if(searchSpc->nrofCandidates)
6006                      {
6007                         if(searchSpc->searchSpaceType)
6008                         {
6009                            free(searchSpc->searchSpaceType->choice.ue_Specific);
6010                            free(searchSpc->searchSpaceType);
6011                         }
6012                         free(searchSpc->nrofCandidates);
6013                      }
6014                      free(searchSpc->monitoringSymbolsWithinSlot->buf);
6015                   }
6016                   free(searchSpc->monitoringSymbolsWithinSlot);
6017                }
6018                free(searchSpc->monitoringSlotPeriodicityAndOffset);
6019             }
6020             free(searchSpc->controlResourceSetId);
6021          }
6022       }
6023       for(searchSpcArrIdx = 0; searchSpcArrIdx < searchSpcList->list.count; searchSpcArrIdx++)
6024       {
6025          free(searchSpcList->list.array[searchSpcArrIdx]);
6026       }
6027       free(searchSpcList->list.array);
6028    }
6029 }
6030 /*******************************************************************
6031 *
6032 * @brief Function for free part for the memory allocated by aper_decoder
6033
6034 * @details
6035 *
6036 *    Function : freeAperDecodeBWPDlDedPdcchConfig
6037 *
6038 *    Functionality: Function to free BWPDlDedPdcchConfig
6039 *
6040 * @params[in] 
6041 * @return void
6042 *
6043 * ****************************************************************/
6044
6045
6046 void freeAperDecodeBWPDlDedPdcchConfig(BWP_DownlinkDedicated_t *dlBwp)
6047 {
6048    uint8_t arrIdx1=0;
6049    uint8_t arrIdx2=0;
6050    struct PDCCH_Config *pdcchCfg=NULLP;
6051    struct ControlResourceSet *controlRSet=NULLP;
6052    struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
6053    
6054    if(dlBwp->pdcch_Config->choice.setup)
6055    {
6056       pdcchCfg=dlBwp->pdcch_Config->choice.setup;
6057       if(pdcchCfg->controlResourceSetToAddModList)
6058       {
6059          controlRSetList = pdcchCfg->controlResourceSetToAddModList;
6060          if(controlRSetList->list.array)
6061          {
6062             controlRSet = controlRSetList->list.array[arrIdx2];
6063             if(controlRSet)
6064             {
6065                if(controlRSet->frequencyDomainResources.buf)
6066                {
6067                   if(controlRSet->pdcch_DMRS_ScramblingID)
6068                   {
6069                      if(pdcchCfg->searchSpacesToAddModList)
6070                      {
6071                         freeAperDecodePdcchSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
6072                         free(pdcchCfg->searchSpacesToAddModList);
6073                      }
6074                      free(controlRSet->pdcch_DMRS_ScramblingID);
6075                   }
6076                   free(controlRSet->frequencyDomainResources.buf);
6077                }
6078             }
6079             for(arrIdx1 = 0; arrIdx1 <controlRSetList->list.count; arrIdx1++)
6080             {
6081                free(controlRSetList->list.array[arrIdx1]);
6082             }
6083             free(controlRSetList->list.array);
6084          }
6085          free(pdcchCfg->controlResourceSetToAddModList);
6086       }
6087       free(dlBwp->pdcch_Config->choice.setup);
6088    }
6089 }
6090 /*******************************************************************
6091 *
6092 * @brief Function to free PdschTimeDomAllocationList 
6093 *     where the memory allocated by aper_decoder
6094
6095 * @details
6096 *
6097 *    Function : freeAperDecodePdschTimeDomAllocationList
6098 *
6099 *    Functionality: Function to free PdschTimeDomAllocationList
6100 *
6101 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList 
6102 * @return void
6103 *
6104 * ****************************************************************/
6105
6106
6107 void freeAperDecodePdschTimeDomAllocationList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
6108 {
6109    uint8_t arrIdx=0;
6110
6111    if(timeDomAllocList->choice.setup)
6112    {
6113       if(timeDomAllocList->choice.setup->list.array)
6114       {
6115          for(arrIdx = 0; arrIdx <timeDomAllocList->choice.setup->list.count ; arrIdx++)
6116          {
6117             free(timeDomAllocList->choice.setup->list.array[arrIdx]);
6118          }
6119          free(timeDomAllocList->choice.setup->list.array);
6120       }
6121       free(timeDomAllocList->choice.setup);
6122    }
6123 }
6124
6125 /*******************************************************************
6126 *
6127 * @brief Function to free BWPDlDedPdschConfig 
6128 *        where the memory allocated by aper_decoder
6129 *  
6130 * @details
6131 *
6132 *    Function : freeAperDecodeBWPDlDedPdschConfig 
6133 *
6134 *    Functionality: Function to free BWPDlDedPdschConfig 
6135 *
6136 * @params[in] BWP_DownlinkDedicated_t *dlBwp 
6137 * @return void
6138 *
6139 * ****************************************************************/
6140
6141
6142 void freeAperDecodeBWPDlDedPdschConfig(BWP_DownlinkDedicated_t *dlBwp)
6143 {
6144    struct PDSCH_Config *pdschCfg=NULLP;
6145    struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
6146    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
6147    struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
6148
6149    if(dlBwp->pdsch_Config->choice.setup)
6150    {
6151       pdschCfg=dlBwp->pdsch_Config->choice.setup;
6152       if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
6153       {
6154          if(pdschCfg->pdsch_TimeDomainAllocationList)
6155          {
6156             timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
6157             if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
6158             {
6159                prbBndlType=&pdschCfg->prb_BundlingType;
6160                free(prbBndlType->choice.staticBundling);
6161                free(pdschCfg->maxNrofCodeWordsScheduledByDCI);
6162             }
6163             freeAperDecodePdschTimeDomAllocationList(timeDomAllocList);
6164             free(pdschCfg->pdsch_TimeDomainAllocationList);
6165          }
6166          dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
6167          if(dmrsDlCfg->choice.setup)
6168          {
6169             free(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition);
6170             free(dmrsDlCfg->choice.setup);
6171          }
6172          free(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA);
6173       }
6174       free(dlBwp->pdsch_Config->choice.setup);
6175    }
6176 }
6177 /*******************************************************************
6178 *
6179 * @brief Function to free PuschTimeDomAllocListCfg
6180                  where the memory allocated by aper_decoder
6181 *
6182 * @details
6183 *
6184 *    Function : freeAperDecodePuschTimeDomAllocListCfg
6185 *
6186 *    Functionality: Function to free PuschTimeDomAllocListCfg
6187 *
6188 * @params[in] PUSCH_Config_t *puschCfg 
6189 * @return void
6190 *
6191 * ****************************************************************/
6192
6193
6194 void freeAperDecodePuschTimeDomAllocListCfg(PUSCH_Config_t *puschCfg)
6195 {
6196    uint8_t arrIdx=0;
6197    uint8_t arrIdx1=0;
6198    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
6199
6200    if(puschCfg->pusch_TimeDomainAllocationList)
6201    {
6202       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
6203       if(timeDomAllocList_t->choice.setup)
6204       {
6205          if(timeDomAllocList_t->choice.setup->list.array)
6206          {
6207             free(timeDomAllocList_t->choice.setup->list.array[arrIdx1]->k2);
6208             for(arrIdx = 0; arrIdx<timeDomAllocList_t->choice.setup->list.count; arrIdx++)
6209             {
6210                free(timeDomAllocList_t->choice.setup->list.array[arrIdx]);
6211             }
6212             free(timeDomAllocList_t->choice.setup->list.array);
6213          }
6214          free(timeDomAllocList_t->choice.setup);
6215       }
6216       free(puschCfg->transformPrecoder);
6217       free(puschCfg->pusch_TimeDomainAllocationList);
6218    }
6219 }
6220 /*******************************************************************
6221 *
6222 * @brief Function to free InitialUlBWPConfig where memory allocated by aper_decoder
6223 *
6224 * @details
6225 *
6226 *    Function : freeAperDecodeInitialUlBWPConfig 
6227 *
6228 *    Functionality: Function to free InitialUlBWPConfig
6229 *
6230 * @params[in]  BWP_UplinkDedicated_t *ulBwp
6231 * @return void
6232 *
6233 * ****************************************************************/
6234
6235
6236 void freeAperDecodeInitialUlBWPConfig(BWP_UplinkDedicated_t *ulBwp)
6237 {
6238    uint8_t  rSetIdx =0;
6239    uint8_t  rsrcIdx =0;
6240    SRS_Config_t   *srsCfg = NULLP;
6241    PUSCH_Config_t *puschCfg = NULLP;
6242    struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
6243    struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
6244    struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
6245    struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
6246
6247    if(ulBwp->pusch_Config)
6248    {
6249       if(ulBwp->pusch_Config->choice.setup)
6250       {
6251          puschCfg=ulBwp->pusch_Config->choice.setup;
6252          if(puschCfg->dataScramblingIdentityPUSCH)
6253          {
6254             if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
6255             {
6256                freeAperDecodePuschTimeDomAllocListCfg(puschCfg);
6257                dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
6258                if(dmrsUlCfg->choice.setup)
6259                {
6260                   if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
6261                   {
6262                      if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
6263                      {
6264                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0);
6265                         free(dmrsUlCfg->choice.setup->transformPrecodingDisabled);
6266                      }
6267                      free(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition);
6268                   }
6269                   free(dmrsUlCfg->choice.setup);
6270                }
6271                free(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA);
6272             }
6273             free(puschCfg->dataScramblingIdentityPUSCH);
6274          }
6275          free(ulBwp->pusch_Config->choice.setup);
6276       }
6277       free(ulBwp->pusch_Config);
6278
6279       /* Free SRS-Config */
6280       if(ulBwp->srs_Config)
6281       {
6282          if(ulBwp->srs_Config->choice.setup)
6283          {
6284             srsCfg = ulBwp->srs_Config->choice.setup;
6285
6286             /* Free Resource Set to add/mod list */
6287             if(srsCfg->srs_ResourceSetToAddModList)
6288             {
6289                rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
6290                if(rsrcSetList->list.array)
6291                {
6292                   rSetIdx = 0;
6293
6294                   /* Free SRS resource Id list in this SRS resource set */
6295                   if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
6296                   {
6297                      rsrcIdList =
6298                         rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
6299
6300                      if(rsrcIdList->list.array)
6301                      {
6302                         for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count;
6303                               rsrcIdx++)
6304                         {
6305                            free(rsrcIdList->list.array[rsrcIdx]);
6306                         }
6307                         free(rsrcIdList->list.array);
6308                      }
6309                      free(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList);
6310                   }
6311
6312                   /* Free resource type info for this SRS resource set */
6313
6314                   free(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic);
6315
6316                   /* Free memory for each resource set */
6317                   for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
6318                   {
6319                      free(rsrcSetList->list.array[rSetIdx]);
6320                   }
6321                   free(rsrcSetList->list.array);
6322                }
6323                free(srsCfg->srs_ResourceSetToAddModList);
6324             }
6325
6326             /* Free resource to add/modd list */
6327             if(srsCfg->srs_ResourceToAddModList)
6328             {
6329                resourceList = srsCfg->srs_ResourceToAddModList;
6330                if(resourceList->list.array)
6331                {
6332                   rsrcIdx = 0;
6333
6334                   free(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2);
6335                   free(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic);
6336
6337                   for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
6338                   {
6339                      free(resourceList->list.array[rsrcIdx]);
6340                   }
6341                   free(resourceList->list.array);
6342                }
6343                free(srsCfg->srs_ResourceToAddModList);
6344             }
6345
6346             free(ulBwp->srs_Config->choice.setup);
6347          }
6348          free(ulBwp->srs_Config);
6349       }
6350    }
6351 }
6352 /*******************************************************************
6353 *
6354 * @brief Function to free initialUplinkBWPConfig where memory allocated by aper_decoder
6355 *
6356 * @details
6357 *
6358 *    Function : freeAperDecodeinitialUplinkBWPConfig
6359 *
6360 *    Functionality: Function to free initialUplinkBWPConfig
6361 *
6362 * @params[in] UplinkConfig_t *ulCfg 
6363 * @return void
6364 *
6365 * ****************************************************************/
6366
6367
6368 void freeAperDecodeinitialUplinkBWPConfig(UplinkConfig_t *ulCfg)
6369 {
6370    BWP_UplinkDedicated_t *ulBwp=NULLP;
6371    struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
6372    
6373    if(ulCfg->initialUplinkBWP)
6374    {
6375       ulBwp=ulCfg->initialUplinkBWP;
6376       if(ulCfg->firstActiveUplinkBWP_Id)
6377       {
6378          if(ulCfg->pusch_ServingCellConfig)
6379          {
6380             puschCfg=ulCfg->pusch_ServingCellConfig;
6381             if(puschCfg->choice.setup)
6382             {
6383                if(puschCfg->choice.setup->ext1)
6384                {
6385                   free(puschCfg->choice.setup->ext1->processingType2Enabled);
6386                   free(puschCfg->choice.setup->ext1->maxMIMO_Layers);
6387                   free(puschCfg->choice.setup->ext1);
6388                }
6389                free(puschCfg->choice.setup);
6390             }
6391             free(ulCfg->pusch_ServingCellConfig);
6392          }
6393          free(ulCfg->firstActiveUplinkBWP_Id);
6394       }
6395       freeAperDecodeInitialUlBWPConfig(ulBwp);
6396       free(ulCfg->initialUplinkBWP);
6397    }
6398 }
6399
6400 /*******************************************************************
6401  *
6402  * @brief Function to free DuUeCfg
6403  *
6404  * @details
6405  *
6406  *    Function : freeDuUeCfg
6407  *
6408  *    Functionality: Function to free DuUeCfg
6409  *
6410  * @params[in] DuUeCfg *ueCfg
6411  * @return void
6412  *
6413  * ****************************************************************/
6414 void freeDuUeCfg(DuUeCfg *ueCfg)
6415 {
6416    uint8_t lcIdx = 0;
6417    uint8_t arrIdx = 0;
6418    SpCellConfig_t *spCellCfg = NULLP;
6419    ServingCellConfig_t *srvCellCfg = NULLP;
6420    BWP_DownlinkDedicated_t *dlBwp = NULLP;
6421    MAC_CellGroupConfig_t *macCellGrpCfg = NULLP;
6422    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
6423    struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList = NULLP;
6424    struct RLC_Config *rlcConfig = NULLP;
6425    struct LogicalChannelConfig *macLcConfig = NULLP;
6426    struct SchedulingRequestConfig *schedulingRequestConfig = NULLP;
6427    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList = NULLP;
6428    struct TAG_Config *tagConfig = NULLP;
6429    struct TAG_Config__tag_ToAddModList *tagList = NULLP;
6430    struct MAC_CellGroupConfig__phr_Config *phrConfig = NULLP;
6431    struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg = NULLP;
6432    CellGroupConfigRrc_t *cellGrpCfg = ueCfg->cellGrpCfg;
6433   
6434    if(ueCfg->ueNrCapability)
6435    {
6436       freeAperDecodeUeNrCapability(ueCfg->ueNrCapability);
6437       DU_FREE(ueCfg->ueNrCapability, sizeof(UE_NR_Capability_t));
6438       ueCfg->ueNrCapability = NULLP;
6439    }
6440
6441    if(ueCfg->cellGrpCfg)
6442    {
6443       
6444       rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
6445       if(rlcBearerList)
6446       {
6447          if(rlcBearerList->list.array)
6448          {
6449             for(arrIdx=0; arrIdx<rlcBearerList->list.count; arrIdx++)
6450             {
6451                if(rlcBearerList->list.array[arrIdx])
6452                {
6453                   rlcConfig   = rlcBearerList->list.array[arrIdx]->rlc_Config;
6454                   macLcConfig = rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig;
6455                   
6456                   if(rlcBearerList->list.array[arrIdx]->servedRadioBearer)
6457                   {
6458                      free(rlcBearerList->list.array[arrIdx]->servedRadioBearer);
6459                   }
6460                   if(rlcConfig)
6461                   {
6462                      if(rlcConfig->choice.am)
6463                      {
6464                         free(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength);
6465                         free(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength);
6466                         free(rlcConfig->choice.am);
6467                      }
6468                      free(rlcBearerList->list.array[arrIdx]->rlc_Config);
6469                   }
6470                   if(macLcConfig)
6471                   {
6472                      if(macLcConfig->ul_SpecificParameters)
6473                      {
6474                         free(macLcConfig->ul_SpecificParameters->schedulingRequestID);
6475                         free(macLcConfig->ul_SpecificParameters->logicalChannelGroup);
6476                         free(macLcConfig->ul_SpecificParameters);
6477                      }
6478                      free(rlcBearerList->list.array[arrIdx]->mac_LogicalChannelConfig);
6479                   }
6480                   free(rlcBearerList->list.array[arrIdx]); 
6481                }
6482             }
6483             free(rlcBearerList->list.array);
6484          }
6485          free(cellGrpCfg->rlc_BearerToAddModList);
6486       }
6487
6488       macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
6489       if(macCellGrpCfg)
6490       {
6491          schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
6492          if(schedulingRequestConfig)
6493          {
6494             schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
6495             if(schReqList)
6496             {
6497                if(schReqList->list.array)
6498                {
6499                   for(arrIdx=0;arrIdx<schReqList->list.count; arrIdx++)
6500                   {
6501                      if(schReqList->list.array[arrIdx])
6502                      {
6503                         free(schReqList->list.array[arrIdx]->sr_ProhibitTimer); 
6504                         free(schReqList->list.array[arrIdx]);
6505                      }
6506                   }
6507                   free(schReqList->list.array);
6508                }
6509                free(schedulingRequestConfig->schedulingRequestToAddModList);
6510             }
6511             free(macCellGrpCfg->schedulingRequestConfig);
6512          }
6513          if(macCellGrpCfg->bsr_Config)
6514          {
6515             free(macCellGrpCfg->bsr_Config);
6516          }
6517          tagConfig = macCellGrpCfg->tag_Config;
6518          if(tagConfig)
6519          {
6520             tagList = tagConfig->tag_ToAddModList;
6521             if(tagList)
6522             {
6523                if(tagList->list.array)
6524                {
6525                   for(arrIdx=0; arrIdx<tagList->list.count; arrIdx++)
6526                   {
6527                      free(tagList->list.array[arrIdx]);
6528                   }
6529                   free(tagList->list.array);
6530                }
6531                free(tagConfig->tag_ToAddModList);
6532             }
6533             free(tagConfig); 
6534          }
6535
6536          phrConfig = macCellGrpCfg->phr_Config;
6537          if(phrConfig)
6538          {
6539             free(phrConfig->choice.setup); 
6540             free(phrConfig); 
6541          }
6542
6543          free(macCellGrpCfg); 
6544       }
6545
6546       phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
6547       if(phyCellGrpCfg)
6548       {
6549          free(phyCellGrpCfg->p_NR_FR1);
6550          free(phyCellGrpCfg); 
6551       }
6552
6553       spCellCfg = cellGrpCfg->spCellConfig;
6554       if(spCellCfg)
6555       {
6556          if(spCellCfg->servCellIndex)
6557          {
6558             if(spCellCfg->rlmInSyncOutOfSyncThreshold)
6559             {
6560                if(spCellCfg->spCellConfigDedicated)
6561                {
6562                   srvCellCfg = spCellCfg->spCellConfigDedicated;
6563                   if(srvCellCfg->initialDownlinkBWP)
6564                   {
6565                      dlBwp = srvCellCfg->initialDownlinkBWP;
6566                      if(srvCellCfg->firstActiveDownlinkBWP_Id)
6567                      {
6568                         if(srvCellCfg->defaultDownlinkBWP_Id)
6569                         {
6570                            if(srvCellCfg->uplinkConfig)
6571                            {
6572
6573                               if(srvCellCfg->pdsch_ServingCellConfig)
6574                               {
6575                                  pdschCfg=
6576                                     srvCellCfg->pdsch_ServingCellConfig;
6577                                  if(pdschCfg->choice.setup)
6578                                  {
6579
6580                                     free(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH);
6581                                     free(pdschCfg->choice.setup);
6582                                  }
6583
6584                                  free(srvCellCfg->pdsch_ServingCellConfig);
6585                               }
6586
6587                               freeAperDecodeinitialUplinkBWPConfig(srvCellCfg->uplinkConfig);
6588                               free(srvCellCfg->uplinkConfig);
6589                            }
6590                            free(srvCellCfg->defaultDownlinkBWP_Id);
6591                         }
6592
6593                         free(srvCellCfg->firstActiveDownlinkBWP_Id);
6594                      }
6595                      if(dlBwp->pdcch_Config)
6596                      {
6597                         if(dlBwp->pdsch_Config)
6598                         {
6599                            freeAperDecodeBWPDlDedPdschConfig(dlBwp);
6600                            free(dlBwp->pdsch_Config);
6601                         }
6602                         freeAperDecodeBWPDlDedPdcchConfig(dlBwp);
6603                         free(dlBwp->pdcch_Config);
6604                      }
6605                      free(srvCellCfg->initialDownlinkBWP);
6606                   }
6607
6608                   free(spCellCfg->spCellConfigDedicated);
6609                }
6610                free(spCellCfg->rlmInSyncOutOfSyncThreshold);
6611             }
6612             free(spCellCfg->servCellIndex); 
6613          }
6614          free(spCellCfg);
6615       }
6616       DU_FREE(ueCfg->cellGrpCfg, sizeof(CellGroupConfigRrc_t));
6617       ueCfg->cellGrpCfg = NULLP;
6618    }
6619    if(ueCfg->ambrCfg)
6620    {
6621       memset(ueCfg->ambrCfg, 0, sizeof(AmbrCfg));
6622       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCfg->ambrCfg, sizeof(AmbrCfg));
6623    }
6624    for(lcIdx = 0; lcIdx < ueCfg->numRlcLcs; lcIdx++)
6625    {
6626       freeRlcLcCfg(&ueCfg->rlcLcCfg[lcIdx]);
6627    }
6628    for(lcIdx = 0; lcIdx < ueCfg->numMacLcs; lcIdx++)
6629    {
6630       freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
6631    }
6632 }
6633
6634 /*******************************************************************
6635  *
6636  * @brief Function to free UecontextSetupDb
6637  *
6638  * @details
6639  *
6640  *    Function : freeF1UeDb
6641  *
6642  *    Functionality: Function to free UecontextSetupDb
6643  *
6644  * @params[in] UecontextSetupDb *
6645  * @return void
6646  *
6647  * ****************************************************************/
6648
6649 void freeF1UeDb(F1UeContextSetupDb *f1UeDb)
6650 {
6651    
6652    if(f1UeDb->dlRrcMsg)
6653    {
6654       if(f1UeDb->dlRrcMsg->rrcMsgPdu)
6655       {
6656          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,\
6657             f1UeDb->dlRrcMsg->rrcMsgPdu, f1UeDb->dlRrcMsg->rrcMsgSize);
6658       }
6659       memset(f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
6660    }
6661    freeDuUeCfg(&f1UeDb->duUeCfg);
6662    memset(f1UeDb, 0, sizeof(F1UeContextSetupDb));
6663    DU_FREE(f1UeDb, sizeof(F1UeContextSetupDb));
6664 }
6665
6666 /*******************************************************************
6667  *
6668  * @brief Function to build Am cfg Info
6669  *
6670  * @details
6671  *
6672  *    Function : extractRlcAmCfg
6673  *
6674  *    Functionality: Function to build Am cfg Info
6675  *
6676  * @params[in] AmBearerCfg *
6677  *             void *
6678  *
6679  * @return ROK/RFAILED
6680  *
6681  * ****************************************************************/
6682
6683 void extractRlcAmCfg(AmBearerCfg *amCfgToSet, struct RLC_Config__am *rlcAmCfg)
6684 {
6685    if(rlcAmCfg)
6686    {
6687       /* UL AM */
6688       if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
6689       {
6690          amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength);
6691          amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly;
6692          amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit;
6693       }
6694
6695       /* DL AM */
6696       if(rlcAmCfg->ul_AM_RLC.sn_FieldLength)
6697       {
6698          amCfgToSet->dlAmCfg.snLenDl = *(rlcAmCfg->ul_AM_RLC.sn_FieldLength);
6699          amCfgToSet->dlAmCfg.pollRetxTmr = rlcAmCfg->ul_AM_RLC.t_PollRetransmit;
6700          amCfgToSet->dlAmCfg.pollPdu   = rlcAmCfg->ul_AM_RLC.pollPDU;
6701          amCfgToSet->dlAmCfg.pollByte  = rlcAmCfg->ul_AM_RLC.pollByte;
6702          amCfgToSet->dlAmCfg.maxRetxTh = rlcAmCfg->ul_AM_RLC.maxRetxThreshold;
6703       }
6704    }
6705 }
6706
6707 /*******************************************************************
6708  *
6709  * @brief Function to build Um Bi Info
6710  *
6711  * @details
6712  *
6713  *    Function : extractRlcUmBiCfg
6714  *
6715  *    Functionality: Function to build Um Bi Info
6716  *
6717  * @params[in] UmBiDirBearerCfg *
6718  *             void *
6719  *
6720  * @return ROK/RFAILED
6721  *
6722  * ****************************************************************/
6723
6724 void extractRlcUmBiCfg(UmBiDirBearerCfg *umBiCfgToSet, struct RLC_Config__um_Bi_Directional *rlcBiCfg)
6725 {
6726    if(rlcBiCfg)
6727    {
6728       /* UL UM BI DIR Cfg */
6729       if(rlcBiCfg->dl_UM_RLC.sn_FieldLength)
6730       {
6731          umBiCfgToSet->ulUmCfg.snLenUlUm  = *(rlcBiCfg->dl_UM_RLC.sn_FieldLength);
6732          umBiCfgToSet->ulUmCfg.reAssemTmr = rlcBiCfg->dl_UM_RLC.t_Reassembly;
6733       }
6734
6735       /* DL UM BI DIR Cfg */
6736       if(rlcBiCfg->ul_UM_RLC.sn_FieldLength)
6737          umBiCfgToSet->dlUmCfg.snLenDlUm  = *(rlcBiCfg->ul_UM_RLC.sn_FieldLength);
6738    }
6739 }
6740
6741 /*******************************************************************
6742  *
6743  * @brief Function to build Um Ul Info
6744  *
6745  * @details
6746  *
6747  *    Function : extractRlcUmUlCfg
6748  *
6749  *    Functionality: Function to build Um Ul Info
6750  *
6751  * @params[in] UmUniDirUlBearerCfg *
6752  *             void *
6753  *
6754  * @return ROK/RFAILED
6755  *
6756  * ****************************************************************/
6757
6758 void extractRlcUmUlCfg(UmUniDirUlBearerCfg *umUlCfgToSet, struct RLC_Config__um_Uni_Directional_DL *umUlCfg)
6759 {
6760    if(umUlCfg)
6761    {
6762       if(umUlCfg->dl_UM_RLC.sn_FieldLength)
6763       {
6764          umUlCfgToSet->ulUmCfg.snLenUlUm  = *(umUlCfg->dl_UM_RLC.sn_FieldLength);
6765          umUlCfgToSet->ulUmCfg.reAssemTmr = umUlCfg->dl_UM_RLC.t_Reassembly;
6766       }
6767    }
6768 }
6769
6770 /*******************************************************************
6771  *
6772  * @brief Function to build Um Uni Dl Info
6773  *
6774  * @details
6775  *
6776  *    Function : extractRlcUmDlCfg
6777  *
6778  *    Functionality: Function to build Um Uni Dl Info
6779  *
6780  * @params[in] UmUniDirDlBearerCfg *
6781  *             void *
6782  *
6783  * @return ROK/RFAILED
6784  *
6785  * ****************************************************************/
6786 void extractRlcUmDlCfg(UmUniDirDlBearerCfg *umDlCfgToSet, struct RLC_Config__um_Uni_Directional_UL *umDlCfg)
6787 {
6788    if(umDlCfg)
6789    {
6790       if(umDlCfg->ul_UM_RLC.sn_FieldLength)
6791          umDlCfgToSet->dlUmCfg.snLenDlUm  = *(umDlCfg->ul_UM_RLC.sn_FieldLength);
6792    }
6793 }
6794
6795 /*******************************************************************
6796  *
6797  * @brief Function to extractRlcModeCfg
6798  *
6799  * @details
6800  *
6801  *    Function : extractRlcModeCfg
6802  *
6803  *    Functionality: Function to extractRlcModeCfg
6804  *
6805  * @params[in] RLC_Config_t *
6806  *             RlcBearerCfg *
6807  *             void  *    
6808  * @return ROK/RFAILED
6809  *
6810  * ****************************************************************/
6811 void extractRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *rlcDbCfg, RLC_Config_t *lcCfg)
6812 {
6813    if(lcCfg)
6814    {
6815       switch(rlcMode)
6816       {
6817          case RLC_AM :
6818             {
6819                if(lcCfg->choice.am)
6820                {
6821                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
6822                   if(rlcDbCfg->u.amCfg)
6823                      extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
6824                }
6825                break;
6826             }
6827          case RLC_UM_BI_DIRECTIONAL :
6828             {
6829                if(lcCfg->choice.um_Bi_Directional)
6830                {
6831                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
6832                   if(rlcDbCfg->u.umBiDirCfg)
6833                      extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
6834                }
6835                break;
6836             }
6837          case RLC_UM_UNI_DIRECTIONAL_UL :
6838             {
6839                if(lcCfg->choice.um_Uni_Directional_DL)
6840                {
6841                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
6842                   if(rlcDbCfg->u.umUniDirUlCfg)
6843                      extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
6844                }
6845                break;
6846             }
6847          case RLC_UM_UNI_DIRECTIONAL_DL :
6848             {
6849                if(lcCfg->choice.um_Uni_Directional_UL)
6850                {
6851                   DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
6852                   if(rlcDbCfg->u.umUniDirDlCfg)
6853                      extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
6854                }
6855                break;
6856             }
6857          default:
6858             DU_LOG("\nERROR  -->  DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
6859             break;
6860       }
6861    }
6862 }
6863
6864 /*******************************************************************
6865  *
6866  * @brief Function to extract extractUlLcCfg
6867  *
6868  * @details
6869  *
6870  *    Function : extractUlLcCfg
6871  *
6872  *    Functionality: Function to extract extractUlLcCfg
6873  *
6874  * @params[in] UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg
6875  * @return void
6876  *
6877  * ****************************************************************/
6878
6879 void extractUlLcCfg(UlLcCfg *f1UlLcCfg, LogicalChannelConfig_t *ulLcCfg)
6880 {
6881    if(ulLcCfg)
6882    {
6883       if(ulLcCfg->ul_SpecificParameters)
6884       {
6885          f1UlLcCfg->priority = \
6886             ulLcCfg->ul_SpecificParameters->priority;
6887       if(ulLcCfg->ul_SpecificParameters->logicalChannelGroup)
6888       {
6889          f1UlLcCfg->lcGroup = \
6890            *(ulLcCfg->ul_SpecificParameters->logicalChannelGroup);
6891       }
6892       if(ulLcCfg->ul_SpecificParameters->schedulingRequestID)
6893       {
6894          f1UlLcCfg->schReqId = \
6895            *(ulLcCfg->ul_SpecificParameters->schedulingRequestID);
6896       }
6897       f1UlLcCfg->pbr = \
6898          ulLcCfg->ul_SpecificParameters->prioritisedBitRate;
6899       f1UlLcCfg->bsd = \
6900          ulLcCfg->ul_SpecificParameters->bucketSizeDuration;
6901       }
6902    }
6903 }
6904
6905 /*******************************************************************
6906  *
6907  * @brief Function to procRlcLcCfg
6908  *
6909  * @details
6910  *
6911  *    Function : procRlcLcCfg
6912  *
6913  *    Functionality: Function to procRlcLcCfg
6914  *
6915  * @params[in] rbId, lcId, rbType, rlcMod
6916  *             RLC_Config_t *, RlcBearerCfg * , 
6917  * @return void
6918  *
6919  * ****************************************************************/
6920
6921 void procRlcLcCfg(uint8_t rbId, uint8_t lcId, uint8_t rbType, uint8_t rlcMode,\
6922    uint8_t configType, RLC_Config_t *f1RlcCfg, RlcBearerCfg *lcCfg)
6923 {
6924
6925    lcCfg->rbId   = rbId;
6926    lcCfg->configType = configType;
6927
6928    if(rbType == RB_TYPE_SRB)
6929    {
6930       lcCfg->rbType = RB_TYPE_SRB;
6931       lcCfg->lcId   = rbId;
6932       lcCfg->lcType = LCH_DCCH;
6933       lcCfg->rlcMode = RLC_AM;
6934    }
6935    else if(rbType == RB_TYPE_DRB)
6936    {
6937       lcCfg->rbType = RB_TYPE_DRB;
6938       lcCfg->lcId   = lcId;
6939       lcCfg->lcType = LCH_DTCH;
6940       lcCfg->rlcMode = rlcMode;
6941    }
6942    if(f1RlcCfg) /* rlc mode config recived */
6943    {
6944       extractRlcModeCfg(lcCfg->rlcMode, lcCfg, f1RlcCfg);
6945    }
6946 }
6947
6948
6949
6950 /*******************************************************************
6951  *
6952  * @brief Fills DrbQos Info received by CU
6953  *
6954  * @details
6955  *
6956  *    Function : extractQosInfo
6957  *
6958  *    Functionality: Fills DrbQos Info received  by CU
6959  *
6960  * @params[in] DrbQosInfo *qosToAdd, 
6961  *             QoSFlowLevelQoSParameters_t *qosFlowCfg
6962  * @return void
6963  *
6964  * ****************************************************************/
6965
6966 void extractQosInfo(DrbQosInfo *qosToAdd, QoSFlowLevelQoSParameters_t *qosFlowCfg)
6967 {
6968    qosToAdd->fiveQiType = qosFlowCfg->qoS_Characteristics.present;
6969    qosToAdd->u.nonDyn5Qi.fiveQi     =\
6970          qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI;
6971    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow)
6972    {
6973       qosToAdd->u.nonDyn5Qi.avgWindow = \
6974         *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
6975    }
6976    qosToAdd->u.nonDyn5Qi.maxDataBurstVol = \
6977       *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
6978    if(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel)
6979    {
6980       qosToAdd->u.nonDyn5Qi.priorLevel = \
6981          *(qosFlowCfg->qoS_Characteristics.choice.non_Dynamic_5QI->qoSPriorityLevel);
6982    }
6983    qosToAdd->ngRanRetPri.priorityLevel = \
6984       qosFlowCfg->nGRANallocationRetentionPriority.priorityLevel; 
6985    qosToAdd->ngRanRetPri.preEmptionCap = \
6986       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionCapability;
6987    qosToAdd->ngRanRetPri.preEmptionVul = \
6988       qosFlowCfg->nGRANallocationRetentionPriority.pre_emptionVulnerability;
6989    if(qosFlowCfg->gBR_QoS_Flow_Information)
6990    {
6991       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateDl, \
6992          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.buf, \
6993          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateDownlink.size);
6994       memcpy(&qosToAdd->grbQosInfo.maxFlowBitRateUl, \
6995          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.buf, \
6996          qosFlowCfg->gBR_QoS_Flow_Information->maxFlowBitRateUplink.size);
6997       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateDl,\
6998          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.buf, \
6999          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateDownlink.size);
7000       memcpy(&qosToAdd->grbQosInfo.guarFlowBitRateUl,\
7001          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.buf, \
7002          qosFlowCfg->gBR_QoS_Flow_Information->guaranteedFlowBitRateUplink.size);
7003    }
7004    qosToAdd->pduSessionId = 0;
7005    qosToAdd->ulPduSessAggMaxBitRate = 0;
7006 }
7007
7008 uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd)
7009 {
7010    DRB_Information_t *drbInfo = NULLP;
7011
7012    if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
7013    {
7014       if(drbItem->qoSInformation.choice.choice_extension->value.present ==
7015             QoSInformation_ExtIEs__value_PR_DRB_Information)
7016       {
7017          drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
7018
7019          if(!macLcToAdd->drbQos)
7020          {
7021             DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
7022             if(macLcToAdd->drbQos == NULLP)
7023             {
7024                DU_LOG("\nERROR  -->  DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
7025                return RFAILED;
7026             }
7027
7028          }
7029          if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
7030          {
7031             extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
7032             macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
7033          }
7034          if(!macLcToAdd->snssai)
7035          {
7036             DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
7037             if(macLcToAdd->snssai == NULLP)
7038             {
7039                DU_LOG("\nERROR  -->  DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()");
7040                return RFAILED;
7041             }
7042          }
7043          memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
7044                drbInfo->sNSSAI.sST.size);
7045          if(drbInfo->sNSSAI.sD)
7046          {
7047             memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
7048                   drbInfo->sNSSAI.sD->size);
7049          }
7050       }/*End of DRB Info*/
7051    }
7052    return ROK;
7053 }
7054
7055 uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
7056 {
7057    uint8_t ret = ROK;
7058
7059    if(drbCfg)
7060    {
7061       ret = extractDrbCfg(drbCfg, lcCfg);
7062       if(ret == RFAILED)
7063       {
7064          DU_LOG("ERROR  -->  F1AP : Failed to build Drb Qos at extractMacRbCfg()");
7065          return ret;
7066       }
7067    }
7068    else
7069    {
7070       lcCfg->drbQos = NULLP;
7071       lcCfg->snssai = NULLP;
7072       if(lcCfg->lcId == SRB2_LCID)
7073          lcCfg->dlLcCfg.lcp = LC_PRIORITY_3;
7074       else
7075          lcCfg->dlLcCfg.lcp = LC_PRIORITY_1;
7076    }
7077    if(ulLcCfg)
7078    {
7079       lcCfg->ulLcCfgPres = true;
7080       extractUlLcCfg(&lcCfg->ulLcCfg, ulLcCfg);
7081    }
7082    else
7083       lcCfg->ulLcCfgPres = false;
7084    return ret;
7085 }
7086
7087 uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
7088    DRBs_ToBeSetup_Item_t *drbItem, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
7089 {
7090    uint8_t ret = ROK;
7091
7092    lcCfg->lcId = lcId;
7093    lcCfg->configType = configType;
7094    if(rbType == RB_TYPE_SRB)
7095    {
7096       ret = extractMacRbCfg(lcId, NULL, ulLcCfg, lcCfg);
7097    }
7098    else if(rbType == RB_TYPE_DRB)
7099    {
7100       ret = extractMacRbCfg(lcId, drbItem, ulLcCfg, lcCfg);
7101    }
7102    return ret;
7103 }
7104
7105 /*******************************************************************
7106  *
7107  * @brief Function to extract Rlc cfg To Add/Mod in CellGrp Info
7108  *
7109  * @details
7110  *
7111  *    Function : extractRlcCfgToAddMod
7112  *
7113  *    Functionality: Function to extract Rlc cfg To Add/Mod in CellGrp Info
7114  *
7115  * @params[in] CellGroupConfigRrc__rlc_BearerTo pointer
7116  *             DuUeCfg Pointer
7117  * @return ROK/RFAILED
7118  *
7119  * ****************************************************************/
7120
7121 uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, \
7122    DuUeCfg *ueCfgDb)
7123 {
7124   uint8_t ret, idx, rbId, lcId, rlcMode, rbType;
7125   RLC_Config_t *f1RlcCfg = NULLP;
7126   LogicalChannelConfig_t *macUlLcCfg = NULLP;
7127
7128   for(idx = 0; idx < lcCfg->list.count; idx++)
7129   {
7130      lcId = lcCfg->list.array[idx]->logicalChannelIdentity;
7131      if(lcCfg->list.array[idx]->servedRadioBearer)
7132      {
7133         /* RadioBearer for SRB/DRB */
7134         if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7135         RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)
7136         {
7137            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.srb_Identity;
7138            rbType = RB_TYPE_SRB;
7139         }
7140         else if(lcCfg->list.array[idx]->servedRadioBearer->present ==\
7141         RLC_BearerConfig__servedRadioBearer_PR_drb_Identity)
7142         {
7143            rbId = lcCfg->list.array[idx]->servedRadioBearer->choice.drb_Identity;
7144            rbType = RB_TYPE_DRB;
7145         }
7146         else
7147         {
7148            DU_LOG("\nERROR  -->  No components present in Bearer config to ADD/MOD");
7149            return RFAILED;
7150         }
7151         /* MAC UL LC Config */
7152         if(lcCfg->list.array[idx]->mac_LogicalChannelConfig)
7153         {
7154            macUlLcCfg = lcCfg->list.array[idx]->mac_LogicalChannelConfig;
7155         }
7156      }
7157      else
7158      {
7159         DU_LOG("\nERROR  -->  DUAPP: Received RadioBearer config is NULL");
7160         return RFAILED;
7161      }
7162      /* RLC Mode Config */
7163      if(lcCfg->list.array[idx]->rlc_Config)
7164      {
7165         rlcMode  = lcCfg->list.array[idx]->rlc_Config->present;
7166         f1RlcCfg = lcCfg->list.array[idx]->rlc_Config;
7167      }
7168      
7169      /* Filling RLC/MAC Config*/
7170      memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
7171      memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
7172      procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
7173      ret = procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx]);
7174      if(ret == RFAILED)
7175      {
7176         DU_LOG("\nERROR  -->  DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()");
7177         return ret;
7178      }
7179      (ueCfgDb->numRlcLcs)++;
7180      (ueCfgDb->numMacLcs)++;
7181   }
7182   //TODO: To send the failure cause in UeContextSetupRsp 
7183   return ret;
7184 }
7185
7186 /*******************************************************************
7187  *
7188  * @brief DeAlloc pdsch serv cell config info
7189  *
7190  * @details
7191  *
7192  *    Function : freeMacPdschServCellInfo
7193  *
7194  *    Functionality: DeAlloc pdsch serv cell config info
7195  *
7196  * @params[in] PdschServCellCfg pointer
7197  * @return void
7198  *
7199  * ****************************************************************/
7200
7201 void freeMacPdschServCellInfo(PdschServCellCfg *pdsch)
7202 {
7203    if(pdsch->xOverhead)
7204    {
7205       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->xOverhead, sizeof(uint8_t));
7206    }
7207    if(pdsch->codeBlkGrpFlushInd)
7208    {
7209       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->codeBlkGrpFlushInd, sizeof(bool));
7210    }
7211    if(pdsch->maxCodeBlkGrpPerTb)
7212    {
7213       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxCodeBlkGrpPerTb, sizeof(uint8_t));
7214    }
7215    if(pdsch->maxMimoLayers)
7216    {
7217       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, pdsch->maxMimoLayers, sizeof(uint8_t));
7218    }
7219 }
7220
7221 /*******************************************************************
7222  *
7223  * @brief Free Serving cell Info
7224  *
7225  * @details
7226  *
7227  *    Function : freeMacServingCellInfo
7228  *
7229  *    Functionality: Free Serving cell Info
7230  *
7231  * @params[in] ServCellCfgInfo *srvCellCfg
7232  * @return void
7233  *
7234  * ****************************************************************/
7235 void freeMacServingCellInfo(ServCellCfgInfo *srvCellCfg)
7236 {
7237    freeMacPdschServCellInfo(&srvCellCfg->pdschServCellCfg);
7238    if(srvCellCfg->bwpInactivityTmr)
7239    {
7240       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, srvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
7241    }
7242 }
7243
7244 /*******************************************************************
7245  *
7246  * @brief Free cell Grp Cfg Info
7247  *
7248  * @details
7249  *
7250  *    Function : freeUeReCfgCellGrpInfo
7251  *
7252  *    Functionality: Free cell Grp Cfg Info
7253  *
7254  * @params[in] MacUeCfg*  duUeCfg
7255  * @return void
7256  *
7257  * ****************************************************************/
7258
7259 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg)
7260 {
7261    freeMacServingCellInfo(&macUeCfg->spCellCfg.servCellCfg);
7262 }
7263
7264 /*******************************************************************
7265  *
7266  * @brief Fills Reconfig SchReqReConfig
7267  *
7268  * @details
7269  *
7270  *    Function : extractSchReqReConfig
7271  *
7272  *    Functionality: Fills Reconfig SchReqReConfig
7273  *
7274  * @params[in] SchedulingRequestConfig_t *cuSchedReq
7275  *             SchedReqCfg*  macSchedReq
7276  * @return void
7277  *
7278  * ****************************************************************/
7279 void extractSchReqReConfig(SchedulingRequestConfig_t *cuSchedReq, SchedReqCfg *macSchedReq)
7280 {
7281    uint8_t schReqIdx = 0;
7282    struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqListToAdd = NULLP;
7283    struct SchedulingRequestConfig__schedulingRequestToReleaseList *schReqListToRel = NULLP;
7284
7285    if(cuSchedReq->schedulingRequestToAddModList)
7286    {
7287       schReqListToAdd = cuSchedReq->schedulingRequestToAddModList;
7288       if(schReqListToAdd->list.count)
7289       {
7290          macSchedReq->addModListCount = schReqListToAdd->list.count;
7291          for(schReqIdx = 0; schReqIdx < schReqListToAdd->list.count; schReqIdx++)
7292          {
7293             macSchedReq->addModList[schReqIdx].schedReqId = \
7294                schReqListToAdd->list.array[schReqIdx]->schedulingRequestId;
7295             macSchedReq->addModList[schReqIdx].srProhibitTmr = \
7296                *(schReqListToAdd->list.array[schReqIdx]->sr_ProhibitTimer);
7297             macSchedReq->addModList[schReqIdx].srTransMax    =\
7298                schReqListToAdd->list.array[schReqIdx]->sr_TransMax;
7299          }
7300       }
7301    }
7302    /* Scheduling Req To release */
7303    if(cuSchedReq->schedulingRequestToReleaseList)
7304    {
7305       schReqListToRel = cuSchedReq->schedulingRequestToReleaseList;
7306       if(schReqListToRel->list.count)
7307       {
7308          macSchedReq->relListCount = schReqListToRel->list.count;
7309          for(schReqIdx = 0; schReqIdx < schReqListToRel->list.count; schReqIdx++)
7310          {
7311             macSchedReq->relList[schReqIdx] = \
7312                *schReqListToRel->list.array[schReqIdx];
7313          }
7314       }
7315    }
7316 }
7317
7318 /*******************************************************************
7319  *
7320  * @brief Fills TagReconfig
7321  *
7322  * @details
7323  *
7324  *    Function : extractTagReconfig
7325  *
7326  *    Functionality: Fills extractTagReconfig
7327  *
7328  * @params[in] TAG_Config_t *cuTagCfg
7329  *             TagCfg *macTagCfg
7330  * @return void
7331  *
7332  * ****************************************************************/
7333
7334 void extractTagReconfig(TAG_Config_t *cuTagCfg, TagCfg *macTagCfg)
7335 {
7336   uint8_t tagIdx = 0;
7337   struct TAG_Config__tag_ToAddModList  *tagListToAddMod = NULLP;
7338   struct TAG_Config__tag_ToReleaseList *tagListToRel = NULLP;
7339
7340   /* Tag config to AddMod */
7341   if(cuTagCfg->tag_ToAddModList)
7342   {
7343      tagListToAddMod = cuTagCfg->tag_ToAddModList; 
7344      if(tagListToAddMod->list.count)
7345      {
7346         macTagCfg->addModListCount = tagListToAddMod->list.count;
7347         for(tagIdx = 0; tagIdx < tagListToAddMod->list.count; tagIdx++)
7348         {
7349            macTagCfg->addModList[tagIdx].tagId =\
7350               tagListToAddMod->list.array[tagIdx]->tag_Id;     
7351            macTagCfg->addModList[tagIdx].timeAlignTimer = \
7352
7353               tagListToAddMod->list.array[tagIdx]->timeAlignmentTimer;
7354         }
7355      }
7356   }
7357   /* Tag config to release */
7358   if(cuTagCfg->tag_ToReleaseList)
7359   {
7360      tagListToRel = cuTagCfg->tag_ToReleaseList;
7361      if(tagListToRel->list.count)
7362      {
7363         macTagCfg->relListCount = tagListToRel->list.count;
7364         for(tagIdx = 0; tagIdx < tagListToRel->list.count; tagIdx++)
7365         {
7366            macTagCfg->relList[tagIdx] = *tagListToRel->list.array[tagIdx];     
7367         }
7368      }
7369   }
7370 }
7371
7372 /*******************************************************************
7373  *
7374  * @brief Fills PdcchCfg received by CU
7375  *
7376  * @details
7377  *
7378  *    Function : extractPdcchCfg
7379  *
7380  *    Functionality: Fills PdcchCfg received  by CU
7381  *
7382  * @params[in] PDCCH_Config_t *cuPdcchCfg,
7383  *             PdcchConfig *duPdcchCfg
7384  * @return void
7385  *
7386  * ****************************************************************/
7387
7388 void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
7389 {
7390    uint8_t cRsetIdx = 0;
7391    uint8_t srchSpcIdx = 0;
7392
7393    struct PDCCH_Config__controlResourceSetToAddModList *cRsetToAddModList = NULLP;
7394    struct PDCCH_Config__controlResourceSetToReleaseList *cRsetToRelList = NULLP;
7395    struct PDCCH_Config__searchSpacesToAddModList *srchSpcToAddModList = NULLP;
7396    struct PDCCH_Config__searchSpacesToReleaseList *srchSpcToRelList = NULLP;
7397
7398
7399    /* Control Resource Set To Add/Mod List */
7400    if(cuPdcchCfg->controlResourceSetToAddModList)
7401    {
7402       cRsetToAddModList = cuPdcchCfg->controlResourceSetToAddModList;
7403       if(cRsetToAddModList->list.count)
7404       {
7405          macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count;
7406          for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++)
7407          {
7408             macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \
7409               cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId;
7410             bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\
7411                macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc);
7412             macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \
7413               cRsetToAddModList->list.array[cRsetIdx]->duration;
7414
7415             macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \
7416               cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present;   
7417             if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED)
7418             {
7419                //TODO: handle the case for Interleaved
7420             }
7421             macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \
7422               cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity;
7423             if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID)
7424             {
7425                macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \
7426                   *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID);
7427             }
7428          }
7429       }
7430
7431    }
7432    /* Control Resource Set To Release List */
7433    if(cuPdcchCfg->controlResourceSetToReleaseList)
7434    {
7435       cRsetToRelList = cuPdcchCfg->controlResourceSetToReleaseList;
7436       if(cRsetToRelList->list.count)
7437       {
7438          macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count;
7439          for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++)
7440          {
7441             macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]);
7442          }
7443       }
7444    }
7445
7446    /* Search space To Add/Mod List */
7447    if(cuPdcchCfg->searchSpacesToAddModList)
7448    {
7449       srchSpcToAddModList = cuPdcchCfg->searchSpacesToAddModList;
7450       if(srchSpcToAddModList->list.count)
7451       {
7452          macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count;
7453          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++)
7454          {
7455             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\
7456                srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId;
7457             macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\
7458                *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId);
7459             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset)
7460             {
7461                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\
7462                   srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present;
7463             }
7464             if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot)
7465             {
7466                bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\
7467                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot);
7468             }
7469             if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates)
7470             {
7471               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \
7472                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1;
7473               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \
7474                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2;
7475               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \
7476                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4;
7477               
7478               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \
7479                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8;
7480               
7481               macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \
7482                   srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16;
7483             }
7484             if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType)
7485             {
7486                macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\
7487                   srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present;
7488                if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC)
7489                {
7490                   macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\
7491                      srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats;
7492                }
7493          
7494             }
7495          }
7496       }
7497    }
7498    /* Search space To Rel List */
7499    if(cuPdcchCfg->searchSpacesToReleaseList)
7500    {
7501       srchSpcToRelList = cuPdcchCfg->searchSpacesToReleaseList;
7502       if(srchSpcToRelList->list.count)
7503       {
7504          macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count;
7505          for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++)
7506          {
7507             macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\
7508                *(srchSpcToRelList->list.array[srchSpcIdx]);
7509          }
7510       }
7511    }
7512 }
7513
7514 /*******************************************************************
7515  *
7516  * @brief Fills PdschCfg received by CU
7517  *
7518  * @details
7519  *
7520  *    Function : extractPdschCfg
7521  *
7522  *    Functionality: Fills PdschCfg received  by CU
7523  *
7524  * @params[in] PDSCH_Config_t *cuPdschCfg,
7525  *             PdschConfig *macPdschCfg
7526  * @return void
7527  *
7528  * ****************************************************************/
7529
7530 void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
7531 {
7532    uint8_t timeDomIdx;
7533    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
7534
7535    if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
7536    {
7537       if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->present == \
7538          PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup)
7539       {
7540          if(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)
7541          {
7542             macPdschCfg->dmrsDlCfgForPdschMapTypeA.addPos = \
7543                *(cuPdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition);
7544          }
7545       }
7546    }
7547    macPdschCfg->resourceAllocType = cuPdschCfg->resourceAllocation;
7548    if(cuPdschCfg->pdsch_TimeDomainAllocationList)
7549    {
7550       timeDomAlloc = cuPdschCfg->pdsch_TimeDomainAllocationList;
7551       if(timeDomAlloc->present ==\
7552          PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup)
7553       {
7554          if(timeDomAlloc->choice.setup)
7555          {
7556             macPdschCfg->numTimeDomRsrcAlloc  = timeDomAlloc->choice.setup->list.count;
7557             for(timeDomIdx = 0; timeDomIdx < timeDomAlloc->choice.setup->list.count; timeDomIdx++)
7558             {
7559                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
7560                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
7561                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength = \
7562                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
7563             }
7564          }
7565       }
7566    }
7567    macPdschCfg->rbgSize = cuPdschCfg->rbg_Size;
7568    if(cuPdschCfg->maxNrofCodeWordsScheduledByDCI)
7569       macPdschCfg->numCodeWordsSchByDci = *(cuPdschCfg->maxNrofCodeWordsScheduledByDCI);
7570    if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_staticBundling)
7571    {
7572       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
7573       if(cuPdschCfg->prb_BundlingType.choice.staticBundling)
7574       {
7575          if(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize)
7576          {
7577             macPdschCfg->bundlingInfo.StaticBundling.size = \
7578                *(cuPdschCfg->prb_BundlingType.choice.staticBundling->bundleSize);
7579          }
7580       }
7581    }
7582    else if(cuPdschCfg->prb_BundlingType.present == PDSCH_Config__prb_BundlingType_PR_dynamicBundling)
7583    {
7584       macPdschCfg->bundlingType = cuPdschCfg->prb_BundlingType.present;
7585    }
7586
7587 }
7588
7589 /*******************************************************************
7590  *
7591  * @brief Fills PdschServingCellCfg received by CU
7592  *
7593  * @details
7594  *
7595  *    Function : extractPdschServingCellCfg
7596  *
7597  *    Functionality: Fills PdschCfg received  by CU
7598  *
7599  * @params[in] PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg,
7600  *             PdschServCellCfg *macUePdschSrvCellCfg
7601  * @return ROK/RFAILED
7602  *
7603  * ****************************************************************/
7604
7605 uint8_t extractPdschServingCellCfg(PDSCH_ServingCellConfig_t *cuPdschSrvCellCfg, PdschServCellCfg *macUePdschSrvCellCfg)
7606 {
7607    if(cuPdschSrvCellCfg->codeBlockGroupTransmission)
7608    {
7609       if(cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup)
7610       {
7611          if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
7612          {
7613             *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
7614                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
7615          }
7616          else
7617          {
7618             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(uint8_t));
7619             if(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)
7620             {
7621                *(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb)  = \
7622                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
7623             }
7624             else
7625             {
7626                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxCodeBlkGrpPerTb at extractPdschServingCellCfg()");
7627                return RFAILED;
7628             }
7629          }
7630          if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
7631          {
7632             *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
7633                cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
7634          }
7635          else
7636          {
7637             DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxCodeBlkGrpPerTb, sizeof(bool));
7638             if(macUePdschSrvCellCfg->codeBlkGrpFlushInd)
7639             {
7640                *(macUePdschSrvCellCfg->codeBlkGrpFlushInd)  = \
7641                   cuPdschSrvCellCfg->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator;
7642             }
7643             else
7644             {
7645                DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for codeBlkGrpFlushInd at extractPdschServingCellCfg()");
7646                return RFAILED;
7647             }
7648          }
7649       }
7650    }
7651    if(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH)
7652    {
7653       macUePdschSrvCellCfg->numHarqProcForPdsch = *(cuPdschSrvCellCfg->nrofHARQ_ProcessesForPDSCH); 
7654    }
7655    if(cuPdschSrvCellCfg->ext1)
7656    {
7657       if(cuPdschSrvCellCfg->ext1->maxMIMO_Layers)
7658       {
7659         if(macUePdschSrvCellCfg->maxMimoLayers)
7660         {
7661            *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
7662         }
7663         else
7664         {
7665            DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->maxMimoLayers, sizeof(uint8_t));
7666            if(macUePdschSrvCellCfg->maxMimoLayers)
7667            {
7668               *(macUePdschSrvCellCfg->maxMimoLayers)  = *(cuPdschSrvCellCfg->ext1->maxMIMO_Layers);
7669            }
7670            else
7671            {
7672               DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for maxMimoLayers at extractPdschServingCellCfg()");
7673               return RFAILED;
7674            }
7675         }
7676       }
7677    }
7678    if(cuPdschSrvCellCfg->xOverhead)
7679    {
7680       if(macUePdschSrvCellCfg->xOverhead)
7681       {
7682          *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
7683       }
7684       else
7685       {
7686          DU_ALLOC_SHRABL_BUF(macUePdschSrvCellCfg->xOverhead, sizeof(uint8_t));
7687          if(macUePdschSrvCellCfg->xOverhead)
7688          {
7689             *(macUePdschSrvCellCfg->xOverhead)  = *(cuPdschSrvCellCfg->xOverhead);
7690          }
7691          else
7692          {
7693             DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for xOverhead at extractPdschServingCellCfg()");
7694             return RFAILED;
7695          }
7696       }
7697    }
7698    return ROK;
7699 }
7700
7701 /*******************************************************************
7702  *
7703  * @brief Fills PuschCfg received by CU
7704  *
7705  * @details
7706  *
7707  *    Function : extractPuschCfg
7708  *
7709  *    Functionality: Fills PuschCfg received  by CU
7710  *
7711  * @params[in] BWP_UplinkDedicated__pusch_Config *cuPuschCfg,
7712  *             PuschCfg *macPuschCfg
7713  * @return void
7714  *
7715  * ****************************************************************/
7716
7717 void extractPuschCfg(struct BWP_UplinkDedicated__pusch_Config *cuPuschCfg, PuschCfg *macPuschCfg)
7718 {
7719    uint8_t timeDomIdx = 0;
7720    DMRS_UplinkConfig_t *dmrsUlCfg = NULLP;
7721    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList = NULLP;
7722
7723    if(cuPuschCfg->present == BWP_UplinkDedicated__pusch_Config_PR_setup)
7724    {
7725       if(cuPuschCfg->choice.setup)
7726       {
7727          if(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH)
7728          {
7729              macPuschCfg->dataScramblingId = \
7730                 *(cuPuschCfg->choice.setup->dataScramblingIdentityPUSCH);
7731          }
7732          if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA)
7733          {
7734             if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->present == PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup)
7735             {
7736                if(cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup)
7737                {
7738                   dmrsUlCfg = (cuPuschCfg->choice.setup->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup);
7739                   if(dmrsUlCfg->dmrs_AdditionalPosition)
7740                   {
7741                      macPuschCfg->dmrsUlCfgForPuschMapTypeA.addPos =\
7742                         *(dmrsUlCfg->dmrs_AdditionalPosition);
7743                   }
7744                   if(dmrsUlCfg->transformPrecodingDisabled)
7745                   {
7746                      if(dmrsUlCfg->transformPrecodingDisabled->scramblingID0)
7747                      {
7748                         macPuschCfg->dmrsUlCfgForPuschMapTypeA.transPrecodDisabled.scramblingId0 = \
7749                            *(dmrsUlCfg->transformPrecodingDisabled->scramblingID0);
7750                      }
7751                   }
7752                }
7753             }
7754          }
7755          /*Res Alloc Type for UL */
7756          if(cuPuschCfg->choice.setup->resourceAllocation)
7757          {
7758             macPuschCfg->resourceAllocType = \
7759                cuPuschCfg->choice.setup->resourceAllocation;
7760          }
7761          if(cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList)
7762          {
7763             timeDomAllocList = cuPuschCfg->choice.setup->pusch_TimeDomainAllocationList;
7764             if(timeDomAllocList->present == PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup)
7765             {
7766                if(timeDomAllocList->choice.setup)
7767                {
7768                   macPuschCfg->numTimeDomRsrcAlloc = timeDomAllocList->choice.setup->list.count;
7769                   for(timeDomIdx = 0; timeDomIdx <timeDomAllocList->choice.setup->list.count; timeDomIdx++)
7770                   {
7771                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].k2 = \
7772                         *(timeDomAllocList->choice.setup->list.array[timeDomIdx]->k2);
7773                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].mappingType = \
7774                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->mappingType;
7775                      macPuschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength = \
7776                         timeDomAllocList->choice.setup->list.array[timeDomIdx]->startSymbolAndLength;
7777                   }
7778                }
7779             }
7780          }
7781          if(cuPuschCfg->choice.setup->transformPrecoder)
7782             macPuschCfg->transformPrecoder = *(cuPuschCfg->choice.setup->transformPrecoder);
7783       }
7784    }
7785 }
7786
7787 /*******************************************************************
7788  *
7789  * @brief Function to fill pucch Power Control
7790  *
7791  * @details
7792  *
7793  *    Function : extractPucchPowerControl
7794  *
7795  *    Functionality: Function to fill pucch Power Control
7796  *
7797  * @params[in] PucchPowerControl *pwrCtrl,
7798  *             struct PUCCH_PowerControl *cuPwrCtrlCfg
7799  * @return void
7800  *
7801  * ****************************************************************/
7802
7803 void extractPucchPowerControl(PucchPowerControl *pwrCtrl, struct PUCCH_PowerControl *cuPwrCtrlCfg)
7804 {
7805    uint8_t arrIdx;
7806
7807    if(cuPwrCtrlCfg->deltaF_PUCCH_f0)
7808       pwrCtrl->deltaF_Format0 = *cuPwrCtrlCfg->deltaF_PUCCH_f0;
7809    if(cuPwrCtrlCfg->deltaF_PUCCH_f1)
7810       pwrCtrl->deltaF_Format1 = *cuPwrCtrlCfg->deltaF_PUCCH_f1;
7811    if(cuPwrCtrlCfg->deltaF_PUCCH_f2)
7812       pwrCtrl->deltaF_Format2 = *cuPwrCtrlCfg->deltaF_PUCCH_f2;
7813    if(cuPwrCtrlCfg->deltaF_PUCCH_f3)
7814       pwrCtrl->deltaF_Format3 = *cuPwrCtrlCfg->deltaF_PUCCH_f3;
7815    if(cuPwrCtrlCfg->deltaF_PUCCH_f4)
7816       pwrCtrl->deltaF_Format4 = *cuPwrCtrlCfg->deltaF_PUCCH_f4;
7817    if(cuPwrCtrlCfg->p0_Set)
7818    {
7819       pwrCtrl->p0SetCount = cuPwrCtrlCfg->p0_Set->list.count;
7820       for(arrIdx=0; arrIdx < pwrCtrl->p0SetCount; arrIdx++)
7821       {
7822          pwrCtrl->p0Set[arrIdx].p0PucchId =\
7823             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Id;
7824          pwrCtrl->p0Set[arrIdx].p0PucchVal =\
7825             cuPwrCtrlCfg->p0_Set->list.array[arrIdx]->p0_PUCCH_Value;
7826       }
7827    }
7828    if(cuPwrCtrlCfg->pathlossReferenceRSs)
7829    {
7830       pwrCtrl->pathLossRefRSListCount = cuPwrCtrlCfg->pathlossReferenceRSs->list.count;
7831       for(arrIdx = 0; arrIdx < pwrCtrl->pathLossRefRSListCount; arrIdx++)
7832       {
7833          pwrCtrl->pathLossRefRSList[arrIdx].pathLossRefRSId =\
7834             cuPwrCtrlCfg->pathlossReferenceRSs->list.array[arrIdx]->pucch_PathlossReferenceRS_Id;
7835       }
7836    }
7837 }
7838  
7839  /*******************************************************************
7840  *
7841  * @brief Function to extractResrcSetToAddModList sent by CU
7842  *
7843  * @details
7844  *
7845  *    Function : extractResrcSetToAddModList
7846  *
7847  *    Functionality: Fucntion to extractResrcSetToAddModList
7848  *
7849  * @params[in] PucchResrcSetCfg pointer,
7850  *             struct PUCCH_Config__resourceSetToAddModList pointer
7851  * @return void
7852  *
7853  * ****************************************************************/
7854
7855 void extractResrcSetToAddModList(PucchResrcSetCfg *macRsrcSetList, struct PUCCH_Config__resourceSetToAddModList *cuRsrcSetList)
7856 {
7857    uint8_t arrIdx, rsrcListIdx;
7858
7859    macRsrcSetList->resrcSetToAddModListCount = cuRsrcSetList->list.count; 
7860    for(arrIdx = 0; arrIdx < macRsrcSetList->resrcSetToAddModListCount; arrIdx++)
7861    {
7862       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcSetId     =\
7863          cuRsrcSetList->list.array[arrIdx]->pucch_ResourceSetId;
7864       macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount =\
7865          cuRsrcSetList->list.array[arrIdx]->resourceList.list.count;
7866       for(rsrcListIdx = 0; rsrcListIdx < macRsrcSetList->resrcSetToAddModList[arrIdx].resrcListCount; rsrcListIdx++)
7867       {
7868          macRsrcSetList->resrcSetToAddModList[arrIdx].resrcList[rsrcListIdx] =\
7869             *cuRsrcSetList->list.array[arrIdx]->resourceList.list.array[rsrcListIdx];
7870       }
7871       macRsrcSetList->resrcSetToAddModList[arrIdx].maxPayLoadSize =\
7872          *cuRsrcSetList->list.array[arrIdx]->maxPayloadMinus1;
7873    }
7874 }/* End of extractResrcSetToAddModList */
7875
7876 /*******************************************************************
7877  *
7878  * @brief Fills extractResrcToAddModList sent by CU
7879  *
7880  * @details
7881  *
7882  *    Function : extractResrcToAddModList
7883  *
7884  *    Functionality: Fills extractResrcToAddModList
7885  *
7886  * @params[in] PucchResrcCfg pointer,
7887  *             struct PUCCH_Config__resourceToAddModList pointer
7888  * @return ROk/RFAILED
7889  *
7890  * ****************************************************************/
7891
7892 uint8_t extractResrcToAddModList(PucchResrcCfg *macResrcList, struct PUCCH_Config__resourceToAddModList *cuResrcList)
7893 {
7894    uint8_t arrIdx;
7895    
7896    macResrcList->resrcToAddModListCount = cuResrcList->list.count;
7897    for(arrIdx = 0; arrIdx < macResrcList->resrcToAddModListCount; arrIdx++)
7898    {
7899       macResrcList->resrcToAddModList[arrIdx].resrcId      =\
7900         cuResrcList->list.array[arrIdx]->pucch_ResourceId; 
7901       macResrcList->resrcToAddModList[arrIdx].startPrb     =\
7902         cuResrcList->list.array[arrIdx]->startingPRB;
7903       if(cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping)
7904       {
7905          macResrcList->resrcToAddModList[arrIdx].intraFreqHop =\
7906            *cuResrcList->list.array[arrIdx]->intraSlotFrequencyHopping;
7907       }
7908       if(cuResrcList->list.array[arrIdx]->secondHopPRB)
7909       {
7910          macResrcList->resrcToAddModList[arrIdx].secondPrbHop =\
7911            *cuResrcList->list.array[arrIdx]->secondHopPRB;
7912       }
7913       /* PUCCH RSRC FORMAT */
7914       if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format0)
7915       {
7916          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_0;
7917          if(cuResrcList->list.array[arrIdx]->format.choice.format0)
7918          {
7919             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0, sizeof(PucchFormat0));
7920             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0 == NULLP)
7921             {
7922                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format0 in extractResrcToAddModList()");
7923                return RFAILED;
7924             }
7925             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->initialCyclicShift =\
7926                cuResrcList->list.array[arrIdx]->format.choice.format0->initialCyclicShift;
7927             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->numSymbols =\
7928                cuResrcList->list.array[arrIdx]->format.choice.format0->nrofSymbols;
7929             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format0->startSymbolIdx =\
7930                cuResrcList->list.array[arrIdx]->format.choice.format0->startingSymbolIndex;
7931          }
7932       }
7933       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format1)
7934       {
7935          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_1;
7936          if(cuResrcList->list.array[arrIdx]->format.choice.format1)
7937          {
7938             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1, sizeof(PucchFormat1));
7939             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1 == NULLP)
7940             {
7941                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format1 in extractResrcToAddModList()");
7942                return RFAILED;
7943             }
7944             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->initialCyclicShift =\
7945                 cuResrcList->list.array[arrIdx]->format.choice.format1->initialCyclicShift;
7946             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->numSymbols =\
7947                 cuResrcList->list.array[arrIdx]->format.choice.format1->nrofSymbols;
7948             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->startSymbolIdx =\
7949                 cuResrcList->list.array[arrIdx]->format.choice.format1->startingSymbolIndex;
7950             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format1->timeDomOCC =\
7951                 cuResrcList->list.array[arrIdx]->format.choice.format1->timeDomainOCC;
7952          }
7953       }
7954       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format2)
7955       {
7956          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_2;
7957          if(cuResrcList->list.array[arrIdx]->format.choice.format2)
7958          {
7959             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2, sizeof(PucchFormat2_3));
7960             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2 == NULLP)
7961             {
7962                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format2 in extractResrcToAddModList()");
7963                return RFAILED;
7964             }
7965             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numPrbs =\
7966                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofPRBs;
7967             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->numSymbols =\
7968                 cuResrcList->list.array[arrIdx]->format.choice.format2->nrofSymbols;
7969             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format2->startSymbolIdx =\
7970                 cuResrcList->list.array[arrIdx]->format.choice.format2->startingSymbolIndex;
7971          }
7972       }
7973       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format3)
7974       {
7975          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_3;
7976          if(cuResrcList->list.array[arrIdx]->format.choice.format3)
7977          {
7978             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3, sizeof(PucchFormat2_3));
7979             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3 == NULLP)
7980             {
7981                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format3 in extractResrcToAddModList()");
7982                return RFAILED;
7983             }
7984             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numPrbs =\
7985                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofPRBs;
7986             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->numSymbols =\
7987                 cuResrcList->list.array[arrIdx]->format.choice.format3->nrofSymbols;
7988             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format3->startSymbolIdx =\
7989                 cuResrcList->list.array[arrIdx]->format.choice.format3->startingSymbolIndex;
7990          }
7991       }
7992       else if(cuResrcList->list.array[arrIdx]->format.present == PUCCH_Resource__format_PR_format4)
7993       {
7994          macResrcList->resrcToAddModList[arrIdx].pucchFormat = PUCCH_FORMAT_4;
7995          if(cuResrcList->list.array[arrIdx]->format.choice.format4)
7996          {
7997             DU_ALLOC_SHRABL_BUF(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4, sizeof(PucchFormat4));
7998             if(macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4 == NULLP)
7999             {
8000                DU_LOG("\nERROR  --> F1AP : Failed to allocate memory for Format4 in extractResrcToAddModList()");
8001                return RFAILED;
8002             }
8003             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->numSymbols =\
8004                 cuResrcList->list.array[arrIdx]->format.choice.format4->nrofSymbols;
8005             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occLen =\
8006                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Length;
8007             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->occIdx =\
8008                 cuResrcList->list.array[arrIdx]->format.choice.format4->occ_Index;
8009             macResrcList->resrcToAddModList[arrIdx].PucchFormat.format4->startSymbolIdx =\
8010                 cuResrcList->list.array[arrIdx]->format.choice.format4->startingSymbolIndex;
8011          }
8012       }
8013    }
8014    return ROK;
8015
8016 }/* End of extractResrcToAddModList */
8017
8018 /*******************************************************************
8019  *
8020  * @brief Fills fillPucchSchedReqPeriodAndOffset sent by CU
8021  *
8022  * @details
8023  *
8024  *    Function : fillPucchSchedReqPeriodAndOffset
8025  *
8026  *    Functionality: To fillPucchSchedReqPeriodAndOffset
8027  *
8028  * @params[in] macPeriodicty,
8029  *     SchedulingRequestResourceConfig__periodicityAndOffset pointer
8030  * @return void
8031  *
8032  * ****************************************************************/
8033
8034 void fillPucchSchedReqPeriodAndOffset(uint8_t macPeriodicty, uint16_t  macOffset,\
8035    struct SchedulingRequestResourceConfig__periodicityAndOffset *cuPeriodicty)
8036 {
8037    macPeriodicty = cuPeriodicty->present;
8038    switch(macPeriodicty)
8039    {
8040       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym2:
8041          {
8042             macOffset     = cuPeriodicty->choice.sym2;
8043             break;
8044          }
8045       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sym6or7:
8046          {
8047             macOffset     = cuPeriodicty->choice.sym6or7;
8048             break;
8049          }
8050       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
8051          {
8052             macOffset     = cuPeriodicty->choice.sl1;
8053             break;
8054          }
8055       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
8056          {
8057             macOffset = cuPeriodicty->choice.sl2;
8058             break;
8059          }
8060       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
8061          {
8062             macOffset = cuPeriodicty->choice.sl4;
8063             break;
8064          }
8065       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
8066          {
8067             macOffset = cuPeriodicty->choice.sl5;
8068             break;
8069          }
8070       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
8071          {
8072             macOffset = cuPeriodicty->choice.sl8;
8073             break;
8074          }
8075       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
8076          {
8077             macOffset = cuPeriodicty->choice.sl10;
8078             break;
8079          }
8080       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
8081          {
8082             macOffset = cuPeriodicty->choice.sl16;
8083             break;
8084          }
8085       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
8086          {
8087             macOffset = cuPeriodicty->choice.sl20;
8088             break;
8089          }
8090       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
8091          {
8092             macOffset = cuPeriodicty->choice.sl40;
8093             break;
8094          }
8095       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
8096          {
8097             macOffset = cuPeriodicty->choice.sl80;
8098             break;
8099          }
8100       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
8101          {
8102             macOffset = cuPeriodicty->choice.sl160;
8103             break;
8104          }
8105       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
8106          {
8107             macOffset = cuPeriodicty->choice.sl320;
8108             break;
8109          }
8110       case SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
8111          {
8112             macOffset = cuPeriodicty->choice.sl640;
8113             break;
8114          }
8115       default :
8116          DU_LOG("\nERROR  -->  F1AP : Invalid periodicity %d", macPeriodicty);
8117    }
8118 }
8119
8120 /*******************************************************************
8121  *
8122  * @brief Function to extractPucchFormatCfg sent by CU
8123  *
8124  * @details
8125  *
8126  *    Function : extractPucchFormatCfg
8127  *
8128  *    Functionality: Function to extractPucchFormatCfg
8129  *
8130  * @params[in] PucchFormatCfg pointer,
8131  *             PUCCH_FormatConfig_t pointer
8132  * @return void
8133  *
8134  * ****************************************************************/
8135
8136 void extractPucchFormatCfg(PucchFormatCfg *macFormatCfg, PUCCH_FormatConfig_t *cuFormatCfg)
8137  {
8138     if(cuFormatCfg->interslotFrequencyHopping)
8139        macFormatCfg->interSlotFreqHop = *cuFormatCfg->interslotFrequencyHopping;
8140     if(cuFormatCfg->additionalDMRS)  
8141        macFormatCfg->addDmrs = *cuFormatCfg->additionalDMRS;
8142     if(cuFormatCfg->maxCodeRate)
8143        macFormatCfg->maxCodeRate = *cuFormatCfg->maxCodeRate;
8144     if(cuFormatCfg->nrofSlots)  
8145        macFormatCfg->numSlots = *cuFormatCfg->nrofSlots;
8146     if(cuFormatCfg->pi2BPSK)  
8147        macFormatCfg->pi2BPSK = *cuFormatCfg->pi2BPSK;
8148     if(cuFormatCfg->simultaneousHARQ_ACK_CSI)  
8149        macFormatCfg->harqAckCSI = *cuFormatCfg->simultaneousHARQ_ACK_CSI;
8150  }/* End of extractPucchFormatCfg */
8151
8152 /*******************************************************************
8153  *
8154  * @brief Function to extractSchedReqCfgToAddMod sent by CU
8155  *
8156  * @details
8157  *
8158  *    Function : extractSchedReqCfgToAddMod
8159  *
8160  *    Functionality: Function to extractSchedReqCfgToAddMod
8161  *
8162  * @params[in] PucchSchedReqCfg pointer,
8163  *      PUCCH_Config__schedulingRequestResourceToAddModList pointer
8164  * @return void
8165  *
8166  * ****************************************************************/
8167
8168 void extractSchedReqCfgToAddMod(PucchSchedReqCfg *macSchedReqCfg, struct PUCCH_Config__schedulingRequestResourceToAddModList *cuSchedReqList)
8169 {
8170    uint8_t arrIdx;
8171
8172    macSchedReqCfg->schedAddModListCount = cuSchedReqList->list.count;
8173    for(arrIdx = 0; arrIdx <  macSchedReqCfg->schedAddModListCount; arrIdx++)
8174    {
8175       macSchedReqCfg->schedAddModList[arrIdx].resrcId =\
8176          cuSchedReqList->list.array[arrIdx]->schedulingRequestResourceId;
8177       macSchedReqCfg->schedAddModList[arrIdx].requestId =\
8178          cuSchedReqList->list.array[arrIdx]->schedulingRequestID;
8179       if(cuSchedReqList->list.array[arrIdx]->periodicityAndOffset)
8180       {
8181          fillPucchSchedReqPeriodAndOffset(macSchedReqCfg->schedAddModList[arrIdx].periodicity,\
8182             macSchedReqCfg->schedAddModList[arrIdx].offset, cuSchedReqList->list.array[arrIdx]->periodicityAndOffset);
8183       }
8184       if(cuSchedReqList->list.array[arrIdx]->resource)
8185       {
8186          macSchedReqCfg->schedAddModList[arrIdx].resrc =\
8187             *cuSchedReqList->list.array[arrIdx]->resource;
8188       }
8189    }
8190
8191 }/* End of extractSchedReqCfgToAddMod */
8192
8193  /*******************************************************************
8194  *
8195  * @brief Fills PucchCfg received by CU
8196  *
8197  * @details
8198  *
8199  *    Function : extractPucchCfg
8200  *
8201  *    Functionality: Fills PucchCfg received  by CU
8202  *
8203  * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg,
8204  *             PucchCfg *macPucchCfg
8205  * @return ROK/RFAILED
8206  *
8207  * ****************************************************************/
8208
8209 uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg)         
8210 {
8211    uint8_t arrIdx;
8212
8213    if(cuPucchCfg->present == BWP_UplinkDedicated__pucch_Config_PR_setup)
8214    {
8215       if(cuPucchCfg->choice.setup)
8216       {
8217          /* Resource Set Cfg */ 
8218          if(cuPucchCfg->choice.setup->resourceSetToAddModList)
8219          {
8220             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrcSet, sizeof(PucchResrcSetCfg));
8221             if(macPucchCfg->resrcSet == NULLP)
8222             {
8223                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc set List in extractPucchCfg()");
8224                return RFAILED;
8225             }
8226             memset(macPucchCfg->resrcSet, 0, sizeof(PucchResrcSetCfg));
8227             extractResrcSetToAddModList(macPucchCfg->resrcSet, cuPucchCfg->choice.setup->resourceSetToAddModList);
8228          }
8229          
8230          /* Resource Cfg */ 
8231          if(cuPucchCfg->choice.setup->resourceToAddModList)
8232          {
8233             DU_ALLOC_SHRABL_BUF(macPucchCfg->resrc, sizeof(PucchResrcCfg));
8234             if(macPucchCfg->resrc == NULLP)
8235             {
8236                DU_LOG("\nERROR --> F1AP : Failed to extract Resrc List in extractPucchCfg()");
8237                return RFAILED;
8238             }
8239             memset(macPucchCfg->resrc, 0, sizeof(PucchResrcCfg));
8240             extractResrcToAddModList(macPucchCfg->resrc, cuPucchCfg->choice.setup->resourceToAddModList);
8241          }
8242          
8243          /* Format 1 Cfg */ 
8244          if(cuPucchCfg->choice.setup->format1)
8245          {
8246             DU_ALLOC_SHRABL_BUF(macPucchCfg->format1, sizeof(PucchFormatCfg));
8247             if(macPucchCfg->format1 == NULLP)
8248             {
8249                DU_LOG("\nERROR --> F1AP : Failed to extract format 1 Cfg in  extractPucchCfg()");
8250                return RFAILED;
8251             }
8252             memset(macPucchCfg->format1, 0, sizeof(PucchFormatCfg));
8253             extractPucchFormatCfg(macPucchCfg->format1,\
8254                cuPucchCfg->choice.setup->format1->choice.setup);
8255          }
8256          
8257          /* Format 2 Cfg */
8258          if(cuPucchCfg->choice.setup->format2)
8259          {
8260             DU_ALLOC_SHRABL_BUF(macPucchCfg->format2, sizeof(PucchFormatCfg));
8261             if(macPucchCfg->format2 == NULLP)
8262             {
8263                DU_LOG("\nERROR --> F1AP : Failed to extract format 2 Cfg in  extractPucchCfg()");
8264                return RFAILED;
8265             }
8266             memset(macPucchCfg->format2, 0, sizeof(PucchFormatCfg));
8267             extractPucchFormatCfg(macPucchCfg->format2,\
8268                cuPucchCfg->choice.setup->format2->choice.setup);
8269          }
8270          
8271          /* Format 3 Cfg */
8272          if(cuPucchCfg->choice.setup->format3)
8273          {
8274             DU_ALLOC_SHRABL_BUF(macPucchCfg->format3, sizeof(PucchFormatCfg));
8275             if(macPucchCfg->format3 == NULLP)
8276             {
8277                DU_LOG("\nERROR --> F1AP : Failed to extract format 3 Cfg in  extractPucchCfg()");
8278                return RFAILED;
8279             }
8280             memset(macPucchCfg->format3, 0, sizeof(PucchFormatCfg));
8281             extractPucchFormatCfg(macPucchCfg->format3,\
8282                cuPucchCfg->choice.setup->format3->choice.setup);
8283          }
8284
8285          /* Format 4 Cfg */
8286          if(cuPucchCfg->choice.setup->format4)
8287          {
8288             DU_ALLOC_SHRABL_BUF(macPucchCfg->format4, sizeof(PucchFormatCfg));
8289             if(macPucchCfg->format4 == NULLP)
8290             {
8291                DU_LOG("\nERROR --> F1AP : Failed to extract format 4 Cfg in  extractPucchCfg()");
8292                return RFAILED;
8293             }
8294             memset(macPucchCfg->format4, 0, sizeof(PucchFormatCfg));
8295             extractPucchFormatCfg(macPucchCfg->format4,\
8296                cuPucchCfg->choice.setup->format4->choice.setup);
8297          }
8298
8299          /* Sched Req List */
8300          if(cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList)
8301          {
8302             DU_ALLOC_SHRABL_BUF(macPucchCfg->schedReq, sizeof(PucchSchedReqCfg));
8303             if(macPucchCfg->schedReq == NULLP)
8304             {
8305                DU_LOG("\nERROR --> F1AP : Failed to extract schedReqCfg in  extractPucchCfg()");
8306                return RFAILED;
8307             }
8308             memset(macPucchCfg->schedReq, 0, sizeof(PucchSchedReqCfg));
8309             extractSchedReqCfgToAddMod(macPucchCfg->schedReq,\
8310             cuPucchCfg->choice.setup->schedulingRequestResourceToAddModList);
8311          }
8312
8313          /*TODO: Add support for  Spatial Info */
8314
8315          /* MultiCsiCfg */
8316          if(cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList)
8317          {
8318             DU_ALLOC_SHRABL_BUF(macPucchCfg->multiCsiCfg, sizeof(PucchMultiCsiCfg));
8319             if(macPucchCfg->multiCsiCfg == NULLP)
8320             {
8321                DU_LOG("\nERROR --> F1AP : Failed to extract multiCsiCfg in  extractPucchCfg()");
8322                return RFAILED;
8323             }
8324             memset(macPucchCfg->multiCsiCfg, 0, sizeof(PucchMultiCsiCfg));
8325             macPucchCfg->multiCsiCfg->multiCsiResrcListCount = cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.count;
8326             for(arrIdx =0; arrIdx < macPucchCfg->multiCsiCfg->multiCsiResrcListCount; arrIdx++)
8327             {
8328                macPucchCfg->multiCsiCfg->multiCsiResrcList[arrIdx] =\
8329                  *cuPucchCfg->choice.setup->multi_CSI_PUCCH_ResourceList->list.array[arrIdx];
8330             }
8331          }
8332
8333          /* Dl_DataToUL_ACK */ 
8334          if(cuPucchCfg->choice.setup->dl_DataToUL_ACK)
8335          {
8336             DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
8337             if(macPucchCfg->dlDataToUlAck == NULLP)
8338             {
8339                DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
8340                return RFAILED;
8341             }
8342             memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
8343             macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
8344             for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
8345             {
8346                macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
8347                   *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
8348             }
8349          }
8350
8351          /* Power Control */
8352          if(cuPucchCfg->choice.setup->pucch_PowerControl)
8353          {
8354             DU_ALLOC_SHRABL_BUF(macPucchCfg->powerControl, sizeof(PucchPowerControl));
8355             if(macPucchCfg->powerControl == NULLP)
8356             {
8357                DU_LOG("\nERROR --> F1AP : Failed to extract power control in extractPucchCfg()");
8358                return RFAILED;
8359             }
8360             extractPucchPowerControl(macPucchCfg->powerControl,\
8361                cuPucchCfg->choice.setup->pucch_PowerControl);
8362          }
8363       }
8364    }
8365    return ROK;
8366 }
8367
8368 /*******************************************************************
8369  *
8370  * @brief Fills ServingCellReconfig received by CU
8371  *
8372  * @details
8373  *
8374  *    Function : extractSpCellDedicatedCfg
8375  *
8376  *    Functionality: Fills ServingCellReconfig received  by CU
8377  *
8378  * @params[in] ServingCellConfig_t *cuSrvCellCfg
8379  *             ServCellCfgInfo *macSrvCellCfg
8380  * @return ROK/RFAILD
8381  *
8382  * ****************************************************************/
8383 uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg)
8384 {
8385    uint8_t ret = ROK;
8386    BWP_DownlinkDedicated_t *dlBwp = NULLP;
8387    BWP_UplinkDedicated_t   *ulBwp = NULLP;
8388
8389    if(cuSrvCellCfg->initialDownlinkBWP)
8390    {
8391       dlBwp = ((BWP_DownlinkDedicated_t *)(cuSrvCellCfg->initialDownlinkBWP));
8392       if(dlBwp->pdcch_Config)
8393       {
8394          if(dlBwp->pdcch_Config->choice.setup)
8395          {
8396             macSrvCellCfg->initDlBwp.pdcchPresent = true;
8397             extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
8398          }
8399       }
8400       if(dlBwp->pdsch_Config)
8401       {
8402          if(dlBwp->pdsch_Config->choice.setup)
8403          {
8404             macSrvCellCfg->initDlBwp.pdschPresent = true;
8405             extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg);
8406          }
8407       }
8408    }
8409    if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
8410       macSrvCellCfg->firstActvDlBwpId = *(cuSrvCellCfg->firstActiveDownlinkBWP_Id);
8411    if(cuSrvCellCfg->defaultDownlinkBWP_Id)
8412       macSrvCellCfg->defaultDlBwpId = *(cuSrvCellCfg->defaultDownlinkBWP_Id);
8413    if(cuSrvCellCfg->bwp_InactivityTimer)
8414    {
8415       if(macSrvCellCfg->bwpInactivityTmr)
8416       {
8417          memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
8418       }
8419       else
8420       {
8421          macSrvCellCfg->bwpInactivityTmr = NULLP;
8422          DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
8423          if(macSrvCellCfg->bwpInactivityTmr)
8424          {
8425             memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
8426          }
8427          else
8428          {
8429             DU_LOG("\nERROR  --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
8430             return RFAILED;
8431          }
8432       }
8433    }
8434    if(cuSrvCellCfg->pdsch_ServingCellConfig)
8435    {
8436       if(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup)
8437       {
8438          ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
8439          if(ret == RFAILED)
8440          {
8441             DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
8442             return RFAILED;
8443          }
8444       }
8445    }
8446    if(cuSrvCellCfg->uplinkConfig)
8447    {
8448      if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
8449      {
8450         ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
8451         if(ulBwp->pusch_Config)
8452         {
8453            macSrvCellCfg->initUlBwp.puschPresent = true;
8454            extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
8455         }
8456         if(ulBwp->pucch_Config)
8457         {
8458            macSrvCellCfg->initUlBwp.pucchPresent = true;
8459            memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
8460            extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg); 
8461         }
8462      }
8463      if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
8464         macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
8465    }
8466    return ret;
8467 }
8468 /*******************************************************************
8469  *
8470  * @brief Fills Reconfig Cell group Info received by CU
8471  *
8472  * @details
8473  *
8474  *    Function : extractUeReCfgCellInfo
8475  *
8476  *    Functionality: Fills Reconfig Cell group Info received by CU
8477  *
8478  * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
8479  *             MacUeCfg*  macUeCfg
8480  * @return ROK/RFAILED
8481  *
8482  * ****************************************************************/
8483 uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg)
8484 {
8485    uint8_t ret = ROK;
8486    MAC_CellGroupConfig_t     *macCellGroup = NULLP;
8487    PhysicalCellGroupConfig_t *phyCellGrpCfg = NULLP;
8488    SpCellConfig_t            *spcellCfg = NULLP;
8489    ServingCellConfig_t       *servCellCfg = NULLP;
8490
8491    if(cellGrp)
8492    {
8493       /* Fill MacCell Group Reconfig  */
8494       if(cellGrp->mac_CellGroupConfig)
8495       {
8496          macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
8497          if(macCellGroup->schedulingRequestConfig)
8498          {
8499             extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
8500          }
8501          if(macCellGroup->tag_Config)
8502          {
8503             extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
8504          }
8505          if(macCellGroup->bsr_Config)
8506          {
8507             macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
8508             macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer     = macCellGroup->bsr_Config->retxBSR_Timer;
8509             if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
8510             {
8511                macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer  =\
8512                   *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
8513             }
8514          }
8515          if(macCellGroup->phr_Config)
8516          {
8517             if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
8518             {
8519                macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
8520                if(macCellGroup->phr_Config->choice.setup)
8521                {
8522                 macUeCfg->macCellGrpCfg.phrCfg.periodicTimer     = \
8523                    macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
8524                 macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer     = \
8525                    macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
8526                 macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor     = \
8527                    macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
8528                 macUeCfg->macCellGrpCfg.phrCfg.multiplePHR       = \
8529                    macCellGroup->phr_Config->choice.setup->multiplePHR;
8530                 macUeCfg->macCellGrpCfg.phrCfg.dummy             = \
8531                    macCellGroup->phr_Config->choice.setup->dummy;
8532                 macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
8533                    macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
8534                 macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG        = \
8535                    macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
8536                }
8537             }
8538          }
8539       }
8540       /* Fill Physical Cell Group Reconfig */
8541       if(cellGrp->physicalCellGroupConfig)
8542       {
8543          phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
8544          if(phyCellGrpCfg->p_NR_FR1)
8545          {
8546             if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
8547                macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
8548          }
8549          macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
8550       }
8551       /* Fill SpCell Reconfig */
8552       if(cellGrp->spCellConfig)
8553       {
8554          spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));  
8555          if(spcellCfg->servCellIndex)
8556          {
8557             macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
8558          }
8559          /* Fill Serving cell Reconfig info */
8560          if(cellGrp->spCellConfig->spCellConfigDedicated)
8561          {
8562             servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
8563             ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
8564             if(ret == RFAILED)
8565             {
8566                DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
8567             }
8568          }
8569       }
8570    }
8571    return ret;
8572 }
8573 /*******************************************************************
8574 *
8575 * @brief free the memory allocated by decoder
8576 *
8577 * @details
8578 *
8579 *    Function : freeAperDecodeNrcgi 
8580 *
8581 *    Functionality: Free Nrcgi values
8582 *
8583 * @params[in] NRCGI_t *nrcgi
8584 * @return void
8585 *
8586 * ****************************************************************/
8587
8588
8589 void freeAperDecodeNrcgi(NRCGI_t *nrcgi)
8590 {
8591     if(nrcgi->pLMN_Identity.buf != NULLP)
8592     {
8593        free(nrcgi->pLMN_Identity.buf);
8594     }
8595     if(nrcgi->nRCellIdentity.buf != NULLP)
8596     {
8597        free(nrcgi->nRCellIdentity.buf);
8598     }
8599 }
8600 /*******************************************************************
8601 *
8602 * @brief free the memory allocated by decoder
8603 *
8604 * @details
8605 *
8606 *    Function : freeAperDecodeCuToDuInfo 
8607 *
8608 *    Functionality:  Free Cu To Du Information
8609 *
8610 * @params[in] CUtoDURRCInformation_t *rrcMsg
8611 * @return void
8612 *
8613 * ****************************************************************/
8614
8615
8616 void freeAperDecodeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
8617 {
8618    uint8_t ieIdx =0;
8619    uint8_t arrIdx =0;
8620
8621    if(rrcMsg->uE_CapabilityRAT_ContainerList)
8622    {
8623       if(rrcMsg->uE_CapabilityRAT_ContainerList->buf)
8624          free(rrcMsg->uE_CapabilityRAT_ContainerList->buf);
8625       free(rrcMsg->uE_CapabilityRAT_ContainerList);
8626    }
8627
8628    if(rrcMsg->iE_Extensions)
8629    {
8630       if(rrcMsg->iE_Extensions->list.array)
8631       {
8632          for(ieIdx= 0; ieIdx < rrcMsg->iE_Extensions->list.count; ieIdx++)
8633          {
8634             if(rrcMsg->iE_Extensions->list.array[ieIdx])
8635             {
8636                switch(rrcMsg->iE_Extensions->list.array[ieIdx]->id)
8637                {
8638                   case ProtocolIE_ID_id_CellGroupConfig:
8639                      if(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
8640                      {
8641                         free(rrcMsg->iE_Extensions->list.array[ieIdx]->extensionValue.choice.CellGroupConfig.buf);
8642                      }
8643                      break;
8644                   default:
8645                      DU_LOG("\nERROR  -->  F1AP : Invalid Event type %ld at FreeCuToDuInfo()", \
8646                            rrcMsg->iE_Extensions->list.array[ieIdx]->id);
8647                      break;
8648                }
8649             }
8650          }
8651          for(arrIdx = 0; arrIdx < ieIdx; arrIdx++)
8652          {
8653             free(rrcMsg->iE_Extensions->list.array[arrIdx]);
8654          }
8655          free(rrcMsg->iE_Extensions->list.array);
8656
8657       }
8658
8659       free(rrcMsg->iE_Extensions);
8660    }
8661 }
8662 /*******************************************************************
8663 *
8664 * @brief free the memory allocated by decoder
8665 *
8666 * @details 
8667 *
8668 *    Function : freeAperDecodeSplCellList
8669 *
8670 *    Functionality: Free Spl Cell List 
8671                     where memory allocated by aper_decoder
8672 *
8673 * @params[in]  SCell_ToBeSetup_List_t *spCellLst
8674 * @return void
8675 *
8676 * ****************************************************************/
8677
8678
8679 void freeAperDecodeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
8680 {
8681     uint8_t  cellIdx =0;
8682
8683     if(spCellLst->list.array != NULLP)
8684     {
8685        for(cellIdx=0; cellIdx<spCellLst->list.count; cellIdx++)
8686        {
8687           if(cellIdx==0&&spCellLst->list.array[cellIdx]!=NULLP)
8688           {
8689              freeAperDecodeNrcgi(&spCellLst->list.array[cellIdx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
8690           }
8691           if(spCellLst->list.array[cellIdx]!=NULLP)
8692           {
8693              free(spCellLst->list.array[cellIdx]);
8694           }
8695        }
8696        free(spCellLst->list.array);
8697     }
8698 }
8699 /*******************************************************************
8700 *
8701 * @brief free the memory allocated by decoder
8702 *
8703 * @details
8704 *
8705 *    Function : freeAperDecodeSRBSetup 
8706 *
8707 *    Functionality: added free part for the memory allocated by aper_decoder
8708 *
8709 * @params[in] SRBs_ToBeSetup_List_t *srbSet
8710 * @return void
8711 *
8712 ****************************************************************/
8713
8714
8715 void freeAperDecodeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
8716 {
8717     uint8_t srbIdx =0;
8718     if(srbSet->list.array != NULLP)
8719     {
8720        for(srbIdx=0; srbIdx<srbSet->list.count; srbIdx++)
8721        {
8722           if(srbSet->list.array[srbIdx]!=NULLP)
8723           {
8724              free(srbSet->list.array[srbIdx]);
8725           }
8726        }
8727        free(srbSet->list.array);
8728     }
8729 }
8730
8731 /*******************************************************************
8732 *
8733 * @brief free the memory allocated by decoder
8734 *
8735 * @details
8736 *
8737 *    Function : freeAperDecodeULTnlInfo
8738 *
8739 *    Functionality: added free part for the memory allocated by aper_decoder
8740 *
8741 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
8742 * @return void
8743 *
8744 * ****************************************************************/
8745
8746
8747 void freeAperDecodeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
8748 {
8749    uint8_t ulIdx=0;
8750    if(ulInfo->list.array != NULLP)
8751    {
8752       for(ulIdx=0; ulIdx<ulInfo->list.count; ulIdx++)
8753       {
8754          if(ulIdx==0&&ulInfo->list.array[ulIdx]!=NULLP)
8755          {
8756             if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
8757             {
8758                if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
8759                      transportLayerAddress.buf != NULLP)
8760                {
8761                   if(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
8762                         !=NULLP)
8763                   {
8764                      free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf);
8765                   }
8766                   free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel->\
8767                         transportLayerAddress.buf);
8768                }
8769                free(ulInfo->list.array[ulIdx]->uLUPTNLInformation.choice.gTPTunnel);
8770             }
8771          }
8772          if(ulInfo->list.array[ulIdx]!=NULLP)
8773          {
8774             free(ulInfo->list.array[ulIdx]);
8775          }
8776       }
8777       free(ulInfo->list.array);
8778    }
8779 }
8780 /*******************************************************************
8781 *
8782 * @brief free the memory allocated by decoder
8783 *
8784 * @details
8785 *
8786 *    Function : freeAperDecodeDRBSetup  
8787 *
8788 *    Functionality: free DRBSetup which is allocated by decoder
8789 *
8790 * @params[in]  DRBs_ToBeSetup_List_t *drbSet
8791 * @return void
8792 *
8793 * ****************************************************************/
8794
8795 void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
8796 {
8797    DRBs_ToBeSetup_Item_t *drbSetItem = NULLP;
8798    uint8_t  flowIdx =0;
8799    uint8_t  drbIdx =0;
8800    
8801    if(drbSet->list.array != NULLP)
8802    {
8803       for(drbIdx=0; drbIdx<drbSet->list.count; drbIdx++)
8804       {
8805          if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
8806          {
8807             drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
8808             if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
8809             {
8810                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
8811                      qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
8812                {
8813                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
8814                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
8815                   {
8816                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
8817                            qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
8818                      {
8819
8820                         if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
8821                         {
8822
8823                            if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
8824                            {
8825
8826                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
8827                               buf!=NULLP)
8828                               {
8829
8830                                  if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
8831                                        flows_Mapped_To_DRB_List.list.array != NULLP)
8832                                  {
8833
8834                                     for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8835                                     DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
8836                                     {
8837
8838                                        if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8839                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
8840                                        {
8841                                           if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8842                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
8843                                                 qoSFlowLevelQoSParameters.\
8844                                                 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
8845                                           {
8846                                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8847                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
8848                                                    qoSFlowLevelQoSParameters.\
8849                                                    qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
8850                                              {
8851
8852                                                 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8853                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
8854                                                       qoSFlowLevelQoSParameters.\
8855                                                       qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
8856                                                 {
8857                                                    freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
8858                                                    free(drbSetItem->uLConfiguration);
8859
8860
8861                                                    free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8862                                                          DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
8863                                                          qoSFlowLevelQoSParameters.\
8864                                                          qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
8865                                                 }
8866
8867                                                 free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8868                                                       DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
8869                                                       qoSFlowLevelQoSParameters.\
8870                                                       qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
8871                                              }
8872
8873                                              free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8874
8875                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
8876                                                    qoSFlowLevelQoSParameters.\
8877                                                    qoS_Characteristics.choice.non_Dynamic_5QI);
8878                                           }
8879                                        }
8880                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8881                                              DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
8882                                        {
8883
8884                                           free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8885                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
8886                                        }
8887                                     }
8888
8889                                     free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8890                                           DRB_Information.flows_Mapped_To_DRB_List.list.array);
8891                                  }
8892
8893                                  free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
8894                                  DRB_Information.sNSSAI.sD->buf);
8895                               }
8896
8897                               free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
8898                            }
8899
8900                            free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
8901
8902                         }
8903
8904                         free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
8905
8906                               qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
8907                      }
8908
8909                      free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
8910                            qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
8911                   }
8912
8913                   free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
8914                         qoS_Characteristics.choice.non_Dynamic_5QI);
8915                }
8916                free(drbSetItem->qoSInformation.choice.choice_extension);
8917             }
8918          }
8919          if(drbSet->list.array[drbIdx]!=NULLP)
8920          {
8921             free(drbSet->list.array[drbIdx]);
8922          }
8923       }
8924       free(drbSet->list.array);
8925    }
8926 }
8927
8928
8929 /*******************************************************************
8930  *
8931  * @brief builds Mac Cell Cfg
8932  *
8933  * @details
8934  *
8935  *    Function : procUeReCfgCellInfo
8936  *
8937  *    Functionality: builds Mac Cell Cfg
8938  *
8939  * @params[in] MacUeCfg pointer
8940  *             void pointer
8941  *
8942  * @return void 
8943  *
8944  * ****************************************************************/
8945 uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, void *cellInfo)
8946 {
8947    uint8_t ret = ROK;
8948    CellGroupConfigRrc_t *cellGrp = NULLP;
8949
8950    if(cellInfo)
8951    {
8952       cellGrp = (CellGroupConfigRrc_t *)cellInfo;
8953       ret = extractUeReCfgCellInfo(cellGrp, macUeCfg);
8954       if(ret == RFAILED)
8955          DU_LOG("\nERROR  -->  F1AP : Failed at procUeReCfgCellInfo()");
8956    }
8957    if(ret == RFAILED)
8958    {
8959       freeUeReCfgCellGrpInfo(macUeCfg);
8960    }
8961    return ret;
8962 }
8963
8964 /*******************************************************************
8965  *
8966  * @brief Filling modulation info in mac ue cfg
8967  *
8968  * @details
8969  *
8970  *    Function : duFillModulationDetails
8971  *
8972  *    Functionality: Filling modulation info in mac ue cfg
8973  *
8974  * @params[in] MAC UE Config to be updated
8975  *             Current UE configuration
8976  *             UE NR capability from CU
8977  * @return ROK     - success
8978  *         RFAILED - failure
8979  *
8980  * ****************************************************************/
8981 void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
8982 {
8983    UE_NR_Capability_t *ueNrCap;
8984
8985    if(ueCap)
8986       ueNrCap = (UE_NR_Capability_t *)ueCap;
8987
8988    /* Filling DL modulation info */
8989    if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
8990          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
8991          ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
8992    {
8993       switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
8994       {
8995          case ModulationOrder_qpsk:
8996             {
8997                ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
8998                break;
8999             }
9000          case ModulationOrder_qam16:
9001             {
9002                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
9003                break;
9004             }
9005          case ModulationOrder_qam64:
9006             {
9007                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
9008                ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
9009                ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
9010                break;
9011             }
9012          case ModulationOrder_qam256:
9013             {
9014                ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
9015                break;
9016             }
9017          default:
9018             {
9019                DU_LOG("\nERROR  -->  DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
9020                memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9021                break;
9022             }
9023       }
9024    }
9025    else
9026    {
9027       memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
9028    }
9029
9030    /* Filling UL modulation info */
9031    if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
9032          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
9033          ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
9034    {
9035       switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
9036       {
9037          case ModulationOrder_qpsk:
9038             {
9039                ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
9040                break;
9041             }
9042          case ModulationOrder_qam16:
9043             {
9044                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
9045                ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
9046                ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
9047                break;
9048             }
9049          case ModulationOrder_qam64:
9050             {
9051                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
9052                break;
9053             }
9054          case ModulationOrder_qam256:
9055             {
9056                ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
9057                break;
9058             }
9059          default:
9060             {
9061                DU_LOG("\nERROR  -->  DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
9062                memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9063                break;
9064             }
9065       }
9066    }
9067    else
9068    {
9069       memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
9070    }
9071 }
9072
9073 /*******************************************************************
9074  *
9075  * @brief Function to extract cellGrp Info present in cutoDu cont
9076  *
9077  * @details
9078  *
9079  *    Function : extractCellGrpInfo
9080  *
9081  *    Functionality: Function to extract cellGrp Info present
9082  *                   in cutoDu cont
9083  *
9084  * @params[in] ProtocolExtensionContainer_4624P16_t pointer
9085  *
9086  * @return CellGroupConfigRrc_t *
9087  *
9088  * ****************************************************************/
9089
9090 CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
9091    DuUeCfg *ueCfgDb)
9092 {
9093    uint8_t idx2 =0;
9094    uint16_t id =0;
9095    uint16_t recvBufLen =0;
9096    CellGroupConfigRrc_t *cellGrpCfg = NULLP;
9097    CUtoDURRCInformation_ExtIEs_t *extIeInfo = NULLP;
9098    asn_dec_rval_t rval; /* Decoder return value */
9099    memset(&rval, 0, sizeof(asn_dec_rval_t));
9100
9101    if(protocolIeExtn)
9102    {
9103       for(idx2 = 0; idx2 < protocolIeExtn->list.count; idx2++)
9104       {
9105          extIeInfo = ((CUtoDURRCInformation_ExtIEs_t *)(protocolIeExtn->list.array[idx2]));
9106          id = extIeInfo->id;
9107          switch(id)
9108          {
9109             case ProtocolIE_ID_id_CellGroupConfig:
9110             {
9111                recvBufLen = extIeInfo->extensionValue.choice.CellGroupConfig.size;
9112                /* decoding the CellGroup Buf received */
9113                DU_ALLOC(cellGrpCfg, sizeof(CellGroupConfigRrc_t));
9114                if(cellGrpCfg)
9115                {
9116                   memset(cellGrpCfg, 0, sizeof(CellGroupConfigRrc_t));
9117                   rval = aper_decode(0, &asn_DEF_CellGroupConfigRrc, (void **)&cellGrpCfg,
9118                      extIeInfo->extensionValue.choice.CellGroupConfig.buf, recvBufLen, 0, 0);
9119                   if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9120                   {
9121                      DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9122                      return NULLP;
9123                   }
9124                   xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, cellGrpCfg);
9125                   if(extractRlcCfgToAddMod(cellGrpCfg->rlc_BearerToAddModList, ueCfgDb))
9126                      return NULLP;
9127                }
9128                break;
9129             }
9130             default:
9131                DU_LOG("\nERROR  -->  F1AP : Invalid IE received CUtoDURRCInformation:%d at decodeCellGrpCfg()", id);
9132                break;
9133          }
9134       }
9135    }
9136    return cellGrpCfg;
9137 }
9138
9139 /*******************************************************************
9140  *
9141  * @brief Fills Srb List received by CU
9142  *
9143  * @details
9144  *
9145  *    Function : procSrbListToSetup
9146  *
9147  *    Functionality: Fills Srb List received  by CU
9148  *
9149  * @params[in] SRBs_ToBeSetup_Item_t *cuSrbItem
9150  *             LcCfg pointer
9151  *             RlcBearerCfg pointer
9152  * @return void
9153  *
9154  * ****************************************************************/
9155 uint8_t procSrbListToSetup(SRBs_ToBeSetup_Item_t * srbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
9156 {
9157    uint8_t ret = ROK;
9158
9159    /* Filling RLC INFO */
9160    procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
9161
9162    /* Filling MAC INFO */
9163    ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL, NULL, macLcToAdd);
9164    if(ret == RFAILED)
9165    { 
9166       DU_LOG("\nERROR  -->  F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
9167       return ret;
9168    }
9169    return ret;
9170 }
9171
9172
9173
9174 /*******************************************************************
9175  *
9176  * @brief extract Srb List received by CU
9177  *
9178  * @details
9179  *
9180  *    Function : extractSrbListToSetup
9181  *
9182  *    Functionality: extract Srb List received by CU
9183  *                   for both MAC and RLC
9184  *
9185  * @params[in] SRBs_ToBeSetup_Item_t pointer
9186  *             DuUeCfg pointer
9187  * @return ROK/RFAIED
9188  *
9189  * ****************************************************************/
9190
9191 uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
9192 {
9193    uint8_t ret, srbIdx;
9194    SRBs_ToBeSetup_Item_t *srbItem = NULLP;
9195
9196    if(srbCfg)
9197    {
9198       for(srbIdx = 0; srbIdx < srbCfg->list.count; srbIdx++)
9199       {
9200          srbItem = &srbCfg->list.array[srbIdx]->value.choice.SRBs_ToBeSetup_Item;
9201          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9202          { 
9203             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in MAC");
9204             ret = RFAILED;
9205             break;
9206          }
9207          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9208          {
9209             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in RLC");
9210             ret = RFAILED;
9211             break;
9212          }
9213          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9214          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9215          ret = procSrbListToSetup(srbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9216             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
9217          ueCfgDb->numRlcLcs++;
9218          ueCfgDb->numMacLcs++;
9219          if(ret == RFAILED)
9220          {
9221             DU_LOG("\nERROR  -->  F1AP:  Failed at extractSrbListToSetup()");
9222             break;
9223          }
9224       }
9225    }
9226    else
9227       ret = RFAILED;
9228
9229    return ret;
9230 }
9231
9232 /*******************************************************************
9233  *
9234  * @brief Fills Drb List received by CU
9235  *
9236  * @details
9237  *
9238  *    Function : procDrbListToSetup
9239  *
9240  *    Functionality: Fills Drb List received by CU
9241  *                   for both MAC and RLC
9242  *
9243  * @params[in] SRBs_ToBeSetup_Item_t pointer
9244  *             LcCfg pointer,
9245  *             RlcBearerCfg pointer
9246  * @return void
9247  *
9248  * ****************************************************************/
9249
9250 uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
9251 {
9252    uint8_t ret = ROK;
9253
9254    /* Filling RLC INFO */
9255    procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
9256
9257    /* Filling MAC INFO */
9258    ret = procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, macLcToAdd);
9259    if(ret == RFAILED)
9260    { 
9261       DU_LOG("\nERROR  -->  F1AP : Failed at RLC LC Cfg in extractDrbListToSetup()");
9262       return ret;
9263    }
9264
9265    return ret;
9266 }
9267
9268 /*******************************************************************
9269  *
9270  * @brief extract Drb List received by CU
9271  *
9272  * @details
9273  *
9274  *    Function : extractDrbListToSetup
9275  *
9276  *    Functionality: extract Drb List received by CU
9277  *                   for both MAC and RLC
9278  *
9279  * @params[in] DRBs_ToBeSetup_Item_t pointer
9280  *             DuUeCfg pointer
9281  * @return ROK/RFAIED
9282  *
9283  * ****************************************************************/
9284
9285 uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg, DuUeCfg *ueCfgDb)
9286 {
9287    uint8_t ret, drbIdx;
9288    DRBs_ToBeSetup_Item_t *drbItem = NULLP;
9289
9290    ret = ROK;
9291    if(drbCfg)
9292    {
9293       for(drbIdx = 0; drbIdx < drbCfg->list.count; drbIdx++)
9294       {
9295          drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
9296          if(ueCfgDb->numMacLcs > MAX_NUM_LC)
9297          { 
9298             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in MAC ");
9299             ret = RFAILED;
9300             break;
9301          }
9302          if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
9303          {
9304             DU_LOG("\nERROR   -->  F1AP:  MAX LC Reached in RLC");
9305             ret = RFAILED;
9306             break;
9307          }
9308          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
9309          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
9310          ret = procDrbListToSetup(lcId, drbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
9311             &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
9312          ueCfgDb->numRlcLcs++;
9313          ueCfgDb->numMacLcs++;
9314          if(ret == RFAILED)
9315          {
9316             DU_LOG("\nERROR  -->  F1AP :  Failed at extractDrbListToSetup()");
9317             break;
9318          }
9319       }
9320    }
9321    else
9322       ret = RFAILED;
9323
9324    return ret;
9325 }
9326
9327 /*******************************************************************
9328  *
9329  * @brief Function to extract Dl RRC Msg received from CU
9330  *
9331  * @details
9332  *
9333  *    Function : extractDlRrcMsg
9334  *
9335  *    Functionality: Function to extract Dl RRC Msg received from CU
9336  *
9337  * @params[in] F1AP message
9338  * @return ROK     - success
9339  *         RFAILED - failure
9340  *
9341  * ****************************************************************/
9342
9343 uint8_t extractDlRrcMsg(uint32_t gnbDuUeF1apId, uint32_t gnbCuUeF1apId, \
9344    F1DlRrcMsg *dlRrcMsg, RRCContainer_t *rrcContainer)
9345 {
9346    uint8_t ret = ROK;
9347    dlRrcMsg->rrcMsgSize = rrcContainer->size;
9348    if(dlRrcMsg->rrcMsgSize > 0)
9349    {
9350       DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
9351       if(!dlRrcMsg->rrcMsgPdu)
9352       {
9353          DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for RRC Msg in procUeCtxtSetupReq");
9354          ret = RFAILED;
9355       }
9356       else
9357       {
9358          dlRrcMsg->gnbDuUeF1apId = gnbDuUeF1apId;
9359          dlRrcMsg->gnbCuUeF1apId = gnbCuUeF1apId;
9360          dlRrcMsg->srbId = SRB1_LCID;
9361          memcpy(dlRrcMsg->rrcMsgPdu, rrcContainer->buf, dlRrcMsg->rrcMsgSize);
9362       }
9363    }
9364    return ret;
9365 }
9366
9367 /*******************************************************************
9368  *
9369  * @brief Extract UE capability info 
9370  *
9371  * @details
9372  *
9373  *    Function : extractUeCapability
9374  *
9375  *    Functionality: Extract UE capability info and stores in ue Cb
9376  *
9377  * @params[in] Octet string of UE capability RAT container list
9378  * @return ROK     - success
9379  *         RFAILED - failure
9380  *
9381  * ****************************************************************/
9382 UE_NR_Capability_t *extractUeCapability(UE_CapabilityRAT_ContainerList_t *ueCapablityListBuf, DuUeCb *ueCb)
9383 {
9384    uint8_t  idx;
9385    uint16_t recvBufLen;
9386    asn_dec_rval_t rval;
9387    UE_NR_Capability_t  *ueNrCap = NULLP;
9388    UE_CapabilityRAT_ContainerListRRC_t  *ueCapRatContList = NULLP;
9389
9390    /* Decoding UE Capability RAT Container List */
9391    recvBufLen = ueCapablityListBuf->size;
9392    DU_ALLOC(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9393    if(!ueCapRatContList)
9394    {
9395       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
9396       return NULLP;
9397    }
9398    memset(ueCapRatContList, 0, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9399    memset(&rval, 0, sizeof(asn_dec_rval_t));
9400    rval = aper_decode(0, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, (void **)&ueCapRatContList,
9401           ueCapablityListBuf->buf, recvBufLen, 0, 0);
9402    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9403    {
9404       DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9405       return NULLP;
9406    }
9407    xer_fprint(stdout, &asn_DEF_UE_CapabilityRAT_ContainerListRRC, ueCapRatContList);
9408
9409    /* Free encoded buffer after decoding */
9410
9411    for(idx = 0; idx < ueCapRatContList->list.count; idx++)
9412    {
9413       if(ueCapRatContList->list.array[idx]->rat_Type == RAT_Type_nr)
9414       {
9415          /* Decoding UE NR Capability */
9416           recvBufLen = ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.size;
9417           DU_ALLOC(ueNrCap, sizeof(UE_NR_Capability_t));
9418           if(!ueNrCap)
9419           {
9420              DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in extractUeCapability");
9421              DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9422              return NULLP;
9423           } 
9424           memset(ueNrCap, 0, sizeof(UE_NR_Capability_t));
9425           memset(&rval, 0, sizeof(asn_dec_rval_t));
9426           rval = aper_decode(0, &asn_DEF_UE_NR_Capability, (void **)&ueNrCap,
9427                  ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf, recvBufLen, 0, 0);
9428           if(rval.code == RC_FAIL || rval.code == RC_WMORE)
9429           {
9430              DU_LOG("\nERROR  -->  F1AP : ASN decode failed at decodeCellGrpCfg()");
9431              return NULLP;
9432           }
9433           xer_fprint(stdout, &asn_DEF_UE_NR_Capability, ueNrCap);
9434           
9435           /* Free encoded buffer after decoding */
9436           free(ueCapRatContList->list.array[idx]->ue_CapabilityRAT_Container.buf);
9437       }
9438       free(ueCapRatContList->list.array[idx]);
9439    }
9440
9441    /* Free Memory*/
9442    free(ueCapRatContList->list.array);
9443    DU_FREE(ueCapRatContList, sizeof(UE_CapabilityRAT_ContainerListRRC_t));
9444    return ueNrCap;
9445 }
9446  
9447 /*******************************************************************
9448 *
9449 * @brief free UE context setup request from CU
9450 *
9451 * @details
9452 *
9453 *    Function : freeAperDecodeF1UeContextSetupReq
9454 *
9455 *    Functionality: freeing part for the memory allocated by aper_decoder
9456 *
9457 * @params[in] F1AP message
9458 * @return ROK     - success
9459 *         RFAILED - failure
9460 *
9461 * ****************************************************************/
9462 void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t   *ueSetReq)
9463 {
9464    uint8_t ieIdx = 0;
9465
9466    if(ueSetReq->protocolIEs.list.array != NULLP)
9467    {
9468       for(ieIdx = 0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++)
9469       {
9470          if(ueSetReq->protocolIEs.list.array[ieIdx])
9471          {
9472             switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
9473             {
9474                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9475                   break;
9476                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9477                   break;
9478                case ProtocolIE_ID_id_SpCell_ID:
9479                   freeAperDecodeNrcgi(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.NRCGI);
9480                   break;
9481                case ProtocolIE_ID_id_ServCellIndex:
9482                   break;
9483                case ProtocolIE_ID_id_SpCellULConfigured:
9484                   break;
9485                case ProtocolIE_ID_id_CUtoDURRCInformation:
9486
9487                   freeAperDecodeCuToDuInfo(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation);
9488                   break;
9489                case ProtocolIE_ID_id_SCell_ToBeSetup_List:
9490
9491                   freeAperDecodeSplCellList(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SCell_ToBeSetup_List);
9492                   break;
9493                case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
9494
9495                   freeAperDecodeSRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List);
9496                   break;
9497                case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
9498
9499                   freeAperDecodeDRBSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List);
9500                   break;
9501                case ProtocolIE_ID_id_RRCContainer:
9502                   {
9503
9504                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf != NULLP)
9505                      {
9506
9507                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
9508                      }
9509                      break;
9510                   }
9511                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
9512                   break;
9513                case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
9514                   {
9515                      if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf)
9516                      {
9517                         free(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf);
9518                      }
9519                      break;
9520                   }
9521                default:
9522                   DU_LOG("\nERROR  -->  F1AP: Invalid event type %ld " ,ueSetReq->protocolIEs.list.array[ieIdx]->id);
9523             } 
9524             free(ueSetReq->protocolIEs.list.array[ieIdx]);
9525          }
9526       }
9527       free(ueSetReq->protocolIEs.list.array);
9528    }
9529 }
9530 /*******************************************************************
9531  *
9532  * @brief Process UE context setup request from CU
9533  *
9534  * @details
9535  *
9536  *    Function : procF1UeContextSetupReq
9537  *
9538  *    Functionality: Process UE context setup request from CU
9539  *
9540  * @params[in] F1AP message
9541  * @return ROK     - success
9542  *         RFAILED - failure
9543  *
9544  * ****************************************************************/
9545 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
9546 {
9547    uint8_t  ret, ieIdx, ueIdx, lcId, cellIdx;
9548    bool ueCbFound = false;
9549    uint32_t gnbCuUeF1apId, gnbDuUeF1apId, bitRateSize;
9550    DuUeCb   *duUeCb = NULLP;
9551    UEContextSetupRequest_t   *ueSetReq = NULLP;
9552     
9553    ret = ROK;
9554    
9555    ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
9556    for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
9557    {
9558       switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
9559       {
9560          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9561             {
9562                gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
9563                break;
9564             }
9565          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9566             {
9567                gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
9568                break;
9569             }
9570          case ProtocolIE_ID_id_ServCellIndex:
9571             {
9572                cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
9573                for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
9574                {
9575                   if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
9576                      (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
9577                   {
9578                      ueCbFound = true;
9579                      duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
9580                      DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
9581                      if(duUeCb->f1UeDb)
9582                      {
9583                         memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
9584                         duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
9585                         duUeCb->f1UeDb->cellIdx = cellIdx;
9586                      }
9587                      else
9588                      {
9589                         DU_LOG("\nERROR  -->  F1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
9590                         ret = RFAILED;
9591                      }
9592                   }
9593                   else
9594                      ueCbFound = false;
9595                   
9596                }
9597                if(!ueCbFound)
9598                {
9599                   DU_LOG("\nERROR  -->  F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
9600                   ret = RFAILED;
9601                }
9602                break;
9603             }
9604          case ProtocolIE_ID_id_SpCellULConfigured:
9605             /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL, 
9606             UL, SUL or UL+SUL for the indicated cell for the UE */
9607             break;
9608          case ProtocolIE_ID_id_CUtoDURRCInformation:
9609             {
9610                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList)
9611                {
9612                   duUeCb->f1UeDb->duUeCfg.ueNrCapability = \
9613                      extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
9614                         uE_CapabilityRAT_ContainerList, duUeCb);
9615                }
9616                if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
9617                {
9618                   duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
9619                      value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
9620                   if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
9621                   {
9622                      DU_LOG("\nERROR  -->  F1AP: Failed to extract cell Grp Info");
9623                      //TODO: Update the failure cause in ue context Setup Response
9624                      ret = RFAILED;
9625                   }
9626                }
9627                break;
9628             } 
9629          case ProtocolIE_ID_id_SCell_ToBeSetup_List:
9630             {
9631                DU_LOG("\nINFO   -->  DU_APP: Received SCell_ToBeSetup_List but  Not processing the list");
9632             break;
9633             }
9634          case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
9635             {
9636                if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
9637                   &duUeCb->f1UeDb->duUeCfg))
9638                {
9639                   DU_LOG("\nERROR  -->  DU APP : Failed at extractSrbListToSetup()");
9640                   //TODO: Update the failure cause in ue context Setup Response
9641                   ret = RFAILED;
9642                }
9643                break;
9644             }
9645          case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
9646             {
9647                lcId = getDrbLcId(&duUeCb->drbBitMap);
9648                if(lcId != RFAILED)
9649                {
9650                   if(extractDrbListToSetup(lcId, &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List,\
9651                      &duUeCb->f1UeDb->duUeCfg))
9652                   {
9653                      DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
9654                      //TODO: Update the failure cause in ue context Setup Response
9655                      ret = RFAILED;
9656                   }
9657                }
9658                else 
9659                   ret = RFAILED;
9660                break;
9661             }
9662          case ProtocolIE_ID_id_RRCContainer:
9663             {
9664                /* Filling Dl RRC Msg Info */
9665                DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
9666                if(!duUeCb->f1UeDb->dlRrcMsg)
9667                {
9668                   DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
9669                   ret = RFAILED;
9670                }
9671                else
9672                {
9673                   memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
9674                   ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
9675                      &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
9676                }          
9677                break;
9678             }
9679          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
9680             {
9681                if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
9682                {
9683                   duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
9684                }
9685                else
9686                {
9687                   DU_LOG("\nERROR  -->  Ignoring delivery report, since rrcContainer is not present");
9688                }
9689                break;
9690             }
9691          case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
9692              {
9693                /* MaximumBitRate Uplink */
9694                bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
9695                if(bitRateSize > 0)
9696                {
9697                   DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
9698                   if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
9699                   {
9700                      DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
9701                      ret = RFAILED;
9702                   }
9703                   else
9704                   {
9705                      memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg)); 
9706                      memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
9707                      ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
9708                      duUeCb->f1UeDb->duUeCfg.ambrCfg->dlBr = 0;
9709                   }
9710                }
9711                else
9712                   ret = RFAILED;
9713                break;
9714             }
9715          default:
9716             {
9717                break;
9718             }
9719       }
9720    }
9721    if(ret == RFAILED)
9722    {
9723       /*TODO : Negative case*/
9724       // BuildAndSendUeContextSetupRsp(ueIdx, cellId);
9725       DU_LOG("\nERROR  -->  F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); 
9726    }
9727    else
9728       ret = duProcUeContextSetupRequest(duUeCb);
9729    
9730    freeAperDecodeF1UeContextSetupReq(ueSetReq); 
9731    return ret;
9732
9733 }
9734
9735 /*******************************************************************
9736  * @brief Free the memory allocated for UE Setup response
9737  *
9738  * @details
9739  *
9740  *    Function : FreeUeContextSetupRsp
9741  *
9742  *    Functionality:
9743  *       Free the memory allocated for UE Setup response
9744  *
9745  * @params[in] F1AP PDU for UE setup response
9746  * @return ROK     - success
9747  *         RFAILED - failure
9748  *
9749  * ****************************************************************/
9750 void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
9751 {
9752    uint8_t idx;
9753    UEContextSetupResponse_t *ueSetRsp = NULLP;
9754
9755    if(f1apMsg)
9756    {
9757       if(f1apMsg->choice.successfulOutcome)
9758       {
9759          ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
9760                     UEContextSetupResponse;
9761          if(ueSetRsp->protocolIEs.list.array)
9762          {
9763             for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
9764             {
9765                if(ueSetRsp->protocolIEs.list.array[idx])
9766                {
9767                   switch(ueSetRsp->protocolIEs.list.array[idx]->id)
9768                   {
9769                      case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
9770                         break;
9771                      case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
9772                         break;
9773                      case ProtocolIE_ID_id_DUtoCURRCInformation:
9774                         {
9775                            CellGroupConfig_t *cellGrpCfg = NULLP;
9776                            cellGrpCfg  = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
9777                                          DUtoCURRCInformation.cellGroupConfig;
9778                            if(cellGrpCfg->buf != NULLP)
9779                            {
9780                               DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
9781                               cellGrpCfg = NULLP;
9782                            }
9783                            break;
9784                         }
9785                      default:
9786                         DU_LOG("\nERROR  -->  DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
9787                         ueSetRsp->protocolIEs.list.array[idx]->id);
9788                         break;
9789                   }
9790                   DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
9791                         sizeof(UEContextSetupResponseIEs_t));
9792                }
9793             }
9794             DU_FREE(ueSetRsp->protocolIEs.list.array, \
9795                   ueSetRsp->protocolIEs.list.size);
9796          }
9797          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
9798       }
9799       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
9800    }
9801 }
9802
9803 /*******************************************************************
9804  *
9805  * @brief Builds Ue context Setup Rsp DU To CU Info
9806  *
9807  * @details
9808  *
9809  *    Function : EncodeUeCntxtDuToCuInfo
9810  *
9811  *    Functionality: Builds Ue context Setup Rsp DU To CU Info
9812  *
9813  * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t * 
9814  *
9815  * @return ROK     - success
9816  *         RFAILED - failure
9817  *
9818  ******************************************************************/
9819
9820 uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
9821 {
9822    asn_enc_rval_t        encRetVal;
9823
9824    xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
9825    memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
9826    encBufSize = 0;
9827    encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
9828    /* Encode results */
9829    if(encRetVal.encoded == ENCODE_FAIL)
9830    {
9831       DU_LOG( "\nERROR  -->  F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
9832             encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
9833       return RFAILED;
9834    }
9835    else
9836    {
9837       DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
9838       for(int i=0; i< encBufSize; i++)
9839       {
9840          printf("%x",encBuf[i]);
9841       }
9842    }
9843    duToCuCellGrp->size = encBufSize;
9844    DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
9845    if(!duToCuCellGrp->buf)
9846    {
9847       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
9848    }
9849    memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
9850    return ROK;
9851 }
9852
9853 /*******************************************************************
9854  *
9855  * @brief Builds and sends the UE Setup Response
9856  *
9857  * @details
9858  *
9859  *    Function : BuildAndSendUeContextSetupRsp
9860  *
9861  *    Functionality: Constructs the UE Setup Response and sends
9862  *                   it to the DU through SCTP.
9863  *
9864  * @params[in] 
9865  *
9866  * @return ROK     - success
9867  *         RFAILED - failure
9868  *
9869  * ****************************************************************/
9870 uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId)
9871 {
9872    uint8_t   idx, ret, cellIdx, elementCnt;
9873    uint32_t  gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
9874    uint32_t  gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
9875    asn_enc_rval_t  encRetVal;        /* Encoder return value */
9876    F1AP_PDU_t               *f1apMsg = NULLP;
9877    UEContextSetupResponse_t *ueSetRsp = NULLP;
9878    CellGroupConfigRrc_t     *cellGrpCfg = NULLP;
9879    DuUeCb                   *ueCb = NULLP;
9880
9881    DU_LOG("\n INFO   -->  F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
9882
9883    while(true)
9884    {
9885       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
9886       if(f1apMsg == NULLP)
9887       {
9888          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
9889          ret = RFAILED;
9890          break;
9891       }
9892
9893       f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
9894       DU_ALLOC(f1apMsg->choice.successfulOutcome,
9895             sizeof(SuccessfulOutcome_t));
9896       if(f1apMsg->choice.successfulOutcome == NULLP)
9897       {
9898          DU_LOG(" ERROR  -->  F1AP : Memory allocation for      F1AP-PDU failed");
9899          ret = RFAILED;
9900          break;
9901       }
9902
9903       f1apMsg->choice.successfulOutcome->procedureCode = \
9904                                                          ProcedureCode_id_UEContextSetup;
9905       f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
9906       f1apMsg->choice.successfulOutcome->value.present = \
9907                                                          SuccessfulOutcome__value_PR_UEContextSetupResponse;
9908
9909       ueSetRsp =
9910          &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
9911       elementCnt = 3;
9912       ueSetRsp->protocolIEs.list.count = elementCnt;
9913       ueSetRsp->protocolIEs.list.size = \
9914                                         elementCnt * sizeof(UEContextSetupResponse_t *);
9915
9916       /* Initialize the UESetup members */
9917       DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
9918             ueSetRsp->protocolIEs.list.size);
9919       if(ueSetRsp->protocolIEs.list.array == NULLP)
9920       {
9921          DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
9922          ret = RFAILED;
9923          break;
9924       }
9925
9926       for(idx=0; idx<elementCnt; idx++)
9927       {
9928          DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
9929                sizeof(UEContextSetupResponseIEs_t));
9930          if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
9931          {
9932             DU_LOG(" ERROR  -->  F1AP : Memory allocation for UE Setup Response failed");
9933             ret = RFAILED;
9934             break;
9935          }
9936       }
9937       /* Fetching Ue Cb Info*/
9938       GET_CELL_IDX(cellId, cellIdx);
9939       gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
9940       gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
9941       ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
9942
9943       idx = 0;
9944       /*GNB CU UE F1AP ID*/
9945       ueSetRsp->protocolIEs.list.array[idx]->id = \
9946                                                   ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
9947       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9948       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
9949                                                              UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
9950       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
9951
9952       /*GNB DU UE F1AP ID*/
9953       idx++;
9954       ueSetRsp->protocolIEs.list.array[idx]->id = \
9955                                                   ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
9956       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9957       ueSetRsp->protocolIEs.list.array[idx]->value.present = \
9958                                                              UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
9959       ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
9960
9961
9962       /*DUtoCURRC Information */
9963       idx++;
9964       ueSetRsp->protocolIEs.list.array[idx]->id  = \
9965                                                    ProtocolIE_ID_id_DUtoCURRCInformation;
9966       ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
9967       ueSetRsp->protocolIEs.list.array[idx]->value.present =\
9968                                                             UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
9969       if(ueCb->f1UeDb)
9970       {
9971          if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
9972          {
9973             cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
9974             ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
9975                      choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
9976             /* Free UeContext Db created during Ue context Req */
9977             freeF1UeDb(ueCb->f1UeDb);
9978             ueCb->f1UeDb = NULLP;
9979          }
9980       }
9981       else
9982       {
9983          DU_LOG("\nERROR  -->  F1AP: Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
9984          ret = RFAILED;
9985       }
9986       if(ret == RFAILED)
9987          break;
9988
9989       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
9990
9991       /* Encode the UE context setup response type as APER */
9992       memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
9993       encBufSize = 0;
9994       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
9995             encBuf);
9996       /* Encode results */
9997       if(encRetVal.encoded == ENCODE_FAIL)
9998       {
9999          DU_LOG( "\nERROR  -->  F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
10000                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10001          ret = RFAILED;
10002          break;
10003       }
10004       else
10005       {
10006          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for UE Context Setup Request\n");
10007          for(int i=0; i< encBufSize; i++)
10008          {
10009             printf("%x",encBuf[i]);
10010          }
10011       }
10012
10013       /* Sending  msg  */
10014       if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
10015       {
10016          DU_LOG("\nERROR  -->  F1AP : Sending UE Context Setup Request Failed");
10017          ret = RFAILED;
10018          break;
10019       }
10020       break;
10021    }
10022    FreeUeContextSetupRsp(f1apMsg);
10023    return ret;
10024 }/* End of BuildAndSendUeContextSetupRsp */
10025 /*******************************************************************
10026 *
10027 * @brief  Build And Send Ue Context Rsp 
10028 *
10029 * @details
10030 *
10031 *    Function : BuildAndSendUeCtxtRsp 
10032 *
10033 *    Functionality : Build And Send Ue Context Rsp
10034
10035 * @params[in]
10036 * @return sucess = ROK
10037 *         failure = RFAILED
10038 *
10039 * ****************************************************************/
10040 uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId)
10041 {
10042    uint8_t cellIdx = 0, actionType = 0; 
10043
10044    GET_CELL_IDX(cellId, cellIdx);
10045    actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
10046
10047    switch(actionType)
10048    {
10049       case UE_CTXT_SETUP:
10050          BuildAndSendUeContextSetupRsp(ueIdx, cellId);
10051          break;
10052       case UE_CTXT_MOD:
10053          //TODO: Build Ue context Modification Rsp
10054          break;
10055       default:
10056          DU_LOG("ERROR  -->  F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
10057          break;
10058
10059    }
10060    return ROK;
10061 }
10062
10063 /*******************************************************************
10064  *
10065  * @brief deallocating the memory of  F1reset msg
10066  *
10067  * @details
10068  *
10069  *    Function : FreeF1ResetReq
10070  *
10071  *    Functionality :
10072  *         - freeing memory of F1reset request msg
10073  *
10074  * @params[in]
10075  * @return void
10076  *
10077  *
10078  * ****************************************************************/
10079 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
10080 {
10081    uint8_t idx =0 ;
10082    Reset_t *f1ResetMsg;
10083
10084    if(f1apMsg)
10085    {
10086       if(f1apMsg->choice.initiatingMessage)
10087       {
10088          f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10089
10090          if(f1ResetMsg->protocolIEs.list.array)
10091          {
10092             for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
10093             {
10094                if(f1ResetMsg->protocolIEs.list.array[idx])
10095                {
10096                   DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
10097                }
10098             }
10099             DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
10100          }
10101          DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10102       }
10103       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10104    }
10105 }
10106 /*******************************************************************
10107  *
10108  * @brief Build and Send F1reset request 
10109  *
10110  * @details
10111  *
10112  *    Function : BuildAndSendF1ResetReq
10113  *
10114  *    Functionality:
10115  *         - Build and Send F1reset request msg
10116  *
10117  * @params[in]
10118  * @return ROK     - success
10119  *         RFAILED - failure
10120  *
10121  * ****************************************************************/
10122 uint8_t BuildAndSendF1ResetReq()
10123 {
10124    uint8_t          elementCnt=0;
10125    uint8_t          idx=0;
10126    uint8_t          ret= RFAILED;
10127    Reset_t          *f1ResetMsg = NULLP;
10128    F1AP_PDU_t       *f1apMsg = NULLP;
10129    asn_enc_rval_t   encRetVal;
10130    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset request \n");
10131    do
10132    {
10133       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10134       if(f1apMsg == NULLP)
10135       {
10136          break;
10137       }
10138       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10139       DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
10140       if(f1apMsg->choice.initiatingMessage == NULLP)
10141       {
10142          break;
10143       }
10144       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
10145       f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
10146       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
10147
10148       f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10149
10150       elementCnt = 3;
10151       f1ResetMsg->protocolIEs.list.count = elementCnt;
10152       f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
10153
10154       /* Initialize the F1Setup members */
10155       DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
10156       if(f1ResetMsg->protocolIEs.list.array == NULLP)
10157       {
10158          break;
10159       }
10160       for(idx=0; idx<elementCnt; idx++)
10161       {
10162          DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
10163          if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
10164          {
10165             break;
10166          }
10167       }
10168
10169       /*TransactionID*/
10170       idx=0;
10171       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10172       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10173       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
10174       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
10175
10176       /*Cause*/
10177       idx++;
10178       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
10179       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
10180       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
10181       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
10182       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
10183
10184       /*Reset Type*/
10185       idx++;
10186       f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
10187       f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10188       f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
10189       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
10190       f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
10191
10192       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10193
10194       /* Encode the F1SetupRequest type as APER */
10195       memset(encBuf, 0, ENC_BUF_MAX_LEN);
10196       encBufSize = 0;
10197       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10198             encBuf);
10199
10200       /* Encode results */
10201       if(encRetVal.encoded == ENCODE_FAIL)
10202       {
10203          DU_LOG("\nERROR  -->  F1AP : Could not encode F1Reset structure (at %s)\n",\
10204                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10205          break;
10206       }
10207       else
10208       {
10209          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for F1Reset\n");
10210          for(idx=0; idx< encBufSize; idx++)
10211          {
10212             printf("%x",encBuf[idx]);
10213          }
10214       }
10215
10216       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
10217       {
10218          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset request failed");
10219          break;
10220       }
10221
10222       ret = ROK;
10223       break;
10224    }while(true);
10225
10226    FreeF1ResetReq(f1apMsg);
10227    return ret;
10228 }
10229 /*******************************************************************
10230  *
10231  * @brief Build And Send F1ResetAck
10232  *
10233  * @details
10234  *
10235  *    Function : BuildAndSendF1ResetAck
10236  *
10237  *    Functionality:
10238  *         - Build And Send  F1ResetRSP
10239  *
10240  * @return ROK     - success
10241  *         RFAILED - failure
10242  *
10243  * ****************************************************************/
10244 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
10245 {
10246    uint8_t idx;
10247    ResetAcknowledge_t *f1ResetAck;
10248
10249    if(f1apMsg)
10250    {
10251       if(f1apMsg->choice.successfulOutcome)
10252       {
10253          f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10254
10255          if(f1ResetAck->protocolIEs.list.array)
10256          {
10257             for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
10258             {
10259                if(f1ResetAck->protocolIEs.list.array[idx])
10260                {
10261                   DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10262                }
10263             }
10264             DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10265          }
10266          DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10267       }
10268       DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
10269    }
10270 }
10271
10272 /*******************************************************************
10273  *
10274  * @brief Build And Send F1ResetAck
10275  *
10276  * @details
10277  *
10278  *    Function : BuildAndSendF1ResetAck
10279  *
10280  *    Functionality:
10281  *         - Build And Send  F1ResetRSP
10282  *
10283  *  @params[in]
10284  * @return ROK     - success
10285  *         RFAILED - failure
10286  *
10287  * ****************************************************************/
10288 uint8_t BuildAndSendF1ResetAck()
10289 {
10290    uint8_t                idx = 0;
10291    uint8_t                elementCnt = 0;
10292    uint8_t                ret = RFAILED;
10293    F1AP_PDU_t             *f1apMsg = NULL;
10294    ResetAcknowledge_t     *f1ResetAck = NULLP;
10295    asn_enc_rval_t         encRetVal;
10296    DU_LOG("\nINFO   -->  F1AP : Building F1 Reset Acknowledgment \n");
10297
10298    do{
10299       /* Allocate the memory for F1ResetRequest_t */
10300       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10301       if(f1apMsg == NULLP)
10302       {
10303          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10304          break;
10305       }
10306
10307       f1apMsg->present =  F1AP_PDU_PR_successfulOutcome;
10308
10309       DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
10310       if(f1apMsg->choice.successfulOutcome == NULLP)
10311       {
10312          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10313          break;
10314       }
10315       f1apMsg->choice.successfulOutcome->criticality   = Criticality_reject;
10316       f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
10317       f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
10318
10319       elementCnt = 1;
10320
10321       f1ResetAck->protocolIEs.list.count = elementCnt;
10322       f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
10323
10324       DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
10325       if(f1ResetAck->protocolIEs.list.array == NULLP)
10326       {
10327          DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1ResetAckIEs failed");
10328          break;
10329       }
10330
10331       for(idx=0; idx<elementCnt; idx++)
10332       {
10333          DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
10334          if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
10335          {
10336             break;
10337          }
10338       }
10339       /*TransactionID*/
10340       idx = 0;
10341       f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
10342       f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
10343       f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
10344       f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
10345
10346       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10347
10348       /* Encode the F1SetupRequest type as UPER */
10349       memset(encBuf, 0, ENC_BUF_MAX_LEN);
10350       encBufSize = 0;
10351       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
10352
10353       /* Check encode results */
10354       if(encRetVal.encoded == ENCODE_FAIL)
10355       {
10356          DU_LOG("\nERROR  -->  F1AP : Could not encode F1ResetAck structure (at %s)\n",\
10357                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10358          break;
10359       }
10360       else
10361       {
10362          DU_LOG("\nDUBUG   -->  F1AP : Created APER encoded buffer for F1ResetAck\n");
10363          for(int i=0; i< encBufSize; i++)
10364          {
10365             printf("%x",encBuf[i]);
10366          }
10367       }
10368       /* Sending msg */
10369       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
10370       {
10371          DU_LOG("\nERROR  -->  F1AP : Sending F1 Reset Acknowledgement failed");
10372          break;
10373       }
10374
10375       ret = ROK;
10376       break;
10377    }while(true);
10378
10379    FreeF1ResetAck(f1apMsg);
10380    return ret;
10381 }
10382 /******************************************************************
10383 *
10384 * @brief free F1 reset msg allocated by aper_decoder 
10385 *
10386 * @details
10387 *
10388 *    Function : freeAperDecodeF1ResetMsg 
10389 *
10390 *    Functionality: free F1 reset msg allocated by aper_decoder 
10391 *
10392 * @params[in] Reset_t *f1ResetMsg 
10393 * @return void 
10394 *
10395 * ****************************************************************/
10396
10397 void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
10398 {
10399    uint8_t ieIdx =0;
10400    if(f1ResetMsg->protocolIEs.list.array)
10401    {
10402       for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
10403       {
10404          if(f1ResetMsg->protocolIEs.list.array[ieIdx])
10405          {
10406             free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
10407          }
10408       }
10409       free(f1ResetMsg->protocolIEs.list.array);
10410    }
10411 }
10412
10413 /******************************************************************
10414  *
10415  * @brief Processes DL RRC Message Transfer  sent by CU
10416  *
10417  * @details
10418  *
10419  *    Function : procF1ResetReq
10420  *
10421  *    Functionality: Processes DL RRC Message Transfer sent by CU
10422  *
10423  * @params[in] F1AP_PDU_t ASN decoded F1AP message
10424  * @return ROK     - success
10425  *         RFAILED - failure
10426  *
10427  * ****************************************************************/
10428 uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
10429 {
10430    /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
10431    uint8_t       ieIdx = 0;
10432    uint8_t        ret = ROK;
10433    Reset_t       *f1ResetMsg = NULLP;
10434
10435    DU_LOG("\nINFO   -->  Processing F1 reset request");
10436    f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
10437
10438    for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
10439    {
10440       switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
10441       {
10442          case ProtocolIE_ID_id_TransactionID:
10443             break;
10444
10445          case ProtocolIE_ID_id_Cause:
10446             break;
10447
10448          case ProtocolIE_ID_id_ResetType:
10449             {
10450                break;
10451             }
10452
10453          default:
10454             break;
10455       }
10456    }
10457    ret = BuildAndSendF1ResetAck();
10458    DU_LOG("\nINFO   -->  UE release is not supported for now");
10459
10460    freeAperDecodeF1ResetMsg(f1ResetMsg);
10461
10462    return ret;
10463 }
10464
10465 /*******************************************************************
10466  *
10467  * @brief free the RRC delivery report
10468  *
10469  * @details
10470  *
10471  *    Function : freeRrcDeliveryReport
10472  *
10473  *    Functionality: free the RRC delivery report
10474  *
10475  * @params[in]
10476  * @return ROK     - success
10477  *         RFAILED - failure
10478  *
10479  * ****************************************************************/
10480 void freeRrcDeliveryReport(F1AP_PDU_t  *f1apMsg )
10481 {
10482    uint8_t idx=0;
10483    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
10484
10485    if(f1apMsg)
10486    {
10487       if(f1apMsg->choice.initiatingMessage)
10488       {
10489          rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
10490          if(rrcDeliveryReport->protocolIEs.list.array)
10491          {
10492             for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
10493                   idx++)
10494             {
10495                if(rrcDeliveryReport->protocolIEs.list.array[idx])
10496                {
10497                   DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
10498                         sizeof(RRCDeliveryReportIEs_t));
10499                }   
10500             }
10501             DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
10502                   rrcDeliveryReport->protocolIEs.list.size);
10503          }
10504          DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
10505       }
10506       DU_FREE(f1apMsg,
10507             sizeof(F1AP_PDU_t));
10508    }
10509 }
10510
10511 /*******************************************************************
10512 *
10513 * @brief Builds and sends the RRC delivery report
10514 *
10515 * @details
10516 *
10517 *    Function : BuildAndSendRrcDeliveryReport
10518 *
10519 *    Functionality: Builds and sends the RRC delivery report
10520 *
10521 * @params[in]
10522 *
10523 * @return ROK     - success
10524 *         RFAILED - failure
10525 *
10526 * ****************************************************************/
10527 uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
10528    uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
10529 {
10530    uint8_t             ret = RFAILED;
10531    uint8_t             idx    = 0;
10532    uint8_t             idx1   = 0;
10533    uint8_t             elementCnt = 0;
10534    F1AP_PDU_t          *f1apMsg = NULLP;
10535    asn_enc_rval_t      encRetVal;  
10536    RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
10537
10538    do{
10539
10540       DU_LOG("\nINFO   -->  F1AP : Building RRC delivery Message Transfer Message\n");
10541       DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
10542       if(f1apMsg == NULLP)
10543       {
10544          DU_LOG(" ERROR  -->  F1AP : Memory allocation for F1AP-PDU failed");
10545          break;
10546       }
10547       f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
10548       DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
10549       if(f1apMsg->choice.initiatingMessage == NULLP)
10550       {
10551          DU_LOG(" ERROR  -->  F1AP : Memory allocation for  F1AP-PDU  failed");
10552          break;
10553       }
10554       f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
10555       f1apMsg->choice.initiatingMessage->criticality   = Criticality_ignore;
10556       f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
10557
10558       rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
10559       elementCnt = 4;
10560       rrcDeliveryReport->protocolIEs.list.count = elementCnt;
10561       rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
10562
10563       /* Initialize the F1Setup members */
10564       DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
10565       if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
10566       {
10567          DU_LOG(" ERROR  -->  F1AP : Memory allocation for RRC Delivery  failed");
10568          break;
10569       }
10570       for(idx =0 ;idx <elementCnt; idx++)
10571       {
10572          DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
10573          if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
10574          {
10575             break;
10576          }
10577       }
10578
10579       idx1 = 0;
10580
10581       /*GNB CU UE F1AP ID*/
10582       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
10583       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
10584       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
10585       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
10586
10587       /*GNB DU UE F1AP ID*/
10588       idx1++;
10589       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
10590       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
10591       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
10592       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
10593
10594       /*RRC delivery status*/
10595       idx1++;
10596       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
10597       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
10598       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
10599       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
10600       rrcDelivery->rrcDeliveryStatus.deliveryStatus;
10601       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
10602       rrcDelivery->rrcDeliveryStatus.triggeringMessage;
10603
10604       /* SRB ID */ 
10605       idx1++;
10606       rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
10607       rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
10608       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
10609       rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID =  rrcDelivery->srbId;
10610
10611       xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
10612
10613       /* Encode the RRC DELIVERY REPORT type as APER */
10614       memset(encBuf, 0, ENC_BUF_MAX_LEN);
10615       encBufSize = 0;
10616       encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
10617             encBuf);
10618
10619       /* Encode results */
10620       if(encRetVal.encoded == ENCODE_FAIL)
10621       {
10622          DU_LOG("\nERROR  -->  F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
10623                encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
10624          break;
10625       }
10626       else
10627       {
10628          DU_LOG("\nDEBUG   -->  F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
10629          for(idx=0; idx< encBufSize; idx++)
10630          {
10631             printf("%x",encBuf[idx]);
10632          }
10633       }
10634
10635       /* Sending msg */
10636       if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
10637       {
10638          DU_LOG("\nERROR  -->  F1AP : Sending RRC delivery  msg request failed");
10639          break;
10640       }
10641       ret = ROK;
10642       break;
10643
10644    }while(true);
10645
10646    freeRrcDeliveryReport(f1apMsg);
10647    return ret;
10648 }
10649
10650 /*******************************************************************
10651  *
10652  * @brief Processes cells to be activated
10653  *
10654  * @details
10655  *
10656  *    Function : extractCellsToBeActivated
10657  *
10658  *    Functionality:
10659  *      - Processes cells to be activated list received in F1SetupRsp
10660  *
10661  * @params[in] void
10662  * @return ROK     - success
10663  *         RFAILED - failure
10664  *
10665  * ****************************************************************/
10666
10667 uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
10668 {
10669    uint8_t  ret = ROK;
10670    uint16_t idx, nci, pci = 0;
10671    Cells_to_be_Activated_List_Item_t cell;
10672
10673    for(idx=0; idx<cellsToActivate.list.count; idx++)
10674    {
10675       nci = 0;
10676       cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
10677       bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
10678
10679       if(cell.nRPCI)
10680       {
10681          pci = *cell.nRPCI;
10682       }
10683       ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
10684    }
10685    return ret;
10686 }
10687 /******************************************************************
10688 *
10689 * @brief Processes F1 Setup Response allocated by aper_decoder 
10690 *
10691 * @details
10692 *
10693 *    Function : freeF1SetupRsp 
10694 *
10695 *    Functionality: free F1 Setup Response allocated by aper_decoder 
10696 *
10697 * @params[in] F1SetupResponse_t *f1SetRspMsg 
10698 * @return void 
10699 *
10700 * ****************************************************************/
10701
10702 void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
10703 {
10704    uint8_t ieIdx =0;
10705    uint8_t arrIdx =0;
10706    Cells_to_be_Activated_List_t *cellToActivate =NULLP;
10707    RRC_Version_t      *rrcVer =NULLP;
10708
10709    if(f1SetRspMsg->protocolIEs.list.array)
10710    {
10711       for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
10712       {
10713          if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
10714          {
10715             switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
10716             {
10717                case ProtocolIE_ID_id_Cells_to_be_Activated_List:
10718                   {
10719                      cellToActivate =
10720                         &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
10721                      if(cellToActivate->list.array)
10722                      {
10723                         for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
10724                         {
10725                            if(cellToActivate->list.array[arrIdx])
10726                            {
10727
10728                               if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
10729                               pLMN_Identity.buf)
10730                               {
10731                                  if(cellToActivate->list.array[0]->value.choice.\
10732                                        Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
10733                                  {
10734                                     free(cellToActivate->list.array[0]->value.choice.\
10735                                           Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
10736                                  }
10737
10738                                  free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
10739                                        nRCGI.pLMN_Identity.buf);
10740                               }
10741                               free(cellToActivate->list.array[arrIdx]);
10742                            }
10743                         }
10744                         free(cellToActivate->list.array);
10745                      }
10746                      break;
10747                   }
10748                case ProtocolIE_ID_id_TransactionID:
10749                   {
10750                      break;
10751                   }
10752                case ProtocolIE_ID_id_gNB_CU_Name:
10753                   {
10754                      free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
10755                      break;
10756                   }
10757                case ProtocolIE_ID_id_GNB_CU_RRC_Version:
10758                   {
10759                      rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
10760                      if(rrcVer->latest_RRC_Version.buf)
10761                      {
10762                         if(rrcVer->iE_Extensions)
10763                         {
10764                            if(rrcVer->iE_Extensions->list.array)
10765                            {
10766                               if(rrcVer->iE_Extensions->list.array[0])
10767                               {
10768                                  if(rrcVer->iE_Extensions->list.\
10769                                        array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
10770                                  {
10771                                     free(rrcVer->iE_Extensions->list.\
10772                                           array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
10773                                  }
10774                                  free(rrcVer->iE_Extensions->list.array[0]);
10775                               }
10776                               free(rrcVer->iE_Extensions->list.array);
10777                            }
10778                            free(rrcVer->iE_Extensions);
10779                         }
10780                         free(rrcVer->latest_RRC_Version.buf);
10781                      }
10782                      break;
10783
10784                   }
10785                default:
10786                   {
10787                      DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
10788                            f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
10789                   }
10790             }
10791             free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
10792          }
10793       }
10794       free(f1SetRspMsg->protocolIEs.list.array);
10795    }
10796 }
10797 /******************************************************************
10798  *
10799  * @brief Processes F1 Setup Response sent by CU
10800  *
10801  * @details
10802  *
10803  *    Function : procF1SetupRsp
10804  *
10805  *    Functionality: Processes F1 Setup Response sent by CU
10806  *
10807  * @params[in] F1AP_PDU_t ASN decoded F1AP message
10808  * @return ROK     - success
10809  *         RFAILED - failure
10810  *
10811  * ****************************************************************/
10812 uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
10813 {
10814    uint8_t ret = ROK;
10815    uint16_t idx =0;
10816    F1SetupResponse_t *f1SetRspMsg = NULLP;
10817    GNB_CU_Name_t     *cuName = NULLP;
10818    F1SetupRsp  f1SetRspDb;
10819    RRC_Version_t      *rrcVer =NULLP;
10820    
10821    memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
10822
10823    DU_LOG("\nINFO   -->  F1AP : F1 Setup Response received");
10824    f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
10825
10826    for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
10827    {
10828       switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
10829       {
10830          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
10831             {
10832                extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
10833                      value.choice.Cells_to_be_Activated_List);
10834                break;
10835             }
10836          case ProtocolIE_ID_id_TransactionID:
10837             {
10838                f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
10839                                     value.choice.TransactionID;
10840                break;
10841             }
10842          case ProtocolIE_ID_id_gNB_CU_Name:
10843             {
10844                cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
10845                         value.choice.GNB_CU_Name;
10846                strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
10847                break;
10848             }
10849          case ProtocolIE_ID_id_GNB_CU_RRC_Version:
10850             {
10851                rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
10852                strcpy(f1SetRspDb.rrcVersion.rrcVer,
10853                      (const char*)rrcVer->latest_RRC_Version.buf);
10854                break;
10855             }
10856          default:
10857             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in F1SetupRsp:%ld",
10858                   f1SetRspMsg->protocolIEs.list.array[idx]->id);
10859       }
10860       duProcF1SetupRsp();
10861    }
10862    
10863    freeAperDecodeF1SetupRsp(f1SetRspMsg);
10864    return ret;
10865 }
10866 /*******************************************************************
10867 *
10868 * @brief free GNB DU config update ack
10869 *
10870 * @details
10871 *
10872 *    Function : freeAperDecodeGnbDuAck 
10873 *
10874 *    Functionality: Processes GNB DU config update ack And
10875 *                     added free part for the memory allocated by aper_decoder
10876 *
10877 * @params[in] F1AP_PDU_t ASN decoded F1AP message
10878 * @return ROK     - success
10879 *         RFAILED - failure
10880 *
10881 * ****************************************************************/
10882
10883 void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
10884 {
10885    uint8_t ieIdx = 0;
10886
10887    if(gnbDuAck->protocolIEs.list.array)
10888    {
10889       for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
10890       {
10891          if(gnbDuAck->protocolIEs.list.array[ieIdx])
10892          {
10893             free(gnbDuAck->protocolIEs.list.array[ieIdx]);
10894          }
10895       }
10896       free(gnbDuAck->protocolIEs.list.array);
10897    }
10898 }
10899 /*******************************************************************
10900 *
10901 * @brief Processes GNB DU config update ack
10902 *
10903 * @details
10904 *
10905 *    Function : procF1GNBDUCfgUpdAck
10906 *
10907 *    Functionality: added free part for the memory allocated by aper_decoder
10908 *
10909 * @params[in] F1AP_PDU_t *f1apMsg 
10910 * @return void 
10911 *
10912 * ****************************************************************/
10913 uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
10914 {
10915    uint8_t ieIdx;
10916    GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
10917    
10918    DU_LOG("\nINFO   -->  F1AP : GNB-DU config update acknowledgment");
10919    gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
10920    
10921    for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
10922    {
10923       switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
10924       {
10925          case ProtocolIE_ID_id_TransactionID:
10926             break;
10927          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
10928             break;
10929          default :
10930             DU_LOG("\nERROR  -->  F1AP: Invalid IE Received: %ld, at procF1GNBDUCfgUpdAck()", \
10931             gnbDuAck->protocolIEs.list.array[ieIdx]->id);
10932             break;
10933       }
10934    }
10935    duProcGnbDuCfgUpdAckMsg();
10936 #if 0
10937    if(BuildAndSendF1ResetReq() != ROK)
10938    {
10939       return RFAILED;
10940    }
10941 #endif
10942
10943    freeAperDecodeGnbDuAck(gnbDuAck);
10944    return ROK;
10945 }
10946 /******************************************************************
10947 *
10948 * @brief free DL RRC Message Transfer allocated by aper_decoder 
10949 *
10950 * @details
10951 *
10952 *    Function : freeAperDecodef1DlRrcMsg 
10953 *
10954 *    Functionality: free DL RRC Message Transfer allocated by aper_decoder 
10955 *
10956 * @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg 
10957 * @return ROK     - success
10958 *         RFAILED - failure
10959 *
10960 * ****************************************************************/
10961
10962 void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
10963 {
10964    uint8_t ieIdx =0;
10965    RRCContainer_t *rrcContainer = NULLP;
10966
10967    if(f1DlRrcMsg->protocolIEs.list.array)
10968    {
10969       for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
10970       {
10971          if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
10972          {
10973             switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
10974             {
10975                case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
10976                   break;
10977                case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
10978                   break;
10979                case ProtocolIE_ID_id_SRBID:
10980                   break;
10981                case ProtocolIE_ID_id_RRCContainer:
10982                   {
10983                      rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
10984                      free(rrcContainer->buf);
10985                   }
10986                case ProtocolIE_ID_id_ExecuteDuplication:
10987                   break;
10988                case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
10989                   break;
10990                   break;
10991             }
10992             free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
10993          }
10994       }
10995       free(f1DlRrcMsg->protocolIEs.list.array);
10996    }
10997 }
10998 /******************************************************************
10999  *
11000  * @brief Processes DL RRC Message Transfer  sent by CU
11001  *
11002  * @details
11003  *
11004  *    Function : procF1DlRrcMsgTrans
11005  *
11006  *    Functionality: Processes DL RRC Message Transfer sent by CU
11007  *
11008  * @params[in] F1AP_PDU_t ASN decoded F1AP message
11009  * @return ROK     - success
11010  *         RFAILED - failure
11011  *
11012  * ****************************************************************/
11013 uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
11014 {
11015    uint8_t  idx, ret;
11016    DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
11017    F1DlRrcMsg dlMsg;
11018    memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
11019
11020    DU_LOG("\nINFO   -->  DU_APP : DL RRC message transfer Recevied");
11021    f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
11022
11023    ret = ROK;
11024
11025    for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
11026    {
11027       switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
11028       {
11029          case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
11030             {
11031                dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
11032                break;
11033             }
11034          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
11035             {
11036                dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
11037                break;
11038             }
11039          case ProtocolIE_ID_id_SRBID:
11040             {
11041                dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
11042                break;
11043             }
11044          case ProtocolIE_ID_id_ExecuteDuplication:
11045             dlMsg.execDup = true;
11046             break;
11047
11048          case ProtocolIE_ID_id_RRCContainer:
11049             {
11050                if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
11051                {
11052                   dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
11053                   DU_ALLOC(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
11054                   if(dlMsg.rrcMsgPdu)
11055                   {
11056                      memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
11057                         dlMsg.rrcMsgSize);
11058                   }
11059                   else
11060                   {
11061                      DU_LOG("\nERROR  -->  DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
11062                      return RFAILED;
11063                   }
11064                }
11065                else
11066                {
11067                   DU_LOG("\nERROR  -->  DU_APP : RRC Container Size is invalid:%ld",\
11068                   f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
11069                   return RFAILED;
11070                }
11071                break;
11072             }
11073          case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
11074             {
11075                dlMsg.deliveryStatRpt = true;
11076                break;
11077             }
11078          default:
11079             DU_LOG("\nERROR  -->  DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
11080                   f1DlRrcMsg->protocolIEs.list.array[idx]->id);
11081       }
11082    }
11083
11084    ret = duProcDlRrcMsg(&dlMsg);
11085
11086    freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
11087    return ret;
11088 }
11089
11090 /*****************************************************************i
11091  *
11092  * @brief Handles received F1AP message and sends back response  
11093  *
11094  * @details
11095  *
11096  *    Function : F1APMsgHdlr
11097  *
11098  *    Functionality:
11099  *         - Decodes received F1AP control message
11100  *         - Prepares response message, encodes and sends to SCTP
11101  *
11102  * @params[in] 
11103  * @return ROK     - success
11104  *         RFAILED - failure
11105  *
11106  * ****************************************************************/
11107 void F1APMsgHdlr(Buffer *mBuf)
11108 {
11109    int i =0;
11110    char *recvBuf =NULLP;
11111    MsgLen copyCnt =0;
11112    MsgLen recvBufLen =0;
11113    F1AP_PDU_t *f1apMsg =NULLP;
11114    asn_dec_rval_t rval; /* Decoder return value */
11115    F1AP_PDU_t f1apasnmsg ;
11116    DU_LOG("\nINFO  -->  F1AP : Received F1AP message buffer");
11117    ODU_PRINT_MSG(mBuf, 0,0);
11118
11119    /* Copy mBuf into char array to decode it */
11120    ODU_GET_MSG_LEN(mBuf, &recvBufLen);
11121    DU_ALLOC(recvBuf, (Size)recvBufLen);
11122
11123    if(recvBuf == NULLP)
11124    {
11125       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed");
11126       return;
11127    }
11128    if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, &copyCnt) != ROK)
11129    {
11130       DU_LOG("\nERROR   -->  F1AP : Failed while copying %d", copyCnt);
11131       return;
11132    }
11133
11134    printf("\nDEBUG   -->  F1AP : Received flat buffer to be decoded : ");
11135    for(i=0; i< recvBufLen; i++)
11136    {
11137       printf("%x",recvBuf[i]);
11138    }
11139
11140    /* Decoding flat buffer into F1AP messsage */
11141    f1apMsg = &f1apasnmsg;
11142    memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
11143
11144    rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
11145    DU_FREE(recvBuf, (Size)recvBufLen);
11146
11147    if(rval.code == RC_FAIL || rval.code == RC_WMORE)
11148    {
11149       DU_LOG("\nERROR  -->  F1AP : ASN decode failed");
11150       return;
11151    }
11152    printf("\n");
11153    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
11154
11155    switch(f1apMsg->present)
11156    {
11157       case F1AP_PDU_PR_successfulOutcome:
11158          {
11159             switch(f1apMsg->choice.successfulOutcome->value.present)
11160             {
11161                case SuccessfulOutcome__value_PR_ResetAcknowledge:
11162                   {
11163                      DU_LOG("\nINFO   -->  F1AP : F1ResetAcknowledge is received successfully ");
11164                      break;
11165                   }
11166                case SuccessfulOutcome__value_PR_F1SetupResponse:
11167                   {                             
11168 #ifndef ODU_TEST_STUB
11169                      procF1SetupRsp(f1apMsg);
11170 #endif
11171                      break;
11172                   }
11173
11174                case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
11175                   {
11176                      procF1GNBDUCfgUpdAck(f1apMsg);
11177                      break;
11178                   }
11179
11180                default:
11181                   {
11182                      DU_LOG("\nERROR  -->  F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
11183                      f1apMsg->choice.successfulOutcome->value.present);
11184                      return;
11185                   }
11186             }/* End of switch(successfulOutcome) */
11187             free(f1apMsg->choice.successfulOutcome);
11188             break;
11189          }
11190       case F1AP_PDU_PR_initiatingMessage:
11191          {
11192             switch(f1apMsg->choice.initiatingMessage->value.present)
11193             {
11194                case InitiatingMessage__value_PR_Reset:
11195                   {
11196                      procF1ResetReq(f1apMsg);
11197                      break;
11198                   }
11199                case InitiatingMessage__value_PR_DLRRCMessageTransfer:
11200                   {
11201                      procF1DlRrcMsgTrans(f1apMsg);
11202                      break;
11203                   }
11204                case InitiatingMessage__value_PR_UEContextSetupRequest:
11205                   {
11206                      procF1UeContextSetupReq(f1apMsg);
11207                      break;
11208                   }
11209                default:
11210                   {
11211                      DU_LOG("\nERROR  -->  F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
11212                            f1apMsg->choice.initiatingMessage->value.present);
11213                      return;
11214                   }
11215             }/* End of switch(initiatingMessage) */
11216             free(f1apMsg->choice.initiatingMessage);
11217             break;
11218          }
11219
11220       default:
11221          {
11222             DU_LOG("\nERROR  -->  F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
11223             return;
11224          }
11225          free(f1apMsg);
11226
11227    }/* End of switch(f1apMsg->present) */
11228
11229 } /* End of F1APMsgHdlr */
11230
11231 /**********************************************************************
11232   End of file
11233  **********************************************************************/