From 47d3c9f718c1a19a650e9465f42946acd8549bcd Mon Sep 17 00:00:00 2001
From: yankuo <you@example.com>
Date: Thu, 1 Feb 2024 15:09:29 +0800
Subject: [PATCH] add OXGRF support

---
 CMakeLists.txt                                |    2 +-
 cmake_targets/build_oai                       |    8 +-
 cmake_targets/tools/build_helper              |   28 +
 executables/lte-softmodem.h                   |    2 +
 executables/lte-uesoftmodem.c                 |    3 +
 executables/nr-softmodem-common.h             |    2 +
 executables/nr-uesoftmodem.c                  |    2 +
 executables/nr-uesoftmodem.h                  |    1 +
 openair1/PHY/impl_defs_top.h                  |    1 +
 radio/CMakeLists.txt                          |    5 +
 radio/COMMON/common_lib.c                     |    2 +-
 radio/COMMON/common_lib.h                     |    2 +
 radio/OXGRF/CMakeLists.txt                    |    9 +
 radio/OXGRF/oxgrf_lib.c                       |  847 ++++
 radio/OXGRF/oxgrf_lib.h                       |   97 +
 radio/OXGRF/rf_helper.h                       |   56 +
 .../CONF/enb.band7.tm1.100PRB.oxgrf.conf      |  223 ++
 .../CONF/enb.band7.tm1.50PRB.oxgrf.conf       |  309 ++
 .../CONF/gnb.band78.tm1.106PRB.oxgrf.conf     |  263 ++
 .../gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf   |  269 ++
 .../CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf  |  268 ++
 .../gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf   |  270 ++
 .../CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf  |  271 ++
 xdma.patch                                    | 3500 +++++++++++++++++
 24 files changed, 6436 insertions(+), 4 deletions(-)
 create mode 100644 radio/OXGRF/CMakeLists.txt
 create mode 100644 radio/OXGRF/oxgrf_lib.c
 create mode 100644 radio/OXGRF/oxgrf_lib.h
 create mode 100644 radio/OXGRF/rf_helper.h
 create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf
 create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf
 create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf
 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf
 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf
 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf
 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf
 create mode 100755 xdma.patch

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 27a7c471d5..a92869dc32 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2359,7 +2359,7 @@ if (${T_TRACER})
         nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
         #all "add_library" definitions
         ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap
-        params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer
+        params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer oai_oxgrfdevif
         oai_eth_transpro oai_mobipass coding HASHTABLE UTIL OMG_SUMO
         SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
         NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 8de83f473d..9df20b292b 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -93,7 +93,7 @@ Options:
 --UE-gen-nvram [output path]
    Specify gen_nvram_path (default \"$gen_nvram_path\")
 -w | --hardware
-   USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, None (Default)
+   USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, OXGRF, None (Default)
    Adds this RF board support (in external packages installation and in compilation)
 -t | --transport
    Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g
@@ -272,7 +272,7 @@ function main() {
             shift;;
        -w | --hardware)
             case "$2" in
-                "USRP" | "BLADERF" | "LMSSDR" | "IRIS")
+                "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "OXGRF")
                     HW="OAI_"$2
                     TARGET_LIST="$TARGET_LIST oai_${2,,}devif" # ,, makes lowercase
                     CMAKE_CMD="$CMAKE_CMD -DOAI_$2=ON"
@@ -457,6 +457,10 @@ function main() {
         flash_firmware_bladerf
       fi
     fi
+    if [ "$HW" == "OAI_OXGRF" ] ; then
+      echo_info "installing packages for OXGRF support"
+      #check_install_oxgrf_driver
+    fi
     if [ "$HW" == "OAI_IRIS" ] ; then
       echo_info "installing packages for IRIS support"
       check_install_soapy
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index c0b2fa237b..413d3135c0 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -400,6 +400,34 @@ install_usrp_uhd_driver() {
     fi
 }
 
+check_install_oxgrf_driver() {
+#if modinfo riffa > /dev/null 2>&1
+    if modinfo xdma > /dev/null 2>&1
+    then
+      echo_success "OXGRF driver has loaded."
+    else
+      git clone https://github.com/v3best/riffa /tmp/riffa
+      if [ $? -ne 0 ]; then
+        echo_fatal "OXGRF driver download failed, please check your net connection."
+      else
+        cd /tmp/riffa/driver/linux
+        make && $SUDO make install
+        echo_success "OXGRF driver install success, please restart your PC later."
+      fi
+      git clone https://github.com/v3best/liboxgrf /tmp/liboxgrf
+      if [ $? -ne 0 ]; then
+        echo_fatal "OXGRF API download failed, please check your net connection."
+      else
+        cd /tmp/liboxgrf
+        mkdir build
+        cd build
+        cmake ../
+        make && $SUDO make install && $SUDO ldconfig
+        echo_success "OXGRF API install success, please restart your PC later."
+      fi
+    fi
+}
+
 install_bladerf_driver_from_source(){
     bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt
     echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log "
diff --git a/executables/lte-softmodem.h b/executables/lte-softmodem.h
index 4143bce3a4..cc44e6a199 100644
--- a/executables/lte-softmodem.h
+++ b/executables/lte-softmodem.h
@@ -73,6 +73,7 @@
 #define CONFIG_HLP_PRB           "Set the PRB, valid values: 6, 25, 50, 100  \n"
 #define CONFIG_HLP_DLSHIFT       "dynamic shift for LLR compuation for TM3/4 (default 0)\n"
 #define CONFIG_HLP_USRP_ARGS     "set the arguments to identify USRP (same syntax as in UHD)\n"
+#define CONFIG_HLP_OXGRF_ARGS   "set the arguments to identify OXGRF\n"
 #define CONFIG_HLP_DMAMAP        "use DMA memory mapping\n"
 #define CONFIG_HLP_TDD           "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n"
 #define CONFIG_HLP_TADV          "Set timing_advance\n"
@@ -104,6 +105,7 @@
     {"r"  ,               CONFIG_HLP_PRB,         0,               .u8ptr=&(frame_parms[0]->N_RB_DL),   .defintval=25,         TYPE_UINT8,    0},   \
     {"dlsch-demod-shift", CONFIG_HLP_DLSHIFT,     0,               .iptr=(int32_t *)&dlsch_demod_shift, .defintval=0,          TYPE_INT,      0},   \
     {"usrp-args",         CONFIG_HLP_USRP_ARGS,   0,               .strptr=&usrp_args,         .defstrval="type=b200",TYPE_STRING,   0},   \
+    {"oxgrf-args",       CONFIG_HLP_OXGRF_ARGS, 0,               .strptr=&oxgrf_args,       .defstrval="dev=pciex:0",TYPE_STRING,   0},   \
     {"mmapped-dma",       CONFIG_HLP_DMAMAP,      PARAMFLAG_BOOL,  .uptr=&mmapped_dma,                  .defintval=0,          TYPE_INT,      0},   \
     {"T" ,                CONFIG_HLP_TDD,         PARAMFLAG_BOOL,  .iptr=&tddflag,                      .defintval=0,          TYPE_INT,      0},   \
     {"A",                 CONFIG_HLP_TADV,        0,               .iptr=&(timingadv),                  .defintval=0,          TYPE_INT,      0},   \
diff --git a/executables/lte-uesoftmodem.c b/executables/lte-uesoftmodem.c
index c7e8c9300a..3431645108 100644
--- a/executables/lte-uesoftmodem.c
+++ b/executables/lte-uesoftmodem.c
@@ -159,6 +159,8 @@ int transmission_mode=1;
 char *usrp_args=NULL;
 char *usrp_clksrc=NULL;
 
+char *oxgrf_args=NULL;
+
 THREAD_STRUCT thread_struct;
 /* struct for ethernet specific parameters given in eNB conf file */
 eth_params_t *eth_params;
@@ -470,6 +472,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
     }
 
     if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;
+    if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args;
   }
 }
 
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index 2550001956..4352af4b38 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -103,6 +103,8 @@
 #define CONFIG_HLP_TX_SUBDEV     "set the arguments to select tx_subdev (same syntax as in UHD)\n"
 #define CONFIG_HLP_RX_SUBDEV     "set the arguments to select rx_subdev (same syntax as in UHD)\n"
 
+#define CONFIG_HLP_OXGRF_ARGS   "set the arguments to identify OXGRF\n"
+
 #define CONFIG_HLP_FLOG          "Enable online log \n"
 #define CONFIG_HLP_LOGL          "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n"
 #define CONFIG_HLP_LOGV          "Set the global log verbosity \n"
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index c970b1d09d..95d8cdbf5a 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -120,6 +120,7 @@ int                 vcdflag = 0;
 
 double          rx_gain_off = 0.0;
 char             *usrp_args = NULL;
+char           *oxgrf_args = NULL;
 char             *tx_subdev = NULL;
 char             *rx_subdev = NULL;
 char       *rrc_config_path = NULL;
@@ -363,6 +364,7 @@ void init_openair0(void) {
     openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
 
     if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;
+    if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args;
     if (tx_subdev) openair0_cfg[card].tx_subdev = tx_subdev;
     if (rx_subdev) openair0_cfg[card].rx_subdev = rx_subdev;
 
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index 3549a7fae1..1e9554113d 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -31,6 +31,7 @@
 // clang-format off
 #define CMDLINE_NRUEPARAMS_DESC {  \
   {"usrp-args",                CONFIG_HLP_USRP_ARGS,           0,               .strptr=&usrp_args,                       .defstrval="type=b200",          TYPE_STRING,   0}, \
+  {"oxgrf-args",              CONFIG_HLP_OXGRF_ARGS,         0,               .strptr=&oxgrf_args,                     .defstrval="dev=pciex:0",        TYPE_STRING,   0}, \
   {"tx_subdev",                CONFIG_HLP_TX_SUBDEV,           0,               .strptr=&tx_subdev,                       .defstrval=NULL,                 TYPE_STRING,   0}, \
   {"rx_subdev",                CONFIG_HLP_RX_SUBDEV,           0,               .strptr=&rx_subdev,                       .defstrval=NULL,                 TYPE_STRING,   0}, \
   {"single-thread-disable",    CONFIG_HLP_NOSNGLT,             PARAMFLAG_BOOL,  .iptr=&single_thread_flag,                .defintval=1,                    TYPE_INT,      0}, \
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index 5c461b27b0..1110242552 100644
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -43,6 +43,7 @@
  * @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface
  * @defgroup _USRP_PHY_RF_INTERFACE_    PHY - USRP RF Interface
  * @defgroup _BLADERF_PHY_RF_INTERFACE_    PHY - BLADERF RF Interface
+ * @defgroup _OXGRF_PHY_RF_INTERFACE_    PHY - OXGRF RF Interface
  * @defgroup _LMSSDR_PHY_RF_INTERFACE_    PHY - LMSSDR RF Interface
  * @}
  * @}
diff --git a/radio/CMakeLists.txt b/radio/CMakeLists.txt
index 937d8039f9..6708ad5511 100644
--- a/radio/CMakeLists.txt
+++ b/radio/CMakeLists.txt
@@ -32,3 +32,8 @@ add_boolean_option(OAI_USRP OFF "Activate OAI's USRP driver" OFF)
 if(OAI_USRP)
   add_subdirectory(USRP)
 endif()
+
+add_boolean_option(OAI_OXGRF OFF "Activate OAI's OXGRF driver" OFF)
+if(OAI_OXGRF)
+  add_subdirectory(OXGRF)
+endif()
diff --git a/radio/COMMON/common_lib.c b/radio/COMMON/common_lib.c
index 4d78018d8c..d9bdc31a00 100644
--- a/radio/COMMON/common_lib.c
+++ b/radio/COMMON/common_lib.c
@@ -44,7 +44,7 @@
 #include "executables/softmodem-common.h"
 
 const char *const devtype_names[MAX_RF_DEV_TYPE] =
