Merge "Implementation of Slice related configuration and Slice Discovery procedure...
[o-du/l2.git] / src / cu_stub / cu_f1ap_msg_hdl.c
index ed7194f..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"
@@ -72,6 +73,7 @@
 #include "SRS-Resource.h"
 #include "SRS-ResourceSet.h"
 #include "SRS-Config.h"
+#include "PUCCH-Config.h"
 #include "BWP-UplinkDedicated.h"
 #include "PUSCH-ServingCellConfig.h"
 #include "UplinkConfig.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 PDSCH_MAPPING_TYPE_B 1
 
 /* MACRO Define for PUSCH Configuration */
-#define PUSCH_K2  3
+#define PUSCH_K2_CFG1  3
+#define PUSCH_K2_CFG2  4
 
 #define PUSCH_MSG3_DELTA_PREAMBLE 0
 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
 #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
-*
-* @details
-*
-*    Function : SendF1APMsg
-*
-*    Functionality: Sends F1 msg over SCTP
-*
-* @params[in] Region region
-*             Pool pool
-* @return ROK     - success
-*         RFAILED - failure
-*
-* ****************************************************************/
+ *
+ * @brief Sends F1 msg over SCTP
+ *
+ * @details
+ *
+ *    Function : SendF1APMsg
+ *
+ *    Functionality: Sends F1 msg over SCTP
+ *
+ * @params[in] Region region
+ *             Pool pool
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
 S16 SendF1APMsg(Region region, Pool pool)
 {
    Buffer *mBuf = NULLP;
@@ -196,20 +205,20 @@ S16 SendF1APMsg(Region region, Pool pool)
    {
       if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
       {
-        ODU_PRINT_MSG(mBuf, 0,0);
+         ODU_PRINT_MSG(mBuf, 0,0);
 
-        if(sctpSend(mBuf) != ROK)
-        {
-           DU_LOG("\nERROR  -->  F1AP : SCTP Send failed");
-           ODU_PUT_MSG_BUF(mBuf);
-           return RFAILED;
-        }
+         if(sctpSend(mBuf) != ROK)
+         {
+            DU_LOG("\nERROR  -->  F1AP : SCTP Send failed");
+            ODU_PUT_MSG_BUF(mBuf);
+            return RFAILED;
+         }
       }
       else
       {
-        DU_LOG("\nERROR  -->  F1AP : ODU_ADD_POST_MSG_MULT failed");
-        ODU_PUT_MSG_BUF(mBuf);
-        return RFAILED;
+         DU_LOG("\nERROR  -->  F1AP : ODU_ADD_POST_MSG_MULT failed");
+         ODU_PUT_MSG_BUF(mBuf);
+         return RFAILED;
       }
       ODU_PUT_MSG_BUF(mBuf);
    }
@@ -297,7 +306,7 @@ S16 BuildAndSendF1SetupRsp()
    f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
    f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
    f1apMsg->choice.successfulOutcome->value.present = \
-                                                     SuccessfulOutcome__value_PR_F1SetupResponse;
+                                                      SuccessfulOutcome__value_PR_F1SetupResponse;
    f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
 
    elementCnt = 4;
@@ -305,7 +314,7 @@ S16 BuildAndSendF1SetupRsp()
    f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
 
    CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
-        elementCnt * sizeof(F1SetupResponseIEs_t *));
+         elementCnt * sizeof(F1SetupResponseIEs_t *));
    if(f1SetupRsp->protocolIEs.list.array == NULLP)
    {
       DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1ResponseIEs failed");
@@ -317,15 +326,15 @@ S16 BuildAndSendF1SetupRsp()
    for(idx=0; idx<elementCnt; idx++)
    {
       CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
-           sizeof(F1SetupResponseIEs_t)); 
+            sizeof(F1SetupResponseIEs_t)); 
       if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
       {  
-        CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-              elementCnt * sizeof(F1SetupResponseIEs_t *));
-        CU_FREE(f1apMsg->choice.successfulOutcome, \
-              sizeof(SuccessfulOutcome_t));
-        CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
-        return RFAILED;
+         CU_FREE(f1SetupRsp->protocolIEs.list.array,\
+               elementCnt * sizeof(F1SetupResponseIEs_t *));
+         CU_FREE(f1apMsg->choice.successfulOutcome, \
+               sizeof(SuccessfulOutcome_t));
+         CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
+         return RFAILED;
       }    
    }
 
@@ -334,16 +343,16 @@ S16 BuildAndSendF1SetupRsp()
    f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
    f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
    f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
-                                                           F1SetupResponseIEs__value_PR_TransactionID;
+                                                            F1SetupResponseIEs__value_PR_TransactionID;
    f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
-                                                                       TRANS_ID;
+                                                                        TRANS_ID;
 
    /*CU Name*/
    idx++;
    f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
    f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
    f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
