From b3c0095f0726e5db0f6f794ad8e474733c6ba9a5 Mon Sep 17 00:00:00 2001
From: matzakos <matzakos@eurecom.fr>
Date: Tue, 5 Oct 2021 17:24:16 +0200
Subject: [PATCH] Add handler function for UE context modification request
 message at F1AP layer of the DU

-Fix indentation in UE context modification request message generation function at the CU
---
 openair2/COMMON/f1ap_messages_types.h         |   6 +
 openair2/F1AP/f1ap_cu_ue_context_management.c | 750 +++++++++---------
 openair2/F1AP/f1ap_du_ue_context_management.c | 151 +++-
 openair2/F1AP/f1ap_handlers.c                 |   2 +-
 4 files changed, 532 insertions(+), 377 deletions(-)

diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index 3a5b95408b3..2881910b19d 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -357,6 +357,11 @@ typedef enum QoS_information_e {
   EUTRAN_QoS    = 1,
 } QoS_information_t;
 
+typedef enum ReconfigurationCompl_e {
+  RRCreconf_failure = 0,
+  RRCreconf_success = 1,
+} ReconfigurationCompl_t;
+
 typedef struct f1ap_ue_context_setup_s {
   uint32_t gNB_CU_ue_id;    // BK: need to replace by use from rnti
   uint32_t gNB_DU_ue_id;
@@ -383,6 +388,7 @@ typedef struct f1ap_ue_context_setup_s {
   uint8_t  srbs_failed_to_be_setup_length;
   f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup;
   s1ap_initial_context_setup_req_t *s1ap_initial_context_setup_req;
+  ReconfigurationCompl_t ReconfigComplOutcome;
    // coniatner for the rrc_eNB_generate_SecurityModeCommand message
   uint8_t *rrc_container;
   int      rrc_container_length;
diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c
index 40cac2398ff..087d63d3f15 100644
--- a/openair2/F1AP/f1ap_cu_ue_context_management.c
+++ b/openair2/F1AP/f1ap_cu_ue_context_management.c
@@ -1160,338 +1160,338 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
   /* optional */
   /* c9. SCell_ToBeSetupMod_List */
   if(0){
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9);
-  ie9->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List;
-  ie9->criticality                    = F1AP_Criticality_ignore;
-  ie9->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List;
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9);
+    ie9->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List;
+    ie9->criticality                    = F1AP_Criticality_ignore;
+    ie9->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List;
 
-  for (int i=0; i<1; i++) {
-    //
-    asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list,
+    for (int i=0; i<1; i++) {
+      //
+      asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list,
                      F1AP_SCell_ToBeSetupMod_ItemIEs_t, scell_toBeSetupMod_item_ies);
-    scell_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item;
-    scell_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
-    scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item;
-    /* 8.1 SCell_ToBeSetup_Item */
-    F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
-      &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
-    //   /* - sCell_ID */
-    addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
-    /* sCellIndex */
-    scell_toBeSetupMod_item->sCellIndex = 6;  // issue here
-  }
+      scell_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item;
+      scell_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_ignore;
+      scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item;
+      /* 8.1 SCell_ToBeSetup_Item */
+      F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
+          &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
+      //   /* - sCell_ID */
+      addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
+      /* sCellIndex */
+      scell_toBeSetupMod_item->sCellIndex = 6;  // issue here
+      }
   }
 
   /* optional */
   /* c10. SCell_ToBeRemoved_List */
   if(0){
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10);
-  ie10->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List;
-  ie10->criticality                    = F1AP_Criticality_ignore;
-  ie10->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List;
-
-  for (int i=0;  i<1; i++) {
-    //
-    asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list,
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10);
+    ie10->id                             = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List;
+    ie10->criticality                    = F1AP_Criticality_ignore;
+    ie10->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List;
+
+    for (int i=0;  i<1; i++) {
+      //
+      asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list,
                      F1AP_SCell_ToBeRemoved_ItemIEs_t, scell_toBeRemoved_item_ies);
