Merge "RAR and MSG3 scheduling in TDD [Issue-ID: ODUHIGH-342]"
authorHarshita Lal <harshita.lal@radisys.com>
Tue, 28 Sep 2021 08:39:00 +0000 (08:39 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Tue, 28 Sep 2021 08:39:00 +0000 (08:39 +0000)
22 files changed:
docs/release-notes.rst
docs/user-guide.rst
src/5gnrrlc/rlc_utl_ul.c
src/5gnrsch/sch_common.c
src/5gnrsch/sch_slot_ind.c
src/cm/common_def.h
src/cu_stub/cu_f1ap_msg_hdl.c
src/cu_stub/cu_f1ap_msg_hdl.h
src/cu_stub/cu_stub.c
src/cu_stub/cu_stub.h
src/cu_stub/cu_stub_egtp.c
src/cu_stub/cu_stub_egtp.h
src/du_app/du_cfg.c
src/du_app/du_cfg.h
src/du_app/du_egtp.c
src/du_app/du_f1ap_msg_hdl.c
src/du_app/du_f1ap_msg_hdl.h
src/du_app/du_mgr.h
src/du_app/du_ue_mgr.c
src/phy_stub/phy_stub.h
src/phy_stub/phy_stub_msg_hdl.c
src/phy_stub/phy_stub_thread_hdl.c

index 9df3eb7..2993c09 100644 (file)
@@ -20,7 +20,7 @@ Version history
 | **Date**           | **Ver.**           | **Author**         | **Comment**        |
 |                    |                    |                    |                    |
 +--------------------+--------------------+--------------------+--------------------+
-| 2021-07-07         | 4.0.0              | Radisys,           | D Release          |
+| 2021-09-06         | 4.0.0              | Radisys,           | D Release          |
 |                    |                    | HCL Technologies   |                    |
 |                    |                    | Ltd.               |                    |
 +--------------------+--------------------+--------------------+--------------------+
@@ -60,6 +60,16 @@ This release contains the following:
 
       Support for Closed Loop Automation use-case.
 
+ - Maintenance release includes :
+
+      Memory handling optimization and fixes.
+
+      Improvement in logging.
+
+      K0, K1 and K2 configuration.
+      
+      Fixes in proccessing of RACH Indication and RAR.
+
 Cherry
 ^^^^^^^^
 This release contains the following:
@@ -129,14 +139,13 @@ D
 |                                      |                                      |
 +--------------------------------------+--------------------------------------+
 | **Repo/commit-ID**                   | o-du/l2/                             |
-|                                      | 108f702c6ad76cba45a8bcabec8bf82a07bdb|
-|                                      | c71                                  |
-|                                      |                                      |
+|                                      | e8fdaea4192b41240b8c43f48adf92eed0c3 |
+|                                      | b99e                                 |
 +--------------------------------------+--------------------------------------+
 | **Release designation**              | D Release                            |
 |                                      |                                      |
 +--------------------------------------+--------------------------------------+
-| **Release date**                     | 2021-07-07                           |
+| **Release date**                     | 2021-09-06                           |
 |                                      |                                      |
 +--------------------------------------+--------------------------------------+
 | **Purpose of the delivery**          | D Release                            |
@@ -244,6 +253,9 @@ D
 | https://jira.o-ran-sc.org/browse/ODUHIGH-196  | Netconf session for O1 interface for CM       |
 |                                               |                                               |
 +-----------------------------------------------+-----------------------------------------------+
+| https://jira.o-ran-sc.org/browse/ODUHIGH-340  | Resource allocation in time domain changes to |
+|                                               | meet flexible k0, k1 and k2 values            |
++-----------------------------------------------+-----------------------------------------------+
 
 Cherry
 ^^^^^^^
index ed0858b..1d077d7 100644 (file)
@@ -4,7 +4,7 @@
 User Guide
 ***********
 
-This is the user guide for Cherry release of O-DU/l2.
+This is the user guide for D release of O-DU/l2.
 Follow installation-guide to get all the dependencies ready.
 
 .. contents::
index 4604f19..507d8c1 100755 (executable)
@@ -198,12 +198,12 @@ uint8_t rlcUtlRcvFrmMac(RlcCb *gCb, KwDatIndInfo  *datIndInfo)
 uint8_t rlcUtlSendUlDataToDu(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *sdu)
 {
 #ifndef KW_PDCP
-   KwuDatIndInfo   *datIndInfo;   /* Data Indication Information */
+   KwuDatIndInfo   *datIndInfo = NULLP;   /* Data Indication Information */
    KwuDatIndInfo datIndInfoTmp;
 #endif
-   RlcUlRrcMsgInfo  *ulRrcMsgInfo;
-   RlcUlUserDatInfo *ulUserDatInfo;
-   uint16_t        msgLen, copyLen;
+   RlcUlRrcMsgInfo  *ulRrcMsgInfo = NULLP;
+   RlcUlUserDatInfo *ulUserDatInfo = NULLP;
+   uint16_t        msgLen = 0, copyLen = 0;
    Pst             pst;
 
 #ifndef KW_PDCP
@@ -231,28 +231,28 @@ uint8_t rlcUtlSendUlDataToDu(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *sdu)
            ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
       if (ulRrcMsgInfo)
       {
-        ulRrcMsgInfo->cellId = rbCb->rlcId.cellId;
-        ulRrcMsgInfo->ueIdx = rbCb->rlcId.ueId;
-        ulRrcMsgInfo->lcId = rbCb->lch.lChId;
-        RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
-              ulRrcMsgInfo->rrcMsg, msgLen);
-        if (ulRrcMsgInfo->rrcMsg)
-        {
-           ODU_GET_MSG_LEN(sdu, (MsgLen *)&msgLen);
-           ODU_COPY_MSG_TO_FIX_BUF(sdu, 0, msgLen, ulRrcMsgInfo->rrcMsg, (MsgLen *)&copyLen);
-           ulRrcMsgInfo->msgLen = msgLen;
-
-           /* Sending UL RRC Message transfeer to DU APP */
-           memset(&pst, 0, sizeof(Pst));
-           FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_RRC_MSG_TRANS_TO_DU);
-           rlcSendUlRrcMsgToDu(&pst, ulRrcMsgInfo);
-        }
-        else
-        {
-           DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for rrcMsg");
-           RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
-           return RFAILED;
-        }
+             ulRrcMsgInfo->cellId = rbCb->rlcId.cellId;
+             ulRrcMsgInfo->ueIdx = rbCb->rlcId.ueId;
+             ulRrcMsgInfo->lcId = rbCb->lch.lChId;
+             ODU_GET_MSG_LEN(sdu, (MsgLen *)&msgLen);
+             RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
+                    ulRrcMsgInfo->rrcMsg, msgLen);
+             if (ulRrcMsgInfo->rrcMsg)
+             {
+               ODU_COPY_MSG_TO_FIX_BUF(sdu, 0, msgLen, ulRrcMsgInfo->rrcMsg, (MsgLen *)&copyLen);
+               ulRrcMsgInfo->msgLen = msgLen;
+
+               /* Sending UL RRC Message transfeer to DU APP */
+               memset(&pst, 0, sizeof(Pst));
+               FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_RRC_MSG_TRANS_TO_DU);
+               rlcSendUlRrcMsgToDu(&pst, ulRrcMsgInfo);
+            }
+            else
+            {
+              DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for rrcMsg");
+              RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
+              return RFAILED;
+            }
       }
       else
       {
@@ -266,33 +266,35 @@ uint8_t rlcUtlSendUlDataToDu(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *sdu)
       RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo, sizeof(RlcUlUserDatInfo));
       if (ulUserDatInfo)
       {
-        ulUserDatInfo->cellId = rbCb->rlcId.cellId;
-        ulUserDatInfo->ueIdx = rbCb->rlcId.ueId;
+         ulUserDatInfo->cellId = rbCb->rlcId.cellId;
+             ulUserDatInfo->ueIdx = rbCb->rlcId.ueId;
          ulUserDatInfo->rbId = rbCb->rlcId.rbId;
-        RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo->userData, msgLen);
-        if (ulUserDatInfo->userData)
-        {
-           ODU_GET_MSG_LEN(sdu, (MsgLen *)&msgLen);
-           ODU_COPY_MSG_TO_FIX_BUF(sdu, 0, msgLen, ulUserDatInfo->userData, (MsgLen *)&copyLen);
-           ulUserDatInfo->msgLen = msgLen;
-
-           /* Sending UL RRC Message transfeer to DU APP */
-           memset(&pst, 0, sizeof(Pst));
-           FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_USER_DATA_TRANS_TO_DU);
-           rlcSendUlUserDataToDu(&pst, ulUserDatInfo);
-        }
-        else
-        {
-           DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for user data");
-           RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo, sizeof(RlcUlUserDatInfo));
-           return RFAILED;
-        }
-      }
-      else
-      {
-        DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for ulUserDatInfo");
-        return RFAILED;
-      }
+             ODU_GET_MSG_LEN(sdu, (MsgLen *)&msgLen);
+             RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo->userData, msgLen);
+             if (ulUserDatInfo->userData)
+             {
+               ODU_COPY_MSG_TO_FIX_BUF(sdu, 0, msgLen, ulUserDatInfo->userData, (MsgLen *)&copyLen);
+               ulUserDatInfo->msgLen = msgLen;
+              
+            DU_LOG("\nDEBUG  -->  RLC_UL -> DUAPP : UL DATA [DRB ID:%d]", ulUserDatInfo->rbId);
+
+              /* Sending UL RRC Message transfeer to DU APP */
+              memset(&pst, 0, sizeof(Pst));
+              FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_USER_DATA_TRANS_TO_DU);
+              rlcSendUlUserDataToDu(&pst, ulUserDatInfo);
+            }
+            else
+            {
+               DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for user data");
+               RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo, sizeof(RlcUlUserDatInfo));
+               return RFAILED;
+            }
+     }
+     else
+     {
+            DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for ulUserDatInfo");
+            return RFAILED;
+     }
    }
    return ROK;
 } /* rlcUtlSendUlDataToDu */
index ebd6f7a..89f1969 100644 (file)
@@ -864,10 +864,15 @@ uint8_t schDlRsrcAllocDlMsg(DlMsgAlloc *dlMsgAlloc, SchCellCb *cell, uint16_t cr
 void BuildK0K1TableForFdd(SchCellCb *cell, SchK0K1TimingInfoTbl *k0K1InfoTbl, bool pdschCfgCmnPres,SchPdschCfgCmn pdschCmnCfg,\
 SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl)
 {
-   uint8_t k0TmpVal = 0, k1TmpVal =0, cfgIdx=0;
+   
+   uint8_t k1TmpVal =0, cfgIdx=0;
    uint8_t slotIdx=0, k0Index=0, k1Index=0, numK0=0, numK1=0, numTimeDomAlloc=0;
-   SchPdschCfgCmnTimeDomRsrcAlloc cmnTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
-   SchPdschTimeDomRsrcAlloc dedTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
+   
+   /* TODO Commented these below lines for resolving warnings. Presently these variable are not 
+    * required but this will require for harq processing */
+   // uint8_t k0TmpVal = 0; 
+   // SchPdschCfgCmnTimeDomRsrcAlloc cmnTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
+   // SchPdschTimeDomRsrcAlloc dedTimeDomRsrcAllocList[MAX_NUM_DL_ALLOC];
 
    /* Initialization the structure and storing the total slot values. */
    memset(k0K1InfoTbl, 0, sizeof(SchK0K1TimingInfoTbl));
@@ -879,7 +884,8 @@ SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl)
       numTimeDomAlloc = pdschCmnCfg.numTimeDomAlloc;
       for(cfgIdx = 0; cfgIdx<numTimeDomAlloc; cfgIdx++)
       {
-         cmnTimeDomRsrcAllocList[cfgIdx] = pdschCmnCfg.timeDomRsrcAllocList[cfgIdx];
+         /*TODO uncomment this line during harq processing */
+         //cmnTimeDomRsrcAllocList[cfgIdx] = pdschCmnCfg.timeDomRsrcAllocList[cfgIdx];
       }
    }
    else
@@ -887,7 +893,8 @@ SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl)
       numTimeDomAlloc = pdschDedCfg.numTimeDomRsrcAlloc;
       for(cfgIdx = 0; cfgIdx<numTimeDomAlloc; cfgIdx++)
       {
-         dedTimeDomRsrcAllocList[cfgIdx] = pdschDedCfg.timeDomRsrcAllociList[cfgIdx];
+         /*TODO uncomment this line during harq processing */
+         //dedTimeDomRsrcAllocList[cfgIdx] = pdschDedCfg.timeDomRsrcAllociList[cfgIdx];
       }
    }
    
@@ -900,6 +907,8 @@ SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl)
        * As per 38.331 PDSCH-TimeDomainResourceAllocation field descriptions. */
       for(k0Index = 0; ((k0Index < numTimeDomAlloc) && (k0Index < MAX_NUM_K0_IDX));  k0Index++)
       {
+         /* TODO These if 0 we will remove during harq processing */
+#if 0
          if(pdschCfgCmnPres == true)
          {
             k0TmpVal = cmnTimeDomRsrcAllocList[k0Index].k0;
@@ -915,7 +924,7 @@ SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl)
                k0TmpVal = DEFAULT_K0_VALUE;
             }
          }
-         
+#endif         
          /* Checking all the Ul Alloc values. If value is less than MIN_NUM_K1_IDX
           * then skip else continue storing the values. */
          numK1 = 0;
