<JIRA ID: ODUHIGH-386 : UL scheduling as per RRM policy
[o-du/l2.git] / src / cu_stub / cu_f1ap_msg_hdl.c
index c5f5866..009f0a1 100644 (file)
@@ -87,6 +87,7 @@
 #include "DLUPTNLInformation-ToBeSetup-Item.h"
 #include "UPTransportLayerInformation.h"
 #include "GTPTunnel.h"
+#include "QoSInformation.h"
 
 /* MACRO for CUtoDURRCInformation */
 #define CELL_GRP_ID 1
 #define PDSCH_MAPPING_TYPE_B 1
 
 /* MACRO Define for PUSCH Configuration */
-#define PUSCH_K2_CFG1  3
-#define PUSCH_K2_CFG2  4
+#define PUSCH_K2_CFG1  1
+#define PUSCH_K2_CFG2  2
 
 #define PUSCH_MSG3_DELTA_PREAMBLE 0
 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
 #define SCRAMBLING_ID  NR_PCI
 #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*/
+#define FIVE_QI_VALUE9 9  /*spec 23.501, Table 5.7.4-1*/
+#define FIVE_QI_VALUE8 8  /*spec 23.501, Table 5.7.4-1*/
+#define PDU_SESSION_ID_1 1
+#define PDU_SESSION_ID_2 2
+#define INVALID_PDU_SESSION_ID -1
 
 /*******************************************************************
  *
@@ -1808,7 +1813,7 @@ uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
    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");
+   DU_LOG("\nINFO   -->  F1AP : filling the required values in DB in procInitULRRCMsg");
 
    initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
 
@@ -2027,13 +2032,18 @@ uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
  *    Functionality: Constructs the QOS Info for DRB Setup Item
  *
  * @params[in] QoSInformation_t *qosinfo
+ *             int16_t pduSessionID
  *
  * @return ROK     - success
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
+uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos, uint8_t actionType, \
+                        int16_t pduSessionID)
 {
+   uint8_t elementCnt = 0, qosCntIdx = 0;
+   ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
+
    /* NonDynamic5QIDescriptor */
    drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
    CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
@@ -2042,21 +2052,25 @@ uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
       return RFAILED;
    }
    /*FiveQI*/
-   drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE;
+   if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
+      drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE8;
+   else
+      drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = FIVE_QI_VALUE9;
+
    /*AveragingWindow*/
    CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
-        sizeof(AveragingWindow_t));
+         sizeof(AveragingWindow_t));
    if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
-        NULLP)
+         NULLP)
    {
       return RFAILED;
    }
    *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
    /*MaxDataBurstVolume*/
    CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
-        sizeof(MaxDataBurstVolume_t));
+         sizeof(MaxDataBurstVolume_t));
    if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
-        NULLP)
+         NULLP)
    {
       return RFAILED;
    }
@@ -2067,6 +2081,54 @@ uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
    drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
    drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
 
+   /*If PDU Session ID is INVALID thus not to be included in Qos IE, skip the PDU Session IE */
+   if(pduSessionID <= INVALID_PDU_SESSION_ID)
+   {
+      DU_LOG("\nINFO  --> F1AP : Invalid PDU_SESSION_ID");
+      return ROK;
+   }
+
+   CU_ALLOC(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
+   qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
+
+   if(qosIeExt)
+   {
+      elementCnt = NUM_QOS_EXT;
+      qosIeExt->list.count = elementCnt;
+      qosIeExt->list.size = elementCnt * sizeof(QoSFlowLevelQoSParameters_ExtIEs_t *);
+
+      /*Initialize QoSFlowLevelQoSParameters_ExtIEs_t*/
+      CU_ALLOC(qosIeExt->list.array, qosIeExt->list.size);
+
+      if(qosIeExt->list.array == NULLP)
+      {
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t failed");
+         return  RFAILED;
+      }
+
+      for(qosCntIdx=0; qosCntIdx < elementCnt; qosCntIdx++)
+      {
+         CU_ALLOC(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
+         if(qosIeExt->list.array[qosCntIdx] == NULLP)
+         {
+            DU_LOG("\nERROR  -->       F1AP : Memory allocation for QoSFlowLevelQoSParameters_ExtIEs_t array failed");
+            return  RFAILED;
+         }
+         /*Filling QoSFlowLevelQoSParameters_ExtIEs_t*/
+         qosIeExt->list.array[qosCntIdx]->id = ProtocolIE_ID_id_PDUSessionID;
+         /*Below Criticality mentioned in Spec38.473, 15.4.1 and later*/
+         qosIeExt->list.array[qosCntIdx]->criticality = Criticality_ignore; 
+         qosIeExt->list.array[qosCntIdx]->extensionValue.present = \
+                                                                   QoSFlowLevelQoSParameters_ExtIEs__extensionValue_PR_PDUSessionID;
+         qosIeExt->list.array[qosCntIdx]->extensionValue.choice.PDUSessionID = (PDUSessionID_t)pduSessionID;
+      }
+   }
+   else
+   {
+      DU_LOG("\nERROR  -->     F1AP : Memory allocation for QosIE_extension failed");
+      return RFAILED;
+   }
+
    return ROK;
 }/*End of BuildQOSInfo*/
 
@@ -2081,12 +2143,13 @@ uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
  *    Functionality: Constructs the SNSSAI For DRB list
  *
  * @params[in] SNSSAI_t *snssai
+ *             Snssai  *snssaiToCopy S-NSSAI from CuCfgParam to be copied
  *
  * @return ROK     - success
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t BuildSNSSAI(SNSSAI_t *snssai)
+uint8_t BuildSNSSAI(SNSSAI_t *snssai, Snssai *snssaiToCopy)
 {
    /*SNSSAI*/
    /*ssT*/
@@ -2096,7 +2159,7 @@ uint8_t BuildSNSSAI(SNSSAI_t *snssai)
    {
       return RFAILED;
    }
-   snssai->sST.buf[0] = 3;
+   memcpy(snssai->sST.buf, &snssaiToCopy->sst, snssai->sST.size);
    /*sD*/
    CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
    if(snssai->sD == NULLP)
@@ -2109,9 +2172,7 @@ uint8_t BuildSNSSAI(SNSSAI_t *snssai)
    {
       return RFAILED;
    }
-   snssai->sD->buf[0] = 3;
-   snssai->sD->buf[1] = 6;
-   snssai->sD->buf[2] = 9;
+   memcpy(snssai->sD->buf, snssaiToCopy->sd, snssai->sD->size);
    return ROK;
 }/*End of BuildSNSSAI*/
 
@@ -2131,17 +2192,17 @@ uint8_t BuildSNSSAI(SNSSAI_t *snssai)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
+uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap , uint8_t actionType)
 {
-   uint8_t  ret;
-   uint8_t  idx;
-   uint8_t  flowCnt;
+   uint8_t  ret = ROK, idx = 0, flowCnt = 0;
+
    flowCnt = 1;
    flowMap->list.count = flowCnt;
    flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
    CU_ALLOC(flowMap->list.array,flowMap->list.size);
    if(flowMap->list.array == NULLP)
    {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for array in BuildFlowsMap()");
       return RFAILED;
    }
    for(idx=0; idx<flowCnt; idx++)
@@ -2149,14 +2210,17 @@ uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
       CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
       if(flowMap->list.array[idx] == NULLP)
       {
-        return RFAILED;
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for arrayIdx[%d] in BuildFlowsMap()", idx);
+         return RFAILED;
       }
    }
    idx = 0;
    flowMap->list.array[idx]->qoSFlowIdentifier = 0;