-                                                           F1SetupResponseIEs__value_PR_GNB_CU_Name;
+                                                            F1SetupResponseIEs__value_PR_GNB_CU_Name;
    cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
    cuName->size = sizeof(cuCfgParams.cuName);
 
@@ -352,13 +361,13 @@ S16 BuildAndSendF1SetupRsp()
    {
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
+               sizeof(F1SetupResponseIEs_t));
       }
       CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome,\
-           sizeof(SuccessfulOutcome_t));
+            sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
    }
@@ -367,28 +376,28 @@ S16 BuildAndSendF1SetupRsp()
    /*Cells to be activated list*/
    idx++;
    f1SetupRsp->protocolIEs.list.array[idx]->id = \
-                                                ProtocolIE_ID_id_Cells_to_be_Activated_List ;
+                                                 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
    f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
    f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
-                                                           F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
+                                                            F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
    cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
-                   Cells_to_be_Activated_List;
+                    Cells_to_be_Activated_List;
    cellCnt=1;
    cellToActivate->list.count = cellCnt;
    cellToActivate->list.size = \
-                              cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs  *);
+                               cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs  *);
    CU_ALLOC(cellToActivate->list.array,\
-        sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
+         sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
    if(cellToActivate->list.array == NULLP)
    {
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
+               sizeof(F1SetupResponseIEs_t));
       }
       CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
@@ -398,88 +407,88 @@ S16 BuildAndSendF1SetupRsp()
       CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
       if(cellToActivate->list.array[ieIdx] == NULLP)
       {
-        CU_FREE(cellToActivate->list.array,\
-              sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
-        CU_FREE(cuName->buf, sizeof(cuName->size));
-        for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
-        {
-           CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-                 sizeof(F1SetupResponseIEs_t));
-        }
-        CU_FREE(f1SetupRsp->protocolIEs.list.array, \
-              elementCnt * sizeof(F1SetupResponseIEs_t *));
-        CU_FREE(f1apMsg->choice.successfulOutcome, \
-              sizeof(SuccessfulOutcome_t));
-        CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
-        return RFAILED;
+         CU_FREE(cellToActivate->list.array,\
+               sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
+         CU_FREE(cuName->buf, sizeof(cuName->size));
+         for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
+         {
+            CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+                  sizeof(F1SetupResponseIEs_t));
+         }
+         CU_FREE(f1SetupRsp->protocolIEs.list.array, \
+               elementCnt * sizeof(F1SetupResponseIEs_t *));
+         CU_FREE(f1apMsg->choice.successfulOutcome, \
+               sizeof(SuccessfulOutcome_t));
+         CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
+         return RFAILED;
       }
    }
    cellToActivate->list.array[0]->id = \
-                                      ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
+                                       ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
    cellToActivate->list.array[0]->criticality = Criticality_ignore;
    cellToActivate->list.array[0]->value.present = \
-                                                 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
+                                                  Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
    cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
       nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
    CU_ALLOC(cellToActivate->list.array[0]->\
-        value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
-        3*sizeof(uint8_t));
+         value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
+         3*sizeof(uint8_t));
    if(cellToActivate->list.array[0]->value.choice.\
-        Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
+         Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
    {
 
       for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
       {
-        CU_FREE(cellToActivate->list.array[ieIdx],\
-              sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
+         CU_FREE(cellToActivate->list.array[ieIdx],\
+               sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
       }
 
       CU_FREE(cellToActivate->list.array,\
-           sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
+            sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+               sizeof(F1SetupResponseIEs_t));
       }
       CU_FREE(f1SetupRsp->protocolIEs.list.array, \
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, \
-           sizeof(SuccessfulOutcome_t));
+            sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
    }
    buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
-        Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
+         Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
    cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
       nRCGI.nRCellIdentity.size = 5;
    CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
-        Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
-        5*sizeof(uint8_t));
+         Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
+         5*sizeof(uint8_t));
    if(cellToActivate->list.array[0]->value.choice.\
-        Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
+         Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
    {
       CU_FREE(cellToActivate->list.array[0]->\
-           value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
-           3*sizeof(uint8_t));
+            value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
+            3*sizeof(uint8_t));
       for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
       {
-        CU_FREE(cellToActivate->list.array[ieIdx],\
-              sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
+         CU_FREE(cellToActivate->list.array[ieIdx],\
+               sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
       }
 
       CU_FREE(cellToActivate->list.array,\
-           sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
+            sizeof(struct Cells_to_be_Activated_List_ItemIEs  *));
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+               sizeof(F1SetupResponseIEs_t));
       }
       CU_FREE(f1SetupRsp->protocolIEs.list.array, \
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, \
-           sizeof(SuccessfulOutcome_t));
+            sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
    }
@@ -487,10 +496,10 @@ S16 BuildAndSendF1SetupRsp()
    /* RRC Version */
    idx++;
    f1SetupRsp->protocolIEs.list.array[idx]->id = \