-    scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
-    //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
-    scell_toBeRemoved_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item;
-    scell_toBeRemoved_item_ies->criticality   = F1AP_Criticality_ignore;
-    scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item;
-    /* 10.1 SCell_ToBeRemoved_Item */
-    F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
-      &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
-    /* - sCell_ID */
-    addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
-  }
+      scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
+      //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
+      scell_toBeRemoved_item_ies->id            = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item;
+      scell_toBeRemoved_item_ies->criticality   = F1AP_Criticality_ignore;
+      scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item;
+      /* 10.1 SCell_ToBeRemoved_Item */
+      F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
+        &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
+      /* - sCell_ID */
+      addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
+    }
   }
 
   /* mandatory */
   /* c11. SRBs_ToBeSetupMod_List */
   if(f1ap_ue_context_modification_req->srbs_to_be_setup_length > 0){
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11);
-  ie11->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List;
-  ie11->criticality                    = F1AP_Criticality_reject;
-  ie11->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List;
-
-  for (int i=0; i<f1ap_ue_context_modification_req->srbs_to_be_setup_length; i++) {
-    //
-    asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List, F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies);
-    srbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item; // 73
-    srbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
-    srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item;
-    /* 11.1 SRBs_ToBeSetup_Item */
-    F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=&srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item;
-    /* 11.1.1 sRBID */
-    srbs_toBeSetupMod_item->sRBID = f1ap_ue_context_modification_req->srbs_to_be_setup[i].srb_id;
-    /* OPTIONAL */
-    /* 11.1.2 duplicationIndication */
-    //if (0) {
-    asn1cCallocOne(srbs_toBeSetupMod_item->duplicationIndication,
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11);
+    ie11->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List;
+    ie11->criticality                    = F1AP_Criticality_reject;
+    ie11->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List;
+
+    for (int i=0; i<f1ap_ue_context_modification_req->srbs_to_be_setup_length; i++) {
+      //
+      asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List, F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies);
+      srbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item; // 73
+      srbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
+      srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item;
+      /* 11.1 SRBs_ToBeSetup_Item */
+      F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=&srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item;
+      /* 11.1.1 sRBID */
+      srbs_toBeSetupMod_item->sRBID = f1ap_ue_context_modification_req->srbs_to_be_setup[i].srb_id;
+      /* OPTIONAL */
+      /* 11.1.2 duplicationIndication */
+      //if (0) {
+      asn1cCallocOne(srbs_toBeSetupMod_item->duplicationIndication,
                    F1AP_DuplicationIndication_true); // enum
-    //}
-  }
+      //}
+    }
   }
 
   /* mandatory */
   /* c12. DRBs_ToBeSetupMod_List */
   if(f1ap_ue_context_modification_req->drbs_to_be_setup_length){
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12);
-  ie12->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
-  ie12->criticality                    = F1AP_Criticality_reject;
-  ie12->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12);
+    ie12->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
+    ie12->criticality                    = F1AP_Criticality_reject;
+    ie12->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
 