-   ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
+   ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters,\
+         actionType, INVALID_PDU_SESSION_ID);
    if(ret != ROK)
    {
+      DU_LOG("\nERROR  -->  F1AP : Failed to Build QOS Info in BuildFlowsMap()");
       return RFAILED;
    }
    return ROK;
@@ -2187,7 +2251,8 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
    CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
    if(ulInfo->list.array == NULLP)
-   {
+   {  
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for array in BuildULTnlInfo()");
       return RFAILED;
    }
    for(idx=0; idx<ulCnt; idx++)
@@ -2195,7 +2260,8 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
       CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
       if(ulInfo->list.array[idx] == NULLP)
       {
-        return RFAILED;
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for arrayIdx [%d] in BuildULTnlInfo()", idx);
+             return RFAILED;
       }
    }
    idx = 0;
@@ -2206,6 +2272,7 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
         sizeof(GTPTunnel_t));
    if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
    {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for gTPTunnel in BuildULTnlInfo()");
       return RFAILED;
    }
    ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
@@ -2216,6 +2283,7 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
         transportLayerAddress.buf == NULLP)
    {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for gtp tunnel arrayIdx[%d] in BuildULTnlInfo()", idx);
       return RFAILED;
    }
    /* NOTE: Below IP address must be changed if running on different IP configuration */
@@ -2238,6 +2306,7 @@ uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
         == NULLP)
    {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for gtp tunnel buffer in BuildULTnlInfo()");
       return RFAILED;
    }
    ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
@@ -2274,12 +2343,13 @@ uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
    uint8_t BuildFlowsMapret =0, BuildULTnlInforet =0, drbCnt = 0;
    DRBs_ToBeSetup_Item_t *drbSetItem;
    
-   drbCnt = MAX_DRB_SET;
+   drbCnt = MAX_DRB_SET_UE_CONTEXT_SETUP_REQ;
    drbSet->list.count = drbCnt;
    drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
    CU_ALLOC(drbSet->list.array,drbSet->list.size);
    if(drbSet->list.array == NULLP)
    {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDRBSetup");
       return RFAILED;
    }
    for(idx=0; idx<drbCnt; idx++)
@@ -2287,6 +2357,7 @@ 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)
       {
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDRBSetup for arry idx [%d]", idx);
              return RFAILED;
       }
 
@@ -2302,6 +2373,7 @@ uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
       CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
       if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
       {
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed for QOS choice extension in BuildDRBSetup");
          return RFAILED;
       }
       drbSetItem->qoSInformation.choice.choice_extension->id = \
@@ -2311,41 +2383,39 @@ uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
       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);
+                             choice_extension->value.choice.DRB_Information.dRB_QoS,\
+                         ProtocolIE_ID_id_DRBs_ToBeSetup_Item, PDU_SESSION_ID_1);
       if(BuildQOSInforet != ROK)
       {
+         DU_LOG("\nERROR  -->  F1AP : Failed to build QOS Info in BuildDRBSetup");
          return RFAILED;
       }
       /*SNSSAI*/
       BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
-                              choice_extension->value.choice.DRB_Information.sNSSAI);
+                              choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[0]);
       if(BuildSNSSAIret != ROK)
       {
+         DU_LOG("\nERROR  -->  F1AP : Failed to build SNSSAI Info in BuildDRBSetup");
          return RFAILED;
       }
       /*Flows mapped to DRB List*/
       BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
-                  choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
+                  choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
+              ProtocolIE_ID_id_DRBs_ToBeSetup_Item);
       if(BuildFlowsMapret != ROK)
       {
+         DU_LOG("\nERROR  -->  F1AP : Failed to build Flow Map Info in BuildDRBSetup");
          return RFAILED;
       }
       /*ULUPTNLInformation To Be Setup List*/
       BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
       if(BuildULTnlInforet != ROK)
       {
+         DU_LOG("\nERROR  -->  F1AP : Failed to build tunnel Info in BuildDRBSetup");
          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;
   }
    return ROK;
 }/* End of BuildDRBSetup*/
@@ -2459,20 +2529,40 @@ void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
  * ****************************************************************/
 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
 {
+   ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
+   uint8_t qosCntIdx = 0;
+
    if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
    {
       if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
       {
-        if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
-        {
-           CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
-                 sizeof(MaxDataBurstVolume_t));
-        }
-        CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
-              sizeof(AveragingWindow_t));
+         if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
+         {
+            CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
+                  sizeof(MaxDataBurstVolume_t));
+         }
+         CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
+               sizeof(AveragingWindow_t));
       }
       CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