-    {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"};
+    {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "OXGRF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"};
 
 const char *get_devname(int devtype) {
   if (devtype < MAX_RF_DEV_TYPE && devtype !=MIN_RF_DEV_TYPE )
diff --git a/radio/COMMON/common_lib.h b/radio/COMMON/common_lib.h
index d735fab4f0..6d45d730af 100644
--- a/radio/COMMON/common_lib.h
+++ b/radio/COMMON/common_lib.h
@@ -93,6 +93,8 @@ typedef enum {
   USRP_X400_DEV,
   /*!\brief device is BLADE RF*/
   BLADERF_DEV,
+  /*!\brief device is OXGRF pcie*/
+  OXGRF_DEV,
   /*!\brief device is LMSSDR (SoDeRa)*/
   LMSSDR_DEV,
   /*!\brief device is Iris */
diff --git a/radio/OXGRF/CMakeLists.txt b/radio/OXGRF/CMakeLists.txt
new file mode 100644
index 0000000000..cec23b9c04
--- /dev/null
+++ b/radio/OXGRF/CMakeLists.txt
@@ -0,0 +1,9 @@
+find_library(oxgrf_ss NAMES oxgrf_ss)
+
+add_library(oai_oxgrfdevif MODULE oxgrf_lib.c)
+target_link_libraries(oai_oxgrfdevif PRIVATE oxgrf_ss)
+target_link_libraries(oai_oxgrfdevif PRIVATE UTIL)
+set_target_properties(oai_oxgrfdevif PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+add_custom_command(TARGET oai_oxgrfdevif POST_BUILD
+                   COMMAND ${CMAKE_COMMAND} -E create_symlink liboai_oxgrfdevif.so liboai_device.so
+                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/radio/OXGRF/oxgrf_lib.c b/radio/OXGRF/oxgrf_lib.c
new file mode 100644
index 0000000000..d19d759e84
--- /dev/null
+++ b/radio/OXGRF/oxgrf_lib.c
@@ -0,0 +1,847 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/** oxgrf_lib.c
+ *
+ * Author: eric
+ * base on bladerf_lib.c
+ */
+
+#pragma GCC optimize(3, "Ofast", "inline")
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <string.h>
+#include <inttypes.h>
+#include <math.h>
+#include "oxgrf_lib.h"
+#include "rf_helper.h"
+#include "common/utils/LOG/log.h"
+
+/** @addtogroup _OXGRF_PHY_RF_INTERFACE_
+ * @{
+ */
+#include "openair1/PHY/sse_intrin.h"
+
+//! Number of OXGRF devices
+int num_devices = 0;
+static bool running = false;
+
+#define BUFFER_SIZE    (122880 * 100 * sizeof(int))
+#define NCHAN_PER_DEV  4
+static void *cache_buf[NCHAN_PER_DEV];
+static void *iq_buf[NCHAN_PER_DEV];
+static uint32_t remain = 0;
+static uint32_t RX_MTU = 30720;
+static uint8_t shift = 2;
+
+static inline int channel_to_mask(int channel_count)
+{
+    uint8_t ch_mask;
+    switch (channel_count) {
+    case 4:
+        ch_mask = 0xf;break;
+    case 3:
+        ch_mask = 0x7;break;
+    case 2:
+        ch_mask = 0x3;break;
+    case 1:
+        ch_mask = 0x1;break;
+    default:
+        ch_mask = 0x1;break;
+    }
+
+    return ch_mask;
+}
+
+/*! \brief get current timestamp
+ *\param device the hardware to use
+ *\returns timestamp of OXGRF
+ */
+
+openair0_timestamp trx_get_timestamp(openair0_device *device) {
+    return 0;
+}
+
+/*! \brief Start oxgrf
+ * \param device the hardware to use
+ * \returns 0 on success
+ */
+int trx_oxgrf_start(openair0_device *device) {
+
+    LOG_I(HW, "[oxgrf] Start oxgrf ...\n");
+    running = true;
+
+    return 0;
+}
+
+/*! \brief Called to send samples to the oxgrf RF target
+  \param device pointer to the device structure specific to the RF hardware target
+  \param timestamp The timestamp at whicch the first sample MUST be sent
+  \param buff Buffer which holds the samples
+  \param nsamps number of samples to be sent
+  \param cc index of the component carrier
+  \param flags Ignored for the moment
+  \returns 0 on success
+  */
+static int trx_oxgrf_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
+
+    int status;
+    oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv;
+
+    uint32_t trx_flags = 0;
+    radio_tx_burst_flag_t flags_burst = (radio_tx_burst_flag_t) (flags & 0xf);
+
+    if (flags_burst == TX_BURST_START) {
+        trx_flags = 0;
+    } else if (flags_burst == TX_BURST_END) {
+        trx_flags = 1;
+    } else if (flags_burst == TX_BURST_START_AND_END) {
+        trx_flags = 1;
+    } else if (flags_burst == TX_BURST_MIDDLE) {
+        trx_flags = 0;
+    }
+
+    for(int i = 0; i < cc; i++) {
+        int len = nsamps * 2;
+        int16_t *iq = buff[i];
+#if defined(__x86_64) || defined(__i386__)
+        __m256i a, *b;
+
+        while (len >= 16) {
+            a = *(__m256i *)&iq[0];
+            b = (__m256i *)&iq[0];
+            *b = simde_mm256_slli_epi16(a, 4);
+            iq += 16;
+            len -= 16;
+        }
+#elif defined(__arm__) || defined(__aarch64__)
+        int16x8_t a, *b;
+
+        while (len >= 8) {
+            a = *(int16x8_t *)&iq[0];
+            b = (int16x8_t *)&iq[0];
+            *b = vshlq_n_s16(a, 4);
+            iq += 8;
+            len -= 8;
+        }
+#endif
+        /* remaining data */
+        while (len != 0) {
+            iq[0] <<= 4;
+            iq++;
+            len--;
+        }
+    }
+
+    status = oxgrf_write_samples_multiport(oxgrf->dev, (const void **)buff, nsamps, channel_to_mask(cc), timestamp, trx_flags);
+    if (status < 0) {
+        oxgrf->num_tx_errors++;
+        LOG_E(HW, "[oxgrf] Failed to TX samples\n");
+        exit(-1);
+    }
+
+    //LOG_D(HW, "Provided TX timestamp: %u, nsamps: %u\n", ptimestamp, nsamps);
+
+    oxgrf->tx_current_ts = timestamp;
+    oxgrf->tx_nsamps += nsamps;
+    oxgrf->tx_count++;
+
+    return nsamps;
+}
+
+/*! \brief Receive samples from hardware.
+ * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
+ * the first channel. *ptimestamp is the time at which the first sample
+ * was received.
+ * \param device the hardware to use
+ * \param[out] ptimestamp the time at which the first sample was received.
+ * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
+ * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
+ * \param cc  Index of component carrier
+ * \returns number of samples read
+ */
+static int trx_oxgrf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
+
+    int status;
+    oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv;
+    uint64_t timestamp = 0UL;
+
+retry:
+    if(remain == 0) {
+        int recv = 0;
+        timestamp = 0UL;
+        if(nsamps % RX_MTU) {
+            recv = (nsamps / RX_MTU + 1) * RX_MTU;
+            status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), &timestamp);
+            if (status < 0) {
+                LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps);
+                oxgrf->num_rx_errors++;
+                exit(-1);
+            }
+            for(int i = 0; i < cc; i++)
+                memcpy(buff[i], iq_buf[i], nsamps * 4);
+            if(recv > nsamps) {
+                for(int i = 0; i < cc; i++)
+                    memcpy(cache_buf[i], iq_buf[i] + nsamps * 4, (recv - nsamps) * 4);
+                remain = recv - nsamps;
+            }
+        } else {
+            recv = nsamps;
+            status = oxgrf_read_samples_multiport(oxgrf->dev, buff, recv, channel_to_mask(cc), &timestamp);
+            if (status < 0) {
+                LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps);
+                oxgrf->num_rx_errors++;
+                exit(-1);
+            }
+        }
+
+        *(uint64_t *)ptimestamp = timestamp;
+        oxgrf->rx_current_ts = timestamp + nsamps;
+        //LOG_D(HW, "case 0: Current RX timestamp  %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n",  *ptimestamp, timestamp, nsamps, remain, recv);
+    } else if(remain >= nsamps) {
+        for(int i = 0; i < cc; i++)
+            memcpy(buff[i], cache_buf[i], nsamps * 4);
+        remain -= nsamps;
+        if(remain > 0) {
+            for(int i = 0; i < cc; i++)
+                memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4);
+        }
+        *(uint64_t *)ptimestamp = oxgrf->rx_current_ts;
+        oxgrf->rx_current_ts += nsamps;
+        //LOG_D(HW, "case 1: Current RX timestamp  %"PRIu64", nsamps %u, remain %u\n",  *ptimestamp, nsamps, remain);
+    } else {
+        int recv;
+        if(remain + RX_MTU >= nsamps)
+            recv = RX_MTU;
+        else
+            recv = (nsamps / RX_MTU + 1) * RX_MTU;
+        timestamp = 0UL;
+        status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), &timestamp);
+        if (status < 0) {
+            LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps);
+            oxgrf->num_rx_errors++;
+            exit(-1);
+        }
+        if(timestamp != (oxgrf->rx_current_ts + remain)) {
+            int overflow = timestamp - (oxgrf->rx_current_ts + remain);
+            LOG_W(HW, "Rx overflow %u samples\n", overflow);
+            //remain += overflow;
+            remain = 0;
+            goto retry;
+        }
+        for(int i = 0; i < cc; i++)
+            memcpy(cache_buf[i] + remain * 4, iq_buf[i], recv * 4);
+        for(int i = 0; i < cc; i++)
+            memcpy(buff[i], cache_buf[i], nsamps * 4);
+        remain = recv + remain - nsamps;
+        for(int i = 0; i < cc; i++)
+            memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4);
+
+        *(uint64_t *)ptimestamp = oxgrf->rx_current_ts;
+        oxgrf->rx_current_ts += nsamps;
+        //LOG_D(HW, "case 2: Current RX timestamp  %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n",  *ptimestamp, timestamp, nsamps, remain, recv);
+    }
+
+    for(int i = 0; i < cc; i++) {
+        int len = nsamps * 2;
+        int16_t *iq = buff[i];
+#if defined(__x86_64__) || defined(__i386__)
+        __m256i a, *b;
+
+        while (len >= 16) {
+            a = *(__m256i *)&iq[0];
+            b = (__m256i *)&iq[0];
+            *b = simde_mm256_srai_epi16(a, shift);
+            iq += 16;
+            len -= 16;
+        }
+#elif defined(__arm__) || defined(__aarch64__)
+        int16x8_t a, *b;
+
+        while (len >= 8) {
+            a = *(int16x8_t *)&iq[0];
+            b = (int16x8_t *)&iq[0];
+            *b = vshrq_n_s16(a, shift);
+            iq += 8;
+            len -= 8;
+        }
+#endif
+        /* remaining data */
+        while (len != 0) {
+            iq[0] >>= shift;
+            iq++;
+            len--;
+        }
+    }
+    //LOG_D(HW, "Current RX timestamp  %"PRIu64", nsamps %u\n",  *ptimestamp, nsamps);
+    oxgrf->rx_nsamps += nsamps;
+    oxgrf->rx_count++;
+
+    return nsamps;
+
+}
+
+/*! \brief Terminate operation of the oxgrf transceiver -- free all associated resources
+ * \param device the hardware to use
+ */
+void trx_oxgrf_end(openair0_device *device) {
+
+    oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv;
+
+    if(!running)
+        return;
+    running = false;
+
+    LOG_I(HW, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
+    for(int i = 0; i < oxgrf->tx_num_channels; i++) {
+        uint32_t count = 0;
+        oxgrf_get_channel_event(oxgrf->dev, TX_CHANNEL_TIMEOUT, i+1, &count);
+        LOG_I(HW, "[oxgrf] TX%d Channel timeout: %u\n", i+1, count);
+    }
+    for(int i = 0; i < oxgrf->rx_num_channels; i++) {
+        uint32_t count = 0;
+        oxgrf_get_channel_event(oxgrf->dev, RX_CHANNEL_OVERFLOW, i+1, &count);
+        LOG_I(HW, "[oxgrf] RX%d Channel overflow: %u\n", i+1, count);
+    }
+    LOG_I(HW, "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
+
+    oxgrf_close_device(oxgrf->dev);
+
+    return;
+}
+
+/*! \brief print the oxgrf statistics 
+ * \param device the hardware to use
+ * \returns  0 on success
+ */
+int trx_oxgrf_get_stats(openair0_device* device) {
+    return(0);
+}
+
+/*! \brief Reset the oxgrf statistics 
+ * \param device the hardware to use
+ * \returns  0 on success
+ */
+int trx_oxgrf_reset_stats(openair0_device* device) {
+    return(0);
+
+}
+
+/*! \brief Stop oxgrf
+ * \param card the hardware to use
+ * \returns 0 in success 
+ */
+int trx_oxgrf_stop(openair0_device* device) {
+    return(0);
+}
+
+/*! \brief Set frequencies (TX/RX)
+ * \param device the hardware to use
+ * \param openair0_cfg RF frontend parameters set by application
+ * \param dummy dummy variable not used
+ * \returns 0 in success
+ */
+int trx_oxgrf_set_freq(openair0_device* device, openair0_config_t *openair0_cfg) {
+
+    int status;
+    oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv;
+
+    if(oxgrf->tx_lo_freq != openair0_cfg->tx_freq[0]) {
+        if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->tx_freq[0]))) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set TX frequency\n");
+        } else {
+            LOG_I(HW, "[oxgrf] set TX frequency to %lu\n",(uint64_t)(openair0_cfg->tx_freq[0]));
+            oxgrf->tx_lo_freq = openair0_cfg->tx_freq[0];
+        }
+    }
+
+    if(oxgrf->rx_lo_freq != openair0_cfg->rx_freq[0]) {
+        if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set RX frequency\n");
+        } else {
+            LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0]));
+            oxgrf->rx_lo_freq = openair0_cfg->rx_freq[0];
+        }
+    }
+
+    return(0);
+
+}
+
+/*! \brief calibration table for OXGRF */
+rx_gain_calib_table_t calib_table_oxgrf[] = {
+    {3500000000.0, 72.0},
+    {2660000000.0, 72.0},
+    {2300000000.0, 72.0},
+    {1880000000.0, 72.0},
+    {816000000.0,  72.0},
+    {-1,0}
+};
+
+/*! \brief set RX gain offset from calibration table
+ * \param openair0_cfg RF frontend parameters set by application
+ * \param chain_index RF chain ID
+ */
+void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
+
+    int i = 0;
+    // loop through calibration table to find best adjustment factor for RX frequency
+    double min_diff = 6e9, diff;
+
+    while (openair0_cfg->rx_gain_calib_table[i].freq > 0) {
+        diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq);
+        printf("cal %d: freq %f, offset %f, diff %f\n",
+                i,
+                openair0_cfg->rx_gain_calib_table[i].freq,
+                openair0_cfg->rx_gain_calib_table[i].offset, diff);
+        if (min_diff > diff) {
+            min_diff = diff;
+            openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset;
+        }
+        i++;
+    }
+}
+
+/*! \brief Set Gains (TX/RX)
+ * \param device the hardware to use
+ * \param openair0_cfg openair0 Config structure
+ * \returns 0 in success
+ */
+int trx_oxgrf_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) {
+
+    int ret = 0;
+    oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv;
+
+    if (openair0_cfg->rx_gain[0] > 65+openair0_cfg->rx_gain_offset[0]) {
+        LOG_E(HW, "[oxgrf] Reduce RX Gain 0 by %f dB\n", openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0] - 65);
+        return -1;
+    }
+
+    if ((ret = oxgrf_set_rx1_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0]))) < 0) {
+        LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n");
+    } else
+        LOG_I(HW, "[oxgrf] set RX1 gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[0]));
+
+    if(oxgrf->rx_num_channels > 1) {
+        if ((ret = oxgrf_set_rx2_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[1] - openair0_cfg->rx_gain_offset[0]))) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[1]));
+    }
+#if 0
+    if ((ret = oxgrf_set_tx1_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[0] * 1000)) < 0) {
+        LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n");
+    } else
+        LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]);
+
+    if(oxgrf->tx_num_channels > 1) {
+        if ((ret = oxgrf_set_tx2_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[1] * 1000)) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n");
+        } else
+            LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]);
+    }
+#endif
+    return(ret);
+}
+
+/*! \brief Initialize Openair oxgrf target. It returns 0 if OK
+ * \param device the hardware to use
+ * \param openair0_cfg RF frontend parameters set by application
+ * \returns 0 on success
+ */
+int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
+
+    int status;
+
+    oxgrf_state_t *oxgrf = (oxgrf_state_t*)malloc(sizeof(oxgrf_state_t));
+    memset(oxgrf, 0, sizeof(oxgrf_state_t));
+
+    LOG_I(HW, "[oxgrf] openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs);
+    LOG_I(HW, "[oxgrf] openair0_cfg[0].rx_num_channels == '%d'\n", openair0_cfg[0].rx_num_channels);
+    LOG_I(HW, "[oxgrf] openair0_cfg[0].tx_num_channels == '%d'\n", openair0_cfg[0].tx_num_channels);
+
+    openair0_cfg[0].rx_gain_calib_table = calib_table_oxgrf;
+    set_rx_gain_offset(openair0_cfg, 0);
+    if(oxgrf->rx_num_channels > 1)
+        set_rx_gain_offset(openair0_cfg, 1);
+    openair0_cfg->iq_txshift = 0;
+    openair0_cfg->iq_rxrescale = 15; /*not sure*/ //FIXME: adjust to oxgrf
+    oxgrf->sample_rate = (unsigned int)openair0_cfg->sample_rate;
+    LOG_I(HW, "[oxgrf] sampling_rate %d\n", oxgrf->sample_rate);
+    oxgrf->rx_num_channels = openair0_cfg[0].rx_num_channels;
+    oxgrf->tx_num_channels = openair0_cfg[0].tx_num_channels;
+
+    RX_MTU = openair0_cfg->sample_rate / 1000 / 2;
+    if(RX_MTU > 30720)
+        RX_MTU = 30720;
+    else if(!(RX_MTU % 5760))
+        RX_MTU = 5760;
+
+    bool rx_ant = true;
+    bool pa_status = false;
+    int auxdac1 = 0;
+    char args[64];
+    if (openair0_cfg[0].sdr_addrs == NULL) {
+        strcpy(args, "dev=pciex:0");
+    } else {
+        strcpy(args, openair0_cfg[0].sdr_addrs);
+    }
+
+    char dev_str[64];
+    const char dev_arg[] = "dev=";
+    char *dev_ptr = strstr(args, dev_arg);
+    if(dev_ptr) {
+        copy_subdev_string(dev_str, dev_ptr + strlen(dev_arg));
+        remove_substring(args, dev_arg);
+        remove_substring(args, dev_str);
+        LOG_I(HW, "[oxgrf] Using %s\n", dev_str);
+    }
+
+    const char auxdac1_arg[] = "auxdac1=";
+    char auxdac1_str[64] = {0};
+    char *auxdac1_ptr = strstr(args, auxdac1_arg);
+    if(auxdac1_ptr) {
+        copy_subdev_string(auxdac1_str, auxdac1_ptr + strlen(auxdac1_arg));
+        remove_substring(args, auxdac1_arg);
+        remove_substring(args, auxdac1_str);
+        auxdac1 = atoi(auxdac1_str);
+        LOG_I(HW, "[oxgrf] Setting auxdac1:%u\n", auxdac1);
+    }
+
+    const char pa_arg[] = "pa=";
+    char pa_str[64] = {0};
+    char *pa_ptr = strstr(args, pa_arg);
+    if(pa_ptr) {
+        copy_subdev_string(pa_str, pa_ptr + strlen(pa_arg));
+        remove_substring(args, pa_arg);
+        remove_substring(args, pa_str);
+        pa_status = !strcmp(pa_str, "enabled");
+        LOG_I(HW, "[oxgrf] PA Status:%s\n", pa_status?"Enabled":"Disabled");
+    }
+
+    const char ant_arg[] = "rx_ant=";
+    char ant_str[64] = {0};
+    char *ant_ptr = strstr(args, ant_arg);
+    if(ant_ptr) {
+        copy_subdev_string(ant_str, ant_ptr + strlen(ant_arg));
+        remove_substring(args, ant_arg);
+        remove_substring(args, ant_str);
+        rx_ant = strcmp(ant_str, "trx");
+    }
+
+    char dstring[128];
+    if(RX_MTU < 30720) {
+        sprintf(dstring, ",nsamples_recv_frame:%u", RX_MTU);
+        strcat(dev_str, dstring);
+    }
+    if ((oxgrf->dev = oxgrf_open_device(dev_str)) == NULL ) {
+        LOG_E(HW, "[oxgrf] Failed to open oxgrf\n");
+        free(oxgrf);
+        return -1;
+    }
+
+    uint32_t model = 0;
+    oxgrf_get_model_version(oxgrf->dev, &model);
+    model &= 0xffff;
+    if(model == 550) {
+        oxgrf->BoardType = Y550;
+        shift = 4;
+        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
+    } else if(model == 230) {
+        oxgrf->BoardType = Y230;
+        shift = 4;
+        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
+    } else if(model == 380) {
+        oxgrf->BoardType = Y380;
+        shift = 4;
+        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
+    } else if(model == 590) {
+        oxgrf->BoardType = Y590;
+        shift = 2;
+        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
+    } else if(model == 7400) {
+        oxgrf->BoardType = IQX7400;
+        shift = 2;
+        LOG_I(HW, "[oxgrf] device type: IQX%d\n", model);
+    } else if(model == 7402) {
+        oxgrf->BoardType = IQX7402;
+        shift = 2;
+        LOG_I(HW, "[oxgrf] device type: IQX%d(Split Mode)\n", model - 2);
+    } else if(model == 6000 || model == 7000 || model == 7100) {
+        oxgrf->BoardType = IQX7000;
+        shift = 4;
+        LOG_I(HW, "[oxgrf] device type: IQX%d\n", model);
+    } else {
+        oxgrf->BoardType = UNKNOWN;
+        LOG_I(HW, "[oxgrf] device type: unknown\n");
+    }
+
+    if(oxgrf->BoardType == Y230) {
+        switch ((int)openair0_cfg->sample_rate) {
+#if 0
+        case 61440000:
+            openair0_cfg->samples_per_packet    = 30720;
+            openair0_cfg->tx_sample_advance     = 80;
+            openair0_cfg[0].tx_bw               = 40e6;
+            openair0_cfg[0].rx_bw               = 40e6;
+            break;
+        case 46080000:
+            openair0_cfg->samples_per_packet    = 23040;
+            openair0_cfg->tx_sample_advance     = 80;
+            openair0_cfg[0].tx_bw               = 40e6;
+            openair0_cfg[0].rx_bw               = 40e6;
+            break;
+#endif
+        case 30720000:
+            openair0_cfg->samples_per_packet    = 15360;
+            openair0_cfg->tx_sample_advance     = 80;
+            openair0_cfg[0].tx_bw               = 20e6;
+            openair0_cfg[0].rx_bw               = 20e6;
+            break;
+        case 23040000:
+            openair0_cfg->samples_per_packet    = 11520;
+            openair0_cfg->tx_sample_advance     = 80;
+            openair0_cfg[0].tx_bw               = 20e6;
+            openair0_cfg[0].rx_bw               = 20e6;
+            break;
+        case 15360000:
+            openair0_cfg->samples_per_packet    = 7680;
+            openair0_cfg->tx_sample_advance     = 52;
+            openair0_cfg[0].tx_bw               = 10e6;
+            openair0_cfg[0].rx_bw               = 10e6;
+            break;
+        case 7680000:
+            openair0_cfg->samples_per_packet    = 7680;
+            openair0_cfg->tx_sample_advance     = 34;
+            openair0_cfg[0].tx_bw               = 5e6;
+            openair0_cfg[0].rx_bw               = 5e6;
+            break;
+        case 1920000:
+            openair0_cfg->samples_per_packet    = 1920;
+            openair0_cfg->tx_sample_advance     = 9;
+            openair0_cfg[0].tx_bw               = 1.25e6;
+            openair0_cfg[0].rx_bw               = 1.25e6;
+            break;
+        default:
+            LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate);
+            free(oxgrf);
+            exit(-1);
+            break;
+        }
+    }
+    if(oxgrf->BoardType == Y380
+            || oxgrf->BoardType == Y550
+            || oxgrf->BoardType == Y590
+            || oxgrf->BoardType == IQX7000
+            || oxgrf->BoardType == IQX7402
+            || oxgrf->BoardType == IQX7400) {
+        switch ((int)openair0_cfg->sample_rate) {
+        case 122880000:
+            openair0_cfg->samples_per_packet    = 30720;
+            openair0_cfg->tx_sample_advance     = 80;
+            openair0_cfg[0].tx_bw               = 100e6;
+            openair0_cfg[0].rx_bw               = 100e6;
+            break;
+        case 61440000:
+            openair0_cfg->samples_per_packet    = 30720;
+            openair0_cfg->tx_sample_advance     = 80;
+            openair0_cfg[0].tx_bw               = 40e6;
+            openair0_cfg[0].rx_bw               = 40e6;
+            break;
+        case 30720000:
+            openair0_cfg->samples_per_packet    = 15360;
+            openair0_cfg->tx_sample_advance     = 80;
+            openair0_cfg[0].tx_bw               = 20e6;
+            openair0_cfg[0].rx_bw               = 20e6;
+            break;
+        case 15360000:
+            openair0_cfg->samples_per_packet    = 15360;
+            openair0_cfg->tx_sample_advance     = 52;
+            openair0_cfg[0].tx_bw               = 10e6;
+            openair0_cfg[0].rx_bw               = 10e6;
+            break;
+        case 7680000:
+            openair0_cfg->samples_per_packet    = 7680;
+            openair0_cfg->tx_sample_advance     = 34;
+            openair0_cfg[0].tx_bw               = 5e6;
+            openair0_cfg[0].rx_bw               = 5e6;
+            break;
+        case 1920000:
+            openair0_cfg->samples_per_packet    = 1920;
+            openair0_cfg->tx_sample_advance     = 9;
+            openair0_cfg[0].tx_bw               = 1.25e6;
+            openair0_cfg[0].rx_bw               = 1.25e6;
+            break;
+        default:
+            LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate);
+            free(oxgrf);
+            exit(-1);
+            break;
+        }
+
+    }
+
+    LOG_I(HW, "[oxgrf] Initializing openair0_device\n");
+    switch (openair0_cfg[0].clock_source) {
+    case external:
+        LOG_I(HW, "[oxgrf] clock_source: external\n");
+        oxgrf_set_ref_clock (oxgrf->dev, 0, EXTERNAL_REFERENCE);
+        oxgrf_set_pps_select (oxgrf->dev, 0, PPS_EXTERNAL_EN);
+        break;
+    case gpsdo:
+        LOG_I(HW, "[oxgrf] clock_source: gpsdo\n");
+        break;
+    case internal:
+    default:
+        oxgrf_set_ref_clock (oxgrf->dev, 0, INTERNAL_REFERENCE);
+        oxgrf_set_pps_select (oxgrf->dev, 0, PPS_INTERNAL_EN);
+        //oxgrf_set_vco_select (oxgrf->dev, 0, AUXDAC1);
+        LOG_I(HW, "[oxgrf] clock_source: internal\n");
+        break;
+    }
+    oxgrf_set_auxdac1 (oxgrf->dev, 0, auxdac1);
+    if (pa_status) {
+        oxgrf_set_duplex_select (oxgrf->dev, 0, FDD);
+        oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1);
+        oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0);
+    } else if (openair0_cfg->duplex_mode == duplex_mode_TDD && !rx_ant) {
+        oxgrf_set_duplex_select (oxgrf->dev, 0, TDD);
+        oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1);
+        oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0);
+    } else {
+        oxgrf_set_duplex_select (oxgrf->dev, 0, FDD);
+        oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 0);
+        oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 1);
+    }
+    LOG_I(HW, "[oxgrf] RX Ant:%s\n", rx_ant?"Enabled":"Disabled");
+    oxgrf_set_tx_fir_en_dis (oxgrf->dev, 0, 0);
+    oxgrf_set_rx_fir_en_dis (oxgrf->dev, 0, 0);
+
+    int max_idx = ((oxgrf->rx_num_channels > 2 || oxgrf->tx_num_channels > 2)? 1 : 0);
+
+    for(int chip_idx = 0; chip_idx <= max_idx; chip_idx++) {
+        // RX port Initialize
+        if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set RX frequency\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0]));
+        if ((status = oxgrf_set_rx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->sample_rate))) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set RX sample rate\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX sample rate to %u\n", (uint32_t)(openair0_cfg->sample_rate));
+        if ((status = oxgrf_set_rx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->rx_bw))) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set RX bandwidth\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX bandwidth to %u\n",(uint32_t)(openair0_cfg->rx_bw));
+
+        if ((status = oxgrf_set_rx1_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){
+            LOG_E(HW, "[oxgrf] Failed to set RX1 Gain Control Mode\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX1 Gain Control Mode MGC\n");
+
+        uint32_t rxgain = openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0];
+        if (rxgain > 30)
+            rxgain = 60;
+        else
+            rxgain *= 2;
+        if ((status = oxgrf_set_rx1_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) {
+            LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX1 gain to %u\n", rxgain);
+
+        if ((status = oxgrf_set_rx2_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){
+            LOG_E(HW, "[oxgrf] Failed to set RX2 Gain Control Mode\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX2 Gain Control Mode MGC\n");
+
+        if ((status = oxgrf_set_rx2_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n");
+        } else
+            LOG_I(HW, "[oxgrf] set RX2 gain to %u\n", rxgain);
+
+        // TX port Initialize
+        if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)openair0_cfg->tx_freq[0])) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set TX frequency\n");
+        } else
+            LOG_I(HW, "[oxgrf] set TX Frequency to %lu\n", (uint64_t)openair0_cfg->tx_freq[0]);
+
+        if ((status = oxgrf_set_tx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->sample_rate)) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set TX sample rate\n");
+        } else
+            LOG_I(HW, "[oxgrf] set TX sampling rate to %u\n", (uint32_t)openair0_cfg->sample_rate);
+
+        if ((status = oxgrf_set_tx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->tx_bw)) <0) {
+            LOG_E(HW, "[oxgrf] Failed to set TX bandwidth\n");
+        } else
+            LOG_I(HW, "[oxgrf] set TX bandwidth to %u\n", (uint32_t)openair0_cfg->tx_bw);
+
+        if ((status = oxgrf_set_tx1_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[0] * 1000)) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n");
+        } else
+            LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]);
+
+        if ((status = oxgrf_set_tx2_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[1] * 1000)) < 0) {
+            LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n");
+        } else
+            LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]);
+    }
+
+    uint32_t depth = oxgrf->sample_rate / 10 * sizeof(int) * oxgrf->tx_num_channels;
+    oxgrf_set_hwbuf_depth(oxgrf->dev, 0, depth);
+
+    oxgrf_enable_timestamp(oxgrf->dev, 0, 0);
+    sleep(2);
+    oxgrf_enable_timestamp(oxgrf->dev, 0, 1);
+    sleep(2);
+
+    for(int i = 0; i < NCHAN_PER_DEV; i++) {
+        int ret = posix_memalign((void **)&cache_buf[i], 4096, BUFFER_SIZE);
+        if(ret) {
+            LOG_I(HW, "Failed to alloc memory\n");
+            return -1;
+        }
+        ret = posix_memalign((void **)&iq_buf[i], 4096, BUFFER_SIZE);
+        if(ret) {
+            LOG_I(HW, "Failed to alloc memory\n");
+            return -1;
+        }
+    }
+
+    device->Mod_id               = num_devices++;
+    device->type                 = OXGRF_DEV;
+    device->trx_start_func       = trx_oxgrf_start;
+    device->trx_end_func         = trx_oxgrf_end;
+    device->trx_read_func        = trx_oxgrf_read;
+    device->trx_write_func       = trx_oxgrf_write;
+    device->trx_get_stats_func   = trx_oxgrf_get_stats;
+    device->trx_reset_stats_func = trx_oxgrf_reset_stats;
+    device->trx_stop_func        = trx_oxgrf_stop;
+    device->trx_set_freq_func    = trx_oxgrf_set_freq;
+    device->trx_set_gains_func   = trx_oxgrf_set_gains;
+    device->openair0_cfg         = openair0_cfg;
+    device->priv                 = (void *)oxgrf;
+
+    return 0;
+}
+
+/*@}*/
diff --git a/radio/OXGRF/oxgrf_lib.h b/radio/OXGRF/oxgrf_lib.h
new file mode 100644
index 0000000000..6a9328cd81
--- /dev/null
+++ b/radio/OXGRF/oxgrf_lib.h
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/** oxgrf_lib.h
+ *
+ * Author: eric
+ * base on bladerf_lib.h
+ */
+
+#include "oxgrf_api_ss.h"
+#include "common_lib.h"
+
+/** @addtogroup _OXGRF_PHY_RF_INTERFACE_
+ * @{
+ */
+
+typedef enum {
+    Y230,
+    Y380,
+    Y550,
+    Y590,
+    IQX6000,
+    IQX7000,
+    IQX7100,
+    IQX7400,
+    IQX7402,  //split
+    UNKNOWN = -1,
+} OXGRFBoardType;
+
+/*! \brief OXGRF specific data structure */ 
+typedef struct {
+
+  //! opaque OXGRF device struct. An empty ("") or NULL device identifier will result in the first encountered device being opened (using the first discovered backend)
+  OXGRF_DESCRIPTOR *dev;
+  int16_t *rx_buffer;
+  int16_t *tx_buffer;
+  //! Sample rate
+  unsigned int sample_rate;
+
+  int rx_num_channels;
+  int tx_num_channels;
+  uint64_t tx_lo_freq;
+  uint64_t rx_lo_freq;
+
+  // --------------------------------
+  // Debug and output control
+  // --------------------------------
+  //! Number of underflows
+  int num_underflows;
+  //! Number of overflows
+  int num_overflows;
+  //! number of RX errors
+  int num_rx_errors;
+  //! Number of TX errors
+  int num_tx_errors;
+
+  //! timestamp of current TX
+  uint64_t tx_current_ts;
+  //! timestamp of current RX
+  uint64_t rx_current_ts;
+  //! number of TX samples
+  uint64_t tx_nsamps;
+  //! number of RX samples
+  uint64_t rx_nsamps;
+  //! number of TX count
+  uint64_t tx_count;
+  //! number of RX count
+  uint64_t rx_count;
+  //! timestamp of RX packet
+  openair0_timestamp rx_timestamp;
+  OXGRFBoardType BoardType;
+} oxgrf_state_t;
+
+/*! \brief get current timestamp
+ *\param device the hardware to use 
+ */
+openair0_timestamp trx_get_timestamp(openair0_device *device);
+
+/*@}*/
diff --git a/radio/OXGRF/rf_helper.h b/radio/OXGRF/rf_helper.h
new file mode 100644
index 0000000000..10c650a76a
--- /dev/null
+++ b/radio/OXGRF/rf_helper.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013-2020 Software Radio Systems Limited
+ *
+ * This file is part of srsLTE.
+ *
+ * srsLTE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * srsLTE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * A copy of the GNU Affero General Public License can be found in
+ * the LICENSE file in the top-level directory of this distribution
+ * and at http://www.gnu.org/licenses/.
+ *
+ */
+#ifndef OXGRF_RF_HELPER_H_
+#define OXGRF_RF_HELPER_H_
+
+// A bunch of helper functions to process device arguments
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define REMOVE_SUBSTRING_WITHCOMAS(S, TOREMOVE)                                                                        \
+  remove_substring(S, TOREMOVE ",");                                                                                   \
+  remove_substring(S, TOREMOVE ", ");                                                                                  \
+  remove_substring(S, "," TOREMOVE);                                                                                   \
+  remove_substring(S, ", " TOREMOVE);                                                                                  \
+  remove_substring(S, TOREMOVE)
+
+static inline void remove_substring(char* s, const char* toremove)
+{
+  while ((s = strstr(s, toremove))) {
+    memmove(s, s + strlen(toremove), 1 + strlen(s + strlen(toremove)));
+  }
+}
+
+static inline void copy_subdev_string(char* dst, char* src)
+{
+  int n   = 0;
+  int len = (int)strlen(src);
+  /* Copy until end of string or comma */
+  while (n < len && src[n] != '\0' && src[n] != ',') {
+    dst[n] = src[n];
+    n++;
+  }
+  dst[n] = '\0';
+}
+
+#endif /* OXGRF_RF_HELPER_H_ */
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf
new file mode 100644
index 0000000000..bed89a7119
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf
@@ -0,0 +1,223 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+    ////////// Identification parameters:
+    eNB_ID    =  0xe00;
+
+    cell_type =  "CELL_MACRO_ENB";
+
+    eNB_name  =  "eNB_Eurecom_LTEBox";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code = 1;
+
+    plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } );
+
+    tr_s_preference     = "local_mac"
+
+    ////////// Physical parameters:
+
+    component_carriers = (
+      {
+      node_function             = "eNodeB_3GPP";
+      node_timing               = "synch_to_ext_device";
+      node_synch_ref            = 0;
+      frame_type					      = "FDD";
+      tdd_config 					      = 3;
+      tdd_config_s            			      = 0;
+      prefix_type             			      = "NORMAL";
+      eutra_band              			      = 7;
+      downlink_frequency      			      = 2680000000L;
+      uplink_frequency_offset 			      = -120000000;
+      Nid_cell					      = 0;
+      N_RB_DL                 			      = 100;
+      Nid_cell_mbsfn          			      = 0;
+      nb_antenna_ports                                = 1;
+      nb_antennas_tx          			      = 1;
+      nb_antennas_rx          			      = 1;
+      tx_gain                                            = 90;
+      rx_gain                                            = 102;
+      pbch_repetition                                 = "FALSE";
+      prach_root              			      = 0;
+      prach_config_index      			      = 0;
+      prach_high_speed        			      = "DISABLE";
+      prach_zero_correlation  			      = 1;
+      prach_freq_offset       			      = 2;
+      pucch_delta_shift       			      = 1;
+      pucch_nRB_CQI           			      = 1;
+      pucch_nCS_AN            			      = 0;
+      pucch_n1_AN             			      = 0;
+      pdsch_referenceSignalPower 			      = 0;
+      pdsch_p_b                  			      = 0;
+      pusch_n_SB                 			      = 1;
+      pusch_enable64QAM          			      = "DISABLE";
+      pusch_hoppingMode                                  = "interSubFrame";
+      pusch_hoppingOffset                                = 0;
+      pusch_groupHoppingEnabled  			      = "ENABLE";
+      pusch_groupAssignment      			      = 0;
+      pusch_sequenceHoppingEnabled		   	      = "DISABLE";
+      pusch_nDMRS1                                       = 1;
+      phich_duration                                     = "NORMAL";
+      phich_resource                                     = "ONESIXTH";
+      srs_enable                                         = "DISABLE";
+      /*  srs_BandwidthConfig                                =;
+      srs_SubframeConfig                                 =;
+      srs_ackNackST                                      =;
+      srs_MaxUpPts                                       =;*/
+
+      pusch_p0_Nominal                                   = -96;
+      pusch_alpha                                        = "AL1";
+      pucch_p0_Nominal                                   = -104;
+      msg3_delta_Preamble                                = 6;
+      pucch_deltaF_Format1                               = "deltaF2";
+      pucch_deltaF_Format1b                              = "deltaF3";
+      pucch_deltaF_Format2                               = "deltaF0";
+      pucch_deltaF_Format2a                              = "deltaF0";
+      pucch_deltaF_Format2b		    	      = "deltaF0";
+
+      rach_numberOfRA_Preambles                          = 64;
+      rach_preamblesGroupAConfig                         = "DISABLE";
+      /*
+      rach_sizeOfRA_PreamblesGroupA                      = ;
+      rach_messageSizeGroupA                             = ;
+      rach_messagePowerOffsetGroupB                      = ;
+      */
+      rach_powerRampingStep                              = 4;
+      rach_preambleInitialReceivedTargetPower            = -108;
+      rach_preambleTransMax                              = 10;
+      rach_raResponseWindowSize                          = 10;
+      rach_macContentionResolutionTimer                  = 48;
+      rach_maxHARQ_Msg3Tx                                = 4;
+
+      pcch_default_PagingCycle                           = 128;
+      pcch_nB                                            = "oneT";
+      bcch_modificationPeriodCoeff			      = 2;
+      ue_TimersAndConstants_t300			      = 1000;
+      ue_TimersAndConstants_t301			      = 1000;
+      ue_TimersAndConstants_t310			      = 1000;
+      ue_TimersAndConstants_t311			      = 10000;
+      ue_TimersAndConstants_n310			      = 20;
+      ue_TimersAndConstants_n311			      = 1;
+      ue_TransmissionMode                                    = 1;
+      }
+    );
+
+
+    srb1_parameters :
+    {
+        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
+        timer_poll_retransmit    = 80;
+
+        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
+        timer_reordering         = 35;
+
+        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
+        timer_status_prohibit    = 0;
+
+        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
+        poll_pdu                 =  4;
+
+        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
+        poll_byte                =  99999;
+
+        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
+        max_retx_threshold       =  4;
+    }
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// MME parameters:
+    mme_ip_address      = ( { ipv4       = "192.168.0.80";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    enable_measurement_reports = "no";
+
+    ///X2
+    enable_x2 = "no";
+    t_reloc_prep      = 1000;      /* unit: millisecond */
+    tx2_reloc_overall = 2000;      /* unit: millisecond */
+    t_dc_prep         = 1000;      /* unit: millisecond */
+    t_dc_overall      = 2000;      /* unit: millisecond */
+
+    NETWORK_INTERFACES :
+    {
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "eno2";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.0.202/24";
+        ENB_INTERFACE_NAME_FOR_S1U               = "eno2";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.0.202/24";
+        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
+
+        ENB_IPV4_ADDRESS_FOR_X2C                 = "192.168.0.202/24";
+        ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
+    };
+  }
+);
+
+MACRLCs = (
+	{
+	num_cc = 1;
+	tr_s_preference = "local_L1";
+	tr_n_preference = "local_RRC";
+        puSch10xSnr     =  200;
+        puCch10xSnr     =  200;
+        }  
+);
+
+L1s = (
+    	{
+	num_cc = 1;
+	tr_n_preference = "local_mac";
+        }  
+);
+
+RUs = (
+    {		  
+       local_rf       = "yes"
+         nb_tx          = 1
+         nb_rx          = 1
+         att_tx         = 0
+         att_rx         = 3;
+         bands          = [7];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 102;
+         eNB_instances  = [0];
+         sdr_addrs = "dev=pciex:0,auxdac1=1620";
+         clock_src = "internal";
+    }
+);  
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       hw_log_level                          ="info";
+       phy_log_level                         ="info";
+       mac_log_level                         ="info";
+       rlc_log_level                         ="info";
+       pdcp_log_level                        ="info";
+       rrc_log_level                         ="info";
+    };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf
new file mode 100644
index 0000000000..62f4bd0135
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf
@@ -0,0 +1,309 @@
+Active_eNBs = ( "eNB-Eurecom-LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+    ////////// Identification parameters:
+    eNB_ID    =  0xe00;
+
+    cell_type =  "CELL_MACRO_ENB";
+
+    eNB_name  =  "eNB-Eurecom-LTEBox";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+
+    plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } );
+
+    tr_s_preference     = "local_mac"
+
+    ////////// Physical parameters:
+
+    component_carriers = (
+      {
+      node_function             = "3GPP_eNODEB";
+      node_timing               = "synch_to_ext_device";
+      node_synch_ref            = 0;
+      frame_type					      = "FDD";
+      tdd_config 					      = 3;
+      tdd_config_s            			      = 0;
+      prefix_type             			      = "NORMAL";
+      eutra_band              			      = 7;
+      downlink_frequency      			      = 2685000000L;
+      uplink_frequency_offset 			      = -120000000;
+      Nid_cell					      = 0;
+      N_RB_DL                 			      = 50;
+      Nid_cell_mbsfn          			      = 0;
+      nb_antenna_ports                                = 1;
+      nb_antennas_tx          			      = 1;
+      nb_antennas_rx          			      = 1;
+      tx_gain                                            = 89;
+      rx_gain                                            = 102;
+      pbch_repetition                                 = "FALSE";
+      prach_root              			      = 0;
+      prach_config_index      			      = 0;
+      prach_high_speed        			      = "DISABLE";
+      prach_zero_correlation  			      = 1;
+      prach_freq_offset       			      = 2;
+      pucch_delta_shift       			      = 1;
+      pucch_nRB_CQI           			      = 0;
+      pucch_nCS_AN            			      = 0;
+      pucch_n1_AN             			      = 0;
+      pdsch_referenceSignalPower 			      = -27;
+      pdsch_p_b                  			      = 0;
+      pusch_n_SB                 			      = 1;
+      pusch_enable64QAM          			      = "DISABLE";
+      pusch_hoppingMode                                  = "interSubFrame";
+      pusch_hoppingOffset                                = 0;
+      pusch_groupHoppingEnabled  			      = "ENABLE";
+      pusch_groupAssignment      			      = 0;
+      pusch_sequenceHoppingEnabled		   	      = "DISABLE";
+      pusch_nDMRS1                                       = 1;
+      phich_duration                                     = "NORMAL";
+      phich_resource                                     = "ONESIXTH";
+      srs_enable                                         = "DISABLE";
+      /*  srs_BandwidthConfig                                =;
+      srs_SubframeConfig                                 =;
+      srs_ackNackST                                      =;
+      srs_MaxUpPts                                       =;*/
+
+      pusch_p0_Nominal                                   = -96;
+      pusch_alpha                                        = "AL1";
+      pucch_p0_Nominal                                   = -104;
+      msg3_delta_Preamble                                = 6;
+      pucch_deltaF_Format1                               = "deltaF2";
+      pucch_deltaF_Format1b                              = "deltaF3";
+      pucch_deltaF_Format2                               = "deltaF0";
+      pucch_deltaF_Format2a                              = "deltaF0";
+      pucch_deltaF_Format2b		    	      = "deltaF0";
+
+      rach_numberOfRA_Preambles                          = 64;
+      rach_preamblesGroupAConfig                         = "DISABLE";
+      /*
+      rach_sizeOfRA_PreamblesGroupA                      = ;
+      rach_messageSizeGroupA                             = ;
+      rach_messagePowerOffsetGroupB                      = ;
+      */
+      rach_powerRampingStep                              = 4;
+      rach_preambleInitialReceivedTargetPower            = -108;
+      rach_preambleTransMax                              = 10;
+      rach_raResponseWindowSize                          = 10;
+      rach_macContentionResolutionTimer                  = 48;
+      rach_maxHARQ_Msg3Tx                                = 4;
+
+      pcch_default_PagingCycle                           = 128;
+      pcch_nB                                            = "oneT";
+      bcch_modificationPeriodCoeff			      = 2;
+      ue_TimersAndConstants_t300			      = 1000;
+      ue_TimersAndConstants_t301			      = 1000;
+      ue_TimersAndConstants_t310			      = 1000;
+      ue_TimersAndConstants_t311			      = 10000;
+      ue_TimersAndConstants_n310			      = 20;
+      ue_TimersAndConstants_n311			      = 1;
+      ue_TransmissionMode                                    = 1;
+
+      //Parameters for SIB18
+      rxPool_sc_CP_Len                                       = "normal";
+      rxPool_sc_Period                                       = "sf40";
+      rxPool_data_CP_Len                                     = "normal";
+      rxPool_ResourceConfig_prb_Num                          = 20;
+      rxPool_ResourceConfig_prb_Start                        = 5;
+      rxPool_ResourceConfig_prb_End                          = 44;
+      rxPool_ResourceConfig_offsetIndicator_present          = "prSmall";
+      rxPool_ResourceConfig_offsetIndicator_choice           = 0;
+      rxPool_ResourceConfig_subframeBitmap_present           = "prBs40";
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_buf              = "00000000000000000000";
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_size             = 5;
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused      = 0;
+/*    rxPool_dataHoppingConfig_hoppingParameter                       = 0;
+      rxPool_dataHoppingConfig_numSubbands                            = "ns1";
+      rxPool_dataHoppingConfig_rbOffset                               = 0;
+      rxPool_commTxResourceUC-ReqAllowed                              = "TRUE";
+*/
+      // Parameters for SIB19
+      discRxPool_cp_Len                                               = "normal"
+      discRxPool_discPeriod                                           = "rf32"
+      discRxPool_numRetx                                              = 1;
+      discRxPool_numRepetition                                        = 2;
+      discRxPool_ResourceConfig_prb_Num                               = 5;
+      discRxPool_ResourceConfig_prb_Start                             = 3;
+      discRxPool_ResourceConfig_prb_End                               = 21;
+      discRxPool_ResourceConfig_offsetIndicator_present               = "prSmall";
+      discRxPool_ResourceConfig_offsetIndicator_choice                = 0;
+      discRxPool_ResourceConfig_subframeBitmap_present                = "prBs40";
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf          = "f0ffffffff";
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_size         = 5;
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused  = 0;
+
+      }
+    );
+
+
+    srb1_parameters :
+    {
+        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
+        timer_poll_retransmit    = 80;
+
+        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
+        timer_reordering         = 35;
+
+        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
+        timer_status_prohibit    = 0;
+
+        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
+        poll_pdu                 =  4;
+
+        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
+        poll_byte                =  99999;
+
+        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
+        max_retx_threshold       =  4;
+    }
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// MME parameters:
+    mme_ip_address      = ( { ipv4       = "127.0.1.100";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    enable_measurement_reports = "no";
+
+    ///X2
+    enable_x2 = "yes";
+    t_reloc_prep      = 1000;      /* unit: millisecond */
+    tx2_reloc_overall = 2000;      /* unit: millisecond */
+    t_dc_prep         = 1000;      /* unit: millisecond */
+    t_dc_overall      = 2000;      /* unit: millisecond */
+
+    NETWORK_INTERFACES :
+    {
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "lo";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "127.0.1.1/24";
+        ENB_INTERFACE_NAME_FOR_S1U               = "lo";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "127.0.1.1/24";
+        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
+
+        ENB_IPV4_ADDRESS_FOR_X2C                 = "127.0.1.1/24";
+        ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
+    };
+  }
+);
+
+DU = (
+    {
+	DU_INTERFACE_NAME_FOR_F1U           = "lo";
+	DU_IPV4_ADDRESS_FOR_F1U             = "127.0.0.1/16";
+	DU_PORT_FOR_F1U                     = 22100;
+	F1_U_DU_TRANSPORT_TYPE		    = "TCP";
+    }
+    );
+    
+CU = (
+    {     
+        CU_INTERFACE_NAME_FOR_F1U           = "lo";
+        CU_IPV4_ADDRESS_FOR_F1U             = "127.0.0.1";   //Address to search the DU
+        CU_PORT_FOR_F1U                     = 22100;
+        F1_U_CU_TRANSPORT_TYPE              = "TCP";	     // One of TCP/UDP/SCTP
+        DU_TYPE 			    = "LTE";
+    }//,
+//    {     
+//        CU_INTERFACE_NAME_FOR_F1U           = "eth0";
+//        CU_IPV4_ADDRESS_FOR_F1U             = "10.64.93.142";   //Address to search the DU
+//        CU_PORT_FOR_F1U                     = 2211;
+//        F1_U_CU_TRANSPORT_TYPE              = "TCP";          // One of TCP/UDP/SCTP
+//        DU_TYPE 			    = "WiFi";
+//    }
+    );
+
+    CU_BALANCING = "ALL";
+
+MACRLCs = (
+	{
+	num_cc = 1;
+	tr_s_preference = "local_L1";
+	tr_n_preference = "local_RRC";
+	phy_test_mode = 0;
+        puSch10xSnr     =  200;
+        puCch10xSnr     =  200;
+        }  
+);
+
+L1s = (
+    	{
+	num_cc = 1;
+	tr_n_preference = "local_mac";
+        }  
+);
+
+RUs = (
+    {		  
+       local_rf       = "yes"
+         nb_tx          = 1
+         nb_rx          = 1
+         att_tx         = 5
+         att_rx         = 10;
+         bands          = [7];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 102;
+         eNB_instances  = [0];
+         sdr_addrs = "dev=pciex:0,auxdac1=1620";
+         clock_src = "internal";
+
+    }
+);  
+
+NETWORK_CONTROLLER :
+{
+    FLEXRAN_ENABLED        = "no";
+    FLEXRAN_INTERFACE_NAME = "lo";
+    FLEXRAN_IPV4_ADDRESS   = "127.0.0.1";
+    FLEXRAN_PORT           = 2210;
+    FLEXRAN_CACHE          = "/mnt/oai_agent_cache";
+    FLEXRAN_AWAIT_RECONF   = "no";
+};
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+/*
+#example config for rfsimulator
+rfsimulator :
+{
+   serveraddr = "enb";
+   serverport = "4043";
+   options = ("saviq");
+   modelname = "AWGN";
+   IQfile = "/tmp/rfsimulator.iqs";
+};
+*/
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       hw_log_level                          ="info";
+       phy_log_level                         ="info";
+       mac_log_level                         ="info";
+       rlc_log_level                         ="info";
+       pdcp_log_level                        ="info";
+       rrc_log_level                         ="info";
+    };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf
new file mode 100644
index 0000000000..2884cfd68c
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf
@@ -0,0 +1,263 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe01;
+
+    cell_type =  "CELL_MACRO_GNB";
+
+    gNB_name  =  "gNB-Eurecom-5GNRBox";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+
+    plmn_list = ({mcc = 001; mnc = 01; mnc_length = 2;});	 
+
+    tr_s_preference     = "local_mac"
+
+    ////////// Physical parameters:
+
+    pusch_TargetSNRx10                                        = 200;
+    pucch_TargetSNRx10                                        = 200;
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3600 MHz + 84 PRBs@30kHz SCS (same as initial BWP)
+      absoluteFrequencySSB                                          = 641272; //641032;      #641968; 641968=start of ssb at 3600MHz + 82 RBs    641032=center of SSB at center of cell
+      dl_frequencyBand                                                 = 78;
+      # this is 3600 MHz
+      dl_absoluteFrequencyPointA                                       = 640000;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 106;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=84,L=13 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                                        = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+        initialDLBWPsubcarrierSpacing                                           = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                                      = 0;
+        initialDLBWPsearchSpaceZero                                             = 0;
+
+  #uplinkConfigCommon 
+     #frequencyInfoUL
+      ul_frequencyBand                                                 = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+      ul_subcarrierSpacing                                           = 1;
+      ul_carrierBandwidth                                            = 106;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                                        = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+        initialULBWPsubcarrierSpacing                                           = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 13;
+          preambleReceivedTargetPower                               = -100;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14; //15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #  
+        msg1_SubcarrierSpacing                                      = 1,
+
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1; #0x80;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1 
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7; //8; //7;
+      nrofDownlinkSymbols                                           = 6; //0; //6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4; //0; //4;
+
+  ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// MME parameters:
+    amf_ip_address      = ( { ipv4       = "127.0.1.100";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    ///X2
+    enable_x2 = "yes";
+    t_reloc_prep      = 1000;      /* unit: millisecond */
+    tx2_reloc_overall = 2000;      /* unit: millisecond */
+    t_dc_prep         = 1000;      /* unit: millisecond */
+    t_dc_overall      = 2000;      /* unit: millisecond */
+    target_enb_x2_ip_address      = (
+                                     { ipv4       = "127.0.1.1";
+                                       ipv6       = "192:168:30::17";
+                                       preference = "ipv4";
+                                     }
+                                    );
+
+    NETWORK_INTERFACES :
+    {
+
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "lo";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "127.0.1.2/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "lo";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "127.0.1.2/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+        GNB_IPV4_ADDRESS_FOR_X2C                 = "127.0.1.2/24";
+        GNB_PORT_FOR_X2C                         = 36422; # Spec 36422
+    };
+  }
+);
+
+MACRLCs = (
+	{
+	num_cc = 1;
+	tr_s_preference = "local_L1";
+	tr_n_preference = "local_RRC";
+        }  
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+}
+);
+
+RUs = (
+    {		  
+       local_rf       = "yes"
+         nb_tx          = 1
+         nb_rx          = 1
+         att_tx         = 5
+         att_rx         = 10;
+         bands          = [7];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 102;
+         eNB_instances  = [0];
+         sdr_addrs = "dev=pciex:0,auxdac1=1620";
+         clock_src = "internal";
+    }
+);  
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0", "nea2" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia0" );
+};
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       hw_log_level                          ="info";
+       phy_log_level                         ="info";
+       mac_log_level                         ="info";
+       rlc_log_level                         ="info";
+       pdcp_log_level                        ="info";
+       rrc_log_level                         ="info";
+    };
+
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf
new file mode 100644
index 0000000000..41bdf7f7e5
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf
@@ -0,0 +1,269 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP                                     = 2;
+    pusch_AntennaPorts                                        = 2;
+    do_CSIRS                                                  = 1;
+    do_SRS                                                    = 1;
+    ul_prbblacklist                                           = "51,52,53,54"
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
+      absoluteFrequencySSB                                             = 621312; # 641280
+      dl_frequencyBand                                                 = 78;
+      # this is 3300.60 MHz
+      dl_absoluteFrequencyPointA                                       = 620040; # 640008
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 106;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=27,L=48 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                                  = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                             = 12;
+        initialDLBWPsearchSpaceZero                                    = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 106;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -70;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address      = ( { ipv4       = "192.168.0.80"; #"192.168.70.132";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.202"; #"192.168.70.129/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.202"; #"192.168.70.129/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 300;
+  pucch_TargetSNRx10          = 300;
+  pusch_FailureThres          = 1000;
+  ulsch_max_frame_inactivity  = 0;
+}
+);
+
+L1s = (
+{
+  num_cc                = 1;
+  tr_n_preference       = "local_mac";
+  prach_dtx_threshold   = 120;
+  #pucch0_dtx_threshold = 120;
+}
+);
+
+RUs = (
+{
+  local_rf       = "yes"
+  nb_tx          = 2
+  nb_rx          = 2
+  att_tx         = 0
+  att_rx         = 0;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 102;
+  eNB_instances  = [0];
+  ##beamforming 1x2 matrix: 1 layer x 2 antennas
+  bf_weights = [0x00007fff, 0x0000];
+  #clock_src = "internal";
+  sdr_addrs = "dev=pciex:0,auxdac1=1630";
+}
+);
+
+THREAD_STRUCT = (
+{
+  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+  parallel_config    = "PARALLEL_SINGLE_THREAD";
+  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+  worker_config      = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = "4043";
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf
new file mode 100644
index 0000000000..7894f28380
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf
@@ -0,0 +1,268 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    do_CSIRS                                                  = 1;
+    do_SRS                                                    = 1;
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+      absoluteFrequencySSB                                             = 641280;
+      dl_frequencyBand                                                 = 78;
+      # this is 3600 MHz
+      dl_absoluteFrequencyPointA                                       = 640008;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 106;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=27,L=48 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                                   = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                              = 12;
+        initialDLBWPsearchSpaceZero                                     = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 106;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 13;
+          preambleReceivedTargetPower                               = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address      = ( { ipv4       = "192.168.70.132";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "eno2";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.202/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "eno2";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.202/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 150;
+  pucch_TargetSNRx10          = 200;
+  ulsch_max_frame_inactivity  = 0;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference       = "local_mac";
+  prach_dtx_threshold   = 120;
+  pucch0_dtx_threshold  = 100;
+  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
+}
+);
+
+RUs = (
+{
+  local_rf       = "yes"
+  nb_tx          = 1
+  nb_rx          = 1
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 102;
+  eNB_instances  = [0];
+  #beamforming 1x4 matrix:
+  bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+  sdr_addrs = "dev=pciex:0,auxdac1=1660";
+  clock_src = "internal";
+}
+);
+
+THREAD_STRUCT = (
+{
+  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+  parallel_config    = "PARALLEL_SINGLE_THREAD";
+  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+  worker_config      = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = "4043";
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
+
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf
new file mode 100644
index 0000000000..b6347edc28
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf
@@ -0,0 +1,270 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP                                     = 2;
+    pusch_AntennaPorts                                        = 2;
+    do_CSIRS                                                  = 1;
+    do_SRS                                                    = 1;
+    ul_prbblacklist                                           = "135,136,137,138"
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
+      absoluteFrequencySSB                                          = 623232;
+      dl_frequencyBand                                              = 78;
+      # this is 3300.24 MHz
+      dl_absoluteFrequencyPointA                                    = 620016;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 273;
+     #initialDownlinkBWP
+      #genericParameters
+       initialDLBWPlocationAndBandwidth                             = 1099;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 12;
+        initialDLBWPsearchSpaceZero                                 = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 273;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 1099;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -90;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -70;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -5;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address      = ( { ipv4       = "192.168.0.80";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.201/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.201/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 300;
+  pucch_TargetSNRx10          = 300;
+  pusch_FailureThres          = 1000;
+  ulsch_max_frame_inactivity  = 0;
+  ul_max_mcs                  = 28;
+}
+);
+
+L1s = (
+{
+  num_cc                = 1;
+  tr_n_preference       = "local_mac";
+  prach_dtx_threshold   = 120;
+  pucch0_dtx_threshold  = 80;
+}
+);
+
+RUs = (
+{
+  local_rf       = "yes"
+  nb_tx          = 2
+  nb_rx          = 2
+  att_tx         = 0
+  att_rx         = 0;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 102;
+  eNB_instances  = [0];
+  ##beamforming 1x2 matrix: 1 layer x 2 antennas
+  bf_weights = [0x00007fff, 0x0000];
+  #clock_src = "internal";
+  sdr_addrs = "dev=pciex:0,auxdac1=1630";
+}
+);
+
+THREAD_STRUCT = (
+{
+  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+  parallel_config    = "PARALLEL_SINGLE_THREAD";
+  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+  worker_config      = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = "4043";
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf
new file mode 100644
index 0000000000..48a0b68bef
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf
@@ -0,0 +1,271 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    ssb_SubcarrierOffset  = 0;
+    pdsch_AntennaPorts_XP = 1;
+    pusch_AntennaPorts    = 1;
+    do_CSIRS              = 1;
+    ul_prbblacklist       = "135,136,137,138"
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
+      absoluteFrequencySSB                                          = 623232;
+      dl_frequencyBand                                              = 78;
+      # this is 3300.24 MHz
+      dl_absoluteFrequencyPointA                                    = 620016;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 273;
+     #initialDownlinkBWP
+      #genericParameters
+       initialDLBWPlocationAndBandwidth                             = 1099;
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 12;
+        initialDLBWPsearchSpaceZero                                 = 10;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 273;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 1099;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -90;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -70;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                                 = -5;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address      = ( { ipv4       = "192.168.0.80";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+
+    NETWORK_INTERFACES :
+    {
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.201/24";
+        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.201/24";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 300;
+  pucch_TargetSNRx10          = 300;
+  pusch_FailureThres          = 1000;
+  ulsch_max_frame_inactivity  = 0;
+#  ul_max_mcs                  = 28;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  prach_dtx_threshold = 120;
+  pucch0_dtx_threshold = 80;
+}
+);
+
+RUs = (
+{
+  local_rf       = "yes"
+  nb_tx          = 1;
+  nb_rx          = 1;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 102;
+  eNB_instances  = [0];
+  ##beamforming 1x2 matrix: 1 layer x 2 antennas
+  bf_weights = [0x00007fff, 0x0000];
+  #clock_src = "internal";
+  sdr_addrs = "dev=pciex:0,auxdac1=1630";
+}
+);
+
+THREAD_STRUCT = (
+{
+  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+  parallel_config    = "PARALLEL_SINGLE_THREAD";
+  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+  worker_config      = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = "4043";
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
diff --git a/xdma.patch b/xdma.patch
new file mode 100755
index 0000000000..12ee6d176f
--- /dev/null
+++ b/xdma.patch
@@ -0,0 +1,3500 @@
+From 1447e9734d0a4bceb43343b0323b3396229a0f81 Mon Sep 17 00:00:00 2001
+From: Eric <eric@v3best.com>
+Date: Wed, 20 Sep 2023 13:31:18 +0800
+Subject: [PATCH] v3tech: add OXGRF device support
+
+---
+ CMakeLists.txt                                |   2 +-
+ cmake_targets/build_oai                       |   8 +-
+ cmake_targets/tools/build_helper              |  28 +
+ executables/lte-softmodem.h                   |   2 +
+ executables/lte-uesoftmodem.c                 |   3 +
+ executables/nr-softmodem-common.h             |   2 +
+ executables/nr-uesoftmodem.c                  |   2 +
+ executables/nr-uesoftmodem.h                  |   1 +
+ openair1/PHY/impl_defs_top.h                  |   1 +
+ radio/CMakeLists.txt                          |   5 +
+ radio/COMMON/common_lib.c                     |   2 +-
+ radio/COMMON/common_lib.h                     |   2 +
+ radio/OXGRF/CMakeLists.txt                   |   9 +
+ radio/OXGRF/rf_helper.h                      |  56 ++
+ radio/OXGRF/oxgrf_lib.c                     | 847 ++++++++++++++++++
+ radio/OXGRF/oxgrf_lib.h                     |  97 ++
+ .../CONF/enb.band7.tm1.100PRB.oxgrf.conf     | 223 +++++
+ .../CONF/enb.band7.tm1.50PRB.oxgrf.conf      | 309 +++++++
+ .../CONF/gnb.band78.tm1.106PRB.oxgrf.conf    | 263 ++++++
+ .../gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf  | 277 ++++++
+ .../gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf  | 269 ++++++
+ .../CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf | 268 ++++++
+ .../gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf  | 270 ++++++
+ .../CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf | 271 ++++++
+ 24 files changed, 3213 insertions(+), 4 deletions(-)
+ create mode 100644 radio/OXGRF/CMakeLists.txt
+ create mode 100644 radio/OXGRF/rf_helper.h
+ create mode 100644 radio/OXGRF/oxgrf_lib.c
+ create mode 100644 radio/OXGRF/oxgrf_lib.h
+ create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf
+ create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf
+ create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf
+ create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf
+ create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf
+ create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf
+ create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf
+ create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 27a7c471d5..2abab44768 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -2359,7 +2359,7 @@ if (${T_TRACER})
+         nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
+         #all "add_library" definitions
+         ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap
+-        params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer
++        params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer oai_oxgrfdevif
+         oai_eth_transpro oai_mobipass coding HASHTABLE UTIL OMG_SUMO
+         SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
+         NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
+diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
+index 8de83f473d..5168ef9e9a 100755
+--- a/cmake_targets/build_oai
++++ b/cmake_targets/build_oai
+@@ -93,7 +93,7 @@ Options:
+ --UE-gen-nvram [output path]
+    Specify gen_nvram_path (default \"$gen_nvram_path\")
+ -w | --hardware
+-   USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, None (Default)
++   USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, OXGRF, None (Default)
+    Adds this RF board support (in external packages installation and in compilation)
+ -t | --transport
+    Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g
+@@ -272,7 +272,7 @@ function main() {
+             shift;;
+        -w | --hardware)
+             case "$2" in
+-                "USRP" | "BLADERF" | "LMSSDR" | "IRIS")
++                "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "OXGRF")
+                     HW="OAI_"$2
+                     TARGET_LIST="$TARGET_LIST oai_${2,,}devif" # ,, makes lowercase
+                     CMAKE_CMD="$CMAKE_CMD -DOAI_$2=ON"
+@@ -457,6 +457,10 @@ function main() {
+         flash_firmware_bladerf
+       fi
+     fi
++    if [ "$HW" == "OAI_OXGRF" ] ; then
++      echo_info "installing packages for OXGRF support"
++      #check_install_oxgrf_driver
++    fi
+     if [ "$HW" == "OAI_IRIS" ] ; then
+       echo_info "installing packages for IRIS support"
+       check_install_soapy
+diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
+index c0b2fa237b..8f9df0e752 100755
+--- a/cmake_targets/tools/build_helper
++++ b/cmake_targets/tools/build_helper
+@@ -400,6 +400,34 @@ install_usrp_uhd_driver() {
+     fi
+ }
+ 
++check_install_oxgrf_driver() {
++#if modinfo riffa > /dev/null 2>&1
++    if modinfo xdma > /dev/null 2>&1
++    then
++      echo_success "OXGRF driver has loaded."
++    else
++      git clone https://github.com/v3best/riffa /tmp/riffa
++      if [ $? -ne 0 ]; then
++        echo_fatal "OXGRF driver download failed, please check your net connection."
++      else
++        cd /tmp/riffa/driver/linux
++        make && $SUDO make install
++        echo_success "OXGRF driver install success, please restart your PC later."
++      fi
++      git clone https://github.com/v3best/liboxgrf /tmp/liboxgrf
++      if [ $? -ne 0 ]; then
++        echo_fatal "OXGRF API download failed, please check your net connection."
++      else
++        cd /tmp/liboxgrf
++        mkdir build
++        cd build
++        cmake ../
++        make && $SUDO make install && $SUDO ldconfig
++        echo_success "OXGRF API install success, please restart your PC later."
++      fi
++    fi
++}
++
+ install_bladerf_driver_from_source(){
+     bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt
+     echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log "
+diff --git a/executables/lte-softmodem.h b/executables/lte-softmodem.h
+index 4143bce3a4..617dafbb7e 100644
+--- a/executables/lte-softmodem.h
++++ b/executables/lte-softmodem.h
+@@ -73,6 +73,7 @@
+ #define CONFIG_HLP_PRB           "Set the PRB, valid values: 6, 25, 50, 100  \n"
+ #define CONFIG_HLP_DLSHIFT       "dynamic shift for LLR compuation for TM3/4 (default 0)\n"
+ #define CONFIG_HLP_USRP_ARGS     "set the arguments to identify USRP (same syntax as in UHD)\n"
++#define CONFIG_HLP_OXGRF_ARGS   "set the arguments to identify OXGRF\n"
+ #define CONFIG_HLP_DMAMAP        "use DMA memory mapping\n"
+ #define CONFIG_HLP_TDD           "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n"
+ #define CONFIG_HLP_TADV          "Set timing_advance\n"
+@@ -104,6 +105,7 @@
+     {"r"  ,               CONFIG_HLP_PRB,         0,               .u8ptr=&(frame_parms[0]->N_RB_DL),   .defintval=25,         TYPE_UINT8,    0},   \
+     {"dlsch-demod-shift", CONFIG_HLP_DLSHIFT,     0,               .iptr=(int32_t *)&dlsch_demod_shift, .defintval=0,          TYPE_INT,      0},   \
+     {"usrp-args",         CONFIG_HLP_USRP_ARGS,   0,               .strptr=&usrp_args,         .defstrval="type=b200",TYPE_STRING,   0},   \
++    {"oxgrf-args",       CONFIG_HLP_OXGRF_ARGS, 0,               .strptr=&oxgrf_args,       .defstrval="dev=pciex:0",TYPE_STRING,   0},   \
+     {"mmapped-dma",       CONFIG_HLP_DMAMAP,      PARAMFLAG_BOOL,  .uptr=&mmapped_dma,                  .defintval=0,          TYPE_INT,      0},   \
+     {"T" ,                CONFIG_HLP_TDD,         PARAMFLAG_BOOL,  .iptr=&tddflag,                      .defintval=0,          TYPE_INT,      0},   \
+     {"A",                 CONFIG_HLP_TADV,        0,               .iptr=&(timingadv),                  .defintval=0,          TYPE_INT,      0},   \
+diff --git a/executables/lte-uesoftmodem.c b/executables/lte-uesoftmodem.c
+index c7e8c9300a..5e7a1dacf4 100644
+--- a/executables/lte-uesoftmodem.c
++++ b/executables/lte-uesoftmodem.c
+@@ -159,6 +159,8 @@ int transmission_mode=1;
+ char *usrp_args=NULL;
+ char *usrp_clksrc=NULL;
+ 
++char *oxgrf_args=NULL;
++
+ THREAD_STRUCT thread_struct;
+ /* struct for ethernet specific parameters given in eNB conf file */
+ eth_params_t *eth_params;
+@@ -470,6 +472,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
+     }
+ 
+     if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;
++    if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args;
+   }
+ }
+ 
+diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
+index 2550001956..d1ffc171f0 100644
+--- a/executables/nr-softmodem-common.h
++++ b/executables/nr-softmodem-common.h
+@@ -103,6 +103,8 @@
+ #define CONFIG_HLP_TX_SUBDEV     "set the arguments to select tx_subdev (same syntax as in UHD)\n"
+ #define CONFIG_HLP_RX_SUBDEV     "set the arguments to select rx_subdev (same syntax as in UHD)\n"
+ 
++#define CONFIG_HLP_OXGRF_ARGS   "set the arguments to identify OXGRF\n"
++
+ #define CONFIG_HLP_FLOG          "Enable online log \n"
+ #define CONFIG_HLP_LOGL          "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n"
+ #define CONFIG_HLP_LOGV          "Set the global log verbosity \n"
+diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
+index c970b1d09d..4a5a3b4025 100644
+--- a/executables/nr-uesoftmodem.c
++++ b/executables/nr-uesoftmodem.c
+@@ -120,6 +120,7 @@ int                 vcdflag = 0;
+ 
+ double          rx_gain_off = 0.0;
+ char             *usrp_args = NULL;
++char           *oxgrf_args = NULL;
+ char             *tx_subdev = NULL;
+ char             *rx_subdev = NULL;
+ char       *rrc_config_path = NULL;
+@@ -363,6 +364,7 @@ void init_openair0(void) {
+     openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
+ 
+     if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args;
++    if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args;
+     if (tx_subdev) openair0_cfg[card].tx_subdev = tx_subdev;
+     if (rx_subdev) openair0_cfg[card].rx_subdev = rx_subdev;
+ 
+diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
+index 3549a7fae1..1ba69e3aa6 100644
+--- a/executables/nr-uesoftmodem.h
++++ b/executables/nr-uesoftmodem.h
+@@ -31,6 +31,7 @@
+ // clang-format off
+ #define CMDLINE_NRUEPARAMS_DESC {  \
+   {"usrp-args",                CONFIG_HLP_USRP_ARGS,           0,               .strptr=&usrp_args,                       .defstrval="type=b200",          TYPE_STRING,   0}, \
++  {"oxgrf-args",              CONFIG_HLP_OXGRF_ARGS,         0,               .strptr=&oxgrf_args,                     .defstrval="dev=pciex:0",        TYPE_STRING,   0}, \
+   {"tx_subdev",                CONFIG_HLP_TX_SUBDEV,           0,               .strptr=&tx_subdev,                       .defstrval=NULL,                 TYPE_STRING,   0}, \
+   {"rx_subdev",                CONFIG_HLP_RX_SUBDEV,           0,               .strptr=&rx_subdev,                       .defstrval=NULL,                 TYPE_STRING,   0}, \
+   {"single-thread-disable",    CONFIG_HLP_NOSNGLT,             PARAMFLAG_BOOL,  .iptr=&single_thread_flag,                .defintval=1,                    TYPE_INT,      0}, \
+diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
+index 5c461b27b0..6a525fefdd 100644
+--- a/openair1/PHY/impl_defs_top.h
++++ b/openair1/PHY/impl_defs_top.h
+@@ -43,6 +43,7 @@
+  * @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface
+  * @defgroup _USRP_PHY_RF_INTERFACE_    PHY - USRP RF Interface
+  * @defgroup _BLADERF_PHY_RF_INTERFACE_    PHY - BLADERF RF Interface
++ * @defgroup _OXGRF_PHY_RF_INTERFACE_    PHY - OXGRF RF Interface
+  * @defgroup _LMSSDR_PHY_RF_INTERFACE_    PHY - LMSSDR RF Interface
+  * @}
+  * @}
+diff --git a/radio/CMakeLists.txt b/radio/CMakeLists.txt
+index 937d8039f9..1dbaaa0c56 100644
+--- a/radio/CMakeLists.txt
++++ b/radio/CMakeLists.txt
+@@ -32,3 +32,8 @@ add_boolean_option(OAI_USRP OFF "Activate OAI's USRP driver" OFF)
+ if(OAI_USRP)
+   add_subdirectory(USRP)
+ endif()
++
++add_boolean_option(OAI_OXGRF OFF "Activate OAI's OXGRF driver" OFF)
++if(OAI_OXGRF)
++  add_subdirectory(OXGRF)
++endif()
+diff --git a/radio/COMMON/common_lib.c b/radio/COMMON/common_lib.c
+index 4d78018d8c..ce804b21f5 100644
+--- a/radio/COMMON/common_lib.c
++++ b/radio/COMMON/common_lib.c
+@@ -44,7 +44,7 @@
+ #include "executables/softmodem-common.h"
+ 
+ const char *const devtype_names[MAX_RF_DEV_TYPE] =
+-    {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"};
++    {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "OXGRF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"};
+ 
+ const char *get_devname(int devtype) {
+   if (devtype < MAX_RF_DEV_TYPE && devtype !=MIN_RF_DEV_TYPE )
+diff --git a/radio/COMMON/common_lib.h b/radio/COMMON/common_lib.h
+index d735fab4f0..d53f9bf02d 100644
+--- a/radio/COMMON/common_lib.h
++++ b/radio/COMMON/common_lib.h
+@@ -93,6 +93,8 @@ typedef enum {
+   USRP_X400_DEV,
+   /*!\brief device is BLADE RF*/
+   BLADERF_DEV,
++  /*!\brief device is OXGRF pcie*/
++  OXGRF_DEV,
+   /*!\brief device is LMSSDR (SoDeRa)*/
+   LMSSDR_DEV,
+   /*!\brief device is Iris */
+diff --git a/radio/OXGRF/CMakeLists.txt b/radio/OXGRF/CMakeLists.txt
+new file mode 100644
+index 0000000000..93ff573534
+--- /dev/null
++++ b/radio/OXGRF/CMakeLists.txt
+@@ -0,0 +1,9 @@
++find_library(oxgrf_ss NAMES oxgrf_ss)
++
++add_library(oai_oxgrfdevif MODULE oxgrf_lib.c)
++target_link_libraries(oai_oxgrfdevif PRIVATE oxgrf_ss)
++target_link_libraries(oai_oxgrfdevif PRIVATE UTIL)
++set_target_properties(oai_oxgrfdevif PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
++add_custom_command(TARGET oai_oxgrfdevif POST_BUILD
++                   COMMAND ${CMAKE_COMMAND} -E create_symlink liboai_oxgrfdevif.so liboai_device.so
++                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+diff --git a/radio/OXGRF/rf_helper.h b/radio/OXGRF/rf_helper.h
+new file mode 100644
+index 0000000000..ee82d49172
+--- /dev/null
++++ b/radio/OXGRF/rf_helper.h
+@@ -0,0 +1,56 @@
++/*
++ * Copyright 2013-2020 Software Radio Systems Limited
++ *
++ * This file is part of srsLTE.
++ *
++ * srsLTE is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Affero General Public License as
++ * published by the Free Software Foundation, either version 3 of
++ * the License, or (at your option) any later version.
++ *
++ * srsLTE is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Affero General Public License for more details.
++ *
++ * A copy of the GNU Affero General Public License can be found in
++ * the LICENSE file in the top-level directory of this distribution
++ * and at http://www.gnu.org/licenses/.
++ *
++ */
++#ifndef OXGRF_RF_HELPER_H_
++#define OXGRF_RF_HELPER_H_
++
++// A bunch of helper functions to process device arguments
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#define REMOVE_SUBSTRING_WITHCOMAS(S, TOREMOVE)                                                                        \
++  remove_substring(S, TOREMOVE ",");                                                                                   \
++  remove_substring(S, TOREMOVE ", ");                                                                                  \
++  remove_substring(S, "," TOREMOVE);                                                                                   \
++  remove_substring(S, ", " TOREMOVE);                                                                                  \
++  remove_substring(S, TOREMOVE)
++
++static inline void remove_substring(char* s, const char* toremove)
++{
++  while ((s = strstr(s, toremove))) {
++    memmove(s, s + strlen(toremove), 1 + strlen(s + strlen(toremove)));
++  }
++}
++
++static inline void copy_subdev_string(char* dst, char* src)
++{
++  int n   = 0;
++  int len = (int)strlen(src);
++  /* Copy until end of string or comma */
++  while (n < len && src[n] != '\0' && src[n] != ',') {
++    dst[n] = src[n];
++    n++;
++  }
++  dst[n] = '\0';
++}
++
++#endif /* OXGRF_RF_HELPER_H_ */
+diff --git a/radio/OXGRF/oxgrf_lib.c b/radio/OXGRF/oxgrf_lib.c
+new file mode 100644
+index 0000000000..0661091bf5
+--- /dev/null
++++ b/radio/OXGRF/oxgrf_lib.c
+@@ -0,0 +1,847 @@
++/*
++ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
++ * contributor license agreements.  See the NOTICE file distributed with
++ * this work for additional information regarding copyright ownership.
++ * The OpenAirInterface Software Alliance licenses this file to You under
++ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
++ * except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.openairinterface.org/?page_id=698
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ *-------------------------------------------------------------------------------
++ * For more information about the OpenAirInterface (OAI) Software Alliance:
++ *      contact@openairinterface.org
++ */
++
++/** oxgrf_lib.c
++ *
++ * Author: eric
++ * base on bladerf_lib.c
++ */
++
++#pragma GCC optimize(3, "Ofast", "inline")
++#include <stdio.h>
++#include <stdlib.h>
++#include <stdbool.h>
++#include <unistd.h>
++#include <string.h>
++#include <inttypes.h>
++#include <math.h>
++#include "oxgrf_lib.h"
++#include "rf_helper.h"
++#include "common/utils/LOG/log.h"
++
++/** @addtogroup _OXGRF_PHY_RF_INTERFACE_
++ * @{
++ */
++#include "openair1/PHY/sse_intrin.h"
++
++//! Number of OXGRF devices
++int num_devices = 0;
++static bool running = false;
++
++#define BUFFER_SIZE    (122880 * 100 * sizeof(int))
++#define NCHAN_PER_DEV  4
++static void *cache_buf[NCHAN_PER_DEV];
++static void *iq_buf[NCHAN_PER_DEV];
++static uint32_t remain = 0;
++static uint32_t RX_MTU = 30720;
++static uint8_t shift = 2;
++
++static inline int channel_to_mask(int channel_count)
++{
++    uint8_t ch_mask;
++    switch (channel_count) {
++    case 4:
++        ch_mask = 0xf;break;
++    case 3:
++        ch_mask = 0x7;break;
++    case 2:
++        ch_mask = 0x3;break;
++    case 1:
++        ch_mask = 0x1;break;
++    default:
++        ch_mask = 0x1;break;
++    }
++
++    return ch_mask;
++}
++
++/*! \brief get current timestamp
++ *\param device the hardware to use
++ *\returns timestamp of OXGRF
++ */
++
++openair0_timestamp trx_get_timestamp(openair0_device *device) {
++    return 0;
++}
++
++/*! \brief Start oxgrf
++ * \param device the hardware to use
++ * \returns 0 on success
++ */
++int trx_oxgrf_start(openair0_device *device) {
++
++    LOG_I(HW, "[oxgrf] Start oxgrf ...\n");
++    running = true;
++
++    return 0;
++}
++
++/*! \brief Called to send samples to the oxgrf RF target
++  \param device pointer to the device structure specific to the RF hardware target
++  \param timestamp The timestamp at whicch the first sample MUST be sent
++  \param buff Buffer which holds the samples
++  \param nsamps number of samples to be sent
++  \param cc index of the component carrier
++  \param flags Ignored for the moment
++  \returns 0 on success
++  */
++static int trx_oxgrf_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
++
++    int status;
++    oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv;
++
++    uint32_t trx_flags = 0;
++    radio_tx_burst_flag_t flags_burst = (radio_tx_burst_flag_t) (flags & 0xf);
++
++    if (flags_burst == TX_BURST_START) {
++        trx_flags = 0;
++    } else if (flags_burst == TX_BURST_END) {
++        trx_flags = 1;
++    } else if (flags_burst == TX_BURST_START_AND_END) {
++        trx_flags = 1;
++    } else if (flags_burst == TX_BURST_MIDDLE) {
++        trx_flags = 0;
++    }
++
++    for(int i = 0; i < cc; i++) {
++        int len = nsamps * 2;
++        int16_t *iq = buff[i];
++#if defined(__x86_64) || defined(__i386__)
++        __m256i a, *b;
++
++        while (len >= 16) {
++            a = *(__m256i *)&iq[0];
++            b = (__m256i *)&iq[0];
++            *b = simde_mm256_slli_epi16(a, 4);
++            iq += 16;
++            len -= 16;
++        }
++#elif defined(__arm__) || defined(__aarch64__)
++        int16x8_t a, *b;
++
++        while (len >= 8) {
++            a = *(int16x8_t *)&iq[0];
++            b = (int16x8_t *)&iq[0];
++            *b = vshlq_n_s16(a, 4);
++            iq += 8;
++            len -= 8;
++        }
++#endif
++        /* remaining data */
++        while (len != 0) {
++            iq[0] <<= 4;
++            iq++;
++            len--;
++        }
++    }
++
++    status = oxgrf_write_samples_multiport(oxgrf->dev, (const void **)buff, nsamps, channel_to_mask(cc), timestamp, trx_flags);
++    if (status < 0) {
++        oxgrf->num_tx_errors++;
++        LOG_E(HW, "[oxgrf] Failed to TX samples\n");
++        exit(-1);
++    }
++
++    //LOG_D(HW, "Provided TX timestamp: %u, nsamps: %u\n", ptimestamp, nsamps);
++
++    oxgrf->tx_current_ts = timestamp;
++    oxgrf->tx_nsamps += nsamps;
++    oxgrf->tx_count++;
++
++    return nsamps;
++}
++
++/*! \brief Receive samples from hardware.
++ * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
++ * the first channel. *ptimestamp is the time at which the first sample
++ * was received.
++ * \param device the hardware to use
++ * \param[out] ptimestamp the time at which the first sample was received.
++ * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
++ * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
++ * \param cc  Index of component carrier
++ * \returns number of samples read
++ */
++static int trx_oxgrf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
++
++    int status;
++    oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv;
++    uint64_t timestamp = 0UL;
++
++retry:
++    if(remain == 0) {
++        int recv = 0;
++        timestamp = 0UL;
++        if(nsamps % RX_MTU) {
++            recv = (nsamps / RX_MTU + 1) * RX_MTU;
++            status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), &timestamp);
++            if (status < 0) {
++                LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps);
++                oxgrf->num_rx_errors++;
++                exit(-1);
++            }
++            for(int i = 0; i < cc; i++)
++                memcpy(buff[i], iq_buf[i], nsamps * 4);
++            if(recv > nsamps) {
++                for(int i = 0; i < cc; i++)
++                    memcpy(cache_buf[i], iq_buf[i] + nsamps * 4, (recv - nsamps) * 4);
++                remain = recv - nsamps;
++            }
++        } else {
++            recv = nsamps;
++            status = oxgrf_read_samples_multiport(oxgrf->dev, buff, recv, channel_to_mask(cc), &timestamp);
++            if (status < 0) {
++                LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps);
++                oxgrf->num_rx_errors++;
++                exit(-1);
++            }
++        }
++
++        *(uint64_t *)ptimestamp = timestamp;
++        oxgrf->rx_current_ts = timestamp + nsamps;
++        //LOG_D(HW, "case 0: Current RX timestamp  %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n",  *ptimestamp, timestamp, nsamps, remain, recv);
++    } else if(remain >= nsamps) {
++        for(int i = 0; i < cc; i++)
++            memcpy(buff[i], cache_buf[i], nsamps * 4);
++        remain -= nsamps;
++        if(remain > 0) {
++            for(int i = 0; i < cc; i++)
++                memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4);
++        }
++        *(uint64_t *)ptimestamp = oxgrf->rx_current_ts;
++        oxgrf->rx_current_ts += nsamps;
++        //LOG_D(HW, "case 1: Current RX timestamp  %"PRIu64", nsamps %u, remain %u\n",  *ptimestamp, nsamps, remain);
++    } else {
++        int recv;
++        if(remain + RX_MTU >= nsamps)
++            recv = RX_MTU;
++        else
++            recv = (nsamps / RX_MTU + 1) * RX_MTU;
++        timestamp = 0UL;
++        status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), &timestamp);
++        if (status < 0) {
++            LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps);
++            oxgrf->num_rx_errors++;
++            exit(-1);
++        }
++        if(timestamp != (oxgrf->rx_current_ts + remain)) {
++            int overflow = timestamp - (oxgrf->rx_current_ts + remain);
++            LOG_W(HW, "Rx overflow %u samples\n", overflow);
++            //remain += overflow;
++            remain = 0;
++            goto retry;
++        }
++        for(int i = 0; i < cc; i++)
++            memcpy(cache_buf[i] + remain * 4, iq_buf[i], recv * 4);
++        for(int i = 0; i < cc; i++)
++            memcpy(buff[i], cache_buf[i], nsamps * 4);
++        remain = recv + remain - nsamps;
++        for(int i = 0; i < cc; i++)
++            memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4);
++
++        *(uint64_t *)ptimestamp = oxgrf->rx_current_ts;
++        oxgrf->rx_current_ts += nsamps;
++        //LOG_D(HW, "case 2: Current RX timestamp  %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n",  *ptimestamp, timestamp, nsamps, remain, recv);
++    }
++
++    for(int i = 0; i < cc; i++) {
++        int len = nsamps * 2;
++        int16_t *iq = buff[i];
++#if defined(__x86_64__) || defined(__i386__)
++        __m256i a, *b;
++
++        while (len >= 16) {
++            a = *(__m256i *)&iq[0];
++            b = (__m256i *)&iq[0];
++            *b = simde_mm256_srai_epi16(a, shift);
++            iq += 16;
++            len -= 16;
++        }
++#elif defined(__arm__) || defined(__aarch64__)
++        int16x8_t a, *b;
++
++        while (len >= 8) {
++            a = *(int16x8_t *)&iq[0];
++            b = (int16x8_t *)&iq[0];
++            *b = vshrq_n_s16(a, shift);
++            iq += 8;
++            len -= 8;
++        }
++#endif
++        /* remaining data */
++        while (len != 0) {
++            iq[0] >>= shift;
++            iq++;
++            len--;
++        }
++    }
++    //LOG_D(HW, "Current RX timestamp  %"PRIu64", nsamps %u\n",  *ptimestamp, nsamps);
++    oxgrf->rx_nsamps += nsamps;
++    oxgrf->rx_count++;
++
++    return nsamps;
++
++}
++
++/*! \brief Terminate operation of the oxgrf transceiver -- free all associated resources
++ * \param device the hardware to use
++ */
++void trx_oxgrf_end(openair0_device *device) {
++
++    oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv;
++
++    if(!running)
++        return;
++    running = false;
++
++    LOG_I(HW, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
++    for(int i = 0; i < oxgrf->tx_num_channels; i++) {
++        uint32_t count = 0;
++        oxgrf_get_channel_event(oxgrf->dev, TX_CHANNEL_TIMEOUT, i+1, &count);
++        LOG_I(HW, "[oxgrf] TX%d Channel timeout: %u\n", i+1, count);
++    }
++    for(int i = 0; i < oxgrf->rx_num_channels; i++) {
++        uint32_t count = 0;
++        oxgrf_get_channel_event(oxgrf->dev, RX_CHANNEL_OVERFLOW, i+1, &count);
++        LOG_I(HW, "[oxgrf] RX%d Channel overflow: %u\n", i+1, count);
++    }
++    LOG_I(HW, "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
++
++    oxgrf_close_device(oxgrf->dev);
++
++    return;
++}
++
++/*! \brief print the oxgrf statistics 
++ * \param device the hardware to use
++ * \returns  0 on success
++ */
++int trx_oxgrf_get_stats(openair0_device* device) {
++    return(0);
++}
++
++/*! \brief Reset the oxgrf statistics 
++ * \param device the hardware to use
++ * \returns  0 on success
++ */
++int trx_oxgrf_reset_stats(openair0_device* device) {
++    return(0);
++
++}
++
++/*! \brief Stop oxgrf
++ * \param card the hardware to use
++ * \returns 0 in success 
++ */
++int trx_oxgrf_stop(openair0_device* device) {
++    return(0);
++}
++
++/*! \brief Set frequencies (TX/RX)
++ * \param device the hardware to use
++ * \param openair0_cfg RF frontend parameters set by application
++ * \param dummy dummy variable not used
++ * \returns 0 in success
++ */
++int trx_oxgrf_set_freq(openair0_device* device, openair0_config_t *openair0_cfg) {
++
++    int status;
++    oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv;
++
++    if(oxgrf->tx_lo_freq != openair0_cfg->tx_freq[0]) {
++        if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->tx_freq[0]))) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set TX frequency\n");
++        } else {
++            LOG_I(HW, "[oxgrf] set TX frequency to %lu\n",(uint64_t)(openair0_cfg->tx_freq[0]));
++            oxgrf->tx_lo_freq = openair0_cfg->tx_freq[0];
++        }
++    }
++
++    if(oxgrf->rx_lo_freq != openair0_cfg->rx_freq[0]) {
++        if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set RX frequency\n");
++        } else {
++            LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0]));
++            oxgrf->rx_lo_freq = openair0_cfg->rx_freq[0];
++        }
++    }
++
++    return(0);
++
++}
++
++/*! \brief calibration table for OXGRF */
++rx_gain_calib_table_t calib_table_oxgrf[] = {
++    {3500000000.0, 72.0},
++    {2660000000.0, 72.0},
++    {2300000000.0, 72.0},
++    {1880000000.0, 72.0},
++    {816000000.0,  72.0},
++    {-1,0}
++};
++
++/*! \brief set RX gain offset from calibration table
++ * \param openair0_cfg RF frontend parameters set by application
++ * \param chain_index RF chain ID
++ */
++void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
++
++    int i = 0;
++    // loop through calibration table to find best adjustment factor for RX frequency
++    double min_diff = 6e9, diff;
++
++    while (openair0_cfg->rx_gain_calib_table[i].freq > 0) {
++        diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq);
++        printf("cal %d: freq %f, offset %f, diff %f\n",
++                i,
++                openair0_cfg->rx_gain_calib_table[i].freq,
++                openair0_cfg->rx_gain_calib_table[i].offset, diff);
++        if (min_diff > diff) {
++            min_diff = diff;
++            openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset;
++        }
++        i++;
++    }
++}
++
++/*! \brief Set Gains (TX/RX)
++ * \param device the hardware to use
++ * \param openair0_cfg openair0 Config structure
++ * \returns 0 in success
++ */
++int trx_oxgrf_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) {
++
++    int ret = 0;
++    oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv;
++
++    if (openair0_cfg->rx_gain[0] > 65+openair0_cfg->rx_gain_offset[0]) {
++        LOG_E(HW, "[oxgrf] Reduce RX Gain 0 by %f dB\n", openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0] - 65);
++        return -1;
++    }
++
++    if ((ret = oxgrf_set_rx1_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0]))) < 0) {
++        LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n");
++    } else
++        LOG_I(HW, "[oxgrf] set RX1 gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[0]));
++
++    if(oxgrf->rx_num_channels > 1) {
++        if ((ret = oxgrf_set_rx2_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[1] - openair0_cfg->rx_gain_offset[0]))) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[1]));
++    }
++#if 0
++    if ((ret = oxgrf_set_tx1_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[0] * 1000)) < 0) {
++        LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n");
++    } else
++        LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]);
++
++    if(oxgrf->tx_num_channels > 1) {
++        if ((ret = oxgrf_set_tx2_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[1] * 1000)) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n");
++        } else
++            LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]);
++    }
++#endif
++    return(ret);
++}
++
++/*! \brief Initialize Openair oxgrf target. It returns 0 if OK
++ * \param device the hardware to use
++ * \param openair0_cfg RF frontend parameters set by application
++ * \returns 0 on success
++ */
++int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
++
++    int status;
++
++    oxgrf_state_t *oxgrf = (oxgrf_state_t*)malloc(sizeof(oxgrf_state_t));
++    memset(oxgrf, 0, sizeof(oxgrf_state_t));
++
++    LOG_I(HW, "[oxgrf] openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs);
++    LOG_I(HW, "[oxgrf] openair0_cfg[0].rx_num_channels == '%d'\n", openair0_cfg[0].rx_num_channels);
++    LOG_I(HW, "[oxgrf] openair0_cfg[0].tx_num_channels == '%d'\n", openair0_cfg[0].tx_num_channels);
++
++    openair0_cfg[0].rx_gain_calib_table = calib_table_oxgrf;
++    set_rx_gain_offset(openair0_cfg, 0);
++    if(oxgrf->rx_num_channels > 1)
++        set_rx_gain_offset(openair0_cfg, 1);
++    openair0_cfg->iq_txshift = 0;
++    openair0_cfg->iq_rxrescale = 15; /*not sure*/ //FIXME: adjust to oxgrf
++    oxgrf->sample_rate = (unsigned int)openair0_cfg->sample_rate;
++    LOG_I(HW, "[oxgrf] sampling_rate %d\n", oxgrf->sample_rate);
++    oxgrf->rx_num_channels = openair0_cfg[0].rx_num_channels;
++    oxgrf->tx_num_channels = openair0_cfg[0].tx_num_channels;
++
++    RX_MTU = openair0_cfg->sample_rate / 1000 / 2;
++    if(RX_MTU > 30720)
++        RX_MTU = 30720;
++    else if(!(RX_MTU % 5760))
++        RX_MTU = 5760;
++
++    bool rx_ant = true;
++    bool pa_status = false;
++    int auxdac1 = 0;
++    char args[64];
++    if (openair0_cfg[0].sdr_addrs == NULL) {
++        strcpy(args, "dev=pciex:0");
++    } else {
++        strcpy(args, openair0_cfg[0].sdr_addrs);
++    }
++
++    char dev_str[64];
++    const char dev_arg[] = "dev=";
++    char *dev_ptr = strstr(args, dev_arg);
++    if(dev_ptr) {
++        copy_subdev_string(dev_str, dev_ptr + strlen(dev_arg));
++        remove_substring(args, dev_arg);
++        remove_substring(args, dev_str);
++        LOG_I(HW, "[oxgrf] Using %s\n", dev_str);
++    }
++
++    const char auxdac1_arg[] = "auxdac1=";
++    char auxdac1_str[64] = {0};
++    char *auxdac1_ptr = strstr(args, auxdac1_arg);
++    if(auxdac1_ptr) {
++        copy_subdev_string(auxdac1_str, auxdac1_ptr + strlen(auxdac1_arg));
++        remove_substring(args, auxdac1_arg);
++        remove_substring(args, auxdac1_str);
++        auxdac1 = atoi(auxdac1_str);
++        LOG_I(HW, "[oxgrf] Setting auxdac1:%u\n", auxdac1);
++    }
++
++    const char pa_arg[] = "pa=";
++    char pa_str[64] = {0};
++    char *pa_ptr = strstr(args, pa_arg);
++    if(pa_ptr) {
++        copy_subdev_string(pa_str, pa_ptr + strlen(pa_arg));
++        remove_substring(args, pa_arg);
++        remove_substring(args, pa_str);
++        pa_status = !strcmp(pa_str, "enabled");
++        LOG_I(HW, "[oxgrf] PA Status:%s\n", pa_status?"Enabled":"Disabled");
++    }
++
++    const char ant_arg[] = "rx_ant=";
++    char ant_str[64] = {0};
++    char *ant_ptr = strstr(args, ant_arg);
++    if(ant_ptr) {
++        copy_subdev_string(ant_str, ant_ptr + strlen(ant_arg));
++        remove_substring(args, ant_arg);
++        remove_substring(args, ant_str);
++        rx_ant = strcmp(ant_str, "trx");
++    }
++
++    char dstring[128];
++    if(RX_MTU < 30720) {
++        sprintf(dstring, ",nsamples_recv_frame:%u", RX_MTU);
++        strcat(dev_str, dstring);
++    }
++    if ((oxgrf->dev = oxgrf_open_device(dev_str)) == NULL ) {
++        LOG_E(HW, "[oxgrf] Failed to open oxgrf\n");
++        free(oxgrf);
++        return -1;
++    }
++
++    uint32_t model = 0;
++    oxgrf_get_model_version(oxgrf->dev, &model);
++    model &= 0xffff;
++    if(model == 550) {
++        oxgrf->BoardType = Y550;
++        shift = 4;
++        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
++    } else if(model == 230) {
++        oxgrf->BoardType = Y230;
++        shift = 4;
++        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
++    } else if(model == 380) {
++        oxgrf->BoardType = Y380;
++        shift = 4;
++        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
++    } else if(model == 590) {
++        oxgrf->BoardType = Y590;
++        shift = 2;
++        LOG_I(HW, "[oxgrf] device type: Y%d\n", model);
++    } else if(model == 7400) {
++        oxgrf->BoardType = IQX7400;
++        shift = 2;
++        LOG_I(HW, "[oxgrf] device type: IQX%d\n", model);
++    } else if(model == 7402) {
++        oxgrf->BoardType = IQX7402;
++        shift = 2;
++        LOG_I(HW, "[oxgrf] device type: IQX%d(Split Mode)\n", model - 2);
++    } else if(model == 6000 || model == 7000 || model == 7100) {
++        oxgrf->BoardType = IQX7000;
++        shift = 4;
++        LOG_I(HW, "[oxgrf] device type: IQX%d\n", model);
++    } else {
++        oxgrf->BoardType = UNKNOWN;
++        LOG_I(HW, "[oxgrf] device type: unknown\n");
++    }
++
++    if(oxgrf->BoardType == Y230) {
++        switch ((int)openair0_cfg->sample_rate) {
++#if 0
++        case 61440000:
++            openair0_cfg->samples_per_packet    = 30720;
++            openair0_cfg->tx_sample_advance     = 80;
++            openair0_cfg[0].tx_bw               = 40e6;
++            openair0_cfg[0].rx_bw               = 40e6;
++            break;
++        case 46080000:
++            openair0_cfg->samples_per_packet    = 23040;
++            openair0_cfg->tx_sample_advance     = 80;
++            openair0_cfg[0].tx_bw               = 40e6;
++            openair0_cfg[0].rx_bw               = 40e6;
++            break;
++#endif
++        case 30720000:
++            openair0_cfg->samples_per_packet    = 15360;
++            openair0_cfg->tx_sample_advance     = 80;
++            openair0_cfg[0].tx_bw               = 20e6;
++            openair0_cfg[0].rx_bw               = 20e6;
++            break;
++        case 23040000:
++            openair0_cfg->samples_per_packet    = 11520;
++            openair0_cfg->tx_sample_advance     = 80;
++            openair0_cfg[0].tx_bw               = 20e6;
++            openair0_cfg[0].rx_bw               = 20e6;
++            break;
++        case 15360000:
++            openair0_cfg->samples_per_packet    = 7680;
++            openair0_cfg->tx_sample_advance     = 52;
++            openair0_cfg[0].tx_bw               = 10e6;
++            openair0_cfg[0].rx_bw               = 10e6;
++            break;
++        case 7680000:
++            openair0_cfg->samples_per_packet    = 7680;
++            openair0_cfg->tx_sample_advance     = 34;
++            openair0_cfg[0].tx_bw               = 5e6;
++            openair0_cfg[0].rx_bw               = 5e6;
++            break;
++        case 1920000:
++            openair0_cfg->samples_per_packet    = 1920;
++            openair0_cfg->tx_sample_advance     = 9;
++            openair0_cfg[0].tx_bw               = 1.25e6;
++            openair0_cfg[0].rx_bw               = 1.25e6;
++            break;
++        default:
++            LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate);
++            free(oxgrf);
++            exit(-1);
++            break;
++        }
++    }
++    if(oxgrf->BoardType == Y380
++            || oxgrf->BoardType == Y550
++            || oxgrf->BoardType == Y590
++            || oxgrf->BoardType == IQX7000
++            || oxgrf->BoardType == IQX7402
++            || oxgrf->BoardType == IQX7400) {
++        switch ((int)openair0_cfg->sample_rate) {
++        case 122880000:
++            openair0_cfg->samples_per_packet    = 30720;
++            openair0_cfg->tx_sample_advance     = 80;
++            openair0_cfg[0].tx_bw               = 100e6;
++            openair0_cfg[0].rx_bw               = 100e6;
++            break;
++        case 61440000:
++            openair0_cfg->samples_per_packet    = 30720;
++            openair0_cfg->tx_sample_advance     = 80;
++            openair0_cfg[0].tx_bw               = 40e6;
++            openair0_cfg[0].rx_bw               = 40e6;
++            break;
++        case 30720000:
++            openair0_cfg->samples_per_packet    = 15360;
++            openair0_cfg->tx_sample_advance     = 80;
++            openair0_cfg[0].tx_bw               = 20e6;
++            openair0_cfg[0].rx_bw               = 20e6;
++            break;
++        case 15360000:
++            openair0_cfg->samples_per_packet    = 15360;
++            openair0_cfg->tx_sample_advance     = 52;
++            openair0_cfg[0].tx_bw               = 10e6;
++            openair0_cfg[0].rx_bw               = 10e6;
++            break;
++        case 7680000:
++            openair0_cfg->samples_per_packet    = 7680;
++            openair0_cfg->tx_sample_advance     = 34;
++            openair0_cfg[0].tx_bw               = 5e6;
++            openair0_cfg[0].rx_bw               = 5e6;
++            break;
++        case 1920000:
++            openair0_cfg->samples_per_packet    = 1920;
++            openair0_cfg->tx_sample_advance     = 9;
++            openair0_cfg[0].tx_bw               = 1.25e6;
++            openair0_cfg[0].rx_bw               = 1.25e6;
++            break;
++        default:
++            LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate);
++            free(oxgrf);
++            exit(-1);
++            break;
++        }
++
++    }
++
++    LOG_I(HW, "[oxgrf] Initializing openair0_device\n");
++    switch (openair0_cfg[0].clock_source) {
++    case external:
++        LOG_I(HW, "[oxgrf] clock_source: external\n");
++        oxgrf_set_ref_clock (oxgrf->dev, 0, EXTERNAL_REFERENCE);
++        oxgrf_set_pps_select (oxgrf->dev, 0, PPS_EXTERNAL_EN);
++        break;
++    case gpsdo:
++        LOG_I(HW, "[oxgrf] clock_source: gpsdo\n");
++        break;
++    case internal:
++    default:
++        oxgrf_set_ref_clock (oxgrf->dev, 0, INTERNAL_REFERENCE);
++        oxgrf_set_pps_select (oxgrf->dev, 0, PPS_INTERNAL_EN);
++        //oxgrf_set_vco_select (oxgrf->dev, 0, AUXDAC1);
++        LOG_I(HW, "[oxgrf] clock_source: internal\n");
++        break;
++    }
++    oxgrf_set_auxdac1 (oxgrf->dev, 0, auxdac1);
++    if (pa_status) {
++        oxgrf_set_duplex_select (oxgrf->dev, 0, FDD);
++        oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1);
++        oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0);
++    } else if (openair0_cfg->duplex_mode == duplex_mode_TDD && !rx_ant) {
++        oxgrf_set_duplex_select (oxgrf->dev, 0, TDD);
++        oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1);
++        oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0);
++    } else {
++        oxgrf_set_duplex_select (oxgrf->dev, 0, FDD);
++        oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 0);
++        oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 1);
++    }
++    LOG_I(HW, "[oxgrf] RX Ant:%s\n", rx_ant?"Enabled":"Disabled");
++    oxgrf_set_tx_fir_en_dis (oxgrf->dev, 0, 0);
++    oxgrf_set_rx_fir_en_dis (oxgrf->dev, 0, 0);
++
++    int max_idx = ((oxgrf->rx_num_channels > 2 || oxgrf->tx_num_channels > 2)? 1 : 0);
++
++    for(int chip_idx = 0; chip_idx <= max_idx; chip_idx++) {
++        // RX port Initialize
++        if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set RX frequency\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0]));
++        if ((status = oxgrf_set_rx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->sample_rate))) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set RX sample rate\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX sample rate to %u\n", (uint32_t)(openair0_cfg->sample_rate));
++        if ((status = oxgrf_set_rx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->rx_bw))) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set RX bandwidth\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX bandwidth to %u\n",(uint32_t)(openair0_cfg->rx_bw));
++
++        if ((status = oxgrf_set_rx1_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){
++            LOG_E(HW, "[oxgrf] Failed to set RX1 Gain Control Mode\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX1 Gain Control Mode MGC\n");
++
++        uint32_t rxgain = openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0];
++        if (rxgain > 30)
++            rxgain = 60;
++        else
++            rxgain *= 2;
++        if ((status = oxgrf_set_rx1_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) {
++            LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX1 gain to %u\n", rxgain);
++
++        if ((status = oxgrf_set_rx2_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){
++            LOG_E(HW, "[oxgrf] Failed to set RX2 Gain Control Mode\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX2 Gain Control Mode MGC\n");
++
++        if ((status = oxgrf_set_rx2_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n");
++        } else
++            LOG_I(HW, "[oxgrf] set RX2 gain to %u\n", rxgain);
++
++        // TX port Initialize
++        if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)openair0_cfg->tx_freq[0])) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set TX frequency\n");
++        } else
++            LOG_I(HW, "[oxgrf] set TX Frequency to %lu\n", (uint64_t)openair0_cfg->tx_freq[0]);
++
++        if ((status = oxgrf_set_tx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->sample_rate)) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set TX sample rate\n");
++        } else
++            LOG_I(HW, "[oxgrf] set TX sampling rate to %u\n", (uint32_t)openair0_cfg->sample_rate);
++
++        if ((status = oxgrf_set_tx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->tx_bw)) <0) {
++            LOG_E(HW, "[oxgrf] Failed to set TX bandwidth\n");
++        } else
++            LOG_I(HW, "[oxgrf] set TX bandwidth to %u\n", (uint32_t)openair0_cfg->tx_bw);
++
++        if ((status = oxgrf_set_tx1_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[0] * 1000)) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n");
++        } else
++            LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]);
++
++        if ((status = oxgrf_set_tx2_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[1] * 1000)) < 0) {
++            LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n");
++        } else
++            LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]);
++    }
++
++    uint32_t depth = oxgrf->sample_rate / 10 * sizeof(int) * oxgrf->tx_num_channels;
++    oxgrf_set_hwbuf_depth(oxgrf->dev, 0, depth);
++
++    oxgrf_enable_timestamp(oxgrf->dev, 0, 0);
++    sleep(2);
++    oxgrf_enable_timestamp(oxgrf->dev, 0, 1);
++    sleep(2);
++
++    for(int i = 0; i < NCHAN_PER_DEV; i++) {
++        int ret = posix_memalign((void **)&cache_buf[i], 4096, BUFFER_SIZE);
++        if(ret) {
++            LOG_I(HW, "Failed to alloc memory\n");
++            return -1;
++        }
++        ret = posix_memalign((void **)&iq_buf[i], 4096, BUFFER_SIZE);
++        if(ret) {
++            LOG_I(HW, "Failed to alloc memory\n");
++            return -1;
++        }
++    }
++
++    device->Mod_id               = num_devices++;
++    device->type                 = OXGRF_DEV;
++    device->trx_start_func       = trx_oxgrf_start;
++    device->trx_end_func         = trx_oxgrf_end;
++    device->trx_read_func        = trx_oxgrf_read;
++    device->trx_write_func       = trx_oxgrf_write;
++    device->trx_get_stats_func   = trx_oxgrf_get_stats;
++    device->trx_reset_stats_func = trx_oxgrf_reset_stats;
++    device->trx_stop_func        = trx_oxgrf_stop;
++    device->trx_set_freq_func    = trx_oxgrf_set_freq;
++    device->trx_set_gains_func   = trx_oxgrf_set_gains;
++    device->openair0_cfg         = openair0_cfg;
++    device->priv                 = (void *)oxgrf;
++
++    return 0;
++}
++
++/*@}*/
+diff --git a/radio/OXGRF/oxgrf_lib.h b/radio/OXGRF/oxgrf_lib.h
+new file mode 100644
+index 0000000000..877f2fbd6e
+--- /dev/null
++++ b/radio/OXGRF/oxgrf_lib.h
+@@ -0,0 +1,97 @@
++/*
++ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
++ * contributor license agreements.  See the NOTICE file distributed with
++ * this work for additional information regarding copyright ownership.
++ * The OpenAirInterface Software Alliance licenses this file to You under
++ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
++ * except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ *      http://www.openairinterface.org/?page_id=698
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ *-------------------------------------------------------------------------------
++ * For more information about the OpenAirInterface (OAI) Software Alliance:
++ *      contact@openairinterface.org
++ */
++
++/** oxgrf_lib.h
++ *
++ * Author: eric
++ * base on bladerf_lib.h
++ */
++
++#include "oxgrf_api_ss.h"
++#include "common_lib.h"
++
++/** @addtogroup _OXGRF_PHY_RF_INTERFACE_
++ * @{
++ */
++
++typedef enum {
++    Y230,
++    Y380,
++    Y550,
++    Y590,
++    IQX6000,
++    IQX7000,
++    IQX7100,
++    IQX7400,
++    IQX7402,  //split
++    UNKNOWN = -1,
++} OXGRFBoardType;
++
++/*! \brief OXGRF specific data structure */ 
++typedef struct {
++
++  //! opaque OXGRF device struct. An empty ("") or NULL device identifier will result in the first encountered device being opened (using the first discovered backend)
++  OXGRF_DESCRIPTOR *dev;
++  int16_t *rx_buffer;
++  int16_t *tx_buffer;
++  //! Sample rate
++  unsigned int sample_rate;
++
++  int rx_num_channels;
++  int tx_num_channels;
++  uint64_t tx_lo_freq;
++  uint64_t rx_lo_freq;
++
++  // --------------------------------
++  // Debug and output control
++  // --------------------------------
++  //! Number of underflows
++  int num_underflows;
++  //! Number of overflows
++  int num_overflows;
++  //! number of RX errors
++  int num_rx_errors;
++  //! Number of TX errors
++  int num_tx_errors;
++
++  //! timestamp of current TX
++  uint64_t tx_current_ts;
++  //! timestamp of current RX
++  uint64_t rx_current_ts;
++  //! number of TX samples
++  uint64_t tx_nsamps;
++  //! number of RX samples
++  uint64_t rx_nsamps;
++  //! number of TX count
++  uint64_t tx_count;
++  //! number of RX count
++  uint64_t rx_count;
++  //! timestamp of RX packet
++  openair0_timestamp rx_timestamp;
++  OXGRFBoardType BoardType;
++} oxgrf_state_t;
++
++/*! \brief get current timestamp
++ *\param device the hardware to use 
++ */
++openair0_timestamp trx_get_timestamp(openair0_device *device);
++
++/*@}*/
+diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf
+new file mode 100644
+index 0000000000..bed89a7119
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf
+@@ -0,0 +1,223 @@
++Active_eNBs = ( "eNB_Eurecom_LTEBox");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++eNBs =
++(
++ {
++    ////////// Identification parameters:
++    eNB_ID    =  0xe00;
++
++    cell_type =  "CELL_MACRO_ENB";
++
++    eNB_name  =  "eNB_Eurecom_LTEBox";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code = 1;
++
++    plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } );
++
++    tr_s_preference     = "local_mac"
++
++    ////////// Physical parameters:
++
++    component_carriers = (
++      {
++      node_function             = "eNodeB_3GPP";
++      node_timing               = "synch_to_ext_device";
++      node_synch_ref            = 0;
++      frame_type					      = "FDD";
++      tdd_config 					      = 3;
++      tdd_config_s            			      = 0;
++      prefix_type             			      = "NORMAL";
++      eutra_band              			      = 7;
++      downlink_frequency      			      = 2680000000L;
++      uplink_frequency_offset 			      = -120000000;
++      Nid_cell					      = 0;
++      N_RB_DL                 			      = 100;
++      Nid_cell_mbsfn          			      = 0;
++      nb_antenna_ports                                = 1;
++      nb_antennas_tx          			      = 1;
++      nb_antennas_rx          			      = 1;
++      tx_gain                                            = 90;
++      rx_gain                                            = 102;
++      pbch_repetition                                 = "FALSE";
++      prach_root              			      = 0;
++      prach_config_index      			      = 0;
++      prach_high_speed        			      = "DISABLE";
++      prach_zero_correlation  			      = 1;
++      prach_freq_offset       			      = 2;
++      pucch_delta_shift       			      = 1;
++      pucch_nRB_CQI           			      = 1;
++      pucch_nCS_AN            			      = 0;
++      pucch_n1_AN             			      = 0;
++      pdsch_referenceSignalPower 			      = 0;
++      pdsch_p_b                  			      = 0;
++      pusch_n_SB                 			      = 1;
++      pusch_enable64QAM          			      = "DISABLE";
++      pusch_hoppingMode                                  = "interSubFrame";
++      pusch_hoppingOffset                                = 0;
++      pusch_groupHoppingEnabled  			      = "ENABLE";
++      pusch_groupAssignment      			      = 0;
++      pusch_sequenceHoppingEnabled		   	      = "DISABLE";
++      pusch_nDMRS1                                       = 1;
++      phich_duration                                     = "NORMAL";
++      phich_resource                                     = "ONESIXTH";
++      srs_enable                                         = "DISABLE";
++      /*  srs_BandwidthConfig                                =;
++      srs_SubframeConfig                                 =;
++      srs_ackNackST                                      =;
++      srs_MaxUpPts                                       =;*/
++
++      pusch_p0_Nominal                                   = -96;
++      pusch_alpha                                        = "AL1";
++      pucch_p0_Nominal                                   = -104;
++      msg3_delta_Preamble                                = 6;
++      pucch_deltaF_Format1                               = "deltaF2";
++      pucch_deltaF_Format1b                              = "deltaF3";
++      pucch_deltaF_Format2                               = "deltaF0";
++      pucch_deltaF_Format2a                              = "deltaF0";
++      pucch_deltaF_Format2b		    	      = "deltaF0";
++
++      rach_numberOfRA_Preambles                          = 64;
++      rach_preamblesGroupAConfig                         = "DISABLE";
++      /*
++      rach_sizeOfRA_PreamblesGroupA                      = ;
++      rach_messageSizeGroupA                             = ;
++      rach_messagePowerOffsetGroupB                      = ;
++      */
++      rach_powerRampingStep                              = 4;
++      rach_preambleInitialReceivedTargetPower            = -108;
++      rach_preambleTransMax                              = 10;
++      rach_raResponseWindowSize                          = 10;
++      rach_macContentionResolutionTimer                  = 48;
++      rach_maxHARQ_Msg3Tx                                = 4;
++
++      pcch_default_PagingCycle                           = 128;
++      pcch_nB                                            = "oneT";
++      bcch_modificationPeriodCoeff			      = 2;
++      ue_TimersAndConstants_t300			      = 1000;
++      ue_TimersAndConstants_t301			      = 1000;
++      ue_TimersAndConstants_t310			      = 1000;
++      ue_TimersAndConstants_t311			      = 10000;
++      ue_TimersAndConstants_n310			      = 20;
++      ue_TimersAndConstants_n311			      = 1;
++      ue_TransmissionMode                                    = 1;
++      }
++    );
++
++
++    srb1_parameters :
++    {
++        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
++        timer_poll_retransmit    = 80;
++
++        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
++        timer_reordering         = 35;
++
++        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
++        timer_status_prohibit    = 0;
++
++        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
++        poll_pdu                 =  4;
++
++        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
++        poll_byte                =  99999;
++
++        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
++        max_retx_threshold       =  4;
++    }
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// MME parameters:
++    mme_ip_address      = ( { ipv4       = "192.168.0.80";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++    enable_measurement_reports = "no";
++
++    ///X2
++    enable_x2 = "no";
++    t_reloc_prep      = 1000;      /* unit: millisecond */
++    tx2_reloc_overall = 2000;      /* unit: millisecond */
++    t_dc_prep         = 1000;      /* unit: millisecond */
++    t_dc_overall      = 2000;      /* unit: millisecond */
++
++    NETWORK_INTERFACES :
++    {
++        ENB_INTERFACE_NAME_FOR_S1_MME            = "eno2";
++        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.0.202/24";
++        ENB_INTERFACE_NAME_FOR_S1U               = "eno2";
++        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.0.202/24";
++        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
++
++        ENB_IPV4_ADDRESS_FOR_X2C                 = "192.168.0.202/24";
++        ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
++    };
++  }
++);
++
++MACRLCs = (
++	{
++	num_cc = 1;
++	tr_s_preference = "local_L1";
++	tr_n_preference = "local_RRC";
++        puSch10xSnr     =  200;
++        puCch10xSnr     =  200;
++        }  
++);
++
++L1s = (
++    	{
++	num_cc = 1;
++	tr_n_preference = "local_mac";
++        }  
++);
++
++RUs = (
++    {		  
++       local_rf       = "yes"
++         nb_tx          = 1
++         nb_rx          = 1
++         att_tx         = 0
++         att_rx         = 3;
++         bands          = [7];
++         max_pdschReferenceSignalPower = -27;
++         max_rxgain                    = 102;
++         eNB_instances  = [0];
++         sdr_addrs = "dev=pciex:0,auxdac1=1620";
++         clock_src = "internal";
++    }
++);  
++
++THREAD_STRUCT = (
++  {
++    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++    parallel_config    = "PARALLEL_SINGLE_THREAD";
++    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++    worker_config      = "WORKER_ENABLE";
++  }
++);
++
++     log_config :
++     {
++       global_log_level                      ="info";
++       hw_log_level                          ="info";
++       phy_log_level                         ="info";
++       mac_log_level                         ="info";
++       rlc_log_level                         ="info";
++       pdcp_log_level                        ="info";
++       rrc_log_level                         ="info";
++    };
++
+diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf
+new file mode 100644
+index 0000000000..62f4bd0135
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf
+@@ -0,0 +1,309 @@
++Active_eNBs = ( "eNB-Eurecom-LTEBox");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++eNBs =
++(
++ {
++    ////////// Identification parameters:
++    eNB_ID    =  0xe00;
++
++    cell_type =  "CELL_MACRO_ENB";
++
++    eNB_name  =  "eNB-Eurecom-LTEBox";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code  =  1;
++
++    plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } );
++
++    tr_s_preference     = "local_mac"
++
++    ////////// Physical parameters:
++
++    component_carriers = (
++      {
++      node_function             = "3GPP_eNODEB";
++      node_timing               = "synch_to_ext_device";
++      node_synch_ref            = 0;
++      frame_type					      = "FDD";
++      tdd_config 					      = 3;
++      tdd_config_s            			      = 0;
++      prefix_type             			      = "NORMAL";
++      eutra_band              			      = 7;
++      downlink_frequency      			      = 2685000000L;
++      uplink_frequency_offset 			      = -120000000;
++      Nid_cell					      = 0;
++      N_RB_DL                 			      = 50;
++      Nid_cell_mbsfn          			      = 0;
++      nb_antenna_ports                                = 1;
++      nb_antennas_tx          			      = 1;
++      nb_antennas_rx          			      = 1;
++      tx_gain                                            = 89;
++      rx_gain                                            = 102;
++      pbch_repetition                                 = "FALSE";
++      prach_root              			      = 0;
++      prach_config_index      			      = 0;
++      prach_high_speed        			      = "DISABLE";
++      prach_zero_correlation  			      = 1;
++      prach_freq_offset       			      = 2;
++      pucch_delta_shift       			      = 1;
++      pucch_nRB_CQI           			      = 0;
++      pucch_nCS_AN            			      = 0;
++      pucch_n1_AN             			      = 0;
++      pdsch_referenceSignalPower 			      = -27;
++      pdsch_p_b                  			      = 0;
++      pusch_n_SB                 			      = 1;
++      pusch_enable64QAM          			      = "DISABLE";
++      pusch_hoppingMode                                  = "interSubFrame";
++      pusch_hoppingOffset                                = 0;
++      pusch_groupHoppingEnabled  			      = "ENABLE";
++      pusch_groupAssignment      			      = 0;
++      pusch_sequenceHoppingEnabled		   	      = "DISABLE";
++      pusch_nDMRS1                                       = 1;
++      phich_duration                                     = "NORMAL";
++      phich_resource                                     = "ONESIXTH";
++      srs_enable                                         = "DISABLE";
++      /*  srs_BandwidthConfig                                =;
++      srs_SubframeConfig                                 =;
++      srs_ackNackST                                      =;
++      srs_MaxUpPts                                       =;*/
++
++      pusch_p0_Nominal                                   = -96;
++      pusch_alpha                                        = "AL1";
++      pucch_p0_Nominal                                   = -104;
++      msg3_delta_Preamble                                = 6;
++      pucch_deltaF_Format1                               = "deltaF2";
++      pucch_deltaF_Format1b                              = "deltaF3";
++      pucch_deltaF_Format2                               = "deltaF0";
++      pucch_deltaF_Format2a                              = "deltaF0";
++      pucch_deltaF_Format2b		    	      = "deltaF0";
++
++      rach_numberOfRA_Preambles                          = 64;
++      rach_preamblesGroupAConfig                         = "DISABLE";
++      /*
++      rach_sizeOfRA_PreamblesGroupA                      = ;
++      rach_messageSizeGroupA                             = ;
++      rach_messagePowerOffsetGroupB                      = ;
++      */
++      rach_powerRampingStep                              = 4;
++      rach_preambleInitialReceivedTargetPower            = -108;
++      rach_preambleTransMax                              = 10;
++      rach_raResponseWindowSize                          = 10;
++      rach_macContentionResolutionTimer                  = 48;
++      rach_maxHARQ_Msg3Tx                                = 4;
++
++      pcch_default_PagingCycle                           = 128;
++      pcch_nB                                            = "oneT";
++      bcch_modificationPeriodCoeff			      = 2;
++      ue_TimersAndConstants_t300			      = 1000;
++      ue_TimersAndConstants_t301			      = 1000;
++      ue_TimersAndConstants_t310			      = 1000;
++      ue_TimersAndConstants_t311			      = 10000;
++      ue_TimersAndConstants_n310			      = 20;
++      ue_TimersAndConstants_n311			      = 1;
++      ue_TransmissionMode                                    = 1;
++
++      //Parameters for SIB18
++      rxPool_sc_CP_Len                                       = "normal";
++      rxPool_sc_Period                                       = "sf40";
++      rxPool_data_CP_Len                                     = "normal";
++      rxPool_ResourceConfig_prb_Num                          = 20;
++      rxPool_ResourceConfig_prb_Start                        = 5;
++      rxPool_ResourceConfig_prb_End                          = 44;
++      rxPool_ResourceConfig_offsetIndicator_present          = "prSmall";
++      rxPool_ResourceConfig_offsetIndicator_choice           = 0;
++      rxPool_ResourceConfig_subframeBitmap_present           = "prBs40";
++      rxPool_ResourceConfig_subframeBitmap_choice_bs_buf              = "00000000000000000000";
++      rxPool_ResourceConfig_subframeBitmap_choice_bs_size             = 5;
++      rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused      = 0;
++/*    rxPool_dataHoppingConfig_hoppingParameter                       = 0;
++      rxPool_dataHoppingConfig_numSubbands                            = "ns1";
++      rxPool_dataHoppingConfig_rbOffset                               = 0;
++      rxPool_commTxResourceUC-ReqAllowed                              = "TRUE";
++*/
++      // Parameters for SIB19
++      discRxPool_cp_Len                                               = "normal"
++      discRxPool_discPeriod                                           = "rf32"
++      discRxPool_numRetx                                              = 1;
++      discRxPool_numRepetition                                        = 2;
++      discRxPool_ResourceConfig_prb_Num                               = 5;
++      discRxPool_ResourceConfig_prb_Start                             = 3;
++      discRxPool_ResourceConfig_prb_End                               = 21;
++      discRxPool_ResourceConfig_offsetIndicator_present               = "prSmall";
++      discRxPool_ResourceConfig_offsetIndicator_choice                = 0;
++      discRxPool_ResourceConfig_subframeBitmap_present                = "prBs40";
++      discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf          = "f0ffffffff";
++      discRxPool_ResourceConfig_subframeBitmap_choice_bs_size         = 5;
++      discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused  = 0;
++
++      }
++    );
++
++
++    srb1_parameters :
++    {
++        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
++        timer_poll_retransmit    = 80;
++
++        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
++        timer_reordering         = 35;
++
++        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
++        timer_status_prohibit    = 0;
++
++        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
++        poll_pdu                 =  4;
++
++        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
++        poll_byte                =  99999;
++
++        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
++        max_retx_threshold       =  4;
++    }
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// MME parameters:
++    mme_ip_address      = ( { ipv4       = "127.0.1.100";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++    enable_measurement_reports = "no";
++
++    ///X2
++    enable_x2 = "yes";
++    t_reloc_prep      = 1000;      /* unit: millisecond */
++    tx2_reloc_overall = 2000;      /* unit: millisecond */
++    t_dc_prep         = 1000;      /* unit: millisecond */
++    t_dc_overall      = 2000;      /* unit: millisecond */
++
++    NETWORK_INTERFACES :
++    {
++        ENB_INTERFACE_NAME_FOR_S1_MME            = "lo";
++        ENB_IPV4_ADDRESS_FOR_S1_MME              = "127.0.1.1/24";
++        ENB_INTERFACE_NAME_FOR_S1U               = "lo";
++        ENB_IPV4_ADDRESS_FOR_S1U                 = "127.0.1.1/24";
++        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
++
++        ENB_IPV4_ADDRESS_FOR_X2C                 = "127.0.1.1/24";
++        ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
++    };
++  }
++);
++
++DU = (
++    {
++	DU_INTERFACE_NAME_FOR_F1U           = "lo";
++	DU_IPV4_ADDRESS_FOR_F1U             = "127.0.0.1/16";
++	DU_PORT_FOR_F1U                     = 22100;
++	F1_U_DU_TRANSPORT_TYPE		    = "TCP";
++    }
++    );
++    
++CU = (
++    {     
++        CU_INTERFACE_NAME_FOR_F1U           = "lo";
++        CU_IPV4_ADDRESS_FOR_F1U             = "127.0.0.1";   //Address to search the DU
++        CU_PORT_FOR_F1U                     = 22100;
++        F1_U_CU_TRANSPORT_TYPE              = "TCP";	     // One of TCP/UDP/SCTP
++        DU_TYPE 			    = "LTE";
++    }//,
++//    {     
++//        CU_INTERFACE_NAME_FOR_F1U           = "eth0";
++//        CU_IPV4_ADDRESS_FOR_F1U             = "10.64.93.142";   //Address to search the DU
++//        CU_PORT_FOR_F1U                     = 2211;
++//        F1_U_CU_TRANSPORT_TYPE              = "TCP";          // One of TCP/UDP/SCTP
++//        DU_TYPE 			    = "WiFi";
++//    }
++    );
++
++    CU_BALANCING = "ALL";
++
++MACRLCs = (
++	{
++	num_cc = 1;
++	tr_s_preference = "local_L1";
++	tr_n_preference = "local_RRC";
++	phy_test_mode = 0;
++        puSch10xSnr     =  200;
++        puCch10xSnr     =  200;
++        }  
++);
++
++L1s = (
++    	{
++	num_cc = 1;
++	tr_n_preference = "local_mac";
++        }  
++);
++
++RUs = (
++    {		  
++       local_rf       = "yes"
++         nb_tx          = 1
++         nb_rx          = 1
++         att_tx         = 5
++         att_rx         = 10;
++         bands          = [7];
++         max_pdschReferenceSignalPower = -27;
++         max_rxgain                    = 102;
++         eNB_instances  = [0];
++         sdr_addrs = "dev=pciex:0,auxdac1=1620";
++         clock_src = "internal";
++
++    }
++);  
++
++NETWORK_CONTROLLER :
++{
++    FLEXRAN_ENABLED        = "no";
++    FLEXRAN_INTERFACE_NAME = "lo";
++    FLEXRAN_IPV4_ADDRESS   = "127.0.0.1";
++    FLEXRAN_PORT           = 2210;
++    FLEXRAN_CACHE          = "/mnt/oai_agent_cache";
++    FLEXRAN_AWAIT_RECONF   = "no";
++};
++
++THREAD_STRUCT = (
++  {
++    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++    parallel_config    = "PARALLEL_SINGLE_THREAD";
++    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++    worker_config      = "WORKER_ENABLE";
++  }
++);
++
++/*
++#example config for rfsimulator
++rfsimulator :
++{
++   serveraddr = "enb";
++   serverport = "4043";
++   options = ("saviq");
++   modelname = "AWGN";
++   IQfile = "/tmp/rfsimulator.iqs";
++};
++*/
++
++     log_config :
++     {
++       global_log_level                      ="info";
++       hw_log_level                          ="info";
++       phy_log_level                         ="info";
++       mac_log_level                         ="info";
++       rlc_log_level                         ="info";
++       pdcp_log_level                        ="info";
++       rrc_log_level                         ="info";
++    };
++
+diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf
+new file mode 100644
+index 0000000000..2884cfd68c
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf
+@@ -0,0 +1,263 @@
++Active_gNBs = ( "gNB-Eurecom-5GNRBox");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++gNBs =
++(
++ {
++    ////////// Identification parameters:
++    gNB_ID    =  0xe01;
++
++    cell_type =  "CELL_MACRO_GNB";
++
++    gNB_name  =  "gNB-Eurecom-5GNRBox";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code  =  1;
++
++    plmn_list = ({mcc = 001; mnc = 01; mnc_length = 2;});	 
++
++    tr_s_preference     = "local_mac"
++
++    ////////// Physical parameters:
++
++    pusch_TargetSNRx10                                        = 200;
++    pucch_TargetSNRx10                                        = 200;
++
++    servingCellConfigCommon = (
++    {
++ #spCellConfigCommon
++
++      physCellId                                                    = 0;
++
++#  downlinkConfigCommon
++    #frequencyInfoDL
++      # this is 3600 MHz + 84 PRBs@30kHz SCS (same as initial BWP)
++      absoluteFrequencySSB                                          = 641272; //641032;      #641968; 641968=start of ssb at 3600MHz + 82 RBs    641032=center of SSB at center of cell
++      dl_frequencyBand                                                 = 78;
++      # this is 3600 MHz
++      dl_absoluteFrequencyPointA                                       = 640000;
++      #scs-SpecificCarrierList
++        dl_offstToCarrier                                              = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
++        dl_subcarrierSpacing                                           = 1;
++        dl_carrierBandwidth                                            = 106;
++     #initialDownlinkBWP
++      #genericParameters
++        # this is RBstart=84,L=13 (275*(L-1))+RBstart
++        initialDLBWPlocationAndBandwidth                                        = 6368;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
++        initialDLBWPsubcarrierSpacing                                           = 1;
++      #pdcch-ConfigCommon
++        initialDLBWPcontrolResourceSetZero                                      = 0;
++        initialDLBWPsearchSpaceZero                                             = 0;
++
++  #uplinkConfigCommon 
++     #frequencyInfoUL
++      ul_frequencyBand                                                 = 78;
++      #scs-SpecificCarrierList
++      ul_offstToCarrier                                              = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
++      ul_subcarrierSpacing                                           = 1;
++      ul_carrierBandwidth                                            = 106;
++      pMax                                                          = 20;
++     #initialUplinkBWP
++      #genericParameters
++        initialULBWPlocationAndBandwidth                                        = 6368;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
++        initialULBWPsubcarrierSpacing                                           = 1;
++      #rach-ConfigCommon
++        #rach-ConfigGeneric
++          prach_ConfigurationIndex                                  = 98;
++#prach_msg1_FDM
++#0 = one, 1=two, 2=four, 3=eight
++          prach_msg1_FDM                                            = 0;
++          prach_msg1_FrequencyStart                                 = 0;
++          zeroCorrelationZoneConfig                                 = 13;
++          preambleReceivedTargetPower                               = -100;
++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
++          preambleTransMax                                          = 6;
++#powerRampingStep
++# 0=dB0,1=dB2,2=dB4,3=dB6
++        powerRampingStep                                            = 1;
++#ra_ReponseWindow
++#1,2,4,8,10,20,40,80
++        ra_ResponseWindow                                           = 5;
++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
++#oneHalf (0..15) 4,8,12,16,...60,64
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14; //15;
++#ra_ContentionResolutionTimer
++#(0..7) 8,16,24,32,40,48,56,64
++        ra_ContentionResolutionTimer                                = 7;
++        rsrp_ThresholdSSB                                           = 19;
++#prach-RootSequenceIndex_PR
++#1 = 839, 2 = 139
++        prach_RootSequenceIndex_PR                                  = 2;
++        prach_RootSequenceIndex                                     = 1;
++        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
++        #  
++        msg1_SubcarrierSpacing                                      = 1,
++
++# restrictedSetConfig
++# 0=unrestricted, 1=restricted type A, 2=restricted type B
++        restrictedSetConfig                                         = 0,
++
++        msg3_DeltaPreamble                                          = 1;
++        p0_NominalWithGrant                                         =-90;
++
++# pucch-ConfigCommon setup :
++# pucchGroupHopping
++# 0 = neither, 1= group hopping, 2=sequence hopping
++        pucchGroupHopping                                           = 0;
++        hoppingId                                                   = 40;
++        p0_nominal                                                  = -90;
++# ssb_PositionsInBurs_BitmapPR
++# 1=short, 2=medium, 3=long
++      ssb_PositionsInBurst_PR                                       = 2;
++      ssb_PositionsInBurst_Bitmap                                   = 1; #0x80;
++
++# ssb_periodicityServingCell
++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 
++      ssb_periodicityServingCell                                    = 2;
++
++# dmrs_TypeA_position
++# 0 = pos2, 1 = pos3
++      dmrs_TypeA_Position                                           = 0;
++
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
++      subcarrierSpacing                                             = 1;
++
++
++  #tdd-UL-DL-ConfigurationCommon
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
++      referenceSubcarrierSpacing                                    = 1;
++      # pattern1 
++      # dl_UL_TransmissionPeriodicity
++      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
++      dl_UL_TransmissionPeriodicity                                 = 6;
++      nrofDownlinkSlots                                             = 7; //8; //7;
++      nrofDownlinkSymbols                                           = 6; //0; //6;
++      nrofUplinkSlots                                               = 2;
++      nrofUplinkSymbols                                             = 4; //0; //4;
++
++  ssPBCH_BlockPower                                             = -25;
++  }
++
++  );
++
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// MME parameters:
++    amf_ip_address      = ( { ipv4       = "127.0.1.100";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++    ///X2
++    enable_x2 = "yes";
++    t_reloc_prep      = 1000;      /* unit: millisecond */
++    tx2_reloc_overall = 2000;      /* unit: millisecond */
++    t_dc_prep         = 1000;      /* unit: millisecond */
++    t_dc_overall      = 2000;      /* unit: millisecond */
++    target_enb_x2_ip_address      = (
++                                     { ipv4       = "127.0.1.1";
++                                       ipv6       = "192:168:30::17";
++                                       preference = "ipv4";
++                                     }
++                                    );
++
++    NETWORK_INTERFACES :
++    {
++
++        GNB_INTERFACE_NAME_FOR_NG_AMF            = "lo";
++        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "127.0.1.2/24";
++        GNB_INTERFACE_NAME_FOR_NGU               = "lo";
++        GNB_IPV4_ADDRESS_FOR_NGU                 = "127.0.1.2/24";
++        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
++        GNB_IPV4_ADDRESS_FOR_X2C                 = "127.0.1.2/24";
++        GNB_PORT_FOR_X2C                         = 36422; # Spec 36422
++    };
++  }
++);
++
++MACRLCs = (
++	{
++	num_cc = 1;
++	tr_s_preference = "local_L1";
++	tr_n_preference = "local_RRC";
++        }  
++);
++
++L1s = (
++{
++  num_cc = 1;
++  tr_n_preference = "local_mac";
++}
++);
++
++RUs = (
++    {		  
++       local_rf       = "yes"
++         nb_tx          = 1
++         nb_rx          = 1
++         att_tx         = 5
++         att_rx         = 10;
++         bands          = [7];
++         max_pdschReferenceSignalPower = -27;
++         max_rxgain                    = 102;
++         eNB_instances  = [0];
++         sdr_addrs = "dev=pciex:0,auxdac1=1620";
++         clock_src = "internal";
++    }
++);  
++
++THREAD_STRUCT = (
++  {
++    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++    parallel_config    = "PARALLEL_SINGLE_THREAD";
++    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++    worker_config      = "WORKER_ENABLE";
++  }
++);
++
++security = {
++  # preferred ciphering algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nea0, nea1, nea2, nea3
++  ciphering_algorithms = ( "nea0", "nea2" );
++
++  # preferred integrity algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nia0, nia1, nia2, nia3
++  integrity_algorithms = ( "nia0" );
++};
++
++     log_config :
++     {
++       global_log_level                      ="info";
++       hw_log_level                          ="info";
++       phy_log_level                         ="info";
++       mac_log_level                         ="info";
++       rlc_log_level                         ="info";
++       pdcp_log_level                        ="info";
++       rrc_log_level                         ="info";
++    };
++
+diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf
+new file mode 100644
+index 0000000000..d524c6699a
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf
+@@ -0,0 +1,277 @@
++Active_gNBs = ( "gNB-OAI");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++gNBs =
++(
++ {
++    ////////// Identification parameters:
++    gNB_ID    =  0xe00;
++    gNB_name  =  "gNB-OAI";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code  =  1;
++    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
++
++    nr_cellid = 12345678L;
++
++    ////////// Physical parameters:
++
++    do_CSIRS                                                  = 1;
++    do_SRS                                                    = 1;
++    min_rxtxtime                                              = 6;
++
++    servingCellConfigCommon = (
++    {
++ #spCellConfigCommon
++
++      physCellId                                                    = 0;
++
++#  downlinkConfigCommon
++    #frequencyInfoDL
++      # this is 2574.270 MHz + 53 PRBs@30kHz SCS (same as initial BWP)
++      absoluteFrequencySSB                                             = 518670;
++      dl_frequencyBand                                                 = 41;
++      # this is 3600 MHz
++      dl_absoluteFrequencyPointA                                       = 517734;
++      #scs-SpecificCarrierList
++        dl_offstToCarrier                                              = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        dl_subcarrierSpacing                                           = 0;
++        dl_carrierBandwidth                                            = 52;
++     #initialDownlinkBWP
++      #genericParameters
++        # this is RBstart=0,L=106 (275*(L-1))+RBstart
++        initialDLBWPlocationAndBandwidth                               = 14025; # 6366 12925 12956 28875 12952
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialDLBWPsubcarrierSpacing                                   = 0;
++      #pdcch-ConfigCommon
++        initialDLBWPcontrolResourceSetZero                              = 6;
++        initialDLBWPsearchSpaceZero                                     = 0;
++
++  #uplinkConfigCommon
++     #frequencyInfoUL
++      ul_frequencyBand                                              = 41;
++      #scs-SpecificCarrierList
++      ul_offstToCarrier                                             = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      ul_subcarrierSpacing                                          = 0;
++      ul_carrierBandwidth                                           = 52;
++      pMax                                                          = 20;
++     #initialUplinkBWP
++      #genericParameters
++        initialULBWPlocationAndBandwidth                            = 14025;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialULBWPsubcarrierSpacing                               = 0;
++      #rach-ConfigCommon
++        #rach-ConfigGeneric
++          prach_ConfigurationIndex                                  = 98;
++#prach_msg1_FDM
++#0 = one, 1=two, 2=four, 3=eight
++          prach_msg1_FDM                                            = 0;
++          prach_msg1_FrequencyStart                                 = 0;
++          zeroCorrelationZoneConfig                                 = 13;
++          preambleReceivedTargetPower                               = -96;
++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
++          preambleTransMax                                          = 6;
++#powerRampingStep
++# 0=dB0,1=dB2,2=dB4,3=dB6
++        powerRampingStep                                            = 1;
++#ra_ReponseWindow
++#1,2,4,8,10,20,40,80
++        ra_ResponseWindow                                           = 4;
++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
++#oneHalf (0..15) 4,8,12,16,...60,64
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
++#ra_ContentionResolutionTimer
++#(0..7) 8,16,24,32,40,48,56,64
++        ra_ContentionResolutionTimer                                = 7;
++        rsrp_ThresholdSSB                                           = 19;
++#prach-RootSequenceIndex_PR
++#1 = 839, 2 = 139
++        prach_RootSequenceIndex_PR                                  = 2;
++        prach_RootSequenceIndex                                     = 1;
++        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
++        #
++        msg1_SubcarrierSpacing                                      = 0,
++# restrictedSetConfig
++# 0=unrestricted, 1=restricted type A, 2=restricted type B
++        restrictedSetConfig                                         = 0,
++
++        msg3_DeltaPreamble                                          = 1;
++        p0_NominalWithGrant                                         =-90;
++
++# pucch-ConfigCommon setup :
++# pucchGroupHopping
++# 0 = neither, 1= group hopping, 2=sequence hopping
++        pucchGroupHopping                                           = 0;
++        hoppingId                                                   = 40;
++        p0_nominal                                                  = -90;
++# ssb_PositionsInBurs_BitmapPR
++# 1=short, 2=medium, 3=long
++      ssb_PositionsInBurst_PR                                       = 2;
++      ssb_PositionsInBurst_Bitmap                                   = 1;
++
++# ssb_periodicityServingCell
++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
++      ssb_periodicityServingCell                                    = 2;
++
++# dmrs_TypeA_position
++# 0 = pos2, 1 = pos3
++      dmrs_TypeA_Position                                           = 0;
++
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      subcarrierSpacing                                             = 0;
++
++
++  #tdd-UL-DL-ConfigurationCommon
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      referenceSubcarrierSpacing                                    = 0;
++      # pattern1
++      # dl_UL_TransmissionPeriodicity
++      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
++      dl_UL_TransmissionPeriodicity                                 = 7;
++      nrofDownlinkSlots                                             = 7;
++      nrofDownlinkSymbols                                           = 6;
++      nrofUplinkSlots                                               = 2;
++      nrofUplinkSymbols                                             = 4;
++
++      ssPBCH_BlockPower                                             = -25;
++  }
++
++  );
++
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// AMF parameters:
++    amf_ip_address      = ( { ipv4       = "192.168.0.80";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++
++    NETWORK_INTERFACES :
++    {
++        GNB_INTERFACE_NAME_FOR_NG_AMF            = "eno2";
++        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.201/24";
++        GNB_INTERFACE_NAME_FOR_NGU               = "eno2";
++        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.201/24";
++        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
++    };
++
++  }
++);
++
++MACRLCs = (
++{
++  num_cc                      = 1;
++  tr_s_preference             = "local_L1";
++  tr_n_preference             = "local_RRC";
++  pusch_TargetSNRx10          = 250;
++  pucch_TargetSNRx10          = 300;
++  ulsch_max_frame_inactivity  = 1;
++}
++);
++
++L1s = (
++{
++  num_cc = 1;
++  tr_n_preference       = "local_mac";
++# pusch_proc_threads    = 8;
++  prach_dtx_threshold   = 120;
++  pucch0_dtx_threshold  = 150;
++  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
++}
++);
++
++RUs = (
++{
++  local_rf       = "yes"
++  nb_tx          = 1
++  nb_rx          = 1
++  att_tx         = 0;
++  att_rx         = 0;
++  bands          = [41];
++  max_pdschReferenceSignalPower = -27;
++  max_rxgain                    = 102;
++  eNB_instances  = [0];
++  #beamforming 1x4 matrix:
++  bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
++  sdr_addrs = "dev=usb3:0,auxdac1=1960";
++  clock_src = "internal";
++}
++);
++
++THREAD_STRUCT = (
++{
++  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++  parallel_config    = "PARALLEL_SINGLE_THREAD";
++  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++  worker_config      = "WORKER_ENABLE";
++}
++);
++
++rfsimulator :
++{
++  serveraddr = "server";
++  serverport = "4043";
++  options = (); #("saviq"); or/and "chanmod"
++  modelname = "AWGN";
++  IQfile = "/tmp/rfsimulator.iqs";
++};
++
++security = {
++  # preferred ciphering algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nea0, nea1, nea2, nea3
++  ciphering_algorithms = ( "nea0" );
++
++  # preferred integrity algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nia0, nia1, nia2, nia3
++  integrity_algorithms = ( "nia2", "nia0" );
++
++  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
++  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
++  drb_ciphering = "yes";
++  drb_integrity = "no";
++};
++
++log_config :
++{
++  global_log_level                      ="info";
++  global_log_verbosity                  ="medium";
++  hw_log_level                          ="info";
++  hw_log_verbosity                      ="medium";
++  phy_log_level                         ="info";
++  phy_log_verbosity                     ="medium";
++  mac_log_level                         ="info";
++  mac_log_verbosity                     ="high";
++  rlc_log_level                         ="info";
++  rlc_log_verbosity                     ="medium";
++  pdcp_log_level                        ="info";
++  pdcp_log_verbosity                    ="medium";
++  rrc_log_level                         ="info";
++  rrc_log_verbosity                     ="medium";
++  ngap_log_level                        ="debug";
++  ngap_log_verbosity                    ="medium";
++};
++
+diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf
+new file mode 100644
+index 0000000000..41bdf7f7e5
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf
+@@ -0,0 +1,269 @@
++Active_gNBs = ( "gNB-OAI");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++gNBs =
++(
++ {
++    ////////// Identification parameters:
++    gNB_ID    =  0xe00;
++    gNB_name  =  "gNB-OAI";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code  =  1;
++    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
++
++    nr_cellid = 12345678L;
++
++    ////////// Physical parameters:
++
++    pdsch_AntennaPorts_XP                                     = 2;
++    pusch_AntennaPorts                                        = 2;
++    do_CSIRS                                                  = 1;
++    do_SRS                                                    = 1;
++    ul_prbblacklist                                           = "51,52,53,54"
++
++    servingCellConfigCommon = (
++    {
++ #spCellConfigCommon
++
++      physCellId                                                    = 0;
++
++#  downlinkConfigCommon
++    #frequencyInfoDL
++      # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
++      absoluteFrequencySSB                                             = 621312; # 641280
++      dl_frequencyBand                                                 = 78;
++      # this is 3300.60 MHz
++      dl_absoluteFrequencyPointA                                       = 620040; # 640008
++      #scs-SpecificCarrierList
++        dl_offstToCarrier                                              = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        dl_subcarrierSpacing                                           = 1;
++        dl_carrierBandwidth                                            = 106;
++     #initialDownlinkBWP
++      #genericParameters
++        # this is RBstart=27,L=48 (275*(L-1))+RBstart
++        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialDLBWPsubcarrierSpacing                                  = 1;
++      #pdcch-ConfigCommon
++        initialDLBWPcontrolResourceSetZero                             = 12;
++        initialDLBWPsearchSpaceZero                                    = 0;
++
++  #uplinkConfigCommon
++     #frequencyInfoUL
++      ul_frequencyBand                                              = 78;
++      #scs-SpecificCarrierList
++      ul_offstToCarrier                                             = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      ul_subcarrierSpacing                                          = 1;
++      ul_carrierBandwidth                                           = 106;
++      pMax                                                          = 20;
++     #initialUplinkBWP
++      #genericParameters
++        initialULBWPlocationAndBandwidth                            = 28875;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialULBWPsubcarrierSpacing                               = 1;
++      #rach-ConfigCommon
++        #rach-ConfigGeneric
++          prach_ConfigurationIndex                                  = 98;
++#prach_msg1_FDM
++#0 = one, 1=two, 2=four, 3=eight
++          prach_msg1_FDM                                            = 0;
++          prach_msg1_FrequencyStart                                 = 0;
++          zeroCorrelationZoneConfig                                 = 12;
++          preambleReceivedTargetPower                               = -96;
++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
++          preambleTransMax                                          = 6;
++#powerRampingStep
++# 0=dB0,1=dB2,2=dB4,3=dB6
++        powerRampingStep                                            = 1;
++#ra_ReponseWindow
++#1,2,4,8,10,20,40,80
++        ra_ResponseWindow                                           = 4;
++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
++#oneHalf (0..15) 4,8,12,16,...60,64
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
++#ra_ContentionResolutionTimer
++#(0..7) 8,16,24,32,40,48,56,64
++        ra_ContentionResolutionTimer                                = 7;
++        rsrp_ThresholdSSB                                           = 19;
++#prach-RootSequenceIndex_PR
++#1 = 839, 2 = 139
++        prach_RootSequenceIndex_PR                                  = 2;
++        prach_RootSequenceIndex                                     = 1;
++        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
++        #
++        msg1_SubcarrierSpacing                                      = 1,
++# restrictedSetConfig
++# 0=unrestricted, 1=restricted type A, 2=restricted type B
++        restrictedSetConfig                                         = 0,
++
++        msg3_DeltaPreamble                                          = 1;
++        p0_NominalWithGrant                                         =-90;
++
++# pucch-ConfigCommon setup :
++# pucchGroupHopping
++# 0 = neither, 1= group hopping, 2=sequence hopping
++        pucchGroupHopping                                           = 0;
++        hoppingId                                                   = 40;
++        p0_nominal                                                  = -70;
++# ssb_PositionsInBurs_BitmapPR
++# 1=short, 2=medium, 3=long
++      ssb_PositionsInBurst_PR                                       = 2;
++      ssb_PositionsInBurst_Bitmap                                   = 1;
++
++# ssb_periodicityServingCell
++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
++      ssb_periodicityServingCell                                    = 2;
++
++# dmrs_TypeA_position
++# 0 = pos2, 1 = pos3
++      dmrs_TypeA_Position                                           = 0;
++
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      subcarrierSpacing                                             = 1;
++
++
++  #tdd-UL-DL-ConfigurationCommon
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      referenceSubcarrierSpacing                                    = 1;
++      # pattern1
++      # dl_UL_TransmissionPeriodicity
++      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
++      dl_UL_TransmissionPeriodicity                                 = 6;
++      nrofDownlinkSlots                                             = 7;
++      nrofDownlinkSymbols                                           = 6;
++      nrofUplinkSlots                                               = 2;
++      nrofUplinkSymbols                                             = 4;
++
++      ssPBCH_BlockPower                                             = -25;
++  }
++
++  );
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// AMF parameters:
++    amf_ip_address      = ( { ipv4       = "192.168.0.80"; #"192.168.70.132";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++
++    NETWORK_INTERFACES :
++    {
++        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
++        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.202"; #"192.168.70.129/24";
++        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
++        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.202"; #"192.168.70.129/24";
++        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
++    };
++
++  }
++);
++
++MACRLCs = (
++{
++  num_cc                      = 1;
++  tr_s_preference             = "local_L1";
++  tr_n_preference             = "local_RRC";
++  pusch_TargetSNRx10          = 300;
++  pucch_TargetSNRx10          = 300;
++  pusch_FailureThres          = 1000;
++  ulsch_max_frame_inactivity  = 0;
++}
++);
++
++L1s = (
++{
++  num_cc                = 1;
++  tr_n_preference       = "local_mac";
++  prach_dtx_threshold   = 120;
++  #pucch0_dtx_threshold = 120;
++}
++);
++
++RUs = (
++{
++  local_rf       = "yes"
++  nb_tx          = 2
++  nb_rx          = 2
++  att_tx         = 0
++  att_rx         = 0;
++  bands          = [78];
++  max_pdschReferenceSignalPower = -27;
++  max_rxgain                    = 102;
++  eNB_instances  = [0];
++  ##beamforming 1x2 matrix: 1 layer x 2 antennas
++  bf_weights = [0x00007fff, 0x0000];
++  #clock_src = "internal";
++  sdr_addrs = "dev=pciex:0,auxdac1=1630";
++}
++);
++
++THREAD_STRUCT = (
++{
++  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++  parallel_config    = "PARALLEL_SINGLE_THREAD";
++  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++  worker_config      = "WORKER_ENABLE";
++}
++);
++
++rfsimulator :
++{
++  serveraddr = "server";
++  serverport = "4043";
++  options = (); #("saviq"); or/and "chanmod"
++  modelname = "AWGN";
++  IQfile = "/tmp/rfsimulator.iqs";
++};
++
++security = {
++  # preferred ciphering algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nea0, nea1, nea2, nea3
++  ciphering_algorithms = ( "nea0" );
++
++  # preferred integrity algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nia0, nia1, nia2, nia3
++  integrity_algorithms = ( "nia2", "nia0" );
++
++  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
++  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
++  drb_ciphering = "yes";
++  drb_integrity = "no";
++};
++
++log_config :
++{
++  global_log_level                      ="info";
++  hw_log_level                          ="info";
++  phy_log_level                         ="info";
++  mac_log_level                         ="info";
++  rlc_log_level                         ="info";
++  pdcp_log_level                        ="info";
++  rrc_log_level                         ="info";
++  ngap_log_level                        ="debug";
++  f1ap_log_level                        ="debug";
++};
+diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf
+new file mode 100644
+index 0000000000..7894f28380
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf
+@@ -0,0 +1,268 @@
++Active_gNBs = ( "gNB-OAI");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++gNBs =
++(
++ {
++    ////////// Identification parameters:
++    gNB_ID    =  0xe00;
++    gNB_name  =  "gNB-OAI";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code  =  1;
++    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
++
++    nr_cellid = 12345678L;
++
++    ////////// Physical parameters:
++
++    do_CSIRS                                                  = 1;
++    do_SRS                                                    = 1;
++
++    servingCellConfigCommon = (
++    {
++ #spCellConfigCommon
++
++      physCellId                                                    = 0;
++
++#  downlinkConfigCommon
++    #frequencyInfoDL
++      # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
++      absoluteFrequencySSB                                             = 641280;
++      dl_frequencyBand                                                 = 78;
++      # this is 3600 MHz
++      dl_absoluteFrequencyPointA                                       = 640008;
++      #scs-SpecificCarrierList
++        dl_offstToCarrier                                              = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        dl_subcarrierSpacing                                           = 1;
++        dl_carrierBandwidth                                            = 106;
++     #initialDownlinkBWP
++      #genericParameters
++        # this is RBstart=27,L=48 (275*(L-1))+RBstart
++        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialDLBWPsubcarrierSpacing                                   = 1;
++      #pdcch-ConfigCommon
++        initialDLBWPcontrolResourceSetZero                              = 12;
++        initialDLBWPsearchSpaceZero                                     = 0;
++
++  #uplinkConfigCommon
++     #frequencyInfoUL
++      ul_frequencyBand                                              = 78;
++      #scs-SpecificCarrierList
++      ul_offstToCarrier                                             = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      ul_subcarrierSpacing                                          = 1;
++      ul_carrierBandwidth                                           = 106;
++      pMax                                                          = 20;
++     #initialUplinkBWP
++      #genericParameters
++        initialULBWPlocationAndBandwidth                            = 28875;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialULBWPsubcarrierSpacing                               = 1;
++      #rach-ConfigCommon
++        #rach-ConfigGeneric
++          prach_ConfigurationIndex                                  = 98;
++#prach_msg1_FDM
++#0 = one, 1=two, 2=four, 3=eight
++          prach_msg1_FDM                                            = 0;
++          prach_msg1_FrequencyStart                                 = 0;
++          zeroCorrelationZoneConfig                                 = 13;
++          preambleReceivedTargetPower                               = -96;
++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
++          preambleTransMax                                          = 6;
++#powerRampingStep
++# 0=dB0,1=dB2,2=dB4,3=dB6
++        powerRampingStep                                            = 1;
++#ra_ReponseWindow
++#1,2,4,8,10,20,40,80
++        ra_ResponseWindow                                           = 4;
++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
++#oneHalf (0..15) 4,8,12,16,...60,64
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
++#ra_ContentionResolutionTimer
++#(0..7) 8,16,24,32,40,48,56,64
++        ra_ContentionResolutionTimer                                = 7;
++        rsrp_ThresholdSSB                                           = 19;
++#prach-RootSequenceIndex_PR
++#1 = 839, 2 = 139
++        prach_RootSequenceIndex_PR                                  = 2;
++        prach_RootSequenceIndex                                     = 1;
++        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
++        #
++        msg1_SubcarrierSpacing                                      = 1,
++# restrictedSetConfig
++# 0=unrestricted, 1=restricted type A, 2=restricted type B
++        restrictedSetConfig                                         = 0,
++
++        msg3_DeltaPreamble                                          = 1;
++        p0_NominalWithGrant                                         =-90;
++
++# pucch-ConfigCommon setup :
++# pucchGroupHopping
++# 0 = neither, 1= group hopping, 2=sequence hopping
++        pucchGroupHopping                                           = 0;
++        hoppingId                                                   = 40;
++        p0_nominal                                                  = -90;
++# ssb_PositionsInBurs_BitmapPR
++# 1=short, 2=medium, 3=long
++      ssb_PositionsInBurst_PR                                       = 2;
++      ssb_PositionsInBurst_Bitmap                                   = 1;
++
++# ssb_periodicityServingCell
++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
++      ssb_periodicityServingCell                                    = 2;
++
++# dmrs_TypeA_position
++# 0 = pos2, 1 = pos3
++      dmrs_TypeA_Position                                           = 0;
++
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      subcarrierSpacing                                             = 1;
++
++
++  #tdd-UL-DL-ConfigurationCommon
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      referenceSubcarrierSpacing                                    = 1;
++      # pattern1
++      # dl_UL_TransmissionPeriodicity
++      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
++      dl_UL_TransmissionPeriodicity                                 = 6;
++      nrofDownlinkSlots                                             = 7;
++      nrofDownlinkSymbols                                           = 6;
++      nrofUplinkSlots                                               = 2;
++      nrofUplinkSymbols                                             = 4;
++
++      ssPBCH_BlockPower                                             = -25;
++  }
++
++  );
++
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// AMF parameters:
++    amf_ip_address      = ( { ipv4       = "192.168.70.132";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++
++    NETWORK_INTERFACES :
++    {
++        GNB_INTERFACE_NAME_FOR_NG_AMF            = "eno2";
++        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.202/24";
++        GNB_INTERFACE_NAME_FOR_NGU               = "eno2";
++        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.202/24";
++        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
++    };
++
++  }
++);
++
++MACRLCs = (
++{
++  num_cc                      = 1;
++  tr_s_preference             = "local_L1";
++  tr_n_preference             = "local_RRC";
++  pusch_TargetSNRx10          = 150;
++  pucch_TargetSNRx10          = 200;
++  ulsch_max_frame_inactivity  = 0;
++}
++);
++
++L1s = (
++{
++  num_cc = 1;
++  tr_n_preference       = "local_mac";
++  prach_dtx_threshold   = 120;
++  pucch0_dtx_threshold  = 100;
++  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
++}
++);
++
++RUs = (
++{
++  local_rf       = "yes"
++  nb_tx          = 1
++  nb_rx          = 1
++  att_tx         = 0;
++  att_rx         = 0;
++  bands          = [78];
++  max_pdschReferenceSignalPower = -27;
++  max_rxgain                    = 102;
++  eNB_instances  = [0];
++  #beamforming 1x4 matrix:
++  bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
++  sdr_addrs = "dev=pciex:0,auxdac1=1660";
++  clock_src = "internal";
++}
++);
++
++THREAD_STRUCT = (
++{
++  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++  parallel_config    = "PARALLEL_SINGLE_THREAD";
++  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++  worker_config      = "WORKER_ENABLE";
++}
++);
++
++rfsimulator :
++{
++  serveraddr = "server";
++  serverport = "4043";
++  options = (); #("saviq"); or/and "chanmod"
++  modelname = "AWGN";
++  IQfile = "/tmp/rfsimulator.iqs";
++};
++
++security = {
++  # preferred ciphering algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nea0, nea1, nea2, nea3
++  ciphering_algorithms = ( "nea0" );
++
++  # preferred integrity algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nia0, nia1, nia2, nia3
++  integrity_algorithms = ( "nia2", "nia0" );
++
++  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
++  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
++  drb_ciphering = "yes";
++  drb_integrity = "no";
++};
++
++log_config :
++{
++  global_log_level                      ="info";
++  hw_log_level                          ="info";
++  phy_log_level                         ="info";
++  mac_log_level                         ="info";
++  rlc_log_level                         ="info";
++  pdcp_log_level                        ="info";
++  rrc_log_level                         ="info";
++  ngap_log_level                        ="debug";
++  f1ap_log_level                        ="debug";
++};
++
+diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf
+new file mode 100644
+index 0000000000..b6347edc28
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf
+@@ -0,0 +1,270 @@
++Active_gNBs = ( "gNB-OAI");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++gNBs =
++(
++ {
++    ////////// Identification parameters:
++    gNB_ID    =  0xe00;
++    gNB_name  =  "gNB-OAI";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code  =  1;
++    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
++
++    nr_cellid = 12345678L;
++
++    ////////// Physical parameters:
++
++    pdsch_AntennaPorts_XP                                     = 2;
++    pusch_AntennaPorts                                        = 2;
++    do_CSIRS                                                  = 1;
++    do_SRS                                                    = 1;
++    ul_prbblacklist                                           = "135,136,137,138"
++
++    servingCellConfigCommon = (
++    {
++ #spCellConfigCommon
++
++      physCellId                                                    = 0;
++
++#  downlinkConfigCommon
++    #frequencyInfoDL
++      # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
++      absoluteFrequencySSB                                          = 623232;
++      dl_frequencyBand                                              = 78;
++      # this is 3300.24 MHz
++      dl_absoluteFrequencyPointA                                    = 620016;
++      #scs-SpecificCarrierList
++        dl_offstToCarrier                                           = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        dl_subcarrierSpacing                                        = 1;
++        dl_carrierBandwidth                                         = 273;
++     #initialDownlinkBWP
++      #genericParameters
++       initialDLBWPlocationAndBandwidth                             = 1099;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialDLBWPsubcarrierSpacing                               = 1;
++      #pdcch-ConfigCommon
++        initialDLBWPcontrolResourceSetZero                          = 12;
++        initialDLBWPsearchSpaceZero                                 = 0;
++
++  #uplinkConfigCommon
++     #frequencyInfoUL
++      ul_frequencyBand                                              = 78;
++      #scs-SpecificCarrierList
++      ul_offstToCarrier                                             = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      ul_subcarrierSpacing                                          = 1;
++      ul_carrierBandwidth                                           = 273;
++      pMax                                                          = 20;
++     #initialUplinkBWP
++      #genericParameters
++        initialULBWPlocationAndBandwidth                            = 1099;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialULBWPsubcarrierSpacing                               = 1;
++      #rach-ConfigCommon
++        #rach-ConfigGeneric
++          prach_ConfigurationIndex                                  = 98;
++#prach_msg1_FDM
++#0 = one, 1=two, 2=four, 3=eight
++          prach_msg1_FDM                                            = 0;
++          prach_msg1_FrequencyStart                                 = 0;
++          zeroCorrelationZoneConfig                                 = 12;
++          preambleReceivedTargetPower                               = -90;
++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
++          preambleTransMax                                          = 6;
++#powerRampingStep
++# 0=dB0,1=dB2,2=dB4,3=dB6
++        powerRampingStep                                            = 1;
++#ra_ReponseWindow
++#1,2,4,8,10,20,40,80
++        ra_ResponseWindow                                           = 4;
++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
++#oneHalf (0..15) 4,8,12,16,...60,64
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
++#ra_ContentionResolutionTimer
++#(0..7) 8,16,24,32,40,48,56,64
++        ra_ContentionResolutionTimer                                = 7;
++        rsrp_ThresholdSSB                                           = 19;
++#prach-RootSequenceIndex_PR
++#1 = 839, 2 = 139
++        prach_RootSequenceIndex_PR                                  = 2;
++        prach_RootSequenceIndex                                     = 1;
++        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
++        #
++        msg1_SubcarrierSpacing                                      = 1,
++# restrictedSetConfig
++# 0=unrestricted, 1=restricted type A, 2=restricted type B
++        restrictedSetConfig                                         = 0,
++
++        msg3_DeltaPreamble                                          = 1;
++        p0_NominalWithGrant                                         =-90;
++
++# pucch-ConfigCommon setup :
++# pucchGroupHopping
++# 0 = neither, 1= group hopping, 2=sequence hopping
++        pucchGroupHopping                                           = 0;
++        hoppingId                                                   = 40;
++        p0_nominal                                                  = -70;
++# ssb_PositionsInBurs_BitmapPR
++# 1=short, 2=medium, 3=long
++      ssb_PositionsInBurst_PR                                       = 2;
++      ssb_PositionsInBurst_Bitmap                                   = 1;
++
++# ssb_periodicityServingCell
++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
++      ssb_periodicityServingCell                                    = 2;
++
++# dmrs_TypeA_position
++# 0 = pos2, 1 = pos3
++      dmrs_TypeA_Position                                           = 0;
++
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      subcarrierSpacing                                             = 1;
++
++
++  #tdd-UL-DL-ConfigurationCommon
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      referenceSubcarrierSpacing                                    = 1;
++      # pattern1
++      # dl_UL_TransmissionPeriodicity
++      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
++      dl_UL_TransmissionPeriodicity                                 = 6;
++      nrofDownlinkSlots                                             = 7;
++      nrofDownlinkSymbols                                           = 6;
++      nrofUplinkSlots                                               = 2;
++      nrofUplinkSymbols                                             = 4;
++
++      ssPBCH_BlockPower                                             = -5;
++  }
++
++  );
++
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// AMF parameters:
++    amf_ip_address      = ( { ipv4       = "192.168.0.80";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++
++    NETWORK_INTERFACES :
++    {
++        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
++        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.201/24";
++        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
++        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.201/24";
++        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
++    };
++
++  }
++);
++
++MACRLCs = (
++{
++  num_cc                      = 1;
++  tr_s_preference             = "local_L1";
++  tr_n_preference             = "local_RRC";
++  pusch_TargetSNRx10          = 300;
++  pucch_TargetSNRx10          = 300;
++  pusch_FailureThres          = 1000;
++  ulsch_max_frame_inactivity  = 0;
++  ul_max_mcs                  = 28;
++}
++);
++
++L1s = (
++{
++  num_cc                = 1;
++  tr_n_preference       = "local_mac";
++  prach_dtx_threshold   = 120;
++  pucch0_dtx_threshold  = 80;
++}
++);
++
++RUs = (
++{
++  local_rf       = "yes"
++  nb_tx          = 2
++  nb_rx          = 2
++  att_tx         = 0
++  att_rx         = 0;
++  bands          = [78];
++  max_pdschReferenceSignalPower = -27;
++  max_rxgain                    = 102;
++  eNB_instances  = [0];
++  ##beamforming 1x2 matrix: 1 layer x 2 antennas
++  bf_weights = [0x00007fff, 0x0000];
++  #clock_src = "internal";
++  sdr_addrs = "dev=pciex:0,auxdac1=1630";
++}
++);
++
++THREAD_STRUCT = (
++{
++  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++  parallel_config    = "PARALLEL_SINGLE_THREAD";
++  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++  worker_config      = "WORKER_ENABLE";
++}
++);
++
++rfsimulator :
++{
++  serveraddr = "server";
++  serverport = "4043";
++  options = (); #("saviq"); or/and "chanmod"
++  modelname = "AWGN";
++  IQfile = "/tmp/rfsimulator.iqs";
++};
++
++security = {
++  # preferred ciphering algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nea0, nea1, nea2, nea3
++  ciphering_algorithms = ( "nea0" );
++
++  # preferred integrity algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nia0, nia1, nia2, nia3
++  integrity_algorithms = ( "nia2", "nia0" );
++
++  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
++  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
++  drb_ciphering = "yes";
++  drb_integrity = "no";
++};
++
++log_config :
++{
++  global_log_level                      ="info";
++  hw_log_level                          ="info";
++  phy_log_level                         ="info";
++  mac_log_level                         ="info";
++  rlc_log_level                         ="info";
++  pdcp_log_level                        ="info";
++  rrc_log_level                         ="info";
++  ngap_log_level                        ="debug";
++  f1ap_log_level                        ="debug";
++};
+diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf
+new file mode 100644
+index 0000000000..48a0b68bef
+--- /dev/null
++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf
+@@ -0,0 +1,271 @@
++Active_gNBs = ( "gNB-OAI");
++# Asn1_verbosity, choice in: none, info, annoying
++Asn1_verbosity = "none";
++
++gNBs =
++(
++ {
++    ////////// Identification parameters:
++    gNB_ID    =  0xe00;
++    gNB_name  =  "gNB-OAI";
++
++    // Tracking area code, 0x0000 and 0xfffe are reserved values
++    tracking_area_code  =  1;
++    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); });
++
++    nr_cellid = 12345678L;
++
++    ////////// Physical parameters:
++
++    ssb_SubcarrierOffset  = 0;
++    pdsch_AntennaPorts_XP = 1;
++    pusch_AntennaPorts    = 1;
++    do_CSIRS              = 1;
++    ul_prbblacklist       = "135,136,137,138"
++
++    servingCellConfigCommon = (
++    {
++ #spCellConfigCommon
++
++      physCellId                                                    = 0;
++
++#  downlinkConfigCommon
++    #frequencyInfoDL
++      # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
++      absoluteFrequencySSB                                          = 623232;
++      dl_frequencyBand                                              = 78;
++      # this is 3300.24 MHz
++      dl_absoluteFrequencyPointA                                    = 620016;
++      #scs-SpecificCarrierList
++        dl_offstToCarrier                                           = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        dl_subcarrierSpacing                                        = 1;
++        dl_carrierBandwidth                                         = 273;
++     #initialDownlinkBWP
++      #genericParameters
++       initialDLBWPlocationAndBandwidth                             = 1099;
++       #
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialDLBWPsubcarrierSpacing                               = 1;
++      #pdcch-ConfigCommon
++        initialDLBWPcontrolResourceSetZero                          = 12;
++        initialDLBWPsearchSpaceZero                                 = 10;
++
++  #uplinkConfigCommon
++     #frequencyInfoUL
++      ul_frequencyBand                                              = 78;
++      #scs-SpecificCarrierList
++      ul_offstToCarrier                                             = 0;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      ul_subcarrierSpacing                                          = 1;
++      ul_carrierBandwidth                                           = 273;
++      pMax                                                          = 20;
++     #initialUplinkBWP
++      #genericParameters
++        initialULBWPlocationAndBandwidth                            = 1099;
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++        initialULBWPsubcarrierSpacing                               = 1;
++      #rach-ConfigCommon
++        #rach-ConfigGeneric
++          prach_ConfigurationIndex                                  = 98;
++#prach_msg1_FDM
++#0 = one, 1=two, 2=four, 3=eight
++          prach_msg1_FDM                                            = 0;
++          prach_msg1_FrequencyStart                                 = 0;
++          zeroCorrelationZoneConfig                                 = 12;
++          preambleReceivedTargetPower                               = -90;
++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
++          preambleTransMax                                          = 6;
++#powerRampingStep
++# 0=dB0,1=dB2,2=dB4,3=dB6
++        powerRampingStep                                            = 1;
++#ra_ReponseWindow
++#1,2,4,8,10,20,40,80
++        ra_ResponseWindow                                           = 4;
++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
++#oneHalf (0..15) 4,8,12,16,...60,64
++        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
++#ra_ContentionResolutionTimer
++#(0..7) 8,16,24,32,40,48,56,64
++        ra_ContentionResolutionTimer                                = 7;
++        rsrp_ThresholdSSB                                           = 19;
++#prach-RootSequenceIndex_PR
++#1 = 839, 2 = 139
++        prach_RootSequenceIndex_PR                                  = 2;
++        prach_RootSequenceIndex                                     = 1;
++        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
++        #
++        msg1_SubcarrierSpacing                                      = 1,
++# restrictedSetConfig
++# 0=unrestricted, 1=restricted type A, 2=restricted type B
++        restrictedSetConfig                                         = 0,
++
++        msg3_DeltaPreamble                                          = 1;
++        p0_NominalWithGrant                                         =-90;
++
++# pucch-ConfigCommon setup :
++# pucchGroupHopping
++# 0 = neither, 1= group hopping, 2=sequence hopping
++        pucchGroupHopping                                           = 0;
++        hoppingId                                                   = 40;
++        p0_nominal                                                  = -70;
++# ssb_PositionsInBurs_BitmapPR
++# 1=short, 2=medium, 3=long
++      ssb_PositionsInBurst_PR                                       = 2;
++      ssb_PositionsInBurst_Bitmap                                   = 1;
++
++# ssb_periodicityServingCell
++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
++      ssb_periodicityServingCell                                    = 2;
++
++# dmrs_TypeA_position
++# 0 = pos2, 1 = pos3
++      dmrs_TypeA_Position                                           = 0;
++
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      subcarrierSpacing                                             = 1;
++
++
++  #tdd-UL-DL-ConfigurationCommon
++# subcarrierSpacing
++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
++      referenceSubcarrierSpacing                                    = 1;
++      # pattern1
++      # dl_UL_TransmissionPeriodicity
++      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
++      dl_UL_TransmissionPeriodicity                                 = 6;
++      nrofDownlinkSlots                                             = 7;
++      nrofDownlinkSymbols                                           = 6;
++      nrofUplinkSlots                                               = 2;
++      nrofUplinkSymbols                                             = 4;
++
++  ssPBCH_BlockPower                                                 = -5;
++  }
++
++  );
++
++
++    # ------- SCTP definitions
++    SCTP :
++    {
++        # Number of streams to use in input/output
++        SCTP_INSTREAMS  = 2;
++        SCTP_OUTSTREAMS = 2;
++    };
++
++
++    ////////// AMF parameters:
++    amf_ip_address      = ( { ipv4       = "192.168.0.80";
++                              ipv6       = "192:168:30::17";
++                              active     = "yes";
++                              preference = "ipv4";
++                            }
++                          );
++
++
++    NETWORK_INTERFACES :
++    {
++        GNB_INTERFACE_NAME_FOR_NG_AMF            = "demo-oai";
++        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.0.201/24";
++        GNB_INTERFACE_NAME_FOR_NGU               = "demo-oai";
++        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.0.201/24";
++        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
++    };
++
++  }
++);
++
++MACRLCs = (
++{
++  num_cc                      = 1;
++  tr_s_preference             = "local_L1";
++  tr_n_preference             = "local_RRC";
++  pusch_TargetSNRx10          = 300;
++  pucch_TargetSNRx10          = 300;
++  pusch_FailureThres          = 1000;
++  ulsch_max_frame_inactivity  = 0;
++#  ul_max_mcs                  = 28;
++}
++);
++
++L1s = (
++{
++  num_cc = 1;
++  tr_n_preference = "local_mac";
++  prach_dtx_threshold = 120;
++  pucch0_dtx_threshold = 80;
++}
++);
++
++RUs = (
++{
++  local_rf       = "yes"
++  nb_tx          = 1;
++  nb_rx          = 1;
++  att_tx         = 0;
++  att_rx         = 0;
++  bands          = [78];
++  max_pdschReferenceSignalPower = -27;
++  max_rxgain                    = 102;
++  eNB_instances  = [0];
++  ##beamforming 1x2 matrix: 1 layer x 2 antennas
++  bf_weights = [0x00007fff, 0x0000];
++  #clock_src = "internal";
++  sdr_addrs = "dev=pciex:0,auxdac1=1630";
++}
++);
++
++THREAD_STRUCT = (
++{
++  #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
++  parallel_config    = "PARALLEL_SINGLE_THREAD";
++  #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
++  worker_config      = "WORKER_ENABLE";
++}
++);
++
++rfsimulator :
++{
++  serveraddr = "server";
++  serverport = "4043";
++  options = (); #("saviq"); or/and "chanmod"
++  modelname = "AWGN";
++  IQfile = "/tmp/rfsimulator.iqs";
++};
++
++security = {
++  # preferred ciphering algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nea0, nea1, nea2, nea3
++  ciphering_algorithms = ( "nea0" );
++
++  # preferred integrity algorithms
++  # the first one of the list that an UE supports in chosen
++  # valid values: nia0, nia1, nia2, nia3
++  integrity_algorithms = ( "nia2", "nia0" );
++
++  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
++  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
++  drb_ciphering = "yes";
++  drb_integrity = "no";
++};
++
++log_config :
++{
++  global_log_level                      ="info";
++  hw_log_level                          ="info";
++  phy_log_level                         ="info";
++  mac_log_level                         ="info";
++  rlc_log_level                         ="info";
++  pdcp_log_level                        ="info";
++  rrc_log_level                         ="info";
++  ngap_log_level                        ="debug";
++  f1ap_log_level                        ="debug";
++};
+-- 
+2.25.1
+
-- 
2.26.2