-  for (int i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; i++) {
-    asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list,
+    for (int i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; i++) {
+      asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list,
                      F1AP_DRBs_ToBeSetupMod_ItemIEs_t, drbs_toBeSetupMod_item_ies);
-    drbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
-    drbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
-    /* 12.1 DRBs_ToBeSetupMod_Item */
-    F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item=
-      &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item;
-    /* dRBID */
-    drbs_toBeSetupMod_item->dRBID = f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id;
-    /* qoSInformation */
-
-    if(f1ap_ue_context_modification_req->QoS_information_type == EUTRAN_QoS){
-      drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
-      drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
-      drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L;
-      /* uLUPTNLInformation_ToBeSetup_List */
-      int maxnoofULTunnels = 1; // 2;
-
-      for (int j=0;  j<maxnoofULTunnels;  j++) {
-        /*  ULTunnels_ToBeSetup_Item */
-        asn1cSequenceAdd( drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
+      drbs_toBeSetupMod_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
+      drbs_toBeSetupMod_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
+      /* 12.1 DRBs_ToBeSetupMod_Item */
+      F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item=
+          &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item;
+      /* dRBID */
+      drbs_toBeSetupMod_item->dRBID = f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id;
+      /* qoSInformation */
+
+      if(f1ap_ue_context_modification_req->QoS_information_type == EUTRAN_QoS){
+        drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
+        drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
+        drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L;
+        /* uLUPTNLInformation_ToBeSetup_List */
+        int maxnoofULTunnels = 1; // 2;
+
+        for (int j=0;  j<maxnoofULTunnels;  j++) {
+          /*  ULTunnels_ToBeSetup_Item */
+          asn1cSequenceAdd( drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
                         F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
-        uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-        asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+          uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+          asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
                   gTPTunnel)
-        /* transportLayerAddress */
-        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
-        /* gTP_TEID */
-        OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567",
+          /* transportLayerAddress */
+          TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
+          /* gTP_TEID */
+          OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567",
             strlen("4567"));
-    }
-
-      /* rLCMode */
-      drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum
-
-      /* OPTIONAL */
-      /* ULConfiguration */
-      if (0) {
-        drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
-      }
-    } //QoS information
-
-    else{
-    /* 12.1.2 DRB_Information */
-    drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
-    F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
-    ie->id                             = F1AP_ProtocolIE_ID_id_DRB_Information;
-    ie->criticality                    = F1AP_Criticality_reject;
-    ie->value.present                  = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
-    F1AP_DRB_Information_t   *DRB_Information = &ie->value.choice.DRB_Information;
-    drbs_toBeSetupMod_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
-    /* 12.1.2.1 dRB_QoS */
-    {
-      /* qoS_Characteristics */
-      {
-        int some_decide_qoS_characteristics = 0; // BK: Need Check
-
-        if (some_decide_qoS_characteristics) {
-          DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
-          setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
-        } else {
-          DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
-          asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
-          /* qoSPriorityLevel */
-          tmp->qoSPriorityLevel = 1L;
-          /* packetDelayBudget */
-          tmp->packetDelayBudget = 1L;
-          /* packetErrorRate */
-          tmp->packetErrorRate.pER_Scalar = 1L;
-          tmp->packetErrorRate.pER_Exponent = 6L;
-
-          /* OPTIONAL */
-          /* delayCritical */
-          if (0) {
-            asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
-          }
-
-          /* OPTIONAL */
-          /* averagingWindow */
-          if (0) {
-            asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
-          }
-
-          /* OPTIONAL */
-          /* maxDataBurstVolume */
-          if (0) {
-            asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
-          }
-        } // if some_decide_qoS_characteristics
-
-      } // qoS_Characteristics
-      /* nGRANallocationRetentionPriority */
-      {
-        DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
-        DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
-        DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
-      } // nGRANallocationRetentionPriority
-
-      /* OPTIONAL */
-      /* gBR_QoS_Flow_Information */
-      if (0) {
-        asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
-        asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
-        asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
-        asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
-        asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
-
-        /* OPTIONAL */
-        /* maxPacketLossRateDownlink */
-        if (0) {
-          asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
         }
 
+        /* rLCMode */
+        drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum
+
         /* OPTIONAL */
-        /* maxPacketLossRateUplink */
+        /* ULConfiguration */
         if (0) {
-          asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+          drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
         }
-      }
-
-      /* OPTIONAL */
-      /* reflective_QoS_Attribute */
-      if (0) {
-        asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
-      }
-    } // dRB_QoS
-    /* 12.1.2.2 sNSSAI */
-    {
-      /* sST */
-
-      OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
+      } //QoS information
+
+      else{
+        /* 12.1.2 DRB_Information */
+        drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
+        F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
+        ie->id                             = F1AP_ProtocolIE_ID_id_DRB_Information;
+        ie->criticality                    = F1AP_Criticality_reject;
+        ie->value.present                  = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
+        F1AP_DRB_Information_t   *DRB_Information = &ie->value.choice.DRB_Information;
+        drbs_toBeSetupMod_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
+        /* 12.1.2.1 dRB_QoS */
+        {
+          /* qoS_Characteristics */
+          {
+            int some_decide_qoS_characteristics = 0; // BK: Need Check
 
-      /* OPTIONAL */
-      /* sD */
-      if (0) {
-        asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
-        OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
-            strlen("asdsa1d32sa1d31asd31as"));
-      }
-    }
+            if (some_decide_qoS_characteristics) {
+              DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+              setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
+            } else {
+              DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+              asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
+              /* qoSPriorityLevel */
+              tmp->qoSPriorityLevel = 1L;
+              /* packetDelayBudget */
+              tmp->packetDelayBudget = 1L;
+              /* packetErrorRate */
+              tmp->packetErrorRate.pER_Scalar = 1L;
+              tmp->packetErrorRate.pER_Exponent = 6L;
 
-    /* OPTIONAL */
-    /* 12.1.2.3 notificationControl */
-    if (0) {
-      asn1cCallocOne(DRB_Information->notificationControl,
-          F1AP_NotificationControl_active); // enum
-    }
+              /* OPTIONAL */
+              /* delayCritical */
+              if (0) {
+                asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
+              }
 
-    /* 12.1.2.4 flows_Mapped_To_DRB_List */  // BK: need verifiy
+              /* OPTIONAL */
+              /* averagingWindow */
+              if (0) {
+                asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
+              }
 
-    for (int k = 0; k < 1; k ++) {
-      asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
-                         F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
-      /* qoSFlowIndicator */
-      flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
-      /* qoSFlowLevelQoSParameters */
-      {
-        /* qoS_Characteristics */
-        {
-          int some_decide_qoS_characteristics = 0; // BK: Need Check
-          F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
+              /* OPTIONAL */
+              /* maxDataBurstVolume */
+              if (0) {
+                asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
+              }
+            } // if some_decide_qoS_characteristics
 
-          if (some_decide_qoS_characteristics) {
-            QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
-            setQos(QosParams->choice.non_Dynamic_5QI);
-          } else {
-            QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
-            asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
-            /* qoSPriorityLevel */
-            tmp->qoSPriorityLevel = 1L;
-            /* packetDelayBudget */
-            tmp->packetDelayBudget = 1L;
-            /* packetErrorRate */
-            tmp->packetErrorRate.pER_Scalar = 1L;
-            tmp->packetErrorRate.pER_Exponent = 6L;
+          } // qoS_Characteristics
+          /* nGRANallocationRetentionPriority */
+          {
+            DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+            DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+            DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+          } // nGRANallocationRetentionPriority
 
-            /* OPTIONAL */
-            /* delayCritical */
-            if (0) {
-              asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
-              *tmp = 1L;
-            }
+          /* OPTIONAL */
+          /* gBR_QoS_Flow_Information */
+          if (0) {
+            asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
+            asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+            asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+            asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+            asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
 
             /* OPTIONAL */
-            /* averagingWindow */
+            /* maxPacketLossRateDownlink */
             if (0) {
-              asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
-              *tmp = 1L;
+              asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
             }
 
             /* OPTIONAL */
-            /* maxDataBurstVolume */
+            /* maxPacketLossRateUplink */
             if (0) {
-              asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
-              *tmp= 1L;
+              asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
             }
-          } // if some_decide_qoS_characteristics
+          }
 
-        } // qoS_Characteristics
-        /* nGRANallocationRetentionPriority */
+          /* OPTIONAL */
+          /* reflective_QoS_Attribute */
+          if (0) {
+            asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
+          }
+        } // dRB_QoS
+        /* 12.1.2.2 sNSSAI */
         {
-          flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
-          flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
-          flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
-        } // nGRANallocationRetentionPriority
+          /* sST */
+
+          OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
+
+          /* OPTIONAL */
+          /* sD */
+          if (0) {
+            asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
+            OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
+            strlen("asdsa1d32sa1d31asd31as"));
+          }
+        }
 
         /* OPTIONAL */
-        /* gBR_QoS_Flow_Information */
+        /* 12.1.2.3 notificationControl */
         if (0) {
-          asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
-          asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
-          asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
-          asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
-          asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+          asn1cCallocOne(DRB_Information->notificationControl,
+              F1AP_NotificationControl_active); // enum
+        }
+
+        /* 12.1.2.4 flows_Mapped_To_DRB_List */  // BK: need verifiy
+
+        for (int k = 0; k < 1; k ++) {
+          asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
+                         F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
+          /* qoSFlowIndicator */
+          flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
+          /* qoSFlowLevelQoSParameters */
+          {
+            /* qoS_Characteristics */
+            {
+              int some_decide_qoS_characteristics = 0; // BK: Need Check
+              F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
+
+              if (some_decide_qoS_characteristics) {
+                QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
+                setQos(QosParams->choice.non_Dynamic_5QI);
+              } else {
+                QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
+                asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
+                /* qoSPriorityLevel */
+                tmp->qoSPriorityLevel = 1L;
+                /* packetDelayBudget */
+                tmp->packetDelayBudget = 1L;
+                /* packetErrorRate */
+                tmp->packetErrorRate.pER_Scalar = 1L;
+                tmp->packetErrorRate.pER_Exponent = 6L;
+
+                /* OPTIONAL */
+                /* delayCritical */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
+                  *tmp = 1L;
+                }
+
+                /* OPTIONAL */
+                /* averagingWindow */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
+                  *tmp = 1L;
+                }
+
+                /* OPTIONAL */
+                /* maxDataBurstVolume */
+                if (0) {
+                  asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
+                  *tmp= 1L;
+                }
+              } // if some_decide_qoS_characteristics
+
+            } // qoS_Characteristics
+            /* nGRANallocationRetentionPriority */
+            {
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
+              flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
+            } // nGRANallocationRetentionPriority
 
             /* OPTIONAL */
-            /* maxPacketLossRateDownlink */
+            /* gBR_QoS_Flow_Information */
             if (0) {
-              asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+              asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
+              asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
+              asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
+              asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
+              asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
+
+              /* OPTIONAL */
+              /* maxPacketLossRateDownlink */
+              if (0) {
+                asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
+              }
+
+              /* OPTIONAL */
+              /* maxPacketLossRateUplink */
+              if (0) {
+                asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+              }
             }
 
             /* OPTIONAL */
-            /* maxPacketLossRateUplink */
+            /* reflective_QoS_Attribute */
             if (0) {
-              asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
+              asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
             }
-          }
-
-          /* OPTIONAL */
-          /* reflective_QoS_Attribute */
-          if (0) {
-            asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
-          }
-        } // qoSFlowLevelQoSParameters
-      }
+          } // qoSFlowLevelQoSParameters
+        }
 