-                                                ProtocolIE_ID_id_GNB_CU_RRC_Version;
+                                                 ProtocolIE_ID_id_GNB_CU_RRC_Version;
    f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
    f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
-                                                           F1SetupResponseIEs__value_PR_RRC_Version;
+                                                            F1SetupResponseIEs__value_PR_RRC_Version;
    rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
    rrcVer->latest_RRC_Version.size = RRC_SIZE; 
 
@@ -500,11 +509,11 @@ S16 BuildAndSendF1SetupRsp()
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; idx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+               sizeof(F1SetupResponseIEs_t));
       } 
       CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
@@ -520,11 +529,11 @@ S16 BuildAndSendF1SetupRsp()
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+               sizeof(F1SetupResponseIEs_t));
       } 
       CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
@@ -532,73 +541,73 @@ S16 BuildAndSendF1SetupRsp()
    rrcVer->iE_Extensions->list.count = 1;
    rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
    CU_ALLOC(rrcVer->iE_Extensions->list.array,\
-        sizeof(struct RRC_Version_ExtIEs *));
+         sizeof(struct RRC_Version_ExtIEs *));
    if(rrcVer->iE_Extensions->list.array == NULLP)
    {
       CU_FREE(rrcVer->iE_Extensions,\
-           sizeof(ProtocolExtensionContainer_4624P81_t));
+            sizeof(ProtocolExtensionContainer_4624P81_t));
       CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+               sizeof(F1SetupResponseIEs_t));
       } 
       CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
    }
    CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
-        sizeof(struct RRC_Version_ExtIEs));
+         sizeof(struct RRC_Version_ExtIEs));
    if(rrcVer->iE_Extensions->list.array[0] == NULLP)
    {
       CU_FREE(rrcVer->iE_Extensions->list.array,\
-           sizeof(struct RRC_Version_ExtIEs *));
+            sizeof(struct RRC_Version_ExtIEs *));
       CU_FREE(rrcVer->iE_Extensions,\
-           sizeof(ProtocolExtensionContainer_4624P81_t));
+            sizeof(ProtocolExtensionContainer_4624P81_t));
       CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+               sizeof(F1SetupResponseIEs_t));
       } 
       CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
    }
    rrcVer->iE_Extensions->list.array[0]->id = \
-                                             ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
+                                              ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
    rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
    rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
-                                                                 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
+                                                                  RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
    rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
       Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
    CU_ALLOC(rrcVer->iE_Extensions->list.\
-        array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
-        3*sizeof(uint8_t));
+         array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
+         3*sizeof(uint8_t));
    if(rrcVer->iE_Extensions->list.\
-        array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
+         array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
    {
       CU_FREE(rrcVer->iE_Extensions->list.array[0],\
-           sizeof(struct RRC_Version_ExtIEs));
+            sizeof(struct RRC_Version_ExtIEs));
       CU_FREE(rrcVer->iE_Extensions->list.array,\
-           sizeof(struct RRC_Version_ExtIEs *));
+            sizeof(struct RRC_Version_ExtIEs *));
       CU_FREE(rrcVer->iE_Extensions,\
-           sizeof(ProtocolExtensionContainer_4624P81_t));
+            sizeof(ProtocolExtensionContainer_4624P81_t));
       CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
       CU_FREE(cuName->buf, sizeof(cuName->size));
       for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
       {
-        CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
-              sizeof(F1SetupResponseIEs_t));
+         CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
+               sizeof(F1SetupResponseIEs_t));
       } 
       CU_FREE(f1SetupRsp->protocolIEs.list.array,\
-           elementCnt * sizeof(F1SetupResponseIEs_t *));
+            elementCnt * sizeof(F1SetupResponseIEs_t *));
       CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
       CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
       return RFAILED;
@@ -632,7 +641,7 @@ S16 BuildAndSendF1SetupRsp()
    if(encRetVal.encoded == ENCODE_FAIL)
    {
       DU_LOG("\nERROR  -->  F1AP : Could not encode F1SetupResponse structure (at %s)\n",\
-           encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+            encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
       return RFAILED;   
    } 
    else 
@@ -640,7 +649,7 @@ S16 BuildAndSendF1SetupRsp()
       DU_LOG("\nDEBUG  -->  F1AP : Created APER encoded buffer for F1SetupResponse\n");
       for(int i=0; i< encBufSize; i++)
       {
-        DU_LOG("%x",encBuf[i]);
+         DU_LOG("%x",encBuf[i]);
       } 
    }
 
@@ -665,8 +674,7 @@ S16 BuildAndSendF1SetupRsp()
  *    Functionality: Constructs the DU Update Acknowledge message and sends
  *                   it to the DU through SCTP.
  *
- * @params[in] void **buf,Buffer to which encoded pattern is written into
- * @params[in] int *size,size of buffer
+ * @params[in] 
  *
  * @return ROK     - success
  *         RFAILED - failure