index 3542bd0..a29faaf 100644 (file)
@@ -255,7 +255,10 @@ uint8_t schFillBoGrantDlSchedInfo(SchCellCb *cell, DlSchedInfo *dlSchedInfo, DlM
       
       if (!dlMsgAlloc->numLc)
       {
-         DU_LOG("\nDEBUG  -->  SCH : No bo for any lcid\n");
+         DU_LOG("\nDEBUG  -->  SCH : No pending BO for any LC id\n");
+         /* Free the dl ded msg info allocated in macSchDlRlcBoInfo */
+         SCH_FREE(cell->schDlSlotInfo[dlSchedInfo->schSlotValue.dlMsgTime.slot]->dlMsgInfo, \
+               sizeof(DlMsgInfo));
          return ROK;
       }
 
index 77e0c99..754037a 100644 (file)
@@ -59,7 +59,7 @@
 #define MAX_NUM_MU   4
 #define MAX_NUM_UE   2
 #define MAX_NUM_UE_PER_TTI 1
-#define MAX_NUM_LC   11
+#define MAX_NUM_LC   32   /*Spec 38.331: Sec 6.4: maxLC-ID Keyword*/
 #define MAX_NUM_SRB  3    /* Max. no of Srbs */
 #define MAX_NUM_DRB  29   /* spec 38.331, maxDRB */
 
index 07e176c..6bfd46a 100644 (file)
@@ -23,6 +23,7 @@
 #include "odu_common_codec.h"
 #include "cu_stub_sctp.h"
 #include "cu_f1ap_msg_hdl.h"
+#include "legtp.h"
 /*header files needed for Ue Context Setup */
 #include<ProtocolIE-Field.h>
 #include "ProtocolExtensionField.h"
 #include "GBR-QosInformation.h"
 #include "DRBs-ToBeSetupMod-List.h"
 #include "DRBs-ToBeSetupMod-Item.h"
+#include "DRBs-Setup-Item.h"
+#include "DLUPTNLInformation-ToBeSetup-List.h"
+#include "DLUPTNLInformation-ToBeSetup-Item.h"
+#include "UPTransportLayerInformation.h"
+#include "GTPTunnel.h"
 
 /* MACRO for CUtoDURRCInformation */
 #define CELL_GRP_ID 1
 #define DMRS_ADDITIONAL_POS  0          /* DMRS Additional poistion */
 #define RES_ALLOC_TYPE       1          /* Resource allocation type */
 #define FIVE_QI_VALUE 9  /*spec 23.501, Table 5.7.4-1*/
+
 /*******************************************************************
  *
  * @brief Sends F1 msg over SCTP
@@ -2165,7 +2172,7 @@ uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
  *
  *    Functionality: Constructs the UL TnlInfo For DRB list
  *
- * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
+ * @params[in]  UPTNLInformation_ToBeSetup_List_t *ulInfo
  *
  * @return ROK     - success
  *         RFAILED - failure
@@ -2263,14 +2270,11 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
  * ****************************************************************/
 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
 {
-   uint8_t BuildQOSInforet;
-   uint8_t BuildSNSSAIret;
-   uint8_t BuildFlowsMapret;
-   uint8_t BuildULTnlInforet;
-   uint8_t idx;
-   uint8_t drbCnt;
+   uint8_t BuildQOSInforet = 0,BuildSNSSAIret = 0, idx = 0;
+   uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
    DRBs_ToBeSetup_Item_t *drbSetItem;
-   drbCnt = 1;
+   
+   drbCnt = MAX_DRB_SET;
    drbSet->list.count = drbCnt;
    drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
    CU_ALLOC(drbSet->list.array,drbSet->list.size);
@@ -2283,66 +2287,66 @@ uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
       CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
       if(drbSet->list.array[idx] == NULLP)
       {
-        return RFAILED;
+             return RFAILED;
       }
-   }
-   idx = 0;
-   drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
-   drbSet->list.array[idx]->criticality = Criticality_ignore;
-   drbSet->list.array[idx]->value.present = \
-                                           DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
-   drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;    
-   /*dRBID*/
-   drbSetItem->dRBID = 1;      
-   /*qoSInformation*/
-   drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
-   CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
-   if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
-   {   
-      return RFAILED;
-   }
-   drbSetItem->qoSInformation.choice.choice_extension->id = \
-                                                           ProtocolIE_ID_id_DRB_Information;
-   drbSetItem->qoSInformation.choice.choice_extension->criticality = \
-                                                                    Criticality_ignore;
-   drbSetItem->qoSInformation.choice.choice_extension->value.present = \
+
+      drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
+      drbSet->list.array[idx]->criticality = Criticality_ignore;
+      drbSet->list.array[idx]->value.present = \
+                                           DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
+      drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
+      /*dRBID*/
+      drbSetItem->dRBID = idx + 1;
+      /*qoSInformation*/
+      drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
+      CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
+      if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
+      {
+         return RFAILED;
+      }
+      drbSetItem->qoSInformation.choice.choice_extension->id = \
+                                                           ProtocolIE_ID_id_DRB_Information;
+      drbSetItem->qoSInformation.choice.choice_extension->criticality = \
+                                                                    Criticality_ignore;
+      drbSetItem->qoSInformation.choice.choice_extension->value.present = \
                                                                       QoSInformation_ExtIEs__value_PR_DRB_Information;
-   BuildQOSInforet =  BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
-        choice_extension->value.choice.DRB_Information.dRB_QoS);
-   if(BuildQOSInforet != ROK)
-   {
-      return RFAILED;
-   }
-   /*SNSSAI*/
-   BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
-        choice_extension->value.choice.DRB_Information.sNSSAI);
-   if(BuildSNSSAIret != ROK)
-   {   
-      return RFAILED;
-   }
-   /*Flows mapped to DRB List*/
-   BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
-        choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
-   if(BuildFlowsMapret != ROK)
-   {
-      return RFAILED;
-   }
-   /*ULUPTNLInformation To Be Setup List*/
-   BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
-   if(BuildULTnlInforet != ROK)
-   {
-      return RFAILED;
-   }
-   /*RLCMode*/
-   drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
+      BuildQOSInforet =  BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
+                             choice_extension->value.choice.DRB_Information.dRB_QoS);
+      if(BuildQOSInforet != ROK)
+      {
+         return RFAILED;
+      }
+      /*SNSSAI*/
+      BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
+                              choice_extension->value.choice.DRB_Information.sNSSAI);
+      if(BuildSNSSAIret != ROK)
+      {
+         return RFAILED;
+      }
+      /*Flows mapped to DRB List*/
+      BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
+                  choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
+      if(BuildFlowsMapret != ROK)
+      {
+         return RFAILED;
+      }
+      /*ULUPTNLInformation To Be Setup List*/
+      BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
+      if(BuildULTnlInforet != ROK)
+      {
+         return RFAILED;
+      }
+      /*RLCMode*/
+      drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
 
-   /*UL Configuration*/
-   CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
-   if(drbSetItem->uLConfiguration == NULLP)
-   {
-      return RFAILED;
-   }
-   drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
+      /*UL Configuration*/
+      CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
+      if(drbSetItem->uLConfiguration == NULLP)
+      {
+         return RFAILED;
+      }
+      drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
+  }
    return ROK;
 }/* End of BuildDRBSetup*/
 
@@ -2548,100 +2552,97 @@ void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
    {
       for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
       {
-        if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
-        {
-           drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
-           if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
-           {
-              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
-                    qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
-              {
-                 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
-                       qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
-                 {
-                    if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
-                          qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
-                    {
-                       if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
-                       {
-                          if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
-                          {
-                             if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
-                             {
-                                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
-                                      flows_Mapped_To_DRB_List.list.array != NULLP)
-                                {
-                                   for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
-                                         flows_Mapped_To_DRB_List.list.count; flowidx++)
-                                   {
-                                      if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                            DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
-                                      {
-                                         if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                               DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
-                                               qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
-                                         {
-                                            if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                                  DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
-                                                  qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
-                                            {
-                                               if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                                     DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
-                                                     qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
-                                               {       
-                                                  FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
-                                                  CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
-
-                                                  CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                                        DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
-                                                        qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
-                                                        sizeof(MaxDataBurstVolume_t));   
-                                               }
-                                               CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                                     DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
-                                                     qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
-                                            }
-                                            CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                                  DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
-                                                  qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
-                                         }
-                                      }
-                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                            DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
-                                      {
-                                         CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-                                               DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
-                                      }
-                                   }
-                                   CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
-                                         flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
-                                         choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
-                                }
-                                CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
-                                      drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
-                             }
-                             CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
-                                   sizeof(OCTET_STRING_t));
-                          }
-                          CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
-                                drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
-                       }
-                       CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
-                             qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
-                    }
-                    CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
-                          qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
-                 }
-                 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
-                       qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
-              }
-              CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
-           }
-        }
-        if(drbSet->list.array[drbidx]!=NULLP)
-        {
-           CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
-        }
+             if(drbSet->list.array[drbidx] != NULLP)
+             {
+                drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
+                if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
+                {
+                   if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                                 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
+               {
+                  if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                                         qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
+                           {
+                              if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                                         qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
+                              {
+                                      if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
+                                      {
+                                         if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
+                                         {
+                                            if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
+                                            {
+                                                    if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
+                                                           flows_Mapped_To_DRB_List.list.array != NULLP)
+                                                    {
+                                                        for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
+                                                                     flows_Mapped_To_DRB_List.list.count; flowidx++)
+                                                        {
+                                                            if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                          DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
+                                                            {
+                                                                    if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                               DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
+                                                                               qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
+                                                                    {
+                                                                        if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                                  DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
+                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
+                                                                        {
+                                                                                if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                                DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
+                                                                                 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
+                                                                                 {     
+                                                                                     FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
+                                                                                     CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
+
+                                                                                     CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                                                  DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
+                                                                                                  qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
+                                                                                                  sizeof(MaxDataBurstVolume_t));
+                                                                                 }
+                                                        CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                                          DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
+                                                                                          qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
+                                                                        }
+                                                                        CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                                      DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
+                                                                                      qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
+                                                                    }
+                                                           }
+                                                           if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                    DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
+                                                           {
+                                                                   CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+                                                                                 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
+                                                           }
+                                                       }
+                                                       CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
+                                                                     flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
+                                                                     choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
+                                                    }
+                                                    CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
+                                                            drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
+                                           }
+                                           CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
+                                                             sizeof(OCTET_STRING_t));
+                                      }
+                                      CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
+                                                   drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
+                                   }
+                                   CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                                           qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
+                           }
+                      CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                                        qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
+                        }
+                        CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                                      qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
+             }
+                 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
+               }
+               CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
+             }
       }
       CU_FREE(drbSet->list.array,drbSet->list.size);
    }
@@ -2722,13 +2723,13 @@ void FreeUeContextSetupReq(F1AP_PDU_t  *f1apMsg)
            {
               if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
               {
-                 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
+                      CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
               }
            }
            CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
         }
         CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
-      }
+  }
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
    }
 }
@@ -6575,11 +6576,147 @@ uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
    return ret;
 }/* End of BuildAndSendUeContextSetupReq*/
 
+/**********************************************************************
+ * @brief Function to extractTeId received in UE context setup Response 
+ *
+ * @details
+ *
+ *    Function : extractTeId
+ *    
+ *    Functionality:
+ *         - Function to extract TeId
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ **********************************************************************/
+uint8_t extractTeId(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo)
+{
+   uint8_t arrIdx = 0;
+   uint32_t teId = 0;
+   GTPTunnel_t *gtpDl = NULLP;
+
+   for(arrIdx =0; arrIdx < dlTnlInfo->list.count; arrIdx++)
+   {
+      if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
+      {
+         if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel != NULLP)
+         {
+            gtpDl = dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel;
+            if(gtpDl->gTP_TEID.size > 0)
+            {
+               teIdStringToInt(gtpDl->gTP_TEID.buf, &teId); 
+            }
+            else
+               DU_LOG("\nERROR  -->  EGTP: No TeId received");
+            return(teId);
+         }
+      }
+   }
+   return teId;
+}
+
+/****************************************************************
+ * @brief Function to add Drb tunnels 
+ *
+ * @details
+ *
+ *    Function : addDrbTunnels
+ *    
+ *    Functionality:
+ *         - Function to add Drb tunnels
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t addDrbTunnels(uint8_t teId)
+{
+   uint8_t ret = ROK;
+   EgtpTnlEvt tnlEvt;
+
+   if(teId > MAX_TEID || teId < MIN_TEID)
+   {
+      DU_LOG("\nERROR  -->  EGTP : TEID(%x) OUT Of Range",teId);
+   }
+   memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
+   tnlEvt.action = EGTP_TNL_MGMT_ADD;
+   tnlEvt.lclTeid = teId;
+   tnlEvt.remTeid = teId;
+   ret = cuEgtpTnlMgmtReq(tnlEvt);
+   if(ret != ROK)
+   {
+      DU_LOG("\nERROR  -->  EGTP : Tunnel management request failed for teId %x", teId);
+   }
+   return ROK;
+}
+
+/****************************************************************
+ * @brief Function to process Drb Setup List 
+ *
+ * @details
+ *
+ *    Function : procDrbSetupList
+ *    
+ *    Functionality:
+ *         - Function to process DRB Setup List
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
+{
+   uint8_t arrIdx = 0;
+   uint32_t teId = 0;
+   DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
+
+   if(drbSetupList != NULLP)
+   {
+      for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
+      {
+         drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
+         if(drbItemIe->value.present == DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item)
+         {
+            /* extracting teId */
+            teId  = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
+            if(teId > 0)
+            {
+              if(addDrbTunnels(teId)== ROK)
+              {
+                DU_LOG("\nDEBUG  --> EGTP: Tunnel Added for TeId %d", teId);
+              }
+            }
+            else
+               return RFAILED;
+         }
+      }
+   }
+   return ROK;
+}
 
+/****************************************************************
+ * @brief Function to process Ue Context Setup Response 
+ *
+ * @details
+ *
+ *    Function : procUeContextSetupResponse
+ *    
+ *    Functionality:
+ *         - Function to process Ue Context Setup Response
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
 uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
 {
    uint8_t idx, duUeF1apId;
-   UEContextSetupResponse_t *ueCtxtSetupRsp;
+   UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
    ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
    
    for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
@@ -6591,9 +6728,17 @@ uint8_t procUeContextSetupResponse(F1AP_PDU_t *f1apMsg)
                 duUeF1apId = ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
                 break;
              }
+          case ProtocolIE_ID_id_DRBs_Setup_List:
+             {
+                /* Adding Tunnels for successful DRB */
+                procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
+                break; 
+
+             }
       }
    }
    ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
+   return ROK;
 }
 
 /****************************************************************
@@ -7753,7 +7898,6 @@ uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
 
    duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
-
    for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
    {
       switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
@@ -7797,6 +7941,178 @@ uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
 
    return ROK;
 }
+
+/*******************************************************************
+*
+* @brief storing slice list in CU database
+*
+* @details
+*
+*    Function : buildSliceList
+*
+*    Functionality:
+*         - storing slice list in CU database 
+*
+* @params[in] SliceSupportList_t *sliceSupportList
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
+{
+   uint8_t sliceListIdx = 0;
+
+   if(sliceSupportList)
+   {
+      if(sliceSupportList->list.array)
+      {
+         cuCfgParams.numSnssaiSupported = sliceSupportList->list.count;
+         for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
+         {
+            if(sliceSupportList->list.array[sliceListIdx])
+            {
+               CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai)); 
+               if(cuCfgParams.snssaiList[sliceListIdx] == NULLP)
+               {
+                   DU_LOG("\nERROR  --> CU_STUB: buildSliceList(): Memory allocation failed");
+                   return RFAILED;
+               }
+               if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
+               {
+                  memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
+                  sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
+               }
+               if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
+               {
+                  memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\
+                  sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
+                  sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
+               }
+            }
+         }
+      }
+   }
+   return ROK;
+}
+
+/*******************************************************************
+*
+* @brief processing of GNB_DU_Served_Cells Plmn list  information
+*
+* @details
+*
+*    Function : procServedCellPlmnList
+*
+*    Functionality:
+*         - processing of GNB_DU_Served_Cells Plmn list information for storing
+*         SNSSAI list
+*
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t procServedCellPlmnList(ServedPLMNs_List_t *srvPlmn)
+{
+   uint8_t srvPlmnIdx=0, ieExtensionsLstIdx=0;
+   ProtocolExtensionContainer_4624P3_t **ieExtend;
+
+   if(srvPlmn->list.array)
+   {
+      for(srvPlmnIdx=0; srvPlmnIdx<srvPlmn->list.count; srvPlmnIdx++)
+      {
+         if(srvPlmn->list.array[srvPlmnIdx])
+         {
+            ieExtend =  &srvPlmn->list.array[srvPlmnIdx]->iE_Extensions;
+            if(*ieExtend)
+            {
+               if((*ieExtend)->list.array)
+               {
+                  for(ieExtensionsLstIdx = 0; ieExtensionsLstIdx<(*ieExtend)->list.count; ieExtensionsLstIdx++)
+                  {
+                     if((*ieExtend)->list.array[ieExtensionsLstIdx])
+                     {
+                        switch((*ieExtend)->list.array[ieExtensionsLstIdx]->id )
+                        {
+                           case ProtocolIE_ID_id_TAISliceSupportList:
+                              {
+                                 if(buildSliceList(&(*ieExtend)->list.array[ieExtensionsLstIdx]->\
+                                          extensionValue.choice.SliceSupportList) != ROK)
+                                 {
+                                    DU_LOG("\nERROR  --> CU_STUB: procServedCellPlmnList(): Failed to build slice List");
+                                    return RFAILED;
+                                 }
+                              }
+                        }
+                     }
+                  }
+               }
+            }
+         }
+      }
+   }
+   return ROK;
+}
+/*******************************************************************
+*
+* @brief processing of F1 setup request
+*
+* @details
+*
+*    Function : procF1SetupReq 
+*
+*    Functionality:
+*         - processing of  F1 setup request
+*
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+void procF1SetupReq(F1AP_PDU_t *f1apMsg)
+{
+   uint8_t ieIdx = 0, plmnidx=0, ret=ROK;
+   F1SetupRequest_t *f1SetupReq = NULLP;
+   GNB_DU_Served_Cells_Item_t *srvCellItem = NULLP; 
+   GNB_DU_Served_Cells_List_t *duServedCell = NULLP;
+
+   f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
+   for(ieIdx=0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
+   {
+      switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
+      {
+         case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
+           {
+               duServedCell = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
+               if(duServedCell->list.array)
+               {
+                  for(plmnidx=0; plmnidx<duServedCell->list.count; plmnidx++)
+                  {
+                     if(duServedCell->list.array[plmnidx])
+                     {
+                        switch(duServedCell->list.array[plmnidx]->id)
+                        {
+                           case ProtocolIE_ID_id_GNB_DU_Served_Cells_Item:
+                           {
+                              srvCellItem =  &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item;
+                              ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs);
+                           }
+                        }
+                     }
+                  }
+               }
+           }
+      }
+   }
+   if(ret == ROK)
+   {
+      BuildAndSendF1SetupRsp();
+   }
+   else
+   {
+       DU_LOG("\nERROR  --> CU_STUB: procF1SetupReq(): Failed to process F1 setup request");
+   }
+}
 /*******************************************************************
  *
  * @brief Handles received F1AP message and sends back response  
@@ -7879,7 +8195,7 @@ void F1APMsgHdlr(Buffer *mBuf)
                case InitiatingMessage__value_PR_F1SetupRequest:
                   {
                      DU_LOG("\nINFO  -->  F1AP : F1 setup request received");
-                     BuildAndSendF1SetupRsp();
+                     procF1SetupReq(f1apMsg);
                      break;
                   }
 
index ba70927..af563e5 100644 (file)
@@ -35,6 +35,7 @@
 #include "DRB-ToAddMod.h"
 #include "SDAP-Config.h"
 #include "du_log.h"
+#include "cu_stub.h"
 
 #define ENCODE_FAIL -1
 #define TRANS_ID 1
@@ -50,8 +51,9 @@
 #define SRB1 1
 #define SRB2 2
 #define DRB1 1
-#define DRB2 2
+#define DRB2 6 //Pls Ignore this; to avoid the collision with DRBID=2 in UE COntext setup
 #define QCI  9
+#define MAX_DRB_SET 2
 
 #define CU_UE_F1AP_ID 0
 #define DU_UE_F1AP_ID 1
@@ -67,6 +69,7 @@
 #define RRC_RECONFIG 6
 #define UE_CONTEXT_MOD_REQ 7
 
+
 typedef struct f1apDb
 {
    uint8_t dlRrcMsgCount;
index ff9da8e..4460c03 100644 (file)
@@ -215,9 +215,9 @@ void readCuCfg()
    cuCfgParams.egtpParams.destIp.ipV4Pres = TRUE;
    cuCfgParams.egtpParams.destIp.ipV4Addr = ipv4_du;
    cuCfgParams.egtpParams.destPort = DU_EGTP_PORT;
-   cuCfgParams.egtpParams.minTunnelId = 0;
+   cuCfgParams.egtpParams.minTunnelId = MIN_TEID;
    cuCfgParams.egtpParams.currTunnelId = cuCfgParams.egtpParams.minTunnelId;
-   cuCfgParams.egtpParams.maxTunnelId = 10;
+   cuCfgParams.egtpParams.maxTunnelId = MAX_TEID;
 
 } /* End of readCuCfg */
 
@@ -239,14 +239,39 @@ void readCuCfg()
 void *cuConsoleHandler(void *args)
 {
    char ch;
+   uint8_t teId = 0;
+   uint8_t ret = ROK;
+
    while(true) 
    {
       /* Send DL user data to CU when user enters 'd' on console */
       if((ch = getchar()) == 'd')
       {
+
+         uint8_t cnt =0;
+         DU_LOG("\n EGTP --> : Enter TEID id(1..10) where DL Data to be sent\n");
+         scanf("%d",&teId);
+         
+         if(teId > MAX_TEID || teId < MIN_TEID)
+         {
+            DU_LOG("\nERROR  -->  EGTP : TEID(%x) OUT Of Range",teId);
+            printf("\n");
+            continue;
+         }
          /* Start Pumping data from CU to DU */
-         DU_LOG("\nDEBUG  -->  EGTP: Sending DL User Data");
-         cuEgtpDatReq();      
+         DU_LOG("\nDEBUG  -->  EGTP: Sending DL User Data(teId:%d)\n",teId);
+         
+         while(cnt < NUM_DL_PACKETS)
+         {
+           ret =  cuEgtpDatReq(teId);      
+           if(ret != ROK)
+           {
+             DU_LOG("\nERROR --> EGTP: Issue with teid=%d\n",teId);
+             break;
+           }
+           cnt++;
+         }
+         continue;
       } 
    }
 }
index 74d6847..c1a7b81 100644 (file)
 #define CU_POOL 1
 #define MAX_DU_PORT 2
 #define DU_PORT 38472
+#define SD_SIZE   3 /*  As per the spec 38.473, SD size must be of size(3) */
+#define MAX_NUM_OF_SLICE 1024 /* As per the spec 38.473, maxnoofSliceItems = 1024*/
 
+/*VALID Tunnel ID*/
+#define MIN_TEID 1   /*[Spec 29.281,Sec 5.1]: All Zero TEIDs are never assigned for setting up GTP-U Tunnel*/
+#define MAX_TEID 10 /*[Spec 29.281]: Max limit is not mentioned but as per GTP-U Header Format, TEID occupies 4 octets */
 /* allocate and zero out a static buffer */
+
 #define CU_ALLOC(_datPtr, _size)                             \
 {                                                            \
    S16 _ret;                                                 \
@@ -79,6 +85,13 @@ typedef struct CuSctpParams
    uint16_t    cuPort;
 }CuSctpParams;
 
+/* Single Network Slice Selection assistance Info */
+typedef struct snssai
+{
+   uint8_t sst;                /* Slice Type */
+   uint8_t sd[SD_SIZE];        /* Slice Differentiator */
+}Snssai;
+
 typedef struct cuCfgParams
 {
    uint32_t         cuId;
@@ -87,6 +100,8 @@ typedef struct cuCfgParams
    Plmn             plmn;
    EgtpParams       egtpParams;
    RrcVersion       rrcVersion;
+   uint8_t          numSnssaiSupported;
+   Snssai           *snssaiList[MAX_NUM_OF_SLICE];
 }CuCfgParams;
 CuCfgParams cuCfgParams; //global variable to hold all configs
 
index f2b6da6..69f6dba 100644 (file)
 /* This file contains all EGTP related functionality */
 
 #include "common_def.h"
+#include "cu_f1ap_msg_hdl.h"
 #include "cu_stub_egtp.h"
 #include "du_log.h"
 
 /* Global variable declaration */
 EgtpGlobalCb egtpCb;
-
 /**************************************************************************
  * @brief Task Initiation callback function. 
  *
@@ -49,6 +49,9 @@ S16 egtpActvInit()
 {
   DU_LOG("\n\nDEBUG  -->  EGTP : Initializing");
   memset (&egtpCb, 0, sizeof(EgtpGlobalCb));
+  
+  //Initializing with INVALID value
+  memset(egtpCb.gCntPdu, 0xFF , sizeof(uint8_t)*(MAX_TEID+1)); 
   protType = CM_INET_PROTO_UDP;
   return ROK;
 }
@@ -76,7 +79,6 @@ S16 egtpActvInit()
 uint8_t egtpInitReq()
 {
    uint8_t ret = ROK;
-   EgtpTnlEvt tnlEvt;
 
    ret = cuEgtpCfgReq();
    if(ret != ROK)
@@ -92,16 +94,6 @@ uint8_t egtpInitReq()
        return (ret);
    }
 
-   tnlEvt.action = EGTP_TNL_MGMT_ADD;
-   tnlEvt.lclTeid = 1;
-   tnlEvt.remTeid = 1;
-   ret = cuEgtpTnlMgmtReq(tnlEvt);
-   if(ret != ROK)
-   {
-      DU_LOG("\nERROR  -->  EGTP : Tunnel management request failed");
-      return RFAILED;
-   }
-
    return ret;
 } /* egtpInitReq */
 
@@ -309,9 +301,11 @@ S16 cuEgtpTnlAdd(EgtpTnlEvt tnlEvt)
    preDefHdr.teId = teidCb->remTeId;
    preDefHdr.extHdr.pdcpNmb.pres = FALSE;
    preDefHdr.extHdr.udpPort.pres = FALSE;
-   preDefHdr.nPdu.pres = FALSE;
-   
+   preDefHdr.nPdu.pres = TRUE; //Including nPdu when sending data
+   preDefHdr.nPdu.val = 0;
+
    cuEgtpEncodeHdr((uint8_t *)teidCb->preEncodedHdr.hdr, &preDefHdr, &(teidCb->preEncodedHdr.cnt));
+   egtpCb.gCntPdu[teidCb->remTeId] = 0;//Resetting the Cnt Value for this DRB which indicates its creation
 
 /*   SPutSBuf(CU_APP_MEM_REG, CU_POOL, (Data *)teidCb, (Size)sizeof(EgtpTeIdCb));*/
 
@@ -618,18 +612,25 @@ S16 cuEgtpDecodeHdr(Buffer *mBuf)
       ODU_REM_PRE_MSG(&extHdrType, mBuf);
    }
 
-   DU_LOG("\nDEBUG  -->  EGTP : Message Buffer after decoding header ");
+   DU_LOG("\nDEBUG  -->  EGTP : Message Buffer after decoding header [TEID:%d]",egtpMsg.msgHdr.teId);
    ODU_PRINT_MSG(mBuf, 0, 0);
 
    return ROK;
      
 } /* End of cuEgtpDecodeHdr */
 
-S16 cuEgtpDatReq()
+uint16_t cuEgtpDatReq(uint8_t teId)
 {
    uint8_t ret = ROK, cnt = 0;
    EgtpMsg  egtpMsg;
 
+   egtpMsg.msgHdr.teId = teId;
+   
+   if(egtpCb.gCntPdu[teId] == 0xFF) //DRB not created
+   {
+      DU_LOG("\nERROR  -->  EGTP : DRB  not created");
+      return RFAILED ;
+   }
    /* Build Application message that is supposed to come from app to egtp */
    ret = BuildAppMsg(&egtpMsg);
    if(ret != ROK)
@@ -645,15 +646,7 @@ S16 cuEgtpDatReq()
       DU_LOG("\nERROR  -->  EGTP : Failed to build EGTP Msg");
       return RFAILED;
    }
-   /* Send Message to peer */
-   while(cnt < 200)
-   {
-      DU_LOG("\nDEBUG  -->  EGTP : Sending message[%d]", cnt+1);
-      cuEgtpSendMsg(egtpMsg.msg);
-      cnt++;
-      //sleep(1);
-   }
-
+   cuEgtpSendMsg(egtpMsg.msg);
    ODU_PUT_MSG_BUF(egtpMsg.msg);
 
    return ROK;
@@ -763,17 +756,22 @@ S16 BuildAppMsg(EgtpMsg  *egtpMsg)
    ret = ODU_ADD_PRE_MSG_MULT(revPkArray, (MsgLen)cnt, mBuf);
  
    egtpMsg->msgHdr.msgType = EGTPU_MSG_GPDU;
-   egtpMsg->msgHdr.nPdu.pres = FALSE;
+   egtpMsg->msgHdr.nPdu.pres = TRUE;
+
+   if(egtpCb.gCntPdu[egtpMsg->msgHdr.teId] != NUM_DL_PACKETS)
+     egtpCb.gCntPdu[egtpMsg->msgHdr.teId]++;
+   else
+     egtpCb.gCntPdu[egtpMsg->msgHdr.teId] = 1;
+
+   egtpMsg->msgHdr.nPdu.val = egtpCb.gCntPdu[egtpMsg->msgHdr.teId];
    egtpMsg->msgHdr.seqNum.pres = FALSE;
    egtpMsg->msgHdr.extHdr.udpPort.pres = FALSE;
    egtpMsg->msgHdr.extHdr.pdcpNmb.pres = FALSE;
-   egtpMsg->msgHdr.teId = 1;
    egtpMsg->msg = mBuf;
 
    return ret;
 }
 