-  } //QoS information
+      } //QoS information
 
-  /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
-  for (int j = 0; j < f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
-    /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
-    transport_layer_addr_t addr;
-    int sz=sizeof(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
-    memcpy(addr.buffer,&f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
-    addr.length = sz*8;
+      /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
+      for (int j = 0; j < f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
+        /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
+        transport_layer_addr_t addr;
+        int sz=sizeof(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
+        memcpy(addr.buffer,&f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
+        addr.length = sz*8;
 
-    f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
-    newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
+        f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
+            newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
               f1ap_ue_context_modification_req->rnti,
               f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
               f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id,
@@ -1499,138 +1499,138 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
               addr,
               f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
               cu_f1u_data_req);
-      /*  12.3.1 ULTunnels_ToBeSetup_Item */
-      asn1cSequenceAdd(drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
+        /*  12.3.1 ULTunnels_ToBeSetup_Item */
+        asn1cSequenceAdd(drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
                        F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
-      uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+        uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
                    gTPTunnel);
-      /* 12.3.1.1.1 transportLayerAddress */
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
+        /* 12.3.1.1.1 transportLayerAddress */
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
                           &gTPTunnel->transportLayerAddress);
-      /* 12.3.1.1.2 gTP_TEID */
-      INT32_TO_OCTET_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
+        /* 12.3.1.1.2 gTP_TEID */
+        INT32_TO_OCTET_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
                 &gTPTunnel->gTP_TEID);
-    }
-    /* 12.1.4 rLCMode */
-    /* TODO use rlc_mode from f1ap_drb_to_be_setup */
-    switch (f1ap_ue_context_modification_req->drbs_to_be_setup[i].rlc_mode) {
-      case RLC_MODE_AM:
-        drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_am;
-        break;
-
-      default:
-        drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
-    }
+      }
+      /* 12.1.4 rLCMode */
+      /* TODO use rlc_mode from f1ap_drb_to_be_setup */
+      switch (f1ap_ue_context_modification_req->drbs_to_be_setup[i].rlc_mode) {
+        case RLC_MODE_AM:
+          drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_am;
+          break;
+
+        default:
+          drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
+      }
 
-    /* OPTIONAL */
-    /* 12.1.5 ULConfiguration */
-    if (0) {
-      asn1cCalloc(drbs_toBeSetupMod_item->uLConfiguration, tmp);
-      tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
-    }
+      /* OPTIONAL */
+      /* 12.1.5 ULConfiguration */
+      if (0) {
+        asn1cCalloc(drbs_toBeSetupMod_item->uLConfiguration, tmp);
+        tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
+      }
 
-    /* OPTIONAL */
-    /* 12.1.6 duplicationActivation */
-    if (0) {
-      asn1cCalloc(drbs_toBeSetupMod_item->duplicationActivation, tmp);
-      *tmp = F1AP_DuplicationActivation_active;  // enum
+      /* OPTIONAL */
+      /* 12.1.6 duplicationActivation */
+      if (0) {
+        asn1cCalloc(drbs_toBeSetupMod_item->duplicationActivation, tmp);
+        *tmp = F1AP_DuplicationActivation_active;  // enum
+      }
     }
   }
-  }
 
   /* optional */
   if(0){
-  /* c13. DRBs_ToBeModified_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13);
-  ie13->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List;
-  ie13->criticality                    = F1AP_Criticality_reject;
-  ie13->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
+    /* c13. DRBs_ToBeModified_List */
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13);
+    ie13->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List;
+    ie13->criticality                    = F1AP_Criticality_reject;
+    ie13->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
 