-           sizeof(NonDynamic5QIDescriptor_t));
+            sizeof(NonDynamic5QIDescriptor_t));
+   }
+   if(drbQos->iE_Extensions)
+   {
+      qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbQos->iE_Extensions;
+      if(qosIeExt->list.array != NULLP)
+      {
+         for(qosCntIdx=0; qosCntIdx <  qosIeExt->list.count; qosCntIdx++)
+         {
+            if(qosIeExt->list.array[qosCntIdx])
+            {
+               CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
+            }
+         }
+         CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
+      }
+
+      CU_FREE(drbQos->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
    }
 }
 /*******************************************************************
@@ -2546,9 +2636,12 @@ void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
 {
    DRBs_ToBeSetup_Item_t *drbSetItem;
-   uint8_t  flowidx;
-   uint8_t  drbidx;
-   if(drbSet->list.array == NULLP)
+   ProtocolExtensionContainer_4624P74_t *qosIeExt = NULLP;
+   
+   uint8_t  flowidx = 0, drbidx = 0, qosCntIdx = 0;
+
+   /*BUG: Need to check drbSet->list.array is not Empty to procced with Deletion*/
+   if(drbSet->list.array != NULLP)
    {
       for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
       {
@@ -2639,6 +2732,26 @@ void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
                         CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
                                       qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
              }
+             if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                        iE_Extensions != NULLP)
+             {
+                qosIeExt = (ProtocolExtensionContainer_4624P74_t *)drbSetItem->qoSInformation.choice.\
+                                    choice_extension->value.choice.DRB_Information.dRB_QoS.iE_Extensions;
+                 if(qosIeExt->list.array != NULLP)
+                 {
+                   for(qosCntIdx=0; qosCntIdx < qosIeExt->list.count; qosCntIdx++)
+                   {
+                      if(qosIeExt->list.array[qosCntIdx] != NULLP)
+                      {
+                         CU_FREE(qosIeExt->list.array[qosCntIdx], sizeof(QoSFlowLevelQoSParameters_ExtIEs_t));
+                      }
+                    }
+                    CU_FREE(qosIeExt->list.array, qosIeExt->list.size);
+                  }
+                  CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+                                   iE_Extensions, sizeof(ProtocolExtensionContainer_4624P74_t));
+              }
+                  
                  CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
                }
                CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
@@ -2674,62 +2787,63 @@ void FreeUeContextSetupReq(F1AP_PDU_t  *f1apMsg)
    {
       if(f1apMsg->choice.initiatingMessage != NULLP)
       {
-        ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
-        if(ueSetReq->protocolIEs.list.array != NULLP)
-        {
-           for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
-           {
-              if(ueSetReq->protocolIEs.list.array[idx])
-              {
-                 switch(ueSetReq->protocolIEs.list.array[idx]->id)
-                 {
-                    case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
-                       break;
-                    case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
-                       break;
-                    case ProtocolIE_ID_id_SpCell_ID:
-                       FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
-                       break;
-                    case ProtocolIE_ID_id_ServCellIndex:
-                       break;
-                    case ProtocolIE_ID_id_SpCellULConfigured:
-                       break;
-                    case ProtocolIE_ID_id_CUtoDURRCInformation:
-                       FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
-                       break;
-                    case ProtocolIE_ID_id_SCell_ToBeSetup_List:
-                       FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
-                       break;
-                    case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
-                       FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
-                       break;
-                    case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
-                       FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
-                       break;
-                    case ProtocolIE_ID_id_RRCContainer:
-                       if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
-                       {
-                         CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
-                         ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
-                       }
-                       break;
-                    default:
-                       DU_LOG("\nERROR  -->  F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
-                 }
-              }
-              break;
-           }
-           for(ieId=0; ieId<idx; ieId++)
-           {
-              if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
-              {
-                      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));
-  }
+         ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
+         if(ueSetReq->protocolIEs.list.array != NULLP)
+         {
+            for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
+            {
+               if(ueSetReq->protocolIEs.list.array[idx])
+               {
+                  switch(ueSetReq->protocolIEs.list.array[idx]->id)
+                  {
+                     case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+                        break;
+                     case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+                        break;
+                     case ProtocolIE_ID_id_SpCell_ID:
+                        FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
+                        break;
+                     case ProtocolIE_ID_id_ServCellIndex:
+                        break;
+                     case ProtocolIE_ID_id_SpCellULConfigured:
+                        break;
+                     case ProtocolIE_ID_id_CUtoDURRCInformation:
+                        FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
+                        break;
+                     case ProtocolIE_ID_id_SCell_ToBeSetup_List:
+                        FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
+                        break;
+                     case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
+                        FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
+                        break;
+                     case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
+                        FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
+                        break;
+                     case ProtocolIE_ID_id_RRCContainer:
+                        if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
+                        {
+                           CU_FREE(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
+                                 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
+                        }
+                        break;
+                     default:
+                        DU_LOG("\nERROR  -->  F1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
+                        break;
+                  }
+               }
+               /*BUG: Break is causing to exit the for Loop before complete traversing and freeing of each IE*/
+            }
+            for(ieId=0; ieId<idx; ieId++)
+            {
+               if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
+               {
+                  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));
    }
 }
@@ -2814,7 +2928,7 @@ void FreeUeContextSetupReq(F1AP_PDU_t  *f1apMsg)
    coreset1StartPrb = coreset0EndPrb + 6;
    coreset1NumPrb = CORESET1_NUM_PRB;
    /* calculate the PRBs */
-   freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
+   fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
    memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
    controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
 
@@ -3740,8 +3854,8 @@ uint8_t BuildBWPUlDedPucchCfg(PUCCH_Config_t *pucchCfg)
    }
 
    arrIdx = 0;
-   *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 1;
-   *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 2;
+   *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx++]) = 4;
+   *(pucchCfg->dl_DataToUL_ACK->list.array[arrIdx]) = 5;
 
    return ROK;
 }
@@ -7027,13 +7141,52 @@ void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
       CU_FREE(ulInfo->list.array,ulInfo->list.size);
    }
 }
+
+/*******************************************************************
+*
+* @brief Deletes the EGTP tunnel
+*
+* @details
+*
+*    Function : deleteEgtpTunnel 
+*
+*    Functionality: Deletes the EGTP tunnel
+*
+* @params[in] uint8_t *buf
+*
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t deleteEgtpTunnel(uint8_t *buf)
+{
+   uint32_t teId = 0;
+   EgtpTnlEvt tnlEvt;
+
+   teIdStringToInt(buf, &teId); 
+   if(teId > MAX_TEID || teId < MIN_TEID)
+   {
+      DU_LOG("\nERROR  -->  EGTP : TEID(%d) OUT Of Range", teId);
+      return RFAILED;
+   }
+   memset(&tnlEvt, 0, sizeof(EgtpTnlEvt));
+   tnlEvt.action = EGTP_TNL_MGMT_DEL;
+   tnlEvt.lclTeid = teId;
+   tnlEvt.remTeid = teId;
+   if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
+   {
+      DU_LOG("\nERROR  -->  EGTP : Failed to delete tunnel Id %d", teId);
+   }
+   return ROK;
+}
+
 /*******************************************************************
 *
 * @brief Builds the Uplink Tunnel Info
 *
 * @details
 *
-*    Function : BuildUlTnlInfoforDrb2 
+*    Function : BuildUlTnlInfoforSetupMod 
 *
 *    Functionality: Constructs the UL TnlInfo For DRB list
 *
@@ -7043,7 +7196,7 @@ void FreeUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
 *         RFAILED - failure
 *
 * ****************************************************************/
-uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
+uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
 {
    uint8_t arrIdx;
    uint8_t ulCnt;
@@ -7054,7 +7207,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
    if(ulInfo->list.array == NULLP)
    {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
       return RFAILED;
    }
    for(arrIdx=0; arrIdx<ulCnt; arrIdx++)
@@ -7062,7 +7215,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
       CU_ALLOC(ulInfo->list.array[arrIdx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
       if(ulInfo->list.array[arrIdx] == NULLP)
       {
-         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
         return RFAILED;
       }
    }
@@ -7076,7 +7229,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
         sizeof(GTPTunnel_t));
    if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
    {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
       return RFAILED;
    }
    ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
@@ -7087,7 +7240,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
         transportLayerAddress.buf == NULLP)
    {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
       return RFAILED;
    }
    
@@ -7111,7 +7264,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
    if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
         == NULLP)
    {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforDrb2");
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildUlTnlInfoforSetupMod");
       return RFAILED;
    }
    ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
@@ -7120,20 +7273,44 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
       gTP_TEID.buf[1] = 0;
    ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
       gTP_TEID.buf[2] = 0;
-   ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
-      gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
+   if(actionType == ProtocolIE_ID_id_DRBs_ToBeModified_Item)
+   {
+     /*TODO: DRB context to be stored in CU STUB so that tunnel Id can be easily
+      * fetched based on the Drb Id */
+     if(ueId == 1)
+     {
+        /* Tunnel Id for DRB 2 of UE 1 is 2. Hence passing the same TeId */
+        ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 2;
+     }
+     else if(ueId == 2)
+     {
+        /* Tunnel Id for DRB 2 of UE 2 is 5. Hence passing the same TeId */
+        ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 5;
+     }
+     else if(ueId == 3)
+     {
+        /* Tunnel Id for DRB 2 of UE 3 is 8. Hence passing the same TeId */
+        ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = 8;
+     }
 
+   }
+   else
+   {
+      ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
+        gTP_TEID.buf[3] = cuCfgParams.egtpParams.currTunnelId++;
+   }
    return ROK;
 }/*End of BuildULTnlInfo*/
+
 /*******************************************************************
 *
-* @brief freeing the DRB item
+* @brief freeing the DRB item
 *
 * @details
 *
-*    Function : FreeDrb2Item 
+*    Function : FreeDrbItem 
 *
-*    Functionality: freeing the DRB item
+*    Functionality: freeing the DRB item
 *
 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
 *
@@ -7142,7 +7319,7 @@ uint8_t BuildUlTnlInfoforDrb2(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
 *
 * ****************************************************************/
 
-void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
+void FreeDrbItem(DRBs_ToBeSetupMod_Item_t *drbItem)
 {
    uint8_t arrIdx =0;
    SNSSAI_t *snssai =NULLP;
@@ -7207,16 +7384,18 @@ void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
       CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
    }
 }
+
 /*******************************************************************
 *
-* @brief filling the DRB 2 item 
+* @brief filling the DRB setup Mod item 
 *
 * @details
 *
-*    Function : FillDrb2Item 
-*
-*    Functionality: filling the DRB 2 item 
+*    Function : FillDrbItemToSetupMod 
 *
+*    Functionality: filling the DRB setup Mod item
+*    
+*    
 * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem 
 *
 * @return ROK     - success
@@ -7224,12 +7403,12 @@ void FreeDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
 *
 * ****************************************************************/
 
-uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
+uint8_t FillDrbItemToSetupMod(uint8_t ueId, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
 {
    uint8_t ret = ROK;
 
    /*Drb Id */
-   drbItem->dRBID = DRB2;
+   drbItem->dRBID = arrIdx + DRB3;
    
    /*qoSInformation*/
    drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
@@ -7246,7 +7425,7 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
         CU_ALLOC(drbItem->qoSInformation.choice.eUTRANQoS, sizeof(EUTRANQoS_t));
         if(drbItem->qoSInformation.choice.eUTRANQoS)
         {  
-           DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in FillDrb2Item");
+           DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in FillDrbItemToSetupMod");
            return RFAILED;
         }
         drbItem->qoSInformation.choice.eUTRANQoS->qCI = QCI;
@@ -7266,14 +7445,15 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
         CU_ALLOC(drbItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
         if(drbItem->qoSInformation.choice.choice_extension == NULLP)
         {
-           DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in FillDrb2Item"); 
+           DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in FillDrbItemToSetupMod"); 
            return RFAILED;
         }
 
         drbItem->qoSInformation.choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
         drbItem->qoSInformation.choice.choice_extension->criticality = Criticality_ignore;
         drbItem->qoSInformation.choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
-        ret =  BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
+        ret =  BuildQOSInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
+           ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item, PDU_SESSION_ID_2);
         if(ret != ROK)
         {
            DU_LOG("\nERROR  -->  F1AP : BuildQOSInfo failed");
@@ -7282,7 +7462,7 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
         
         /*SNSSAI*/
         ret = BuildSNSSAI(&drbItem->qoSInformation.choice.\
-              choice_extension->value.choice.DRB_Information.sNSSAI);
+              choice_extension->value.choice.DRB_Information.sNSSAI, cuCfgParams.snssaiList[1]);
         if(ret != ROK)
         {
            DU_LOG("\nERROR  -->  F1AP : BuildSNSSAI failed");
@@ -7291,7 +7471,8 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
         
         /*Flows mapped to DRB List*/
          ret = BuildFlowsMap(&drbItem->qoSInformation.choice.\
-              choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
+              choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\ 
+          ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
         if(ret != ROK)
         {
            DU_LOG("\nERROR  -->  F1AP : BuildFlowsMap failed");
@@ -7301,26 +7482,19 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
    }
    
    /*ULUPTNLInformation To Be Setup List*/
-   ret = BuildUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
+   ret = BuildUlTnlInfoforSetupMod(ueId, &drbItem->uLUPTNLInformation_ToBeSetup_List, \
+      ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
    if(ret != ROK)
    {
-      DU_LOG("\nERROR  -->  F1AP : BuildUlTnlInfoforDrb2 failed");
+      DU_LOG("\nERROR  -->  F1AP : BuildUlTnlInfoforSetupMod failed");
       return RFAILED;
    }
 
    /*RLCMode*/
    drbItem->rLCMode = RLCMode_rlc_um_bidirectional;
-
-   /*UL Configuration*/
-   CU_ALLOC(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
-   if(drbItem->uLConfiguration == NULLP)
-   {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in FillDrb2Item");
-      return RFAILED;
-   }
-   drbItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
    return ROK;
 }
+
 /*******************************************************************
 *
 * @brief Builds the DRB to be Setup Mod ItemIes
@@ -7338,15 +7512,15 @@ uint8_t FillDrb2Item(DRBs_ToBeSetupMod_Item_t *drbItem)
 *
 * ****************************************************************/
 
-uint8_t FillDrbItemList(struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
+uint8_t FillDrbItemList(uint8_t ueId, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
 {
    drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
    drbItemIe->criticality = Criticality_reject;
    drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
 
-   if(FillDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item)) != ROK)
+   if(FillDrbItemToSetupMod(ueId, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
    {
-      DU_LOG("\nERROR  -->  F1AP : FillDrb2Item failed"); 
+      DU_LOG("\nERROR  -->  F1AP : FillDrbItemToSetupMod failed"); 
       return RFAILED;
    }
    return ROK;
@@ -7381,7 +7555,7 @@ void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
            if(arrIdx == 0)
            {
               drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
-              FreeDrb2Item(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
+              FreeDrbItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
            }
            CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
         }
@@ -7391,14 +7565,13 @@ void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
    
 }
 
-
 /*******************************************************************
 *
 * @brief Builds the DRB to be Setup Mod list 
 *
 * @details
 *
-*    Function : BuildDrbToBeSetupModList 
+*    Function : BuildDrbToBeSetupList 
 *
 *    Functionality: Constructs the DRB to be Setup Mod list
 *
@@ -7409,33 +7582,34 @@ void FreeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
 *
 * ****************************************************************/
 
-uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
+uint8_t BuildDrbToBeSetupList(uint8_t ueId, DRBs_ToBeSetupMod_List_t *drbSet)
 {
    uint8_t ret = ROK;
    uint8_t arrIdx =0;
    uint8_t drbCnt =0;
 
-   drbCnt = 1;
+   drbCnt = MAX_DRB_SET_UE_CONTEXT_MOD_REQ;
    drbSet->list.count = drbCnt;
    drbSet->list.size = drbCnt * sizeof(DRBs_ToBeSetupMod_ItemIEs_t *);
    CU_ALLOC(drbSet->list.array, drbSet->list.size);
    if(drbSet->list.array == NULLP)
    {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupList");
       return  RFAILED;
    }
+
    for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
    {
       CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeSetupMod_ItemIEs_t));
       if(drbSet->list.array[arrIdx] == NULLP)
       {
-         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupList for array idx [%d]", arrIdx);
         return  RFAILED;
       }
    }
 
-   arrIdx=0;
-   ret = FillDrbItemList((DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
+   arrIdx = 0;
+   ret = FillDrbItemList(ueId, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
    if(ret != ROK)
    {
       DU_LOG("\nERROR  -->  F1AP : FillDrbItemList failed");
@@ -7443,122 +7617,445 @@ uint8_t BuildDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
 
    return ret;
 }
+
 /*******************************************************************
- *
- * @brief  free the UeContextModification Request 
- *
- * @details
- *
- *    Function : FreeUeContextModicationRequest 
- *
- *    Functionality : deallocation of memory allocated in UeContextModiification
- request
- *
- * @params[in] F1AP_PDU_t *f1apMsg 
- *
- * @return void 
+*
+* @brief Filling the DRB to be modified item 
+*
+* @details
+*
+*    Function : FillDrbToBeModItem
+*
+*    Functionality: filling the DRB to be modified item
+*
+* @params[in] DRBs_ToBeModified_Item_t *drbItem 
+*
+* @return ROK     - success
+*         RFAILED - failure
 *
 * ****************************************************************/
-void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
-{
-   uint8_t arrIdx =0 , ieId=0; 
-   UEContextModificationRequest_t *UeContextModifyReq = NULLP;
 
-   if(f1apMsg)
-   {
-      if(f1apMsg->choice.initiatingMessage)
-      {
-        UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
-        if(UeContextModifyReq->protocolIEs.list.array)
-        {
-           for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
-           {
-              if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
-              {
-                 ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
-                 switch(ieId)
-                 {
-                    case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
-                       break;
-                    case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
-                       break;
-                    case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
-                       {
-                          FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
-                          choice.DRBs_ToBeSetupMod_List);
-                          break;
-                       }
-                 }
-                 CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
-              }          
-           }
-           CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
-        }
-        CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
-      }
-      CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
-   }
-}
-/*******************************************************************
- *
- * @brief Builds the Ue Context Modification Req 
- *
- * @details
- *
- *    Function : BuildAndSendUeContextModificationReq 
- *
- *    Functionality: Constructs the Ue Context Modification Req
- *
- * @params[in] 
- *
- * @return ROK     - success
- *         RFAILED - failure
- *
- * ****************************************************************/
-uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
+uint8_t FillDrbToBeModItem(uint8_t ueId, DRBs_ToBeModified_Item_t *drbItem)
 {
-   uint8_t    ieIdx = 0;
-   uint8_t    elementCnt = 0;
-   uint8_t    ret = RFAILED;
-   F1AP_PDU_t *f1apMsg = NULLP;
-   UEContextModificationRequest_t *ueContextModifyReq = NULLP;
+   uint8_t ret = ROK;
 
-   asn_enc_rval_t         encRetVal;
-   DU_LOG("\nINFO  -->  F1AP : Building Ue context modification request\n");
+   /*Drb Id */
+   drbItem->dRBID = DRB2;
 
-   while(1)
+   /*qoSInformation*/
+   drbItem->qoSInformation = NULLP;
+   CU_ALLOC(drbItem->qoSInformation, sizeof(QoSInformation_t));
+   if(drbItem->qoSInformation != NULLP)
    {
-      CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
-      if(f1apMsg == NULLP)
+      drbItem->qoSInformation->present = QoSInformation_PR_choice_extension;
+
+      switch(drbItem->qoSInformation->present)
       {
-        DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
-        break;
-      }
+         case QoSInformation_PR_NOTHING:
+            {
+               break;
+            }
+         case QoSInformation_PR_eUTRANQoS:
+            {
 
-      f1apMsg->present =  F1AP_PDU_PR_initiatingMessage;
+               CU_ALLOC(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
+               if(drbItem->qoSInformation->choice.eUTRANQoS)
+               {  
+                  DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in FillDrbToBeModItem");
+                  return RFAILED;
+               }
+               drbItem->qoSInformation->choice.eUTRANQoS->qCI = QCI;
+               drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.priorityLevel =
+                  PriorityLevel_no_priority;
 
-      CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
-      if(f1apMsg->choice.initiatingMessage == NULLP)
-      {
-        DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
-        break;
-      }
-      f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
-      f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
-      f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
+               drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability =
+                  Pre_emptionCapability_may_trigger_pre_emption;
 
-      ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+               drbItem->qoSInformation->choice.eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability =
+                  Pre_emptionVulnerability_pre_emptable;
 
-      elementCnt = 3;
-      ueContextModifyReq->protocolIEs.list.count = elementCnt;
-      ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
+               break;
+            }
+         case QoSInformation_PR_choice_extension:
+            {
+               CU_ALLOC(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
+               if(drbItem->qoSInformation->choice.choice_extension == NULLP)
+               {
+                  DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in FillDrbItemToSetupMod"); 
+                  return RFAILED;
+               }
 
-      /* Initialize the UE context modification members */
-      CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
-      if(ueContextModifyReq->protocolIEs.list.array == NULLP)
-      { 
-        DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE context modifcation Request failed");
-        break;
+               drbItem->qoSInformation->choice.choice_extension->id = ProtocolIE_ID_id_DRB_Information;
+               drbItem->qoSInformation->choice.choice_extension->criticality = Criticality_ignore;
+               drbItem->qoSInformation->choice.choice_extension->value.present = QoSInformation_ExtIEs__value_PR_DRB_Information;
+               ret =  BuildQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS,\
+                     ProtocolIE_ID_id_DRBs_ToBeModified_Item, INVALID_PDU_SESSION_ID);
+               if(ret != ROK)
+               {
+                  DU_LOG("\nERROR  -->  F1AP : BuildQOSInfo failed");
+                  return RFAILED;
+               }
+
+               /*SNSSAI*/
+               ret = BuildSNSSAI(&drbItem->qoSInformation->choice.\
+                     choice_extension->value.choice.DRB_Information.sNSSAI,cuCfgParams.snssaiList[0]);
+               if(ret != ROK)
+               {
+                  DU_LOG("\nERROR  -->  F1AP : BuildSNSSAI failed");
+                  return RFAILED;
+               }
+
+               /*Flows mapped to DRB List*/
+               ret = BuildFlowsMap(&drbItem->qoSInformation->choice.\
+                     choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List,\
+                     ProtocolIE_ID_id_DRBs_ToBeModified_Item);
+               if(ret != ROK)
+               {
+                  DU_LOG("\nERROR  -->  F1AP : BuildFlowsMap failed");
+                  return RFAILED;
+               }
+            }
+      }
+   }/* End of QoS */
+
+   /*ULUPTNLInformation To Be Setup List*/
+   ret = BuildUlTnlInfoforSetupMod(ueId, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
+            ProtocolIE_ID_id_DRBs_ToBeModified_Item);
+   if(ret != ROK)
+   {
+      DU_LOG("\nERROR  -->  F1AP : BuildUlTnlInfoforSetupMod failed");
+      return RFAILED;
+   }
+   return ROK;
+}
+
+/*******************************************************************
+*
+* @brief Builds the DRB to be modified Item IE
+*
+* @details
+*
+*    Function : FillDrbToBeModItemList
+*
+*    Functionality: Constructs the DRB to be modified Mod Item Ies
+*
+* @params[in] struct DRBs_ToBeModified_ItemIEs *drbItemIe
+*
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+
+uint8_t FillDrbToBeModItemList(uint8_t ueId, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
+{
+   drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
+   drbItemIe->criticality = Criticality_reject;
+   drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
+   if(FillDrbToBeModItem(ueId, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
+   {
+      DU_LOG("\nERROR  -->  F1AP : FillDrbToBeModItem failed"); 
+      return RFAILED;
+   }
+
+   return ROK;
+}
+
+/*******************************************************************
+*
+* @brief Builds the DRB to be modified list 
+*
+* @details
+*
+*    Function : BuildDrbToBeModList 
+*
+*    Functionality: Constructs the DRB to be modified list
+*
+* @params[in] DRBs_ToBeModified_List_t *drbSet 
+*
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+
+uint8_t BuildDrbToBeModifiedList(uint8_t ueId, DRBs_ToBeModified_List_t *drbSet)
+{
+   uint8_t ret = ROK;
+   uint8_t arrIdx =0;
+   uint8_t drbCnt =0;
+
+   drbCnt = 1;
+   drbSet->list.count = drbCnt;
+   drbSet->list.size = drbCnt * sizeof(DRBs_ToBeModified_ItemIEs_t *);
+   CU_ALLOC(drbSet->list.array, drbSet->list.size);
+   if(drbSet->list.array == NULLP)
+   {
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeModifiedList");
+      return  RFAILED;
+   }
+   for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
+   {
+      CU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
+      if(drbSet->list.array[arrIdx] == NULLP)
+      {
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation failed in BuildDrbToBeSetupList");
+        return  RFAILED;
+      }
+   }
+
+   arrIdx=0;
+   ret = FillDrbToBeModItemList(ueId, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
+   if(ret != ROK)
+   {
+      DU_LOG("\nERROR  -->  F1AP : FillDrbToBeModItemList failed");
+   }
+
+   return ret;
+}
+
+/*******************************************************************
+*
+* @brief freeing the DRB  item
+*
+* @details
+*
+*    Function : FreeModifiedDrbItem
+*
+*    Functionality: freeing the DRB 2 item
+*
+* @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
+*
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+
+void FreeModifiedDrbItem(DRBs_ToBeModified_Item_t *drbItem)
+{
+   uint8_t arrIdx =0;
+   SNSSAI_t *snssai =NULLP;
+   Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
+
+   if(drbItem->qoSInformation != NULLP)
+   { 
+      switch(drbItem->qoSInformation->present)
+      {
+         case QoSInformation_PR_NOTHING:
+            break;
+         case QoSInformation_PR_eUTRANQoS:
+            {
+               if(drbItem->qoSInformation->choice.eUTRANQoS)
+               {
+                  CU_FREE(drbItem->qoSInformation->choice.eUTRANQoS, sizeof(EUTRANQoS_t));
+               }
+               break;
+            }
+         case QoSInformation_PR_choice_extension:
+            {
+               if(drbItem->qoSInformation->choice.choice_extension)
+               {
+                  FreeQOSInfo(&drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.dRB_QoS);
+
+                  snssai = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.sNSSAI;
+                  if(snssai->sST.buf)
+                  {
+                     CU_FREE(snssai->sST.buf,snssai->sST.size);
+                  }
+                  if(snssai->sD)
+                  {
+                     if(snssai->sD->buf)
+                     {
+                        CU_FREE(snssai->sD->buf,snssai->sD->size);
+                     }
+                     CU_FREE(snssai->sD,sizeof(OCTET_STRING_t));
+                  }
+
+                  flowMap = &drbItem->qoSInformation->choice.choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List;
+                  if(flowMap->list.array)
+                  {
+                     for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
+                     {
+                        if(flowMap->list.array[arrIdx] )
+                        {
+                           FreeQOSInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
+                           CU_FREE(flowMap->list.array[arrIdx],sizeof(Flows_Mapped_To_DRB_Item_t));
+                        }
+                     }
+                     CU_FREE(flowMap->list.array,flowMap->list.size);
+                  }
+
+                  CU_FREE(drbItem->qoSInformation->choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
+               }
+               break;
+            }
+      }
+   }
+   FreeUlTnlInfoforDrb2(&drbItem->uLUPTNLInformation_ToBeSetup_List);
+   if(drbItem->uLConfiguration)
+   {
+      CU_FREE(drbItem->uLConfiguration,sizeof(ULConfiguration_t));
+   }
+}
+
+/*******************************************************************
+*
+* @brief free the DRB to be modfified list
+*
+* @details
+*
+*    Function : FreeDrbToBeModifiedList
+*
+*    Functionality: free the DRB to be Setup Mod list
+*
+* @params[in] FreeDrbToBeModifiedList_t *drbSet
+*
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+void FreeDrbToBeModifiedList(DRBs_ToBeModified_List_t *drbSet)
+{
+   uint8_t arrIdx =0;
+   struct DRBs_ToBeModified_ItemIEs *drbItemIe;
+
+   if(drbSet->list.array)
+   {
+      for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
+      {
+         if(drbSet->list.array[arrIdx] != NULLP)
+         {
+            drbItemIe = (struct DRBs_ToBeModified_ItemIEs *)drbSet->list.array[arrIdx];
+            FreeModifiedDrbItem(&(drbItemIe->value.choice.DRBs_ToBeModified_Item));
+            CU_FREE(drbSet->list.array[arrIdx], sizeof(DRBs_ToBeModified_ItemIEs_t));
+         }
+      }
+      CU_FREE(drbSet->list.array, drbSet->list.size);
+   }
+
+}
+
+/*******************************************************************
+ *
+ * @brief  free the UeContextModification Request 
+ *
+ * @details
+ *
+ *    Function : FreeUeContextModicationRequest 
+ *
+ *    Functionality : deallocation of memory allocated in UeContextModiification
+ request
+ *
+ * @params[in] F1AP_PDU_t *f1apMsg 
+ *
+ * @return void 
+*
+* ****************************************************************/
+void FreeUeContextModicationRequest(F1AP_PDU_t *f1apMsg)
+{
+   uint8_t arrIdx =0 , ieId=0; 
+   UEContextModificationRequest_t *UeContextModifyReq = NULLP;
+
+   if(f1apMsg)
+   {
+      if(f1apMsg->choice.initiatingMessage)
+      {
+         UeContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+         if(UeContextModifyReq->protocolIEs.list.array)
+         {
+            for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
+            {
+               if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
+               {
+                  ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
+                  switch(ieId)
+                  {
+                     case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+                        break;
+                     case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+                        break;
+                     case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
+                        {
+                           FreeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
+                                 choice.DRBs_ToBeSetupMod_List);
+                           break;
+                        }
+                     case ProtocolIE_ID_id_DRBs_ToBeModified_List:
+                        {
+                           FreeDrbToBeModifiedList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->value.\
+                                 choice.DRBs_ToBeSetupMod_List);
+                           break;
+                        }
+
+                  }
+                  CU_FREE(UeContextModifyReq->protocolIEs.list.array[arrIdx], sizeof(UEContextModificationRequest_t));
+               }         
+            }
+            CU_FREE(UeContextModifyReq->protocolIEs.list.array, UeContextModifyReq->protocolIEs.list.size);
+         }
+         CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+      }
+      CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
+   }
+}
+/*******************************************************************
+ *
+ * @brief Builds the Ue Context Modification Req 
+ *
+ * @details
+ *
+ *    Function : BuildAndSendUeContextModificationReq 
+ *
+ *    Functionality: Constructs the Ue Context Modification Req
+ *
+ * @params[in] 
+ *
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
+{
+   uint8_t    ieIdx = 0;
+   uint8_t    elementCnt = 0;
+   uint8_t    ret = RFAILED;
+   F1AP_PDU_t *f1apMsg = NULLP;
+   UEContextModificationRequest_t *ueContextModifyReq = NULLP;
+
+   asn_enc_rval_t         encRetVal;
+   DU_LOG("\nINFO  -->  F1AP : Building Ue context modification request\n");
+
+   while(1)
+   {
+      CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
+      if(f1apMsg == NULLP)
+      {
+        DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
+        break;
+      }
+
+      f1apMsg->present =  F1AP_PDU_PR_initiatingMessage;
+
+      CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+      if(f1apMsg->choice.initiatingMessage == NULLP)
+      {
+        DU_LOG("\nERROR  -->  F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
+        break;
+      }
+      f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextModification;
+      f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
+      f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_UEContextModificationRequest;
+
+      ueContextModifyReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+
+      elementCnt = 4;
+      ueContextModifyReq->protocolIEs.list.count = elementCnt;
+      ueContextModifyReq->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationRequest_t *);
+
+      /* Initialize the UE context modification members */
+      CU_ALLOC(ueContextModifyReq->protocolIEs.list.array, ueContextModifyReq->protocolIEs.list.size);
+      if(ueContextModifyReq->protocolIEs.list.array == NULLP)
+      { 
+        DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE context modifcation Request failed");
+        break;
       }
 
       for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
@@ -7586,13 +8083,26 @@ uint8_t BuildAndSendUeContextModificationReq(uint8_t ueId)
                                                                        UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = ueId;
 
+      /* DRB to be setup list */
       ieIdx++;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
       ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
          UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
-      ret = BuildDrbToBeSetupModList(&(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
+      ret = BuildDrbToBeSetupList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
          value.choice.DRBs_ToBeSetupMod_List));
+
+      /* DRB to be modified list */
+      ieIdx++;
+      ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_ToBeModified_List;
+      ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+      ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
+         UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
+      ret = BuildDrbToBeModifiedList(ueId, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
+         value.choice.DRBs_ToBeModified_List));
+
+      /* TODO: DRB to be release list */
+         
       if(ret != ROK)
       {
          break;
@@ -7784,7 +8294,7 @@ uint8_t BuildAndSendUeContextReleaseCommand(uint8_t cuUeF1apId, uint8_t duUeF1ap
       ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size);
       if(!ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
       {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
+      DU_LOG("\nERROR  -->  F1AP : Memory allocation for BuildAndSendUeContextReleaseCommand failed");
       break;
       }
       memset(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf, 0, bufLen);
@@ -7898,7 +8408,6 @@ uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
    GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
 
    duCfgUpdate = &f1apMsg->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
-
    for(ieIdx=0; ieIdx < duCfgUpdate->protocolIEs.list.count; ieIdx++)
    {
       switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
@@ -7942,6 +8451,267 @@ uint8_t procGnbDuUpdate(F1AP_PDU_t *f1apMsg)
 
    return ROK;
 }
+
+/*******************************************************************
+*
+* @brief storing slice list in CU database
+*
+* @details
+*
+*    Function : buildSliceList
+*
+*    Functionality:
+*         - storing slice list in CU database 
+*
+* @params[in] SliceSupportList_t *sliceSupportList
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t buildSliceList(SliceSupportList_t *sliceSupportList)
+{
+   uint8_t sliceListIdx = 0;
+
+   if(sliceSupportList)
+   {
+      if(sliceSupportList->list.array)
+      {
+         cuCfgParams.numSnssaiSupported = sliceSupportList->list.count;
+         for(sliceListIdx=0; sliceListIdx<sliceSupportList->list.count; sliceListIdx++)
+         {
+            if(sliceSupportList->list.array[sliceListIdx])
+            {
+               CU_ALLOC(cuCfgParams.snssaiList[sliceListIdx], sizeof(Snssai)); 
+               if(cuCfgParams.snssaiList[sliceListIdx] == NULLP)
+               {
+                   DU_LOG("\nERROR  --> CU_STUB: buildSliceList(): Memory allocation failed");
+                   return RFAILED;
+               }
+               if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.buf)
+               {
+                  memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sst, sliceSupportList->list.array[sliceListIdx]->\
+                  sNSSAI.sST.buf, sliceSupportList->list.array[sliceListIdx]->sNSSAI.sST.size);
+               }
+               if(sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size)
+               {
+                  memcpy(&cuCfgParams.snssaiList[sliceListIdx]->sd,\
+                  sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->buf,\
+                  sliceSupportList->list.array[sliceListIdx]->sNSSAI.sD->size);
+               }
+            }
+         }
+      }
+   }
+   return ROK;
+}
+
+/****************************************************************
+ * @brief Function to process Drb Setup Mod List 
+ *
+ * @details
+ *
+ *    Function : procDrbSetupModList
+ *    
+ *    Functionality:
+ *         - Function to process DRB Setup Mod List
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t procDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
+{
+   uint8_t arrIdx = 0;
+   uint32_t teId = 0;
+   struct DRBs_SetupMod_ItemIEs *drbItemIe = NULLP;
+
+   if(drbSetupList != NULLP)
+   {
+      for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
+      {
+         drbItemIe = ((struct DRBs_SetupMod_ItemIEs *)drbSetupList->list.array[arrIdx]);
+         if(drbItemIe->value.present == DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item)
+         {
+            /* extracting teId */
+            teId  = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_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 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 Function to process Ue Context Modification Response 
+ *
+ * @details
+ *
+ *    Function : procUeContextModificationResponse
+ *    
+ *    Functionality:
+ *         - Function to process Ue Context Modification Response
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t procUeContextModificationResponse(F1AP_PDU_t *f1apMsg)
+{
+   uint8_t idx, duUeF1apId;
+       UEContextModificationResponse_t *ueCtxtModRsp = NULLP;
+   ueCtxtModRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
+   
+   for(idx=0; idx < ueCtxtModRsp->protocolIEs.list.count; idx++)
+   {
+      switch(ueCtxtModRsp->protocolIEs.list.array[idx]->id)
+      {
+          case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+             {
+                duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
+                break;
+             }
+          case ProtocolIE_ID_id_DRBs_SetupMod_List:
+             {
+                /* Adding Tunnels for successful DRB */
+                procDrbSetupModList(&ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
+                break; 
+
+             }
+      }
+   }
+   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  
@@ -8024,7 +8794,7 @@ void F1APMsgHdlr(Buffer *mBuf)
                case InitiatingMessage__value_PR_F1SetupRequest:
                   {
                      DU_LOG("\nINFO  -->  F1AP : F1 setup request received");
-                     BuildAndSendF1SetupRsp();
+                     procF1SetupReq(f1apMsg);
                      break;
                   }
 
@@ -8086,6 +8856,7 @@ void F1APMsgHdlr(Buffer *mBuf)
                case SuccessfulOutcome__value_PR_UEContextModificationResponse:
                   {
                      DU_LOG("\nINFO  -->  F1AP : UE Context Modification Response received");
+                     procUeContextModificationResponse(f1apMsg);
                      break;
                   }
                case SuccessfulOutcome__value_PR_UEContextReleaseComplete: