diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py
index ec1202cb21..0865d4efb5 100644
--- a/ci-scripts/cls_oaicitest.py
+++ b/ci-scripts/cls_oaicitest.py
@@ -535,7 +535,7 @@ class OaiCiTest():
while (doOutterLoop):
SSH.command('cd ' + self.UESourceCodePath + '/cmake_targets/ran_build/build', '\$', 5)
SSH.command('echo ' + self.UEPassword + ' | sudo -S rm -Rf ' + self.UESourceCodePath + '/cmake_targets/ue_' + self.testCase_id + '.log', '\$', 5)
- SSH.command('echo $USER; nohup sudo -E ./my-lte-uesoftmodem-run' + str(self.UE_instance) + '.sh' + ' > ' + self.UESourceCodePath + '/cmake_targets/ue_' + self.testCase_id + '.log ' + ' 2>&1 &', self.UEUserName, 5)
+ SSH.command('echo $USER; nohup sudo -E stdbuf -o0 ./my-lte-uesoftmodem-run' + str(self.UE_instance) + '.sh' + ' > ' + self.UESourceCodePath + '/cmake_targets/ue_' + self.testCase_id + '.log ' + ' 2>&1 &', self.UEUserName, 5)
time.sleep(6)
SSH.command('cd ../..', '\$', 5)
doLoop = True
diff --git a/ci-scripts/conf_files/enb.band38.lte_2x2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.lte_2x2.100PRB.usrpn310.conf
index 24c35dedbf..fe2e031acb 100644
--- a/ci-scripts/conf_files/enb.band38.lte_2x2.100PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/enb.band38.lte_2x2.100PRB.usrpn310.conf
@@ -211,8 +211,8 @@ MACRLCs = (
bler_target_upper = 20.0;
bler_target_lower = 10.0;
max_ul_rb_index = 27;
- puSch10xSnr = 200;
- puCch10xSnr = 150;
+ puSch10xSnr = 190;
+ puCch10xSnr = 160;
}
);
@@ -231,8 +231,8 @@ RUs = (
local_rf = "yes"
nb_tx = 2
nb_rx = 2
- att_tx = 0
- att_rx = 0;
+ att_tx = 10
+ att_rx = 5;
bands = [38];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
diff --git a/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf
index 4a16a64105..a0742c57a6 100644
--- a/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf
@@ -211,8 +211,8 @@ MACRLCs = (
bler_target_upper = 20.0;
bler_target_lower = 10.0;
max_ul_rb_index = 27;
- puSch10xSnr = 200;
- puCch10xSnr = 150;
+ puSch10xSnr = 190;
+ puCch10xSnr = 160;
}
);
@@ -231,8 +231,8 @@ RUs = (
local_rf = "yes"
nb_tx = 2
nb_rx = 2
- att_tx = 0
- att_rx = 0;
+ att_tx = 10
+ att_rx = 5;
bands = [38];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
diff --git a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
index bccd37abe9..480ba3952a 100644
--- a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
@@ -211,8 +211,8 @@ MACRLCs = (
bler_target_upper = 20.0;
bler_target_lower = 10.0;
max_ul_rb_index = 27;
- puSch10xSnr = 200;
- puCch10xSnr = 150;
+ puSch10xSnr = 190;
+ puCch10xSnr = 160;
}
);
@@ -232,7 +232,7 @@ RUs = (
nb_tx = 2
nb_rx = 2
att_tx = 0
- att_rx = 0;
+ att_rx = 5;
bands = [38];
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
index 7e2f640424..223a0275c4 100644
--- a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
@@ -22,8 +22,6 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
- pusch_TargetSNRx10 = 200;
- pucch_TargetSNRx10 = 200;
ul_prbblacklist = "51,52,53,54"
servingCellConfigCommon = (
@@ -239,8 +237,7 @@ RUs = (
THREAD_STRUCT = (
{
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
- parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
- //parallel_config = "PARALLEL_SINGLE_THREAD";
+ parallel_config = "PARALLEL_SINGLE_THREAD";
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
worker_config = "WORKER_ENABLE";
}
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
index 70535cadd8..0c75080398 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -219,7 +219,7 @@ RUs = (
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
- sdr_addrs = "addr=192.168.20.2";
+ sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=192.168.18.85";
}
);
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index f95ce90c66..beb89370d2 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -485,7 +485,7 @@ class RANManagement():
mySSH.command('chmod 775 ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf enb_' + self.testCase_id + '.log', '\$', 5)
- mySSH.command('echo $USER; nohup sudo -E ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh > ' + lSourcePath + '/cmake_targets/enb_' + self.testCase_id + '.log 2>&1 &', lUserName, 10)
+ mySSH.command('echo $USER; nohup sudo -E stdbuf -o0 ./my-lte-softmodem-run' + str(self.eNB_instance) + '.sh > ' + lSourcePath + '/cmake_targets/enb_' + self.testCase_id + '.log 2>&1 &', lUserName, 10)
#stats monitoring during runtime
diff --git a/ci-scripts/xml_files/gnb_usrp_build.xml b/ci-scripts/xml_files/gnb_usrp_build.xml
index e2662180c5..97f85c6a33 100644
--- a/ci-scripts/xml_files/gnb_usrp_build.xml
+++ b/ci-scripts/xml_files/gnb_usrp_build.xml
@@ -34,7 +34,7 @@
TesteNB
Build_eNB
Build gNB (USRP)
- --gNB -w USRP --ninja
+ --gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169
True
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 46e33e8803..721f78eceb 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -53,7 +53,6 @@ include_directories("/usr/local/include/")
add_list2_option(RF_BOARD "None" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU" "EXMIMO")
if (${RF_BOARD} STREQUAL "OAI_USRP")
find_package(Boost REQUIRED)
- include_directories(${LIBBOOST_INCLUDE_DIR})
elseif (${RF_BOARD} STREQUAL "OAI_IRIS")
include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
@@ -705,11 +704,14 @@ set (SHLIB_LOADER_SOURCES
# include RF devices / transport protocols library modules
######################################################################
-include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
set(HWLIB_USRP_SOURCE
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
)
add_library(oai_usrpdevif MODULE ${HWLIB_USRP_SOURCE} )
+target_include_directories(oai_usrpdevif PRIVATE
+ "${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/"
+ ${Boost_INCLUDE_DIR}
+)
target_link_libraries(oai_usrpdevif uhd)
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index c65728a41d..5cafb95cba 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -59,19 +59,24 @@ BUILD_ECLIPSE=0
NR="False"
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope"
RU=0
-trap handle_ctrl_c INT
+CMAKE_C_FLAGS=()
+CMAKE_CXX_FLAGS=()
function print_help() {
echo_info "
-This program installs OpenAirInterface Software
-You should have ubuntu 16.xx or 18.04 updated
-Options
+This script compiles OpenAirInterface Software, and can install dependencies
+for a number of distributions (Ubuntu 18-22, Fedora, RHEL7/8).
+Options:
+--arch-native
+ Passes -march=native to the compiler.
-c | --clean
Erase all files to make a rebuild from start
-C | --clean-all
Erase all files made by previous compilations, installations
--clean-kernel
Erase previously installed features in kernel: iptables, drivers, ...
+--cmake-opt
+ Pass the supplied option verbatim to cmake.
-d | --build-dir
Sets build directory (will be /cmake_targets//build)
-I | --install-external-packages
@@ -183,6 +188,10 @@ function main() {
until [ -z "$1" ]
do
case "$1" in
+ --arch-native)
+ CMAKE_C_FLAGS+=("-march=native")
+ CMAKE_CXX_FLAGS+=("-march=native")
+ shift;;
-c | --clean)
CLEAN=1
shift;;
@@ -193,9 +202,12 @@ function main() {
clean_kernel
echo_info "Erased iptables config and removed modules from kernel"
shift;;
+ --cmake-opt)
+ CMAKE_CMD="$CMAKE_CMD $2"
+ shift 2;;
-d | --build-dir)
BUILD_DIR=$2
- shift;;
+ shift 2;;
-I | --install-external-packages)
INSTALL_EXTERNAL=1
echo_info "Will install external packages"
@@ -565,8 +577,7 @@ function main() {
#fi
fi
echo_info "Installing protobuf/protobuf-c for flexran agent support"
- install_protobuf_from_source
- install_protobuf_c_from_source
+ install_protobuf_c
echo_success "protobuf/protobuf-c installation successful"
fi
@@ -575,19 +586,6 @@ function main() {
check_install_additional_tools
fi
-
-
- echo_info "3. building the compilation directives ..."
-
- DIR=$OPENAIR_DIR/cmake_targets
-
- [ "$CLEAN" = "1" ] && rm -rf $DIR/$BUILD_DIR/build
- mkdir -p $DIR/$BUILD_DIR/build
-
- cd $DIR/$BUILD_DIR/build
- echo_info "running $CMAKE_CMD"
- eval $CMAKE_CMD ../..
-
execlist=""
if [ "$eNB" = "1" ] ; then
execlist="$execlist lte-softmodem"
@@ -607,10 +605,27 @@ function main() {
if [ "$nrUE" = 1 ] ; then
execlist="$execlist nr-uesoftmodem"
fi
-
if [ "$ittiSIM" = "1" ] ; then
execlist="$execlist nr-ittisim"
fi
+
+ if [[ "$execlist" == "" && "$SIMUS_PHY" != "1" ]]; then
+ echo_success "installing dependencies successful"
+ exit
+ fi
+
+ echo_info "3. building the compilation directives ..."
+
+ DIR=$OPENAIR_DIR/cmake_targets
+
+ [ "$CLEAN" = "1" ] && rm -rf $DIR/$BUILD_DIR/build
+ mkdir -p $DIR/$BUILD_DIR/build
+
+ cd $DIR/$BUILD_DIR/build
+ if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi
+ if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
+ echo_info "running $CMAKE_CMD"
+ eval $CMAKE_CMD ../..
for f in $execlist ; do
echo_info "Compiling $f..."
diff --git a/cmake_targets/install_external_packages.ubuntu20 b/cmake_targets/install_external_packages.ubuntu20
deleted file mode 100755
index a2f6a9709c..0000000000
--- a/cmake_targets/install_external_packages.ubuntu20
+++ /dev/null
@@ -1,499 +0,0 @@
-#!/bin/bash
-#/*
-# * 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.1 (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
-# */
-
-# brief
-# authors Laurent Thomas
-#
-#######################################
-
-if [ ! -f /etc/os-release ]; then
- echo "No /etc/os-release file found. You're likely on an unsupported distro."
- exit 1
-fi
-OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g")
-OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g")
-case "$OS_DISTRO" in
- ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt"; CMAKE="cmake" ;;
-esac
-
-SUDO='sudo -E'
-
-###############################
-## echo and family
-###############################
-black='\E[30m'
-red='\E[31m'
-green='\E[32m'
-yellow='\E[33m'
-blue='\E[1;34m'
-magenta='\E[35m'
-cyan='\E[36m'
-white='\E[37m'
-reset_color='\E[00m'
-COLORIZE=1
-
-cecho() {
- # Color-echo
- # arg1 = message
- # arg2 = color
- local default_msg="No Message."
- message=${1:-$default_msg}
- color=${2:-$green}
- [ "$COLORIZE" = "1" ] && message="$color$message$reset_color"
- echo -e "$message"
- return
-}
-
-echo_error() { cecho "$* $red" ;}
-echo_fatal() { cecho "$* $red"; exit 1 ;}
-echo_warning() { cecho "$* $yellow" ;}
-echo_success() { cecho "$* $green" ;}
-echo_info() { cecho "$* $blue" ;}
-
-########################
-# distribution helpers #
-########################
-
-# This function return a string to identify the distribution we are running
-# Examples:
-# ubuntu16.04
-# debian8.5
-get_distribution_release() {
- echo "$OS_DISTRO$OS_RELEASE"
-}
-
-check_supported_distribution() {
- case $(get_distribution_release) in
- "ubuntu20.04") return 0 ;;
- "ubuntu20.10") return 0 ;;
- "ubuntu21.04") return 0 ;;
- "ubuntu21.10") return 0 ;;
- esac
- return 1
-}
-
-##################
-# Error handlers #
-##################
-
-handler_EXIT() {
- local exit_code=$?
- [ "$exit_code" -eq 0 ] || echo_error "build have failed"
- exit $exit_code
-}
-
-trap handler_EXIT EXIT
-
-###########################
-# Cleaners
-###########################
-
-clean_kernel() {
- $SUDO modprobe ip_tables
- $SUDO modprobe x_tables
- $SUDO iptables -P INPUT ACCEPT
- $SUDO iptables -F INPUT
- $SUDO iptables -P OUTPUT ACCEPT
- $SUDO iptables -F OUTPUT
- $SUDO iptables -P FORWARD ACCEPT
- $SUDO iptables -F FORWARD
- $SUDO iptables -t nat -F
- $SUDO iptables -t mangle -F
- $SUDO iptables -t filter -F
- $SUDO iptables -t raw -F
- echo_info "Flushed iptables"
- $SUDO rmmod nasmesh > /dev/null 2>&1
- $SUDO rmmod oai_nw_drv > /dev/null 2>&1
- $SUDO rmmod openair_rf > /dev/null 2>&1
- $SUDO rmmod ue_ip > /dev/null 2>&1
- echo_info "removed drivers from kernel"
-}
-
-clean_all_files() {
- set_openair_env
- rm -rf "$OPENAIR_DIR"/targets/bin/*
- dir="$OPENAIR_DIR/cmake_targets"
- rm -rf "$dir"/log/*
- rm -rf "$dir"/ran_build/build
- rm -rf "$dir"/ran_build_noLOG/build
- rm -rf "$dir"/lte-simulators/build
- rm -rf "$dir"/nas_sim_tools/build
- rm -rf "$dir"/oaisim_build_oai/build
- rm -rf "$dir"/oaisim_build_oai/CMakeLists.txt
- rm -rf "$dir"/autotests/bin
- rm -rf "$dir"/autotests/log
- rm -rf "$dir"/autotests/*/build
-}
-
-############################################
-# External packages installers
-############################################
-
-install_protobuf_from_source(){
- protobuf_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_install_log.txt
- echo_info "\nInstalling Google Protobuf from sources. The log file for Protobuf installation is here: $protobuf_install_log "
- (
- cd /tmp || exit
- echo "Downloading protobuf"
- #rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1
- #wget https://github.com/protocolbuffers/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
- #tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
- #cd protobuf-2.6.1/
- rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
- wget --tries=3 --retry-connrefused https://github.com/protocolbuffers/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
- tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner "$USER" --group "$(groups | cut -d" " -f1)" --no-same-owner
- cd protobuf-3.3.0/ || exit
- ./configure
- echo "Compiling protobuf"
- make -j"$(nproc)"
- $SUDO make install
- $SUDO ldconfig
- ) >& "$protobuf_install_log"
-}
-
-install_protobuf_c_from_source(){
- protobuf_c_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_c_install_log.txt
- echo_info "\nInstalling Google Protobuf_C from sources. The log file for Protobuf_C installation is here: $protobuf_c_install_log "
- (
- if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
- export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
- fi
- cd /tmp || exit
- echo "Downloading protobuf-c"
- rm -rf /tmp/protobuf-c
- git clone https://github.com/protobuf-c/protobuf-c.git
- cd protobuf-c || exit
- git checkout 2a46af42784abf86804d536f6e0122d47cfeea45
- ./autogen.sh
- ./configure
- echo "Compiling protobuf-c"
- make -j"$(nproc)"
- $SUDO make install
- $SUDO ldconfig
- ) >& "$protobuf_c_install_log"
-}
-
-install_usrp_uhd_driver_from_source(){
- uhd_install_log=$OPENAIR_DIR/cmake_targets/log/uhd_install_log.txt
- echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log "
- (
- cd /tmp || exit
- echo "Downloading UHD driver"
- rm -rf /tmp/uhd
- git clone https://github.com/EttusResearch/uhd.git
- cd uhd || exit
- git checkout UHD-3.15.LTS
- mkdir -p host/build
- cd host/build || exit
- $CMAKE ../ -GNinja
- echo "Compiling UHD"
- ninja
- $SUDO ninja install
- $SUDO ldconfig
- $SUDO /usr/lib/uhd/utils/uhd_images_downloader.py
- ) >& "$uhd_install_log"
-}
-
-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 "
- (
- cd /tmp || exit
- echo "Downloading BladeRF driver"
- rm -rf /tmp/bladeRF
- git clone https://github.com/Nuand/bladeRF.git
- cd bladeRF || exit
- git checkout tags/2016.06
- mkdir -p build
- cd build || exit
- $CMAKE ../
- echo "Compiling BladeRF driver"
- make -j"$(nproc)"
- $SUDO make install
- $SUDO ldconfig
- echo "Downloading FPGA and firmware images"
- cd /tmp/bladeRF || exit
- wget --tries=3 --retry-connrefused https://www.nuand.com/fx3/bladeRF_fw_latest.img
- wget --tries=3 --retry-connrefused https://www.nuand.com/fpga/hostedx40-latest.rbf
- sudo mkdir -p /usr/share/Nuand/bladeRF
- sudo mv bladeRF_fw_latest.img /usr/share/Nuand/bladeRF/bladeRF_fw.img
- sudo mv hostedx40-latest.rbf /usr/share/Nuand/bladeRF/hostedx40.rbf
- ) >& "$bladerf_install_log"
-}
-
-check_install_bladerf_driver(){
- if [[ "$OS_DISTRO" == "ubuntu" ]]; then
- $SUDO apt-get install -y bladerf libbladerf-dev
- $SUDO apt-get install -y bladerf-firmware-fx3
- $SUDO apt-get install -y bladerf-fpga-hostedx40
- elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
- install_bladerf_driver_from_source
- else
- echo_error "BladeRF Installer for OAI does not support automatic build. Install BladeRF compiling sources manually from BladeRF website"
- fi
-}
-
-flash_firmware_bladerf() {
- $SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
-}
-
-install_soapy_from_source(){
- soapy_install_log=$OPENAIR_DIR/cmake_targets/log/soapy_install_log.txt
- echo_info "\nInstalling Soapy EcoSystem from source. The log file for Soapy installation is here: $soapy_install_log "
- (
- cd /tmp || exit
- echo "Downloading SoapySDR"
- rm -rf /tmp/soapysdr
- git clone -b soapy-sdr-0.7.0 --single-branch https://github.com/pothosware/SoapySDR.git
- cd SoapySDR || exit
- #git checkout tags/release_003_010_001_001
- mkdir -p build
- cd build || exit
- $CMAKE ../
- echo "Compiling SoapySDR"
- make -j"$(nproc)"
- $SUDO make install
- $SUDO ldconfig
- cd /tmp || exit
- echo "Downloading SoapyRemote"
- rm -rf /tmp/soapyremote
- git clone -b soapy-remote-0.5.0 --single-branch https://github.com/pothosware/SoapyRemote.git
- cd SoapyRemote || exit
- #git checkout tags/release_003_010_001_001
- mkdir -p build
- cd build || exit
- cmake ../
- echo "Compiling SoapyRemote"
- make -j"$(nproc)"
- $SUDO make install
- $SUDO ldconfig
- ) >& "$soapy_install_log"
-}
-
-install_soapy_iris_from_source(){
- iris_install_log=$OPENAIR_DIR/cmake_targets/log/iris_install_log.txt
- echo_info "\nInstalling Iris driver from source. The log file for Iris driver installation is here: $iris_install_log "
- (
- cd /tmp || exit
- echo "Downloading SoapyIris"
- rm -rf /tmp/sklk-soapyiris
- git clone -b soapy-iris-2018.08.0.1 --single-branch https://github.com/skylarkwireless/sklk-soapyiris.git
- cd sklk-soapyiris || exit
- mkdir -p build
- cd build ||exit
- cmake ../
- echo "Compiling SoapyIris"
- make -j"$(nproc)"
- $SUDO make install
- $SUDO ldconfig
- ) >& "$iris_install_log"
-}
-
-check_install_soapy () {
- #if [[ "$OS_DISTRO" == "ubuntu" ]]; then
- #first we remove old installation
- $SUDO apt-get remove -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote || true
- #$SUDO add-apt-repository -y ppa:myriadrf/drivers
- #$SUDO apt-get update
- #$SUDO apt-get install -y soapysdr soapysdr-server libsoapysdr-dev python-soapysdr python3-soapysdr soapysdr-module-remote
-
- #elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
- # $SUDO $INSTALLER -y install software-properties-common python3-software-properties python-software-properties subversion git python3 python-numpy python3-numpy cmake swig python-dev
- install_soapy_from_source
- #fi
- install_soapy_iris_from_source
-
-}
-
-check_install_ubuntu_packages() {
- $SUDO $INSTALLER update -y
- if [[ "$OS_DISTRO" == "ubuntu" ]]; then
- local LAPACK_LIBNAME="liblapack.so"
- local LAPACK_TARGET="/usr/lib/atlas-base/atlas/liblapack.so"
- $SUDO apt install -y software-properties-common
- case "$(get_distribution_release)" in
- "ubuntu20.04")
- specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev"
- LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
- LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
- ;;
- "ubuntu21.04")
- specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev"
- LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
- LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
- ;;
- esac
- $SUDO $INSTALLER install -y \
- $specific_packages \
- check \
- dialog \
- dkms \
- gawk \
- libboost-all-dev \
- libpthread-stubs0-dev \
- openvpn \
- pkg-config \
- python3-dev \
- sshfs \
- swig \
- tshark \
- uml-utilities \
- unzip \
- valgrind \
- vlan \
- exuberant-ctags \
- ntpdate \
- iperf3 \
- android-tools-adb \
- wvdial \
- sshpass \
- nscd \
- bc \
- ntp \
- python3-scipy \
- python3-matplotlib \
- bison \
- build-essential \
- cmake \
- cmake-curses-gui \
- ninja-build \
- doxygen \
- doxygen-gui \
- texlive-latex-base \
- ethtool \
- flex \
- gdb \
- git \
- graphviz \
- gtkwave \
- iperf \
- iptables \
- libxtables-dev \
- libatlas-base-dev \
- libblas-dev \
- liblapack-dev\
- liblapacke-dev\
- libffi-dev \
- libforms-bin \
- libforms-dev \
- libgcrypt20-dev \
- libgmp-dev \
- libgtk-3-dev \
- libidn2-0-dev \
- libidn11-dev \
- libmysqlclient-dev \
- libpython2.7-dev \
- libsctp1 \
- libsctp-dev \
- libssl-dev \
- libtool \
- libusb-1.0-0-dev \
- libxml2 \
- libxml2-dev \
- libxslt1-dev \
- octave-signal \
- openssh-client \
- openssh-server \
- openssl \
- python3 \
- subversion \
- xmlstarlet \
- python3-pip \
- libyaml-dev \
- wget \
- libxpm-dev \
- libboost-all-dev \
- nettle-dev \
- nettle-bin \
- libreadline-dev
- fi
-
- $SUDO update-alternatives --set "$LAPACK_LIBNAME" "$LAPACK_TARGET"
-
-}
-
-install_asn1c_from_source(){
- asn1_install_log=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt
- echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log "
- (
- $SUDO rm -rf /tmp/asn1c
- # GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
- git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
- cd /tmp/asn1c || exit
- # better to use a given commit than a branch in case the branch
- # is updated and requires modifications in the source of OAI
- #git checkout velichkov_s1ap_plus_option_group
- git checkout f12568d617dbf48497588f8e227d70388fa217c9
- autoreconf -iv
- ./configure
- make -j"$(nproc)"
- $SUDO make install
- cd - || exit
- $SUDO ldconfig
- ) > "$asn1_install_log" 2>&1
-}
-
-################################
-# set_openair_env
-###############################
-set_openair_env(){
- fullpath=$(readlink -f "${BASH_SOURCE[0]}")
- [ -f "/.$fullpath" ] || fullpath=$(readlink -f "$PWD/$fullpath")
- openair_path=${fullpath%/cmake_targets/*}
- openair_path=${openair_path%/targets/*}
- openair_path=${openair_path%/openair[123]/*}
- export OPENAIR_DIR=$openair_path
- export OPENAIR1_DIR=$openair_path/openair1
- export OPENAIR2_DIR=$openair_path/openair2
- export OPENAIR3_DIR=$openair_path/openair3
- export OPENAIR_TARGETS=$openair_path/targets
-}
-
-if ! check_supported_distribution; then
- echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
- exit 1
-fi
-set_openair_env
-echo_info "Installing packages"
-check_install_ubuntu_packages
-
-echo_info "installing ASN.1 compiler"
-install_asn1c_from_source
-
-echo_info "installing protobuf/protobuf-c for flexran agent support"
-install_protobuf_from_source
-install_protobuf_c_from_source
-
-if [ "$1" == "USRP" ] ; then
- echo_info "installing packages for USRP support"
- install_usrp_uhd_driver
-fi
-if [ "$1" == "BLADERF" ] ; then
- echo_info "installing packages for BLADERF support"
- check_install_bladerf_driver
- flash_firmware_bladerf
-fi
-if [ "$1" == "IRIS" ] ; then
- echo_info "installing packages for IRIS support"
- check_install_soapy
- # flash_firmware_iris
-fi
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 55a39c6b2b..554f3ccfe5 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -103,12 +103,12 @@ get_distribution_release() {
check_supported_distribution() {
local distribution=$(get_distribution_release)
case "$distribution" in
+ "ubuntu22.04") return 0 ;;
+ "ubuntu21.04") return 0 ;;
+ "ubuntu20.04") return 0 ;;
"ubuntu18.04") return 0 ;;
- "ubuntu17.10") return 0 ;;
- "ubuntu17.04") return 0 ;;
"ubuntu16.04") return 0 ;;
- "ubuntu14.04") return 0 ;;
- "fedora24") return 0 ;;
+ "fedora35") return 0 ;;
"rhel7") return 0 ;;
"rhel7.6") return 0 ;;
"rhel7.7") return 0 ;;
@@ -315,6 +315,26 @@ install_protobuf_c_from_source(){
) >& $protobuf_c_install_log
}
+install_protobuf_c() {
+ local protobuf_packages=""
+ case "$(get_distribution_release)" in
+ "ubuntu18.04" | "ubuntu20.04" | "ubuntu21.04" | "ubuntu22.04")
+ protobuf_packages="protobuf-c-compiler libprotobuf-c1 libprotobuf-c-dev"
+ ;;
+ esac
+ case "$OS_DISTRO" in
+ "rhel" | "centos" | "fedora") # in EPEL and Fedora repos (at least as of 35)
+ protobuf_packages="protobuf-c-compiler protobuf-c protobuf-c-devel"
+ ;;
+ esac
+ if [[ "$protobuf_packages" == "" ]]; then
+ install_protobuf_from_source
+ install_protobuf_c_from_source
+ else
+ $SUDO $INSTALLER -y install $protobuf_packages
+ fi
+}
+
install_usrp_uhd_driver_from_source(){
uhd_install_log=$OPENAIR_DIR/cmake_targets/log/uhd_install_log.txt
echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log "
@@ -471,10 +491,6 @@ install_bladerf_driver_from_source(){
check_install_bladerf_driver(){
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
- if [ "$(get_distribution_release)" == "ubuntu14.04" ] ; then
- $SUDO add-apt-repository -y ppa:bladerf/bladerf
- $SUDO apt-get update
- fi
$SUDO apt-get install -y bladerf libbladerf-dev
$SUDO apt-get install -y bladerf-firmware-fx3
$SUDO apt-get install -y bladerf-fpga-hostedx40
@@ -574,7 +590,16 @@ check_install_soapy () {
check_install_additional_tools (){
$SUDO $INSTALLER update -y
+ local optional_packages=""
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
+ case "$(get_distribution_release)" in
+ "ubuntu16.04"| "ubuntu18.04")
+ optional_packages="python-dev python-pexpect python-numpy python-scipy python-matplotlib ctags"
+ ;;
+ "ubuntu20.04" | "ubuntu21.04" | "ubuntu22.04" )
+ optional_packages="python3 python3-pip python3-dev python3-scipy python3-matplotlib universal-ctags"
+ ;;
+ esac
PACKAGE_LIST="\
check \
dialog \
@@ -584,8 +609,6 @@ check_install_additional_tools (){
libpthread-stubs0-dev \
openvpn \
pkg-config \
- python-dev \
- python-pexpect \
sshfs \
swig \
tshark \
@@ -593,18 +616,14 @@ check_install_additional_tools (){
unzip \
valgrind \
vlan \
- ctags \
ntpdate \
iperf3 \
android-tools-adb \
wvdial \
- python-numpy \
sshpass \
nscd \
bc \
- ntp \
- python-scipy \
- python-matplotlib"
+ ntp"
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
PACKAGE_LIST="\
check \
@@ -650,22 +669,19 @@ check_install_additional_tools (){
valgrind \
vconfig \
ctags \
- ntpdate \
+ ntpsec \
iperf3 \
wvdial \
python-numpy \
sshpass \
nscd \
- python2-paramiko \
+ python-paramiko \
python-pyroute2 \
python-netifaces \
- python2-scipy \
- python2-matplotlib"
+ python-scipy \
+ python-matplotlib"
fi
- $SUDO $INSTALLER install -y $PACKAGE_LIST
-
- $SUDO rm -fr /opt/ssh
- $SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/ssh.git /opt/ssh
+ $SUDO $INSTALLER install -y $PACKAGE_LIST $optional_packages
#The packages below are already installed for Redhat distros (RHEL, CentOS, Fedora)
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
@@ -696,25 +712,26 @@ check_install_oai_software() {
local LAPACK_TARGET="/usr/lib/atlas-base/atlas/liblapack.so"
$SUDO apt install -y software-properties-common
case "$(get_distribution_release)" in
- "ubuntu14.04")
- specific_packages="libtasn1-3-dev libgnutls-dev libatlas-dev iproute libconfig8-dev"
- # For iperf3
- $SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe"
- $SUDO apt-get update
- ;;
"ubuntu16.04")
- specific_packages="libtasn1-6-dev libgnutls-dev libatlas-dev iproute libconfig8-dev"
+ specific_packages="libtasn1-6-dev libgnutls-dev libatlas-dev iproute libconfig8-dev iptables-dev libgcrypt11-dev python-pip pydb python guile-2.0-dev"
;;
- "ubuntu17.04")
- specific_packages="libtasn1-6-dev libgnutls28-dev libatlas-dev iproute libconfig8-dev"
- ;;
- "ubuntu17.10")
- specific_packages="libtasn1-6-dev libgnutls28-dev iproute libconfig8-dev"
+ "ubuntu18.04")
+ specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev iptables-dev libgcrypt11-dev python-pip pydb python guile-2.0-dev"
LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
;;
- "ubuntu18.04")
- specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev"
+ "ubuntu20.04")
+ specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev python guile-2.0-dev"
+ LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
+ LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
+ ;;
+ "ubuntu21.04")
+ specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev python guile-2.0-dev"
+ LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
+ LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
+ ;;
+ "ubuntu22.04")
+ specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev python2 guile-2.2-dev"
LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
;;
@@ -734,22 +751,21 @@ check_install_oai_software() {
texlive-latex-base \
ethtool \
flex \
+ g++ \
+ gcc \
gdb \
git \
graphviz \
gtkwave \
- guile-2.0-dev \
iperf \
iptables \
- iptables-dev \
libatlas-base-dev \
libblas-dev \
- liblapack-dev\
- liblapacke-dev\
+ liblapack-dev \
+ liblapacke-dev \
libffi-dev \
libforms-bin \
libforms-dev \
- libgcrypt11-dev \
libgmp-dev \
libgtk-3-dev \
libidn2-0-dev \
@@ -769,11 +785,8 @@ check_install_oai_software() {
openssh-client \
openssh-server \
openssl \
- python \
subversion \
xmlstarlet \
- python-pip \
- pydb \
libyaml-dev \
wget \
libxpm-dev \
@@ -791,8 +804,6 @@ check_install_oai_software() {
$SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
fi
$SUDO $INSTALLER install -y python-epdb vim-common
- else
- $SUDO $INSTALLER install -y pydb
fi
$SUDO $INSTALLER install -y \
@@ -804,6 +815,8 @@ check_install_oai_software() {
doxygen \
ethtool \
flex \
+ g++ \
+ gcc \
gdb \
git \
graphviz \
@@ -860,8 +873,6 @@ check_install_oai_software() {
fi
install_asn1c_from_source $1
- $SUDO rm -fr /opt/ssh
- $SUDO git clone https://gist.github.com/2190472.git /opt/ssh
}
install_asn1c_from_source(){
@@ -955,23 +966,3 @@ do
fi
done
}
-
-
-# get from http://www.linuxjournal.com/content/validating-ip-address-bash-script
-validate_ip() {
-
-local ip=$1
-local stat=1
-
-if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
- OIFS=$IFS
- IFS='.'
- ip=($ip)
- IFS=$OIFS
- [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
- && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
- stat=$?
-fi
-
-return $stat
-}
diff --git a/common/utils/system.c b/common/utils/system.c
index d897063144..00839b485c 100644
--- a/common/utils/system.c
+++ b/common/utils/system.c
@@ -234,9 +234,10 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name,
ret=pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno);
- if (system("grep -iq 'ID_LIKE.*fedora' /etc/os-release && uname -a | grep -c rt")==0)
- if (system("cat /proc/self/cgroup | egrep -c 'libpod|podman|kubepods'")==0)
- settingPriority = 0;
+ if (checkIfFedoraDistribution())
+ if (checkIfGenericKernelOnFedora())
+ if (checkIfInsideContainer())
+ settingPriority = 0;
if (settingPriority) {
ret=pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
diff --git a/doc/BUILD.md b/doc/BUILD.md
index 852a248659..a52ce98cb5 100644
--- a/doc/BUILD.md
+++ b/doc/BUILD.md
@@ -77,7 +77,7 @@ cd cmake_targets/
./build_oai -I -w USRP --eNB --UE --nrUE --gNB
```
-- The `-I` option is to install pre-requisites, you only need it the first time you build the softmodem or when some oai dependencies have changed. Note: for Ubuntu 20 use cmake_targets/install_external_packages.ubuntu20 instead!
+- The `-I` option is to install pre-requisites, you only need it the first time you build the softmodem or when some oai dependencies have changed.
- The `-w` option is to select the radio head support you want to include in your build. Radio head support is provided via a shared library, which is called the "oai device" The build script creates a soft link from `liboai_device.so` to the true device which will be used at run-time (here the USRP one,`liboai_usrpdevif.so` . USRP is the only hardware tested today in the Continuous Integration process. The RF simulator[RF simulator](../targets/ARCH/rfsimulator/README.md) is implemented as a specific device replacing RF hardware, it can be specifically built using `-w SIMU` option, but is also built during any softmodem build.
- `--eNB` is to build the `lte-softmodem` executable and all required shared libraries
- `--gNB` is to build the `nr-softmodem` executable and all required shared libraries
diff --git a/docker/Dockerfile.eNB.rhel8.2 b/docker/Dockerfile.eNB.rhel8.2
index 7924f5bd78..5296ac2172 100644
--- a/docker/Dockerfile.eNB.rhel8.2
+++ b/docker/Dockerfile.eNB.rhel8.2
@@ -96,7 +96,7 @@ COPY --from=enb-base \
# Now we are copying from builder-image the UHD files.
COPY --from=enb-base /usr/local/bin/uhd_find_devices /usr/local/bin
-COPY --from=enb-base /usr/local/lib/libprotobuf-c.so.1 /usr/local/lib
+COPY --from=enb-base /usr/lib64/libprotobuf-c.so.1 /usr/local/lib
COPY --from=enb-base /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
COPY --from=enb-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-enb/bin
diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18
index 222a7f42bb..f95a03398a 100644
--- a/docker/Dockerfile.eNB.ubuntu18
+++ b/docker/Dockerfile.eNB.ubuntu18
@@ -83,7 +83,7 @@ COPY --from=enb-build \
COPY --from=enb-base /usr/local/bin/uhd_find_devices /usr/local/bin
COPY --from=enb-base \
/usr/local/lib/libuhd.so.3.15.0 \
- /usr/local/lib/libprotobuf-c.so.1 \
+ /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 \
/usr/local/lib/
COPY --from=enb-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-enb/bin
COPY --from=enb-base \
diff --git a/docker/Dockerfile.gNB.rhel8.2 b/docker/Dockerfile.gNB.rhel8.2
index 6a1b447a62..9ec7ee7556 100644
--- a/docker/Dockerfile.gNB.rhel8.2
+++ b/docker/Dockerfile.gNB.rhel8.2
@@ -100,7 +100,7 @@ COPY --from=gnb-base \
# Now we are copying from builder-image the UHD files.
COPY --from=gnb-base /usr/local/bin/uhd_find_devices /usr/local/bin
-COPY --from=gnb-base /usr/local/lib/libprotobuf-c.so.1 /usr/local/lib
+COPY --from=gnb-base /usr/lib64/libprotobuf-c.so.1 /usr/local/lib
COPY --from=gnb-base /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
COPY --from=gnb-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-gnb/bin
diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18
index 6f990db833..6a98c8d3ce 100644
--- a/docker/Dockerfile.gNB.ubuntu18
+++ b/docker/Dockerfile.gNB.ubuntu18
@@ -84,7 +84,7 @@ COPY --from=gnb-build \
COPY --from=gnb-base /usr/local/bin/uhd_find_devices /usr/local/bin
COPY --from=gnb-base \
/usr/local/lib/libuhd.so.3.15.0 \
- /usr/local/lib/libprotobuf-c.so.1 \
+ /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 \
/usr/local/lib/
COPY --from=gnb-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-gnb/bin
COPY --from=gnb-base \
diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2
index cc1be3d41d..ab7d224939 100644
--- a/docker/Dockerfile.lteUE.rhel8.2
+++ b/docker/Dockerfile.lteUE.rhel8.2
@@ -98,7 +98,7 @@ COPY --from=lte-ue-base \
# Now we are copying from builder-image the UHD files.
COPY --from=lte-ue-base /usr/local/bin/uhd_find_devices /usr/local/bin
-COPY --from=lte-ue-base /usr/local/lib/libprotobuf-c.so.1 /usr/local/lib
+COPY --from=lte-ue-base /usr/lib64/libprotobuf-c.so.1 /usr/local/lib
COPY --from=lte-ue-base /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
COPY --from=lte-ue-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ue/bin
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index 292ac37e5f..b2a0fd6e93 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -86,7 +86,7 @@ COPY --from=lte-ue-build \
COPY --from=lte-ue-base /usr/local/bin/uhd_find_devices /usr/local/bin
COPY --from=lte-ue-base \
/usr/local/lib/libuhd.so.3.15.0 \
- /usr/local/lib/libprotobuf-c.so.1 \
+ /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 \
/usr/local/lib/
COPY --from=lte-ue-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ue/bin
diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2
index d38e81bd71..498e6bedcf 100644
--- a/docker/Dockerfile.nrUE.rhel8.2
+++ b/docker/Dockerfile.nrUE.rhel8.2
@@ -103,7 +103,7 @@ COPY --from=nr-ue-base \
# Now we are copying from builder-image the UHD files.
COPY --from=nr-ue-base /usr/local/bin/uhd_find_devices /usr/local/bin
-COPY --from=nr-ue-base /usr/local/lib/libprotobuf-c.so.1 /usr/local/lib
+COPY --from=nr-ue-base /usr/lib64/libprotobuf-c.so.1 /usr/local/lib
COPY --from=nr-ue-base /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
COPY --from=nr-ue-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-nr-ue/bin
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index 0fa219296b..0edfdd2160 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -88,7 +88,7 @@ COPY --from=nr-ue-build \
COPY --from=nr-ue-base /usr/local/bin/uhd_find_devices /usr/local/bin
COPY --from=nr-ue-base \
/usr/local/lib/libuhd.so.3.15.0 \
- /usr/local/lib/libprotobuf-c.so.1 \
+ /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 \
/usr/local/lib/
COPY --from=nr-ue-base /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-nr-ue/bin
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 00f019c03a..23615b2c98 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -396,7 +396,14 @@ void *rrc_enb_process_msg(void *notUsed) {
int main( int argc, char **argv ) {
- set_priority(79);
+ int set_exe_prio = 1;
+ if (checkIfFedoraDistribution())
+ if (checkIfGenericKernelOnFedora())
+ if (checkIfInsideContainer())
+ set_exe_prio = 0;
+ if (set_exe_prio)
+ set_priority(79);
+
if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1)
{
fprintf(stderr, "mlockall: %s\n", strerror(errno));
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index b9c74c6337..d1015e93e0 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -271,7 +271,7 @@ void nr_dlsim_preprocessor(module_id_t module_id,
/* manually set free CCE to 0 */
const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- sched_ctrl->search_space = get_searchspace(scc, sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, target_ss);
+ sched_ctrl->search_space = get_searchspace(NULL, scc, sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, target_ss);
uint8_t nr_of_candidates;
find_aggregation_candidates(&sched_ctrl->aggregation_level,
&nr_of_candidates,
@@ -281,7 +281,8 @@ void nr_dlsim_preprocessor(module_id_t module_id,
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
- nr_set_pdsch_semi_static(scc,
+ nr_set_pdsch_semi_static(NULL,
+ scc,
UE_info->CellGroup[0],
sched_ctrl->active_bwp,
NULL,
@@ -823,9 +824,9 @@ int main(int argc, char **argv)
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, 0, 0, NULL);
+ rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 0, 0, NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+ rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
// reset preprocessor to the one of DLSIM after it has been set during
// rrc_mac_config_req_gNB
gNB_mac->pre_processor_dl = nr_dlsim_preprocessor;
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index bc612457c0..ddb3d52b9c 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -749,9 +749,9 @@ int main(int argc, char **argv)
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib,0, 0, NULL);
+ rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 0, 0, NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib,1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+ rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
frame_parms->nb_antennas_tx = n_tx;
frame_parms->nb_antennas_rx = n_rx;
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index e9fcee6622..503e04ecb9 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -2061,6 +2061,7 @@ void configure_gnb_du_mac(int inst) {
rrc->configuration.minRXTXTIME,
rrc->configuration.scc,
NULL,
+ NULL,
0,
0, // rnti
(NR_CellGroupConfig_t *)NULL
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 94b7ab18bf..b25efbb5d8 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -2595,9 +2595,10 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
const NR_CellGroupConfig_t *cg,
dci_pdu_rel15_t *dci_pdu,
nr_dci_format_t format,
- nr_rnti_type_t rnti_type,
- uint16_t N_RB,
- int bwp_id) {
+ nr_rnti_type_t rnti_type,
+ uint16_t N_RB,
+ int bwp_id,
+ uint16_t cset0_bwp_size) {
uint16_t size = 0;
uint16_t numRBG = 0;
@@ -2627,15 +2628,17 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
srs_config = (ubwpd->srs_Config) ? ubwpd->srs_Config->choice.setup : NULL;
}
else if (cg){
- bwpd=cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
- bwpc=initialDownlinkBWP;
- ubwpd=cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
- ubwpc=initialUplinkBWP;
- pdsch_Config = (bwpd->pdsch_Config) ? bwpd->pdsch_Config->choice.setup : NULL;
- pdcch_Config = (bwpd->pdcch_Config) ? bwpd->pdcch_Config->choice.setup : NULL;
- pucch_Config = (ubwpd->pucch_Config) ? ubwpd->pucch_Config->choice.setup : NULL;
- pusch_Config = (ubwpd->pusch_Config) ? ubwpd->pusch_Config->choice.setup : NULL;
- srs_config = (ubwpd->srs_Config) ? ubwpd->srs_Config->choice.setup: NULL;
+ bwpc = initialDownlinkBWP;
+ ubwpc = initialUplinkBWP;
+ bwpd = cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated ?
+ cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
+ ubwpd = cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
+ pdsch_Config = (bwpd && bwpd->pdsch_Config) ? bwpd->pdsch_Config->choice.setup : NULL;
+ pdcch_Config = (bwpd && bwpd->pdcch_Config) ? bwpd->pdcch_Config->choice.setup : NULL;
+ pucch_Config = (ubwpd && ubwpd->pucch_Config) ? ubwpd->pucch_Config->choice.setup : NULL;
+ pusch_Config = (ubwpd && ubwpd->pusch_Config) ? ubwpd->pusch_Config->choice.setup : NULL;
+ srs_config = (ubwpd && ubwpd->srs_Config) ? ubwpd->srs_Config->choice.setup: NULL;
}
int n_ul_bwp=1,n_dl_bwp=1;
@@ -2645,7 +2648,9 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
/// fixed: Format identifier 1, Hop flag 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2 Time Domain assgnmt 4 --20
size += 20;
size += (uint8_t)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); // Freq domain assignment -- hopping scenario to be updated
- size += nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id) - size; // Padding to match 1_0 size
+ int dci_10_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id, cset0_bwp_size);
+ AssertFatal(dci_10_size >= size, "NR_UL_DCI_FORMAT_0_0 size is bigger than NR_DL_DCI_FORMAT_1_0! 3GPP TS 38.212 Section 7.3.1.0: DCI size alignment is not fully implemented");
+ size += dci_10_size - size; // Padding to match 1_0 size
// UL/SUL indicator assumed to be 0
break;
@@ -2863,6 +2868,14 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
case NR_DL_DCI_FORMAT_1_0:
/// fixed: Format identifier 1, VRB2PRB 1, MCS 5, NDI 1, RV 2, HARQ PID 4, DAI 2, PUCCH TPC 2, PUCCH RInd 3, PDSCH to HARQ TInd 3 Time Domain assgnmt 4 -- 28
+
+ // 3GPP TS 38.212 Section 7.3.1.0: DCI size alignment
+ // Size of DCI format 1_0 is given by the size of CORESET 0 if CORESET 0 is configured for the cell and the size
+ // of initial DL bandwidth part if CORESET 0 is not configured for the cell
+ if(cset0_bwp_size>0) {
+ N_RB = cset0_bwp_size;
+ }
+
size = 28;
size += (uint8_t)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); // Freq domain assignment
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index c150c4f134..0f2cb42b88 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -54,7 +54,8 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDLBWP,
nr_dci_format_t format,
nr_rnti_type_t rnti_type,
uint16_t N_RB,
- int bwp_id);
+ int bwp_id,
+ uint16_t cset0_bwp_size);
void find_aggregation_candidates(uint8_t *aggregation_level,
uint8_t *nr_of_candidates,
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 3453e071b1..0ee6f5501c 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -169,7 +169,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->SubcarrierSpacing = bwp_Common->genericParameters.subcarrierSpacing;
}
for (int i = 0; i < rel15->num_dci_options; i++) {
- rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, bwp_id);
+ rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
}
break;
case NR_RNTI_RA:
@@ -185,7 +185,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
}
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
- rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, bwp_id);
+ rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
break;
case NR_RNTI_P:
break;
@@ -200,7 +200,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
for (int i = 0; i < rel15->num_dci_options; i++) {
- rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, bwp_id);
+ rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs);
}
break;
case NR_RNTI_SP_CSI:
@@ -223,7 +223,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon + 2;
for (int i = 0; i < rel15->num_dci_options; i++) {
- rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0);
+ rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0, mac->type0_PDCCH_CSS_config.num_rbs);
}
break;
case NR_RNTI_SFI:
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 2483465166..737c116011 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -457,9 +457,10 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
int minRXTXTIMEpdsch,
NR_ServingCellConfigCommon_t *scc,
NR_BCCH_BCH_Message_t *mib,
- int add_ue,
+ NR_BCCH_DL_SCH_Message_t *sib1,
+ int add_ue,
uint32_t rnti,
- NR_CellGroupConfig_t *CellGroup) {
+ NR_CellGroupConfig_t *CellGroup) {
if (scc != NULL ) {
AssertFatal((scc->ssb_PositionsInBurst->present > 0) && (scc->ssb_PositionsInBurst->present < 4), "SSB Bitmap type %d is not valid\n",scc->ssb_PositionsInBurst->present);
@@ -569,28 +570,34 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
}
}
- if (mib) RC.nrmac[Mod_idP]->common_channels[0].mib = mib;
-
+ if (mib) RC.nrmac[Mod_idP]->common_channels[0].mib = mib;
+ if (sib1) RC.nrmac[Mod_idP]->common_channels[0].sib1 = sib1;
+
if (CellGroup) {
- const NR_ServingCellConfig_t *servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated;
- const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig->downlinkBWP_ToAddModList;
- if(bwpList) {
- AssertFatal(bwpList->list.count > 0, "downlinkBWP_ToAddModList has no BWPs!\n");
- for (int i = 0; i < bwpList->list.count; ++i) {
- const NR_BWP_Downlink_t *bwp = bwpList->list.array[i];
- calculate_preferred_dl_tda(Mod_idP, bwp);
- }
- } else {
+ if (get_softmodem_params()->sa) {
calculate_preferred_dl_tda(Mod_idP, NULL);
}
- const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList;
- if(ubwpList) {
- AssertFatal(ubwpList->list.count > 0, "uplinkBWP_ToAddModList no BWPs!\n");
- for (int i = 0; i < ubwpList->list.count; ++i) {
- const NR_BWP_Uplink_t *ubwp = ubwpList->list.array[i];
- calculate_preferred_ul_tda(Mod_idP, ubwp);
+ const NR_ServingCellConfig_t *servingCellConfig = NULL;
+ if(CellGroup->spCellConfig && CellGroup->spCellConfig->spCellConfigDedicated) {
+ servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated;
+ const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig->downlinkBWP_ToAddModList;
+ if(bwpList) {
+ AssertFatal(bwpList->list.count > 0, "downlinkBWP_ToAddModList has no BWPs!\n");
+ for (int i = 0; i < bwpList->list.count; ++i) {
+ const NR_BWP_Downlink_t *bwp = bwpList->list.array[i];
+ calculate_preferred_dl_tda(Mod_idP, bwp);
+ }
+ }
+
+ const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList;
+ if(ubwpList) {
+ AssertFatal(ubwpList->list.count > 0, "uplinkBWP_ToAddModList no BWPs!\n");
+ for (int i = 0; i < ubwpList->list.count; ++i) {
+ const NR_BWP_Uplink_t *ubwp = ubwpList->list.array[i];
+ calculate_preferred_ul_tda(Mod_idP, ubwp);
+ }
}
}
@@ -650,7 +657,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
UE_info->CellGroup[UE_id] = CellGroup;
LOG_I(NR_MAC,"Modified UE_id %d/%x with CellGroup\n",UE_id,rnti);
process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
- const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
sched_ctrl->update_pdsch_ps = true;
sched_ctrl->update_pusch_ps = true;
@@ -675,16 +681,14 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
bwpd = (void*)CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
}
- else
- AssertFatal(1==0,"Either initial BWP or active BWP should always be present\n");
- sched_ctrl->search_space = get_searchspace(scc, bwpd, target_ss);
+ sched_ctrl->search_space = get_searchspace(sib1 ? sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL, scc, bwpd, target_ss);
sched_ctrl->coreset = get_coreset(Mod_idP, scc, bwpd, sched_ctrl->search_space, target_ss);
sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[Mod_idP],
sched_ctrl->search_space,
sched_ctrl->coreset,
scc,
genericParameters,
- NULL);
+ RC.nrmac[Mod_idP]->type0_PDCCH_CSS_config);
sched_ctrl->maxL = 2;
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index f36dbc4a16..f8baf7d632 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -635,7 +635,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
ra->coreset,
scc,
genericParameters,
- NULL);
+ &nr_mac->type0_PDCCH_CSS_config[ra->beam_id]);
// retrieving ra pdcch monitoring period and offset
find_monitoring_periodicity_offset_common(ra->ra_ss, &monitoring_slot_period, &monitoring_offset);
@@ -871,7 +871,9 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
dci_pdu_rel15_t uldci_payload;
memset(&uldci_payload, 0, sizeof(uldci_payload));
- config_uldci(ubwp,
+ const NR_SIB1_t *sib1 = cc->sib1 ? cc->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ config_uldci(sib1,
+ ubwp,
ubwpd,
scc,
pusch_pdu,
@@ -889,7 +891,8 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
NR_UL_DCI_FORMAT_0_0,
NR_RNTI_TC,
pusch_pdu->bwp_size,
- ra->bwp_id);
+ ra->bwp_id,
+ nr_mac->cset0_bwp_size);
// Mark the corresponding RBs as used
@@ -1460,7 +1463,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
NR_DL_DCI_FORMAT_1_0,
NR_RNTI_RA,
BWPSize,
- bwpid);
+ bwpid,
+ nr_mac->cset0_bwp_size);
// DL TX request
nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs];
@@ -1602,17 +1606,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
return;
}
- int n_rb=0;
- for (int i=0;i<6;i++)
- for (int j=0;j<8;j++) {
- n_rb+=((coreset->frequencyDomainResources.buf[i]>>j)&1);
- }
- n_rb*=6;
- const uint16_t N_cce = n_rb * coreset->duration / NR_NB_REG_PER_CCE;
const int delta_PRI=0;
- int r_pucch = ((CCEIndex<<1)/N_cce)+(delta_PRI<<1);
+ int r_pucch = nr_get_pucch_resource(coreset, sched_ctrl->active_ubwp, NULL, CCEIndex);
+
+ LOG_D(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, nb_of_candidates %d, delta_PRI %d)\n", r_pucch, CCEIndex, nr_of_candidates, delta_PRI);
- LOG_D(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, N_cce %d, nb_of_candidates %d,delta_PRI %d)\n",r_pucch,CCEIndex,N_cce,nr_of_candidates,delta_PRI);
int alloc = nr_acknack_scheduling(module_idP, UE_id, frameP, slotP, r_pucch, 1);
AssertFatal(alloc>=0,"Couldn't find a pucch allocation for ack nack (msg4)\n");
NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[alloc];
@@ -1853,7 +1851,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
NR_DL_DCI_FORMAT_1_0,
NR_RNTI_TC,
pdsch_pdu_rel15->BWPSize,
- bwpid);
+ bwpid,
+ nr_mac->cset0_bwp_size);
// Add padding header and zero rest out if there is space left
if (ra->mac_pdu_length < harq->tb_size) {
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index cddeb364d5..8c9d7e8bc8 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -545,7 +545,8 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
dci_format,
rnti_type,
pdsch_pdu_rel15->BWPSize,
- 0);
+ 0,
+ gNB_mac->cset0_bwp_size);
LOG_D(MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
LOG_D(MAC,"BWPStart: %i\n", pdcch_pdu_rel15->BWPStart);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 6c9b7aba72..b70d569d47 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -86,16 +86,22 @@ void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *
else {
target_ss = NR_SearchSpace__searchSpaceType_PR_common;
}
- NR_SearchSpace_t *search_space = get_searchspace(scc, bwp ? bwp->bwp_Dedicated : NULL, target_ss);
+ const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_SearchSpace_t *search_space = get_searchspace(sib1,
+ scc,
+ bwp ? bwp->bwp_Dedicated : NULL,
+ target_ss);
+
NR_ControlResourceSet_t *coreset = get_coreset(module_id, scc, bwp ? bwp->bwp_Dedicated : NULL, search_space, target_ss);
// get coreset symbol "map"
const uint16_t symb_coreset = (1 << coreset->duration) - 1;
- /* check that TDA index 0 fits into DL and does not overlap CORESET */
- const struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = bwp ?
- bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList :
- scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp,
+ scc,
+ sib1);
AssertFatal(tdaList->list.count >= 1, "need to have at least one TDA for DL slots\n");
+
+ /* check that TDA index 0 fits into DL and does not overlap CORESET */
const NR_PDSCH_TimeDomainResourceAllocation_t *tdaP_DL = tdaList->list.array[0];
AssertFatal(!tdaP_DL->k0 || *tdaP_DL->k0 == 0,
"TimeDomainAllocation at index 1: non-null k0 (%ld) is not supported by the scheduler\n",
@@ -525,19 +531,33 @@ bool allocate_dl_retransmission(module_id_t module_id,
int UE_id,
int current_harq_pid) {
- const NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels->ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+ gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
+ const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels->ServingCellConfigCommon;
+ NR_UE_info_t *UE_info = &nr_mac->UE_info;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
NR_sched_pdsch_t *retInfo = &sched_ctrl->harq_processes[current_harq_pid].sched_pdsch;
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_BWP_DownlinkDedicated_t *bwpd= cg ? cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP:NULL;
+ NR_BWP_DownlinkDedicated_t *bwpd =
+ cg &&
+ cg->spCellConfig &&
+ cg->spCellConfig->spCellConfigDedicated ?
+ cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
- NR_BWP_t *genericParameters = sched_ctrl->active_bwp ?
- &sched_ctrl->active_bwp->bwp_Common->genericParameters :
- &RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+ NR_BWP_UplinkDedicated_t *ubwpd =
+ cg &&
+ cg->spCellConfig &&
+ cg->spCellConfig->spCellConfigDedicated &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
- const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
+ RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
+ sib1);
+
+ const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
+ const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
int rbStart = 0; // start wrt BWPstart
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
@@ -565,7 +585,15 @@ bool allocate_dl_retransmission(module_id_t module_id,
/* check whether we need to switch the TDA allocation since the last
* (re-)transmission */
if (ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) {
- nr_set_pdsch_semi_static(scc, cg, sched_ctrl->active_bwp, bwpd, tda, ps->nrOfLayers, sched_ctrl, ps);
+ nr_set_pdsch_semi_static(sib1,
+ scc,
+ cg,
+ sched_ctrl->active_bwp,
+ bwpd,
+ tda,
+ ps->nrOfLayers,
+ sched_ctrl,
+ ps);
sched_ctrl->update_pdsch_ps = false;
}
} else {
@@ -573,7 +601,15 @@ bool allocate_dl_retransmission(module_id_t module_id,
* that we have enough resources */
NR_pdsch_semi_static_t temp_ps = *ps;
- nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, bwpd, tda, ps->nrOfLayers, sched_ctrl, &temp_ps);
+ nr_set_pdsch_semi_static(sib1,
+ scc,
+ UE_info->CellGroup[UE_id],
+ sched_ctrl->active_bwp,
+ bwpd,
+ tda,
+ ps->nrOfLayers,
+ sched_ctrl,
+ &temp_ps);
while (rbStart < bwpSize &&
!(rballoc_mask[rbStart]&SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols)))
rbStart++;
@@ -634,7 +670,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* allocation after CCE alloc fail would be more complex) */
- const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1, 0);
+ int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex);
+ const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
if (alloc<0) {
LOG_D(MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
@@ -765,15 +802,30 @@ void pf_dl(module_id_t module_id,
*max = UE_sched.next[*max];
*p = -1;
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_BWP_DownlinkDedicated_t *bwpd= cg ? cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP:NULL;
+
+ NR_BWP_DownlinkDedicated_t *bwpd =
+ cg &&
+ cg->spCellConfig &&
+ cg->spCellConfig->spCellConfigDedicated ?
+ cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
+
+ NR_BWP_UplinkDedicated_t *ubwpd =
+ cg &&
+ cg->spCellConfig &&
+ cg->spCellConfig->spCellConfigDedicated &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
const uint16_t rnti = UE_info->rnti[UE_id];
- NR_BWP_t *genericParameters = sched_ctrl->active_bwp ?
- &sched_ctrl->active_bwp->bwp_Common->genericParameters:
- &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
- const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+ NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
+ RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
+ sib1);
+
+ const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
+ const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
int rbStart = 0; // start wrt BWPstart
if (sched_ctrl->available_dl_harq.head < 0) {
@@ -809,7 +861,8 @@ void pf_dl(module_id_t module_id,
/* Find PUCCH occasion: if it fails, undo CCE allocation (undoing PUCCH
* allocation after CCE alloc fail would be more complex) */
- const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1, 0);
+ int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex);
+ const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
if (alloc<0) {
LOG_D(NR_MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
@@ -846,10 +899,16 @@ void pf_dl(module_id_t module_id,
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
- if (ps->nrOfLayers != layers[UE_id] ||
- ps->time_domain_allocation != tda ||
- sched_ctrl->update_pdsch_ps) {
- nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, bwpd, tda, layers[UE_id], sched_ctrl, ps);
+ if (ps->nrOfLayers != layers[UE_id] || ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) {
+ nr_set_pdsch_semi_static(sib1,
+ scc,
+ UE_info->CellGroup[UE_id],
+ sched_ctrl->active_bwp,
+ bwpd,
+ tda,
+ layers[UE_id],
+ sched_ctrl,
+ ps);
sched_ctrl->update_pdsch_ps = false;
}
@@ -921,14 +980,21 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
- const uint16_t bwpSize = NRRIV2BW(sched_ctrl->active_bwp ?
- sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth:
- scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,
- MAX_BWP_SIZE);
- const uint16_t BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp ?
- sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth:
- scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,
- MAX_BWP_SIZE);
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp,
+ RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
+ sib1);
+
+ NR_BWP_DownlinkDedicated_t *bwpd =
+ UE_info->CellGroup[UE_id] &&
+ UE_info->CellGroup[UE_id]->spCellConfig &&
+ UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated ?
+ UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
+
+ const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId;
+
+ const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+ const uint16_t BWPStart = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_start : NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
const uint16_t slbitmap = SL_to_bitmap(startSymbolIndex, nrOfSymbols);
uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
@@ -1008,7 +1074,12 @@ void nr_schedule_ue_spec(module_id_t module_id,
NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
UE_info->mac_stats[UE_id].dlsch_current_bytes = 0;
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_BWP_DownlinkDedicated_t *bwpd= cg ? cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP:NULL;
+
+ NR_BWP_DownlinkDedicated_t *bwpd =
+ cg &&
+ cg->spCellConfig &&
+ cg->spCellConfig->spCellConfigDedicated ?
+ cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
/* update TA and set ta_apply every 10 frames.
* Possible improvement: take the periodicity from input file.
@@ -1087,15 +1158,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
sched_ctrl->tpc1);
NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp;
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(bwp,
+ RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon,
+ sib1);
- /* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not
- * exist, create it */
-
- // BWP
- NR_BWP_t *genericParameters = bwp ? &bwp->bwp_Common->genericParameters : &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+ NR_SearchSpace_t *ss = (bwp||bwpd) ? sched_ctrl->search_space : gNB_mac->sched_ctrlCommon->search_space;
const int bwpid = bwp ? bwp->bwp_Id : 0;
const int coresetid = (bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : gNB_mac->sched_ctrlCommon->coreset->controlResourceSetId;
+
+ /* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it */
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu = gNB_mac->pdcch_pdu_idx[CC_id][coresetid];
if (!pdcch_pdu) {
LOG_D(NR_MAC, "creating pdcch pdu, pdcch_pdu = NULL. \n");
@@ -1126,8 +1199,14 @@ void nr_schedule_ue_spec(module_id_t module_id,
const int pduindex = gNB_mac->pdu_index[CC_id]++;
pdsch_pdu->pduIndex = pduindex;
- pdsch_pdu->BWPSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
- pdsch_pdu->BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+ if (coresetid == 0) {
+ pdsch_pdu->BWPSize = gNB_mac->cset0_bwp_size;
+ pdsch_pdu->BWPStart = gNB_mac->cset0_bwp_start;
+ } else {
+ pdsch_pdu->BWPSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ pdsch_pdu->BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+ }
+
pdsch_pdu->SubcarrierSpacing = genericParameters->subcarrierSpacing;
pdsch_pdu->CyclicPrefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix : 0;
@@ -1270,14 +1349,9 @@ void nr_schedule_ue_spec(module_id_t module_id,
dci_payload.tpc,
pucch->timing_indicator);
- const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
- int dci_format;
- if (sched_ctrl->search_space) {
- dci_format = f ? NR_DL_DCI_FORMAT_1_1 : NR_DL_DCI_FORMAT_1_0;
- }
- else {
- dci_format = NR_DL_DCI_FORMAT_1_0;
- }
+ int dci_format = ss && ss->searchSpaceType && ss->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific ?
+ NR_DL_DCI_FORMAT_1_1 : NR_DL_DCI_FORMAT_1_0;
+
const int rnti_type = NR_RNTI_C;
fill_dci_pdu_rel15(scc,
@@ -1287,7 +1361,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
dci_format,
rnti_type,
pdsch_pdu->BWPSize,
- bwp? bwp->bwp_Id : 0);
+ bwp? bwp->bwp_Id : 0,
+ gNB_mac->cset0_bwp_size);
LOG_D(NR_MAC,
"coreset params: FreqDomainResource %llx, start_symbol %d n_symb %d\n",
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 7891c5bcd3..338fc7dcd5 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -280,7 +280,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
ps->nrOfLayers = target_dl_Nl;
if (ps->time_domain_allocation != tda || ps->nrOfLayers != target_dl_Nl)
- nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, NULL, tda, target_dl_Nl, sched_ctrl, ps);
+ nr_set_pdsch_semi_static(NULL, scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, NULL, tda, target_dl_Nl, sched_ctrl, ps);
/* find largest unallocated chunk */
const int bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -357,7 +357,8 @@ void nr_preprocessor_phytest(module_id_t module_id,
__func__,
UE_id);
- const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, -1, 0);
+ int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, NULL, CCEIndex);
+ const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0);
if (alloc < 0) {
LOG_D(MAC,
"%s(): could not find PUCCH for UE %d/%04x@%d.%d\n",
@@ -442,7 +443,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
"time domain assignment %d >= %d\n",
tda,
tdaList->list.count);
- int K2 = get_K2(scc,sched_ctrl->active_ubwp, tda, mu);
+ int K2 = get_K2(scc,NULL,sched_ctrl->active_ubwp, tda, mu);
const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
/* check if slot is UL, and that slot is 8 (assuming K2=6 because of UE
@@ -451,7 +452,9 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
if (!is_xlsch_in_slot(ulsch_slot_bitmap, sched_slot))
return false;
- const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
+ const long f = (sched_ctrl->active_bwp && sched_ctrl->search_space &&
+ sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) ?
+ sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
const int dci_format = f ? NR_UL_DCI_FORMAT_0_1 : NR_UL_DCI_FORMAT_0_0;
const uint8_t num_dmrs_cdm_grps_no_data = 1;
/* we want to avoid a lengthy deduction of DMRS and other parameters in
@@ -461,7 +464,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data)
- nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ nr_set_pusch_semi_static(NULL, scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
uint16_t rbStart = 0;
uint16_t rbSize;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 8fcd1afc13..caf22b0de8 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -251,6 +251,49 @@ void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) {
}
}
+NR_BWP_t *get_dl_bwp_genericParameters(NR_BWP_Downlink_t *active_bwp,
+ NR_ServingCellConfigCommon_t *ServingCellConfigCommon,
+ const NR_SIB1_t *sib1) {
+ NR_BWP_t *genericParameters = NULL;
+ if (active_bwp) {
+ genericParameters = &active_bwp->bwp_Common->genericParameters;
+ } else if (ServingCellConfigCommon) {
+ genericParameters = &ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+ } else {
+ genericParameters = &sib1->servingCellConfigCommon->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+ }
+ return genericParameters;
+}
+
+NR_BWP_t *get_ul_bwp_genericParameters(NR_BWP_Uplink_t *active_ubwp,
+ NR_ServingCellConfigCommon_t *ServingCellConfigCommon,
+ const NR_SIB1_t *sib1) {
+ NR_BWP_t *genericParameters = NULL;
+ if (active_ubwp) {
+ genericParameters = &active_ubwp->bwp_Common->genericParameters;
+ } else if (ServingCellConfigCommon) {
+ genericParameters = &ServingCellConfigCommon->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+ } else {
+ genericParameters = &sib1->servingCellConfigCommon->uplinkConfigCommon->initialUplinkBWP.genericParameters;
+ }
+ return genericParameters;
+}
+
+NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList(const NR_BWP_Downlink_t *active_bwp,
+ const NR_ServingCellConfigCommon_t *ServingCellConfigCommon,
+ const NR_SIB1_t *sib1) {
+ NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = NULL;
+ if (active_bwp) {
+ tdaList = active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ } else if (ServingCellConfigCommon) {
+ tdaList = ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ } else {
+ tdaList = sib1->servingCellConfigCommon->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ }
+ return tdaList;
+}
+
+
NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
NR_ServingCellConfigCommon_t *scc,
void *bwp,
@@ -287,17 +330,29 @@ NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
}
}
-NR_SearchSpace_t *get_searchspace(NR_ServingCellConfigCommon_t *scc,
- NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
- NR_SearchSpace__searchSpaceType_PR target_ss) {
+NR_SearchSpace_t *get_searchspace(const NR_SIB1_t *sib1,
+ NR_ServingCellConfigCommon_t *scc,
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
+ NR_SearchSpace__searchSpaceType_PR target_ss) {
+
+ int n = 0;
+ if(bwp_Dedicated) {
+ n = bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;
+ } else if(scc) {
+ n = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.count;
+ } else {
+ n = sib1->servingCellConfigCommon->downlinkConfigCommon.initialDownlinkBWP.pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.count;
+ }
- const int n = bwp_Dedicated ?
- bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count:
- scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.count;
for (int i=0;ipdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i]:
- scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.array[i];
+ NR_SearchSpace_t *ss = NULL;
+ if(bwp_Dedicated) {
+ ss = bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
+ } else if(scc) {
+ ss = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.array[i];
+ } else {
+ ss = sib1->servingCellConfigCommon->downlinkConfigCommon.initialDownlinkBWP.pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list.array[i];
+ }
AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
if (ss->searchSpaceType->present == target_ss) {
@@ -529,7 +584,8 @@ bool nr_find_nb_rb(uint16_t Qm,
return *tbs >= bytes && *nb_rb <= nb_rb_max;
}
-void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
+void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
+ const NR_ServingCellConfigCommon_t *scc,
const NR_CellGroupConfig_t *secondaryCellGroup,
const NR_BWP_Downlink_t *bwp,
const NR_BWP_DownlinkDedicated_t *bwpd0,
@@ -548,7 +604,8 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
bwpd = (NR_BWP_DownlinkDedicated_t*)bwpd0;
}
- if (bwpd->pdsch_Config &&
+ if (bwpd &&
+ bwpd->pdsch_Config &&
bwpd->pdsch_Config->choice.setup &&
bwpd->pdsch_Config->choice.setup->mcs_Table) {
if (*bwpd->pdsch_Config->choice.setup->mcs_Table == 0)
@@ -571,9 +628,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
if (ps->time_domain_allocation != tda) {
reset_dmrs = true;
ps->time_domain_allocation = tda;
- const struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = bwp ?
- bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList :
- scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, scc, sib1);
AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
ps->mapping_type = tdaList->list.array[tda]->mappingType;
if (pdsch_Config) {
@@ -588,7 +643,11 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
SLIV2SL(startSymbolAndLength, &ps->startSymbolIndex, &ps->nrOfSymbols);
}
- const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
+ const long f = ((bwp || bwpd) &&
+ sched_ctrl->search_space &&
+ sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) ?
+ sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
+
int dci_format;
if (sched_ctrl->search_space) {
dci_format = f ? NR_DL_DCI_FORMAT_1_1 : NR_DL_DCI_FORMAT_1_0;
@@ -617,33 +676,39 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
ps->N_PRB_DMRS = ps->numDmrsCdmGrpsNoData * (ps->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4);
if (reset_dmrs) {
- ps->dl_dmrs_symb_pos = fill_dmrs_mask(bwpd ? bwpd->pdsch_Config->choice.setup : NULL, scc->dmrs_TypeA_Position, ps->nrOfSymbols, ps->startSymbolIndex, ps->mapping_type, ps->frontloaded_symb);
+ ps->dl_dmrs_symb_pos = fill_dmrs_mask(bwpd ? bwpd->pdsch_Config->choice.setup : NULL, scc ? scc->dmrs_TypeA_Position : 0, ps->nrOfSymbols, ps->startSymbolIndex, ps->mapping_type, ps->frontloaded_symb);
ps->N_DMRS_SLOT = get_num_dmrs(ps->dl_dmrs_symb_pos);
}
LOG_D(NR_MAC,"bwpd0 %p, bwpd %p : Filling dmrs info, ps->N_PRB_DMRS %d, ps->dl_dmrs_symb_pos %x, ps->N_DMRS_SLOT %d\n",bwpd0,bwpd,ps->N_PRB_DMRS,ps->dl_dmrs_symb_pos,ps->N_DMRS_SLOT);
}
-void nr_set_pusch_semi_static(const NR_ServingCellConfigCommon_t *scc,
+void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
+ const NR_ServingCellConfigCommon_t *scc,
const NR_BWP_Uplink_t *ubwp,
const NR_BWP_UplinkDedicated_t *ubwpd,
long dci_format,
int tda,
uint8_t num_dmrs_cdm_grps_no_data,
- NR_pusch_semi_static_t *ps)
-{
+ NR_pusch_semi_static_t *ps) {
ps->dci_format = dci_format;
ps->time_domain_allocation = tda;
- const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList =
- ubwp?
- ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
- scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList ;
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList = NULL;
+ if(ubwp) {
+ tdaList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ } else if(scc) {
+ tdaList = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ } else {
+ tdaList = sib1->servingCellConfigCommon->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ }
+
const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
SLIV2SL(startSymbolAndLength,
&ps->startSymbolIndex,
&ps->nrOfSymbols);
- ps->pusch_Config = ubwp?ubwp->bwp_Dedicated->pusch_Config->choice.setup:(ubwpd ? ubwpd->pusch_Config->choice.setup : NULL);
+ ps->pusch_Config = ubwp && ubwp->bwp_Dedicated && ubwp->bwp_Dedicated->pusch_Config ?
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd ? ubwpd->pusch_Config->choice.setup : NULL);
if (ps->pusch_Config == NULL || !ps->pusch_Config->transformPrecoder)
ps->transform_precoding = !scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder;
else
@@ -917,7 +982,8 @@ void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
}
-void config_uldci(const NR_BWP_Uplink_t *ubwp,
+void config_uldci(const NR_SIB1_t *sib1,
+ const NR_BWP_Uplink_t *ubwp,
const NR_BWP_UplinkDedicated_t *ubwpd,
const NR_ServingCellConfigCommon_t *scc,
const nfapi_nr_pusch_pdu_t *pusch_pdu,
@@ -928,9 +994,11 @@ void config_uldci(const NR_BWP_Uplink_t *ubwp,
int n_ubwp,
int bwp_id) {
- const int bw = NRRIV2BW(ubwp ?
- ubwp->bwp_Common->genericParameters.locationAndBandwidth :
- scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters((NR_BWP_Uplink_t *)ubwp,
+ (NR_ServingCellConfigCommon_t *)scc,
+ (NR_SIB1_t *)sib1);
+
+ const int bw = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
dci_pdu_rel15->frequency_domain_assignment.val =
PRBalloc_to_locationandbandwidth0(pusch_pdu->rb_size, pusch_pdu->rb_start, bw);
@@ -1037,9 +1105,24 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
pdcch_pdu->precoderGranularity = coreset->precoderGranularity;
}
+int nr_get_pucch_resource(NR_ControlResourceSet_t *coreset,
+ NR_BWP_Uplink_t *bwp,
+ NR_BWP_UplinkDedicated_t *bwpd,
+ int CCEIndex) {
+ int r_pucch = -1;
+ if(bwp == NULL && bwpd == NULL) {
+ int n_rb,rb_offset;
+ get_coreset_rballoc(coreset->frequencyDomainResources.buf,&n_rb,&rb_offset);
+ const uint16_t N_cce = n_rb * coreset->duration / NR_NB_REG_PER_CCE;
+ const int delta_PRI=0;
+ r_pucch = ((CCEIndex<<1)/N_cce)+(delta_PRI<<1);
+ }
+ return r_pucch;
+}
// This function configures pucch pdu fapi structure
-void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
+void nr_configure_pucch(const NR_SIB1_t *sib1,
+ nfapi_nr_pucch_pdu_t* pucch_pdu,
NR_ServingCellConfigCommon_t *scc,
NR_CellGroupConfig_t *CellGroup,
NR_BWP_Uplink_t *bwp,
@@ -1067,7 +1150,13 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
uint16_t O_uci = O_csi + O_ack;
- NR_PUSCH_Config_t *pusch_Config = bwp ? bwp->bwp_Dedicated->pusch_Config->choice.setup : bwpd->pusch_Config->choice.setup;
+ NR_PUSCH_Config_t *pusch_Config = NULL;
+ if(bwp && bwp->bwp_Dedicated && bwp->bwp_Dedicated->pusch_Config) {
+ pusch_Config = bwp->bwp_Dedicated->pusch_Config->choice.setup;
+ } else if(bwpd && bwpd->pusch_Config) {
+ pusch_Config = bwpd->pusch_Config->choice.setup;
+ }
+
long *pusch_id = pusch_Config ? pusch_Config->dataScramblingIdentityPUSCH : NULL;
if (pusch_Config && pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA != NULL)
@@ -1076,9 +1165,15 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
id0 = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->transformPrecodingDisabled->scramblingID0;
else id0 = scc->physCellId;
- NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon = bwp ?
- bwp->bwp_Common->pucch_ConfigCommon->choice.setup :
- scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup;
+ NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon = NULL;
+ if(bwp) {
+ pucch_ConfigCommon = bwp->bwp_Common->pucch_ConfigCommon->choice.setup;
+ } else if(scc) {
+ pucch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup;
+ } else {
+ pucch_ConfigCommon = sib1->servingCellConfigCommon->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup;
+ }
+
// hop flags and hopping id are valid for any BWP
switch (pucch_ConfigCommon->pucch_GroupHopping){
case 0 :
@@ -1104,9 +1199,9 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
pucch_pdu->hopping_id = *pucch_ConfigCommon->hoppingId;
else
pucch_pdu->hopping_id = *scc->physCellId;
- NR_BWP_t *genericParameters = bwp ?
- &bwp->bwp_Common->genericParameters:
- &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(bwp,scc, sib1);
+
pucch_pdu->bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
pucch_pdu->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
pucch_pdu->subcarrier_spacing = genericParameters->subcarrierSpacing;
@@ -1115,9 +1210,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
LOG_D(NR_MAC,"pucch_acknak: Filling dedicated configuration for PUCCH\n");
// we have either a dedicated BWP or Dedicated PUCCH configuration on InitialBWP
AssertFatal(bwp!=NULL || bwpd!=NULL,"We need one dedicated configuration for a BWP (neither additional or initial BWP has a dedicated configuration)\n");
- pucch_Config = bwp ?
- bwp->bwp_Dedicated->pucch_Config->choice.setup:
- bwpd->pucch_Config->choice.setup;
+ pucch_Config = bwp && bwp->bwp_Dedicated && bwp->bwp_Dedicated->pucch_Config ?
+ bwp->bwp_Dedicated->pucch_Config->choice.setup : bwpd->pucch_Config->choice.setup;
AssertFatal(pucch_Config->resourceSetToAddModList!=NULL,
"PUCCH resourceSetToAddModList is null\n");
@@ -1412,12 +1506,13 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
int dci_format,
int rnti_type,
int N_RB,
- int bwp_id) {
+ int bwp_id,
+ uint16_t cset0_bwp_size) {
uint8_t fsize = 0, pos = 0;
uint64_t *dci_pdu = (uint64_t *)pdcch_dci_pdu->Payload;
*dci_pdu=0;
- int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id);
+ int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id, cset0_bwp_size);
pdcch_dci_pdu->PayloadSizeBits = dci_size;
AssertFatal(dci_size <= 64, "DCI sizes above 64 bits not yet supported");
if (dci_format == NR_DL_DCI_FORMAT_1_1 || dci_format == NR_UL_DCI_FORMAT_0_1)
@@ -1761,7 +1856,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
pos+=4;
*dci_pdu |= ((uint64_t)dci_pdu_rel15->harq_pid & 0xf) << (dci_size - pos);
// Padding bits
- for (int a = pos; a < 32; a++)
+ for (int a = pos; a < dci_size; a++)
*dci_pdu |= ((uint64_t)dci_pdu_rel15->padding & 1) << (dci_size - pos++);
// UL/SUL indicator – 1 bit
/* commented for now (RK): need to get this from BWP descriptor
@@ -2207,8 +2302,9 @@ int get_ul_bwp_id(const NR_ServingCellConfig_t *servingCellConfig)
//------------------------------------------------------------------------------
int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup)
{
- NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_idP]->common_channels[0].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &RC.nrmac[mod_idP]->UE_info;
+ gNB_MAC_INST *nr_mac = RC.nrmac[mod_idP];
+ NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
+ NR_UE_info_t *UE_info = &nr_mac->UE_info;
LOG_I(NR_MAC, "[gNB %d] Adding UE with rnti 0x%04x (num_UEs %d)\n",
mod_idP,
rntiP,
@@ -2250,7 +2346,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
/* set illegal time domain allocation to force recomputation of all fields */
sched_ctrl->pdsch_semi_static.time_domain_allocation = -1;
sched_ctrl->pusch_semi_static.time_domain_allocation = -1;
- const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
+ const NR_ServingCellConfig_t *servingCellConfig = CellGroup && CellGroup->spCellConfig ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
/* Set default BWPs */
const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig ? servingCellConfig->downlinkBWP_ToAddModList : NULL;
@@ -2264,7 +2360,9 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
&sched_ctrl->active_bwp->bwp_Common->genericParameters:
&scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
const int target_ss = sched_ctrl->active_bwp ? NR_SearchSpace__searchSpaceType_PR_ue_Specific : NR_SearchSpace__searchSpaceType_PR_common;
- sched_ctrl->search_space = get_searchspace(scc,
+ const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ sched_ctrl->search_space = get_searchspace(sib1,
+ scc,
sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL,
target_ss);
sched_ctrl->coreset = get_coreset(mod_idP, scc,
@@ -2459,7 +2557,7 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
bwpd = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated;
ubwpd = CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated;
}
- else if (CellGroup) { // this is an initialBWP
+ else if (CellGroup && CellGroup->spCellConfig && CellGroup->spCellConfig->spCellConfigDedicated) { // this is an initialBWP
AssertFatal((bwpd=CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)!=NULL,
"CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP is null\n");
AssertFatal((ubwpd=CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)!=NULL,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 57abdee05c..dccd0042ac 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -44,7 +44,8 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
const NR_sched_pucch_t *pucch,
int UE_id)
{
- NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
+ gNB_MAC_INST *nr_mac = RC.nrmac[mod_id];
+ NR_UE_info_t *UE_info = &nr_mac->UE_info;
nfapi_nr_ul_tti_request_t *future_ul_tti_req =
&RC.nrmac[mod_id]->UL_tti_req_ahead[0][pucch->ul_slot];
@@ -76,13 +77,16 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon;
NR_CellGroupConfig_t *cg=UE_info->CellGroup[UE_id];
- NR_BWP_UplinkDedicated_t *ubwpd;
- ubwpd = cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL;
+ NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
LOG_D(NR_MAC,"%d.%d Calling nr_configure_pucch (ubwpd %p,r_pucch %d) pucch to be scheduled in %d.%d\n",
frame,slot,ubwpd,pucch->r_pucch,pucch->frame,pucch->ul_slot);
- nr_configure_pucch(pucch_pdu,
+ const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ nr_configure_pucch(sib1,
+ pucch_pdu,
scc,
UE_info->CellGroup[UE_id],
UE_info->UE_sched_ctrl[UE_id].active_ubwp,
@@ -745,9 +749,11 @@ void nr_csi_meas_reporting(int Mod_idP,
curr_pucch->csi_bits +=
nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
- NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ?
- &sched_ctrl->active_ubwp->bwp_Common->genericParameters:
- &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+ const NR_SIB1_t *sib1 = RC.nrmac[Mod_idP]->common_channels[0].sib1 ? RC.nrmac[Mod_idP]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+ scc,
+ sib1);
+
int bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
// going through the list of PUCCH resources to find the one indexed by resource_id
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 9105c9e93c..a60bd9abb5 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -39,16 +39,11 @@
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
- const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
- int dci_format;
- if (sched_ctrl->search_space) {
- dci_format = f ? NR_UL_DCI_FORMAT_0_1 : NR_UL_DCI_FORMAT_0_0;
- }
- else {
- dci_format = NR_UL_DCI_FORMAT_0_0;
- }
+ int dci_format = sched_ctrl->search_space && sched_ctrl->search_space->searchSpaceType &&
+ sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific ?
+ NR_UL_DCI_FORMAT_0_1 : NR_UL_DCI_FORMAT_0_0;
- return(dci_format);
+ return(dci_format);
}
void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp)
@@ -62,9 +57,22 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon;
lte_frame_type_t frame_type = nrmac->common_channels->frame_type;
const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- const int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
- const NR_TDD_UL_DL_Pattern_t *tdd =
- scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
+
+ NR_ServingCellConfigCommonSIB_t *scc_sib1 = get_softmodem_params()->sa ?
+ RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1->servingCellConfigCommon : NULL;
+
+ AssertFatal(scc!=NULL || scc_sib1!=NULL,"We need one serving cell config common\n");
+
+ const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing :
+ scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
+
+ NR_TDD_UL_DL_Pattern_t *tdd = NULL;
+ if (scc && scc->tdd_UL_DL_ConfigurationCommon) {
+ tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
+ } else if (scc_sib1 && scc_sib1->tdd_UL_DL_ConfigurationCommon) {
+ tdd = &scc_sib1->tdd_UL_DL_ConfigurationCommon->pattern1;
+ }
+
/* Uplink symbols are at the end of the slot */
int symb_ulMixed = 0;
int nr_mix_slots = 0;
@@ -118,7 +126,7 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
/* check that TDA index 1 fits into UL slot and does not overlap with PUCCH */
const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_UL = tdaList->list.array[0];
- const int k2 = get_K2(scc, (NR_BWP_Uplink_t*)ubwp,0, mu);
+ const int k2 = get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp,0, mu);
int start, len;
SLIV2SL(tdaP_UL->startSymbolAndLength, &start, &len);
const uint16_t symb_tda = ((1 << len) - 1) << start;
@@ -131,10 +139,10 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
int tdaMi = -1;
if (nr_mix_slots>0) {
const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_Mi = tdaList->list.array[1];
- AssertFatal(k2 == get_K2(scc, (NR_BWP_Uplink_t*)ubwp, 1, mu),
+ AssertFatal(k2 == get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu),
"scheduler cannot handle different k2 for UL slot (%d) and UL Mixed slot (%ld)\n",
k2,
- get_K2(scc, (NR_BWP_Uplink_t*)ubwp, 1, mu));
+ get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu));
SLIV2SL(tdaP_Mi->startSymbolAndLength, &start, &len);
const uint16_t symb_tda_mi = ((1 << len) - 1) << start;
// check whether PUCCH and TDA overlap: then, we cannot use it. Also, check
@@ -897,11 +905,21 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
}
}
-long get_K2(NR_ServingCellConfigCommon_t *scc,NR_BWP_Uplink_t *ubwp, int time_domain_assignment, int mu) {
- DevAssert(scc);
- const NR_PUSCH_TimeDomainResourceAllocation_t *tda_list = ubwp ?
- ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[time_domain_assignment]:
- scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[time_domain_assignment];
+long get_K2(NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfigCommonSIB_t *scc_sib1,
+ NR_BWP_Uplink_t *ubwp,
+ int time_domain_assignment,
+ int mu) {
+
+ NR_PUSCH_TimeDomainResourceAllocation_t *tda_list = NULL;
+ if(ubwp) {
+ tda_list = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[time_domain_assignment];
+ } else if(scc) {
+ tda_list = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[time_domain_assignment];
+ } else if(scc_sib1) {
+ tda_list = scc_sib1->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[time_domain_assignment];
+ }
+
if (tda_list->k2)
return *tda_list->k2;
else if (mu < 2)
@@ -964,13 +982,22 @@ bool allocate_ul_retransmission(module_id_t module_id,
int harq_pid)
{
const int CC_id = 0;
- const NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[CC_id].ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+ gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
+ const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[CC_id].ServingCellConfigCommon;
+ NR_UE_info_t *UE_info = &nr_mac->UE_info;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
NR_sched_pusch_t *retInfo = &sched_ctrl->ul_harq_processes[harq_pid].sched_pusch;
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL;
- NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters : &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+
+ NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
+
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+ (NR_ServingCellConfigCommon_t *)scc,
+ sib1);
+
int rbStart = 0; // wrt BWP start
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
@@ -989,7 +1016,14 @@ bool allocate_ul_retransmission(module_id_t module_id,
|| ps->dci_format != dci_format
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
|| sched_ctrl->update_pusch_ps) {
- nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ nr_set_pusch_semi_static(sib1,
+ scc,
+ sched_ctrl->active_ubwp,
+ ubwpd,
+ dci_format,
+ tda,
+ num_dmrs_cdm_grps_no_data,
+ ps);
sched_ctrl->update_pusch_ps = false;
}
@@ -1005,7 +1039,14 @@ bool allocate_ul_retransmission(module_id_t module_id,
} else {
NR_pusch_semi_static_t temp_ps;
int dci_format = get_dci_format(sched_ctrl);
- nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp,ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, &temp_ps);
+ nr_set_pusch_semi_static(sib1,
+ scc,
+ sched_ctrl->active_ubwp,
+ ubwpd,
+ dci_format,
+ tda,
+ num_dmrs_cdm_grps_no_data,
+ &temp_ps);
/* the retransmission will use a different time domain allocation, check
* that we have enough resources */
while (rbStart < bwpSize &&
@@ -1127,6 +1168,7 @@ void pf_ul(module_id_t module_id,
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
NR_UE_info_t *UE_info = &nrmac->UE_info;
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
const int min_rb = 5;
float coeff_ue[MAX_MOBILES_PER_GNB];
// UEs that could be scheduled
@@ -1140,10 +1182,16 @@ void pf_ul(module_id_t module_id,
LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %d\n",UE_id);
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters : &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+ scc,
+ sib1);
+
int rbStart = 0; // wrt BWP start
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
+ NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
@@ -1226,7 +1274,14 @@ void pf_ul(module_id_t module_id,
|| ps->dci_format != dci_format
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
|| sched_ctrl->update_pusch_ps) {
- nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ nr_set_pusch_semi_static(sib1,
+ scc,
+ sched_ctrl->active_ubwp,
+ ubwpd,
+ dci_format,
+ tda,
+ num_dmrs_cdm_grps_no_data,
+ ps);
sched_ctrl->update_pusch_ps = false;
}
@@ -1333,8 +1388,14 @@ void pf_ul(module_id_t module_id,
AssertFatal(max_num_ue >= 0, "Illegal max_num_ue %d\n", max_num_ue);
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL;
- NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters : &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+ NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated
+ && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
+
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+ scc,
+ sib1);
+
int rbStart = sched_ctrl->active_ubwp ? NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE) : 0;
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
@@ -1351,7 +1412,14 @@ void pf_ul(module_id_t module_id,
|| ps->dci_format != dci_format
|| ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
|| sched_ctrl->update_pusch_ps) {
- nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ nr_set_pusch_semi_static(sib1,
+ scc,
+ sched_ctrl->active_ubwp,
+ ubwpd,
+ dci_format,
+ tda,
+ num_dmrs_cdm_grps_no_data,
+ ps);
sched_ctrl->update_pusch_ps = false;
}
update_ul_ue_R_Qm(sched_pusch, ps);
@@ -1412,7 +1480,14 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
NR_COMMON_channels_t *cc = nr_mac->common_channels;
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
- const int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+ const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_ServingCellConfigCommonSIB_t *scc_sib1 = sib1 ? sib1->servingCellConfigCommon : NULL;
+
+ AssertFatal(scc!=NULL || scc_sib1!=NULL,"We need one serving cell config common\n");
+
+ const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing :
+ scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
+
NR_UE_info_t *UE_info = &nr_mac->UE_info;
if (UE_info->num_UEs == 0)
@@ -1429,7 +1504,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
const int tda = sched_ctrl->active_ubwp ? nr_mac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
if (tda < 0)
return false;
- int K2 = get_K2(scc, sched_ctrl->active_ubwp, tda, mu);
+ int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu);
const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
@@ -1461,8 +1536,8 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
sched_ctrl->sched_pusch.frame = sched_frame;
for (UE_id = UE_info->list.next[UE_id]; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
- AssertFatal(K2 == get_K2(scc,sched_ctrl->active_ubwp, tda, mu),
- "Different K2, %d(UE%d) != %ld(UE%d)\n", K2, 0, get_K2(scc,sched_ctrl->active_ubwp, tda, mu), UE_id);
+ AssertFatal(K2 == get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu),
+ "Different K2, %d(UE%d) != %ld(UE%d)\n", K2, 0, get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), UE_id);
sched_ctrl->sched_pusch.slot = sched_slot;
sched_ctrl->sched_pusch.frame = sched_frame;
}
@@ -1472,17 +1547,24 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
* Calculate largest contiguous RBs */
uint16_t *vrb_map_UL =
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
- const uint16_t bwpSize = NRRIV2BW(sched_ctrl->active_ubwp ?
- sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth:
- scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
- MAX_BWP_SIZE);
- const uint16_t bwpStart = NRRIV2PRBOFFSET(sched_ctrl->active_ubwp ?
- sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth:
- scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
- MAX_BWP_SIZE);
- const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = sched_ctrl->active_ubwp ?
- sched_ctrl->active_ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
- scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+ scc,
+ sib1);
+
+ const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+ const uint16_t bwpStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList = NULL;
+ if (sched_ctrl->active_ubwp) {
+ tdaList = sched_ctrl->active_ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ } else if (scc) {
+ tdaList = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ } else {
+ NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1;
+ tdaList = sib1->servingCellConfigCommon->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ }
+
const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
int startSymbolIndex, nrOfSymbols;
SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
@@ -1577,13 +1659,18 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
+ const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
const NR_list_t *UE_list = &UE_info->list;
for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
if (sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) continue;
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
- NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL;
+
+ NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig ?
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
+
UE_info->mac_stats[UE_id].ulsch_current_bytes = 0;
/* dynamic PUSCH values (RB alloc, MCS, hence R, Qm, TBS) that change in
@@ -1704,7 +1791,10 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
pusch_pdu->handle = 0; //not yet used
/* FAPI: BWP */
- NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters:&scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+ NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
+ scc,
+ sib1);
+
pusch_pdu->bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
pusch_pdu->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
pusch_pdu->subcarrier_spacing = genericParameters->subcarrierSpacing;
@@ -1846,10 +1936,16 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
dci_pdu_rel15_t uldci_payload;
memset(&uldci_payload, 0, sizeof(uldci_payload));
int n_ubwp=1;
- if (cg->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)
- n_ubwp = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
+ if (cg &&
+ cg->spCellConfig &&
+ cg->spCellConfig->spCellConfigDedicated &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+ cg->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList) {
+ n_ubwp = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
+ }
- config_uldci(sched_ctrl->active_ubwp,
+ config_uldci(sib1,
+ sched_ctrl->active_ubwp,
ubwpd,
scc,
pusch_pdu,
@@ -1866,7 +1962,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
ps->dci_format,
rnti_types[0],
pusch_pdu->bwp_size,
- bwpid);
+ bwpid,
+ nr_mac->cset0_bwp_size);
memset(sched_pusch, 0, sizeof(*sched_pusch));
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 0c780cd839..fd4f3a4452 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -38,11 +38,13 @@ void set_cset_offset(uint16_t);
void mac_top_init_gNB(void);
+void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
+
void config_common(int Mod_idP,
int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
int pusch_AntennaPorts,
- NR_ServingCellConfigCommon_t *scc);
+ NR_ServingCellConfigCommon_t *scc);
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
int ssb_SubcarrierOffset,
@@ -52,6 +54,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
int minRXTXTIMEpdsch,
NR_ServingCellConfigCommon_t *scc,
NR_BCCH_BCH_Message_t *mib,
+ NR_BCCH_DL_SCH_Message_t *sib1,
int add_ue,
uint32_t rnti,
NR_CellGroupConfig_t *CellGroup);
@@ -175,7 +178,8 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234);
-void config_uldci(const NR_BWP_Uplink_t *ubwp,
+void config_uldci(const NR_SIB1_t *sib1,
+ const NR_BWP_Uplink_t *ubwp,
const NR_BWP_UplinkDedicated_t *ubwpd,
const NR_ServingCellConfigCommon_t *scc,
const nfapi_nr_pusch_pdu_t *pusch_pdu,
@@ -234,7 +238,13 @@ int nr_is_dci_opportunity(nfapi_nr_search_space_t search_space,
nfapi_nr_config_request_scf_t cfg);
*/
-void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
+int nr_get_pucch_resource(NR_ControlResourceSet_t *coreset,
+ NR_BWP_Uplink_t *bwp,
+ NR_BWP_UplinkDedicated_t *bwpd,
+ int CCEIndex);
+
+void nr_configure_pucch(const NR_SIB1_t *sib1,
+ nfapi_nr_pucch_pdu_t* pucch_pdu,
NR_ServingCellConfigCommon_t *scc,
NR_CellGroupConfig_t *CellGroup,
NR_BWP_Uplink_t *bwp,
@@ -283,7 +293,8 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
int dci_formats,
int rnti_types,
int N_RB,
- int bwp_id);
+ int bwp_id,
+ uint16_t cset0_bwp_size);
void prepare_dci(const NR_CellGroupConfig_t *CellGroup,
dci_pdu_rel15_t *dci_pdu_rel15,
@@ -298,6 +309,18 @@ void set_r_pucch_parms(int rsetindex,
int *nr_of_symbols,
int *start_symbol_index);
+NR_BWP_t *get_dl_bwp_genericParameters(NR_BWP_Downlink_t *active_bwp,
+ NR_ServingCellConfigCommon_t *ServingCellConfigCommon,
+ const NR_SIB1_t *sib1);
+
+NR_BWP_t *get_ul_bwp_genericParameters(NR_BWP_Uplink_t *active_ubwp,
+ NR_ServingCellConfigCommon_t *ServingCellConfigCommon,
+ const NR_SIB1_t *sib1);
+
+NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList(const NR_BWP_Downlink_t *active_bwp,
+ const NR_ServingCellConfigCommon_t *ServingCellConfigCommon,
+ const NR_SIB1_t *sib1);
+
/* find coreset within the search space */
NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
NR_ServingCellConfigCommon_t *scc,
@@ -306,13 +329,19 @@ NR_ControlResourceSet_t *get_coreset(module_id_t module_idP,
NR_SearchSpace__searchSpaceType_PR ss_type);
/* find a search space within a BWP */
-NR_SearchSpace_t *get_searchspace(NR_ServingCellConfigCommon_t *scc,
+NR_SearchSpace_t *get_searchspace(const NR_SIB1_t *sib1,
+ NR_ServingCellConfigCommon_t *scc,
NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
NR_SearchSpace__searchSpaceType_PR target_ss);
-long get_K2(NR_ServingCellConfigCommon_t *scc, NR_BWP_Uplink_t *ubwp, int time_domain_assignment, int mu);
+long get_K2(NR_ServingCellConfigCommon_t *scc,
+ NR_ServingCellConfigCommonSIB_t *scc_sib1,
+ NR_BWP_Uplink_t *ubwp,
+ int time_domain_assignment,
+ int mu);
-void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
+void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1,
+ const NR_ServingCellConfigCommon_t *scc,
const NR_CellGroupConfig_t *secondaryCellGroup,
const NR_BWP_Downlink_t *bwp,
const NR_BWP_DownlinkDedicated_t *bwpd0,
@@ -321,9 +350,10 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
NR_UE_sched_ctrl_t *sched_ctrl,
NR_pdsch_semi_static_t *ps);
-void nr_set_pusch_semi_static(const NR_ServingCellConfigCommon_t *scc,
+void nr_set_pusch_semi_static(const NR_SIB1_t *sib1,
+ const NR_ServingCellConfigCommon_t *scc,
const NR_BWP_Uplink_t *ubwp,
- const NR_BWP_UplinkDedicated_t *ubwpd,
+ const NR_BWP_UplinkDedicated_t *ubwpd,
long dci_format,
int tda,
uint8_t num_dmrs_cdm_grps_no_data,
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 5ede871465..4e4a7df7fa 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -205,6 +205,7 @@ typedef struct {
lte_frame_type_t frame_type;
uint64_t dl_CarrierFreq;
NR_BCCH_BCH_Message_t *mib;
+ NR_BCCH_DL_SCH_Message_t *sib1;
NR_ServingCellConfigCommon_t *ServingCellConfigCommon;
NR_ARFCN_ValueEUTRA_t ul_CarrierFreq;
long ul_Bandwidth;
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 86b767f83c..3a8fc34e20 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -173,6 +173,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
rrc->configuration.minRXTXTIME,
rrc->carrier.servingcellconfigcommon,
&rrc->carrier.mib,
+ rrc->carrier.siblock1,
0,
0, // WIP hardcoded rnti
NULL);
@@ -281,6 +282,7 @@ void apply_macrlc_config(gNB_RRC_INST *rrc,
rrc->configuration.minRXTXTIME,
NULL,
NULL,
+ NULL,
0,
ue_context_pP->ue_context.rnti,
cgc);
@@ -468,6 +470,7 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
rrc_instance_p->configuration.minRXTXTIME,
rrc_instance_p->carrier.servingcellconfigcommon,
&rrc_instance_p->carrier.mib,
+ rrc_instance_p->carrier.siblock1,
0,
ue_context_pP->ue_context.rnti,
NULL);
@@ -1368,6 +1371,7 @@ rrc_gNB_process_RRCReconfigurationComplete(
rrc->configuration.minRXTXTIME,
NULL,
NULL,
+ NULL,
0,
ue_context_pP->ue_context.rnti,
ue_context_pP->ue_context.masterCellGroup);
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index ea34cdd65a..bb66d1513b 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -354,6 +354,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
rrc->configuration.minRXTXTIME,
rrc->carrier.servingcellconfigcommon,
&rrc->carrier.mib,
+ NULL,
1, // add_ue flag
ue_context_p->ue_id_rnti,
ue_context_p->ue_context.secondaryCellGroup);
@@ -366,6 +367,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
rrc->configuration.minRXTXTIME,
NULL,
NULL,
+ NULL,
1, // add_ue flag
ue_context_p->ue_id_rnti,
ue_context_p->ue_context.secondaryCellGroup);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
index f2c550e766..950e9c1d38 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf
@@ -100,7 +100,7 @@ gNBs =
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 12;
- preambleReceivedTargetPower = -104;
+ preambleReceivedTargetPower = -96;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 6;
#powerRampingStep
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
index 4b9fdf84ae..74f8f2cb3b 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf
@@ -110,7 +110,7 @@ gNBs =
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 12;
- preambleReceivedTargetPower = -104;
+ preambleReceivedTargetPower = -96;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 6;
#powerRampingStep