-  for (int i=0;   i<1; i++) {
-    //
-    asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list,
+    for (int i=0;   i<1; i++) {
+      //
+      asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list,
                       F1AP_DRBs_ToBeModified_ItemIEs_t, drbs_toBeModified_item_ies);
-    drbs_toBeModified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item;
-    drbs_toBeModified_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
-    /* 13.1 SRBs_ToBeModified_Item */
-    F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item=
-      &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item;
-    /* dRBID */
-    drbs_toBeModified_item->dRBID = 30L;
-    /* qoSInformation */
-    asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp);
-    tmp->present = F1AP_QoSInformation_PR_eUTRANQoS;
-    tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
-    tmp->choice.eUTRANQoS->qCI = 254L;
-    /* ULTunnels_ToBeModified_List */
-    int maxnoofULTunnels = 1; // 2;
-
-    for (int j=0; j<maxnoofULTunnels; j++) {
-      /*  ULTunnels_ToBeModified_Item */
-      asn1cSequenceAdd(drbs_toBeModified_item->uLUPTNLInformation_ToBeSetup_List.list,
+      drbs_toBeModified_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item;
+      drbs_toBeModified_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
+      /* 13.1 SRBs_ToBeModified_Item */
+      F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item=
+          &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item;
+      /* dRBID */
+      drbs_toBeModified_item->dRBID = 30L;
+      /* qoSInformation */
+      asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp);
+      tmp->present = F1AP_QoSInformation_PR_eUTRANQoS;
+      tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
+      tmp->choice.eUTRANQoS->qCI = 254L;
+      /* ULTunnels_ToBeModified_List */
+      int maxnoofULTunnels = 1; // 2;
+
+      for (int j=0; j<maxnoofULTunnels; j++) {
+        /*  ULTunnels_ToBeModified_Item */
+        asn1cSequenceAdd(drbs_toBeModified_item->uLUPTNLInformation_ToBeSetup_List.list,
                        F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
-      uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
-      asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
+        uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
+        asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
                   gTPTunnel);
-      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
-      OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
+        OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
                            strlen("1204"));
-    }
+      }
 