-
 S16 BuildEgtpMsg(EgtpMsg *egtpMsg)
 {
    EgtpTeIdCb   *teidCb = NULLP;
@@ -830,11 +828,18 @@ S16 BuildEgtpMsg(EgtpMsg *egtpMsg)
       teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 1] &= ~(EGTP_MASK_BIT2);
    }
 
-   ODU_ADD_PRE_MSG_MULT(&teidCb->preEncodedHdr.hdr[hdrLen], (EGTP_MAX_HDR_LEN - hdrLen), egtpMsg->msg);
-
-   DU_LOG("\nDEBUG  -->  EGTP : Sending message buffer");
-   ODU_PRINT_MSG(egtpMsg->msg, 0, 0);
+   /*Update the nPdU number*/
+   if(egtpMsg->msgHdr.nPdu.pres)
+   {
+      teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 1] |= (EGTP_MASK_BIT1);
+      teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 11] = egtpMsg->msgHdr.nPdu.val;
+   }
+   else
+   {
+      teidCb->preEncodedHdr.hdr[EGTP_MAX_HDR_LEN - 1] &= ~(EGTP_MASK_BIT1);
+   }
 
+   ODU_ADD_PRE_MSG_MULT(&teidCb->preEncodedHdr.hdr[hdrLen], (EGTP_MAX_HDR_LEN - hdrLen), egtpMsg->msg);
    return ROK;
 }
 
index 02b11d4..5addcb0 100644 (file)
@@ -47,6 +47,8 @@
 #define EGTP_MASK_BIT7                   0x40
 #define EGTP_MASK_BIT8                   0x80
 
+#define NUM_DL_PACKETS 4
+
 uint8_t         sockType;
 uint8_t         protType;
 
@@ -123,6 +125,7 @@ typedef struct egtpGlobalCb
    EgtpParams   egtpCfg;         /* EGTP configuration */
    EgtpTptSrvr  recvTptSrvr;     /* Transport server for receiving UDP msg */
    EgtpDstCb    dstCb;           /* Destination endpoint */
+   uint8_t      gCntPdu[MAX_TEID+1]; /* Maintaining PDU count for each bearer */
 }EgtpGlobalCb;
 EgtpGlobalCb egtpCb;   /* EGTP global control block */
 
@@ -135,7 +138,7 @@ S16 cuEgtpTnlMod(EgtpTnlEvt tnlEvt);
 S16 cuEgtpTnlDel(EgtpTnlEvt tnlEvt);
 S16 cuEgtpEncodeHdr(uint8_t *preEncodedHdr, EgtpMsgHdr *preDefHdr, uint8_t *hdrIdx);
 S16 cuEgtpHdlRecvMsg(Buffer *mBuf);
-S16 cuEgtpDatReq();
+uint16_t cuEgtpDatReq(uint8_t teId);
 S16 BuildAppMsg(EgtpMsg  *egtpMsg);
 S16 BuildEgtpMsg(EgtpMsg *egtpMsg);
 S16 cuEgtpSendMsg(Buffer *mBuf);
index 5b41aac..f9b4176 100644 (file)
@@ -215,10 +215,7 @@ uint8_t readMacCfg()
    }
    else
    {
-      for(uint8_t idx=0; idx<encBufSize; idx++)
-      {
-        duCfgParam.macCellCfg.ssbCfg.mibPdu[idx]=encBuf[idx];
-      }
+      memcpy(&duCfgParam.macCellCfg.ssbCfg.mibPdu, encBuf,encBufSize);
    }
    duCfgParam.macCellCfg.ssbCfg.multCarrBand = SSB_MULT_CARRIER_BAND;
    duCfgParam.macCellCfg.ssbCfg.multCellCarr = MULT_CELL_CARRIER;
@@ -467,6 +464,7 @@ uint8_t fillServCellCfgCommSib(SrvCellCfgCommSib *srvCellCfgComm)
    pdcchCfg.searchSpcId = PDCCH_SEARCH_SPACE_ID;
    pdcchCfg.ctrlRsrcSetId = PDCCH_CTRL_RSRC_SET_ID;
    pdcchCfg.monitorSlotPrdAndOffPresent = \
+      
       SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
    //pdcchCfg.monitorSlotPrdAndOff = \
    SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
@@ -601,10 +599,23 @@ uint8_t fillServCellCfgCommSib(SrvCellCfgCommSib *srvCellCfgComm)
 
 uint8_t readCfg()
 {
-   uint8_t i,j,k;
+   uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx;
+   uint8_t brdcstPlmnIdx, freqBandIdx, srvdPlmnIdx;
    uint32_t ipv4_du, ipv4_cu, ipv4_ric;
    MibParams mib;
-   Sib1Params sib1;    
+   Sib1Params sib1;
+   F1TaiSliceSuppLst *taiSliceSuppLst;
+   RrmPolicy  *rrmPolicy;
+
+   /* TODO Added these below variable for local testing, once we will receive the
+    * configuration from O1 we can remove these variable */
+   F1Snsaai snsaai[NUM_OF_SUPPORTED_SLICE] = {{1,{2,3,4}},{5,{6,7,8}}};
+   ResourceType rsrcType = PRB;
+   RrmPolicyRatio policyRatio= {10,20,30};
+   PolicyMemberList memberList;
+   
+   memset(&memberList, 0, sizeof(PolicyMemberList));
+   memberList.snsaai =  snsaai[DEDICATED_SLICE_INDEX];
 
 #ifdef O1_ENABLE
    if( getStartupConfig(&g_cfg) != ROK )
@@ -644,8 +655,8 @@ uint8_t readCfg()
    duCfgParam.egtpParams.destIp.ipV4Pres = TRUE;
    duCfgParam.egtpParams.destIp.ipV4Addr = ipv4_cu;
    duCfgParam.egtpParams.destPort = CU_EGTP_PORT;
-   duCfgParam.egtpParams.minTunnelId = 0;
-   duCfgParam.egtpParams.maxTunnelId = 10;
+   duCfgParam.egtpParams.minTunnelId = MIN_TEID;
+   duCfgParam.egtpParams.maxTunnelId = MAX_TEID;
 
    duCfgParam.maxUe = 32; //TODO: Check
    /* DU Info */       
@@ -678,14 +689,11 @@ uint8_t readCfg()
    sib1.tac = DU_TAC;
    sib1.ranac = DU_RANAC;
    sib1.cellIdentity = CELL_IDENTITY;
-   sib1.cellResvdForOpUse =\
-      PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved;
+   sib1.cellResvdForOpUse = PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved;
    sib1.connEstFailCnt = ConnEstFailureControl__connEstFailCount_n3;
-   sib1.connEstFailOffValidity =\
-      ConnEstFailureControl__connEstFailOffsetValidity_s120;
+   sib1.connEstFailOffValidity = ConnEstFailureControl__connEstFailOffsetValidity_s120;
    sib1.siSchedInfo.winLen = SI_SchedulingInfo__si_WindowLength_s5;
-   sib1.siSchedInfo.broadcastSta = \
-      SchedulingInfo__si_BroadcastStatus_broadcasting;
+   sib1.siSchedInfo.broadcastSta = SchedulingInfo__si_BroadcastStatus_broadcasting;
    sib1.siSchedInfo.preiodicity = SchedulingInfo__si_Periodicity_rf8;
    sib1.siSchedInfo.sibType = SIB_TypeInfo__type_sibType2;
    sib1.siSchedInfo.sibValTag = SIB1_VALUE_TAG;
@@ -694,154 +702,204 @@ uint8_t readCfg()
 
    duCfgParam.sib1Params = sib1;
 
-   for(i=0; i<DEFAULT_CELLS; i++)
+   for(srvdCellIdx=0; srvdCellIdx<DEFAULT_CELLS; srvdCellIdx++)
    { 
-      memset(&duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn, 0, sizeof(Plmn));
-      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[0] = PLMN_MCC0;
-      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[1] = PLMN_MCC1;
-      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[2] = PLMN_MCC2;
-      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[0] = PLMN_MNC0;
-      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[1] = PLMN_MNC1;
+      memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn, 0, sizeof(Plmn));
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[0] = PLMN_MCC0;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[1] = PLMN_MCC1;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[2] = PLMN_MCC2;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mnc[0] = PLMN_MNC0;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mnc[1] = PLMN_MNC1;
 
       /*Cell ID */
-      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.cellId = NR_CELL_ID;
-      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrPci = NR_PCI;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.cellId = NR_CELL_ID;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrPci = NR_PCI;
 
       /* List of Available PLMN */
-      for(j=0;j<MAX_PLMN;j++)
+      for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
       {
-        memset(&duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j], 0, sizeof(Plmn));
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[0] = PLMN_MCC0;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[1] = PLMN_MCC1;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[2] = PLMN_MCC2;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[0] = PLMN_MNC0;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[1] = PLMN_MNC1;
+         /* As per spec 38.473, Plmn identity consists of 3 digit from mcc
+          * followed by either 2 digit or 3 digits of mnc */ 
+
+         memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn, 0,\
+         sizeof(Plmn));
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[0] = PLMN_MCC0;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[1] = PLMN_MCC1;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[2] = PLMN_MCC2;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[0] = PLMN_MNC0;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[1] = PLMN_MNC1;
       }
       /* List of Extended PLMN */
-      for(j=0;j<MAX_PLMN;j++)
+      for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
       {
-        memset(&duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j], 0, sizeof(Plmn));
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[0] = PLMN_MCC0;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[1] = PLMN_MCC1;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[2] = PLMN_MCC2;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[0] = PLMN_MNC0;
-        duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[1] = PLMN_MNC1;
+         /* As per spec 38.473, Plmn identity consists of 3 digit from mcc
+          * followed by either 2 digit or 3 digits of mnc */ 
+
+         memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn, 0, sizeof(Plmn));
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[0] = PLMN_MCC0;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[1] = PLMN_MCC1;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[2] = PLMN_MCC2;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mnc[0] = PLMN_MNC0;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mnc[1] = PLMN_MNC1;
       } 
-
+      /* List of Supporting Slices */
+      for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
+      {
+         taiSliceSuppLst = &duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].taiSliceSuppLst;
+
+         taiSliceSuppLst->pres = true;
+         taiSliceSuppLst->numSupportedSlices = NUM_OF_SUPPORTED_SLICE;
+
+         memset(&taiSliceSuppLst->snssai, 0, sizeof(F1Snsaai));
+         for(sliceIdx=0; sliceIdx<NUM_OF_SUPPORTED_SLICE; sliceIdx++)
+         {
+            DU_ALLOC(taiSliceSuppLst->snssai[sliceIdx], sizeof(F1Snsaai));
+            if(taiSliceSuppLst->snssai[sliceIdx] == NULLP)
+            {
+               DU_LOG("\nERROR --> DU_APP: readCfg():Memory allocation failed");
+               return RFAILED;
+            }
+            memcpy(taiSliceSuppLst->snssai[sliceIdx], &snsaai[sliceIdx], sizeof(F1Snsaai));
+            
+            /* Checking rrmPolicy Slice list available or not */
+            if(!memcmp(&snsaai[sliceIdx], &memberList.snsaai, sizeof(F1Snsaai)))
+            {
+               rrmPolicy = &duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].rrmPolicy;
+               rrmPolicy->present = true;
+               rrmPolicy->rsrcType = rsrcType; 
+               rrmPolicy->memberList.snsaai = memberList.snsaai;
+               rrmPolicy->rrmPolicyRatio = policyRatio;
+            }
+         }
+      }
       /* TAC and EPSTAC */
-      duCfgParam.srvdCellLst[i].duCellInfo.tac = DU_TAC;
-      duCfgParam.srvdCellLst[i].duCellInfo.epsTac = DU_TAC; //to check and fill
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.tac = DU_TAC;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.epsTac = DU_TAC; //to check and fill
       /* NR Mode info */
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn = NR_UL_ARFCN;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn = NR_UL_ARFCN;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
 
 #if 0
       /* NR Mode info */
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_ARFCN;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;          
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;          
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_ARFCN;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;                
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;        
 
-      for(j=0;j<MAXNRCELLBANDS;j++)
+      for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
       {
-        duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
-        for(k=0;k<MAXNRCELLBANDS;k++)
-        {
-           duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;  
-        }
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[freqBandIdx].nrFreqBand =\
+         NR_FREQ_BAND;
+         for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
+         {
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[freqBandIdx].sulBand[bandIdx]\
+            = SUL_BAND;        
+         }
       }
 #endif
-      for(j=0;j<MAXNRCELLBANDS;j++)
+      for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
       {
-        duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
-        for(k=0;k<MAXNRCELLBANDS;k++)
-        {
-           duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;
-        }
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[freqBandIdx].\
+         nrFreqBand = NR_FREQ_BAND;
+         for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
+         {
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[freqBandIdx].\
+            sulBand[bandIdx] = SUL_BAND;
+         }
       }
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.nrArfcn = NR_DL_ARFCN;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
-      for(j=0;j<MAXNRCELLBANDS;j++)
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.nrArfcn = NR_DL_ARFCN;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
+      for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
       {
-        duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
-        for(k=0;k<MAXNRCELLBANDS;k++)
-        {
-           duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;
-        }
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[freqBandIdx].\
+         nrFreqBand = NR_FREQ_BAND;
+         for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
+         {
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[freqBandIdx].\
+            sulBand[bandIdx] = SUL_BAND;
+         }
       }
 
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrScs = SCS_15;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrb = NRB_106;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrScs = SCS_15;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrb = NRB_106;
 
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrScs = SCS_15;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrb = NRB_106;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrScs = SCS_15;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrb = NRB_106;
 
-#if 0
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrScs = SCS_15;
-      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrb = NRB_106;
-#endif
       /*Measurement Config and Cell Config */ 
-      duCfgParam.srvdCellLst[i].duCellInfo.measTimeCfg = TIME_CFG; 
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.measTimeCfg = TIME_CFG; 
 
-      duCfgParam.srvdCellLst[i].duCellInfo.cellDir = DL_UL; 
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellDir = DL_UL; 
 
-      duCfgParam.srvdCellLst[i].duCellInfo.cellType=CELL_TYPE;
+      duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellType=CELL_TYPE;
 
       /* Broadcast PLMN Identity */