@@ -725,10 +733,10 @@ S16 BuildAndSendDUUpdateAck()
       CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
       if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
       {
-        CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
-        CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
-        CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
-        return RFAILED;
+         CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
+         CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
+         CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
+         return RFAILED;
       }
    }
 
@@ -736,7 +744,8 @@ S16 BuildAndSendDUUpdateAck()
    idx = 0;
    gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
    gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
-   gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
+   gNBDuCfgAck->protocolIEs.list.array[idx]->value.present =\
+   GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
    gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
 
    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
@@ -758,7 +767,8 @@ S16 BuildAndSendDUUpdateAck()
    /* Checking encode results */
    if(enRetVal.encoded == ENCODE_FAIL) 
    {
-      DU_LOG("\nERROR  -->  F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
+      DU_LOG("\nERROR  -->  F1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",\
+      enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
       return RFAILED; 
    } 
    else 
@@ -766,7 +776,7 @@ S16 BuildAndSendDUUpdateAck()
       DU_LOG("\nDEBUG  -->  F1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");  
       for(int i=0; i< encBufSize; i++)
       {
-        DU_LOG("%x",encBuf[i]);
+         DU_LOG("%x",encBuf[i]);
       } 
    }
 
@@ -1018,18 +1028,18 @@ uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
  *
  * ****************************************************************/
 
-uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
+uint8_t fillMasterCellGroup(uint8_t ueId, OCTET_STRING_t *masterCellGroup)
 {
    uint8_t ret = ROK;
    masterCellGroup->buf = NULLP;
-   if(f1apMsgDb.duToCuContainer.buf)
+   if(ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf)
    {
-      masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
+      masterCellGroup->size = ueCb[ueId-1].f1apMsgDb.duToCuContainer.size;
       CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
       if(masterCellGroup->buf != NULLP)
       {
-        memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
-              masterCellGroup->size);
+         memcpy(masterCellGroup->buf, ueCb[ueId-1].f1apMsgDb.duToCuContainer.buf,\
+               masterCellGroup->size);
       }
       else
       {
@@ -1060,7 +1070,7 @@ uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
  *
  * ****************************************************************/
 
-uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
+uint8_t fillRRCSetupIE(uint8_t ueId, RRCSetup_IEs_t *rrcSetupIE)
 {
    uint8_t ret = ROK;
    if(rrcSetupIE)
@@ -1072,7 +1082,7 @@ uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
       }                
       if(ret == ROK)
       {
-        ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
+         ret = fillMasterCellGroup(ueId, &rrcSetupIE->masterCellGroup);
       }
       else
       {
@@ -1100,7 +1110,7 @@ uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
  *
  * ****************************************************************/
 
-uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
+uint8_t fillDlCcchRrcMsg(uint8_t ueId, RRCContainer_t *rrcContainer)
 {
    uint8_t ret = ROK;
    uint16_t idx2;
@@ -1114,71 +1124,71 @@ uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
       CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
       if(dl_CCCH_Msg.message.choice.c1 != NULLP)
       {
-        dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
-        CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
-        if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
-        {
-           dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
-           dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
-              present = RRCSetup__criticalExtensions_PR_rrcSetup;
-           /* Fill RRC Setup IE */
-           CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
-                 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
-           if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
-                 criticalExtensions.choice.rrcSetup != NULLP)
-           {
-              ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
-                    criticalExtensions.choice.rrcSetup);
+         dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
+         CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
+         if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
+         {
+            dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
+            dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
+               present = RRCSetup__criticalExtensions_PR_rrcSetup;
+            /* Fill RRC Setup IE */
+            CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
+                  criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
+            if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
+                  criticalExtensions.choice.rrcSetup != NULLP)
+            {
+               ret = fillRRCSetupIE(ueId, dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
+                     criticalExtensions.choice.rrcSetup);
 
-              if(ret == ROK)
-              {
-                 /* encode DL-CCCH message into RRC Container */
-                 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
-                 memset(encBuf, 0, ENC_BUF_MAX_LEN);
-                 encBufSize = 0;
-                 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
-                 /* Encode results */
-                 if(encRetVal.encoded == ENCODE_FAIL)
-                 {
-                    DU_LOG( "\nERROR  -->  F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
-                          encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
-                    return RFAILED;
-                 }
-                 else
-                 {
-                    DU_LOG("\nDEBUG  -->  F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
-                    for(int i = 0; i< encBufSize; i++)
-                    {
-                       DU_LOG("%x",encBuf[i]);
-                    }
-                    rrcContainer->size = encBufSize;
-                    CU_ALLOC(rrcContainer->buf, rrcContainer->size);
-                    if(rrcContainer->buf != NULLP)
-                    {
-                       memset(rrcContainer->buf, 0, encBufSize);
-                       for(idx2 = 0; idx2 < encBufSize; idx2++)
-                       {
-                          rrcContainer->buf[idx2] =    encBuf[idx2];
-                       }
-                    }
-                 }
-              }
-              else
-              {
-                 ret = RFAILED;
-              }
-           }
-           else
-           {
-              DU_LOG("\nERROR  -->  F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
-              ret = RFAILED;
-           }
-        }
-        else
-        {
-           DU_LOG("\nERROR  -->  F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
-           ret = RFAILED;
-        }
+               if(ret == ROK)
+               {
+                  /* encode DL-CCCH message into RRC Container */
+                  xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
+                  memset(encBuf, 0, ENC_BUF_MAX_LEN);
+                  encBufSize = 0;
+                  encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
+                  /* Encode results */
+                  if(encRetVal.encoded == ENCODE_FAIL)
+                  {
+                     DU_LOG( "\nERROR  -->  F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
+                           encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+                     return RFAILED;
+                  }
+                  else
+                  {
+                     DU_LOG("\nDEBUG  -->  F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
+                     for(int i = 0; i< encBufSize; i++)
+                     {
+                        DU_LOG("%x",encBuf[i]);
+                     }
+                     rrcContainer->size = encBufSize;
+                     CU_ALLOC(rrcContainer->buf, rrcContainer->size);
+                     if(rrcContainer->buf != NULLP)
+                     {
+                        memset(rrcContainer->buf, 0, encBufSize);
+                        for(idx2 = 0; idx2 < encBufSize; idx2++)
+                        {
+                           rrcContainer->buf[idx2] =   encBuf[idx2];
+                        }
+                     }
+                  }
+               }
+               else
+               {
+                  ret = RFAILED;
+               }
+            }
+            else
+            {
+               DU_LOG("\nERROR  -->  F1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
+               ret = RFAILED;
+            }
+         }
+         else
+         {
+            DU_LOG("\nERROR  -->  F1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
+            ret = RFAILED;
+         }
       }
       else
       {
@@ -1526,14 +1536,14 @@ uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
  *
  * ****************************************************************/
 
-uint8_t        BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
+uint8_t        BuildDLRRCContainer(uint8_t ueId, uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
 {
    uint8_t ret, bufLen;
 
    ret =ROK;
    if(rrcMsgType == RRC_SETUP)
    { 
-      ret = fillDlCcchRrcMsg(rrcContainer);
+      ret = fillDlCcchRrcMsg(ueId, rrcContainer);
       if(ret == RFAILED)
         DU_LOG("\nERROR  -->  F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
    }
@@ -1597,7 +1607,7 @@ uint8_t   BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
+uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t ueId, uint8_t srbId, uint8_t rrcMsgType)
 {
    uint8_t   elementCnt = 0;
    uint8_t  ieId;
@@ -1668,8 +1678,8 @@ uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
    dlRRCMsg->protocolIEs.list.array[idx]->id  = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
    dlRRCMsg->protocolIEs.list.array[idx]->criticality  =   Criticality_reject;
    dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
-                                                         DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
-   dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
+                                                          DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
+   dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
 
    /* GNB DU UE F1AP ID */
    idx++;
@@ -1677,8 +1687,8 @@ uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
                                                ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
    dlRRCMsg->protocolIEs.list.array[idx]->criticality  =   Criticality_reject;
    dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
-                                                         DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
-   dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
+                                                          DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
+   dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
 
    /* SRBID */
    idx++;
@@ -1693,8 +1703,8 @@ uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
    dlRRCMsg->protocolIEs.list.array[idx]->id  = ProtocolIE_ID_id_RRCContainer;
    dlRRCMsg->protocolIEs.list.array[idx]->criticality   = Criticality_reject;
    dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
-                                                         DLRRCMessageTransferIEs__value_PR_RRCContainer;
-   BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
+                                                          DLRRCMessageTransferIEs__value_PR_RRCContainer;
+   BuildDLRRCContainer(ueId, rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
 
    xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
 
@@ -1747,10 +1757,10 @@ uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
  *
  * ****************************************************************/
 
-uint8_t setDlRRCMsgType()
+uint8_t setDlRRCMsgType(uint8_t ueId)
 {
    uint8_t rrcMsgType = 0;
-   switch(f1apMsgDb.dlRrcMsgCount)
+   switch(ueCb[ueId -1].f1apMsgDb.dlRrcMsgCount)
    {
       case RRC_SETUP:
         rrcMsgType = RRC_SETUP;
@@ -1795,7 +1805,7 @@ uint8_t setDlRRCMsgType()
 
 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
 {
-   uint8_t idx, rrcMsgType;
+   uint8_t idx, rrcMsgType, gnbDuUeF1apId;
    uint8_t ret =ROK;
    InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
    DU_LOG("\nINFO -->  F1AP : filling the required values in DB in procInitULRRCMsg");
@@ -1806,49 +1816,51 @@ uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
    {
       switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
       {
-        case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
-           break;
-        case ProtocolIE_ID_id_NRCGI:
-           break;
-        case ProtocolIE_ID_id_C_RNTI:
-           break;
-        case ProtocolIE_ID_id_RRCContainer:
-           break;
-        case ProtocolIE_ID_id_DUtoCURRCContainer:
-           {
-              if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
-                       .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
-                          .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
-              {
-                 DU_LOG("\nINFO  -->  Received Du to Cu RRC Container ");
-                 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
-                                                  .list.array[idx]->value.choice.DUtoCURRCContainer.size;
-                 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
-                       f1apMsgDb.duToCuContainer.size);
-                 if(f1apMsgDb.duToCuContainer.buf != NULLP)
-                 { 
-                    memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
-                          .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
-                          .duToCuContainer.size);
-                 }
-              }
-              else
-              {
-                 DU_LOG("\nERROR  -->  Failed to receive Du to Cu RRC Container ");
-                 ret = RFAILED;
-              }
-              break;
-           }
-        default:
-           DU_LOG("\nERROR  -->  Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
-           break;
+         case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+            gnbDuUeF1apId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
+            break;
+         case ProtocolIE_ID_id_NRCGI:
+            break;
+         case ProtocolIE_ID_id_C_RNTI:
+            break;
+         case ProtocolIE_ID_id_RRCContainer:
+            break;
+         case ProtocolIE_ID_id_DUtoCURRCContainer:
+            {
+               if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
+                        .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
+                           .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
+               {
+                  DU_LOG("\nINFO  -->  Received Du to Cu RRC Container ");
+                  ueCb[gnbDuUeF1apId-1].ueId = gnbDuUeF1apId;
+                  ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
+                         .list.array[idx]->value.choice.DUtoCURRCContainer.size;
+                  CU_ALLOC(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, \
+                        ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.size);
+                  if(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf != NULLP)
+                  { 
+                     memcpy(ueCb[gnbDuUeF1apId-1].f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
+                           .list.array[idx]->value.choice.DUtoCURRCContainer.buf, ueCb[gnbDuUeF1apId-1].f1apMsgDb\
+                           .duToCuContainer.size);
+                  }
+               }
+               else
+               {
+                  DU_LOG("\nERROR  -->  Failed to receive Du to Cu RRC Container ");
+                  ret = RFAILED;
+               }
+               break;
+            }
+         default:
+            DU_LOG("\nERROR  -->  Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
+            break;
       }
    }
    if(ret == ROK)
    {
-      f1apMsgDb.dlRrcMsgCount++;
-      rrcMsgType = setDlRRCMsgType();
-      ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
+      ueCb[gnbDuUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
+      rrcMsgType = setDlRRCMsgType(gnbDuUeF1apId);
+      ret = BuildAndSendDLRRCMessageTransfer(gnbDuUeF1apId, SRB0, rrcMsgType);
    }
    return ret;
 }
@@ -2160,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
@@ -2235,7 +2247,7 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
       gTP_TEID.buf[2] = 0;
    ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
-      gTP_TEID.buf[3] = 1;
+      gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
 
    return ROK;
 }/*End of BuildULTnlInfo*/
@@ -2258,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);
@@ -2278,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*/
 
@@ -2543,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);
    }
@@ -2717,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));
    }
 }
@@ -3194,7 +3200,7 @@ uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *
       return RFAILED;
    }
 
-   elementCnt = 1;
+   elementCnt = 2;
    timeDomAllocList->choice.setup->list.count = elementCnt;
    timeDomAllocList->choice.setup->list.size = \
                                               elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
@@ -3222,10 +3228,27 @@ uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *
 
    idx = 0;
    timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
+   CU_ALLOC(timeDomAlloc->k0, sizeof(long));
+   if(!timeDomAlloc->k0)
+   {
+       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
+       return RFAILED;
+   }
+   *(timeDomAlloc->k0) = 0;
+   timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
+   timeDomAlloc->startSymbolAndLength = 66;
 
-   timeDomAlloc->k0 = NULLP;
+   idx++;
+   timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
+   CU_ALLOC(timeDomAlloc->k0, sizeof(long));
+   if(!timeDomAlloc->k0)
+   {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
+      return RFAILED;
+   }
+   *(timeDomAlloc->k0) = 1;
    timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
-   timeDomAlloc->startSymbolAndLength = 53;
+   timeDomAlloc->startSymbolAndLength = 66;
 
    return ROK;
 }
@@ -3532,7 +3555,7 @@ uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
       return RFAILED;
    }
 
-   elementCnt = 1;
+   elementCnt = 2;
    timeDomAllocList->choice.setup->list.count = elementCnt;
    timeDomAllocList->choice.setup->list.size = \
                                               elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
@@ -3565,9 +3588,22 @@ uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
       return RFAILED;
    }
-   *(timeDomAlloc->k2) = PUSCH_K2;
+   *(timeDomAlloc->k2) = PUSCH_K2_CFG1;
    timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
-   timeDomAlloc->startSymbolAndLength = 27; 
+   timeDomAlloc->startSymbolAndLength = 66; 
+
+   idx++;
+   timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
+   CU_ALLOC(timeDomAlloc->k2, sizeof(long));
+   if(!timeDomAlloc->k2)
+   {
+       DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
+       return RFAILED;
+   }
+   *(timeDomAlloc->k2) = PUSCH_K2_CFG2;
+   timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
+   timeDomAlloc->startSymbolAndLength = 66;
+
    return ROK;
 }
 
@@ -3655,6 +3691,61 @@ uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
    return ROK;
 }
 
+/*******************************************************************
+ *
+ * @brief Builds BWP UL dedicated PUCCH Config
+ *
+ * @details
+ *
+ *    Function : BuildBWPUlDedPucchCfg
+ *
+ *    Functionality:
+ *      Builds BWP UL dedicated PUCCH Config
+ *
+ * @params[in] : PUCCH_Config_t *pucchCfg
+ *
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
+{
+   uint8_t arrIdx, elementCnt;
+
+   CU_ALLOC(pucchCfg->dl_DataToUL_ACK, sizeof(struct PUCCH_Config__dl_DataToUL_ACK));
+   if(pucchCfg->dl_DataToUL_ACK == NULLP)
+   {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
+      return RFAILED;
+   }
+
+   elementCnt = 2;
+   pucchCfg->dl_DataToUL_ACK->list.count = elementCnt;
+   pucchCfg->dl_DataToUL_ACK->list.size = elementCnt * sizeof(long *);
+   CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array, pucchCfg->dl_DataToUL_ACK->list.size);
+   if(pucchCfg->dl_DataToUL_ACK->list.array == NULLP)
+   {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
+      return RFAILED;
+   }
+
+   for(arrIdx = 0; arrIdx <  pucchCfg->dl_DataToUL_ACK->list.count; arrIdx++)
+   {
+      CU_ALLOC(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx], sizeof(long));
+      if(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx] == NULLP)
+      {
+          DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildBWPUlDedPucchCfg");
+          return RFAILED;
+      }
+   }
+
+   arrIdx = 0;
+   *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1;
+   *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2;
+
+   return ROK;
+}
+
 /*******************************************************************
  *
  * @brief Fills SRS resource to add/modify list 
@@ -3929,6 +4020,27 @@ uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
 {
    ulBwp->pucch_Config = NULLP;
+   ulBwp->pucch_Config = NULLP;
+   CU_ALLOC(ulBwp->pucch_Config, sizeof(struct BWP_UplinkDedicated__pucch_Config));
+   if(!ulBwp->pucch_Config)
+   {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
+      return RFAILED;
+   }
+
+   ulBwp->pucch_Config->present = BWP_UplinkDedicated__pucch_Config_PR_setup;
+   ulBwp->pucch_Config->choice.setup = NULLP;
+   CU_ALLOC(ulBwp->pucch_Config->choice.setup, sizeof(PUCCH_Config_t));
+   if(!ulBwp->pucch_Config->choice.setup)
+   {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildInitialUlBWP");
+      return RFAILED;
+   }
+
+   if(BuildBWPUlDedPucchCfg(ulBwp->pucch_Config->choice.setup) != ROK)
+   {
+      return RFAILED;
+   }
 
    /* Fill BWP UL dedicated PUSCH config */
    ulBwp->pusch_Config = NULLP;
@@ -6464,6 +6576,171 @@ 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 = NULLP;
+   ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
+   
+   for(idx=0; idx < ueCtxtSetupRsp->protocolIEs.list.count; idx++)
+   {
+      switch(ueCtxtSetupRsp->protocolIEs.list.array[idx]->id)
+      {
+          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+             {
+                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;
+}
+
 /****************************************************************
  * @brief Function to process Ul Rrc Msg received from DU 
  *
@@ -6529,12 +6806,12 @@ uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
    }
    if(srbId == 1)
    {
-      f1apMsgDb.dlRrcMsgCount++;
-      rrcMsgType = setDlRRCMsgType();
+      ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
+      rrcMsgType = setDlRRCMsgType(duUeF1apId);
       if(rrcMsgType == REGISTRATION_ACCEPT)
       {
-        DU_LOG("\nINFO  -->  F1AP: Sending DL RRC MSG for RRC Registration Accept"); 
-        ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
+         DU_LOG("\nINFO  -->  F1AP: Sending DL RRC MSG for RRC Registration Accept"); 
+         ret = BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
       }
       if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
       {
@@ -6544,19 +6821,19 @@ uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
       }
       if(rrcMsgType == SECURITY_MODE_COMPLETE)
       {
-        /* To trigger the DL RRC Msg for RRC Reconfig */
-        f1apMsgDb.dlRrcMsgCount++;
-        rrcMsgType = setDlRRCMsgType();
-        if(rrcMsgType == RRC_RECONFIG)
-        {
-           DU_LOG("\nINFO  -->  F1AP: Sending DL RRC MSG for RRC Reconfig");
-           BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
-        }
+         /* To trigger the DL RRC Msg for RRC Reconfig */
+         ueCb[duUeF1apId-1].f1apMsgDb.dlRrcMsgCount++;
+         rrcMsgType = setDlRRCMsgType(duUeF1apId);
+         if(rrcMsgType == RRC_RECONFIG)
+         {
+            DU_LOG("\nINFO  -->  F1AP: Sending DL RRC MSG for RRC Reconfig");
+            BuildAndSendDLRRCMessageTransfer(duUeF1apId, srbId, rrcMsgType);
+         }
       }
       if(rrcMsgType == UE_CONTEXT_MOD_REQ)
       {
          DU_LOG("\nINFO  -->  F1AP: Sending UE Context Modification Request");
-        BuildAndSendUeContextModificationReq();
+         BuildAndSendUeContextModificationReq(duUeF1apId);
       }
    }
    return ret;
@@ -6844,7 +7121,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
       gTP_TEID.buf[2] = 0;
    ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
-      gTP_TEID.buf[3] = 2;
+      gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
 
    return ROK;
 }/*End of BuildULTnlInfo*/
@@ -7238,7 +7515,7 @@ void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t BuildAndSendUeContextModificationReq()
+uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
 {
    uint8_t    ieIdx = 0;
    uint8_t    elementCnt = 0;
@@ -7299,16 +7576,16 @@ uint8_t BuildAndSendUeContextModificationReq()
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = \
-      UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
-      ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =CU_ID;
+                                                                         UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
+      ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = ueId;
 
       ieIdx++;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present=\
-      UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
-      ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =DU_ID;
-     
+                                                                       UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
+      ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
+
       ieIdx++;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
@@ -7598,6 +7875,244 @@ uint8_t procUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
    }
    return ROK;
 }
+/*******************************************************************
+*
+* @brief processing of Gnb-DU config update 
+*
+* @details
+*
+*    Function : procGnbDuUpdate 
+*
+*    Functionality:
+*         - processing of Gnb-DU config update 
+*
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
+{
+   bool cellToBeDelete = false;
+   uint8_t ieIdx = 0, ueIdx = 0;
+   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)
+      {
+         case ProtocolIE_ID_id_TransactionID:
+            break;
+         case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
+            break;
+         case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
+            {
+               cellToBeDelete = true;
+               break;
+            }
+         case ProtocolIE_ID_id_gNB_DU_ID:
+            break;
+      }
+   }
+   if(BuildAndSendDUUpdateAck() != ROK)
+   {
+      DU_LOG("ERROR  -->  F1AP : Failed to build and send DUUpdateAck");  
+      return RFAILED;
+   }
+
+   if(cellToBeDelete == false)
+   {
+      DU_LOG("\nINFO  -->  F1AP : Sending F1 reset request");
+      if(BuildAndSendF1ResetReq() != ROK)
+      {
+         DU_LOG("ERROR  -->  F1AP : Failed to build and send F1 reset request");
+         return RFAILED;
+      }
+   }
+   else
+   {
+      for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
+      {
+         CU_FREE(ueCb[ueIdx].f1apMsgDb.duToCuContainer.buf, ueCb[ueIdx].f1apMsgDb.duToCuContainer.size);
+         memset(&ueCb[ueIdx], 0, sizeof(UeCb));
+      }
+   }
+
+   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  
@@ -7680,16 +8195,14 @@ void F1APMsgHdlr(Buffer *mBuf)
                case InitiatingMessage__value_PR_F1SetupRequest:
                   {
                      DU_LOG("\nINFO  -->  F1AP : F1 setup request received");
-                     BuildAndSendF1SetupRsp();
+                     procF1SetupReq(f1apMsg);
                      break;
                   }
 
                case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
                   {
                      DU_LOG("\nINFO  -->  F1AP : GNB-DU config update received");
-                     BuildAndSendDUUpdateAck();
-                     DU_LOG("\nINFO  -->  F1AP : Sending F1 reset request");
-                     BuildAndSendF1ResetReq();
+                     procGnbDuUpdate(f1apMsg);
                      break;
                   }
                case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
@@ -7738,7 +8251,7 @@ void F1APMsgHdlr(Buffer *mBuf)
                case SuccessfulOutcome__value_PR_UEContextSetupResponse:
                   {
                      DU_LOG("\nINFO  -->  F1AP : UE ContextSetupResponse received");
-                     f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */
+                     procUeContextSetupResponse(f1apMsg);
                      break;
                   }
                case SuccessfulOutcome__value_PR_UEContextModificationResponse: