From 460acd840dd58fd46a995219cb9da8fda103668e Mon Sep 17 00:00:00 2001
From: laurent <laurent Thomas>
Date: Tue, 5 Jul 2022 21:19:13 +0200
Subject: [PATCH] build, run in F1 mode until UE connect but pdu session still
 fails

---
 cmake_targets/build_oai                      |  2 +-
 common/ngran_types.h                         |  6 ++-
 openair2/ENB_APP/flexran_agent_ran_api.c     |  4 ++
 openair2/F1AP/f1ap_cu_interface_management.c |  4 +-
 openair2/F1AP/f1ap_cu_task.c                 |  4 +-
 openair2/GNB_APP/gnb_app.c                   | 53 ++++++++++----------
 openair2/GNB_APP/gnb_config.c                | 11 ++--
 openair2/LAYER2/RLC/rlc.c                    |  2 +-
 openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c      |  2 +-
 openair2/LAYER2/rlc_v2/rlc_oai_api.c         |  2 +-
 openair2/RRC/LTE/rrc_eNB.c                   |  1 +
 openair2/RRC/LTE/rrc_eNB_S1AP.c              |  4 +-
 openair2/RRC/NR/nr_rrc_defs.h                |  1 -
 openair2/RRC/NR/rrc_gNB.c                    | 52 +++++++++++++++++++
 openair2/RRC/NR/rrc_gNB_NGAP.c               | 19 +++----
 openair2/RRC/NR/rrc_gNB_NGAP.h               |  2 +-
 openair3/NGAP/ngap_gNB_handlers.c            |  9 +++-
 17 files changed, 124 insertions(+), 54 deletions(-)

diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 379c9b5cfb6..2b214e4619f 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -616,7 +616,7 @@ function main() {
   if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
   CMAKE_CMD="$CMAKE_CMD -DNOAVX512=\"${NOAVX512[*]}\""
   echo_info "running $CMAKE_CMD"
-  eval $CMAKE_CMD
+  eval $CMAKE_CMD ../../..
   
   for f in $execlist ; do
       echo_info "Compiling $f..."
diff --git a/common/ngran_types.h b/common/ngran_types.h
index 3dfa7aa01af..d61e3c50bd6 100644
--- a/common/ngran_types.h
+++ b/common/ngran_types.h
@@ -42,11 +42,13 @@ typedef enum {
   ngran_gNB_CU    = 5,
   ngran_eNB_DU    = 6,
   ngran_gNB_DU    = 7,
-  ngran_eNB_MBMS_STA  = 8
+  ngran_eNB_MBMS_STA  = 8,
+  ngran_gNB_CUCP,
+  ngran_gNB_CUUP
 } ngran_node_t;
 
 #define NODE_IS_MONOLITHIC(nOdE_TyPe) ((nOdE_TyPe) == ngran_eNB    || (nOdE_TyPe) == ngran_ng_eNB    || (nOdE_TyPe) == ngran_gNB)
-#define NODE_IS_CU(nOdE_TyPe)         ((nOdE_TyPe) == ngran_eNB_CU || (nOdE_TyPe) == ngran_ng_eNB_CU || (nOdE_TyPe) == ngran_gNB_CU)
+#define NODE_IS_CU(nOdE_TyPe)         ((nOdE_TyPe) == ngran_eNB_CU || (nOdE_TyPe) == ngran_ng_eNB_CU || (nOdE_TyPe) == ngran_gNB_CU || (nOdE_TyPe) == ngran_gNB_CUCP ||(nOdE_TyPe) == ngran_gNB_CUUP )
 #define NODE_IS_DU(nOdE_TyPe)         ((nOdE_TyPe) == ngran_eNB_DU || (nOdE_TyPe) == ngran_gNB_DU)
 #define NODE_IS_MBMS(nOdE_TyPe)       ((nOdE_TyPe) == ngran_eNB_MBMS_STA)
 
diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c
index 3113c077981..7825d7faea2 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.c
+++ b/openair2/ENB_APP/flexran_agent_ran_api.c
@@ -3677,6 +3677,8 @@ size_t flexran_get_capabilities(mid_t mod_id, Protocol__FlexBsCapability **caps)
     case ngran_eNB_CU:
     case ngran_ng_eNB_CU:
     case ngran_gNB_CU:
+    case ngran_gNB_CUCP:
+    case ngran_gNB_CUUP:
       n_caps = 4;
       *caps = calloc(n_caps, sizeof(Protocol__FlexBsCapability));
       AssertFatal(*caps, "could not allocate %zu bytes for Protocol__FlexBsCapability array\n",
@@ -3730,6 +3732,8 @@ uint32_t flexran_get_capabilities_mask(mid_t mod_id) {
     case ngran_eNB_CU:
     case ngran_ng_eNB_CU:
     case ngran_gNB_CU:
+    case ngran_gNB_CUCP:
+    case ngran_gNB_CUUP:
       mask = (1 << PROTOCOL__FLEX_BS_CAPABILITY__PDCP)
            | (1 << PROTOCOL__FLEX_BS_CAPABILITY__SDAP)
            | (1 << PROTOCOL__FLEX_BS_CAPABILITY__RRC)
diff --git a/openair2/F1AP/f1ap_cu_interface_management.c b/openair2/F1AP/f1ap_cu_interface_management.c
index fdd5f3ea3e7..a7874e3f4ff 100644
--- a/openair2/F1AP/f1ap_cu_interface_management.c
+++ b/openair2/F1AP/f1ap_cu_interface_management.c
@@ -144,7 +144,9 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
     
     // LTS: FIXME data model failure: we don't KNOW if we receive a 4G or a 5G cell
     // Furthermore, cell_type is not a attribute of a cell in the data structure !!!!!!!!!!
-    if (RC.nrrrc && RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CU)
+    if (RC.nrrrc &&
+        ( RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CU ||
+          RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CUCP) )
       f1ap_req(true, instance)->cell_type=CELL_MACRO_GNB;
     else
       f1ap_req(true, instance)->cell_type=CELL_MACRO_ENB;
diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c
index b521d0c83dc..df48d7ba428 100644
--- a/openair2/F1AP/f1ap_cu_task.c
+++ b/openair2/F1AP/f1ap_cu_task.c
@@ -121,7 +121,9 @@ void *F1AP_CU_task(void *arg) {
   eth_params_t *IPaddrs;
 
   // Hardcoded instance id!
-  if (RC.nrrrc && RC.nrrrc[0]->node_type == ngran_gNB_CU)
+  if (RC.nrrrc &&
+      (RC.nrrrc[0]->node_type == ngran_gNB_CU ||
+       RC.nrrrc[0]->node_type == ngran_gNB_CUCP ) )
     IPaddrs=&RC.nrrrc[0]->eth_params_s;
   else
     IPaddrs=&RC.rrc[0]->eth_params_s;
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index e49a4f4f557..d504e912919 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -196,40 +196,41 @@ void *gNB_app_task(void *args_p)
   }
   
   if (RC.nb_nr_inst > 0) {
+    
     if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
-
       if (itti_create_task(TASK_CU_F1, F1AP_CU_task, NULL) < 0) {
-          LOG_E(F1AP, "Create task for F1AP CU failed\n");
-          AssertFatal(1==0,"exiting");
+        LOG_E(F1AP, "Create task for F1AP CU failed\n");
+        AssertFatal(1==0,"exiting");
+      }
+    }
+    
+    if (RC.nrrrc[0]->node_type == ngran_gNB_CUCP) {
+      
+      if (itti_create_task(TASK_CUCP_E1, E1AP_CUCP_task, NULL) < 0) {
+        LOG_E(E1AP, "Create task for E1AP CP failed\n");
+        AssertFatal(1==0, "exiting");
       }
-
-      if (RC.nrrrc[0]->cu_type == CPtype) {
-        if (itti_create_task(TASK_CUCP_E1, E1AP_CUCP_task, NULL) < 0) {
-          LOG_E(E1AP, "Create task for E1AP CP failed\n");
-          AssertFatal(1==0, "exiting");
-        }
         // To initialize SCTP listener
-        msg_p = itti_alloc_new_message(TASK_GNB_APP, 0, E1AP_SETUP_REQ);
-        RCconfig_NR_CU_E1(msg_p, 0);
-
-        itti_send_msg_to_task(TASK_CUCP_E1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
-      } else if (RC.nrrrc[0]->cu_type == UPtype) {
-        if (itti_create_task(TASK_CUUP_E1, E1AP_CUUP_task, NULL) < 0) {
-          LOG_E(E1AP, "Create task for E1AP UP failed\n");
-          AssertFatal(1==0, "exiting");
-        }
-        // configure E1AP here
-        LOG_I(GNB_APP, "ngran_gNB_CU: Allocating ITTI message for E1AP_SETUP_REQ\n");
-        msg_p = itti_alloc_new_message(TASK_GNB_APP, 0, E1AP_SETUP_REQ);
-        RCconfig_NR_CU_E1(msg_p, 0);
-
-        itti_send_msg_to_task(TASK_CUUP_E1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
+      msg_p = itti_alloc_new_message(TASK_GNB_APP, 0, E1AP_SETUP_REQ);
+      RCconfig_NR_CU_E1(msg_p, 0);
+      
+      itti_send_msg_to_task(TASK_CUCP_E1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
+      
+    } else if (RC.nrrrc[0]->node_type == ngran_gNB_CUUP) {
+      if (itti_create_task(TASK_CUUP_E1, E1AP_CUUP_task, NULL) < 0) {
+        LOG_E(E1AP, "Create task for E1AP UP failed\n");
+        AssertFatal(1==0, "exiting");
       }
-
+      // configure E1AP here
+      LOG_I(GNB_APP, "ngran_gNB_CU: Allocating ITTI message for E1AP_SETUP_REQ\n");
+      msg_p = itti_alloc_new_message(TASK_GNB_APP, 0, E1AP_SETUP_REQ);
+      RCconfig_NR_CU_E1(msg_p, 0);
+      
+      itti_send_msg_to_task(TASK_CUUP_E1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
     }
 
     if (NODE_IS_DU(RC.nrrrc[0]->node_type)) {
-
+      
       if (itti_create_task(TASK_DU_F1, F1AP_DU_task, NULL) < 0) {
         LOG_E(F1AP, "Create task for F1AP DU failed\n");
         AssertFatal(1==0,"exiting");
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 4d5b2ad6566..5bf81a7fc3c 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -1171,7 +1171,6 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
     }
 
     rrc->node_type = node_type;
-    rrc->cu_type = cu_type;
 
     rrc->nr_cellid        = (uint64_t)*(GNBParamList.paramarray[i][GNB_NRCELLID_IDX].u64ptr);
 
@@ -2319,10 +2318,9 @@ static ngran_node_t get_node_type(void)
 
   config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);   
   config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL);  
+  config_getlist( &GNBE1ParamList, GNBE1Params, sizeof(GNBE1Params)/sizeof(paramdef_t), aprefix);
   char aprefix[MAX_OPTNAME_SIZE*2 + 8];
   sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, 0);
-  config_getlist( &GNBE1ParamList, GNBE1Params, sizeof(GNBE1Params)/sizeof(paramdef_t), aprefix);
-
   if ( MacRLC_ParamList.numelt > 0) {
     RC.nb_nr_macrlc_inst = MacRLC_ParamList.numelt; 
     for (int j = 0; j < RC.nb_nr_macrlc_inst; j++) {
@@ -2333,7 +2331,12 @@ static ngran_node_t get_node_type(void)
   }
 
   if ((strcmp(*(GNBParamList.paramarray[0][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr), "f1") == 0) &&
-      (strcmp(*(GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_CU_TYPE_IDX].strptr), "cu") == 0))
+      (strcmp(*(GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_CU_TYPE_IDX].strptr), "cp") == 0))
+    return ngran_gNB_CUCP;
+  else if ((strcmp(*(GNBParamList.paramarray[0][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr), "f1") == 0) &&
+           (strcmp(*(GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_CU_TYPE_IDX].strptr), "up") == 0))
+    return ngran_gNB_CUUP;
+  else if (strcmp(*(GNBParamList.paramarray[0][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr), "f1") == 0)
     return ngran_gNB_CU;
   else if (macrlc_has_f1 == 0)
     return ngran_gNB;
diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c
index ec90817500d..1e2266adb17 100644
--- a/openair2/LAYER2/RLC/rlc.c
+++ b/openair2/LAYER2/RLC/rlc.c
@@ -590,7 +590,7 @@ void rlc_data_ind     (
     T(T_ENB_RLC_UL, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->rnti), T_INT(rb_idP), T_INT(sdu_sizeP));
 #endif
     const ngran_node_t type = RC.rrc[ctxt_pP->module_id]->node_type;
-    AssertFatal(type != ngran_eNB_CU && type != ngran_ng_eNB_CU && type != ngran_gNB_CU,
+    AssertFatal(!NODE_IS_CU(type),
                 "Can't be CU, bad node type %d\n", type);
 
     if (NODE_IS_DU(type) && srb_flagP == 1) {
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 6ac5c93f2a6..71b7c3b3c45 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -514,7 +514,7 @@ rb_found:
       T_INT(ue->rnti), T_INT(rb_id), T_INT(size));
 
     const ngran_node_t type = RC.nrrrc[0 /*ctxt_pP->module_id*/]->node_type;
-    AssertFatal(type != ngran_eNB_CU && type != ngran_ng_eNB_CU && type != ngran_gNB_CU,
+    AssertFatal(!NODE_IS_CU(type),
                 "Can't be CU, bad node type %d\n", type);
 
     // if (NODE_IS_DU(type) && is_srb == 0) {
diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
index 11ae770e3ec..914484c1b61 100644
--- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c
+++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
@@ -415,7 +415,7 @@ rb_found:
       T_INT(ue->rnti), T_INT(rb_id), T_INT(size));
 
     const ngran_node_t type = RC.rrc[0 /*ctxt_pP->module_id*/]->node_type;
-    AssertFatal(type != ngran_eNB_CU && type != ngran_ng_eNB_CU && type != ngran_gNB_CU,
+    AssertFatal(!NODE_IS_CU(type),
                 "Can't be CU, bad node type %d\n", type);
 
     if (NODE_IS_DU(type)) {
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index 8be30175e11..e9b225d30d5 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -6610,6 +6610,7 @@ rrc_eNB_generate_RRCConnectionSetup(
     case ngran_eNB_CU    :
     case ngran_ng_eNB_CU :
     case ngran_gNB_CU    :
+    case ngran_gNB_CUCP  :
       // create an ITTI message
       /* TODO: F1 IDs ar missing in RRC */
       message_p = itti_alloc_new_message (TASK_RRC_ENB, 0, F1AP_DL_RRC_MESSAGE);
diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c
index aefbc018315..7154b34962e 100644
--- a/openair2/RRC/LTE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c
@@ -1004,9 +1004,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char
     }
 
     
-    if ((RC.rrc[ctxt.module_id]->node_type == ngran_eNB_CU) ||
-	(RC.rrc[ctxt.module_id]->node_type == ngran_ng_eNB_CU) ||
-	(RC.rrc[ctxt.module_id]->node_type == ngran_gNB_CU) ){
+    if (NODE_IS_CU(RC.rrc[ctxt.module_id]->node_type)) {
       struct eNB_RRC_INST_s *rrc= RC.rrc[0];
       MessageDef *message_p = itti_alloc_new_message (TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_SETUP_REQ);
       f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p);
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index c8b0bdd2e1e..e9d9766f41b 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -476,7 +476,6 @@ typedef struct nr_mac_rrc_dl_if_s {
 typedef struct gNB_RRC_INST_s {
 
   ngran_node_t                                        node_type;
-  int                                                 cu_type;
   uint32_t                                            node_id;
   char                                               *node_name;
   int                                                 module_id;
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 6687fb06b37..bee2c39935d 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -369,10 +369,54 @@ rrc_gNB_generate_RRCSetup(
               ue_p->Srb0.Tx_buffer.payload_size,
               "[MSG] RRC Setup\n");
 
+<<<<<<< HEAD
   // activate release timer, if RRCSetupComplete not received after 100 frames, remove UE
   ue_context_pP->ue_context.ue_release_timer = 1;
   // remove UE after 10 frames after RRCConnectionRelease is triggered
   ue_context_pP->ue_context.ue_release_timer_thres = 1000;
+=======
+  switch (rrc->node_type) {
+    case ngran_gNB_CU:
+      // create an ITTI message
+      /* TODO: F1 IDs ar missing in RRC */
+      nr_rrc_pdcp_config_asn1_req(ctxt_pP,
+				  ue_context_pP->ue_context.SRB_configList,
+				  NULL,
+				  NULL,
+				  0,
+				  NULL,
+				  NULL,
+				  NULL,
+				  NULL,
+				  NULL,
+				  NULL,
+				  NULL);
+      message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_DL_RRC_MESSAGE);
+      F1AP_DL_RRC_MESSAGE (message_p).rrc_container        =  (uint8_t *)ue_p->Srb0.Tx_buffer.Payload;
+      F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = ue_p->Srb0.Tx_buffer.payload_size;
+      F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id         = 0;
+      F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id         = 0;
+      F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id     = 0xFFFFFFFF; // unknown
+      F1AP_DL_RRC_MESSAGE (message_p).rnti                 = ue_p->rnti;
+      F1AP_DL_RRC_MESSAGE (message_p).srb_id               = CCCH;
+      F1AP_DL_RRC_MESSAGE (message_p).execute_duplication  = 1;
+      F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0;
+      itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p);
+      LOG_D(NR_RRC, "Send F1AP_DL_RRC_MESSAGE with ITTI\n");
+
+    break;
+
+  case ngran_gNB_DU:
+  case ngran_gNB_CUCP:
+  case ngran_gNB_CUUP:
+      // nothing to do for DU
+      AssertFatal(1==0,"nothing to do for DU\n");
+      break;
+
+    case ngran_gNB:
+    {
+      // rrc_mac_config_req_gNB
+>>>>>>> build, run in F1 mode until UE connect but pdu session still fails
 
   /* TODO: this should go through the E1 interface */
   apply_pdcp_config(ue_context_pP,ctxt_pP);
@@ -473,6 +517,7 @@ rrc_gNB_generate_RRCReject(
 
   switch (RC.nrrrc[ctxt_pP->module_id]->node_type) {
     case ngran_gNB_CU:
+    case ngran_gNB_CUCP:
       // create an ITTI message
       message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_DL_RRC_MESSAGE);
       F1AP_DL_RRC_MESSAGE (message_p).rrc_container        = (uint8_t *)ue_p->Srb0.Tx_buffer.Payload;
@@ -489,6 +534,7 @@ rrc_gNB_generate_RRCReject(
       break;
 
     case ngran_gNB_DU:
+    case ngran_gNB_CUUP:
       // nothing to do for DU
       AssertFatal(1==0,"nothing to do for DU\n");
       break;
@@ -686,6 +732,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
           ue_context_pP->ue_context.rnti);
   switch (RC.nrrrc[ctxt_pP->module_id]->node_type) {
     case ngran_gNB_CU:
+    case ngran_gNB_CUCP:
       nr_rrc_data_req(ctxt_pP,
                   DCCH,
                   rrc_gNB_mui++,
@@ -698,6 +745,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
       break;
 
     case ngran_gNB_DU:
+    case ngran_gNB_CUUP:
       // nothing to do for DU
       AssertFatal(1==0,"nothing to do for DU\n");
       break;
@@ -4101,6 +4149,7 @@ rrc_gNB_generate_SecurityModeCommand(
 
   switch (RC.nrrrc[ctxt_pP->module_id]->node_type) {
     case ngran_gNB_CU:
+    case ngran_gNB_CUCP:
       // create an ITTI message
       memcpy(ue_context_pP->ue_context.Srb1.Srb_info.Tx_buffer.Payload, buffer, size);
       ue_context_pP->ue_context.Srb1.Srb_info.Tx_buffer.payload_size = size;
@@ -4116,6 +4165,7 @@ rrc_gNB_generate_SecurityModeCommand(
       break;
 
     case ngran_gNB_DU:
+    case ngran_gNB_CUUP:
       // nothing to do for DU
       AssertFatal(1==0,"nothing to do for DU\n");
       break;
@@ -4164,6 +4214,7 @@ rrc_gNB_generate_UECapabilityEnquiry(
         size);
   switch (RC.nrrrc[ctxt_pP->module_id]->node_type) {
     case ngran_gNB_CU:
+    case ngran_gNB_CUCP:
       nr_rrc_data_req(
         ctxt_pP,
         DCCH,
@@ -4175,6 +4226,7 @@ rrc_gNB_generate_UECapabilityEnquiry(
       break;
 
     case ngran_gNB_DU:
+    case ngran_gNB_CUUP:
       // nothing to do for DU
       AssertFatal(1==0,"nothing to do for DU\n");
       break;
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index 3c4e2dc269c..329da1e272f 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -554,7 +554,7 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
           &ctxt,
           &create_tunnel_resp,
           &inde_list[0]);
-        ue_context_p->ue_context.setup_pdu_sessions += nb_pdusessions_tosetup;
+        ue_context_p->ue_context.setup_pdu_sessions +=  NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions;
         ue_context_p->ue_context.established_pdu_sessions_flag = 1;
       }
 
@@ -807,6 +807,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
         */
        switch (RC.nrrrc[ctxt.module_id]->node_type) {
         case ngran_gNB_CU:
+        case ngran_gNB_CUCP:          
           /* Transfer data to PDCP */
           nr_rrc_data_req (
               &ctxt,
@@ -948,7 +949,7 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(
 }
 
 //------------------------------------------------------------------------------
-int
+void
 rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
   MessageDef *msg_p,
   const char *msg_name,
@@ -975,7 +976,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
   LOG_I(NR_RRC, "[gNB %ld] Received %s: ue_initial_id %d, gNB_ue_ngap_id %u \n",
     instance, msg_name, ue_initial_id, gNB_ue_ngap_id);
 
-  if (RC.nrrrc[ctxt.module_id]->cu_type == CPtype) { // E1 split CU-CP node
+  if (RC.nrrrc[ctxt.module_id]->node_type == ngran_gNB_CUCP) { // E1 split CU-CP node
     /* Configurations are referred from rrc_gNB_generate_dedicatedRRCReconfiguration() and
        rrc_gNB_process_RRCReconfigurationComplete()
 
@@ -1048,7 +1049,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
       NGAP_PDUSESSION_SETUP_REQ(msg_fail_p).gNB_ue_ngap_id = gNB_ue_ngap_id;
       // TODO add failure cause when defined!
       itti_send_msg_to_task (TASK_NGAP, instance, msg_fail_p);
-      return (-1);
+      return ;
     } else {
       memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t));
       uint8_t nb_pdusessions_tosetup = NGAP_PDUSESSION_SETUP_REQ(msg_p).nb_pdusessions_tosetup;
@@ -1098,7 +1099,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
         ue_context_p->ue_context.ul_failure_timer = 20000; // set ul_failure to 20000 for triggering rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ
         // rrc_gNB_free_UE(ctxt.module_id,ue_context_p);
         ue_context_p->ue_context.ul_failure_timer = 0;
-        return (0);
+        return ;
       }
       nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
         &ctxt,
@@ -1109,14 +1110,14 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
       // TEST 
       // ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
       // rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
-      rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p);
-      return(0);
+      rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, NULL);
+      return;
     }
     nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
       &ctxt,
       &create_tunnel_resp,
       &inde_list[0]);
-    ue_context_p->ue_context.setup_pdu_sessions += nb_pdusessions_tosetup;
+    ue_context_p->ue_context.setup_pdu_sessions += NGAP_PDUSESSION_SETUP_REQ(msg_p).nb_pdusessions_tosetup;
 
     // TEST 
     // ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
@@ -1161,7 +1162,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
 
       itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p);
     }
-    return(0);
+    return;
   }
 }
 
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.h b/openair2/RRC/NR/rrc_gNB_NGAP.h
index 5833c8aac21..0cde3ff38c1 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.h
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.h
@@ -101,7 +101,7 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(
   uint8_t                   xid
 );
 
-int
+void
 rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
     MessageDef *msg_p,
     const char *msg_name,
diff --git a/openair3/NGAP/ngap_gNB_handlers.c b/openair3/NGAP/ngap_gNB_handlers.c
index ebe86afe2a7..43a2a1ed573 100644
--- a/openair3/NGAP/ngap_gNB_handlers.c
+++ b/openair3/NGAP/ngap_gNB_handlers.c
@@ -1347,8 +1347,13 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t         assoc_id,
       NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].pdusession_id = item_p->pDUSessionID;
 
       // S-NSSAI
-      OCTET_STRING_TO_INT32(&item_p->s_NSSAI.sST, NGAP_PDUSESSION_SETUP_REQ(message_p).allowed_nssai[i].sST);
-      OCTET_STRING_TO_INT32(item_p->s_NSSAI.sD, *NGAP_PDUSESSION_SETUP_REQ(message_p).allowed_nssai[i].sD);
+      OCTET_STRING_TO_INT8(&item_p->s_NSSAI.sST, NGAP_PDUSESSION_SETUP_REQ(message_p).allowed_nssai[i].sST);
+      if(item_p->s_NSSAI.sD != NULL) {
+        NGAP_PDUSESSION_SETUP_REQ(message_p).allowed_nssai[i].sD_flag = 1;
+        NGAP_PDUSESSION_SETUP_REQ(message_p).allowed_nssai[i].sD[0] = item_p->s_NSSAI.sD->buf[0];
+        NGAP_PDUSESSION_SETUP_REQ(message_p).allowed_nssai[i].sD[1] = item_p->s_NSSAI.sD->buf[1];
+        NGAP_PDUSESSION_SETUP_REQ(message_p).allowed_nssai[i].sD[2] = item_p->s_NSSAI.sD->buf[2];
+      }
 
       // check for the NAS PDU
       if (item_p->pDUSessionNAS_PDU->size > 0 ) {
-- 
GitLab