-      for(j=0;j<MAXBPLMNNRMINUS1;j++)
+      for(brdcstPlmnIdx=0; brdcstPlmnIdx<MAX_BPLMN_NRCELL_MINUS_1; brdcstPlmnIdx++)
       { 
-        for(k=0;k<MAX_PLMN;k++)
-        {
-           memset(&duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k], 0, sizeof(Plmn));
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[0] = PLMN_MCC0;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[1] = PLMN_MCC1;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[2] = PLMN_MCC2;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[0] = PLMN_MNC0;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[1] = PLMN_MNC1;                                         
-        }
-        /* Extended PLMN List */        
-        for(k=0;k<MAX_PLMN;k++)
-        {
-           memset(&duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k], 0, sizeof(Plmn));
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[0] = PLMN_MCC0;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[1] = PLMN_MCC1;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[2] = PLMN_MCC2;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[0] = PLMN_MNC0;
-           duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[1] = PLMN_MNC1;
-        }
-
-        duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].tac = DU_TAC;
-        duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].nrCellId = NR_CELL_ID;
-        duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].ranac = NR_RANAC;
+         for(plmnIdx=0; plmnIdx<MAX_PLMN; plmnIdx++)
+         {
+            memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx],\
+            0, sizeof(Plmn));
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[0] =\
+            PLMN_MCC0;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[1] =\
+            PLMN_MCC1;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[2] =\
+            PLMN_MCC2;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mnc[0] =\
+            PLMN_MNC0;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mnc[1] =\
+            PLMN_MNC1;
+         }
+         /* Extended PLMN List */       
+         for(plmnIdx=0; plmnIdx<MAX_PLMN; plmnIdx++)
+         {
+            memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
+            extPlmn[plmnIdx], 0, sizeof(Plmn));
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
+            extPlmn[plmnIdx].mcc[0] = PLMN_MCC0;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
+            extPlmn[plmnIdx].mcc[1] = PLMN_MCC1;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
+            extPlmn[plmnIdx].mcc[2] = PLMN_MCC2;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
+            extPlmn[plmnIdx].mnc[0] = PLMN_MNC0;
+            duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
+            extPlmn[plmnIdx].mnc[1] = PLMN_MNC1;
+         }
+
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].tac = DU_TAC;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].nrCellId = NR_CELL_ID;
+         duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].ranac = NR_RANAC;
       }
 
       /*gnb DU System Info mib msg*/
       BuildMibMsg();
-      DU_ALLOC(duCfgParam.srvdCellLst[i].duSysInfo.mibMsg, encBufSize);
-      if(!(duCfgParam.srvdCellLst[i].duSysInfo.mibMsg))
+      DU_ALLOC(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg, encBufSize);
+      if(!(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg))
       {
-        DU_LOG("\nERROR  -->  DU APP : Memory allocation failure at readCfg");
-        return RFAILED;
+         DU_LOG("\nERROR  -->  DU APP : Memory allocation failure at readCfg");
+         return RFAILED;
       }
-      memcpy(duCfgParam.srvdCellLst[i].duSysInfo.mibMsg, encBuf, encBufSize);
-      duCfgParam.srvdCellLst[i].duSysInfo.mibLen = encBufSize;
+      memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg, encBuf, encBufSize);
+      duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibLen = encBufSize;
 
       /*gnb DU System Info mib msg*/
       BuildSib1Msg();
-      DU_ALLOC(duCfgParam.srvdCellLst[i].duSysInfo.sib1Msg,\
-           encBufSize);
-      if(!(duCfgParam.srvdCellLst[i].duSysInfo.sib1Msg))
+      DU_ALLOC(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\
+            encBufSize);
+      if(!(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg))
       {
-        DU_LOG("\nERROR  -->  DU APP : Memory allocation failure at readCfg");
-        return RFAILED;
+         DU_LOG("\nERROR  -->  DU APP : Memory allocation failure at readCfg");
+         return RFAILED;
       }
-      memcpy(duCfgParam.srvdCellLst[i].duSysInfo.sib1Msg,\
-           encBuf,encBufSize);
-      duCfgParam.srvdCellLst[i].duSysInfo.sib1Len = encBufSize;
+      memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\
+            encBuf,encBufSize);
+      duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Len = encBufSize;
 
    }
 
@@ -877,6 +935,7 @@ uint8_t duReadCfg()
    Buffer *mBuf;
 
    memset(&duCfgParam, 0, sizeof(DuCfgParams));
+
    //Read configs into duCfgParams
    if(readCfg() != ROK)
    {
index 419cfe0..168b22d 100644 (file)
 #define MAX_F1_CONNECTIONS 65536    /* Max num of F1 connections */
 #define MAX_PLMN           1        /* Max num of broadcast PLMN ids */
 #define MAXNRARFCN         3279165  /* Maximum values of NRAFCN */
-#define MAXNRCELLBANDS     2       /* Maximum number of frequency bands */
+#define MAX_NRCELL_BANDS   2       /* Maximum number of frequency bands */
 #define MAX_NUM_OF_SLICE_ITEMS 1024     /* Maximum number of signalled slice support items */
-#define MAXBPLMNNRMINUS1   1       /* Maximum number of PLMN Ids broadcast in an NR cell minus 1 */
+#define MAX_BPLMN_NRCELL_MINUS_1   1       /* Maximum number of PLMN Ids broadcast in an NR cell minus 1 */
 #define MAXNUMOFSIBTYPES   32       /* Maximum number of SIB types */
 #define MAX_TNL_ASSOC      32       /* Max num of TNL Assoc between CU and DU */
 #define MAXCELLINENB       256      /* Max num of cells served by eNB */
 #define MAXNUMOFUACPERPLMN 64       /* Maximum number of signalled categories per PLMN */
 #define NR_RANAC           150      /* RANAC */
 #define DEFAULT_CELLS      1        /* Max num of broadcast PLMN ids */
-
+#define NUM_OF_SUPPORTED_SLICE  2
+#define DEDICATED_SLICE_INDEX   1 
+#define IE_EXTENSION_LIST_COUNT 1
 
 /* Macro definitions for MIB/SIB1 */
 #define SYS_FRAME_NUM 0
 #define PDSCH_MCS_INDEX 20  /* For 64QAM, valid mcs index: 17-28 in 38.214  - Table 5.1.3.1-1*/
 #define PUSCH_MCS_INDEX 10  /* For 16QAM, valid mcs index: 10-16 in 38.214  - Table 5.1.3.1-1*/
 
+/*VALID Tunnel ID*/
+#define MIN_TEID 1   /*[Spec 29.281,Sec 5.1]: All Zero TEIDs are never assigned for setting up GTP-U Tunnel*/
+#define MAX_TEID 10 /*[Spec 29.281]: Max limit is not mentioned but as per GTP-U Header Format, TEID occupies 4 octets */
 typedef enum
 {
    GNBDU,
@@ -491,6 +496,12 @@ typedef enum
    PUSCH_MAPPING_TYPE_B,
 }puschMappingType;
 
+typedef enum
+{
+   PRB,
+   DRB,
+   RRC_CONNECTED_USERS
+}ResourceType;
 
 typedef struct f1RrcVersion
 {
@@ -595,14 +606,14 @@ typedef struct f1SulInfo
 typedef struct f1FreqBand
 {
    uint16_t   nrFreqBand;
-   uint16_t   sulBand[MAXNRCELLBANDS];
+   uint16_t   sulBand[MAX_NRCELL_BANDS];
 }F1FreqBand;
 
 typedef struct f1NrFreqInfo
 {
    uint32_t        nrArfcn;
    F1SulInfo  sulInfo;
-   F1FreqBand freqBand[MAXNRCELLBANDS];
+   F1FreqBand freqBand[MAX_NRCELL_BANDS];
 }F1NrFreqInfo;
 
 typedef struct f1NrFddInfo
@@ -651,7 +662,7 @@ typedef struct f1EutraModeInfo
 typedef struct f1Snsaai
 {
    uint8_t   sst;
-   uint32_t  sd;
+   uint8_t   sd[SD_SIZE];
 }F1Snsaai;
 
 typedef struct epIpAddr
@@ -665,16 +676,40 @@ typedef struct epIpAddrPort
    char   port[2];
 }EpIpAddrPort;
 
+typedef struct policyMemberList
+{
+   Plmn   plmn;
+   F1Snsaai snsaai;   
+}PolicyMemberList;
+
+typedef struct rrmPolicyRatio
+{
+   uint8_t policyMaxRatio;
+   uint8_t policyMinRatio;
+   uint8_t policyDedicatedRatio;
+}RrmPolicyRatio;
+
+typedef struct rrmPolicy
+{
+   bool present;
+   ResourceType     rsrcType;
+   PolicyMemberList memberList;
+   RrmPolicyRatio   rrmPolicyRatio;
+}RrmPolicy;
+
 typedef struct f1TaiSliceSuppLst
 {
    bool       pres;
-   F1Snsaai   snssai[MAX_NUM_OF_SLICE_ITEMS];   
+   uint8_t    numSupportedSlices;
+   F1Snsaai   *snssai[MAX_NUM_OF_SLICE_ITEMS];   
 }F1TaiSliceSuppLst;
 
 typedef struct f1SrvdPlmn
 {
-   Plmn              plmn;
-   F1TaiSliceSuppLst   taiSliceSuppLst;
+   Plmn   plmn;
+   Plmn   extPlmn;    /* Extended available PLMN list */
+   F1TaiSliceSuppLst taiSliceSuppLst;
+   RrmPolicy  rrmPolicy;
 }F1SrvdPlmn;
 
 typedef struct f1BrdcstPlmnInfo
@@ -690,8 +725,7 @@ typedef struct f1CellInfo
 {
    NrEcgi   nrCgi;                   /* Cell global Identity */
    uint32_t nrPci;                   /* Physical Cell Identity */
-   Plmn   plmn[MAX_PLMN];     /* Available PLMN list */
-   Plmn   extPlmn[MAX_PLMN];  /* Extended available PLMN list */
+   F1SrvdPlmn srvdPlmn[MAX_PLMN];
 }F1CellInfo;
 
 typedef struct f1DuCellInfo
@@ -703,7 +737,7 @@ typedef struct f1DuCellInfo
    uint8_t            measTimeCfg;  /* Measurement timing configuration */
    F1CellDir          cellDir;      /* Cell Direction */
    F1CellType         cellType;     /* Cell Type */
-   F1BrdcstPlmnInfo   brdcstPlmnInfo[MAXBPLMNNRMINUS1]; /* Broadcast PLMN Identity Info List */
+   F1BrdcstPlmnInfo   brdcstPlmnInfo[MAX_BPLMN_NRCELL_MINUS_1]; /* Broadcast PLMN Identity Info List */
 }F1DuCellInfo;
 
 typedef struct f1DuSysInfo
index b895aa2..fc9df1b 100644 (file)
@@ -932,7 +932,7 @@ uint8_t egtpRecvMsg()
          &recvBuf, (int16_t *)&bufLen, CM_INET_NO_FLAG);
       if(ret == ROK && recvBuf != NULLP)
       {  
-         //DU_LOG("\nDEBUG  -->  EGTP : Received DL Message[%ld]\n", gDlDataRcvdCnt + 1);
+         DU_LOG("\nDEBUG  -->  EGTP : Received DL Message[%ld]\n", gDlDataRcvdCnt + 1);
          //ODU_PRINT_MSG(recvBuf, 0 ,0);
          egtpHdlRecvData(recvBuf);
          gDlDataRcvdCnt++;
index d72a92d..8017d6d 100644 (file)
@@ -956,95 +956,107 @@ uint8_t BuildNrMode(NR_Mode_Info_t *mode)
  * ****************************************************************/
 uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
 {
-   uint8_t idx;
-   uint8_t plmnidx;
-   uint8_t extensionCnt=1;
-   uint8_t sliceId=0;
-   uint8_t sdId;
+   uint8_t idx=0, plmnidx=0, sliceLstIdx=0;
+   uint8_t elementCnt=0, extensionCnt=0;
+
+   extensionCnt=IE_EXTENSION_LIST_COUNT;
    DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
    if((*ieExtend) == NULLP)
    {
+      DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
       return RFAILED;
    }
    (*ieExtend)->list.count = extensionCnt;
    (*ieExtend)->list.size = \
-                           extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
+                            extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
    DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
    if((*ieExtend)->list.array == NULLP)
    {
+      DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
       return RFAILED;
    }
    for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
    {
       DU_ALLOC((*ieExtend)->list.array[plmnidx],\
-           sizeof(ServedPLMNs_ItemExtIEs_t));
+            sizeof(ServedPLMNs_ItemExtIEs_t));
       if((*ieExtend)->list.array[plmnidx] == NULLP)
       {
-        return RFAILED;
+         DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
+         return RFAILED;
       }
    }
+   
+   elementCnt = NUM_OF_SUPPORTED_SLICE;
    idx = 0;
    (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
    (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
    (*ieExtend)->list.array[idx]->extensionValue.present = \
-                                                         ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
+   ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.count = 1;
+      list.count = elementCnt;
    (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.size = sizeof(SliceSupportItem_t *);
-   DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array,sizeof(SliceSupportItem_t *));
-   if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array == NULLP)
-   {
-      return RFAILED;
-   }
-   DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array[sliceId],sizeof(SliceSupportItem_t));
-   if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array[sliceId] == NULLP) 
-   {
-      return RFAILED;
-   }
-   (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
-   DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
-        .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
-        extensionValue.choice.SliceSupportList.\
-        list.array[sliceId]->sNSSAI.sST.size);
-   if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
-        .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
-   {
-      return RFAILED;
-   }
-   (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
+      list.size = (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+      list.count * sizeof(SliceSupportItem_t *);
+
    DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
+         list.array, elementCnt * sizeof(SliceSupportItem_t *));
    if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array[sliceId]->sNSSAI.sD == NULLP)
+         list.array == NULLP)
    {
+      DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
       return RFAILED;
    }
-   (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
-   DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
-        SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
-   if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-        list.array[sliceId]->sNSSAI.sD->buf == NULLP)
+
+   for(sliceLstIdx =0; sliceLstIdx<elementCnt; sliceLstIdx++)
    {
-      return RFAILED;
+      DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+            list.array[sliceLstIdx],sizeof(SliceSupportItem_t));
+      if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+            list.array[sliceLstIdx] == NULLP) 
+      {
+         DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
+         return RFAILED;
+      }
+      (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+         list.array[sliceLstIdx]->sNSSAI.sST.size = sizeof(uint8_t);
+      DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
+            .list.array[sliceLstIdx]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
+            extensionValue.choice.SliceSupportList.\
+            list.array[sliceLstIdx]->sNSSAI.sST.size);
+      if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
+            .list.array[sliceLstIdx]->sNSSAI.sST.buf == NULLP)
+      {
+         DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
+         return RFAILED;
+      }
+      (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+         list.array[sliceLstIdx]->sNSSAI.sST.buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.\
+         cellInfo.srvdPlmn[0].taiSliceSuppLst.snssai[sliceLstIdx]->sst;
+      
+      DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+            list.array[sliceLstIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
+      if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+            list.array[sliceLstIdx]->sNSSAI.sD == NULLP)
+      {
+         DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
+         return RFAILED;
+      }
+      (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+         list.array[sliceLstIdx]->sNSSAI.sD->size = 3 * sizeof(uint8_t);
+      DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+            list.array[sliceLstIdx]->sNSSAI.sD->buf, (*ieExtend)->list.array[idx]->extensionValue.choice.\
+            SliceSupportList.list.array[sliceLstIdx]->sNSSAI.sD->size);
+      if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+            list.array[sliceLstIdx]->sNSSAI.sD->buf == NULLP)
+      {
+         DU_LOG("ERROR  --> DU_APP : BuildExtensions(): Memory allocation failed");
+         return RFAILED;
+      }
+      memcpy((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD->buf, duCfgParam.srvdCellLst[0].duCellInfo.\
+      cellInfo.srvdPlmn[0].taiSliceSuppLst.snssai[sliceLstIdx]->sd, (*ieExtend)->list.array[idx]->\
+      extensionValue.choice.SliceSupportList.list.array[sliceLstIdx]->sNSSAI.sD->size);
    }
