mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 04:30:28 +00:00
Compare commits
105 Commits
ru-comment
...
use_msgq
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ffee14b30c | ||
|
|
60cc913956 | ||
|
|
2aba646ea7 | ||
|
|
c3d8907a86 | ||
|
|
ac5b73fa38 | ||
|
|
84b34ffb38 | ||
|
|
006c47df25 | ||
|
|
a8e6cae796 | ||
|
|
6b3f25afc7 | ||
|
|
133aa928f7 | ||
|
|
5067a2de00 | ||
|
|
39fd90f4bf | ||
|
|
87e7bfce79 | ||
|
|
451fd2a3ec | ||
|
|
6e63a48acd | ||
|
|
ecd35a3cfb | ||
|
|
b51823936d | ||
|
|
fa7fa99bc5 | ||
|
|
ea57aa58d7 | ||
|
|
ef9e8fd788 | ||
|
|
71d25e7886 | ||
|
|
f0f441e7b9 | ||
|
|
6ddd3b848f | ||
|
|
515191c593 | ||
|
|
9d5d23008f | ||
|
|
97a54e5496 | ||
|
|
e626bbd8b0 | ||
|
|
60a9f8a8a2 | ||
|
|
3478e8da5d | ||
|
|
9d04f2e8bb | ||
|
|
fe09318b13 | ||
|
|
786cdd839c | ||
|
|
47ef743950 | ||
|
|
75cec63fa1 | ||
|
|
1ddf300b06 | ||
|
|
72da42de21 | ||
|
|
7b65478ec3 | ||
|
|
52046caa51 | ||
|
|
fe20b0cb5d | ||
|
|
119a5edfb5 | ||
|
|
099904b320 | ||
|
|
0ddc772c53 | ||
|
|
d3ed5b7d66 | ||
|
|
c92e45296c | ||
|
|
fd5f31f780 | ||
|
|
39690e6d10 | ||
|
|
65d900e8b0 | ||
|
|
1f458c7107 | ||
|
|
9c165e3992 | ||
|
|
6c6266e725 | ||
|
|
0f55476b62 | ||
|
|
d95ac0a913 | ||
|
|
8f1db2ea0b | ||
|
|
2d82cf51b7 | ||
|
|
40e8376eb3 | ||
|
|
28d782a600 | ||
|
|
c53150145c | ||
|
|
989cc7adea | ||
|
|
2fc9020459 | ||
|
|
987f88ff5b | ||
|
|
7466a3caad | ||
|
|
60a025b553 | ||
|
|
5c77df1e4f | ||
|
|
6fdd65b3aa | ||
|
|
817e5cbc62 | ||
|
|
d4afd251d5 | ||
|
|
6c9a0dea27 | ||
|
|
b038ee0af8 | ||
|
|
7fc31d9ca9 | ||
|
|
6d66049e1f | ||
|
|
c623400f54 | ||
|
|
eef3688919 | ||
|
|
17c1c58033 | ||
|
|
1de435d273 | ||
|
|
173e57d68f | ||
|
|
04062e8e8b | ||
|
|
870dbe2927 | ||
|
|
48ef608a8d | ||
|
|
64b683d496 | ||
|
|
62e488d4a1 | ||
|
|
a93e3e6328 | ||
|
|
9b2146817c | ||
|
|
3ec89b671e | ||
|
|
fb715f022e | ||
|
|
c25ab52c92 | ||
|
|
fd8d646ffa | ||
|
|
9151e06fe1 | ||
|
|
7fced9d640 | ||
|
|
20be2dd36d | ||
|
|
d6fcc5f2d4 | ||
|
|
4dad60fe20 | ||
|
|
6addbdefff | ||
|
|
25d0b4317e | ||
|
|
ed9d9001a2 | ||
|
|
ad40d0d49b | ||
|
|
c0c598262d | ||
|
|
068c239b37 | ||
|
|
62c73ee3c5 | ||
|
|
eacd88ea96 | ||
|
|
1dbffbdea6 | ||
|
|
d2ae2a0928 | ||
|
|
7d93bc3328 | ||
|
|
ee60fbc290 | ||
|
|
e13e01c097 | ||
|
|
4412a2d318 |
@@ -52,6 +52,21 @@ include_directories(${CONFIG_INCLUDE_DIRS})
|
||||
pkg_search_module(CRYPTO libcrypto REQUIRED)
|
||||
include_directories(${CRYPTO_INCLUDE_DIRS})
|
||||
|
||||
add_list2_option(TP_PROTO "None" "Ethernet" "benetel4g" "benetel5g" "oran_fhlib_5g")
|
||||
if (${TP_PROTO} STREQUAL "oran_fhlib_5g")
|
||||
if(DEFINED ENV{RTE_SDK})
|
||||
message("RTE_SDK $ENV{RTE_SDK}")
|
||||
else()
|
||||
message(FATAL_ERROR "RTE_SDK Not defined")
|
||||
endif()
|
||||
|
||||
if(DEFINED ENV{RTE_TARGET})
|
||||
message("RTE_TARGET $ENV{RTE_TARGET}")
|
||||
else()
|
||||
message(FATAL_ERROR "RTE_TARGET is NOT defined")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#uhd 4.0 and iris installs by default in /usr/local
|
||||
include_directories("/usr/local/include/")
|
||||
#use native cmake method as this package is not in pkg-config
|
||||
@@ -137,7 +152,20 @@ set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
|
||||
set (OPENAIR_CMAKE ${OPENAIR_DIR}/cmake_targets)
|
||||
set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
|
||||
set (INTEL_LIB /usr/local/intel64)
|
||||
set (DPDK_DIR $ENV{RTE_SDK}/$ENV{RTE_TARGET}/include)
|
||||
|
||||
if(DEFINED ENV{XRAN_LIB_DIR})
|
||||
set (XRAN_LIB_DIR $ENV{XRAN_LIB_DIR})
|
||||
else()
|
||||
set (XRAN_LIB_DIR /usr/local/xran)
|
||||
endif()
|
||||
|
||||
set (XRAN_DIR $ENV{XRAN_LIB_DIR}/../src)
|
||||
set (XRAN_COMMON_DIR $ENV{XRAN_LIB_DIR}/../../test/common)
|
||||
set (XRAN_LIB_API_DIR $ENV{XRAN_LIB_DIR}/../api)
|
||||
|
||||
Message("XRAN_LIB_DIR: ${XRAN_LIB_DIR}, DPDK_DIR: ${DPDK_DIR}")
|
||||
project (OpenAirInterface)
|
||||
|
||||
####################################################
|
||||
@@ -590,6 +618,30 @@ target_link_libraries(benetel_5g PRIVATE ${DPDK_LIBS})
|
||||
target_link_libraries(benetel_5g PRIVATE pthread dl rt m numa)
|
||||
target_link_libraries(benetel_5g PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
|
||||
# ORAN 5G library
|
||||
######################################################################
|
||||
|
||||
set(ORAN_FHLIB_5G_SOURCE
|
||||
${OPENAIR_DIR}/radio/ETHERNET/oran/5g/oran.cpp
|
||||
${OPENAIR_DIR}/radio/ETHERNET/oran/5g/xran_lib_wrap.cpp
|
||||
${OPENAIR_DIR}/radio/ETHERNET/oran/5g/oran_isolate.c
|
||||
)
|
||||
add_library(oran_fhlib_5g MODULE ${ORAN_FHLIB_5G_SOURCE})
|
||||
|
||||
target_include_directories(oran_fhlib_5g PRIVATE ${XRAN_DIR})
|
||||
target_include_directories(oran_fhlib_5g PRIVATE ${DPDK_DIR})
|
||||
target_include_directories(oran_fhlib_5g PRIVATE ${INTEL_LIB})
|
||||
target_include_directories(oran_fhlib_5g PRIVATE ${XRAN_COMMON_DIR})
|
||||
target_include_directories(oran_fhlib_5g PRIVATE ${XRAN_LIB_API_DIR})
|
||||
|
||||
set_target_properties(oran_fhlib_5g PROPERTIES COMPILE_FLAGS "-fvisibility=hidden -march=native -I$ENV{RTE_SDK}/$ENV{RTE_TARGET}/include")
|
||||
|
||||
SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive -L$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -ldpdk -Wl,--no-whole-archive")
|
||||
TARGET_LINK_LIBRARIES(oran_fhlib_5g PRIVATE ${DPDK_LIBS})
|
||||
TARGET_LINK_LIBRARIES(oran_fhlib_5g PRIVATE -L${XRAN_LIB_DIR} -lxran)
|
||||
TARGET_LINK_LIBRARIES(oran_fhlib_5g PRIVATE pthread dl rt m numa)
|
||||
target_link_libraries(oran_fhlib_5g PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
|
||||
##########################################################
|
||||
|
||||
# LDPC offload library
|
||||
|
||||
@@ -164,8 +164,8 @@
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<air_interface>nr</air_interface>
|
||||
<d_retx_th>5,50,100,100</d_retx_th>
|
||||
<u_retx_th>5,50,100,100</u_retx_th>
|
||||
<d_retx_th>5,80,100,100</d_retx_th>
|
||||
<u_retx_th>5,80,100,100</u_retx_th>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -111,8 +111,8 @@
|
||||
|
||||
<testCase id="072000">
|
||||
<class>Iperf</class>
|
||||
<desc>iperf (DL/200Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 200M -t 60</iperf_args>
|
||||
<desc>iperf (DL/180Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||
<iperf_args>-u -b 180M -t 60</iperf_args>
|
||||
<direction>DL</direction>
|
||||
<id>nrmodule2_quectel</id>
|
||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||
@@ -147,8 +147,8 @@
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<air_interface>nr</air_interface>
|
||||
<d_retx_th>5,50,100,100</d_retx_th>
|
||||
<u_retx_th>5,50,100,100</u_retx_th>
|
||||
<d_retx_th>5,80,100,100</d_retx_th>
|
||||
<u_retx_th>5,80,100,100</u_retx_th>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -182,8 +182,8 @@
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<air_interface>nr</air_interface>
|
||||
<d_retx_th>5,50,100,100</d_retx_th>
|
||||
<u_retx_th>5,50,100,100</u_retx_th>
|
||||
<d_retx_th>5,80,100,100</d_retx_th>
|
||||
<u_retx_th>5,80,100,100</u_retx_th>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -117,7 +117,7 @@ Options:
|
||||
USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, None (Default)
|
||||
Adds this RF board support (in external packages installation and in compilation)
|
||||
-t | --transport
|
||||
Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g
|
||||
Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g, oran_fhlib_5g
|
||||
-P | --phy_simulators
|
||||
Makes the unitary tests Layer 1 simulators
|
||||
-S | --core_simulators
|
||||
@@ -307,6 +307,8 @@ function main() {
|
||||
shift 2;;
|
||||
-t | --transport)
|
||||
TP=$2
|
||||
echo_info "TP set to ${TP}"
|
||||
CMAKE_CMD="$CMAKE_CMD -DTP_PROTO=$2"
|
||||
shift 2;;
|
||||
-P | --phy_simulators)
|
||||
SIMUS_PHY=1
|
||||
@@ -508,7 +510,7 @@ function main() {
|
||||
if [ ! -v BUILD_UHD_FROM_SOURCE ] && [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
|
||||
install_usrp_uhd_driver $UHD_IMAGES_DIR
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ "$HW" == "OAI_BLADERF" ] ; then
|
||||
echo_info "installing packages for BLADERF support"
|
||||
check_install_bladerf_driver
|
||||
@@ -746,7 +748,12 @@ function main() {
|
||||
compilations $BUILD_DIR benetel_5g
|
||||
ln -sf libbenetel_5g.so liboai_transpro.so
|
||||
echo_info "liboai_transpro.so is linked to BENETEL4G transport"
|
||||
fi
|
||||
fi
|
||||
if [ "$TP" == "oran_fhlib_5g" ]; then
|
||||
compilations $BUILD_DIR oran_fhlib_5g
|
||||
ln -sf liboran_fhlib_5g.so liboai_transpro.so
|
||||
echo_info "liboai_transpro.so is linked to oran_fhlib_5G transport"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
From d1ad2907b3c3572de193ae770912436fb0a96443 Mon Sep 17 00:00:00 2001
|
||||
From: "thamizhselvan.k" <thamizhselvan.k@vvdntech.in>
|
||||
Date: Fri, 27 Jan 2023 16:18:08 +0530
|
||||
Subject: [PATCH 2/2] disable dedicated bandwidth config for Amarisoft UE
|
||||
simbox
|
||||
|
||||
---
|
||||
openair2/RRC/NR/MESSAGES/asn1_msg.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
|
||||
index e52e637dd8..f15735b36f 100644
|
||||
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
|
||||
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
|
||||
@@ -1213,10 +1213,8 @@ void fill_initial_cellGroupConfig(int uid,
|
||||
physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook = NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic;
|
||||
cellGroupConfig->physicalCellGroupConfig = physicalCellGroupConfig;
|
||||
|
||||
- cellGroupConfig->spCellConfig = calloc(1,sizeof(*cellGroupConfig->spCellConfig));
|
||||
+ cellGroupConfig->spCellConfig = NULL;
|
||||
|
||||
- fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,servingcellconfigdedicated,configuration);
|
||||
-
|
||||
cellGroupConfig->sCellToAddModList = NULL;
|
||||
cellGroupConfig->sCellToReleaseList = NULL;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
From a7f20ad7c4ada7d50f21c5a8f15b1baab37481fa Mon Sep 17 00:00:00 2001
|
||||
From: "thamizhselvan.k" <thamizhselvan.k@vvdntech.in>
|
||||
Date: Fri, 27 Jan 2023 15:42:36 +0530
|
||||
Subject: [PATCH 1/4] compile libxran using-gcc and disable avx512
|
||||
|
||||
---
|
||||
fhi_lib/build.sh | 7 ++++---
|
||||
fhi_lib/lib/Makefile | 23 ++++++++++++-----------
|
||||
2 files changed, 16 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/fhi_lib/build.sh b/fhi_lib/build.sh
|
||||
index 22859b5..575bcc5 100755
|
||||
--- a/fhi_lib/build.sh
|
||||
+++ b/fhi_lib/build.sh
|
||||
@@ -70,11 +70,12 @@ echo "LIBXRANSO = ${LIBXRANSO}"
|
||||
echo "MLOG = ${MLOG}"
|
||||
|
||||
cd $XRAN_FH_LIB_DIR
|
||||
+make clean
|
||||
make $COMMAND_LINE MLOG=${MLOG} LIBXRANSO=${LIBXRANSO} #DEBUG=1 VERBOSE=1
|
||||
|
||||
-echo 'Building xRAN Test Application'
|
||||
-cd $XRAN_FH_APP_DIR
|
||||
-make $COMMAND_LINE MLOG=${MLOG} #DEBUG=1 VERBOSE=1
|
||||
+#echo 'Building xRAN Test Application'
|
||||
+#cd $XRAN_FH_APP_DIR
|
||||
+#make $COMMAND_LINE MLOG=${MLOG} #DEBUG=1 VERBOSE=1
|
||||
|
||||
if [ -z ${GTEST_ROOT+x} ];
|
||||
then
|
||||
diff --git a/fhi_lib/lib/Makefile b/fhi_lib/lib/Makefile
|
||||
index 579a0c6..de5309d 100644
|
||||
--- a/fhi_lib/lib/Makefile
|
||||
+++ b/fhi_lib/lib/Makefile
|
||||
@@ -23,11 +23,11 @@ MYCUSTOMSPACE1='------------------------------------------------------------'
|
||||
##############################################################
|
||||
# Tools configuration
|
||||
##############################################################
|
||||
-CC := icc
|
||||
-CPP := icpc
|
||||
+CC := gcc
|
||||
+#CPP := icpc
|
||||
AS := as
|
||||
AR := ar
|
||||
-LD := icc
|
||||
+LD := gcc
|
||||
OBJDUMP := objdump
|
||||
|
||||
ifeq ($(SHELL),cmd.exe)
|
||||
@@ -95,9 +95,10 @@ CC_FLAGS += -std=gnu11 -Wall -Wno-deprecated-declarations \
|
||||
-fPIC \
|
||||
-Wall \
|
||||
-Wimplicit-function-declaration \
|
||||
- -g -O3 -wd1786
|
||||
+ -g -O0 -mssse3 \
|
||||
+ -march=native
|
||||
|
||||
-CPP_FLAGS := -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D_GNU_SOURCE -D_REENTRANT -pipe -no-prec-div \
|
||||
+#CPP_FLAGS := -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D_GNU_SOURCE -D_REENTRANT -pipe -no-prec-div \
|
||||
-no-prec-div -fp-model fast=2 -fPIC \
|
||||
-no-prec-sqrt -falign-functions=16 -fast-transcendentals \
|
||||
-Werror -Wno-unused-variable -std=c++11 -mcmodel=large
|
||||
@@ -121,14 +122,14 @@ PROJECT_OBJ_DIR := build/obj
|
||||
CC_OBJS := $(patsubst %.c,%.o,$(CC_SRC))
|
||||
CPP_OBJS := $(patsubst %.cpp,%.o,$(CPP_SRC))
|
||||
AS_OBJS := $(patsubst %.s,%.o,$(AS_SRC))
|
||||
-OBJS := $(CC_OBJS) $(CPP_OBJS) $(AS_OBJS) $(LIBS)
|
||||
+OBJS := $(CC_OBJS) $(AS_OBJS) $(LIBS)
|
||||
DIRLIST := $(addprefix $(PROJECT_OBJ_DIR)/,$(sort $(dir $(OBJS))))
|
||||
|
||||
CC_OBJTARGETS := $(addprefix $(PROJECT_OBJ_DIR)/,$(CC_OBJS))
|
||||
CPP_OBJTARGETS := $(addprefix $(PROJECT_OBJ_DIR)/,$(CPP_OBJS))
|
||||
|
||||
AS_OBJTARGETS := $(addprefix $(PROJECT_OBJ_DIR)/,$(AS_OBJS))
|
||||
-CPP_COMP := -O3 -xcore-avx512 -restrict -g -fasm-blocks
|
||||
+CPP_COMP := -O3 -xcore-avx512 -restrict -g
|
||||
CC_FLAGS_FULL := $(CC_FLAGS) $(INC) $(DEF)
|
||||
CPP_FLAGS_FULL := $(CPP_FLAGS) $(CPP_COMP) $(INC) $(DEF)
|
||||
|
||||
@@ -160,7 +161,7 @@ $(CPP_DEPS) :
|
||||
@$(CPP) -MM $(subst __up__,../,$(subst __dep__,,$@)) -MT $(PROJECT_OBJ_DIR)/$(patsubst %.cpp,%.o,$(subst __up__,../,$(subst __dep__,,$@))) $(CPP_FLAGS_FULL) >> $(PROJECT_DEP_FILE)
|
||||
|
||||
.PHONY : generate_deps
|
||||
-generate_deps : clear_dep $(CC_DEPS) $(CPP_DEPS)
|
||||
+generate_deps : clear_dep $(CC_DEPS)
|
||||
|
||||
|
||||
.PHONY : echo_start_build
|
||||
@@ -211,10 +212,10 @@ welcome_line :
|
||||
|
||||
debug : all
|
||||
release : all
|
||||
-$(PROJECT_BINARY) : $(DIRLIST) echo_start_build $(GENERATE_DEPS) $(PRE_BUILD) $(CC_OBJTARGETS) $(CPP_OBJTARGETS) $(AS_OBJTARGETS)
|
||||
+$(PROJECT_BINARY) : $(DIRLIST) echo_start_build $(GENERATE_DEPS) $(PRE_BUILD) $(CC_OBJTARGETS) $(AS_OBJTARGETS)
|
||||
@echo [AR] $(subst $(BUILDDIR)/,,$@)
|
||||
ifeq ($(XRAN_LIB_SO),)
|
||||
- @$(AR) $(AR_FLAGS) $@ $(CC_OBJTARGETS) $(CPP_OBJTARGETS) $(AS_OBJTARGETS)
|
||||
+ @$(AR) $(AR_FLAGS) $@ $(CC_OBJTARGETS) $(AS_OBJTARGETS)
|
||||
else
|
||||
- @$(CC) $(CC_OBJTARGETS) $(CPP_OBJTARGETS) $(AS_OBJTARGETS) -shared -fPIC -o $@
|
||||
+ @$(CC) $(CC_OBJTARGETS) $(AS_OBJTARGETS) -shared -fPIC -o $@
|
||||
endif
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
From f26a9e9a3b902d56fffcb40644fa7d3e17d793f9 Mon Sep 17 00:00:00 2001
|
||||
From: "thamizhselvan.k" <thamizhselvan.k@vvdntech.in>
|
||||
Date: Fri, 27 Jan 2023 15:43:50 +0530
|
||||
Subject: [PATCH 2/4] return correct slot_id
|
||||
|
||||
---
|
||||
fhi_lib/lib/src/xran_main.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/fhi_lib/lib/src/xran_main.c b/fhi_lib/lib/src/xran_main.c
|
||||
index 17acc2a..8f5705e 100644
|
||||
--- a/fhi_lib/lib/src/xran_main.c
|
||||
+++ b/fhi_lib/lib/src/xran_main.c
|
||||
@@ -609,6 +609,7 @@ static inline int8_t xran_check_updl_seqid(void *pHandle, uint8_t cc_id, uint8_t
|
||||
|
||||
uint32_t xran_slotid_convert(uint16_t slot_id, uint16_t dir) //dir = 0, from PHY slotid to xran spec slotid as defined in 5.3.2, dir=1, from xran slotid to phy slotid
|
||||
{
|
||||
+ return slot_id;
|
||||
#ifdef FCN_ADAPT
|
||||
return slot_id;
|
||||
#endif
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
From 3055c4a6cdb3ffa91deb4c6c11ecad0c95fef759 Mon Sep 17 00:00:00 2001
|
||||
From: "thamizhselvan.k" <thamizhselvan.k@vvdntech.in>
|
||||
Date: Fri, 27 Jan 2023 15:46:02 +0530
|
||||
Subject: [PATCH 3/4] disable pkt validate at process_mbuf
|
||||
|
||||
---
|
||||
fhi_lib/lib/src/xran_common.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/fhi_lib/lib/src/xran_common.c b/fhi_lib/lib/src/xran_common.c
|
||||
index c4cb3fb..5bbacf7 100644
|
||||
--- a/fhi_lib/lib/src/xran_common.c
|
||||
+++ b/fhi_lib/lib/src/xran_common.c
|
||||
@@ -192,6 +192,7 @@ int process_mbuf(struct rte_mbuf *pkt)
|
||||
return MBUF_FREE;
|
||||
}
|
||||
|
||||
+#if 0
|
||||
valid_res = xran_pkt_validate(NULL,
|
||||
pkt,
|
||||
iq_samp_buf,
|
||||
@@ -213,6 +214,7 @@ int process_mbuf(struct rte_mbuf *pkt)
|
||||
print_dbg("valid_res is wrong [%d] ant %u (%u : %u : %u : %u) seq %u num_bytes %d\n", valid_res, Ant_ID, frame_id, subframe_id, slot_id, symb_id, seq.seq_id, num_bytes);
|
||||
return MBUF_FREE;
|
||||
}
|
||||
+#endif
|
||||
|
||||
if (Ant_ID >= p_x_ctx->srs_cfg.eAxC_offset && p_x_ctx->fh_init.srsEnable) {
|
||||
/* SRS packet has ruportid = 2*num_eAxc + ant_id */
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
From 5c99462d138042f99b3a02cec013f75bbc3732a9 Mon Sep 17 00:00:00 2001
|
||||
From: "thamizhselvan.k" <thamizhselvan.k@vvdntech.in>
|
||||
Date: Fri, 27 Jan 2023 15:48:25 +0530
|
||||
Subject: [PATCH 4/4] process all rx ring
|
||||
|
||||
---
|
||||
fhi_lib/lib/src/xran_common.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fhi_lib/lib/src/xran_common.c b/fhi_lib/lib/src/xran_common.c
|
||||
index 5bbacf7..eaefe45 100644
|
||||
--- a/fhi_lib/lib/src/xran_common.c
|
||||
+++ b/fhi_lib/lib/src/xran_common.c
|
||||
@@ -737,8 +737,8 @@ int32_t ring_processing_func(void)
|
||||
/* UP first */
|
||||
|
||||
for (i = 0; i < ctx->io_cfg.num_vfs && i < (XRAN_VF_MAX - 1); i = i+2){
|
||||
- if (process_ring(ctx->rx_ring[i]))
|
||||
- return 0;
|
||||
+ process_ring(ctx->rx_ring[i]);
|
||||
+ process_ring(ctx->rx_ring[i+1]);
|
||||
|
||||
/* CP next */
|
||||
if(ctx->io_cfg.id == O_RU) /* process CP only on O-RU */
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
diff --git a/fhi_lib/test/common/common_typedef_xran.h b/fhi_lib/test/common/common_typedef_xran.h
|
||||
index 9e84bd3..65621f5 100644
|
||||
--- a/fhi_lib/test/common/common_typedef_xran.h
|
||||
+++ b/fhi_lib/test/common/common_typedef_xran.h
|
||||
@@ -88,7 +88,7 @@ typedef enum{
|
||||
CPU_GENERIC, /*!< C */
|
||||
SSE4_2, /*!< SSE4_2 */
|
||||
AVX, /*!< AVX */
|
||||
- AVX2, /*!< AVX2 */
|
||||
+ AVX_2, /*!< AVX2 */
|
||||
AVX_512, /*!< AVX512 */
|
||||
}instruction_cpu_support;
|
||||
|
||||
diff --git a/fhi_lib/test/common/common.hpp b/fhi_lib/test/common/common.hpp
|
||||
index 9b01b06..64a1baf 100644
|
||||
--- a/fhi_lib/test/common/common.hpp
|
||||
+++ b/fhi_lib/test/common/common.hpp
|
||||
@@ -31,7 +31,7 @@
|
||||
#include <rte_malloc.h>
|
||||
#endif
|
||||
|
||||
-#include "gtest/gtest.h"
|
||||
+//#include "gtest/gtest.h"
|
||||
|
||||
#include "common_typedef_xran.h"
|
||||
|
||||
@@ -106,7 +106,7 @@ json read_json_from_file(const std::string &filename);
|
||||
\return Pointer to the allocated memory with data from the file.
|
||||
\throws std::runtime_error when memory cannot be allocated.
|
||||
*/
|
||||
-char* read_data_to_aligned_array(const std::string &filename);
|
||||
+//char* read_data_to_aligned_array(const std::string &filename);
|
||||
|
||||
/*!
|
||||
\brief Measure the TSC on the machine
|
||||
@@ -140,6 +140,7 @@ unsigned long tsc_tick();
|
||||
values, e.g. 1, 0.001, 5e-05, etc. or filename. Depends on the get type test framework can either
|
||||
read the value or load data from the file - and it happens automatically (*pff* MAGIC!).
|
||||
*/
|
||||
+#if 0
|
||||
class KernelTests : public testing::TestWithParam<unsigned>
|
||||
{
|
||||
public:
|
||||
@@ -827,5 +828,6 @@ T* generate_random_real_numbers(const long size, const unsigned alignment, const
|
||||
|
||||
return generate_random_numbers<T, std::uniform_real_distribution<T>>(size, alignment, distribution);
|
||||
}
|
||||
+#endif
|
||||
|
||||
#endif //XRANLIB_COMMON_HPP
|
||||
diff --git a/fhi_lib/lib/src/xran_common.h b/fhi_lib/lib/src/xran_common.h
|
||||
index 4f2928d..5028376 100644
|
||||
--- a/fhi_lib/lib/src/xran_common.h
|
||||
+++ b/fhi_lib/lib/src/xran_common.h
|
||||
@@ -351,6 +351,7 @@ uint8_t xran_get_num_ant_elm(void *pHandle);
|
||||
enum xran_category xran_get_ru_category(void *pHandle);
|
||||
|
||||
struct xran_device_ctx *xran_dev_get_ctx(void);
|
||||
+int xran_is_prach_slot(uint32_t subframe_id, uint32_t slot_id);
|
||||
|
||||
int xran_register_cb_mbuf2ring(xran_ethdi_mbuf_send_fn mbuf_send_cp, xran_ethdi_mbuf_send_fn mbuf_send_up);
|
||||
|
||||
@@ -258,7 +258,8 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name,
|
||||
ret=pthread_attr_setschedparam(&attr, &sparam);
|
||||
AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno);
|
||||
}
|
||||
|
||||
|
||||
LOG_I(UTIL,"threadCreate for %s, affinity %x, priority %d\n",name,affinity,priority);
|
||||
ret=pthread_create(t, &attr, func, param);
|
||||
AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno);
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name
|
||||
// set the thread name for debugging
|
||||
sprintf(pool->allthreads->name,"%s%d_%d",tname,pool->nbThreads,pool->allthreads->coreID);
|
||||
threadCreate(&pool->allthreads->threadID, one_thread, (void *)pool->allthreads,
|
||||
pool->allthreads->name, pool->allthreads->coreID, OAI_PRIORITY_RT);
|
||||
pool->allthreads->name, pool->allthreads->coreID, OAI_PRIORITY_RT_MAX);
|
||||
pool->nbThreads++;
|
||||
}
|
||||
|
||||
|
||||
@@ -357,6 +357,7 @@ The following features are valid for the gNB and the 5G-NR UE.
|
||||
- RRCSetupRequest/RRCSetup/RRCSetupComplete
|
||||
- RRC Uplink/Downlink Information transfer carrying NAS messages transparently
|
||||
- RRC Reconfiguration/Reconfiguration complete
|
||||
- RRC Reestablishment/Reestablishment complete
|
||||
- Paging
|
||||
- Support for master cell group configuration
|
||||
- Interface with NGAP for the interactions with the AMF
|
||||
|
||||
178
doc/ORAN_FHI7.2_Tutorial.md
Normal file
178
doc/ORAN_FHI7.2_Tutorial.md
Normal file
@@ -0,0 +1,178 @@
|
||||
<table style="border-collapse: collapse; border: none;">
|
||||
<tr style="border-collapse: collapse; border: none;">
|
||||
<td style="border-collapse: collapse; border: none;">
|
||||
<a href="http://www.openairinterface.org/">
|
||||
<img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150>
|
||||
</img>
|
||||
</a>
|
||||
</td>
|
||||
<td style="border-collapse: collapse; border: none; vertical-align: center;">
|
||||
<b><font size = "5">OAI 7.2 Fronthaul Interface 5G SA Tutorial</font></b>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
**Table of Contents**
|
||||
|
||||
[[_TOC_]]
|
||||
|
||||
# 1. Prerequisites
|
||||
|
||||
The hardware on which we have tried this tutorial:
|
||||
|
||||
|Hardware (CPU,RAM) |Operating System |NIC (Vendor,Driver,Firmware) |
|
||||
|--------------------------------------------|----------------------------------|-------------------------------------------------|
|
||||
|Intel(R) Xeon(R) Gold 6154 (2*18 Core), 64GB|RHEL 8.6 (4.18.0-372.26.1.rt7.183)|QLogic FastLinQ QL41000,qede,mbi 15.35.1 |
|
||||
|Intel(R) Xeon(R) Gold 6354 18-Core, 128GB |RHEL 8.7 (4.18.0-425.10.1.rt7.220)|Intel XXV710 for 25GbE SFP28,i40e,6.02 0x80003888|
|
||||
|AMD EPYC 7513 32-Core Processor, 256GB |Ubuntu 20.04 (5.4.143-rt64) |Intel X710 for 10GbE SFP+,i40e,5.04 0x80002530 |
|
||||
|
||||
**NOTE**: These are not minimum hardware requirements. This is the configuration of our servers.
|
||||
|
||||
We always set our servers to maximum performance mode.
|
||||
```bash
|
||||
tuned-adm profile realtime
|
||||
```
|
||||
|
||||
For PTP grandmaster we have used Fibrolan Falcon-RX. The O-RU which we have used for this tutorial is VVDN LPRU.
|
||||
|
||||
## 1.1 DPDK(Data Plane Development Kit)
|
||||
|
||||
Download DPDK version 20.05.0
|
||||
```bash
|
||||
wget http://fast.dpdk.org/rel/dpdk-20.05.tar.xz
|
||||
```
|
||||
|
||||
DPDK Compilation
|
||||
```bash
|
||||
tar -xvf dpdk-20.05.tar.xz
|
||||
cd dpdk-20.05
|
||||
|
||||
meson build
|
||||
cd build
|
||||
sudo ninja
|
||||
sudo ninja install
|
||||
|
||||
make install T=x86_64-native-linuxapp-gcc
|
||||
```
|
||||
|
||||
## 1.2 Setup
|
||||
|
||||
We have mentioned the information for our setup but if you want more information then you can refer to below links,
|
||||
|
||||
1. [O-RAN-SC O-DU Setup Configuration](https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/Setup-Configuration_fh.html)
|
||||
2. [O-RAN Cloud Platform Reference Designs 2.0,O-RAN.WG6.CLOUD-REF-v02.00,February 2021](https://orandownloadsweb.azurewebsites.net/specifications)
|
||||
|
||||
### 1.2.1 RHEL
|
||||
|
||||
These arguments we tried on both RHEL 8.6 (4.18.0-372.26.1.rt7.183.el8_6.x86_64) and 8.7 (4.18.0-425.10.1.rt7.220.el8_7.x86_64)
|
||||
|
||||
Update Linux boot arguments
|
||||
```bash
|
||||
igb.max_vfs=2 intel_iommu=on iommu=pt intel_pstate=disable nosoftlockup tsc=nowatchdog mitigations=off cgroup_memory=1 cgroup_enable=memory mce=off idle=poll hugepagesz=1G hugepages=40 hugepagesz=2M hugepages=0 default_hugepagesz=1G selinux=0 enforcing=0 nmi_watchdog=0 softlockup_panic=0 audit=0 skew_tick=1 isolcpus=managed_irq,domain,0-2,8-17 nohz_full=0-2,8-17 rcu_nocbs=0-2,8-17 rcu_nocb_poll
|
||||
```
|
||||
|
||||
### 1.2.1 Ubuntu
|
||||
|
||||
Install real timer kernel followed by updating boot arguments
|
||||
```bash
|
||||
isolcpus=0-2,8-17 nohz=on nohz_full=0-2,8-17 rcu_nocbs=0-2,8-17 rcu_nocb_poll nosoftlockup default_hugepagesz=1GB hugepagesz=1G hugepages=10 amd_iommu=on iommu=pt
|
||||
```
|
||||
|
||||
Isolated CPU 0-2 are used for DPDK/ORAN and CPU 8 for `ru_thread` in our example config
|
||||
|
||||
## 1.3 PTP configuration
|
||||
|
||||
You can refer to the [following o-ran link](https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/PTP-configuration_fh.html) for PTP configuration. In our setup we used Fibrolan Falcon-RX for PTP grandmaster.
|
||||
```bash
|
||||
git clone http://git.code.sf.net/p/linuxptp/code linuxptp
|
||||
git checkout v2.0
|
||||
make && make install
|
||||
|
||||
./ptp4l -i ens1f1 -m -H -2 -s -f configs/default.cfg
|
||||
./phc2sys -w -m -s ens1f1 -R 8 -f configs/default.cfg
|
||||
```
|
||||
|
||||
# 2. Build OAI-FHI gNB
|
||||
|
||||
## 2.1 Build ORAN Fronthaul Interface Library
|
||||
|
||||
Download ORAN FHI library
|
||||
```bash
|
||||
git clone https://gerrit.o-ran-sc.org/r/o-du/phy.git
|
||||
cd phy
|
||||
git checkout oran_release_bronze_v1.1
|
||||
```
|
||||
|
||||
Apply patches (available in `oai_folder/cmake_targets/tools/oran_fhi_integration_patches/`)
|
||||
```bash
|
||||
git apply oran-fhi-1-compile-libxran-using-gcc-and-disable-avx512.patch
|
||||
git apply oran-fhi-2-return-correct-slot_id.patch
|
||||
git apply oran-fhi-3-disable-pkt-validate-at-process_mbuf.patch
|
||||
git apply oran-fhi-4-process_all_rx_ring.patch
|
||||
git apply oran-fhi-5-remove-not-used-dependencies.patch
|
||||
```
|
||||
|
||||
Set up the environment (change the path if you use different folders)
|
||||
|
||||
```bash
|
||||
export XRAN_LIB_DIR=~/phy/fhi_lib/lib/build
|
||||
export XRAN_DIR=~/phy/fhi_lib
|
||||
export RTE_SDK=~/dpdk-20.05
|
||||
export RTE_TARGET=x86_64-native-linuxapp-gcc
|
||||
export RTE_INCLUDE=${RTE_SDK}/${RTE_TARGET}/include
|
||||
```
|
||||
|
||||
Compile Fronthaul Interface Library
|
||||
```bash
|
||||
cd phy/fhi_lib/
|
||||
./build.sh
|
||||
```
|
||||
|
||||
## 2.2 Build OAI gNB
|
||||
|
||||
```bash
|
||||
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||
cd openairinterface5g
|
||||
git checkout develop
|
||||
source oaienv
|
||||
cd cmake_targets
|
||||
./build_oai --gNB --ninja -t oran_fhlib_5g (Add, -I if you are building for the first time on server for installing external dependencies)
|
||||
```
|
||||
|
||||
# 3. Configure Server and OAI gNB
|
||||
|
||||
## 3.1 Update following in fronthaul interface configuration - oran.fhi.json
|
||||
|
||||
```
|
||||
* DU Mac-address: Parameter o_du_macaddr
|
||||
* RU MAC Address: Parameter o_ru_macaddr
|
||||
* PCI address: Parameter dpdk_dev_up and dpdk_dev_cp
|
||||
```
|
||||
|
||||
## 3.2 Copy Fronthaul Configuration File
|
||||
|
||||
```bash
|
||||
cd ran_build/build
|
||||
cp ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/oran.fhi.json .
|
||||
```
|
||||
|
||||
## 3.2 Bind Devices
|
||||
|
||||
```bash
|
||||
echo "2" > /sys/class/net/ens1f1/device/sriov_numvfs
|
||||
sudo ip link set ens1f1 vf 0 mac 00:11:22:33:44:66 spoofchk off
|
||||
sudo ip link set ens1f1 vf 1 mac 00:11:22:33:44:66 spoofchk off
|
||||
sudo modprobe vfio_pci
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 51:0e.0
|
||||
sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 51:0e.1
|
||||
```
|
||||
|
||||
# 4. Run OAI gNB
|
||||
|
||||
## 4.1 Run OAI gNB
|
||||
|
||||
```bash
|
||||
cd ran_build/build
|
||||
|
||||
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/oran.fh.band78.fr1.273PRB.conf --sa --reorder-thread-disable
|
||||
```
|
||||
@@ -87,6 +87,7 @@
|
||||
#include <openair1/PHY/NR_TRANSPORT/nr_dlsch.h>
|
||||
#include <PHY/NR_ESTIMATION/nr_ul_estimation.h>
|
||||
|
||||
#define USE_MSGQ 1
|
||||
//#define USRP_DEBUG 1
|
||||
// Fix per CC openair rf/if device update
|
||||
// extern openair0_device openair0;
|
||||
@@ -118,6 +119,7 @@ void tx_func(void *param) {
|
||||
int absslot_tx = info->timestamp_tx/info->gNB->frame_parms.get_samples_per_slot(slot_tx,&info->gNB->frame_parms);
|
||||
int absslot_rx = absslot_tx-info->gNB->RU_list[0]->sl_ahead;
|
||||
int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
|
||||
start_meas(&info->gNB->phy_proc_tx);
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC,&info->gNB->rt_L1_profiling.start_L1_TX[rt_prof_idx]);
|
||||
phy_procedures_gNB_TX(info,
|
||||
@@ -126,8 +128,43 @@ void tx_func(void *param) {
|
||||
1);
|
||||
clock_gettime(CLOCK_MONOTONIC,&info->gNB->rt_L1_profiling.return_L1_TX[rt_prof_idx]);
|
||||
|
||||
if (get_softmodem_params()->reorder_thread_disable) {
|
||||
PHY_VARS_gNB *gNB = info->gNB;
|
||||
processingData_RU_t syncMsgRU;
|
||||
syncMsgRU.frame_tx = frame_tx;
|
||||
syncMsgRU.slot_tx = slot_tx;
|
||||
syncMsgRU.ru = gNB->RU_list[0];
|
||||
syncMsgRU.timestamp_tx = info->timestamp_tx;
|
||||
LOG_D(PHY,"gNB: %d.%d : calling RU TX function\n",syncMsgRU.frame_tx,syncMsgRU.slot_tx);
|
||||
ru_tx_func((void*)&syncMsgRU);
|
||||
}
|
||||
stop_meas(&info->gNB->phy_proc_tx);
|
||||
}
|
||||
|
||||
|
||||
void *L1_rx_thread(void *arg) {
|
||||
PHY_VARS_gNB *gNB = (PHY_VARS_gNB*)arg;
|
||||
|
||||
while (oai_exit == 0) {
|
||||
notifiedFIFO_elt_t *res = pullNotifiedFIFO(&gNB->resp_L1);
|
||||
processingData_L1_t *info = (processingData_L1_t *)NotifiedFifoData(res);
|
||||
rx_func(info);
|
||||
delNotifiedFIFO_elt(res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *L1_tx_thread(void *arg) {
|
||||
PHY_VARS_gNB *gNB = (PHY_VARS_gNB*)arg;
|
||||
|
||||
while (oai_exit == 0) {
|
||||
notifiedFIFO_elt_t *res = pullNotifiedFIFO(&gNB->L1_tx_out);
|
||||
processingData_L1tx_t *info = (processingData_L1tx_t *)NotifiedFifoData(res);
|
||||
tx_func(info);
|
||||
delNotifiedFIFO_elt(res);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
void rx_func(void *param) {
|
||||
processingData_L1_t *info = (processingData_L1_t *) param;
|
||||
PHY_VARS_gNB *gNB = info->gNB;
|
||||
@@ -220,13 +257,16 @@ void rx_func(void *param) {
|
||||
// Do PRACH RU processing
|
||||
L1_nr_prach_procedures(gNB,frame_rx,slot_rx);
|
||||
|
||||
//apply the rx signal rotation here
|
||||
for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
|
||||
apply_nr_rotation_ul(&gNB->frame_parms,
|
||||
gNB->common_vars.rxdataF[aa],
|
||||
slot_rx,
|
||||
0,
|
||||
gNB->frame_parms.Ncp==EXTENDED?12:14);
|
||||
//WA: comment rotation in tx/rx
|
||||
if((gNB->num_RU == 1) && (gNB->RU_list[0]->if_south != REMOTE_IF4p5)) {
|
||||
//apply the rx signal rotation here
|
||||
for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
|
||||
apply_nr_rotation_ul(&gNB->frame_parms,
|
||||
gNB->common_vars.rxdataF[aa],
|
||||
slot_rx,
|
||||
0,
|
||||
gNB->frame_parms.Ncp==EXTENDED?12:14);
|
||||
}
|
||||
}
|
||||
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
|
||||
}
|
||||
@@ -237,22 +277,26 @@ void rx_func(void *param) {
|
||||
|
||||
// Call the scheduler
|
||||
start_meas(&gNB->ul_indication_stats);
|
||||
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||
// pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||
gNB->UL_INFO.frame = frame_rx;
|
||||
gNB->UL_INFO.slot = slot_rx;
|
||||
gNB->UL_INFO.module_id = gNB->Mod_id;
|
||||
gNB->UL_INFO.CC_id = gNB->CC_id;
|
||||
gNB->if_inst->NR_UL_indication(&gNB->UL_INFO);
|
||||
pthread_mutex_unlock(&gNB->UL_INFO_mutex);
|
||||
// pthread_mutex_unlock(&gNB->UL_INFO_mutex);
|
||||
stop_meas(&gNB->ul_indication_stats);
|
||||
|
||||
int tx_slot_type = nr_slot_select(cfg,frame_rx,slot_tx);
|
||||
int tx_slot_type = nr_slot_select(cfg,frame_tx,slot_tx);
|
||||
if ((tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) && NFAPI_MODE != NFAPI_MODE_PNF) {
|
||||
notifiedFIFO_elt_t *res;
|
||||
processingData_L1tx_t *syncMsg;
|
||||
// Its a FIFO so it maitains the order in which the MAC fills the messages
|
||||
// so no need for checking for right slot
|
||||
res = pullTpool(&gNB->L1_tx_filled, &gNB->threadPool);
|
||||
#ifndef USE_MSGQ
|
||||
if (get_softmodem_params()->reorder_thread_disable)
|
||||
res = pullTpool(&gNB->L1_tx_out, &gNB->threadPool);
|
||||
else
|
||||
res = pullTpool(&gNB->L1_tx_filled, &gNB->threadPool);
|
||||
if (res == NULL)
|
||||
return; // Tpool has been stopped
|
||||
syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res);
|
||||
@@ -260,6 +304,12 @@ void rx_func(void *param) {
|
||||
syncMsg->timestamp_tx = info->timestamp_tx;
|
||||
res->key = slot_tx;
|
||||
pushTpool(&gNB->threadPool, res);
|
||||
#else
|
||||
syncMsg = gNB->msgDataTx;
|
||||
syncMsg->gNB = gNB;
|
||||
syncMsg->timestamp_tx = info->timestamp_tx;
|
||||
tx_func(syncMsg);
|
||||
#endif
|
||||
} else if (get_softmodem_params()->continuous_tx) {
|
||||
notifiedFIFO_elt_t *res = pullTpool(&gNB->L1_tx_free, &gNB->threadPool);
|
||||
if (res == NULL)
|
||||
@@ -318,6 +368,11 @@ static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size
|
||||
const char *end = output + outputlen;
|
||||
output += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output, end - output);
|
||||
output += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output, end - output);
|
||||
output += print_meas_log(&gNB->dlsch_scrambling_stats, "DLSCH scrambling", NULL, NULL, output, end-output);
|
||||
output += print_meas_log(&gNB->dlsch_modulation_stats, "DLSCH modulation", NULL, NULL, output, end-output);
|
||||
output += print_meas_log(&gNB->dlsch_layer_mapping_stats, "DLSCH layer mapping", NULL, NULL, output,end-output);
|
||||
output += print_meas_log(&gNB->dlsch_resource_mapping_stats, "DLSCH resource mapping", NULL, NULL, output,end-output);
|
||||
output += print_meas_log(&gNB->dlsch_precoding_stats, "DLSCH precoding", NULL, NULL, output,end-output);
|
||||
output += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output, end - output);
|
||||
output += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output, end - output);
|
||||
output += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output, end - output);
|
||||
@@ -362,7 +417,11 @@ void *nrL1_stats_thread(void *param) {
|
||||
reset_meas(&gNB->rx_pusch_stats);
|
||||
reset_meas(&gNB->ulsch_decoding_stats);
|
||||
reset_meas(&gNB->schedule_response_stats);
|
||||
|
||||
reset_meas(&gNB->dlsch_scrambling_stats);
|
||||
reset_meas(&gNB->dlsch_modulation_stats);
|
||||
reset_meas(&gNB->dlsch_layer_mapping_stats);
|
||||
reset_meas(&gNB->dlsch_resource_mapping_stats);
|
||||
reset_meas(&gNB->dlsch_precoding_stats);
|
||||
while (!oai_exit) {
|
||||
sleep(1);
|
||||
dump_nr_I0_stats(fd,gNB);
|
||||
@@ -445,31 +504,51 @@ void init_gNB_Tpool(int inst) {
|
||||
|
||||
// L1 RX result FIFO
|
||||
initNotifiedFIFO(&gNB->resp_L1);
|
||||
#ifndef USE_MSGQ
|
||||
notifiedFIFO_elt_t *msg = newNotifiedFIFO_elt(sizeof(processingData_L1_t), 0, &gNB->resp_L1, rx_func);
|
||||
pushNotifiedFIFO(&gNB->resp_L1, msg); // to unblock the process in the beginning
|
||||
|
||||
#endif
|
||||
// L1 TX result FIFO
|
||||
initNotifiedFIFO(&gNB->L1_tx_free);
|
||||
initNotifiedFIFO(&gNB->L1_tx_filled);
|
||||
initNotifiedFIFO(&gNB->L1_tx_out);
|
||||
|
||||
// we create 2 threads for L1 tx processing
|
||||
for (int i=0; i < 2; i++) {
|
||||
|
||||
#ifdef USE_MSGQ
|
||||
threadCreate(&gNB->L1_rx_thread, L1_rx_thread, (void *)gNB, "L1_rx_thread",
|
||||
gNB->L1_rx_thread_core, OAI_PRIORITY_RT_MAX);
|
||||
// threadCreate(&gNB->L1_tx_thread, L1_tx_thread, (void *)gNB, "L1_tx_thread",
|
||||
// gNB->L1_tx_thread_core, OAI_PRIORITY_RT_MAX);
|
||||
#endif
|
||||
if (get_softmodem_params()->reorder_thread_disable) {
|
||||
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, tx_func);
|
||||
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
|
||||
memset(msgDataTx, 0, sizeof(processingData_L1tx_t));
|
||||
init_DLSCH_struct(gNB, msgDataTx);
|
||||
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
|
||||
pushNotifiedFIFO(&gNB->L1_tx_free, msgL1Tx); // to unblock the process in the beginning
|
||||
#ifndef USE_MSGQ
|
||||
pushNotifiedFIFO(&gNB->L1_tx_out, msgL1Tx); // to unblock the process in the beginning
|
||||
#else
|
||||
gNB->msgDataTx = msgDataTx;
|
||||
#endif
|
||||
} else {
|
||||
// we create 2 threads for L1 tx processing
|
||||
for (int i=0; i < 2; i++) {
|
||||
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t), 0, &gNB->L1_tx_out, tx_func);
|
||||
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
|
||||
memset(msgDataTx, 0, sizeof(processingData_L1tx_t));
|
||||
init_DLSCH_struct(gNB, msgDataTx);
|
||||
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
|
||||
pushNotifiedFIFO(&gNB->L1_tx_free, msgL1Tx); // to unblock the process in the beginning
|
||||
}
|
||||
|
||||
LOG_I(PHY,"Creating thread for TX reordering and dispatching to RU\n");
|
||||
threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder",
|
||||
gNB->RU_list[0] ? gNB->RU_list[0]->tpcores[1] : -1, OAI_PRIORITY_RT_MAX);
|
||||
}
|
||||
|
||||
if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS_BIT) && (NFAPI_MODE!=NFAPI_MODE_VNF))
|
||||
threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW);
|
||||
|
||||
LOG_I(PHY,"Creating thread for TX reordering and dispatching to RU\n");
|
||||
threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder",
|
||||
gNB->RU_list[0] ? gNB->RU_list[0]->tpcores[1] : -1, OAI_PRIORITY_RT_MAX);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -538,6 +617,7 @@ void init_eNB_afterRU(void) {
|
||||
|
||||
gNB = RC.gNB[inst];
|
||||
gNB->ldpc_offload_flag = ldpc_offload_flag;
|
||||
gNB->reorder_thread_disable = get_softmodem_params()->reorder_thread_disable;
|
||||
|
||||
phy_init_nr_gNB(gNB);
|
||||
|
||||
@@ -616,6 +696,7 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
|
||||
gNB->prach_energy_counter = 0;
|
||||
gNB->chest_time = get_softmodem_params()->chest_time;
|
||||
gNB->chest_freq = get_softmodem_params()->chest_freq;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -60,6 +60,8 @@ unsigned short config_frames[4] = {2,9,11,13};
|
||||
#endif
|
||||
|
||||
|
||||
#define USE_MSGQ 1
|
||||
|
||||
/* these variables have to be defined before including ENB_APP/enb_paramdef.h and GNB_APP/gnb_paramdef.h */
|
||||
static int DEFBANDS[] = {7};
|
||||
static int DEFENBS[] = {0};
|
||||
@@ -83,6 +85,8 @@ static int DEFRUTPCORES[] = {-1,-1,-1,-1};
|
||||
|
||||
extern int oai_exit;
|
||||
|
||||
uint16_t sl_ahead;
|
||||
|
||||
extern struct timespec timespec_sub(struct timespec lhs, struct timespec rhs);
|
||||
extern struct timespec timespec_add(struct timespec lhs, struct timespec rhs);
|
||||
extern void nr_phy_free_RU(RU_t *);
|
||||
@@ -1083,7 +1087,7 @@ void *ru_thread( void *param ) {
|
||||
ru_thread_status = 0;
|
||||
// set default return value
|
||||
sprintf(threadname,"ru_thread %u",ru->idx);
|
||||
LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
|
||||
LOG_I(PHY,"Starting RU %d (%s,%s) on cpu %d\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing],sched_getcpu());
|
||||
memcpy((void *)&ru->config,(void *)&RC.gNB[0]->gNB_config,sizeof(ru->config));
|
||||
|
||||
if(emulate_rf) {
|
||||
@@ -1279,9 +1283,13 @@ void *ru_thread( void *param ) {
|
||||
} // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||
|
||||
// At this point, all information for subframe has been received on FH interface
|
||||
#ifndef USE_MSGQ
|
||||
res = pullTpool(&gNB->resp_L1, &gNB->threadPool);
|
||||
if (res == NULL)
|
||||
break; // Tpool has been stopped
|
||||
#else
|
||||
res=newNotifiedFIFO_elt(sizeof(processingData_L1_t),0, &gNB->resp_L1,NULL);
|
||||
#endif
|
||||
syncMsg = (processingData_L1_t *)NotifiedFifoData(res);
|
||||
syncMsg->gNB = gNB;
|
||||
syncMsg->frame_rx = proc->frame_rx;
|
||||
@@ -1290,7 +1298,11 @@ void *ru_thread( void *param ) {
|
||||
syncMsg->slot_tx = proc->tti_tx;
|
||||
syncMsg->timestamp_tx = proc->timestamp_tx;
|
||||
res->key = proc->tti_rx;
|
||||
#ifndef USE_MSGQ
|
||||
pushTpool(&gNB->threadPool, res);
|
||||
#else
|
||||
pushNotifiedFIFO(&gNB->resp_L1, res);
|
||||
#endif
|
||||
}
|
||||
|
||||
printf( "Exiting ru_thread \n");
|
||||
@@ -1305,7 +1317,8 @@ int start_streaming(RU_t *ru) {
|
||||
}
|
||||
|
||||
int nr_start_if(struct RU_t_s *ru, struct PHY_VARS_gNB_s *gNB) {
|
||||
for (int i=0;i<ru->nb_rx;i++) ru->openair0_cfg.rxbase[i] = ru->common.rxdata[i];
|
||||
if (ru->if_south <= REMOTE_IF5)
|
||||
for (int i=0;i<ru->nb_rx;i++) ru->openair0_cfg.rxbase[i] = ru->common.rxdata[i];
|
||||
ru->openair0_cfg.rxsize = ru->nr_frame_parms->samples_per_subframe*10;
|
||||
reset_meas(&ru->ifdevice.tx_fhaul);
|
||||
return(ru->ifdevice.trx_start_func(&ru->ifdevice));
|
||||
@@ -1342,7 +1355,7 @@ void init_RU_proc(RU_t *ru) {
|
||||
|
||||
pthread_mutex_init( &proc->mutex_emulateRF,NULL);
|
||||
pthread_cond_init( &proc->cond_emulateRF, NULL);
|
||||
threadCreate( &proc->pthread_FH, ru_thread, (void *)ru, "ru_thread", ru->tpcores[0], OAI_PRIORITY_RT_MAX );
|
||||
threadCreate( &proc->pthread_FH, ru_thread, (void *)ru, "ru_thread", ru->ru_thread_core, OAI_PRIORITY_RT_MAX );
|
||||
|
||||
if(emulate_rf)
|
||||
threadCreate( &proc->pthread_emulateRF, emulatedRF_thread, (void *)proc, "emulateRF", -1, OAI_PRIORITY_RT );
|
||||
@@ -1668,7 +1681,7 @@ void set_function_spec_param(RU_t *ru) {
|
||||
case REMOTE_IF4p5:
|
||||
ru->do_prach = 0;
|
||||
ru->feprx = NULL; // DFTs
|
||||
ru->feptx_prec = NULL; // Precoding operation
|
||||
ru->feptx_prec = nr_feptx_prec; // Precoding operation
|
||||
ru->feptx_ofdm = NULL; // no OFDM mod
|
||||
ru->fh_south_in = fh_if4p5_south_in; // synchronous IF4p5 reception
|
||||
ru->fh_south_out = fh_if4p5_south_out; // synchronous IF4p5 transmission
|
||||
@@ -1780,23 +1793,25 @@ void init_NR_RU(char *rf_config_file) {
|
||||
set_function_spec_param(ru);
|
||||
LOG_I(PHY,"Starting ru_thread %d\n",ru_id);
|
||||
init_RU_proc(ru);
|
||||
int threadCnt = ru->num_tpcores;
|
||||
if (threadCnt < 2) LOG_E(PHY,"Number of threads for gNB should be more than 1. Allocated only %d\n",threadCnt);
|
||||
else LOG_I(PHY,"RU Thread pool size %d\n",threadCnt);
|
||||
char pool[80];
|
||||
int s_offset = sprintf(pool,"%d",ru->tpcores[0]);
|
||||
for (int icpu=1; icpu<threadCnt; icpu++) {
|
||||
s_offset+=sprintf(pool+s_offset,",%d",ru->tpcores[icpu]);
|
||||
if (ru->if_south != REMOTE_IF4p5) {
|
||||
int threadCnt = ru->num_tpcores;
|
||||
if (threadCnt < 2) LOG_E(PHY,"Number of threads for gNB should be more than 1. Allocated only %d\n",threadCnt);
|
||||
else LOG_I(PHY,"RU Thread pool size %d\n",threadCnt);
|
||||
char pool[80];
|
||||
int s_offset = sprintf(pool,"%d",ru->tpcores[1]);
|
||||
for (int icpu=2; icpu<threadCnt; icpu++) {
|
||||
s_offset+=sprintf(pool+s_offset,",%d",ru->tpcores[icpu]);
|
||||
}
|
||||
LOG_I(PHY,"RU thread-pool core string %s\n",pool);
|
||||
ru->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
|
||||
initTpool(pool, ru->threadPool, cpumeas(CPUMEAS_GETSTATE));
|
||||
// FEP RX result FIFO
|
||||
ru->respfeprx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
initNotifiedFIFO(ru->respfeprx);
|
||||
// FEP TX result FIFO
|
||||
ru->respfeptx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
initNotifiedFIFO(ru->respfeptx);
|
||||
}
|
||||
LOG_I(PHY,"RU thread-pool core string %s\n",pool);
|
||||
ru->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
|
||||
initTpool(pool, ru->threadPool, cpumeas(CPUMEAS_GETSTATE));
|
||||
// FEP RX result FIFO
|
||||
ru->respfeprx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
initNotifiedFIFO(ru->respfeprx);
|
||||
// FEP TX result FIFO
|
||||
ru->respfeptx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
initNotifiedFIFO(ru->respfeptx);
|
||||
} // for ru_id
|
||||
|
||||
// sleep(1);
|
||||
@@ -1975,6 +1990,7 @@ static void NRRCconfig_RU(void) {
|
||||
RC.ru[j]->openair0_cfg.txfh_cores[0] = *(RUParamList.paramarray[j][RU_TXFH_CORE_ID].iptr);
|
||||
RC.ru[j]->num_tpcores = *(RUParamList.paramarray[j][RU_NUM_TP_CORES].iptr);
|
||||
RC.ru[j]->half_slot_parallelization = *(RUParamList.paramarray[j][RU_HALF_SLOT_PARALLELIZATION].iptr);
|
||||
RC.ru[j]->ru_thread_core = *(RUParamList.paramarray[j][RU_RU_THREAD_CORE].iptr);
|
||||
printf("[RU %d] Setting half-slot parallelization to %d\n",j,RC.ru[j]->half_slot_parallelization);
|
||||
AssertFatal(RC.ru[j]->num_tpcores <= RUParamList.paramarray[j][RU_TP_CORES].numelt, "Number of TP cores should be <=16\n");
|
||||
for (i=0; i<RC.ru[j]->num_tpcores; i++) RC.ru[j]->tpcores[i] = RUParamList.paramarray[j][RU_TP_CORES].iptr[i];
|
||||
|
||||
@@ -46,6 +46,7 @@ static softmodem_params_t softmodem_params;
|
||||
char *parallel_config=NULL;
|
||||
char *worker_config=NULL;
|
||||
int usrp_tx_thread = 0;
|
||||
char *nfapi_str=NULL;
|
||||
int ldpc_offload_flag=0;
|
||||
uint8_t nfapi_mode=0;
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ extern "C"
|
||||
default no pool (runs in calling thread),\n\
|
||||
list of cores, comma separated (negative value is no core affinity)\n\
|
||||
example: -1,3 launches two working threads one floating, the second set on core 3"
|
||||
#define CONFIG_HLP_REORDER "Disable reorder thread\n"
|
||||
#define CONFIG_HLP_ULMAXE "set the eNodeB max ULSCH erros\n"
|
||||
#define CONFIG_HLP_CALUER "set UE RX calibration\n"
|
||||
#define CONFIG_HLP_CALUERM ""
|
||||
@@ -109,6 +110,7 @@ extern "C"
|
||||
#define RF_CONFIG_FILE softmodem_params.rf_config_file
|
||||
#define SPLIT73 softmodem_params.split73
|
||||
#define TP_CONFIG softmodem_params.threadPoolConfig
|
||||
#define CONTINUOUS_TX softmodem_params.continuous_tx
|
||||
#define PHY_TEST softmodem_params.phy_test
|
||||
#define DO_RA softmodem_params.do_ra
|
||||
#define SA softmodem_params.sa
|
||||
@@ -131,14 +133,17 @@ extern "C"
|
||||
#define NON_STOP softmodem_params.non_stop
|
||||
#define EMULATE_L1 softmodem_params.emulate_l1
|
||||
#define CONTINUOUS_TX softmodem_params.continuous_tx
|
||||
|
||||
#define REORDER_THREAD_DISABLE softmodem_params.reorder_thread_disable
|
||||
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
|
||||
|
||||
extern int usrp_tx_thread;
|
||||
extern char *nfapi_str;
|
||||
|
||||
#define CMDLINE_PARAMS_DESC { \
|
||||
{"rf-config-file", CONFIG_HLP_RFCFGF, 0, strptr:&RF_CONFIG_FILE, defstrval:NULL, TYPE_STRING, 0},\
|
||||
{"split73", CONFIG_HLP_SPLIT73, 0, strptr:&SPLIT73, defstrval:NULL, TYPE_STRING, 0}, \
|
||||
{"thread-pool", CONFIG_HLP_TPOOL, 0, strptr:&TP_CONFIG, defstrval:"-1,-1,-1,-1,-1,-1,-1,-1", TYPE_STRING, 0}, \
|
||||
{"reorder-thread-disable",CONFIG_HLP_REORDER, PARAMFLAG_BOOL, iptr:&REORDER_THREAD_DISABLE, defintval:0, TYPE_INT, 0}, \
|
||||
{"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&PHY_TEST, defintval:0, TYPE_INT, 0}, \
|
||||
{"do-ra", CONFIG_HLP_DORA, PARAMFLAG_BOOL, iptr:&DO_RA, defintval:0, TYPE_INT, 0}, \
|
||||
{"sa", CONFIG_HLP_SA, PARAMFLAG_BOOL, iptr:&SA, defintval:0, TYPE_INT, 0}, \
|
||||
@@ -166,8 +171,8 @@ extern int usrp_tx_thread;
|
||||
{"chest-time", CONFIG_HLP_CHESTTIME, 0, iptr:&CHEST_TIME, defintval:0, TYPE_INT, 0}, \
|
||||
{"nsa", CONFIG_HLP_NSA, PARAMFLAG_BOOL, iptr:&NSA, defintval:0, TYPE_INT, 0}, \
|
||||
{"node-number", NULL, 0, u16ptr:&NODE_NUMBER, defuintval:0, TYPE_UINT16, 0}, \
|
||||
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
|
||||
{"nfapi", CONFIG_HLP_NFAPI, 0, strptr:NULL, defstrval:"MONOLITHIC", TYPE_STRING, 0}, \
|
||||
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defintval:0, TYPE_INT, 0}, \
|
||||
{"nfapi", CONFIG_HLP_NFAPI, 0, strptr:&nfapi_str, defstrval:"MONOLITHIC", TYPE_STRING, 0}, \
|
||||
{"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \
|
||||
{"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, iptr:&EMULATE_L1, defintval:0, TYPE_INT, 0}, \
|
||||
{"continuous-tx", CONFIG_HLP_CONTINUOUS_TX,PARAMFLAG_BOOL, iptr:&CONTINUOUS_TX, defintval:0, TYPE_INT, 0}, \
|
||||
@@ -208,6 +213,7 @@ extern int usrp_tx_thread;
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s3a = { config_checkstr_assign_integer, \
|
||||
{"MONOLITHIC", "PNF", "VNF","UE_STUB_PNF","UE_STUB_OFFNET","STANDALONE_PNF"}, \
|
||||
{NFAPI_MONOLITHIC, NFAPI_MODE_PNF, NFAPI_MODE_VNF,NFAPI_UE_STUB_PNF,NFAPI_UE_STUB_OFFNET,NFAPI_MODE_STANDALONE_PNF}, \
|
||||
@@ -289,6 +295,7 @@ typedef struct {
|
||||
char *rf_config_file;
|
||||
char *split73;
|
||||
char *threadPoolConfig;
|
||||
int reorder_thread_disable;
|
||||
int phy_test;
|
||||
int do_ra;
|
||||
int sa;
|
||||
|
||||
@@ -293,7 +293,7 @@ typedef enum {
|
||||
|
||||
typedef enum {
|
||||
NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED=0,
|
||||
NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED=1
|
||||
NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED=1
|
||||
} nfapi_nr_cce_reg_mapping_type_e;
|
||||
|
||||
typedef enum {
|
||||
|
||||
@@ -510,7 +510,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
|
||||
|
||||
gNB->bad_pucch = 0;
|
||||
|
||||
if (gNB->TX_AMP == 0) gNB->TX_AMP = AMP;
|
||||
// ceil(((NB_RB<<1)*3)/32) // 3 RE *2(QPSK)
|
||||
int pdcch_dmrs_init_length = (((fp->N_RB_DL<<1)*3)>>5)+1;
|
||||
|
||||
|
||||
@@ -146,8 +146,9 @@ void nr_modulation(uint32_t *in,
|
||||
case 2:
|
||||
nr_mod_table128 = (__m128i*) nr_qpsk_byte_mod_table;
|
||||
out128 = (__m128i*) out;
|
||||
for (i=0; i<length/8; i++)
|
||||
for (i=0; i<length/8; i++)
|
||||
out128[i] = nr_mod_table128[in_bytes[i]];
|
||||
|
||||
// the bits that are left out
|
||||
i = i*8/2;
|
||||
nr_mod_table32 = (int32_t*) nr_qpsk_mod_table;
|
||||
|
||||
@@ -47,7 +47,7 @@ void nr_generate_modulation_table() {
|
||||
for (i=0; i<4; i++) {
|
||||
nr_qpsk_mod_table[i*2] = (short)(1-2*(i&1))*val*sqrt2*sqrt2;
|
||||
nr_qpsk_mod_table[i*2+1] = (short)(1-2*((i>>1)&1))*val*sqrt2*sqrt2;
|
||||
//printf("%d j%d\n",nr_qpsk_mod_table[i*2],nr_qpsk_mod_table[i*2+1]);
|
||||
//printf("QPSK : %d j%d\n",nr_qpsk_mod_table[i*2],nr_qpsk_mod_table[i*2+1]);
|
||||
}
|
||||
|
||||
#if defined(__SSE2__)
|
||||
@@ -57,7 +57,6 @@ void nr_generate_modulation_table() {
|
||||
for (j=0; j<4; j++) {
|
||||
table[i*8+(j*2)] = (short)(1-2*((i>>(j*2))&1))*val*sqrt2*sqrt2;
|
||||
table[i*8+(j*2)+1] = (short)(1-2*((i>>(j*2+1))&1))*val*sqrt2*sqrt2;
|
||||
//printf("%d j%d\n",nr_qpsk_byte_mod_table[i*8+(j*2)],nr_qpsk_byte_mod_table[i*8+(j*2)+1]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -68,7 +67,7 @@ void nr_generate_modulation_table() {
|
||||
for (j=0; j<2; j++) {
|
||||
table[i*4+(j*2)] = (short)((1-2*((i>>(j*4))&1))*(2-(1-2*((i>>(j*4+2))&1))))*val*sqrt10*sqrt2;
|
||||
table[i*4+(j*2)+1] = (short)((1-2*((i>>(j*4+1))&1))*(2-(1-2*((i>>(j*4+3))&1))))*val*sqrt10*sqrt2;
|
||||
//printf("%d j%d\n",nr_16qam_byte_mod_table[i*4+(j*2)],nr_16qam_byte_mod_table[i*4+(j*2)+1]);
|
||||
//printf("%d j%d\n",nr_16qam_byte_mod_table[i*4+(j*2)],nr_16qam_byte_mod_table[i*4+(j*2)+1]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +75,7 @@ void nr_generate_modulation_table() {
|
||||
for (i=0; i<16; i++) {
|
||||
table[i*2] = (short)((1-2*(i&1))*(2-(1-2*((i>>2)&1))))*val*sqrt10*sqrt2;
|
||||
table[i*2+1] = (short)((1-2*((i>>1)&1))*(2-(1-2*((i>>3)&1))))*val*sqrt10*sqrt2;
|
||||
//printf("%d j%d\n",table[i*2],table[i*2+1]);
|
||||
// printf("%d j%d\n",table[i*2],table[i*2+1]);
|
||||
}
|
||||
|
||||
//64QAM
|
||||
|
||||
@@ -60,7 +60,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
|
||||
PHY_VARS_gNB *gNB = msgTx->gNB;
|
||||
NR_gNB_DLSCH_t *dlsch;
|
||||
int32_t** txdataF = gNB->common_vars.txdataF;
|
||||
int16_t amp = AMP;
|
||||
int16_t amp = gNB->TX_AMP;
|
||||
int xOverhead = 0;
|
||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||
time_stats_t *dlsch_encoding_stats=&gNB->dlsch_encoding_stats;
|
||||
@@ -466,7 +466,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
|
||||
for (int rb=0; rb<rel15->rbSize; rb++) {
|
||||
//get pmi info
|
||||
uint8_t pmi;
|
||||
if (rel15->precodingAndBeamforming.prg_size > 0)
|
||||
if (0/*rel15->precodingAndBeamforming.prg_size > 0*/)
|
||||
pmi = rel15->precodingAndBeamforming.prgs_list[(int)rb/rel15->precodingAndBeamforming.prg_size].pm_idx;
|
||||
else
|
||||
pmi = 0;//no precoding
|
||||
|
||||
@@ -78,6 +78,7 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL)
|
||||
}
|
||||
free_and_zero(ulsch->harq_processes[i]->c);
|
||||
free_and_zero(ulsch->harq_processes[i]->d);
|
||||
free_and_zero(ulsch->harq_processes[i]->crc_ok);
|
||||
free_and_zero(ulsch->harq_processes[i]);
|
||||
ulsch->harq_processes[i] = NULL;
|
||||
}
|
||||
@@ -102,11 +103,13 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL)
|
||||
ulsch = (NR_gNB_ULSCH_t *)malloc16_clear(sizeof(NR_gNB_ULSCH_t));
|
||||
|
||||
ulsch->max_ldpc_iterations = max_ldpc_iterations;
|
||||
ulsch->a_segments = a_segments;
|
||||
|
||||
for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
|
||||
ulsch->harq_processes[i] = (NR_UL_gNB_HARQ_t *)malloc16_clear(sizeof(NR_UL_gNB_HARQ_t));
|
||||
ulsch->harq_processes[i]->b = (uint8_t*)malloc16_clear(ulsch_bytes);
|
||||
ulsch->harq_processes[i]->c = (uint8_t**)malloc16_clear(a_segments*sizeof(uint8_t *));
|
||||
ulsch->harq_processes[i]->crc_ok = malloc16_clear(a_segments*sizeof(bool));
|
||||
ulsch->harq_processes[i]->d = (int16_t**)malloc16_clear(a_segments*sizeof(int16_t *));
|
||||
for (r=0; r<a_segments; r++) {
|
||||
ulsch->harq_processes[i]->c[r] = (uint8_t*)malloc16_clear(8448*sizeof(uint8_t));
|
||||
@@ -165,6 +168,11 @@ void nr_processULSegment(void* arg) {
|
||||
ldpcDecode_t *rdata = (ldpcDecode_t*) arg;
|
||||
PHY_VARS_gNB *phy_vars_gNB = rdata->gNB;
|
||||
NR_UL_gNB_HARQ_t *ulsch_harq = rdata->ulsch_harq;
|
||||
if (ulsch_harq->crc_ok[rdata->segment_r]) {
|
||||
LOG_D(PHY, "segment %d already decoded in a previous transmission, do nothing\n", rdata->segment_r);
|
||||
rdata->decodeIterations = 0;
|
||||
return;
|
||||
}
|
||||
t_nrLDPC_dec_params *p_decoderParms = &rdata->decoderParms;
|
||||
int length_dec;
|
||||
int no_iteration_ldpc;
|
||||
@@ -252,6 +260,15 @@ void nr_processULSegment(void* arg) {
|
||||
stop_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats);
|
||||
}
|
||||
|
||||
/* don't run LDPC decoding if some other thread had a failure */
|
||||
/* nr_rate_matching_ldpc_rx() must be called to feed d[r] in all cases
|
||||
* so this test has to come after the call to nr_rate_matching_ldpc_rx()
|
||||
*/
|
||||
if (__atomic_load_n(&ulsch_harq->skip_ldpc_decoding, __ATOMIC_SEQ_CST)) {
|
||||
LOG_D(PHY, "skipping nrLDPC_decoder() for r %d because decoding of some other segment failed\n", r);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(ulsch_harq->c[r],0,Kr_bytes);
|
||||
|
||||
if (ulsch_harq->C == 1) {
|
||||
@@ -302,11 +319,15 @@ void nr_processULSegment(void* arg) {
|
||||
#endif
|
||||
rdata->decodeIterations = no_iteration_ldpc;
|
||||
if (rdata->decodeIterations > p_decoderParms->numMaxIter) rdata->decodeIterations--;
|
||||
/* remember that the data is ok to not decode it again in case of retransmission */
|
||||
ulsch_harq->crc_ok[r] = true;
|
||||
} else {
|
||||
#ifdef PRINT_CRC_CHECK
|
||||
LOG_I(PHY,"CRC NOK\n");
|
||||
#endif
|
||||
rdata->decodeIterations = max_ldpc_iterations + 1;
|
||||
/* set skip_ldpc_decoding to 1 to indicate to remaining threads that they shall not run LDPC decoding */
|
||||
__atomic_store_n(&ulsch_harq->skip_ldpc_decoding, 1, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
for (int m=0; m < Kr>>3; m ++) {
|
||||
@@ -623,6 +644,9 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
||||
else {
|
||||
dtx_det = 0;
|
||||
|
||||
/* tell to the threads that LDPC decoding has to be done */
|
||||
__atomic_store_n(&harq_process->skip_ldpc_decoding, 0, __ATOMIC_SEQ_CST);
|
||||
|
||||
for (int r = 0; r < harq_process->C; r++) {
|
||||
int E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
|
||||
union ldpcReqUnion id = {.s = {ulsch->rnti, frame, nr_tti_rx, 0, 0}};
|
||||
@@ -647,6 +671,9 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
||||
rdata->ulsch = ulsch;
|
||||
rdata->ulsch_id = ULSCH_id;
|
||||
rdata->tbslbrm = pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes;
|
||||
/* in case of a new rx, tell nr_processULSegment() to process the data, so set crc_ok[r] to false */
|
||||
if (harq_process->new_rx)
|
||||
harq_process->crc_ok[r] = false;
|
||||
pushTpool(&phy_vars_gNB->threadPool, req);
|
||||
phy_vars_gNB->nbDecode++;
|
||||
LOG_D(PHY, "Added a block to decode, in pipe: %d\n", phy_vars_gNB->nbDecode);
|
||||
|
||||
@@ -655,6 +655,8 @@ typedef struct RU_t_s {
|
||||
int txfh_core_id;
|
||||
/// number of RU interfaces
|
||||
int num_fd;
|
||||
/// Core id of ru_thread
|
||||
int ru_thread_core;
|
||||
/// list of cores for RU ThreadPool
|
||||
int tpcores[16];
|
||||
/// number of cores for RU ThreadPool
|
||||
@@ -692,6 +694,7 @@ typedef enum {
|
||||
OAI_IF4p5_only =1,
|
||||
OAI_IF5_and_IF4p5 =2,
|
||||
MBP_IF5 =3,
|
||||
ORAN_only =4,
|
||||
MAX_FH_FMTs =4
|
||||
} FH_fmt_options_t;
|
||||
|
||||
|
||||
@@ -227,6 +227,8 @@ typedef struct {
|
||||
uint32_t B;
|
||||
/// Pointers to code blocks after code block segmentation and CRC attachment (38.212 V15.4.0 section 5.2.2)
|
||||
uint8_t **c;
|
||||
/// array to indicate that a segment has a valid CRC from a previous transmission to not run LDPC decoder again in a retransmission
|
||||
bool *crc_ok;
|
||||
/// Number of bits in each code block (38.212 V15.4.0 section 5.2.2)
|
||||
uint32_t K;
|
||||
/// Number of "Filler" bits added in the code block segmentation (38.212 V15.4.0 section 5.2.2)
|
||||
@@ -244,6 +246,11 @@ typedef struct {
|
||||
/// Last index of LLR buffer that contains information.
|
||||
/// Used for computing LDPC decoder R
|
||||
int llrLen;
|
||||
/// used to indicate to remaining threads that LDPC decoding has to be skipped
|
||||
/// this is set to true when a crc fails to avoid unnecessary computation
|
||||
/// all accesses must be done with __atomic operations
|
||||
/// (we can't use bool, it does not work with __atomic operations)
|
||||
uint8_t skip_ldpc_decoding;
|
||||
//////////////////////////////////////////////////////////////
|
||||
} NR_UL_gNB_HARQ_t;
|
||||
|
||||
@@ -261,6 +268,8 @@ typedef struct {
|
||||
uint8_t max_ldpc_iterations;
|
||||
/// number of iterations used in last LDPC decoding
|
||||
uint8_t last_iteration_cnt;
|
||||
/// max number of segments for LDPC decoding
|
||||
int a_segments;
|
||||
} NR_gNB_ULSCH_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -640,6 +649,8 @@ typedef struct PHY_VARS_gNB_s {
|
||||
/// CSI variables
|
||||
nr_csi_info_t *nr_csi_info;
|
||||
|
||||
// reference amplitude for TX
|
||||
int16_t TX_AMP;
|
||||
// PUCCH0 Look-up table for cyclic-shifts
|
||||
NR_gNB_PUCCH0_LUT_t pucch0_lut;
|
||||
|
||||
@@ -679,6 +690,8 @@ typedef struct PHY_VARS_gNB_s {
|
||||
|
||||
int ldpc_offload_flag;
|
||||
|
||||
int reorder_thread_disable;
|
||||
|
||||
int max_ldpc_iterations;
|
||||
/// indicate the channel estimation technique in time domain
|
||||
int chest_time;
|
||||
@@ -761,6 +774,11 @@ typedef struct PHY_VARS_gNB_s {
|
||||
notifiedFIFO_t L1_tx_out;
|
||||
notifiedFIFO_t resp_RU_tx;
|
||||
tpool_t threadPool;
|
||||
pthread_t L1_rx_thread;
|
||||
int L1_rx_thread_core;
|
||||
pthread_t L1_tx_thread;
|
||||
int L1_tx_thread_core;
|
||||
struct processingData_L1tx *msgDataTx;
|
||||
int nbDecode;
|
||||
void *scopeData;
|
||||
/// structure for analyzing high-level RT measurements
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "PHY/NR_TRANSPORT/nr_dci.h"
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
|
||||
#define USE_MSGQ 1
|
||||
|
||||
extern int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req);
|
||||
extern int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req);
|
||||
extern int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req);
|
||||
@@ -163,13 +165,20 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
||||
|
||||
if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||
notifiedFIFO_elt_t *res;
|
||||
res = pullTpool(&gNB->L1_tx_free, &gNB->threadPool);
|
||||
#ifndef USE_MSGQ
|
||||
if (gNB->reorder_thread_disable)
|
||||
res = pullTpool(&gNB->L1_tx_out, &gNB->threadPool);
|
||||
else
|
||||
res = pullTpool(&gNB->L1_tx_free, &gNB->threadPool);
|
||||
if (res == NULL)
|
||||
return; // Tpool has been stopped, nothing to process
|
||||
processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
|
||||
const time_stats_t ts = exec_time_stats_NotifiedFIFO(res);
|
||||
#else
|
||||
processingData_L1tx_t *msgTx = gNB->msgDataTx; //newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0, &gNB->L1_tx_out,NULL);
|
||||
#endif
|
||||
/* const time_stats_t ts = exec_time_stats_NotifiedFIFO(res);
|
||||
merge_meas(&gNB->phy_proc_tx, &ts);
|
||||
|
||||
*/
|
||||
msgTx->num_pdsch_slot=0;
|
||||
msgTx->num_dl_pdcch=0;
|
||||
msgTx->num_ul_pdcch=number_ul_dci_pdu;
|
||||
@@ -212,9 +221,15 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
||||
for (int i=0; i<number_ul_dci_pdu; i++)
|
||||
msgTx->ul_pdcch_pdu[i] = UL_dci_req->ul_dci_pdu_list[i];
|
||||
|
||||
pushNotifiedFIFO(&gNB->L1_tx_filled,res);
|
||||
#ifndef USE_MSGQ
|
||||
if (gNB->reorder_thread_disable)
|
||||
pushNotifiedFIFO(&gNB->L1_tx_out,res);
|
||||
else
|
||||
pushNotifiedFIFO(&gNB->L1_tx_filled,res);
|
||||
#else
|
||||
//pushNotifiedFIFO(&gNB->L1_tx_out, res);
|
||||
#endif
|
||||
}
|
||||
|
||||
for (int i = 0; i < number_ul_tti_pdu; i++) {
|
||||
switch (UL_tti_req->pdus_list[i].pdu_type) {
|
||||
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
|
||||
|
||||
@@ -183,7 +183,7 @@ void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot) {
|
||||
gNB->prach_pdu_indication_list[pdu_index].num_preamble = 1;
|
||||
gNB->prach_pdu_indication_list[pdu_index].preamble_list = gNB->preamble_list;
|
||||
gNB->prach_pdu_indication_list[pdu_index].preamble_list[0].preamble_index = max_preamble[0];
|
||||
gNB->prach_pdu_indication_list[pdu_index].preamble_list[0].timing_advance = max_preamble_delay[0];
|
||||
gNB->prach_pdu_indication_list[pdu_index].preamble_list[0].timing_advance = 0; /*max_preamble_delay[0];*/
|
||||
gNB->prach_pdu_indication_list[pdu_index].preamble_list[0].preamble_pwr = 0xffffffff;
|
||||
pdu_index++;
|
||||
}
|
||||
|
||||
@@ -189,27 +189,19 @@ void nr_feptx_prec(RU_t *ru,int frame_tx,int tti_tx) {
|
||||
|
||||
if (nr_slot_select(cfg,frame_tx,slot_tx) == NR_UPLINK_SLOT) return;
|
||||
|
||||
for(i=0; i<ru->nb_log_antennas; ++i) {
|
||||
memcpy((void*)ru->common.txdataF[i],
|
||||
(void*)&gNB->common_vars.txdataF[i][txdataF_offset],
|
||||
fp->samples_per_slot_wCP*sizeof(int32_t));
|
||||
if (ru->do_precoding == 1)
|
||||
if (ru->do_precoding == 0 || (ru->nb_tx == 1 && ru->nb_log_antennas == 1)) {
|
||||
for (i=0;i<ru->nb_log_antennas; ++i)
|
||||
ru->common.txdataF_BF[i] = &gNB->common_vars.txdataF[i][txdataF_offset];
|
||||
}
|
||||
else {
|
||||
for(i=0; i<ru->nb_log_antennas; ++i) {
|
||||
memcpy((void*)ru->common.txdataF[i],
|
||||
(void*)&gNB->common_vars.txdataF[i][txdataF_offset],
|
||||
fp->samples_per_slot_wCP*sizeof(int32_t));
|
||||
memcpy((void*)&ru->common.beam_id[i][slot_tx*fp->symbols_per_slot],
|
||||
(void*)&gNB->common_vars.beam_id[i][slot_tx*fp->symbols_per_slot],
|
||||
fp->symbols_per_slot*sizeof(uint8_t));
|
||||
}
|
||||
|
||||
if (ru->nb_tx == 1 && ru->nb_log_antennas == 1) {
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC , 1);
|
||||
|
||||
memcpy((void*)ru->common.txdataF_BF[0],
|
||||
(void*)ru->common.txdataF[0],
|
||||
fp->samples_per_slot_wCP*sizeof(int32_t));
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC , 0);
|
||||
}// if (ru->nb_tx == 1)
|
||||
else {
|
||||
}
|
||||
bw = ru->beam_weights[0];
|
||||
for (l=0;l<fp->symbols_per_slot;l++) {
|
||||
for (aa=0;aa<ru->nb_tx;aa++) {
|
||||
@@ -224,7 +216,7 @@ void nr_feptx_prec(RU_t *ru,int frame_tx,int tti_tx) {
|
||||
0);
|
||||
}// for (aa=0;aa<ru->nb_tx;aa++)
|
||||
}// for (l=0;l<fp->symbols_per_slot;l++)
|
||||
}// if (ru->nb_tx == 1)
|
||||
}// ru->do_precoding
|
||||
}// if (ru->num_gNB == 1)
|
||||
stop_meas(&ru->precoding_stats);
|
||||
}
|
||||
|
||||
@@ -81,13 +81,13 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
|
||||
LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset);
|
||||
|
||||
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
||||
nr_generate_pss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_sss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_pss(&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_sss(&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp);
|
||||
|
||||
if (fp->Lmax == 4)
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp);
|
||||
else
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp);
|
||||
|
||||
if (T_ACTIVE(T_GNB_PHY_MIB)) {
|
||||
unsigned char bch[3];
|
||||
@@ -107,7 +107,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
|
||||
nr_generate_pbch(&ssb_pdu,
|
||||
gNB->nr_pbch_interleaver,
|
||||
&txdataF[0][txdataF_offset],
|
||||
AMP,
|
||||
gNB->TX_AMP,
|
||||
ssb_start_symbol,
|
||||
n_hf, frame, cfg, fp);
|
||||
}
|
||||
@@ -172,7 +172,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
|
||||
|
||||
nr_generate_dci_top(msgTx, slot,
|
||||
&gNB->common_vars.txdataF[0][txdataF_offset],
|
||||
AMP, fp);
|
||||
gNB->TX_AMP, fp);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,0);
|
||||
}
|
||||
@@ -189,32 +189,36 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
|
||||
if (csirs->active == 1) {
|
||||
LOG_D(PHY, "CSI-RS generation started in frame %d.%d\n",frame,slot);
|
||||
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params = &csirs->csirs_pdu.csi_rs_pdu_rel15;
|
||||
nr_generate_csi_rs(&gNB->frame_parms, gNB->common_vars.txdataF, AMP, gNB->nr_csi_info, csi_params, slot, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
nr_generate_csi_rs(&gNB->frame_parms, gNB->common_vars.txdataF, gNB->TX_AMP, gNB->nr_csi_info, csi_params, slot, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
csirs->active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// if ((frame&127) == 0) dump_pdsch_stats(gNB);
|
||||
|
||||
//apply the OFDM symbol rotation here
|
||||
for (aa=0; aa<cfg->carrier_config.num_tx_ant.value; aa++) {
|
||||
apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14);
|
||||
//apply the OFDM symbol rotation here
|
||||
// WA: Comment rotation in tx/rx
|
||||
if((gNB->num_RU == 1) && (gNB->RU_list[0]->if_south != REMOTE_IF4p5)) {
|
||||
for (aa=0; aa<cfg->carrier_config.num_tx_ant.value; aa++) {
|
||||
apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14);
|
||||
|
||||
T(T_GNB_PHY_DL_OUTPUT_SIGNAL, T_INT(0),
|
||||
T_INT(frame), T_INT(slot),
|
||||
T_INT(aa), T_BUFFER(&gNB->common_vars.txdataF[aa][txdataF_offset], fp->samples_per_slot_wCP*sizeof(int32_t)));
|
||||
T(T_GNB_PHY_DL_OUTPUT_SIGNAL, T_INT(0),
|
||||
T_INT(frame), T_INT(slot),
|
||||
T_INT(aa), T_BUFFER(&gNB->common_vars.txdataF[aa][txdataF_offset], fp->samples_per_slot_wCP*sizeof(int32_t)));
|
||||
}
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
|
||||
}
|
||||
|
||||
void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
|
||||
void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req, int *decodeSuccessCount) {
|
||||
ldpcDecode_t *rdata = (ldpcDecode_t*) NotifiedFifoData(req);
|
||||
NR_UL_gNB_HARQ_t *ulsch_harq = rdata->ulsch_harq;
|
||||
NR_gNB_ULSCH_t *ulsch = rdata->ulsch;
|
||||
int r = rdata->segment_r;
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[rdata->ulsch_id]->harq_processes[rdata->harq_pid]->ulsch_pdu;
|
||||
bool decodeSuccess = (rdata->decodeIterations <= rdata->decoderParms.numMaxIter);
|
||||
if (decodeSuccess)
|
||||
(*decodeSuccessCount)++;
|
||||
ulsch_harq->processedSegments++;
|
||||
LOG_D(PHY, "processing result of segment: %d, processed %d/%d\n",
|
||||
rdata->segment_r, ulsch_harq->processedSegments, rdata->nbSegments);
|
||||
@@ -224,24 +228,25 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
|
||||
memcpy(ulsch_harq->b+rdata->offset,
|
||||
ulsch_harq->c[r],
|
||||
rdata->Kr_bytes - (ulsch_harq->F>>3) -((ulsch_harq->C>1)?3:0));
|
||||
|
||||
} else {
|
||||
if ( rdata->nbSegments != ulsch_harq->processedSegments ) {
|
||||
int nb = abortTpoolJob(&gNB->threadPool, req->key);
|
||||
nb += abortNotifiedFIFOJob(&gNB->respDecode, req->key);
|
||||
gNB->nbDecode-=nb;
|
||||
LOG_D(PHY,"uplink segment error %d/%d, aborted %d segments\n",rdata->segment_r,rdata->nbSegments, nb);
|
||||
LOG_D(PHY, "ULSCH %d in error\n",rdata->ulsch_id);
|
||||
AssertFatal(ulsch_harq->processedSegments+nb == rdata->nbSegments,"processed: %d, aborted: %d, total %d\n",
|
||||
ulsch_harq->processedSegments, nb, rdata->nbSegments);
|
||||
ulsch_harq->processedSegments=rdata->nbSegments;
|
||||
}
|
||||
LOG_D(PHY,"uplink segment error %d/%d\n",rdata->segment_r,rdata->nbSegments);
|
||||
LOG_D(PHY, "ULSCH %d in error\n",rdata->ulsch_id);
|
||||
}
|
||||
|
||||
//int dumpsig=0;
|
||||
// if all segments are done
|
||||
if (rdata->nbSegments == ulsch_harq->processedSegments) {
|
||||
if (decodeSuccess && !gNB->pusch_vars[rdata->ulsch_id]->DTX) {
|
||||
/* check global CRC */
|
||||
if (*decodeSuccessCount == rdata->nbSegments && rdata->nbSegments > 1) {
|
||||
int A = ulsch_harq->TBS * 8;
|
||||
int crc_length = A > 3824 ? 3 : 2;
|
||||
int crc_type = A > 3824 ? CRC24_A : CRC16;
|
||||
if (!check_crc(ulsch_harq->b, A + crc_length*8, 0 /* F - unused */, crc_type)) {
|
||||
*decodeSuccessCount = 0;
|
||||
LOG_E(PHY, "LDPC global CRC fails, but individual LDPC CRC succeeded\n");
|
||||
}
|
||||
}
|
||||
if (*decodeSuccessCount == rdata->nbSegments && !gNB->pusch_vars[rdata->ulsch_id]->DTX) {
|
||||
LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for SFN/SF %d.%d (pid %d, ndi %d, status %d, round %d, TBS %d, Max interation (all seg) %d)\n",
|
||||
gNB->Mod_id,ulsch_harq->frame,ulsch_harq->slot,rdata->harq_pid,pusch_pdu->pusch_data.new_data_indicator,ulsch_harq->status,ulsch_harq->round,ulsch_harq->TBS,rdata->decodeIterations);
|
||||
ulsch_harq->status = SCH_IDLE;
|
||||
@@ -379,11 +384,12 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
|
||||
harq_pid,
|
||||
G);
|
||||
if (enable_ldpc_offload ==0) {
|
||||
int decodeSuccessCount = 0;
|
||||
while (gNB->nbDecode > 0) {
|
||||
notifiedFIFO_elt_t *req = pullTpool(&gNB->respDecode, &gNB->threadPool);
|
||||
if (req == NULL)
|
||||
break; // Tpool has been stopped
|
||||
nr_postDecode(gNB, req);
|
||||
nr_postDecode(gNB, req, &decodeSuccessCount);
|
||||
delNotifiedFIFO_elt(req);
|
||||
}
|
||||
}
|
||||
@@ -393,7 +399,7 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
|
||||
|
||||
void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, uint8_t harq_pid, uint8_t crc_flag, int dtx_flag) {
|
||||
|
||||
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||
// pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||
|
||||
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id];
|
||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
||||
@@ -436,8 +442,8 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
else if (SNRtimes10 > 635) cqi=255;
|
||||
else cqi=(640+SNRtimes10)/5;
|
||||
|
||||
|
||||
if (0/*pusch_pdu->mcs_index == 9*/) {
|
||||
/*
|
||||
if (pusch_pdu->mcs_index == 9) {
|
||||
__attribute__((unused))
|
||||
int off = ((pusch_pdu->rb_size&1) == 1)? 4:0;
|
||||
|
||||
@@ -468,7 +474,8 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
exit(-1);
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// crc indication
|
||||
uint16_t num_crc = gNB->UL_INFO.crc_ind.number_crcs;
|
||||
gNB->UL_INFO.crc_ind.crc_list = &gNB->crc_pdu_list[0];
|
||||
@@ -507,7 +514,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
|
||||
gNB->UL_INFO.rx_ind.number_of_pdus++;
|
||||
|
||||
pthread_mutex_unlock(&gNB->UL_INFO_mutex);
|
||||
// pthread_mutex_unlock(&gNB->UL_INFO_mutex);
|
||||
|
||||
}
|
||||
|
||||
@@ -848,6 +855,15 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
||||
Therefore, we don't yet call nr_fill_indication, it will be called later */
|
||||
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
|
||||
pusch_DTX++;
|
||||
/* if round == 0 we need to clear some data because nr_ulsch_decoding() won't do it for the retransmissions */
|
||||
if (ulsch_harq->round == 0) {
|
||||
int r;
|
||||
LOG_D(PHY, "DTX for round 0, clear mandatory data\n");
|
||||
for (r = 0; r < ulsch->a_segments; r++) {
|
||||
ulsch_harq->crc_ok[r] = false;
|
||||
memset(ulsch_harq->d[r], 0, (68*384)*sizeof(int16_t));
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -99,6 +99,11 @@ nfapi_ue_release_request_body_t release_rntis;
|
||||
instance_t DUuniqInstance=0;
|
||||
instance_t CUuniqInstance=0;
|
||||
|
||||
int nr_derive_key_ng_ran_star(uint16_t pci, uint64_t nr_arfcn_dl, const uint8_t key[32], uint8_t *key_ng_ran_star)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// dummy functions
|
||||
int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); }
|
||||
|
||||
|
||||
@@ -94,6 +94,11 @@ int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);
|
||||
instance_t DUuniqInstance=0;
|
||||
instance_t CUuniqInstance=0;
|
||||
|
||||
int nr_derive_key_ng_ran_star(uint16_t pci, uint64_t nr_arfcn_dl, const uint8_t key[32], uint8_t *key_ng_ran_star)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
rrc_data_ind(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
|
||||
@@ -95,6 +95,11 @@ nfapi_ue_release_request_body_t release_rntis;
|
||||
instance_t DUuniqInstance=0;
|
||||
instance_t CUuniqInstance=0;
|
||||
|
||||
int nr_derive_key_ng_ran_star(uint16_t pci, uint64_t nr_arfcn_dl, const uint8_t key[32], uint8_t *key_ng_ran_star)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
|
||||
|
||||
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id,
|
||||
|
||||
@@ -111,6 +111,7 @@ typedef enum {
|
||||
#define CONFIG_STRING_RU_NUM_TP_CORES "num_tp_cores"
|
||||
#define CONFIG_STRING_RU_NUM_INTERFACES "num_interfaces"
|
||||
#define CONFIG_STRING_RU_HALF_SLOT_PARALLELIZATION "half_slot_parallelization"
|
||||
#define CONFIG_STRING_RU_RU_THREAD_CORE "ru_thread_core"
|
||||
|
||||
#define HLP_RU_SF_AHEAD "LTE TX processing advance"
|
||||
#define HLP_RU_SL_AHEAD "NR TX processing advance"
|
||||
@@ -122,6 +123,7 @@ typedef enum {
|
||||
#define HLP_RU_NUM_TP_CORES "Number of cores for RU ThreadPool"
|
||||
#define HLP_RU_NUM_INTERFACES "Number of network interfaces for RU"
|
||||
#define HLP_RU_HALF_SLOT_PARALLELIZATION "run half slots in parallel in RU FEP"
|
||||
#define HLP_RU_RU_THREAD_CORE "id of core to pin ru_thread, -1 is default"
|
||||
|
||||
#define RU_LOCAL_IF_NAME_IDX 0
|
||||
#define RU_LOCAL_ADDRESS_IDX 1
|
||||
@@ -164,6 +166,7 @@ typedef enum {
|
||||
#define RU_NUM_TP_CORES 38
|
||||
#define RU_NUM_INTERFACES 39
|
||||
#define RU_HALF_SLOT_PARALLELIZATION 40
|
||||
#define RU_RU_THREAD_CORE 41
|
||||
/*-----------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* RU configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
@@ -210,6 +213,7 @@ typedef enum {
|
||||
{CONFIG_STRING_RU_NUM_TP_CORES, HLP_RU_NUM_TP_CORES, 0, uptr:NULL, defintval:2, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_NUM_INTERFACES, HLP_RU_NUM_INTERFACES, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_HALF_SLOT_PARALLELIZATION, HLP_RU_HALF_SLOT_PARALLELIZATION, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_RU_THREAD_CORE, HLP_RU_RU_THREAD_CORE, 0, uptr:NULL, defintval:-1, TYPE_INT, 0}, \
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
#define CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD "pusch_dtx_threshold"
|
||||
#define CONFIG_STRING_L1_SRS_DTX_THRESHOLD "srs_dtx_threshold"
|
||||
#define CONFIG_STRING_L1_MAX_LDPC_ITERATIONS "max_ldpc_iterations"
|
||||
#define CONFIG_STRING_L1_TX_AMP_BACKOFF_dB "tx_amp_backoff_dB"
|
||||
#define CONFIG_STRING_L1_RX_THREAD_CORE "L1_rx_thread_core"
|
||||
#define CONFIG_STRING_L1_TX_THREAD_CORE "L1_tx_thread_core"
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* L1 configuration parameters */
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
@@ -74,6 +78,9 @@
|
||||
{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:50, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_SRS_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:50, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_MAX_LDPC_ITERATIONS, NULL, 0, uptr:NULL, defintval:5, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_TX_AMP_BACKOFF_dB, NULL, 0, uptr:NULL, defintval:36, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_RX_THREAD_CORE, NULL, 0, uptr:NULL, defintval:-1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, uptr:NULL, defintval:-1, TYPE_UINT, 0}, \
|
||||
}
|
||||
#define L1_CC_IDX 0
|
||||
#define L1_TRANSPORT_N_PREFERENCE_IDX 1
|
||||
@@ -91,6 +98,9 @@
|
||||
#define L1_PUSCH_DTX_THRESHOLD 13
|
||||
#define L1_SRS_DTX_THRESHOLD 14
|
||||
#define L1_MAX_LDPC_ITERATIONS 15
|
||||
#define L1_TX_AMP_BACKOFF_dB 16
|
||||
#define L1_RX_THREAD_CORE 17
|
||||
#define L1_TX_THREAD_CORE 18
|
||||
|
||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#endif
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
|
||||
#define SCCPARAMS_DESC(scc) { \
|
||||
{GNB_CONFIG_STRING_PHYSCELLID,NULL,0,i64ptr:scc->physCellId,defint64val:0,TYPE_INT64,0/*0*/}, \
|
||||
{GNB_CONFIG_STRING_NTIMINGADVANCEOFFSET,NULL,0,i64ptr:scc->n_TimingAdvanceOffset,defint64val:NR_ServingCellConfigCommon__n_TimingAdvanceOffset_n0,TYPE_INT64,0/*1*/},\
|
||||
{GNB_CONFIG_STRING_NTIMINGADVANCEOFFSET,NULL,0,i64ptr:scc->n_TimingAdvanceOffset,defint64val:NR_ServingCellConfigCommon__n_TimingAdvanceOffset_n25600,TYPE_INT64,0/*1*/},\
|
||||
{GNB_CONFIG_STRING_SSBPERIODICITYSERVINGCELL,NULL,0,i64ptr:scc->ssb_periodicityServingCell,defint64val:NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms20,TYPE_INT64,0/*2*/},\
|
||||
{GNB_CONFIG_STRING_DMRSTYPEAPOSITION,NULL,0,i64ptr:&scc->dmrs_TypeA_Position,defint64val:NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2,TYPE_INT64,0/*3*/},\
|
||||
{GNB_CONFIG_STRING_SUBCARRIERSPACING,NULL,0,i64ptr:scc->ssbSubcarrierSpacing,defint64val:NR_SubcarrierSpacing_kHz30,TYPE_INT64,0/*4*/},\
|
||||
|
||||
@@ -119,7 +119,8 @@ void prepare_scc(NR_ServingCellConfigCommon_t *scc) {
|
||||
scc->ssbSubcarrierSpacing = CALLOC(1,sizeof(NR_SubcarrierSpacing_t));
|
||||
scc->tdd_UL_DL_ConfigurationCommon = CALLOC(1,sizeof(struct NR_TDD_UL_DL_ConfigCommon));
|
||||
scc->tdd_UL_DL_ConfigurationCommon->pattern2 = CALLOC(1,sizeof(struct NR_TDD_UL_DL_Pattern));
|
||||
|
||||
|
||||
scc->n_TimingAdvanceOffset=CALLOC(1,sizeof(*scc->n_TimingAdvanceOffset));
|
||||
scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB = CALLOC(1,sizeof(NR_ARFCN_ValueNR_t));
|
||||
|
||||
dl_frequencyBandList = CALLOC(1,sizeof(NR_FreqBandIndicatorNR_t));
|
||||
@@ -769,6 +770,11 @@ void RCconfig_NR_L1(void)
|
||||
RC.gNB[j]->pusch_thres = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr);
|
||||
RC.gNB[j]->srs_thres = *(L1_ParamList.paramarray[j][L1_SRS_DTX_THRESHOLD].uptr);
|
||||
RC.gNB[j]->max_ldpc_iterations = *(L1_ParamList.paramarray[j][L1_MAX_LDPC_ITERATIONS].uptr);
|
||||
RC.gNB[j]->TX_AMP = (int16_t)(32767.0/pow(10.0,.05*(double)(*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr)));
|
||||
RC.gNB[j]->L1_rx_thread_core = *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr);
|
||||
RC.gNB[j]->L1_tx_thread_core = *(L1_ParamList.paramarray[j][L1_TX_THREAD_CORE].iptr);
|
||||
LOG_I(PHY,"TX_AMP = %d (-%d dBFS)\n",RC.gNB[j]->TX_AMP,*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr);
|
||||
LOG_I(PHY,"L1_RX_THREAD_CORE %d (%d)\n",*(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr),L1_RX_THREAD_CORE);
|
||||
if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
|
||||
// sf_ahead = 2; // Need 4 subframe gap between RX and TX
|
||||
} else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
|
||||
|
||||
@@ -626,11 +626,12 @@ void nr_initiate_ra_proc(module_id_t module_idP,
|
||||
int loop = 0;
|
||||
if (ra->rnti == 0) { // This condition allows for the usage of a preconfigured rnti for the CFRA
|
||||
do {
|
||||
ra->rnti = (taus() % 65518) + 1;
|
||||
// 3GPP TS 38.321 version 15.13.0 Section 7.1 Table 7.1-1: RNTI values
|
||||
ra->rnti = (taus() % 0xffef) + 1;
|
||||
loop++;
|
||||
} while (loop != 100
|
||||
&& !((find_nr_UE(&nr_mac->UE_info, ra->rnti) == NULL) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1)
|
||||
&& ra->rnti >= 1 && ra->rnti <= 65519));
|
||||
&& ra->rnti >= 0x1 && ra->rnti <= 0xffef));
|
||||
if (loop == 100) {
|
||||
LOG_E(NR_MAC, "%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
abort();
|
||||
|
||||
@@ -163,7 +163,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
||||
if ((ssb_start_symbol/14) == rel_slot){
|
||||
const int prb_offset = offset_pointa >> scs;
|
||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol % NR_SYMBOLS_PER_SLOT, CC_id);
|
||||
if (get_softmodem_params()->sa == 1) {
|
||||
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
||||
frameP,
|
||||
@@ -192,7 +192,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
||||
if ((ssb_start_symbol/14) == rel_slot){
|
||||
const int prb_offset = offset_pointa >> scs;
|
||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol % NR_SYMBOLS_PER_SLOT, CC_id);
|
||||
if (get_softmodem_params()->sa == 1) {
|
||||
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
||||
frameP,
|
||||
@@ -222,7 +222,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
||||
if ((ssb_start_symbol/14) == rel_slot){
|
||||
const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz
|
||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol % NR_SYMBOLS_PER_SLOT, CC_id);
|
||||
const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
|
||||
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
||||
// FR2 is only TDD, to be fixed for flexible TDD
|
||||
|
||||
@@ -1175,10 +1175,10 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
||||
int bwp_id,
|
||||
NR_SearchSpace_t *ss,
|
||||
NR_ControlResourceSet_t *coreset,
|
||||
uint16_t cset0_bwp_size)
|
||||
{
|
||||
uint16_t cset0_bwp_size) {
|
||||
uint8_t fsize = 0, pos = 0;
|
||||
gNB_MAC_INST *gNB_mac = RC.nrmac[0];
|
||||
|
||||
uint8_t fsize = 0, pos = 0;
|
||||
uint64_t *dci_pdu = (uint64_t *)pdcch_dci_pdu->Payload;
|
||||
*dci_pdu = 0;
|
||||
uint16_t alt_size = 0;
|
||||
@@ -1406,8 +1406,13 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
|
||||
// Time domain assignment 4 bit
|
||||
for (int i = 0; i < 4; i++)
|
||||
*dci_pdu |= (((uint64_t)dci_pdu_rel15->time_domain_assignment.val >> (3 - i)) & 1) << (dci_size - pos++);
|
||||
|
||||
LOG_D(NR_MAC, "dci_pdu_rel15->time_domain_assignment.val = %i\n", dci_pdu_rel15->time_domain_assignment.val);
|
||||
// VRB to PRB mapping 1 bit
|
||||
if (gNB_mac->sched_ctrlCommon->sched_pdcch.CceRegMappingType) {
|
||||
dci_pdu_rel15->vrb_to_prb_mapping.val = 1;
|
||||
}
|
||||
|
||||
*dci_pdu |= ((uint64_t)dci_pdu_rel15->vrb_to_prb_mapping.val & 1) << (dci_size - pos++);
|
||||
LOG_D(NR_MAC, "dci_pdu_rel15->vrb_to_prb_mapping.val = %i\n", dci_pdu_rel15->vrb_to_prb_mapping.val);
|
||||
// MCS 5bit //bit over 32, so dci_pdu ++
|
||||
|
||||
@@ -699,11 +699,9 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
NR_UE_info_t* UE = add_new_nr_ue(gNB_mac, ra->rnti, ra->CellGroup);
|
||||
NR_UE_info_t *UE = add_new_nr_ue(gNB_mac, ra->rnti, ra->CellGroup);
|
||||
if (!UE) {
|
||||
LOG_W(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
|
||||
|
||||
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||
return;
|
||||
|
||||
@@ -32,7 +32,7 @@ void e1_add_drb(int is_gnb,
|
||||
unsigned char *ciphering_key,
|
||||
unsigned char *integrity_key)
|
||||
{
|
||||
add_drb_am(is_gnb, ue_id, s, ciphering_algorithm, integrity_algorithm,
|
||||
add_drb_am(is_gnb, ue_id, 0, s, ciphering_algorithm, integrity_algorithm,
|
||||
ciphering_key, integrity_key);
|
||||
LOG_I(PDCP, "%s:%s:%d: added DRB for UE ID %ld\n", __FILE__, __FUNCTION__, __LINE__, ue_id);
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ void nr_pdcp_e1_add_drbs(eNB_flag_t enb_flag,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint);
|
||||
|
||||
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_DRB_ToAddMod *s,
|
||||
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s,
|
||||
int ciphering_algorithm,
|
||||
int integrity_algorithm,
|
||||
unsigned char *ciphering_key,
|
||||
|
||||
@@ -145,11 +145,11 @@ static void init_nr_rlc_data_req_queue(void)
|
||||
|
||||
pthread_mutex_init(&q.m, NULL);
|
||||
pthread_cond_init(&q.c, NULL);
|
||||
|
||||
if (pthread_create(&t, NULL, rlc_data_req_thread, NULL) != 0) {
|
||||
/*if (pthread_create(&t, NULL, rlc_data_req_thread, NULL) != 0) {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
}*/
|
||||
threadCreate(&t, rlc_data_req_thread, NULL, "rlc_data_req_thread", -1, OAI_PRIORITY_RT_MAX);
|
||||
}
|
||||
|
||||
static void enqueue_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
|
||||
@@ -877,7 +877,7 @@ static void add_srb(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_SRB_ToAddMod *s
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
}
|
||||
|
||||
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_DRB_ToAddMod *s, int ciphering_algorithm, int integrity_algorithm, unsigned char *ciphering_key, unsigned char *integrity_key)
|
||||
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s, int ciphering_algorithm, int integrity_algorithm, unsigned char *ciphering_key, unsigned char *integrity_key)
|
||||
{
|
||||
nr_pdcp_entity_t *pdcp_drb;
|
||||
nr_pdcp_ue_t *ue;
|
||||
@@ -962,6 +962,14 @@ void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_DRB_ToAddMod *s, in
|
||||
has_integrity ? integrity_key : NULL);
|
||||
nr_pdcp_ue_add_drb_pdcp_entity(ue, drb_id, pdcp_drb);
|
||||
|
||||
if (reestablish_ue_id > 0) {
|
||||
nr_pdcp_ue_t *reestablish_ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, reestablish_ue_id);
|
||||
if (reestablish_ue != NULL) {
|
||||
pdcp_drb->tx_next = reestablish_ue->drb[drb_id - 1]->tx_next;
|
||||
LOG_I(PDCP, "Applying tx_next %d in DRB %d from old UEid %lx to new UEid %lx\n", reestablish_ue->drb[drb_id - 1]->tx_next, drb_id, reestablish_ue_id, rntiMaybeUEid);
|
||||
}
|
||||
}
|
||||
|
||||
LOG_D(PDCP, "%s:%d:%s: added drb %d to UE ID/RNTI %ld\n", __FILE__, __LINE__, __FUNCTION__, drb_id, rntiMaybeUEid);
|
||||
|
||||
new_nr_sdap_entity(is_gnb, has_sdap_rx, has_sdap_tx, rntiMaybeUEid, pdusession_id, is_sdap_DefaultDRB, drb_id, mappedQFIs2Add, mappedQFIs2AddCount);
|
||||
@@ -971,6 +979,7 @@ void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_DRB_ToAddMod *s, in
|
||||
|
||||
static void add_drb(int is_gnb,
|
||||
ue_id_t rntiMaybeUEid,
|
||||
ue_id_t reestablish_ue_id,
|
||||
struct NR_DRB_ToAddMod *s,
|
||||
NR_RLC_Config_t *rlc_Config,
|
||||
int ciphering_algorithm,
|
||||
@@ -980,12 +989,12 @@ static void add_drb(int is_gnb,
|
||||
{
|
||||
switch (rlc_Config->present) {
|
||||
case NR_RLC_Config_PR_am:
|
||||
add_drb_am(is_gnb, rntiMaybeUEid, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
|
||||
add_drb_am(is_gnb, rntiMaybeUEid, reestablish_ue_id, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
|
||||
break;
|
||||
case NR_RLC_Config_PR_um_Bi_Directional:
|
||||
// add_drb_um(rntiMaybeUEid, s);
|
||||
/* hack */
|
||||
add_drb_am(is_gnb, rntiMaybeUEid, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
|
||||
add_drb_am(is_gnb, rntiMaybeUEid, reestablish_ue_id, s, ciphering_algorithm, integrity_algorithm, ciphering_key, integrity_key);
|
||||
break;
|
||||
default:
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal: unhandled DRB type\n",
|
||||
@@ -1011,6 +1020,7 @@ void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddMo
|
||||
|
||||
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||
ue_id_t rntiMaybeUEid,
|
||||
ue_id_t reestablish_ue_id,
|
||||
NR_DRB_ToAddModList_t *const drb2add_list,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kUPenc,
|
||||
@@ -1019,7 +1029,7 @@ void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||
{
|
||||
if (drb2add_list != NULL) {
|
||||
for (int i = 0; i < drb2add_list->list.count; i++) {
|
||||
add_drb(enb_flag, rntiMaybeUEid, drb2add_list->list.array[i], rlc_bearer2add_list->list.array[i]->rlc_Config, security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kUPenc, kUPint);
|
||||
add_drb(enb_flag, rntiMaybeUEid, reestablish_ue_id, drb2add_list->list.array[i], rlc_bearer2add_list->list.array[i]->rlc_Config, security_modeP & 0x0f, (security_modeP >> 4) & 0x0f, kUPenc, kUPint);
|
||||
}
|
||||
} else
|
||||
LOG_W(PDCP, "nr_pdcp_add_drbs() with void list\n");
|
||||
@@ -1109,7 +1119,7 @@ void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid)
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_NO, crntiMaybeUEid, 0, 0, 0);
|
||||
}
|
||||
|
||||
nr_pdcp_add_drbs(ctxt.enb_flag, ctxt.rntiMaybeUEid, rbconfig->drb_ToAddModList, 0, NULL, NULL, Rlc_Bearer_ToAdd_list);
|
||||
nr_pdcp_add_drbs(ctxt.enb_flag, ctxt.rntiMaybeUEid, 0, rbconfig->drb_ToAddModList, 0, NULL, NULL, Rlc_Bearer_ToAdd_list);
|
||||
|
||||
nr_rrc_rlc_config_asn1_req(&ctxt, (NR_SRB_ToAddModList_t *)NULL, rbconfig->drb_ToAddModList, rbconfig->drb_ToReleaseList, Rlc_Bearer_ToAdd_list);
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "asn1_msg.h"
|
||||
#include "../nr_rrc_proto.h"
|
||||
#include "UTIL/OSA/osa_defs.h"
|
||||
#include "RRC/NR/nr_rrc_extern.h"
|
||||
#include "NR_DL-CCCH-Message.h"
|
||||
#include "NR_UL-CCCH-Message.h"
|
||||
@@ -1283,7 +1284,7 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
buffer,
|
||||
1000);
|
||||
|
||||
|
||||
|
||||
AssertFatal(enc_rval.encoded >0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
|
||||
@@ -1388,7 +1389,7 @@ uint8_t do_NR_SA_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
|
||||
1024);
|
||||
AssertFatal(enc_rval.encoded >0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
|
||||
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_UE_CapabilityRequestFilterNR, (void *)sa_band_filter);
|
||||
@@ -1415,16 +1416,14 @@ uint8_t do_NR_SA_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
|
||||
|
||||
AssertFatal(enc_rval.encoded >0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
|
||||
|
||||
LOG_D(NR_RRC, "[gNB %d] NR UECapabilityRequest for UE %lx Encoded %zd bits (%zd bytes)\n", ctxt_pP->module_id, ctxt_pP->rntiMaybeUEid, enc_rval.encoded, (enc_rval.encoded + 7) / 8);
|
||||
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
|
||||
|
||||
uint8_t do_NR_RRCRelease(uint8_t *buffer,
|
||||
size_t buffer_size,
|
||||
uint8_t Transaction_id) {
|
||||
int do_NR_RRCRelease(uint8_t *buffer, size_t buffer_size, uint8_t Transaction_id)
|
||||
{
|
||||
asn_enc_rval_t enc_rval;
|
||||
NR_DL_DCCH_Message_t dl_dcch_msg;
|
||||
NR_RRCRelease_t *rrcConnectionRelease;
|
||||
@@ -1538,32 +1537,32 @@ int16_t do_RRCReconfiguration(
|
||||
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
|
||||
}
|
||||
ie->nonCriticalExtension->masterCellGroup = calloc(1,sizeof(OCTET_STRING_t));
|
||||
|
||||
|
||||
ie->nonCriticalExtension->masterCellGroup->buf = masterCellGroup_buf;
|
||||
ie->nonCriticalExtension->masterCellGroup->size = (enc_rval.encoded+7)/8;
|
||||
}
|
||||
|
||||
|
||||
dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration = ie;
|
||||
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
|
||||
}
|
||||
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
|
||||
NULL,
|
||||
(void *)&dl_dcch_msg,
|
||||
buffer,
|
||||
buffer_size);
|
||||
|
||||
|
||||
AssertFatal(enc_rval.encoded >0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
|
||||
|
||||
LOG_D(NR_RRC,"[gNB %d] RRCReconfiguration for UE %lx Encoded %zd bits (%zd bytes)\n",
|
||||
ctxt_pP->module_id,
|
||||
ctxt_pP->rntiMaybeUEid,
|
||||
enc_rval.encoded,
|
||||
(enc_rval.encoded+7)/8);
|
||||
|
||||
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
|
||||
@@ -1698,9 +1697,9 @@ uint8_t do_RRCSetupComplete(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size,
|
||||
NR_UL_DCCH_Message_t ul_dcch_msg;
|
||||
NR_RRCSetupComplete_t *RrcSetupComplete;
|
||||
memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
|
||||
|
||||
|
||||
uint8_t buf[6];
|
||||
|
||||
|
||||
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
|
||||
ul_dcch_msg.message.choice.c1 = CALLOC(1,sizeof(struct NR_UL_DCCH_MessageType__c1));
|
||||
ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_rrcSetupComplete;
|
||||
@@ -1713,7 +1712,7 @@ uint8_t do_RRCSetupComplete(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size,
|
||||
// sizeof(*RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->nonCriticalExtension));
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->selectedPLMN_Identity = sel_plmn_id;
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->registeredAMF = NULL;
|
||||
|
||||
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value = CALLOC(1, sizeof(struct NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value));
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->present = NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI;
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.size = 6;
|
||||
@@ -1724,13 +1723,13 @@ uint8_t do_RRCSetupComplete(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size,
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[3] = 0x78;
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[4] = 0x9A;
|
||||
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[5] = 0xBC;
|
||||
|
||||
|
||||
memset(&RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->dedicatedNAS_Message,0,sizeof(OCTET_STRING_t));
|
||||
OCTET_STRING_fromBuf(&RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->dedicatedNAS_Message,dedicatedInfoNAS,dedicatedInfoNASLength);
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
|
||||
}
|
||||
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message,
|
||||
NULL,
|
||||
(void *)&ul_dcch_msg,
|
||||
@@ -1739,7 +1738,7 @@ uint8_t do_RRCSetupComplete(uint8_t Mod_id, uint8_t *buffer, size_t buffer_size,
|
||||
AssertFatal(enc_rval.encoded > 0,"ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name,enc_rval.encoded);
|
||||
LOG_D(NR_RRC,"RRCSetupComplete Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
|
||||
|
||||
|
||||
return((enc_rval.encoded+7)/8);
|
||||
}
|
||||
|
||||
@@ -1844,133 +1843,139 @@ uint8_t do_RRCReestablishmentRequest(uint8_t Mod_id, uint8_t *buffer, uint16_t c
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
uint8_t
|
||||
do_RRCReestablishment(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
int CC_id,
|
||||
uint8_t *const buffer,
|
||||
size_t buffer_size,
|
||||
//const uint8_t transmission_mode,
|
||||
const uint8_t Transaction_id,
|
||||
NR_SRB_ToAddModList_t **SRB_configList
|
||||
) {
|
||||
asn_enc_rval_t enc_rval;
|
||||
//long *logicalchannelgroup = NULL;
|
||||
struct NR_SRB_ToAddMod *SRB1_config = NULL;
|
||||
struct NR_SRB_ToAddMod *SRB2_config = NULL;
|
||||
//gNB_RRC_INST *nrrrc = RC.nrrrc[ctxt_pP->module_id];
|
||||
NR_DL_DCCH_Message_t dl_dcch_msg;
|
||||
NR_RRCReestablishment_t *rrcReestablishment = NULL;
|
||||
int i = 0;
|
||||
ue_context_pP->ue_context.reestablishment_xid = Transaction_id;
|
||||
NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
||||
SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[Transaction_id];
|
||||
int do_RRCReestablishment(const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
int CC_id,
|
||||
uint8_t *const buffer,
|
||||
size_t buffer_size,
|
||||
const uint8_t Transaction_id,
|
||||
NR_SRB_ToAddModList_t **SRB_configList,
|
||||
const uint8_t *masterCellGroup_from_DU,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
rrc_gNB_carrier_data_t *carrier)
|
||||
{
|
||||
asn_enc_rval_t enc_rval;
|
||||
struct NR_SRB_ToAddMod *SRB1_config = NULL;
|
||||
struct NR_SRB_ToAddMod *SRB2_config = NULL;
|
||||
NR_DL_DCCH_Message_t dl_dcch_msg = {0};
|
||||
NR_RRCReestablishment_t *rrcReestablishment = NULL;
|
||||
ue_context_pP->ue_context.reestablishment_xid = Transaction_id;
|
||||
NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
||||
SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[Transaction_id];
|
||||
|
||||
if (*SRB_configList2) {
|
||||
free(*SRB_configList2);
|
||||
}
|
||||
if (*SRB_configList2) {
|
||||
free(*SRB_configList2);
|
||||
}
|
||||
|
||||
*SRB_configList2 = CALLOC(1, sizeof(NR_SRB_ToAddModList_t));
|
||||
memset((void *)&dl_dcch_msg, 0, sizeof(NR_DL_DCCH_Message_t));
|
||||
dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
|
||||
dl_dcch_msg.message.choice.c1 = calloc(1,sizeof(struct NR_DL_DCCH_MessageType__c1));
|
||||
dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_rrcReestablishment;
|
||||
dl_dcch_msg.message.choice.c1->choice.rrcReestablishment = CALLOC(1,sizeof(NR_RRCReestablishment_t));
|
||||
rrcReestablishment = dl_dcch_msg.message.choice.c1->choice.rrcReestablishment;
|
||||
*SRB_configList2 = CALLOC(1, sizeof(NR_SRB_ToAddModList_t));
|
||||
dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
|
||||
dl_dcch_msg.message.choice.c1 = calloc(1, sizeof(struct NR_DL_DCCH_MessageType__c1));
|
||||
dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_rrcReestablishment;
|
||||
dl_dcch_msg.message.choice.c1->choice.rrcReestablishment = CALLOC(1, sizeof(NR_RRCReestablishment_t));
|
||||
rrcReestablishment = dl_dcch_msg.message.choice.c1->choice.rrcReestablishment;
|
||||
|
||||
// get old configuration of SRB2
|
||||
if (*SRB_configList != NULL) {
|
||||
for (i = 0; (i < (*SRB_configList)->list.count) && (i < 3); i++) {
|
||||
LOG_D(NR_RRC, "(*SRB_configList)->list.array[%d]->srb_Identity=%ld\n",
|
||||
i, (*SRB_configList)->list.array[i]->srb_Identity);
|
||||
|
||||
if ((*SRB_configList)->list.array[i]->srb_Identity == 2 ) {
|
||||
SRB2_config = (*SRB_configList)->list.array[i];
|
||||
} else if ((*SRB_configList)->list.array[i]->srb_Identity == 1 ) {
|
||||
SRB1_config = (*SRB_configList)->list.array[i];
|
||||
}
|
||||
// get old configuration of SRB2
|
||||
if (*SRB_configList != NULL) {
|
||||
for (int i = 0; (i < (*SRB_configList)->list.count) && (i < 3); i++) {
|
||||
LOG_D(NR_RRC, "(*SRB_configList)->list.array[%d]->srb_Identity=%ld\n", i, (*SRB_configList)->list.array[i]->srb_Identity);
|
||||
if ((*SRB_configList)->list.array[i]->srb_Identity == 2) {
|
||||
SRB2_config = (*SRB_configList)->list.array[i];
|
||||
} else if ((*SRB_configList)->list.array[i]->srb_Identity == 1) {
|
||||
SRB1_config = (*SRB_configList)->list.array[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (SRB1_config == NULL) {
|
||||
// default SRB1 configuration
|
||||
LOG_W(NR_RRC,"SRB1 configuration does not exist in SRB configuration list, use default\n");
|
||||
/// SRB1
|
||||
SRB1_config = CALLOC(1, sizeof(*SRB1_config));
|
||||
SRB1_config->srb_Identity = 1;
|
||||
if (SRB1_config == NULL) {
|
||||
// default SRB1 configuration
|
||||
LOG_W(NR_RRC, "SRB1 configuration does not exist in SRB configuration list, use default\n");
|
||||
/// SRB1
|
||||
SRB1_config = CALLOC(1, sizeof(*SRB1_config));
|
||||
SRB1_config->srb_Identity = 1;
|
||||
}
|
||||
|
||||
if (SRB2_config == NULL) {
|
||||
LOG_W(NR_RRC, "SRB2 configuration does not exist in SRB configuration list\n");
|
||||
} else {
|
||||
asn1cSeqAdd(&(*SRB_configList2)->list, SRB2_config);
|
||||
}
|
||||
|
||||
if (*SRB_configList) {
|
||||
free(*SRB_configList);
|
||||
}
|
||||
|
||||
*SRB_configList = CALLOC(1, sizeof(NR_SRB_ToAddModList_t));
|
||||
asn1cSeqAdd(&(*SRB_configList)->list, SRB1_config);
|
||||
/****************************** masterCellGroup ******************************/
|
||||
/*
|
||||
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
||||
char masterCellGroup_buf[1000];
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||
if (masterCellGroup_from_DU) {
|
||||
// decode masterCellGroup OCTET_STRING received from DU and place in ue context
|
||||
uper_decode(NULL,
|
||||
&asn_DEF_NR_CellGroupConfig, //might be added prefix later
|
||||
(void **)&cellGroupConfig,
|
||||
(uint8_t *)masterCellGroup_from_DU->buf,
|
||||
masterCellGroup_from_DU->size, 0, 0);
|
||||
|
||||
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
|
||||
}
|
||||
else {
|
||||
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
|
||||
fill_initial_cellGroupConfig(ue_context_pP->ue_context.rnti,ue_context_pP->local_uid,cellGroupConfig,scc,carrier);
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
||||
NULL,
|
||||
(void *)cellGroupConfig,
|
||||
masterCellGroup_buf,
|
||||
1000);
|
||||
|
||||
if(enc_rval.encoded == -1) {
|
||||
LOG_E(NR_RRC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
ue_p->masterCellGroup = cellGroupConfig;
|
||||
*/
|
||||
rrcReestablishment->rrc_TransactionIdentifier = Transaction_id;
|
||||
rrcReestablishment->criticalExtensions.present = NR_RRCReestablishment__criticalExtensions_PR_rrcReestablishment;
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment = CALLOC(1, sizeof(NR_RRCReestablishment_IEs_t));
|
||||
|
||||
if (SRB2_config == NULL) {
|
||||
LOG_W(NR_RRC,"SRB2 configuration does not exist in SRB configuration list\n");
|
||||
} else {
|
||||
asn1cSeqAdd(&(*SRB_configList2)->list, SRB2_config);
|
||||
}
|
||||
uint16_t pci = RC.nrrrc[ctxt_pP->module_id]->carrier.physCellId;
|
||||
uint32_t nr_arfcn_dl = (uint64_t)*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB;
|
||||
LOG_I(NR_RRC, "Reestablishment update key pci=%d, earfcn_dl=%u\n", pci, nr_arfcn_dl);
|
||||
|
||||
if (*SRB_configList) {
|
||||
free(*SRB_configList);
|
||||
}
|
||||
// 3GPP TS 33.501 Section 6.11 Security handling for RRC connection re-establishment procedure
|
||||
if (ue_context_pP->ue_context.nh_ncc >= 0) {
|
||||
nr_derive_key_ng_ran_star(pci, nr_arfcn_dl, ue_context_pP->ue_context.nh, ue_context_pP->ue_context.kgnb);
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->nextHopChainingCount = ue_context_pP->ue_context.nh_ncc;
|
||||
} else { // first HO
|
||||
nr_derive_key_ng_ran_star(pci, nr_arfcn_dl, ue_context_pP->ue_context.kgnb, ue_context_pP->ue_context.kgnb);
|
||||
// LG: really 1
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->nextHopChainingCount = 0;
|
||||
}
|
||||
|
||||
*SRB_configList = CALLOC(1, sizeof(LTE_SRB_ToAddModList_t));
|
||||
asn1cSeqAdd(&(*SRB_configList)->list,SRB1_config);
|
||||
ue_context_pP->ue_context.kgnb_ncc = 0;
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->lateNonCriticalExtension = NULL;
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->nonCriticalExtension = NULL;
|
||||
|
||||
rrcReestablishment->rrc_TransactionIdentifier = Transaction_id;
|
||||
rrcReestablishment->criticalExtensions.present = NR_RRCReestablishment__criticalExtensions_PR_rrcReestablishment;
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment = CALLOC(1,sizeof(NR_RRCReestablishment_IEs_t));
|
||||
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
|
||||
}
|
||||
|
||||
uint8_t KgNB_star[32] = { 0 };
|
||||
/** TODO
|
||||
uint16_t pci = nrrrc->carrier[CC_id].physCellId;
|
||||
uint32_t earfcn_dl = (uint32_t)freq_to_arfcn10(RC.mac[ctxt_pP->module_id]->common_channels[CC_id].eutra_band,
|
||||
nrrrc->carrier[CC_id].dl_CarrierFreq);
|
||||
bool is_rel8_only = true;
|
||||
|
||||
if (earfcn_dl > 65535) {
|
||||
is_rel8_only = false;
|
||||
}
|
||||
LOG_D(NR_RRC, "pci=%d, eutra_band=%d, downlink_frequency=%d, earfcn_dl=%u, is_rel8_only=%s\n",
|
||||
pci,
|
||||
RC.mac[ctxt_pP->module_id]->common_channels[CC_id].eutra_band,
|
||||
nrrrc->carrier[CC_id].dl_CarrierFreq,
|
||||
earfcn_dl,
|
||||
is_rel8_only == true ? "true": "false");
|
||||
*/
|
||||
|
||||
if (ue_context_pP->ue_context.nh_ncc >= 0) {
|
||||
//TODO derive_keNB_star(ue_context_pP->ue_context.nh, pci, earfcn_dl, is_rel8_only, KgNB_star);
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->nextHopChainingCount = ue_context_pP->ue_context.nh_ncc;
|
||||
} else { // first HO
|
||||
//TODO derive_keNB_star (ue_context_pP->ue_context.kgnb, pci, earfcn_dl, is_rel8_only, KgNB_star);
|
||||
// LG: really 1
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->nextHopChainingCount = 0;
|
||||
}
|
||||
// copy KgNB_star to ue_context_pP->ue_context.kgnb
|
||||
memcpy (ue_context_pP->ue_context.kgnb, KgNB_star, 32);
|
||||
ue_context_pP->ue_context.kgnb_ncc = 0;
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->lateNonCriticalExtension = NULL;
|
||||
rrcReestablishment->criticalExtensions.choice.rrcReestablishment->nonCriticalExtension = NULL;
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message, NULL, (void *)&dl_dcch_msg, buffer, 100);
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
|
||||
}
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
|
||||
NULL,
|
||||
(void *)&dl_dcch_msg,
|
||||
buffer,
|
||||
100);
|
||||
|
||||
AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
|
||||
LOG_D(NR_RRC,"RRCReestablishment Encoded %u bits (%u bytes)\n",
|
||||
(uint32_t)enc_rval.encoded, (uint32_t)(enc_rval.encoded+7)/8);
|
||||
return((enc_rval.encoded+7)/8);
|
||||
AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
|
||||
LOG_D(NR_RRC, "RRCReestablishment Encoded %u bits (%u bytes)\n", (uint32_t)enc_rval.encoded, (uint32_t)(enc_rval.encoded + 7) / 8);
|
||||
return ((enc_rval.encoded + 7) / 8);
|
||||
}
|
||||
|
||||
uint8_t
|
||||
do_RRCReestablishmentComplete(uint8_t *buffer, size_t buffer_size, int64_t rrc_TransactionIdentifier) {
|
||||
int do_RRCReestablishmentComplete(uint8_t *buffer, size_t buffer_size, int64_t rrc_TransactionIdentifier)
|
||||
{
|
||||
asn_enc_rval_t enc_rval;
|
||||
NR_UL_DCCH_Message_t ul_dcch_msg;
|
||||
NR_RRCReestablishmentComplete_t *rrcReestablishmentComplete;
|
||||
|
||||
@@ -119,8 +119,7 @@ uint8_t do_NR_SA_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
|
||||
uint8_t *const buffer,
|
||||
const uint8_t Transaction_id);
|
||||
|
||||
uint8_t do_NR_RRCRelease(uint8_t *buffer, size_t buffer_size,
|
||||
uint8_t Transaction_id);
|
||||
int do_NR_RRCRelease(uint8_t *buffer, size_t buffer_size, uint8_t Transaction_id);
|
||||
|
||||
int16_t do_RRCReconfiguration(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
@@ -174,22 +173,18 @@ uint8_t do_NR_ULInformationTransfer(uint8_t **buffer,
|
||||
|
||||
uint8_t do_RRCReestablishmentRequest(uint8_t Mod_id, uint8_t *buffer, uint16_t c_rnti);
|
||||
|
||||
uint8_t
|
||||
do_RRCReestablishment(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
int CC_id,
|
||||
uint8_t *const buffer,
|
||||
size_t buffer_size,
|
||||
//const uint8_t transmission_mode,
|
||||
const uint8_t Transaction_id,
|
||||
NR_SRB_ToAddModList_t **SRB_configList
|
||||
);
|
||||
int do_RRCReestablishment(const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
int CC_id,
|
||||
uint8_t *const buffer,
|
||||
size_t buffer_size,
|
||||
const uint8_t Transaction_id,
|
||||
NR_SRB_ToAddModList_t **SRB_configList,
|
||||
const uint8_t *masterCellGroup_from_DU,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
rrc_gNB_carrier_data_t *carrier);
|
||||
|
||||
uint8_t
|
||||
do_RRCReestablishmentComplete(
|
||||
uint8_t *buffer, size_t buffer_size,
|
||||
int64_t rrc_TransactionIdentifier);
|
||||
int do_RRCReestablishmentComplete(uint8_t *buffer, size_t buffer_size, int64_t rrc_TransactionIdentifier);
|
||||
|
||||
NR_MeasConfig_t *get_defaultMeasConfig(const gNB_RrcConfigurationReq *conf);
|
||||
uint8_t do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi);
|
||||
|
||||
@@ -164,7 +164,7 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
|
||||
kRRCenc,
|
||||
kRRCint);
|
||||
|
||||
nr_pdcp_add_drbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid,
|
||||
nr_pdcp_add_drbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, 0,
|
||||
DRB_configList,
|
||||
(ue_context_p->ue_context.integrity_algorithm << 4)
|
||||
| ue_context_p->ue_context.ciphering_algorithm,
|
||||
|
||||
@@ -304,6 +304,9 @@ typedef struct gNB_RRC_UE_s {
|
||||
NR_RRCReconfiguration_t *reconfig;
|
||||
NR_RadioBearerConfig_t *rb_config;
|
||||
|
||||
/* Pointer to save spCellConfig during RRC Reestablishment procedures */
|
||||
NR_SpCellConfig_t *spCellConfigReestablishment;
|
||||
|
||||
ImsiMobileIdentity_t imsi;
|
||||
|
||||
/* KgNB as derived from KASME received from EPC */
|
||||
@@ -326,7 +329,7 @@ typedef struct gNB_RRC_UE_s {
|
||||
uint16_t ng_5G_S_TMSI_Part2;
|
||||
NR_EstablishmentCause_t establishment_cause;
|
||||
|
||||
/* Information from UE RRC ConnectionReestablishmentRequest */
|
||||
/* Information from UE RRCReestablishmentRequest */
|
||||
NR_ReestablishmentCause_t reestablishment_cause;
|
||||
|
||||
/* UE id for initial connection to S1AP */
|
||||
@@ -481,6 +484,11 @@ typedef struct cucp_cuup_if_s {
|
||||
cucp_cuup_bearer_context_setup_func_t bearer_context_mod;
|
||||
} cucp_cuup_if_t;
|
||||
|
||||
typedef struct nr_reestablish_rnti_map_s {
|
||||
ue_id_t ue_id;
|
||||
rnti_t c_rnti;
|
||||
} nr_reestablish_rnti_map_t;
|
||||
|
||||
//---NR---(completely change)---------------------
|
||||
typedef struct gNB_RRC_INST_s {
|
||||
|
||||
@@ -534,6 +542,8 @@ typedef struct gNB_RRC_INST_s {
|
||||
// security configuration (preferred algorithms)
|
||||
nr_security_configuration_t security;
|
||||
|
||||
nr_reestablish_rnti_map_t nr_reestablish_rnti_map[MAX_MOBILES_PER_GNB];
|
||||
|
||||
nr_mac_rrc_dl_if_t mac_rrc;
|
||||
cucp_cuup_if_t cucp_cuup;
|
||||
|
||||
|
||||
@@ -61,8 +61,4 @@ extern UE_PF_PO_t UE_PF_PO[NFAPI_CC_MAX][MAX_MOBILES_PER_ENB];
|
||||
|
||||
extern pthread_mutex_t ue_pf_po_mutex;
|
||||
|
||||
extern uint16_t reestablish_rnti_map[MAX_MOBILES_PER_ENB][2];
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -210,6 +210,7 @@ void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddMo
|
||||
|
||||
void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
|
||||
ue_id_t rntiMaybeUEid,
|
||||
ue_id_t reestablish_ue_id,
|
||||
NR_DRB_ToAddModList_t *const drb2add_list,
|
||||
const uint8_t security_modeP,
|
||||
uint8_t *const kUPenc,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -189,7 +189,7 @@ rrc_gNB_ue_context_5g_s_tmsi_exist(
|
||||
{
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
|
||||
RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head) {
|
||||
LOG_I(NR_RRC,"checking for UE 5G S-TMSI %ld: rnti %d \n",
|
||||
LOG_I(NR_RRC,"Checking for UE 5G S-TMSI %ld: RNTI %04x\n",
|
||||
s_TMSI, ue_context_p->ue_context.rnti);
|
||||
|
||||
if (ue_context_p->ue_context.ng_5G_S_TMSI_Part1 == s_TMSI) {
|
||||
|
||||
@@ -386,6 +386,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
||||
|
||||
nr_pdcp_add_drbs(ctxt.enb_flag,
|
||||
ctxt.rntiMaybeUEid,
|
||||
0,
|
||||
ue_context_p->ue_context.rb_config->drb_ToAddModList,
|
||||
(ue_context_p->ue_context.integrity_algorithm << 4) | ue_context_p->ue_context.ciphering_algorithm,
|
||||
kUPenc,
|
||||
|
||||
@@ -91,7 +91,7 @@ NR_DRB_ToAddMod_t *generateDRB(gNB_RRC_UE_t *ue,
|
||||
DRB_config->pdcp_Config->moreThanOneRLC = NULL;
|
||||
|
||||
DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
|
||||
*DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
|
||||
*DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms100;
|
||||
DRB_config->pdcp_Config->ext1 = NULL;
|
||||
|
||||
if (do_drb_integrity) {
|
||||
|
||||
@@ -499,7 +499,7 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig,
|
||||
drb_ToAddMod->pdcp_Config->moreThanOneRLC = NULL;
|
||||
|
||||
drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering));
|
||||
*drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
|
||||
*drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms100;
|
||||
drb_ToAddMod->pdcp_Config->ext1 = NULL;
|
||||
|
||||
asn1cSeqAdd(&rbconfig->drb_ToAddModList->list,drb_ToAddMod);
|
||||
|
||||
@@ -2062,6 +2062,7 @@ nr_rrc_ue_establish_srb2(
|
||||
// Refresh DRBs
|
||||
nr_pdcp_add_drbs(ctxt_pP->enb_flag,
|
||||
ctxt_pP->rntiMaybeUEid,
|
||||
0,
|
||||
radioBearerConfig->drb_ToAddModList,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm | (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
|
||||
kUPenc,
|
||||
@@ -2596,12 +2597,11 @@ nr_rrc_ue_generate_rrcReestablishmentComplete(
|
||||
)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
uint32_t length;
|
||||
uint8_t buffer[100];
|
||||
length = do_RRCReestablishmentComplete(buffer, sizeof(buffer),
|
||||
uint8_t buffer[RRC_BUFFER_SIZE] = {0};
|
||||
int size = do_RRCReestablishmentComplete(buffer, RRC_BUFFER_SIZE,
|
||||
rrcReestablishment->rrc_TransactionIdentifier);
|
||||
LOG_I(NR_RRC,"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCReestablishmentComplete (bytes%d, gNB %d)\n",
|
||||
ctxt_pP->module_id,ctxt_pP->frame, length, gNB_index);
|
||||
ctxt_pP->module_id,ctxt_pP->frame, size, gNB_index);
|
||||
}
|
||||
|
||||
void *recv_msgs_from_lte_ue(void *args_p)
|
||||
|
||||
@@ -761,13 +761,32 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance,
|
||||
return !GTPNOK;
|
||||
}
|
||||
|
||||
int gtpv1u_update_ngu_tunnel(
|
||||
const instance_t instanceP,
|
||||
const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req_pP,
|
||||
const ue_id_t prior_ueid
|
||||
) {
|
||||
AssertFatal( false, "to be developped\n");
|
||||
return GTPNOK;
|
||||
int gtpv1u_update_ngu_tunnel(const instance_t instanceP, const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req_pP, const ue_id_t prior_ue_id)
|
||||
{
|
||||
LOG_D(GTPU, "[%ld] Update tunnels from UEid %lx to UEid %lx\n", instanceP, prior_ue_id, create_tunnel_req_pP->ue_id);
|
||||
|
||||
pthread_mutex_lock(&globGtp.gtp_lock);
|
||||
|
||||
auto inst = &globGtp.instances[compatInst(instanceP)];
|
||||
auto it = inst->ue2te_mapping.find(prior_ue_id);
|
||||
if (it == inst->ue2te_mapping.end()) {
|
||||
LOG_W(GTPU, "[%ld] Delete GTP tunnels for UEid: %lx, but no tunnel exits\n", instanceP, prior_ue_id);
|
||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||
return GTPNOK;
|
||||
}
|
||||
|
||||
for (int i = 0; i < create_tunnel_req_pP->num_tunnels; i++) {
|
||||
teid_t incoming_teid = inst->ue2te_mapping[prior_ue_id].bearers[create_tunnel_req_pP->pdusession_id[i]].teid_incoming;
|
||||
if (globGtp.te2ue_mapping[incoming_teid].ue_id == prior_ue_id) {
|
||||
globGtp.te2ue_mapping[incoming_teid].ue_id = create_tunnel_req_pP->ue_id;
|
||||
}
|
||||
}
|
||||
|
||||
inst->ue2te_mapping[create_tunnel_req_pP->ue_id] = it->second;
|
||||
inst->ue2te_mapping.erase(it);
|
||||
|
||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||
return !GTPNOK;
|
||||
}
|
||||
|
||||
int gtpv1u_create_x2u_tunnel(
|
||||
|
||||
968
radio/ETHERNET/oran/5g/oran.cpp
Normal file
968
radio/ETHERNET/oran/5g/oran.cpp
Normal file
@@ -0,0 +1,968 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include "oran_isolate.h"
|
||||
#include "xran_lib_wrap.hpp"
|
||||
#include "common.hpp"
|
||||
#include "xran_compression.h"
|
||||
#include "xran_sync_api.h"
|
||||
|
||||
// Declare variable useful for the send buffer function
|
||||
struct xran_device_ctx *p_xran_dev_ctx_2;
|
||||
volatile uint8_t first_call_set = 0;
|
||||
volatile uint8_t first_rx_set = 0;
|
||||
|
||||
// Variable declaration useful for fill IQ samples from file
|
||||
#define IQ_PLAYBACK_BUFFER_BYTES (XRAN_NUM_OF_SLOT_IN_TDD_LOOP*N_SYM_PER_SLOT*XRAN_MAX_PRBS*N_SC_PER_PRB*4L)
|
||||
int16_t *p_tx_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
|
||||
int iq_playback_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
|
||||
int32_t tx_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
|
||||
int32_t tx_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
|
||||
int rx_tti;
|
||||
int rx_sym;
|
||||
volatile uint32_t rx_cb_tti = 0;
|
||||
volatile uint32_t rx_cb_frame = 0;
|
||||
volatile uint32_t rx_cb_subframe = 0;
|
||||
volatile uint32_t rx_cb_slot = 0;
|
||||
|
||||
#define GetFrameNum(tti,SFNatSecStart,numSubFramePerSystemFrame, numSlotPerSubFrame) ((((uint32_t)tti / ((uint32_t)numSubFramePerSystemFrame * (uint32_t)numSlotPerSubFrame)) + SFNatSecStart) & 0x3FF)
|
||||
#define GetSlotNum(tti, numSlotPerSfn) ((uint32_t)tti % ((uint32_t)numSlotPerSfn))
|
||||
|
||||
// Declare the function useful to load IQs from file
|
||||
int sys_load_file_to_buff(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
|
||||
{
|
||||
unsigned int file_size = 0;
|
||||
int num= 0;
|
||||
|
||||
if (size)
|
||||
{
|
||||
if (filename && bufname)
|
||||
{
|
||||
FILE *file;
|
||||
printf("Loading file %s to %s: ", filename, bufname);
|
||||
file = fopen(filename, "rb");
|
||||
|
||||
|
||||
if (file == NULL)
|
||||
{
|
||||
printf("can't open file %s!!!", filename);
|
||||
exit(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
fseek(file, 0, SEEK_END);
|
||||
file_size = ftell(file);
|
||||
fseek(file, 0, SEEK_SET);
|
||||
|
||||
if ((file_size > size) || (file_size == 0))
|
||||
file_size = size;
|
||||
|
||||
printf("Reading IQ samples from file: File Size: %d [Buffer Size: %d]\n", file_size, size);
|
||||
|
||||
num = fread(pBuffer, buffers_num, size, file);
|
||||
fflush(file);
|
||||
fclose(file);
|
||||
printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, file_size, num);
|
||||
}
|
||||
printf(" \n");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(" the file name, buffer name are not set!!!");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(" the %s is free: size = %d bytes!!!", bufname, size);
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status){
|
||||
xran_cb_tag *callback_tag = (xran_cb_tag *)pCallbackTag;
|
||||
uint64_t second;
|
||||
uint32_t tti;
|
||||
uint32_t frame;
|
||||
uint32_t subframe;
|
||||
uint32_t slot;
|
||||
tti = xran_get_slot_idx(&frame,&subframe,&slot,&second);
|
||||
|
||||
rx_tti = callback_tag->slotiId;
|
||||
rx_sym = callback_tag->symbol;
|
||||
if (rx_sym == 7) {
|
||||
if (first_call_set) {
|
||||
if (!first_rx_set) {
|
||||
printf("first_rx is set\n");
|
||||
}
|
||||
first_rx_set = 1;
|
||||
}
|
||||
rx_cb_tti = tti;
|
||||
rx_cb_frame = frame;
|
||||
rx_cb_subframe = subframe;
|
||||
rx_cb_slot = slot;
|
||||
}
|
||||
}
|
||||
void xran_fh_srs_callback(void *pCallbackTag, xran_status_t status){
|
||||
rte_pause();
|
||||
}
|
||||
void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status){
|
||||
rte_pause();
|
||||
}
|
||||
|
||||
|
||||
int physide_dl_tti_call_back(void * param)
|
||||
{
|
||||
if (!first_call_set)
|
||||
printf("first_call set from phy cb first_call_set=%p\n",&first_call_set);
|
||||
first_call_set = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int physide_ul_half_slot_call_back(void * param)
|
||||
{
|
||||
rte_pause();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int physide_ul_full_slot_call_back(void * param)
|
||||
{
|
||||
rte_pause();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
void* define_oran_pointer(){
|
||||
xranLibWraper *xranlib;
|
||||
xranlib = new xranLibWraper;
|
||||
//xranLibWraper *xranlib = (xranLibWraper*) calloc(1,sizeof(xranLibWraper));
|
||||
|
||||
return xranlib;
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
void dump_oran_config(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
int numerology = xranlib->get_numerology();
|
||||
int duplex_type = xranlib->get_duplextype();
|
||||
int num_cc = xranlib->get_num_cc();
|
||||
int num_eaxc = xranlib->get_num_eaxc();
|
||||
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
|
||||
int ndlrbs = xranlib->get_num_dlrbs();
|
||||
int nulrbs = xranlib->get_num_ulrbs();
|
||||
|
||||
printf("**--**--**--**--**--**--**--**--**--**--**--**\n");
|
||||
printf("ORAN Configuration\n");
|
||||
printf("* Numerology = %d\n", numerology);
|
||||
printf("* Duplex Type = %d\n", duplex_type);
|
||||
printf("* Number CC = %d\n", num_cc);
|
||||
printf("* Number eAxc = %d\n", num_eaxc);
|
||||
printf("* Number eAxc UL = %d\n", num_eaxc_ul);
|
||||
printf("* Number RBs DL = %d\n", ndlrbs);
|
||||
printf("* Number RBs UL = %d\n", nulrbs);
|
||||
printf("**--**--**--**--**--**--**--**--**--**--**--**\n");
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int setup_oran( void *xranlib_ ){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
if(xranlib->SetUp() < 0) {
|
||||
return (-1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int open_oran_callback(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
xranlib->Open(nullptr,
|
||||
nullptr,
|
||||
(void *)xran_fh_rx_callback,
|
||||
(void *)xran_fh_rx_prach_callback,
|
||||
(void *)xran_fh_srs_callback);
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int open_oran(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
struct xran_fh_config *pCfg = (struct xran_fh_config*) malloc(sizeof(struct xran_fh_config));
|
||||
assert(pCfg != NULL);
|
||||
xranlib->get_cfg_fh(pCfg);
|
||||
xran_open(xranlib->get_xranhandle(),pCfg);
|
||||
|
||||
return(0);
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int initialize_oran(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
|
||||
xranlib->Init();
|
||||
|
||||
return(0);
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int start_oran(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
xranlib->Start();
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int stop_oran(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
xranlib->Stop();
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int close_oran(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
xranlib->Close();
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int register_physide_callbacks(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
|
||||
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_dl_tti_call_back, xranlib, 1, XRAN_CB_TTI);
|
||||
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);
|
||||
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int load_iq_from_file(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
|
||||
int numCCPorts_ = xranlib->get_num_cc();
|
||||
int num_eAxc_ = xranlib->get_num_eaxc();
|
||||
|
||||
printf("numCCPorts_ =%d, num_eAxc_=%d, MAX_ANT_CARRIER_SUPPORTED =%d\n",numCCPorts_,num_eAxc_,MAX_ANT_CARRIER_SUPPORTED);
|
||||
|
||||
int i;
|
||||
const char *IQ_filename[MAX_ANT_CARRIER_SUPPORTED];
|
||||
for(i=0; i<MAX_ANT_CARRIER_SUPPORTED; i++){
|
||||
if( (i==0) || (i==1) || (i==2) || (i==3) ){
|
||||
IQ_filename[0] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_0.bin";
|
||||
IQ_filename[1] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_1.bin";
|
||||
IQ_filename[2] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_2.bin";
|
||||
IQ_filename[3] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_3.bin";
|
||||
}else{
|
||||
IQ_filename[i] = "/0";
|
||||
}
|
||||
}
|
||||
|
||||
int32_t number_slots = 40; // According to wrapper.hpp uint32_t m_nSlots = 10; but for the file 5MHz is set to 40
|
||||
uint32_t numerology = xranlib->get_numerology(); // According to the conf file is mu number
|
||||
uint32_t bandwidth = 5; // According to the wrapper.hpp since we are reading the 5MHz files
|
||||
uint32_t sub6 = xranlib->get_sub6();
|
||||
iq_playback_buffer_size_dl = (number_slots * N_SYM_PER_SLOT * N_SC_PER_PRB * xranlib->get_num_rbs(numerology,bandwidth,sub6)*4L);
|
||||
const char *string_msg = "DL IFFT IN IQ Samples in binary format";
|
||||
|
||||
for(i = 0; i < MAX_ANT_CARRIER_SUPPORTED && i < (int32_t)(numCCPorts_ * num_eAxc_); i++) {
|
||||
char *name = const_cast<char*>(IQ_filename[i]);
|
||||
char *string = const_cast<char*>(string_msg);
|
||||
if(((uint8_t *)IQ_filename[i])[0]!=0){
|
||||
|
||||
p_tx_play_buffer[i] = (int16_t*)malloc(iq_playback_buffer_size_dl);
|
||||
assert (NULL != (p_tx_play_buffer[i]));
|
||||
tx_play_buffer_size[i] = (int32_t)iq_playback_buffer_size_dl;
|
||||
|
||||
printf("Loading file [%d] %s \n",i,IQ_filename[i]);
|
||||
tx_play_buffer_size[i] = sys_load_file_to_buff( name,
|
||||
string,
|
||||
(uint8_t*) p_tx_play_buffer[i],
|
||||
tx_play_buffer_size[i],
|
||||
1);
|
||||
tx_play_buffer_position[i] = 0;
|
||||
} else {
|
||||
|
||||
p_tx_play_buffer[i]=(int16_t*)malloc(iq_playback_buffer_size_dl);
|
||||
tx_play_buffer_size[i]=0;
|
||||
tx_play_buffer_position[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int xran_fh_tx_send_buffer(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
|
||||
int32_t flowId;
|
||||
void *ptr = NULL;
|
||||
char *pos = NULL;
|
||||
|
||||
p_xran_dev_ctx_2 = xran_dev_get_ctx();
|
||||
if (p_xran_dev_ctx_2 != NULL){
|
||||
printf("p_xran_dev_ctx_2=%p\n",p_xran_dev_ctx_2);
|
||||
}
|
||||
|
||||
int num_eaxc = xranlib->get_num_eaxc();
|
||||
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
|
||||
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
|
||||
int32_t nSectorNum;
|
||||
|
||||
/*
|
||||
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
|
||||
{
|
||||
nSectorIndex[nSectorNum] = nSectorNum;
|
||||
}
|
||||
*/
|
||||
nSectorNum = xranlib->get_num_cc();
|
||||
|
||||
int maxflowid = num_eaxc * (nSectorNum-1) + (xran_max_antenna_nr-1);
|
||||
printf("the maximum flowID will be=%d\n",maxflowid);
|
||||
|
||||
for(uint16_t cc_id=0; cc_id<nSectorNum; cc_id++){
|
||||
for(int32_t tti = 0; tti < XRAN_N_FE_BUF_LEN; tti++) {
|
||||
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr; ant_id++){
|
||||
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
|
||||
|
||||
flowId = num_eaxc * cc_id + ant_id;
|
||||
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
|
||||
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
|
||||
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
|
||||
ptr = pData;
|
||||
pos = ((char*)p_tx_play_buffer[flowId]) + tx_play_buffer_position[flowId];
|
||||
|
||||
uint8_t *u8dptr;
|
||||
struct xran_prb_map *pRbMap = pPrbMap;
|
||||
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
|
||||
if(ptr && pos){
|
||||
uint32_t idxElm = 0;
|
||||
u8dptr = (uint8_t*)ptr;
|
||||
int16_t payload_len = 0;
|
||||
|
||||
uint8_t *dst = (uint8_t *)u8dptr;
|
||||
uint8_t *src = (uint8_t *)pos;
|
||||
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
|
||||
|
||||
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
|
||||
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
|
||||
struct xran_section_desc *p_sec_desc = NULL;
|
||||
p_prbMapElm = &pRbMap->prbMap[idxElm];
|
||||
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
|
||||
|
||||
if(p_sec_desc == NULL){
|
||||
printf ("p_sec_desc == NULL\n");
|
||||
exit(-1);
|
||||
}
|
||||
src = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB*4L);
|
||||
|
||||
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
|
||||
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
|
||||
rte_memcpy(dst, src, payload_len);
|
||||
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
|
||||
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
|
||||
struct xranlib_compress_request bfp_com_req;
|
||||
struct xranlib_compress_response bfp_com_rsp;
|
||||
|
||||
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
|
||||
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
|
||||
|
||||
bfp_com_req.data_in = (int16_t*)src;
|
||||
bfp_com_req.numRBs = p_prbMapElm->nRBSize;
|
||||
bfp_com_req.len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
|
||||
bfp_com_req.compMethod = p_prbMapElm->compMethod;
|
||||
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
|
||||
|
||||
bfp_com_rsp.data_out = (int8_t*)dst;
|
||||
bfp_com_rsp.len = 0;
|
||||
|
||||
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
|
||||
payload_len = bfp_com_rsp.len;
|
||||
}else {
|
||||
printf ("p_prbMapElm->compMethod == %d is not supported\n",
|
||||
p_prbMapElm->compMethod);
|
||||
exit(-1);
|
||||
}
|
||||
p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr);
|
||||
p_sec_desc->iq_buffer_len = payload_len;
|
||||
|
||||
dst += payload_len;
|
||||
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
|
||||
}
|
||||
} else {
|
||||
exit(-1);
|
||||
printf("ptr ==NULL\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int read_prach_data(ru_info_t *ru, int frame, int slot)
|
||||
{
|
||||
p_xran_dev_ctx_2 = xran_dev_get_ctx();
|
||||
struct rte_mbuf *mb;
|
||||
|
||||
/* calculate tti and subframe_id from frame, slot num */
|
||||
int tti = 20 * (frame) + (slot);
|
||||
uint32_t subframe = XranGetSubFrameNum(tti, 2, 10);
|
||||
uint32_t is_prach_slot = xran_is_prach_slot(subframe, (slot % 2));
|
||||
int sym_idx = 0;
|
||||
|
||||
struct xran_prach_cp_config *pPrachCPConfig = &(p_xran_dev_ctx_2->PrachCPConfig);
|
||||
|
||||
/* If it is PRACH slot, copy prach IQ from XRAN PRACH buffer to OAI PRACH buffer */
|
||||
if(is_prach_slot) {
|
||||
for(sym_idx = 0; sym_idx < pPrachCPConfig->numSymbol; sym_idx++) {
|
||||
for (int aa=0;aa<ru->nb_rx;aa++) {
|
||||
mb = (struct rte_mbuf *) p_xran_dev_ctx_2->sFHPrachRxBbuIoBufCtrl[tti % 40][0][aa].sBufferList.pBuffers[sym_idx].pCtrl;
|
||||
if(mb) {
|
||||
uint16_t *dst, *src;
|
||||
int idx = 0;
|
||||
dst = (uint16_t * )((uint8_t *)ru->prach_buf[aa]);// + (sym_idx*576));
|
||||
src = (uint16_t *) ((uint8_t *) p_xran_dev_ctx_2->sFHPrachRxBbuIoBufCtrl[tti % 40][0][aa].sBufferList.pBuffers[sym_idx].pData);
|
||||
|
||||
/* convert Network order to host order */
|
||||
if (sym_idx==0) {
|
||||
for (idx = 0; idx < 576/2; idx++)
|
||||
{
|
||||
((int16_t*)dst)[idx] = ((int16_t)ntohs(src[idx]))>>2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (idx = 0; idx < 576/2; idx++)
|
||||
{
|
||||
((int16_t*)dst)[idx] += ((int16_t)ntohs(src[idx]))>>2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
/* TODO: Unlikely this code never gets executed */
|
||||
printf("%s():%d, There is no prach ctrl data for symb %d ant %d\n", __func__, __LINE__, sym_idx,aa);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int xran_fh_rx_read_slot(void *xranlib_, ru_info_t *ru, int *frame, int *slot, int oframe, int oslot, uint8_t sync){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
|
||||
void *ptr = NULL;
|
||||
int32_t *pos = NULL;
|
||||
int idx = 0;
|
||||
static int print_tmp = 1;
|
||||
static int print_tmp_1 = 1;
|
||||
|
||||
while (first_call_set != 1){
|
||||
if (print_tmp) {
|
||||
print_tmp = 0;
|
||||
printf("wait in ru_thread() till first_call_set is set in xran\n");
|
||||
}
|
||||
}
|
||||
|
||||
while (first_rx_set != 1){
|
||||
if (print_tmp_1) {
|
||||
print_tmp_1 = 0;
|
||||
printf("wait in ru_thread for first_rx_set to set in xran\n");
|
||||
}
|
||||
}
|
||||
|
||||
volatile uint32_t prev_rx_cb_tti;
|
||||
int tti;
|
||||
|
||||
prev_rx_cb_tti = rx_cb_tti;
|
||||
*frame = rx_cb_frame;
|
||||
*slot = (rx_cb_subframe*2)+rx_cb_slot;
|
||||
tti = (*frame*20) + *slot;
|
||||
|
||||
while (rx_cb_tti == prev_rx_cb_tti) {
|
||||
}
|
||||
|
||||
|
||||
read_prach_data(ru, *frame, *slot);
|
||||
p_xran_dev_ctx_2 = xran_dev_get_ctx();
|
||||
|
||||
int num_eaxc = xranlib->get_num_eaxc();
|
||||
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
|
||||
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
|
||||
|
||||
int slot_offset_rxdata = 3&(*slot);
|
||||
uint32_t slot_size = 4*14*4096;
|
||||
uint8_t *rx_data = (uint8_t *)ru->rxdataF[0];
|
||||
uint8_t *start_ptr = NULL;
|
||||
for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet.
|
||||
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_rx; ant_id++){
|
||||
rx_data = (uint8_t *)ru->rxdataF[ant_id];
|
||||
start_ptr = rx_data + (slot_size*slot_offset_rxdata);
|
||||
// This loop would better be more inner to avoid confusion and maybe also errors.
|
||||
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
|
||||
|
||||
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
|
||||
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
|
||||
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
|
||||
ptr = pData;
|
||||
pos = (int32_t *)(start_ptr + (4*sym_idx*4096));
|
||||
|
||||
uint8_t *u8dptr;
|
||||
struct xran_prb_map *pRbMap = pPrbMap;
|
||||
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
|
||||
if(ptr && pos){
|
||||
uint32_t idxElm = 0;
|
||||
u8dptr = (uint8_t*)ptr;
|
||||
int16_t payload_len = 0;
|
||||
|
||||
uint8_t *src = (uint8_t *)u8dptr;
|
||||
// first half
|
||||
uint8_t *src1 = (uint8_t *)u8dptr;
|
||||
uint8_t *dst1 = (uint8_t *)pos;
|
||||
// second half
|
||||
uint8_t *src2 = (uint8_t *)u8dptr;
|
||||
uint8_t *dst2 = (uint8_t *)pos;
|
||||
|
||||
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
|
||||
|
||||
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
|
||||
struct xran_section_desc *p_sec_desc = NULL;
|
||||
p_prbMapElm = &pRbMap->prbMap[idxElm];
|
||||
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
|
||||
|
||||
if(pRbMap->nPrbElm==1 && idxElm==0){
|
||||
src = pData;
|
||||
}
|
||||
else if(p_sec_desc->pData==NULL){
|
||||
return -1;
|
||||
}else{
|
||||
src = p_sec_desc->pData;
|
||||
}
|
||||
|
||||
src2 = src;
|
||||
|
||||
if(p_sec_desc == NULL){
|
||||
printf ("p_sec_desc == NULL\n");
|
||||
exit(-1);
|
||||
}
|
||||
// Calculation of the pointer for the section in the buffer.
|
||||
// first half
|
||||
dst1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB);
|
||||
// second half
|
||||
dst2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 3276/2) + 4096 - 3276);
|
||||
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
|
||||
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
|
||||
src1 = src2 + payload_len/2;
|
||||
for (idx = 0; idx < payload_len/(2*sizeof(int16_t)); idx++) {
|
||||
((int16_t *)dst1)[idx] = ((int16_t)ntohs(((uint16_t *)src1)[idx]))>>2;
|
||||
((int16_t *)dst2)[idx] = ((int16_t)ntohs(((uint16_t *)src2)[idx]))>>2;
|
||||
}
|
||||
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
|
||||
struct xranlib_decompress_request bfp_decom_req_2;
|
||||
struct xranlib_decompress_response bfp_decom_rsp_2;
|
||||
struct xranlib_decompress_request bfp_decom_req_1;
|
||||
struct xranlib_decompress_response bfp_decom_rsp_1;
|
||||
|
||||
|
||||
payload_len = (3* p_prbMapElm->iqWidth + 1)*p_prbMapElm->nRBSize;
|
||||
|
||||
memset(&bfp_decom_req_2, 0, sizeof(struct xranlib_decompress_request));
|
||||
memset(&bfp_decom_rsp_2, 0, sizeof(struct xranlib_decompress_response));
|
||||
memset(&bfp_decom_req_1, 0, sizeof(struct xranlib_decompress_request));
|
||||
memset(&bfp_decom_rsp_1, 0, sizeof(struct xranlib_decompress_response));
|
||||
|
||||
bfp_decom_req_2.data_in = (int8_t*)src2;
|
||||
bfp_decom_req_2.numRBs = p_prbMapElm->nRBSize/2;
|
||||
bfp_decom_req_2.len = payload_len/2;
|
||||
bfp_decom_req_2.compMethod = p_prbMapElm->compMethod;
|
||||
bfp_decom_req_2.iqWidth = p_prbMapElm->iqWidth;
|
||||
|
||||
bfp_decom_rsp_2.data_out = (int16_t*)dst2;
|
||||
bfp_decom_rsp_2.len = 0;
|
||||
|
||||
xranlib_decompress_avx512(&bfp_decom_req_2, &bfp_decom_rsp_2);
|
||||
|
||||
int16_t first_half_len = bfp_decom_rsp_2.len;
|
||||
src1 = src2+(payload_len/2);
|
||||
|
||||
bfp_decom_req_1.data_in = (int8_t*)src1;
|
||||
bfp_decom_req_1.numRBs = p_prbMapElm->nRBSize/2;
|
||||
bfp_decom_req_1.len = payload_len/2;
|
||||
bfp_decom_req_1.compMethod = p_prbMapElm->compMethod;
|
||||
bfp_decom_req_1.iqWidth = p_prbMapElm->iqWidth;
|
||||
|
||||
bfp_decom_rsp_1.data_out = (int16_t*)dst1;
|
||||
bfp_decom_rsp_1.len = 0;
|
||||
|
||||
xranlib_decompress_avx512(&bfp_decom_req_1, &bfp_decom_rsp_1);
|
||||
payload_len = bfp_decom_rsp_1.len+first_half_len;
|
||||
}else {
|
||||
printf ("p_prbMapElm->compMethod == %d is not supported\n",
|
||||
p_prbMapElm->compMethod);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
exit(-1);
|
||||
printf("ptr ==NULL\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int xran_fh_tx_send_slot(void *xranlib_, ru_info_t *ru, int frame, int slot, uint64_t timestamp){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
|
||||
|
||||
int tti = /*frame*SUBFRAMES_PER_SYSTEMFRAME*SLOTNUM_PER_SUBFRAME+*/20*frame+slot; //commented out temporarily to check that compilation of oran 5g is working.
|
||||
|
||||
void *ptr = NULL;
|
||||
int32_t *pos = NULL;
|
||||
int idx = 0;
|
||||
|
||||
p_xran_dev_ctx_2 = xran_dev_get_ctx();
|
||||
#if 0
|
||||
if (p_xran_dev_ctx_2 != NULL){
|
||||
printf("p_xran_dev_ctx_2=%d\n",p_xran_dev_ctx_2);
|
||||
}
|
||||
#endif
|
||||
|
||||
int num_eaxc = xranlib->get_num_eaxc();
|
||||
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
|
||||
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
|
||||
/*
|
||||
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
|
||||
{
|
||||
nSectorIndex[nSectorNum] = nSectorNum;
|
||||
}
|
||||
*/
|
||||
|
||||
for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet.
|
||||
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_tx; ant_id++){
|
||||
// This loop would better be more inner to avoid confusion and maybe also errors.
|
||||
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
|
||||
|
||||
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
|
||||
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
|
||||
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
|
||||
ptr = pData;
|
||||
pos = &ru->txdataF_BF[ant_id][sym_idx * 4096 /*fp->ofdm_symbol_size*/]; // We had to use a different ru structure than benetel so the access to the buffer is not the same.
|
||||
|
||||
uint8_t *u8dptr;
|
||||
struct xran_prb_map *pRbMap = pPrbMap;
|
||||
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
|
||||
if(ptr && pos){
|
||||
uint32_t idxElm = 0;
|
||||
u8dptr = (uint8_t*)ptr;
|
||||
int16_t payload_len = 0;
|
||||
|
||||
uint8_t *dst = (uint8_t *)u8dptr;
|
||||
// first half
|
||||
uint8_t *dst1 = (uint8_t *)u8dptr;
|
||||
uint8_t *src1 = (uint8_t *)pos;
|
||||
// second half
|
||||
uint8_t *dst2 = (uint8_t *)u8dptr;
|
||||
uint8_t *src2 = (uint8_t *)pos;
|
||||
|
||||
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
|
||||
|
||||
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
|
||||
struct xran_section_desc *p_sec_desc = NULL;
|
||||
p_prbMapElm = &pRbMap->prbMap[idxElm];
|
||||
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
|
||||
|
||||
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
|
||||
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
|
||||
dst2 = dst;
|
||||
dst1 = dst2 + payload_len/2;
|
||||
|
||||
if(p_sec_desc == NULL){
|
||||
printf ("p_sec_desc == NULL\n");
|
||||
exit(-1);
|
||||
}
|
||||
// Calculation of the pointer for the section in the buffer.
|
||||
// first half
|
||||
src1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB);
|
||||
// second half
|
||||
src2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 3276/2) + 4096 - 3276);
|
||||
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
|
||||
/* convert to Network order */
|
||||
for (idx = 0; idx < payload_len/(2*sizeof(uint16_t)); idx++)
|
||||
{
|
||||
((uint16_t *)dst1)[idx] = htons(((uint16_t *)src1)[idx]);
|
||||
((uint16_t *)dst2)[idx] = htons(((uint16_t *)src2)[idx]);
|
||||
}
|
||||
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
|
||||
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
|
||||
struct xranlib_compress_request bfp_com_req;
|
||||
struct xranlib_compress_response bfp_com_rsp;
|
||||
|
||||
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
|
||||
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
|
||||
|
||||
bfp_com_req.data_in = (int16_t*)src2;
|
||||
bfp_com_req.numRBs = p_prbMapElm->nRBSize/2;
|
||||
bfp_com_req.len = payload_len/2;
|
||||
bfp_com_req.compMethod = p_prbMapElm->compMethod;
|
||||
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
|
||||
|
||||
bfp_com_rsp.data_out = (int8_t*)dst2;
|
||||
bfp_com_rsp.len = 0;
|
||||
|
||||
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
|
||||
|
||||
int16_t first_half_len = bfp_com_rsp.len;
|
||||
|
||||
dst1 = dst2 + first_half_len;
|
||||
|
||||
bfp_com_req.data_in = (int16_t*)src1;
|
||||
bfp_com_req.numRBs = p_prbMapElm->nRBSize/2;
|
||||
bfp_com_req.len = payload_len/2;
|
||||
bfp_com_req.compMethod = p_prbMapElm->compMethod;
|
||||
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
|
||||
|
||||
bfp_com_rsp.data_out = (int8_t*)dst1;
|
||||
bfp_com_rsp.len = 0;
|
||||
|
||||
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
|
||||
payload_len = bfp_com_rsp.len+first_half_len;
|
||||
}else {
|
||||
printf ("p_prbMapElm->compMethod == %d is not supported\n",
|
||||
p_prbMapElm->compMethod);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr);
|
||||
p_sec_desc->iq_buffer_len = payload_len;
|
||||
|
||||
dst += payload_len;
|
||||
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
|
||||
}
|
||||
|
||||
// The tti should be updated as it increased.
|
||||
pRbMap->tti_id = tti;
|
||||
|
||||
} else {
|
||||
exit(-1);
|
||||
printf("ptr ==NULL\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
int64_t count_sec =0;
|
||||
struct xran_common_counters x_counters;
|
||||
uint64_t nTotalTime;
|
||||
uint64_t nUsedTime;
|
||||
uint32_t nCoreUsed;
|
||||
float nUsedPercent;
|
||||
uint64_t old_rx_counter = 0;
|
||||
uint64_t old_tx_counter = 0;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int compute_xran_statistics(void *xranlib_){
|
||||
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
|
||||
|
||||
if(xran_get_common_counters(xranlib->get_xranhandle(), &x_counters) == XRAN_STATUS_SUCCESS) {
|
||||
xran_get_time_stats(&nTotalTime, &nUsedTime, &nCoreUsed, 1);
|
||||
nUsedPercent = ((float)nUsedTime * 100.0) / (float)nTotalTime;
|
||||
|
||||
printf("[rx %7ld pps %7ld kbps %7ld][tx %7ld pps %7ld kbps %7ld] [on_time %ld early %ld late %ld corrupt %ld pkt_dupl %ld Total %ld] IO Util: %5.2f %%\n",
|
||||
x_counters.rx_counter,
|
||||
x_counters.rx_counter-old_rx_counter,
|
||||
x_counters.rx_bytes_per_sec*8/1000L,
|
||||
x_counters.tx_counter,
|
||||
x_counters.tx_counter-old_tx_counter,
|
||||
x_counters.tx_bytes_per_sec*8/1000L,
|
||||
x_counters.Rx_on_time,
|
||||
x_counters.Rx_early,
|
||||
x_counters.Rx_late,
|
||||
x_counters.Rx_corrupt,
|
||||
x_counters.Rx_pkt_dupl,
|
||||
x_counters.Total_msgs_rcvd,
|
||||
nUsedPercent);
|
||||
|
||||
if(x_counters.rx_counter > old_rx_counter)
|
||||
old_rx_counter = x_counters.rx_counter;
|
||||
if(x_counters.tx_counter > old_tx_counter)
|
||||
old_tx_counter = x_counters.tx_counter;
|
||||
} else {
|
||||
printf("error xran_get_common_counters\n");
|
||||
return(1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
void check_xran_ptp_sync(){
|
||||
int res;
|
||||
if ((res=xran_is_synchronized()) != 0)
|
||||
printf("Machine is not synchronized using PTP (%x)!\n",res);
|
||||
else
|
||||
printf("Machine is synchronized using PTP!\n");
|
||||
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
48
radio/ETHERNET/oran/5g/oran.h
Normal file
48
radio/ETHERNET/oran/5g/oran.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* * 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
|
||||
* */
|
||||
|
||||
#ifndef _ORAN_H_
|
||||
#define _ORAN_H_
|
||||
|
||||
#include "shared_buffers.h"
|
||||
#include "common_lib.h"
|
||||
void oran_fh_if4p5_south_out(RU_t *ru,
|
||||
int frame,
|
||||
int slot,
|
||||
uint64_t timestamp);
|
||||
|
||||
void oran_fh_if4p5_south_in(RU_t *ru,
|
||||
int *frame,
|
||||
int *slot);
|
||||
|
||||
int transport_init(openair0_device *device,
|
||||
openair0_config_t *openair0_cfg,
|
||||
eth_params_t * eth_params );
|
||||
|
||||
|
||||
typedef struct {
|
||||
eth_state_t e;
|
||||
shared_buffers buffers;
|
||||
rru_config_msg_type_t last_msg;
|
||||
int capabilities_sent;
|
||||
void *oran_priv;
|
||||
} oran_eth_state_t;
|
||||
#endif /* _ORAN_H_ */
|
||||
363
radio/ETHERNET/oran/5g/oran_isolate.c
Normal file
363
radio/ETHERNET/oran/5g/oran_isolate.c
Normal file
@@ -0,0 +1,363 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include "common_lib.h"
|
||||
#include "ethernet_lib.h"
|
||||
#include "oran_isolate.h"
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "openair1/PHY/defs_gNB.h"
|
||||
|
||||
typedef struct {
|
||||
eth_state_t e;
|
||||
rru_config_msg_type_t last_msg;
|
||||
int capabilities_sent;
|
||||
void *oran_priv;
|
||||
} oran_eth_state_t;
|
||||
|
||||
|
||||
int trx_oran_start(openair0_device *device)
|
||||
{
|
||||
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
|
||||
oran_eth_state_t *s = device->priv;
|
||||
|
||||
// Start ORAN
|
||||
if ( start_oran(s->oran_priv) !=0 ){
|
||||
printf("%s:%d:%s: Start ORAN failed ... Exit\n",
|
||||
__FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}else{
|
||||
printf("Start ORAN. Done\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void trx_oran_end(openair0_device *device)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
oran_eth_state_t *s = device->priv;
|
||||
stop_oran(s->oran_priv);
|
||||
close_oran(s->oran_priv);
|
||||
}
|
||||
|
||||
|
||||
int trx_oran_stop(openair0_device *device)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
oran_eth_state_t *s = device->priv;
|
||||
stop_oran(s->oran_priv);
|
||||
return(0);
|
||||
}
|
||||
|
||||
int trx_oran_set_freq(openair0_device* device,
|
||||
openair0_config_t *openair0_cfg,
|
||||
int exmimo_dump_config)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
return(0);
|
||||
}
|
||||
|
||||
int trx_oran_set_gains(openair0_device* device,
|
||||
openair0_config_t *openair0_cfg)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
return(0);
|
||||
}
|
||||
|
||||
int trx_oran_get_stats(openair0_device* device)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int trx_oran_reset_stats(openair0_device* device)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
return(0);
|
||||
}
|
||||
|
||||
int ethernet_tune(openair0_device *device,
|
||||
unsigned int option,
|
||||
int value)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int trx_oran_write_raw(openair0_device *device,
|
||||
openair0_timestamp timestamp,
|
||||
void **buff, int nsamps, int cc, int flags)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int trx_oran_read_raw(openair0_device *device,
|
||||
openair0_timestamp *timestamp,
|
||||
void **buff, int nsamps, int cc)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *msg_type(int t)
|
||||
{
|
||||
static char *s[12] = {
|
||||
"RAU_tick",
|
||||
"RRU_capabilities",
|
||||
"RRU_config",
|
||||
"RRU_config_ok",
|
||||
"RRU_start",
|
||||
"RRU_stop",
|
||||
"RRU_sync_ok",
|
||||
"RRU_frame_resynch",
|
||||
"RRU_MSG_max_num",
|
||||
"RRU_check_sync",
|
||||
"RRU_config_update",
|
||||
"RRU_config_update_ok",
|
||||
};
|
||||
|
||||
if (t < 0 || t > 11) return "UNKNOWN";
|
||||
return s[t];
|
||||
}
|
||||
|
||||
int trx_oran_ctlsend(openair0_device *device, void *msg, ssize_t msg_len)
|
||||
{
|
||||
RRU_CONFIG_msg_t *rru_config_msg = msg;
|
||||
oran_eth_state_t *s = device->priv;
|
||||
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
|
||||
printf(" rru_config_msg->type %d [%s]\n", rru_config_msg->type,
|
||||
msg_type(rru_config_msg->type));
|
||||
|
||||
s->last_msg = rru_config_msg->type;
|
||||
|
||||
return msg_len;
|
||||
}
|
||||
|
||||
int trx_oran_ctlrecv(openair0_device *device, void *msg, ssize_t msg_len)
|
||||
{
|
||||
RRU_CONFIG_msg_t *rru_config_msg = msg;
|
||||
oran_eth_state_t *s = device->priv;
|
||||
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
|
||||
if (s->last_msg == RAU_tick && s->capabilities_sent == 0) {
|
||||
printf("ORAN ctrlrcv RRU_tick received and send capabilities hard coded\n");
|
||||
RRU_capabilities_t *cap;
|
||||
rru_config_msg->type = RRU_capabilities;
|
||||
rru_config_msg->len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
|
||||
// Fill RRU capabilities (see openair1/PHY/defs_RU.h)
|
||||
// For now they are hard coded - try to retreive the params from openari device
|
||||
|
||||
cap = (RRU_capabilities_t*)&rru_config_msg->msg[0];
|
||||
cap->FH_fmt = OAI_IF4p5_only;
|
||||
cap->num_bands = 1;
|
||||
cap->band_list[0] = 78;
|
||||
// cap->num_concurrent_bands = 1; component carriers
|
||||
cap->nb_rx[0] = 1; //device->openair0_cfg->rx_num_channels;
|
||||
cap->nb_tx[0] = 1; //device->openair0_cfg->tx_num_channels;
|
||||
cap->max_pdschReferenceSignalPower[0] = -27;
|
||||
cap->max_rxgain[0] = 90;
|
||||
cap->N_RB_DL[0] = 106;
|
||||
cap->N_RB_UL[0] = 106;
|
||||
|
||||
s->capabilities_sent = 1;
|
||||
|
||||
return rru_config_msg->len;
|
||||
}
|
||||
if (s->last_msg == RRU_config) {
|
||||
printf("Oran RRU_config\n");
|
||||
rru_config_msg->type = RRU_config_ok;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void oran_fh_if4p5_south_in(RU_t *ru,
|
||||
int *frame,
|
||||
int *slot)
|
||||
{
|
||||
oran_eth_state_t *s = ru->ifdevice.priv;
|
||||
int symbol;
|
||||
int32_t *rxdata;
|
||||
int antenna;
|
||||
static uint8_t sync = 0;
|
||||
|
||||
ru_info_t ru_info;
|
||||
ru_info.nb_rx = ru->nb_rx;
|
||||
ru_info.rxdataF = ru->common.rxdataF;
|
||||
ru_info.prach_buf = (int *)ru->prach_rxsigF[0];//index: [prach_oca][ant_id]
|
||||
|
||||
RU_proc_t *proc = &ru->proc;
|
||||
extern uint16_t sl_ahead;
|
||||
int f, sl;
|
||||
|
||||
int ret = xran_fh_rx_read_slot(s->oran_priv, &ru_info, &f, &sl, *frame, *slot, sync);
|
||||
|
||||
if (ret != 0){
|
||||
printf("ORAN: ORAN_fh_if4p5_south_in ERROR in RX function \n");
|
||||
}
|
||||
|
||||
proc->tti_rx = sl;
|
||||
proc->frame_rx = f;
|
||||
proc->tti_tx = (sl+sl_ahead)%20;
|
||||
proc->frame_tx = (sl>(19-sl_ahead)) ? (f+1)&1023 : f;
|
||||
if (proc->first_rx == 0) {
|
||||
if (proc->tti_rx != *slot) {
|
||||
LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx.proc->tti_rx %d.%d, slot %d)\n",proc->frame_rx,proc->tti_rx,*slot);
|
||||
*slot = proc->tti_rx;
|
||||
}
|
||||
|
||||
if (proc->frame_rx != *frame) {
|
||||
LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d proc->tti_rx %d tti %d)\n",proc->frame_rx,*frame,proc->tti_rx,*slot);
|
||||
*frame=proc->frame_rx;
|
||||
}
|
||||
} else {
|
||||
proc->first_rx = 0;
|
||||
LOG_I(PHY, "before adjusting, OAI: frame=%d slot=%d, XRAN: frame=%d slot=%d\n",*frame,*slot,proc->frame_rx,proc->tti_rx);
|
||||
*frame = proc->frame_rx;
|
||||
*slot = proc->tti_rx;
|
||||
LOG_I(PHY, "After adjusting, OAI: frame=%d slot=%d, XRAN: frame=%d slot=%d\n",*frame,*slot,proc->frame_rx,proc->tti_rx);
|
||||
}
|
||||
|
||||
sync = 1;
|
||||
}
|
||||
|
||||
void oran_fh_if4p5_south_out(RU_t *ru,
|
||||
int frame,
|
||||
int slot,
|
||||
uint64_t timestamp)
|
||||
{
|
||||
openair0_device *device = &ru->ifdevice;
|
||||
oran_eth_state_t *s = device->priv;
|
||||
|
||||
ru_info_t ru_info;
|
||||
ru_info.nb_tx = ru->nb_tx;
|
||||
ru_info.txdataF_BF = ru->common.txdataF_BF;
|
||||
//printf("south_out:\tframe=%d\tslot=%d\ttimestamp=%ld\n",frame,slot,timestamp);
|
||||
|
||||
int ret = xran_fh_tx_send_slot(s->oran_priv, &ru_info, frame, slot, timestamp);
|
||||
if (ret != 0){
|
||||
printf("ORAN: ORAN_fh_if4p5_south_out ERROR in TX function \n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void *get_internal_parameter(char *name)
|
||||
{
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
|
||||
if (!strcmp(name, "fh_if4p5_south_in"))
|
||||
return (void *) oran_fh_if4p5_south_in;
|
||||
if (!strcmp(name, "fh_if4p5_south_out"))
|
||||
return (void *) oran_fh_if4p5_south_out;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
__attribute__((__visibility__("default")))
|
||||
int transport_init(openair0_device *device,
|
||||
openair0_config_t *openair0_cfg,
|
||||
eth_params_t * eth_params )
|
||||
{
|
||||
oran_eth_state_t *eth;
|
||||
|
||||
|
||||
device->Mod_id = 0;
|
||||
device->transp_type = ETHERNET_TP;
|
||||
device->trx_start_func = trx_oran_start;
|
||||
device->trx_get_stats_func = trx_oran_get_stats;
|
||||
device->trx_reset_stats_func = trx_oran_reset_stats;
|
||||
device->trx_end_func = trx_oran_end;
|
||||
device->trx_stop_func = trx_oran_stop;
|
||||
device->trx_set_freq_func = trx_oran_set_freq;
|
||||
device->trx_set_gains_func = trx_oran_set_gains;
|
||||
|
||||
device->trx_write_func = trx_oran_write_raw;
|
||||
device->trx_read_func = trx_oran_read_raw;
|
||||
|
||||
device->trx_ctlsend_func = trx_oran_ctlsend;
|
||||
device->trx_ctlrecv_func = trx_oran_ctlrecv;
|
||||
|
||||
|
||||
device->get_internal_parameter = get_internal_parameter;
|
||||
|
||||
eth = (oran_eth_state_t *)calloc(1, sizeof(oran_eth_state_t));
|
||||
if (eth == NULL) {
|
||||
AssertFatal(0==1, "out of memory\n");
|
||||
}
|
||||
|
||||
eth->e.flags = ETH_RAW_IF4p5_MODE;
|
||||
eth->e.compression = NO_COMPRESS;
|
||||
eth->e.if_name = eth_params->local_if_name;
|
||||
eth->oran_priv = define_oran_pointer();
|
||||
device->priv = eth;
|
||||
device->openair0_cfg=&openair0_cfg[0];
|
||||
|
||||
eth->last_msg = (rru_config_msg_type_t)-1;
|
||||
|
||||
oran_eth_state_t *s = eth;
|
||||
|
||||
printf("ORAN: %s\n", __FUNCTION__);
|
||||
|
||||
// Check if the machine is PTP sync
|
||||
check_xran_ptp_sync();
|
||||
|
||||
// SetUp
|
||||
if ( setup_oran(s->oran_priv) !=0 ){
|
||||
printf("%s:%d:%s: SetUp ORAN failed ... Exit\n",
|
||||
__FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}else{
|
||||
printf("SetUp ORAN. Done\n");
|
||||
}
|
||||
|
||||
// Dump ORAN config
|
||||
dump_oran_config(s->oran_priv);
|
||||
|
||||
// Register physide callbacks
|
||||
register_physide_callbacks(s->oran_priv);
|
||||
printf("Register physide callbacks. Done\n");
|
||||
|
||||
// Open callbacks
|
||||
open_oran_callback(s->oran_priv);
|
||||
printf("Open Oran callbacks. Done\n");
|
||||
|
||||
// Init ORAN
|
||||
initialize_oran(s->oran_priv);
|
||||
printf("Init Oran. Done\n");
|
||||
|
||||
// Open ORAN
|
||||
open_oran(s->oran_priv);
|
||||
printf("xran_open. Done\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
205
radio/ETHERNET/oran/5g/oran_isolate.h
Normal file
205
radio/ETHERNET/oran/5g/oran_isolate.h
Normal file
@@ -0,0 +1,205 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _ORAN_ISOLATE_H_
|
||||
#define _ORAN_ISOLATE_H_
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* Structure added to bear the information needed from OAI RU
|
||||
*/
|
||||
typedef struct ru_info_s{
|
||||
|
||||
// Needed for UL
|
||||
int nb_rx;
|
||||
int32_t **rxdataF;
|
||||
|
||||
// Needed for DL
|
||||
int nb_tx;
|
||||
int32_t **txdataF_BF;
|
||||
|
||||
// Needed for Prach
|
||||
int **prach_buf;
|
||||
} ru_info_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void* define_oran_pointer();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
void dump_oran_config( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int setup_oran( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int open_oran_callback( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int open_oran( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int initialize_oran( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int start_oran( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int stop_oran( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int close_oran( void *xranlib_ );
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int register_physide_callbacks(void *xranlib_);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int load_iq_from_file(void *xranlib_);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int xran_fh_rx_read_slot(void *xranlib_, ru_info_t *ru, int *frame, int *slot, int oframe, int oslot, uint8_t sync);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int xran_fh_tx_send_buffer(void *xranlib_);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int xran_fh_tx_send_slot(void *xranlib_, ru_info_t *ru, int frame, int slot, uint64_t timestamp);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int compute_xran_statistics(void *xranlib_);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
void check_xran_ptp_sync();
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ORAN_ISOLATE_H_ */
|
||||
1230
radio/ETHERNET/oran/5g/xran_lib_wrap.cpp
Normal file
1230
radio/ETHERNET/oran/5g/xran_lib_wrap.cpp
Normal file
File diff suppressed because it is too large
Load Diff
282
radio/ETHERNET/oran/5g/xran_lib_wrap.hpp
Normal file
282
radio/ETHERNET/oran/5g/xran_lib_wrap.hpp
Normal file
@@ -0,0 +1,282 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* <COPYRIGHT_TAG>
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef XRAN_LIB_WRAP_HPP
|
||||
#define XRAN_LIB_WRAP_HPP
|
||||
|
||||
#include <exception>
|
||||
#include <random>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <malloc.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "common.hpp"
|
||||
#include "xran_fh_o_du.h"
|
||||
#include "xran_common.h"
|
||||
#include "xran_frame_struct.h"
|
||||
|
||||
|
||||
#define XRAN_UT_CFG_FILENAME "conf.json"
|
||||
|
||||
#define XRAN_UT_KEY_GLOBALCFG "GLOBAL"
|
||||
#define XRAN_UT_KEY_GLOBALCFG_IO "io_cfg"
|
||||
#define XRAN_UT_KEY_GLOBALCFG_EAXCID "eAxCId_cfg"
|
||||
#define XRAN_UT_KEY_GLOBALCFG_PRACH "prach_cfg"
|
||||
#define XRAN_UT_KEY_GLOBALCFG_RU "ru_cfg"
|
||||
#define XRAN_UT_KEY_GLOBALCFG_SLOT "slotcfg_"
|
||||
|
||||
#define MAX_NUM_OF_XRAN_CTX (2)
|
||||
|
||||
#define SW_FPGA_TOTAL_BUFFER_LEN (4*1024*1024*1024)
|
||||
#define SW_FPGA_SEGMENT_BUFFER_LEN (1*1024*1024*1024)
|
||||
#define SW_FPGA_FH_TOTAL_BUFFER_LEN (1*1024*1024*1024)
|
||||
#define FPGA_TO_SW_PRACH_RX_BUFFER_LEN (8192)
|
||||
|
||||
#define MAX_ANT_CARRIER_SUPPORTED (XRAN_MAX_SECTOR_NR*XRAN_MAX_ANTENNA_NR)
|
||||
|
||||
enum xran_in_period
|
||||
{
|
||||
XRAN_IN_PREV_PERIOD = 0,
|
||||
XRAN_IN_CURR_PERIOD,
|
||||
XRAN_IN_NEXT_PERIOD
|
||||
};
|
||||
extern "C"
|
||||
{
|
||||
extern uint32_t xran_lib_ota_tti;
|
||||
extern uint32_t xran_lib_ota_sym;
|
||||
extern uint32_t xran_lib_ota_sym_idx;
|
||||
extern uint32_t xran_SFN_at_Sec_Start;
|
||||
|
||||
void sym_ota_cb(struct rte_timer *tim, void *arg);
|
||||
void tti_ota_cb(struct rte_timer *tim, void *arg);
|
||||
}
|
||||
|
||||
class xranLibWraper
|
||||
{
|
||||
public:
|
||||
typedef enum
|
||||
{
|
||||
XRANFTHTX_OUT = 0,
|
||||
XRANFTHTX_PRB_MAP_OUT,
|
||||
XRANFTHTX_SEC_DESC_OUT,
|
||||
XRANFTHRX_IN,
|
||||
XRANFTHRX_PRB_MAP_IN,
|
||||
XRANFTHTX_SEC_DESC_IN,
|
||||
XRANFTHRACH_IN,
|
||||
XRANSRS_IN,
|
||||
MAX_SW_XRAN_INTERFACE_NUM
|
||||
} SWXRANInterfaceTypeEnum;
|
||||
|
||||
enum nChBw
|
||||
{
|
||||
PHY_BW_5MHZ = 5, PHY_BW_10MHZ = 10, PHY_BW_15MHZ = 15,
|
||||
PHY_BW_20MHZ = 20, PHY_BW_25MHZ = 25, PHY_BW_30MHZ = 30,
|
||||
PHY_BW_40MHZ = 40, PHY_BW_50MHZ = 50, PHY_BW_60MHZ = 60,
|
||||
PHY_BW_70MHZ = 70, PHY_BW_80MHZ = 80, PHY_BW_90MHZ = 90,
|
||||
PHY_BW_100MHZ = 100, PHY_BW_200MHZ = 200, PHY_BW_400MHZ = 400
|
||||
};
|
||||
|
||||
// F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
|
||||
const uint16_t nNumRbsPerSymF1[3][13] =
|
||||
{
|
||||
// 5MHz 10MHz 15MHz 20MHz 25MHz 30MHz 40MHz 50MHz 60MHz 70MHz 80MHz 90MHz 100MHz
|
||||
{ 25, 52, 79, 106, 133, 160, 216, 270, 0, 0, 0, 0, 0 }, // Numerology 0 (15KHz)
|
||||
{ 11, 24, 38, 51, 65, 78, 106, 133, 162, 0, 217, 245, 273 }, // Numerology 1 (30KHz)
|
||||
{ 0, 11, 18, 24, 31, 38, 51, 65, 79, 0, 107, 121, 135 } // Numerology 2 (60KHz)
|
||||
};
|
||||
|
||||
// F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
|
||||
const uint16_t nNumRbsPerSymF2[2][4] =
|
||||
{
|
||||
// 50MHz 100MHz 200MHz 400MHz
|
||||
{ 66, 132, 264, 0 }, // Numerology 2 (60KHz)
|
||||
{ 32, 66, 132, 264 } // Numerology 3 (120KHz)
|
||||
};
|
||||
|
||||
|
||||
protected:
|
||||
char argv[25] = {'u','n','i','t','t','e','s','t','\0'};
|
||||
//char argv[25] = "unittest";
|
||||
|
||||
std::string m_dpdk_dev_up, m_dpdk_dev_cp, m_dpdk_bbdev;
|
||||
|
||||
void *m_xranhandle;
|
||||
|
||||
uint8_t m_du_mac[6]; // = { 0x00,0x11, 0x22, 0x33, 0x44, 0x55 }; // This is hard coded here and then it is read from the conf file
|
||||
uint8_t m_ru_mac[XRAN_VF_MAX][6]; //= { 0x00,0x11, 0x22, 0x33, 0x44, 0x66 }; // This is hard coded here and then it is read from the conf file
|
||||
bool m_bSub6;
|
||||
uint32_t m_nSlots; // = 20;
|
||||
|
||||
struct xran_fh_config m_xranConf;
|
||||
struct xran_fh_init m_xranInit;
|
||||
|
||||
struct xran_timer_ctx {
|
||||
uint32_t tti_to_process;
|
||||
} m_timer_ctx[MAX_NUM_OF_XRAN_CTX];
|
||||
|
||||
/* io struct */
|
||||
BbuIoBufCtrlStruct m_sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
|
||||
BbuIoBufCtrlStruct m_sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
|
||||
BbuIoBufCtrlStruct m_sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
|
||||
BbuIoBufCtrlStruct m_sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
|
||||
BbuIoBufCtrlStruct m_sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
|
||||
|
||||
|
||||
/* Cat B */
|
||||
BbuIoBufCtrlStruct m_sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR];
|
||||
|
||||
/* buffers lists */
|
||||
struct xran_flat_buffer m_sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
|
||||
struct xran_flat_buffer m_sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
|
||||
struct xran_flat_buffer m_sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
|
||||
struct xran_flat_buffer m_sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
|
||||
struct xran_flat_buffer m_sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
|
||||
|
||||
/* Cat B SRS buffers */
|
||||
struct xran_flat_buffer m_sFHSrsRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR][XRAN_MAX_NUM_OF_SRS_SYMBOL_PER_SLOT];
|
||||
|
||||
void *m_nInstanceHandle[XRAN_PORTS_NUM][XRAN_MAX_SECTOR_NR]; // instance per sector
|
||||
uint32_t m_nBufPoolIndex[XRAN_MAX_SECTOR_NR][MAX_SW_XRAN_INTERFACE_NUM]; // every api owns unique buffer pool
|
||||
|
||||
uint32_t m_nSW_ToFpga_FTH_TxBufferLen;
|
||||
uint32_t m_nFpgaToSW_FTH_RxBufferLen;
|
||||
|
||||
int32_t m_nSectorIndex[XRAN_MAX_SECTOR_NR];
|
||||
|
||||
int iq_bfw_buffer_size_dl = 0;
|
||||
int iq_bfw_buffer_size_ul = 0;
|
||||
|
||||
/* beamforming weights for UL (O-DU) */
|
||||
int16_t *p_tx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
|
||||
int32_t tx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
|
||||
int32_t tx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
|
||||
|
||||
/* beamforming weights for UL (O-DU) */
|
||||
int16_t *p_tx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
|
||||
int32_t tx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
|
||||
int32_t tx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
|
||||
|
||||
|
||||
private:
|
||||
json m_global_cfg;
|
||||
|
||||
template<typename T>
|
||||
T get_globalcfg(const std::string &type, const std::string ¶meter_name)
|
||||
{
|
||||
return m_global_cfg[XRAN_UT_KEY_GLOBALCFG][type][parameter_name];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
std::vector<T> get_globalcfg_array(const std::string &type, const std::string ¶meter_name)
|
||||
{
|
||||
auto array_size = m_global_cfg[XRAN_UT_KEY_GLOBALCFG][type][parameter_name].size();
|
||||
|
||||
std::vector<T> result(array_size);
|
||||
|
||||
for(unsigned number = 0; number < array_size; number++)
|
||||
result.at(number) = m_global_cfg[XRAN_UT_KEY_GLOBALCFG][type][parameter_name][number];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
uint16_t get_eaxcid_mask(int numbit, int shift);
|
||||
|
||||
int init_memory();
|
||||
|
||||
public:
|
||||
// Class constructor
|
||||
xranLibWraper();
|
||||
|
||||
// Class Distructor
|
||||
~xranLibWraper();
|
||||
|
||||
int SetUp();
|
||||
|
||||
void TearDown();
|
||||
|
||||
int Init(struct xran_fh_config *pCfg = nullptr);
|
||||
|
||||
void Cleanup();
|
||||
|
||||
void Open(xran_ethdi_mbuf_send_fn send_cp, xran_ethdi_mbuf_send_fn send_up,
|
||||
void *fh_rx_callback, void *fh_rx_prach_callback, void *fh_srs_callback);
|
||||
|
||||
void Close();
|
||||
|
||||
int Start();
|
||||
|
||||
int Stop();
|
||||
|
||||
/* emulation of timer */
|
||||
void update_tti();
|
||||
|
||||
void update_symbol_index();
|
||||
|
||||
int apply_cpenable(bool flag);
|
||||
|
||||
int get_slot_config(const std::string &cfgname, struct xran_frame_config *pCfg);
|
||||
|
||||
int get_num_rbs(uint32_t nNumerology, uint32_t nBandwidth, bool nSub6);
|
||||
|
||||
void *get_xranhandle();
|
||||
|
||||
void *get_timer_ctx();
|
||||
|
||||
int get_symbol_index();
|
||||
|
||||
int get_ota_tti();
|
||||
|
||||
int get_SFN_at_sec_start();
|
||||
|
||||
int get_symbol_offset(int32_t offSym, int32_t otaSym, int32_t numSymTotal, enum xran_in_period* pInPeriod);
|
||||
|
||||
bool is_running();
|
||||
|
||||
enum xran_category get_rucategory();
|
||||
|
||||
int get_numerology();
|
||||
|
||||
int get_duplextype();
|
||||
|
||||
uint32_t get_num_cc();
|
||||
|
||||
uint32_t get_num_eaxc();
|
||||
|
||||
uint32_t get_num_eaxc_ul();
|
||||
|
||||
uint32_t get_num_dlrbs();
|
||||
|
||||
uint32_t get_num_ulrbs();
|
||||
|
||||
uint32_t get_num_antelmtrx();
|
||||
|
||||
bool is_cpenable();
|
||||
|
||||
bool is_prachenable();
|
||||
|
||||
bool is_dynamicsection();
|
||||
|
||||
bool get_sub6();
|
||||
|
||||
void get_cfg_prach(struct xran_prach_config *pCfg);
|
||||
|
||||
void get_cfg_frame(struct xran_frame_config *pCfg);
|
||||
|
||||
void get_cfg_ru(struct xran_ru_config *pCfg);
|
||||
|
||||
void get_cfg_fh(struct xran_fh_config *pCfg);
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* external declaration for the instance */
|
||||
extern xranLibWraper *xranlib;
|
||||
|
||||
|
||||
#endif //XRAN_LIB_WRAP_HPP
|
||||
@@ -11,7 +11,7 @@ gNBs =
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; sd = 0x1; }) });
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
|
||||
@@ -0,0 +1,305 @@
|
||||
Active_gNBs = ( "gNB-OAI");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe00;
|
||||
gNB_name = "gNB-OAI";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({
|
||||
mcc = 001;
|
||||
mnc = 01;
|
||||
mnc_length = 2;
|
||||
snssaiList = (
|
||||
{
|
||||
sst = 1;
|
||||
#sd = 0x1; // 0 false, else true
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
|
||||
//nr_cellid = 12345678L;
|
||||
nr_cellid = 1;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pusch_AntennaPorts = 1;
|
||||
do_CSIRS = 1;
|
||||
min_rxtxtime = 4;
|
||||
sib1_tda = 15;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 11;
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
|
||||
absoluteFrequencySSB = 643392;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3300.24 MHz
|
||||
dl_absoluteFrequencyPointA = 642816;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 273;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
|
||||
initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1
|
||||
#
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 273;
|
||||
pMax = 23;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 1099;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 159;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 15;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 5;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 6;
|
||||
p0_NominalWithGrant = -96
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 0;
|
||||
p0_nominal = -76;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 0x1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 3;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 1;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "10.10.10.200";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "ens2f2";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "10.10.10.199/24";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "ens2f2";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "10.10.10.199/24";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 300;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
pusch_FailureThres = 1000;
|
||||
ulsch_max_frame_inactivity = 0;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120
|
||||
pucch0_dtx_threshold = 80;
|
||||
pusch_dtx_threshold = 10;
|
||||
max_ldpc_iterations = 6;
|
||||
#thread_pool_size = 8;
|
||||
tx_amp_backoff_dB = 10; #36; #6;
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "no";
|
||||
nb_tx = 2;
|
||||
nb_rx = 1;
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000, 0x00007fff, 0x0000];
|
||||
tr_preference = "raw_if4p5";
|
||||
do_precoding = 0;
|
||||
ru_thread_core = 8;
|
||||
sl_ahead = 5;
|
||||
#tp_cores = "26,18,20,22,24";
|
||||
#num_tp_cores = 5;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
THREAD_STRUCT = (
|
||||
{
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="medium";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
ngap_log_level ="info";
|
||||
ngap_log_verbosity ="medium";
|
||||
f1ap_log_level ="info";
|
||||
f1ap_log_verbosity ="medium";
|
||||
};
|
||||
1852
targets/PROJECTS/GENERIC-NR-5GC/CONF/oran.fhi.json
Normal file
1852
targets/PROJECTS/GENERIC-NR-5GC/CONF/oran.fhi.json
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user