-    /* OPTIONAL */
-    /* ULConfiguration */
-    if (0) {
-      drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+      /* OPTIONAL */
+      /* ULConfiguration */
+      if (0) {
+        drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
+      }
     }
   }
-  }
 
   /* optional */
   if(0){
-  /* c14. SRBs_ToBeReleased_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14);
-  ie14->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List;
-  ie14->criticality                    = F1AP_Criticality_reject;
-  ie14->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List;
+    /* c14. SRBs_ToBeReleased_List */
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14);
+    ie14->id                             = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List;
+    ie14->criticality                    = F1AP_Criticality_reject;
+    ie14->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List;
 
-  for (int i=0;  i<1; i++) {
-    //
-    asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list,
+    for (int i=0;  i<1; i++) {
+      //
+      asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list,
                      F1AP_SRBs_ToBeReleased_ItemIEs_t, srbs_toBeReleased_item_ies);
-    srbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item;
-    srbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_ignore;
-    srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item;
-    /* 9.1 SRBs_ToBeReleased_Item */
-    F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item=
-      &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item;
-    /* - sRBID */
-    srbs_toBeReleased_item->sRBID = 2L;
-  }
+      srbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item;
+      srbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_ignore;
+      srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item;
+      /* 9.1 SRBs_ToBeReleased_Item */
+      F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item=
+          &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item;
+      /* - sRBID */
+      srbs_toBeReleased_item->sRBID = 2L;
+    }
   }
 
   /* optional */
   if(0){
-  /* c15. DRBs_ToBeReleased_List */
-  asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15);
-  ie15->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List;
-  ie15->criticality                    = F1AP_Criticality_reject;
-  ie15->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
+    /* c15. DRBs_ToBeReleased_List */
+    asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15);
+    ie15->id                             = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List;
+    ie15->criticality                    = F1AP_Criticality_reject;
+    ie15->value.present                  = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
 
-  for (int i=0; i<1;  i++) {
-    //
-    asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list,
+    for (int i=0; i<1;  i++) {
+      //
+      asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list,
                      F1AP_DRBs_ToBeReleased_ItemIEs_t, drbs_toBeReleased_item_ies);
-    drbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
-    drbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_reject;
-    drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
-    /* 14.1 SRBs_ToBeReleased_Item */
-    F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item=
-      &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item;
-    /* dRBID */
-    drbs_toBeReleased_item->dRBID = 30L;
-  }
+      drbs_toBeReleased_item_ies->id            = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
+      drbs_toBeReleased_item_ies->criticality   = F1AP_Criticality_reject;
+      drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
+      /* 14.1 SRBs_ToBeReleased_Item */
+      F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item=
+          &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item;
+      /* dRBID */
+      drbs_toBeReleased_item->dRBID = 30L;
+    }
   }
 
   /* encode */
diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c
index f779637d7eb..cbbe5632852 100644
--- a/openair2/F1AP/f1ap_du_ue_context_management.c
+++ b/openair2/F1AP/f1ap_du_ue_context_management.c
@@ -907,8 +907,157 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t       instance,
     uint32_t         assoc_id,
     uint32_t         stream,
     F1AP_F1AP_PDU_t *pdu) {
-  AssertFatal(1==0,"Not implemented yet\n");
+
+  MessageDef                      *msg_p; // message to RRC
+  F1AP_UEContextModificationRequest_t    *container;
+  int i;
+  DevAssert(pdu);
+  msg_p = itti_alloc_new_message(TASK_DU_F1, 0,  F1AP_UE_CONTEXT_MODIFICATION_REQ);
+  f1ap_ue_context_setup_t *f1ap_ue_context_modification_req = &F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p);
+  container = &pdu->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+
+  /* mandatory */
+  /* GNB_CU_UE_F1AP_ID */
+  F1AP_UEContextModificationRequestIEs_t *ieCU;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieCU, container,
+      F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
+  f1ap_ue_context_modification_req->gNB_CU_ue_id = ieCU->value.choice.GNB_CU_UE_F1AP_ID;
+
+  /* mandatory */
+  /* GNB_DU_UE_F1AP_ID */
+  F1AP_UEContextSetupRequestIEs_t *ieDU_UE;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieDU_UE, container,
+      F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
+  f1ap_ue_context_modification_req->gNB_DU_ue_id = ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID;
+  f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id);
+
+  if(f1ap_ue_context_modification_req->rnti<0)
+      LOG_E(F1AP, "Could not retrieve UE rnti based on the DU UE id \n");
+  else
+      LOG_I(F1AP, "Retrieved rnti is: %d \n", f1ap_ue_context_modification_req->rnti);
+
+  /* SRB */
+  F1AP_UEContextModificationRequestIEs_t *ieSrb;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieSrb, container,
+      F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List, false);
+
+  if(ieSrb != NULL) {
+    f1ap_ue_context_modification_req->srbs_to_be_setup_length = ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.count;
+    f1ap_ue_context_modification_req->srbs_to_be_setup = calloc(f1ap_ue_context_modification_req->srbs_to_be_setup_length,
+        sizeof(f1ap_srb_to_be_setup_t));
+    AssertFatal(f1ap_ue_context_modification_req->srbs_to_be_setup,
+        "could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup\n");
+
+    for (i = 0; i < f1ap_ue_context_modification_req->srbs_to_be_setup_length; ++i) {
+      f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_req->srbs_to_be_setup[i];
+      F1AP_SRBs_ToBeSetupMod_Item_t *srbs_tobesetupmod_item_p;
+      srbs_tobesetupmod_item_p = &((F1AP_SRBs_ToBeSetupMod_ItemIEs_t *)ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.array[i])->value.choice.SRBs_ToBeSetupMod_Item;
+      srb_p->srb_id = srbs_tobesetupmod_item_p->sRBID;
+    }
+  }
+
+  /* DRB */
+  F1AP_UEContextModificationRequestIEs_t *ieDrb;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDrb, container,
+                   F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List, false);
+
+  if(ieDrb!=NULL) {
+    f1ap_ue_context_modification_req->drbs_to_be_setup_length = ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.count;
+    f1ap_ue_context_modification_req->drbs_to_be_setup = calloc(f1ap_ue_context_modification_req->drbs_to_be_setup_length,
+                               sizeof(f1ap_drb_to_be_setup_t));
+    AssertFatal(f1ap_ue_context_modification_req->drbs_to_be_setup,
+          "could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n");
+
+    for (i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; ++i) {
+      f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_req->drbs_to_be_setup[i];
+      F1AP_DRBs_ToBeSetup_Item_t *drbs_tobesetup_item_p =
+          &((F1AP_DRBs_ToBeSetup_ItemIEs_t *)ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.array[i])->value.choice.DRBs_ToBeSetup_Item;
+      drb_p->drb_id = drbs_tobesetup_item_p->dRBID;
+      /* TODO in the following, assume only one UP UL TNL is present.
+       * this matches/assumes OAI CU implementation, can be up to 2! */
+      drb_p->up_ul_tnl_length = 1;
+      AssertFatal(drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0,
+          "no UL UP TNL Information in DRBs to be Setup list\n");
+      F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0];
+      F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel;
+      BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address);
+      OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].teid);
+
+      switch (drbs_tobesetup_item_p->rLCMode) {
+      case F1AP_RLCMode_rlc_am:
+        drb_p->rlc_mode = RLC_MODE_AM;
+        break;
+
+      default:
+        drb_p->rlc_mode = RLC_MODE_TM;
+        break;
+      }
+      if (!(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU)) {
+        transport_layer_addr_t addr;
+          memcpy(addr.buffer, &drb_p->up_ul_tnl[0].tl_address, sizeof(drb_p->up_ul_tnl[0].tl_address));
+          addr.length=sizeof(drb_p->up_ul_tnl[0].tl_address)*8;
+          drb_p->up_dl_tnl[0].teid=newGtpuCreateTunnel(INSTANCE_DEFAULT,
+                               f1ap_ue_context_modification_req->rnti,
+                               drb_p->drb_id,
+                               drb_p->drb_id,
+                               drb_p->up_ul_tnl[0].teid,
+                               addr,
+                               2152,
+                               lteDURecvCb);
+          drb_p->up_dl_tnl_length++;
+      }
+    }
+  }
+  /* RRC Reconfiguration Complete indicator */
+  F1AP_UEContextModificationRequestIEs_t *ieReconf;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieReconf, container,
+      F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator, false);
+
+  if(ieReconf) {
+    switch(ieReconf->value.choice.RRCReconfigurationCompleteIndicator){
+    case F1AP_RRCReconfigurationCompleteIndicator_true:
+      f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_success;
+      break;
+
+    case F1AP_RRCReconfigurationCompleteIndicator_failure:
+      f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_failure;
+      break;
+    }
+  }
+
+  /* RRCContainer */
+  F1AP_UEContextModificationRequestIEs_t *ieRRC;
+  F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieRRC, container,
+      F1AP_ProtocolIE_ID_id_RRCContainer, false);
+
+  if (ieRRC) {
+    /* correct here */
+    if ( ieRRC->value.choice.RRCContainer.size )  {
+      f1ap_ue_context_modification_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size);
+      memcpy(f1ap_ue_context_modification_req->rrc_container,
+          ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+      // AssertFatal(0, "check configuration, send to appropriate handler\n");
+      protocol_ctxt_t ctxt;
+      // decode RRC Container and act on the message type
+      //FIXME
+      //rnti_t rnti      = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
+      ctxt.instance = instance;
+      ctxt.instance  = instance;
+      ctxt.enb_flag  = 1;
+      mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__);
+      memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
+      du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p);
+    } else {
+      LOG_E(F1AP, " RRCContainer in UEContextSetupRequestIEs size id 0\n");
+    }
+  } else {
+    LOG_W(F1AP, "can't find RRCContainer in UEContextSetupRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
+  }
+
+  itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
+  return 0;
 }