-   sdId = 0;
-   (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
-   sdId++;
-   (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
-   sdId++;
-   (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
-      list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
    return ROK;
 }
 /*******************************************************************
@@ -1406,10 +1418,9 @@ void FreeRrcVer(RRC_Version_t *rrcVer)
  * ****************************************************************/
 void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
 {
-   uint8_t   plmnCnt=1;
-   uint8_t  sliceId=0;
-   uint8_t  extensionCnt=1;
-   uint8_t  plmnIdx=0;
+   uint8_t   plmnCnt=MAX_PLMN;
+   uint8_t  extensionCnt=IE_EXTENSION_LIST_COUNT;
+   uint8_t  plmnIdx=0, sliceIdx=0;
    GNB_DU_Served_Cells_Item_t *srvCellItem;
    ServedPLMNs_Item_t  *servedPlmnItem;
    SliceSupportItem_t  *sliceSupportItem;
@@ -1437,7 +1448,7 @@ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
             if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx] != NULLP)
             {
                servedPlmnItem = srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx];
-               DU_FREE(servedPlmnItem->pLMN_Identity.buf, servedPlmnItem->pLMN_Identity.size * sizeof(uint8_t));
+               DU_FREE(servedPlmnItem->pLMN_Identity.buf, servedPlmnItem->pLMN_Identity.size);
 
                if(servedPlmnItem->iE_Extensions != NULLP)
                {
@@ -1445,38 +1456,47 @@ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
                   {
                      if(servedPlmnItem->iE_Extensions->list.array[0] != NULLP)
                      {
-                        if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.\
-                              array != NULLP)
+                        if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
+                        SliceSupportList.list.array != NULLP)
                         {
-                           if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.\
-                                 array[sliceId] != NULLP)
+                           for(sliceIdx =0; sliceIdx<servedPlmnItem->iE_Extensions->list.array[0]->\
+                           extensionValue.choice.SliceSupportList.list.count; sliceIdx++)
                            {
-                              sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
-                                                 SliceSupportList.list.array[sliceId];
+                              if(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
+                              SliceSupportList.list.array[sliceIdx] != NULLP)
+                              {
+                                 sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[0]->\
+                                 extensionValue.choice.SliceSupportList.list.array[sliceIdx];
 
-                              DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sizeof(uint8_t));
+                                 DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sizeof(uint8_t));
 
-                              if(sliceSupportItem->sNSSAI.sD != NULLP)
-                              {
-                                 DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size);
-                                 DU_FREE(sliceSupportItem->sNSSAI.sD, sizeof(OCTET_STRING_t));
-                              }
+                                 if(sliceSupportItem->sNSSAI.sD != NULLP)
+                                 {
+                                    DU_FREE(sliceSupportItem->sNSSAI.sD->buf,\
+                                    sliceSupportItem->sNSSAI.sD->size);
+                                    DU_FREE(sliceSupportItem->sNSSAI.sD, sizeof(OCTET_STRING_t));
+                                 }
 
-                              DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-                                    list.array[sliceId], sizeof(SliceSupportItem_t));
+                                 DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.\
+                                 choice.SliceSupportList.list.array[sliceIdx], sizeof(SliceSupportItem_t));
+                              }
                            }
-                           DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-                                 list.array, sizeof(SliceSupportItem_t*));
+                           DU_FREE(servedPlmnItem->iE_Extensions->list.array[0]->extensionValue.choice.\
+                           SliceSupportList.list.array, sizeof(SliceSupportItem_t*));
                         }
-                        DU_FREE(servedPlmnItem->iE_Extensions->list.array[0], sizeof(ServedPLMNs_ItemExtIEs_t));
+                        DU_FREE(servedPlmnItem->iE_Extensions->list.array[0],\
+                        sizeof(ServedPLMNs_ItemExtIEs_t));
                      }
-                     DU_FREE(servedPlmnItem->iE_Extensions->list.array, extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
+                     DU_FREE(servedPlmnItem->iE_Extensions->list.array,\
+                     extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
                   }
                   DU_FREE(servedPlmnItem->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P3_t));
                }
-               DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx], sizeof(ServedPLMNs_Item_t));
+               DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnIdx],\
+               sizeof(ServedPLMNs_Item_t));
             }
-            DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array, sizeof(ServedPLMNs_Item_t *));
+            DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
+            sizeof(ServedPLMNs_Item_t *));
          }
 
          if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP)
@@ -1484,10 +1504,10 @@ void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
                   freqBandListNr.list.array != NULLP)
             {
-               DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
-                     list.array[0],sizeof(FreqBandNrItem_t));
-               DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
-                     list.array,sizeof(FreqBandNrItem_t*));
+               DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
+               uL_NRFreqInfo.freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
+               DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->\
+               uL_NRFreqInfo.freqBandListNr.list.array,sizeof(FreqBandNrItem_t*));
             }
 
             if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
@@ -1796,7 +1816,7 @@ uint8_t BuildAndSendF1SetupReq()
 
 void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem)
 {
-   uint8_t arrIdx=0,i=0;
+   uint8_t arrIdx=0, servedPlmnIdx=0, sliceLstIdx=0;
    ServedPLMNs_Item_t *servedPlmnItem = NULLP;
    SliceSupportItem_t *sliceSupportItem = NULLP;
 
@@ -1822,41 +1842,50 @@ void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem)
             {
                if(servedPlmnItem->iE_Extensions->list.array[arrIdx] != NULLP)
                {
-                  if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array != NULLP)
+                  if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
+                        list.array != NULLP)
                   {
-                     if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array[arrIdx] != NULLP)
+                     for(sliceLstIdx =0; sliceLstIdx<servedPlmnItem->iE_Extensions->list.array[arrIdx]->\
+                           extensionValue.choice.SliceSupportList.list.count; sliceLstIdx++)
                      {
-                        sliceSupportItem = modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->iE_Extensions->\
-                                           list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array[arrIdx];
-
-                        DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sliceSupportItem->sNSSAI.sST.size);
-                        if(sliceSupportItem->sNSSAI.sD != NULLP)
+                        if(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
+                              list.array[sliceLstIdx] != NULLP)
                         {
-                           DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size);
-                           DU_FREE(sliceSupportItem->sNSSAI.sD,sizeof(OCTET_STRING_t));
+
+                           sliceSupportItem = servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
+                                              SliceSupportList.list.array[sliceLstIdx];
+
+                           DU_FREE(sliceSupportItem->sNSSAI.sST.buf, sliceSupportItem->sNSSAI.sST.size);
+                           if(sliceSupportItem->sNSSAI.sD != NULLP)
+                           {
+                              DU_FREE(sliceSupportItem->sNSSAI.sD->buf, sliceSupportItem->sNSSAI.sD->size);
+                              DU_FREE(sliceSupportItem->sNSSAI.sD,sizeof(OCTET_STRING_t));
+                           }
+                           DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
+                                 SliceSupportList.list.array[sliceLstIdx], sizeof(SliceSupportItem_t));
                         }
-                        DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
-                              list.array[arrIdx], sizeof(SliceSupportItem_t));
                      }
-                     DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.array,
-                           servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.list.size);
+                     DU_FREE(servedPlmnItem->iE_Extensions->list.array[arrIdx]->extensionValue.\
+                           choice.SliceSupportList.list.array,\
+                           servedPlmnItem->iE_Extensions->list.array[arrIdx]->\
+                           extensionValue.choice.SliceSupportList.list.size);
                   }
                }
-               for(i=0; i < servedPlmnItem->iE_Extensions->list.count ; i++)
+               for(servedPlmnIdx=0; servedPlmnIdx< servedPlmnItem->iE_Extensions->list.count ; servedPlmnIdx++)
                {
-                  DU_FREE(servedPlmnItem->iE_Extensions->list.array[i], sizeof(ServedPLMNs_ItemExtIEs_t ));
+                  DU_FREE(servedPlmnItem->iE_Extensions->list.array[servedPlmnIdx], sizeof(ServedPLMNs_ItemExtIEs_t ));
                }
                DU_FREE(servedPlmnItem->iE_Extensions->list.array, servedPlmnItem->iE_Extensions->list.size);
             }
             DU_FREE(servedPlmnItem->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
          }
       }
-      for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
+      for(servedPlmnIdx=0; servedPlmnIdx<modifyItem->served_Cell_Information.servedPLMNs.list.count; servedPlmnIdx++)
       {
-         DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i], sizeof(ServedPLMNs_Item_t));
+         DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[servedPlmnIdx], sizeof(ServedPLMNs_Item_t));
       }
       DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
-            modifyItem->served_Cell_Information.servedPLMNs.list.size);
+         modifyItem->served_Cell_Information.servedPLMNs.list.size);
    }
 
    if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD != NULLP)
@@ -2006,119 +2035,135 @@ void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
 
 uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
 {
-   uint8_t ieIdx, ieListCnt;
+   uint8_t ieIdx=0, arrayIdx=0, ieListCnt=0, elementCnt=0, sliceLstIdx=0;
 
-   servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
-   DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\
-        array[0]->pLMN_Identity.size);
-   if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP)
+   servedPlmn->list.array[arrayIdx]->pLMN_Identity.size = 3*sizeof(uint8_t);
+   DU_ALLOC(servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf, servedPlmn->list.\
+         array[arrayIdx]->pLMN_Identity.size);
+   if(servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf == NULLP)
    {
+      DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
       return RFAILED;
    }
-   buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
-        servedPlmn->list.array[0]->pLMN_Identity.buf);
-   DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
-   if(servedPlmn->list.array[0]->iE_Extensions == NULLP)
+   buildPlmnId(duCfgParam.srvdCellLst[arrayIdx].duCellInfo.cellInfo.srvdPlmn[arrayIdx].plmn,\
+         servedPlmn->list.array[arrayIdx]->pLMN_Identity.buf);
+   DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
+   if(servedPlmn->list.array[arrayIdx]->iE_Extensions == NULLP)
    {
+      DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
       return RFAILED;
    }
 
    ieListCnt=1;
-   servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt;
-   servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
-   DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\
-        iE_Extensions->list.size);
-   if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP)
+   servedPlmn->list.array[arrayIdx]->iE_Extensions->list.count = ieListCnt;
+   servedPlmn->list.array[arrayIdx]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
+   DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array,servedPlmn->list.array[arrayIdx]->\
+         iE_Extensions->list.size);
+   if(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array == NULLP)
    {
+      DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
       return RFAILED;
    }
-   for(ieIdx=0;ieIdx<ieListCnt;ieIdx++)
+   for(ieIdx=arrayIdx;ieIdx<ieListCnt;ieIdx++)
    {
-      DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx],\
-           sizeof(ServedPLMNs_ItemExtIEs_t));
-      if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP)
+      DU_ALLOC(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx],\
+            sizeof(ServedPLMNs_ItemExtIEs_t));
+      if(servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx] == NULLP)
       {
-        return RFAILED;
+         DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
+         return RFAILED;
       }
    }
-   //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions; 
-   servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
-   servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore;
-   servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \
-      ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
-   servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.count = 1;
-   servedPlmn->list.array[0]->\
-      iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.size = sizeof(SliceSupportItem_t *);
-   DU_ALLOC(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array,servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
-   if(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array == NULLP)
-   {
-      return RFAILED;
-   }
-
-   DU_ALLOC(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0],sizeof( SliceSupportItem_t));
-   if(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0] == NULLP)
-   {
-      return RFAILED;
-   }
-   servedPlmn->list.array[0]->\
-      iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
-   DU_ALLOC(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
-   if(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0]->sNSSAI.sST.buf == NULLP)
-   {
-      return RFAILED;
-   }
-   servedPlmn->list.array[0]->\
-      iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.array[0]->sNSSAI.sST.buf[0] = 3;
-   DU_ALLOC(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
-   if(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0]->sNSSAI.sD == NULLP)
-   {
-      return RFAILED;
-   }
-   servedPlmn->list.array[0]->\
-      iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
-   DU_ALLOC(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0]->sNSSAI.sD->size);
-   if(servedPlmn->list.array[0]->\
-        iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-        list.array[0]->sNSSAI.sD->buf == NULLP)
-   {
-      return RFAILED;
-   }
-   servedPlmn->list.array[0]->\
-      iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.array[0]->sNSSAI.sD->buf[0] = 3;
-   servedPlmn->list.array[0]->\
-      iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.array[0]->sNSSAI.sD->buf[1] = 6;
-   servedPlmn->list.array[0]->\
-      iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
-      list.array[0]->sNSSAI.sD->buf[2] = 9;
+   
+   ieIdx = 0;
+   elementCnt = NUM_OF_SUPPORTED_SLICE; 
+   servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->id =ProtocolIE_ID_id_TAISliceSupportList;
+   servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->criticality = Criticality_ignore;
+   servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.present = \
+   ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
+   servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.count = elementCnt;
+   servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.size = elementCnt * sizeof(SliceSupportItem_t *);
+   DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
+         iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+         list.array,servedPlmn->list.array[arrayIdx]->\
+         iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.list.size);
+   if(servedPlmn->list.array[arrayIdx]->\
+         iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+         list.array == NULLP)
+   {
+      DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
+      return RFAILED;
+   }
+
+   for(sliceLstIdx =0; sliceLstIdx< elementCnt; sliceLstIdx++)
+   {
+      DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx],sizeof( SliceSupportItem_t));
+      if(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx] == NULLP)
+      {   
+         DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
+         return RFAILED;
+      }
+      
+      servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sST.size = sizeof(uint8_t);
+      DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sST.buf,servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.list.array[sliceLstIdx]->\
+      sNSSAI.sST.size);
+      
+      if(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sST.buf == NULLP)
+      {
+         DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
+         return RFAILED;
+      }
+      servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sST.buf[arrayIdx] =  duCfgParam.srvdCellLst[arrayIdx].duCellInfo.\
+      cellInfo.srvdPlmn[arrayIdx].taiSliceSuppLst.snssai[sliceLstIdx]->sst;
+
+      DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
+      if(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD == NULLP)
+      {
+         DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
+         return RFAILED;
+      }
+      servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD->size = 3 * sizeof(uint8_t);
+      DU_ALLOC(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD->buf,servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD->size);
+      if(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD->buf == NULLP)
+      {
+         DU_LOG("ERROR  --> DU_APP : fillServedPlmns(): Memory allocation failed");
+         return RFAILED;
+      }
+      memcpy(servedPlmn->list.array[arrayIdx]->\
+      iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD->buf, duCfgParam.srvdCellLst[arrayIdx].duCellInfo.\
+      cellInfo.srvdPlmn[arrayIdx].taiSliceSuppLst.snssai[sliceLstIdx]->sd,\
+      servedPlmn->list.array[arrayIdx]->iE_Extensions->list.array[ieIdx]->extensionValue.choice.SliceSupportList.\
+      list.array[sliceLstIdx]->sNSSAI.sD->size);
+   }
    return ROK;
 }
 
@@ -5240,8 +5285,7 @@ void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationL
  * ****************************************************************/
 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
 {
-   uint8_t idx1=0;
-   uint8_t idx2=0;
+   uint8_t rsrcListIdx=0;
    struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
 
    if(puschCfg->pusch_TimeDomainAllocationList)
@@ -5249,23 +5293,23 @@ void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
       timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
       if(timeDomAllocList_t->choice.setup)
       {
-        if(timeDomAllocList_t->choice.setup->list.array)
-        {
-           DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
-           for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
-           {
-              DU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
-                    sizeof(PUSCH_TimeDomainResourceAllocation_t));
-           }
-           DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
-                 timeDomAllocList_t->choice.setup->list.size);
-        }
-        DU_FREE(timeDomAllocList_t->choice.setup, \
-              sizeof(struct PUSCH_TimeDomainResourceAllocationList));
+         if(timeDomAllocList_t->choice.setup->list.array)
+         {
+            for(rsrcListIdx = 0; rsrcListIdx<timeDomAllocList_t->choice.setup->list.count; rsrcListIdx++)
+            {
+               DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx]->k2, sizeof(long));
+               DU_FREE(timeDomAllocList_t->choice.setup->list.array[rsrcListIdx],\
+                     sizeof(PUSCH_TimeDomainResourceAllocation_t));
+            }
+            DU_FREE(timeDomAllocList_t->choice.setup->list.array, \
+                  timeDomAllocList_t->choice.setup->list.size);
+         }
+         DU_FREE(timeDomAllocList_t->choice.setup, \
+               sizeof(struct PUSCH_TimeDomainResourceAllocationList));
       }
       DU_FREE(puschCfg->transformPrecoder, sizeof(long));
       DU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
-           sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
+            sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
    }
 
 }
@@ -7766,6 +7810,8 @@ uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList
      }
      (ueCfgDb->numRlcLcs)++;
      (ueCfgDb->numMacLcs)++;
+         DU_LOG("\nDEBUG  -> DUAPP: extractRlcCfgToAddMod:RBType:%d, DrbID: %d,lcId:%d, [RLC,MAC,NumDrb]:[%x,%x,%x]",\
+                            rbType, rbId, lcId, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs,  ueCfgDb->numDrb);
   }
   //TODO: To send the failure cause in UeContextSetupRsp 
   return ROK;
@@ -8125,13 +8171,19 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg)
  *
  *    Functionality: Fills PdschCfg received  by CU
  *
- * @params[in] PDSCH_Config_t *cuPdschCfg,
- *             PdschConfig *macPdschCfg
+ * @params[in] PDSCH_Config_t *cuPdschCfg = Information which is send by CU,
+ *                   which we have stored in F1UeContextSetupDb,
+ *             PdschConfig *macPdschCfg = Used to Store the information which
+ *                   needs to send in other layer, as well as this can be the variable
+ *                   which stores the information in DuCb,
+ *             PdschConfig *storedPdschCfg =  Null in case of sending the
+ *                   information to other layer else it will have stored pdsch 
+ *                   configuration in copyOfmacUeCfg.
  * @return void
  *
  * ****************************************************************/
 
-void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
+void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg, PdschConfig *storedPdschCfg)
 {
    uint8_t timeDomIdx;
    struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAlloc = NULLP;
@@ -8165,7 +8217,22 @@ void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
                {
                   if(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 == NULL)
                   {
-                     DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
+                     if(storedPdschCfg)
+                     {
+                        if(storedPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0)
+                        {
+                           macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0 =\
+                           storedPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0;
+                        }
+                        else
+                        {
+                           DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
+                        }
+                     }
+                     else
+                     {
+                        DU_ALLOC_SHRABL_BUF(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0, sizeof(uint8_t));
+                     }
                      if(!macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0)
                      {
                         DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for k0 at extractPdschCfg()");
@@ -8173,7 +8240,7 @@ void extractPdschCfg(PDSCH_Config_t *cuPdschCfg, PdschConfig *macPdschCfg)
                      }
                   }
                   *(macPdschCfg->timeDomRsrcAllociList[timeDomIdx].k0) = \
-                       *(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0);
+                  *(timeDomAlloc->choice.setup->list.array[timeDomIdx]->k0);
                }
                macPdschCfg->timeDomRsrcAllociList[timeDomIdx].mappingType = \
                   timeDomAlloc->choice.setup->list.array[timeDomIdx]->mappingType;
@@ -8819,13 +8886,20 @@ void extractSchedReqCfgToAddMod(PucchSchedReqCfg *macSchedReqCfg, struct PUCCH_C
  *
  *    Functionality: Fills PucchCfg received  by CU
  *
- * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg,
- *             PucchCfg *macPucchCfg
+ * @params[in] BWP_UplinkDedicated__pucch_Config *cuPucchCfg = Information which
+ *                is send by CU, which we have stored in F1UeContextSetupDb,
+ *             PucchCfg *macPucchCfg = Used to Store the information which
+ *                needs to send in other layer, as well as this can be the variable
+ *                which stores the information in DuCb,
+ *             PucchCfg *storedPucchCfg = Null in case of sending the
+ *                information to other layer else it will have Pucch Cfg which
+ *                we have stored in copyOfmacUeCfg.
  * @return ROK/RFAILED
  *
  * ****************************************************************/
 
-uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg)         
+uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, PucchCfg *macPucchCfg,\
+PucchCfg *storedPucchCfg)        
 {
    uint8_t arrIdx;
 
@@ -8951,20 +9025,34 @@ uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, Pu
 
          /* Dl_DataToUL_ACK */ 
         if(cuPucchCfg->choice.setup->dl_DataToUL_ACK)
-        {
+    {
+       if(storedPucchCfg)
+       {
+          if(storedPucchCfg->dlDataToUlAck)
+          {
+             macPucchCfg->dlDataToUlAck = storedPucchCfg->dlDataToUlAck; 
+          }
+          else
+          {
             DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
-           if(macPucchCfg->dlDataToUlAck == NULLP)
-           {
-              DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
-              return RFAILED;
-           }
-           memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
-            macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
-           for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
-            {
-               macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
-                  *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
-           }
+          }
+       }
+       else
+       {
+          DU_ALLOC_SHRABL_BUF(macPucchCfg->dlDataToUlAck, sizeof(PucchDlDataToUlAck));
+       }
+       if(macPucchCfg->dlDataToUlAck == NULLP)
+       {
+          DU_LOG("\nERROR --> F1AP : Failed to extract Dl_DataToUL_ACK in extractPucchCfg()");
+          return RFAILED;
+       }
+       memset(macPucchCfg->dlDataToUlAck, 0, sizeof(PucchDlDataToUlAck));
+       macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount = cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.count;
+       for(arrIdx = 0; arrIdx < macPucchCfg->dlDataToUlAck->dlDataToUlAckListCount; arrIdx++)
+       {
+          macPucchCfg->dlDataToUlAck->dlDataToUlAckList[arrIdx] =\
+          *cuPucchCfg->choice.setup->dl_DataToUL_ACK->list.array[arrIdx];
+       }
         }
 
         /* Power Control */
@@ -8994,12 +9082,19 @@ uint8_t extractPucchCfg(struct BWP_UplinkDedicated__pucch_Config *cuPucchCfg, Pu
  *
  *    Functionality: Fills ServingCellReconfig received  by CU
  *
- * @params[in] ServingCellConfig_t *cuSrvCellCfg
- *             ServCellCfgInfo *macSrvCellCfg
+ * @params[in] ServingCellConfig_t *cuSrvCellCfg = Information which is send by
+ *                  CU, which we have stored in F1UeContextSetupDb,
+ *             ServCellCfgInfo *macSrvCellCfg = Used to Store the information
+ *                  which  needs to send in other layer, as well as this can be the
+ *                  variable which stores the information in DuCb, 
+ *             ServCellCfgInfo *storedSrvCellCfg = Null in case of sending the
+ *                  information to other layer else it will have ServCellCfgInfo which
+ *                  we have stored in copyOfmacUeCfg.
  * @return ROK/RFAILD
  *
  * ****************************************************************/
-uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg)
+uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfgInfo *macSrvCellCfg,\
+ServCellCfgInfo *storedSrvCellCfg)
 {
    uint8_t ret = ROK;
    BWP_DownlinkDedicated_t *dlBwp = NULLP;
@@ -9011,18 +9106,34 @@ uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfg
       if(dlBwp->pdcch_Config)
       {
          if(dlBwp->pdcch_Config->choice.setup)
-        {
-           macSrvCellCfg->initDlBwp.pdcchPresent = true;
-           extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
-        }
+         {
+            macSrvCellCfg->initDlBwp.pdcchPresent = true;
+            extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg);
+         }
       }
       if(dlBwp->pdsch_Config)
       {
          if(dlBwp->pdsch_Config->choice.setup)
-        {
-           macSrvCellCfg->initDlBwp.pdschPresent = true;
-           extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg);
-        }
+         {
+            macSrvCellCfg->initDlBwp.pdschPresent = true;
+            
+            if(storedSrvCellCfg)
+            {
+               if(!storedSrvCellCfg->initDlBwp.pdschPresent)
+               {
+                  extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg, NULL);
+               }
+               else
+               {
+                  extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg,\
+                        &storedSrvCellCfg->initDlBwp.pdschCfg);
+               }
+            }
+            else
+            {
+               extractPdschCfg(dlBwp->pdsch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdschCfg, NULL);
+            }
+         }
       }
    }
    if(cuSrvCellCfg->firstActiveDownlinkBWP_Id)
@@ -9039,15 +9150,15 @@ uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfg
       {
          macSrvCellCfg->bwpInactivityTmr = NULLP;
          DU_ALLOC_SHRABL_BUF(macSrvCellCfg->bwpInactivityTmr, sizeof(uint8_t));
-        if(macSrvCellCfg->bwpInactivityTmr)
-        {
+         if(macSrvCellCfg->bwpInactivityTmr)
+         {
             memcpy(macSrvCellCfg->bwpInactivityTmr, cuSrvCellCfg->bwp_InactivityTimer, sizeof(uint8_t));
-        }
-        else
-        {
-           DU_LOG("\nERROR  --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
-           return RFAILED;
-        }
+         }
+         else
+         {
+            DU_LOG("\nERROR  --> F1AP : Memory Alloc failed for bwpInactivityTmr at extractSpCellDedicatedCfg()");
+            return RFAILED;
+         }
       }
    }
    if(cuSrvCellCfg->pdsch_ServingCellConfig)
@@ -9056,31 +9167,42 @@ uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfg
       {
          ret = extractPdschServingCellCfg(cuSrvCellCfg->pdsch_ServingCellConfig->choice.setup, &macSrvCellCfg->pdschServCellCfg);
          if(ret == RFAILED)
-        {
-           DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
-           return RFAILED;
-        }
+         {
+            DU_LOG("\nERROR --> F1AP : Failed at extractPdschServingCellCfg()");
+            return RFAILED;
+         }
       }
    }
    if(cuSrvCellCfg->uplinkConfig)
    {
-     if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
-     {
-        ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
-       if(ulBwp->pusch_Config)
-       {
-          macSrvCellCfg->initUlBwp.puschPresent = true;
-           extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
-       }
-       if(ulBwp->pucch_Config)
-       {
-          macSrvCellCfg->initUlBwp.pucchPresent = true;
-          memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
-           extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg); 
-       }
-     }
-     if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
-        macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
+      if(cuSrvCellCfg->uplinkConfig->initialUplinkBWP)
+      {
+         ulBwp = ((BWP_UplinkDedicated_t *)(cuSrvCellCfg->uplinkConfig->initialUplinkBWP));
+         if(ulBwp->pusch_Config)
+         {
+            macSrvCellCfg->initUlBwp.puschPresent = true;
+            extractPuschCfg(ulBwp->pusch_Config, &macSrvCellCfg->initUlBwp.puschCfg);
+         }
+         if(ulBwp->pucch_Config)
+         {
+            macSrvCellCfg->initUlBwp.pucchPresent = true;
+            memset(&macSrvCellCfg->initUlBwp.pucchCfg, 0, sizeof(PucchCfg));
+            if(storedSrvCellCfg)
+            {
+               if(!storedSrvCellCfg->initUlBwp.pucchPresent)
+                  extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg, NULL);
+               else
+                  extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg,\
+                  &storedSrvCellCfg->initUlBwp.pucchCfg);
+            }
+            else
+            {
+               extractPucchCfg(ulBwp->pucch_Config, &macSrvCellCfg->initUlBwp.pucchCfg, NULL);
+            }
+         }
+      }
+      if(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id)
+         macSrvCellCfg->firstActvUlBwpId = *(cuSrvCellCfg->uplinkConfig->firstActiveUplinkBWP_Id);
    }
    return ret;
 }
@@ -9093,13 +9215,20 @@ uint8_t extractSpCellDedicatedCfg(ServingCellConfig_t *cuSrvCellCfg, ServCellCfg
  *    Function : extractUeReCfgCellInfo
  *
  *    Functionality: Fills Reconfig Cell group Info received by CU
+ *   
+ * @params[in] CellGroupConfigRrc_t *cellGrp = CellGroupConfigRrc_t information which
+ *                       is send by CU, which we have stored in F1UeContextSetupDb
+ *             MacUeCfg *MacUeCfg = Used to Store the information,
+ *                      which needs to send in other layer, as well as this can be
+ *                      the variable which stores the information in DuCb,
+ *             MacUeCfg *storedMacUeCfg = Null in case of sending the
+ *                      information to other layer else it will have copyOfmacUeCfg
+ *                      which we have stored in F1UeContextSetupDb.
  *
- * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
- *             MacUeCfg*  macUeCfg
  * @return ROK/RFAILED
  *
  * ****************************************************************/
-uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg)
+uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg, MacUeCfg *storedMacUeCfg)
 {
    uint8_t ret = ROK;
    MAC_CellGroupConfig_t     *macCellGroup = NULLP;
@@ -9182,7 +9311,18 @@ uint8_t extractUeReCfgCellInfo(CellGroupConfigRrc_t *cellGrp, MacUeCfg *macUeCfg
          if(cellGrp->spCellConfig->spCellConfigDedicated)
          {
             servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
-            ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
+            if(storedMacUeCfg)
+            {
+               if(!storedMacUeCfg->spCellCfgPres)
+                  ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg, NULL);
+               else
+                  ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg,\
+                        &storedMacUeCfg->spCellCfg.servCellCfg);
+            }
+            else
+            {
+               ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg, NULL);
+            }
             if(ret == RFAILED)
             {
                DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
@@ -9561,13 +9701,19 @@ void freeAperDecodeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
  *
  *    Functionality: builds Mac Cell Cfg
  *
- * @params[in] MacUeCfg pointer
- *             void pointer
+ * @params[in] MacUeCfg *macUeCfgToSend = Used to Store the information which
+ *                       needs to send in other layer, as well as this can be
+ *                       the variable which stores the information in DuCb.
+ *             MacUeCfg *storedMacUeCfg = Null in case of sending the
+ *                       information to other layer else it will have copyOfmacUeCfg  
+ *                       which we have stored in F1UeContextSetupDb
+ *             void *cellInfo = CellGroupConfigRrc_t information which is send
+ *                        by CU, which we have stored in F1UeContextSetupDb 
  *
  * @return void 
  *
  * ****************************************************************/
-uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, void *cellInfo)
+uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend,MacUeCfg *storedMacUeCfg, void *cellInfo)
 {
    uint8_t ret = ROK;
    CellGroupConfigRrc_t *cellGrp = NULLP;
@@ -9575,7 +9721,7 @@ uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfgToSend, void *cellInfo)
    if(cellInfo)
    {
       cellGrp = (CellGroupConfigRrc_t *)cellInfo;
-      ret = extractUeReCfgCellInfo(cellGrp, macUeCfgToSend);
+      ret = extractUeReCfgCellInfo(cellGrp, macUeCfgToSend, storedMacUeCfg);
       if(ret == RFAILED)
          DU_LOG("\nERROR  -->  F1AP : Failed at procUeReCfgCellInfo()");
    }
@@ -9848,6 +9994,8 @@ uint8_t extractSrbListToSetup(SRBs_ToBeSetup_List_t *srbCfg, DuUeCfg *ueCfgDb)
            &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
         ueCfgDb->numRlcLcs++;
         ueCfgDb->numMacLcs++;
+         DU_LOG("\nDEBUG --> DUAPP: extractSrbListToSetup: SRBID: %d [RLC,MAC,NumDrb]:[%x,%x,%x]",\
+                            srbItem->sRBID, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs,  ueCfgDb->numDrb);
         if(ret == RFAILED)
         {
             DU_LOG("\nERROR  -->  F1AP:  Failed at extractSrbListToSetup()");
@@ -9925,10 +10073,10 @@ DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcL
  *
  * ****************************************************************/
 
-uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg,DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\
-uint8_t drbCount, DuUeCfg *ueCfgDb)
+uint8_t extractDrbListToSetup(DRBs_ToBeSetup_List_t *drbCfg,DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\
+uint8_t drbCount, DuUeCfg *ueCfgDb, uint32_t *drbBitMap)
 {
-   uint8_t ret, drbIdx;
+   uint8_t ret, drbIdx, lcId = 0;
    DRBs_ToBeSetup_Item_t *drbItem = NULLP;
    DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP;
 
@@ -9951,7 +10099,14 @@ uint8_t drbCount, DuUeCfg *ueCfgDb)
          }
          memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
          memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
-   
+
+         lcId = getDrbLcId(drbBitMap);
+         if(lcId == RFAILED)
+         {
+            DU_LOG("\nERROR  -->  F1AP :  InCorrect LCID extractDrbListToSetup()");
+            ret = RFAILED;
+            break;
+         }
          if(drbCfg != NULL)
          {
             drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
@@ -9978,6 +10133,9 @@ uint8_t drbCount, DuUeCfg *ueCfgDb)
          ueCfgDb->numRlcLcs++;
          ueCfgDb->numMacLcs++;
          ueCfgDb->numDrb++;
+         DU_LOG("\nDEBUG --> DUAPP: extractDrbListToSetup:lcId:%x ,BitMap:%x, [RLC,MAC,NumDrb]:[%x,%x,%x]",\
+                            lcId,*drbBitMap, ueCfgDb->numRlcLcs, ueCfgDb->numMacLcs,  ueCfgDb->numDrb);
          if(ret == RFAILED)
          {
             DU_LOG("\nERROR  --> F1AP : Failed at extractDrbListToSetup()");
@@ -10211,7 +10369,7 @@ void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t   *ueSetReq)
  * ****************************************************************/
 uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
 {
-   uint8_t  ret=0, ieIdx=0, ueIdx=0, lcId=0, cellIdx=0;
+   uint8_t  ret=0, ieIdx=0, ueIdx=0, cellIdx=0;
    bool ueCbFound = false;
    uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0;
    DuUeCb   *duUeCb = NULL;
@@ -10313,19 +10471,14 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
             }
          case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
             {
-               lcId = getDrbLcId(&duUeCb->drbBitMap);
-               if(lcId != RFAILED)
-               {
                   drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List;
-                  if(extractDrbListToSetup(lcId, drbCfg, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg))
+
+                  if(extractDrbListToSetup(drbCfg, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap))
                   {
                      DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
                      //TODO: Update the failure cause in ue context Setup Response
                      ret = RFAILED;
                   }
-               }
-               else 
-                  ret = RFAILED;
                break;
             }
          case ProtocolIE_ID_id_RRCContainer:
@@ -12679,7 +12832,7 @@ void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *U
 uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg)
 {
    UEContextModificationRequest_t *ueContextModifyReq = NULLP;
-   uint8_t  ret = ROK, ieIdx = 0, lcId =0,cellIdx=0, ueIdx=0;
+   uint8_t  ret = ROK, ieIdx = 0, cellIdx=0, ueIdx=0;
    DuUeCb   *duUeCb = NULLP;
    DRBs_ToBeSetupMod_List_t *drbSetupModCfg;
    uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
@@ -12710,23 +12863,19 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg)
                      {
 
                         duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
-                        lcId = getDrbLcId(&duUeCb->drbBitMap);
-                        if(lcId != RFAILED)
-                        {
                            DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
                            if(duUeCb->f1UeDb)
                            {
                               duUeCb->f1UeDb->actionType = UE_CTXT_MOD;
                               drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\
                               choice.DRBs_ToBeSetupMod_List;
-                              if(extractDrbListToSetup(lcId, NULL, drbSetupModCfg ,drbSetupModCfg->list.count, \
-                              &duUeCb->f1UeDb->duUeCfg))
+                              if(extractDrbListToSetup(NULL, drbSetupModCfg ,drbSetupModCfg->list.count, \
+                              &duUeCb->f1UeDb->duUeCfg, &duUeCb->drbBitMap))
                               {
                                  DU_LOG("\nERROR  -->  DU APP : Failed at extractDrbListToSetup()");
                                  ret = RFAILED;
                               }
                            }
-                        }
                         break;
                      }
                   }
index c956fe0..4182abb 100644 (file)
@@ -34,7 +34,7 @@ uint8_t BuildAndSendDUConfigUpdate();
 uint8_t BuildAndSendInitialRrcMsgTransfer(uint32_t gnbDuUeF1apId, uint16_t crnti, uint16_t rrcContSize, 
           uint8_t *rrcContainer);
 uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb  ueCb, uint8_t lcId,  uint16_t msgLen, uint8_t *rrcMsg);
-uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, void *cellGrp);
+uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, MacUeCfg *storedMacUeCfg, void *cellGrp);
 void freeUeReCfgCellGrpInfo(MacUeCfg *macUeCfg);
 uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueIdx);
 uint8_t getDrbLcId(uint32_t *drbBitMap);
index 0cd9f86..5cd1c60 100644 (file)
@@ -127,6 +127,7 @@ typedef struct duUeCfg
    AmbrCfg *ambrCfg;
    uint8_t numDrb;
    UpTnlCfg upTnlInfo[MAX_NUM_DRB];  /* User plane TNL Info*/
+   MacUeCfg copyOfmacUeCfg;
 }DuUeCfg;
 
 typedef struct f1UeContextSetup
index 39569c9..75a8267 100644 (file)
@@ -183,7 +183,8 @@ uint8_t duBuildAndSendDlUserDataToRlc(uint16_t msgLen, EgtpMsg *egtpMsg)
    {
       /* Filling post structure and sending msg */ 
       FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_USER_DATA_TRANS_TO_RLC);
-      DU_LOG("\nDEBUG  -->  DU_APP : Sending User Data Msg to RLC \n");
+      DU_LOG("\nDEBUG  -->  DU_APP : Sending User Data Msg to RLC [TEID, nPDU]:[%d, %d]\n",\
+                       egtpMsg->msgHdr.teId, egtpMsg->msgHdr.nPdu.val);
       ret = (*duSendRlcDlUserDataToRlcOpts[pst.selector])(&pst, dlDataMsgInfo);
    }
    if(ret != ROK)
@@ -1203,7 +1204,7 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \
       macUeCfg->cellId       = cellId;
       macUeCfg->ueIdx        = ueIdx;
       macUeCfg->crnti        = crnti;
-      ret = procUeReCfgCellInfo(macUeCfg, ueCfgDb->cellGrpCfg);
+      ret = procUeReCfgCellInfo(macUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
       if(ret == ROK)
       {
          if(macUeCfg->spCellCfgPres == true)
@@ -1262,6 +1263,7 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \
             break;
          }
       }/*End of Outer FOR loop */
+      memcpy(&ueCfgDb->copyOfmacUeCfg, macUeCfg, sizeof(MacUeCfg));
    }
    return ret;
 }
@@ -1740,12 +1742,12 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
    uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx, cellIdx;
    MacUeCfg *oldMacUeCfg;
    ret = ROK;
-
+   
    GET_CELL_IDX(macUeCfg->cellId, cellIdx);
    oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueIdx-1].macUeCfg;
 
    /*Filling Cell Group Cfg*/
-   ret =  procUeReCfgCellInfo(macUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
+   ret =  procUeReCfgCellInfo(macUeCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
    if(ret == ROK)
    {
       if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
index fab8712..759c83c 100644 (file)
@@ -25,6 +25,8 @@
 #define MAX_SFN_VALUE    1023
 #define NR_PCI            1
 #define SLOT_DELAY       3
+#define NUM_DRB_TO_PUMP_DATA  2
+#define NUM_UL_PACKETS   4
 /*UE Ids for RACH IND*/
 #define UE_IDX_0     0
 #define UE_IDX_1     1
index 8cd6217..168ea65 100644 (file)
@@ -1319,7 +1319,7 @@ S16 l1HdlUlDciReq(uint16_t msgLen, void *msg)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t l1SendUlUserData()
+uint8_t l1SendUlUserData(uint8_t drbId)
 {
    uint8_t cnt = 0;
    fapi_rx_data_indication_t *rxDataInd;
@@ -1328,6 +1328,7 @@ uint8_t l1SendUlUserData()
    uint16_t byteIdx = 0;
    uint32_t msgLen = 0;
    uint8_t idx = 0;
+   uint8_t lcId = 0;
 
    MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
    if(!rxDataInd)
@@ -1377,7 +1378,8 @@ uint8_t l1SendUlUserData()
 
     /* Below ulMsg supports 12bit SN for UM mode */
                                /*  SI  SN */
-    uint8_t ulMsg[] = {4, msgLen,   0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 1, 0, 0, 192, 168, 130, 81, 192, 168, 130, 82, 84, 104,
+    lcId = MIN_DRB_LCID + drbId;
+    uint8_t ulMsg[] = {lcId, msgLen,   0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 1, 0, 0, 192, 168, 130, 81, 192, 168, 130, 82, 84, 104,
     105, 115, 32, 105, 115, 32, 69, 71, 84, 80, 32, 100, 97, 116, 97, 32, 102, 114, 111, 109, 32, 68, 85, 0, 0, 0, 0, 0};
     msgLen += 2;  /* 2bytes of header */
     memcpy(pdu, &ulMsg, msgLen);
@@ -1401,9 +1403,9 @@ uint8_t l1SendUlUserData()
    fillMsgHeader(&rxDataInd->header, FAPI_RX_DATA_INDICATION, msgLen);
 
     /* Send Message to peer */
-    while(cnt < 2)
+    while(cnt < NUM_UL_PACKETS)
     {
-       DU_LOG("\nDEBUG  -->  PHY STUB : Sending UL User Data[%d] at sfn %d slot %d", cnt+1, sfnValue, slotValue);
+       DU_LOG("\nDEBUG  -->  PHY STUB : Sending UL User Data[%d][LCID:%d] at sfn %d slot %d", cnt+1, lcId, sfnValue, slotValue);
        /* Sending Rx data indication to MAC */
        rxDataInd->sfn = sfnValue;
        rxDataInd->slot = slotValue;
index 8028b0f..2612530 100644 (file)
@@ -137,21 +137,28 @@ void l1HdlSlotIndicaion(bool stopSlotInd)
 void *l1ConsoleHandler(void *args)
 {
    char ch;
+   uint8_t drbIdx = 0;
+
    while(true)
    {
       /* Send UL user data to DU when user enters 'd' on console */
       if((ch = getchar()) == 'd')
       {
          /* Start Pumping data from PHY stub to DU */
-         DU_LOG("\nDEBUG  --> PHY STUB: Sending UL User Data");
-         l1SendUlUserData();
+         for(drbIdx = 0; drbIdx < NUM_DRB_TO_PUMP_DATA; drbIdx++) //Number of DRB times the loop will run
+         {
+            DU_LOG("\nDEBUG  --> PHY STUB: Sending UL User Data[DrbId:%d]",drbIdx);
+            l1SendUlUserData(drbIdx);
+         }
       }
       else if((ch = getchar()) == 'c')
       {
          /* Send Control PDU from PHY stub to DU */
-        DU_LOG("\nDEBUG  --> PHY STUB: Sending Status PDU");
-        l1SendStatusPdu();
+          DU_LOG("\nDEBUG  --> PHY STUB: Sending Status PDU");
+              l1SendStatusPdu();
       }
+      DU_LOG("\n");
+      continue;
    }
 }