+
 //void DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(F1AP_UEContextModificationResponse_t *UEContextModificationResponse) {
 int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
   F1AP_F1AP_PDU_t                        pdu= {0};
diff --git a/openair2/F1AP/f1ap_handlers.c b/openair2/F1AP/f1ap_handlers.c
index fec03bb0b90..6bbf1c796d5 100644
--- a/openair2/F1AP/f1ap_handlers.c
+++ b/openair2/F1AP/f1ap_handlers.c
@@ -50,7 +50,7 @@ f1ap_message_processing_t f1ap_messages_processing[][3] = {
   { DU_handle_gNB_CU_CONFIGURATION_UPDATE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE }, /* gNBCUConfigurationUpdate */
   { DU_handle_UE_CONTEXT_SETUP_REQUEST, CU_handle_UE_CONTEXT_SETUP_RESPONSE, 0 }, /* UEContextSetup */
   { DU_handle_UE_CONTEXT_RELEASE_COMMAND, CU_handle_UE_CONTEXT_RELEASE_COMPLETE, 0 }, /* UEContextRelease */
-  { 0, 0, 0 }, /* UEContextModification */
+  { DU_handle_UE_CONTEXT_MODIFICATION_REQUEST, 0, 0 }, /* UEContextModification */
   { 0, 0, 0 }, /* UEContextModificationRequired */
   { 0, 0, 0 }, /* UEMobilityCommand */
   { CU_handle_UE_CONTEXT_RELEASE_REQUEST, 0, 0 }, /* UEContextReleaseRequest */
-- 
GitLab