mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-16 22:20:31 +00:00
Compare commits
49 Commits
PDU_Sessio
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c042bbfe29 | ||
|
|
9a06ceba46 | ||
|
|
fe2aa04296 | ||
|
|
723e67343b | ||
|
|
3a70ffc336 | ||
|
|
2fd4037fba | ||
|
|
7cc5a63aca | ||
|
|
0f0b44373d | ||
|
|
eddf291e6b | ||
|
|
ff79042d9b | ||
|
|
a89b21b04d | ||
|
|
e0876dd36f | ||
|
|
7e6847bb91 | ||
|
|
090d7d000f | ||
|
|
8ada361999 | ||
|
|
b9ff87496e | ||
|
|
15c630638e | ||
|
|
ba0ced8915 | ||
|
|
35582658c5 | ||
|
|
3cf5c17342 | ||
|
|
0cccf1d081 | ||
|
|
a40f9d9d23 | ||
|
|
99a003b7fc | ||
|
|
7f19d11424 | ||
|
|
0caec0acb7 | ||
|
|
d2346bdff0 | ||
|
|
85c160ddc0 | ||
|
|
e2305bff66 | ||
|
|
7af841272f | ||
|
|
4c19d961d7 | ||
|
|
b958b57db2 | ||
|
|
69e4901e42 | ||
|
|
1cdeed6c1d | ||
|
|
86ba488ea7 | ||
|
|
6cf4d59d2c | ||
|
|
07758a5f75 | ||
|
|
bf9f88572a | ||
|
|
d74942eec3 | ||
|
|
0995a99170 | ||
|
|
c02cb8ef67 | ||
|
|
0295caa98a | ||
|
|
d6dd4c25a9 | ||
|
|
0bc4e28260 | ||
|
|
ee35014050 | ||
|
|
367f890515 | ||
|
|
7f4f6688a8 | ||
|
|
0d19170282 | ||
|
|
cc62375d22 | ||
|
|
1c495cfdcb |
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,4 +1,4 @@
|
||||
[submodule "openair2/E2AP/flexric"]
|
||||
path = openair2/E2AP/flexric
|
||||
url = https://gitlab.eurecom.fr/mosaic5g/flexric.git
|
||||
branch = remotes/origin/service-models-integration
|
||||
branch = remotes/origin/mir_dev
|
||||
|
||||
0
CHANGELOG.md
Executable file → Normal file
0
CHANGELOG.md
Executable file → Normal file
@@ -102,23 +102,21 @@ add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of bui
|
||||
# in case /proc/cpuinfo exists we want to inspect available Intrinsics
|
||||
# -so not to go always through SIMDE emulation
|
||||
# -so to avoid AVX512 instructions generation by gcc
|
||||
if(EXISTS "/proc/cpuinfo" AND NOT CROSS_COMPILE)
|
||||
execute_process(COMMAND uname -m OUTPUT_VARIABLE CPUARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
message(STATUS "CPUARCH ${CPUARCH}")
|
||||
if(EXISTS "/proc/cpuinfo")
|
||||
file(STRINGS "/proc/cpuinfo" CPUFLAGS REGEX flags LIMIT_COUNT 1)
|
||||
else()
|
||||
message(WARNING "did not find /proc/cpuinfo -- not setting any x86-specific compilation variables")
|
||||
endif()
|
||||
|
||||
|
||||
eval_boolean(AUTODETECT_AVX512 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx512")
|
||||
add_boolean_option(AVX512 ${AUTODETECT_AVX512} "Whether AVX512 intrinsics is available on the host processor" ON)
|
||||
|
||||
eval_boolean(AUTODETECT_AVX2 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx2")
|
||||
add_boolean_option(AVX2 ${AUTODETECT_AVX2} "Whether AVX2 intrinsics is available on the host processor" ON)
|
||||
|
||||
message(STATUS "CPU architecture is ${CMAKE_SYSTEM_PROCESSOR}")
|
||||
if (CROSS_COMPILE)
|
||||
message(STATUS "setting as aarch64")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -lgcc -lrt")
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
||||
if(${CPUARCH} STREQUAL "x86_64" AND DEFINED CPUFLAGS)
|
||||
# The following intrinsics are assumed to be available on any x86 system
|
||||
# (avx, f16c, fma, gnfi, mmx, pclmul, sse, sse2, sse3, xop)
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_F16C_NATIVE -DSIMDE_X86_FMA_NATIVE -DSIMDE_X86_GFNI_NATIVE -DSIMDE_X86_MMX_NATIVE -DSIMDE_X86_PCLMUL_NATIVE -DSIMDE_X86_SSE2_NATIVE -DSIMDE_X86_SSE3_NATIVE -DSIMDE_X86_SSE_NATIVE -DSIMDE_X86_XOP_HAVE_COM_ -DSIMDE_X86_XOP_NATIVE")
|
||||
@@ -141,19 +139,11 @@ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
||||
if(CPUINFO MATCHES "ssse3")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSSE3_NATIVE")
|
||||
endif()
|
||||
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mfloat-abi=hard -mfpu=neon -lgcc -lrt")
|
||||
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -lgcc -lrt")
|
||||
else()
|
||||
message(FATAL_ERROR "compile for CPU architecture ${CPUARCH}, CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}")
|
||||
elseif(${CPUARCH} NOT STREQUAL "x86_64")
|
||||
message(FATAL_ERROR "Cannot compile for CPU architecture ${CPUARCH}")
|
||||
endif()
|
||||
|
||||
if (NOT CROSS_COMPILE)
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
|
||||
else ()
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8-a")
|
||||
endif()
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
|
||||
|
||||
# add autotools definitions that were maybe used!
|
||||
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
|
||||
@@ -423,7 +413,6 @@ target_link_libraries(x2ap PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
set(F1AP_DIR ${OPENAIR2_DIR}/F1AP)
|
||||
add_library(f1ap
|
||||
${F1AP_DIR}/f1ap_common.c
|
||||
${F1AP_DIR}/f1ap_ids.c
|
||||
${F1AP_DIR}/f1ap_cu_interface_management.c
|
||||
${F1AP_DIR}/f1ap_cu_paging.c
|
||||
${F1AP_DIR}/f1ap_cu_rrc_message_transfer.c
|
||||
@@ -442,7 +431,7 @@ add_library(f1ap
|
||||
${F1AP_DIR}/f1ap_itti_messaging.c)
|
||||
target_include_directories(f1ap PUBLIC F1AP_DIR)
|
||||
target_link_libraries(f1ap PUBLIC asn1_f1ap)
|
||||
target_link_libraries(f1ap PRIVATE ngap nr_rrc HASHTABLE)
|
||||
target_link_libraries(f1ap PRIVATE ngap nr_rrc)
|
||||
|
||||
# LPP
|
||||
##############
|
||||
@@ -866,7 +855,7 @@ target_link_libraries(ldpc_parityCheck PRIVATE ldpc_gen_HEADERS)
|
||||
|
||||
add_library(coding MODULE ${PHY_TURBOSRC} )
|
||||
|
||||
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts_neon.c)
|
||||
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c )
|
||||
|
||||
|
||||
set(PHY_SRC_COMMON
|
||||
@@ -1040,7 +1029,6 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/ptrs_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_freq_equalization.c
|
||||
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_measurements_gNB.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||
@@ -1120,9 +1108,9 @@ if (${SMBV})
|
||||
endif (${SMBV})
|
||||
|
||||
set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
|
||||
set(PHY_NR_UE_SRC ${PHY_NR_UE_SRC} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
|
||||
|
||||
add_library(PHY_COMMON ${PHY_SRC_COMMON})
|
||||
target_link_libraries(PHY_COMMON PRIVATE shlib_loader)
|
||||
add_dependencies(PHY_COMMON dfts)
|
||||
target_link_libraries(PHY_COMMON PRIVATE asn1_lte_rrc_hdrs)
|
||||
|
||||
@@ -1145,7 +1133,6 @@ add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
|
||||
add_library(PHY_NR ${PHY_NR_SRC})
|
||||
|
||||
add_library(PHY_NR_UE ${PHY_NR_UE_SRC})
|
||||
target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs)
|
||||
|
||||
add_library(PHY_RU ${PHY_SRC_RU})
|
||||
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs)
|
||||
@@ -1415,6 +1402,9 @@ if(E2_AGENT)
|
||||
endif()
|
||||
|
||||
|
||||
add_library(MAC_NR ${MAC_NR_SRC})
|
||||
target_link_libraries(MAC_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
|
||||
add_library(MAC_UE_NR ${MAC_NR_SRC_UE})
|
||||
target_link_libraries(MAC_UE_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
|
||||
@@ -2242,7 +2232,7 @@ add_executable(nr_dlsim
|
||||
${PHY_INTERFACE_DIR}/queue_t.c
|
||||
)
|
||||
target_link_libraries(nr_dlsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader
|
||||
)
|
||||
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
@@ -2286,7 +2276,7 @@ if (ENABLE_LDPC_T1)
|
||||
endif()
|
||||
|
||||
target_link_libraries(nr_ulsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
|
||||
m pthread ${T_LIB} ITTI dl shlib_loader
|
||||
)
|
||||
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
@@ -2348,7 +2338,7 @@ if (${T_TRACER})
|
||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
||||
MISC_NFAPI_LTE_LIB MISC_NFAPI_NR_LIB
|
||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
|
||||
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_UE_NR ngap
|
||||
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_NR MAC_UE_NR ngap
|
||||
CN_UTILS GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE NB_IoT SIMU SIMU_ETH OPENAIR0_LIB
|
||||
ldpc_orig ldpc_optim ldpc_optim8seg ldpc dfts)
|
||||
if (TARGET ${i})
|
||||
|
||||
@@ -16,6 +16,8 @@ Please refer to the steps described on our website: [How to contribute to OAI](h
|
||||
* This decision was made for the license reasons.
|
||||
* The Continuous Integration will reject your merge request.
|
||||
- All merge requests SHALL have `develop` branch as target branch.
|
||||
- All merge requests SHALL have source branch names that SHALL not contain the `/` character.
|
||||
* We are using a `docker` registry scheme and the image names are based on the source branch name.
|
||||
|
||||
## Coding Styles ##
|
||||
|
||||
|
||||
@@ -589,7 +589,6 @@ def triggerCN5GSlaveJob (jobName, gitlabStatusName) {
|
||||
if ("MERGE".equals(env.gitlabActionType)) {
|
||||
shortenShaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%h" --abbrev=8 ' + env.gitlabMergeRequestLastCommit
|
||||
shortenShaOne = shortenShaOne.trim()
|
||||
branchName = env.gitlabSourceBranch.replaceAll("/", "-").trim()
|
||||
fullRanTag = 'porcepix.sboai.cs.eurecom.fr/oai-gnb:' + env.gitlabSourceBranch + '-' + shortenShaOne
|
||||
} else {
|
||||
shortenShaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%h" --abbrev=8 ' + env.GIT_COMMIT
|
||||
|
||||
@@ -185,12 +185,9 @@ rfsim4g_enb_nos1:
|
||||
|
||||
l2sim5g_ue:
|
||||
Host: localhost
|
||||
AttachScript: docker start l2sim-oai-nr-ue0
|
||||
DetachScript: docker stop l2sim-oai-nr-ue0
|
||||
NetworkScript: docker exec l2sim-oai-nr-ue0 ip a show dev oaitun_ue1
|
||||
CmdPrefix: docker exec l2sim-oai-nr-ue0
|
||||
IF: oaitun_ue1
|
||||
MTU: 1500
|
||||
|
||||
l2sim5g_ext_dn:
|
||||
Host: localhost
|
||||
@@ -199,12 +196,9 @@ l2sim5g_ext_dn:
|
||||
|
||||
l2sim4g_ue:
|
||||
Host: localhost
|
||||
AttachScript: docker start l2sim4g-oai-lte-ue1
|
||||
DetachScript: docker stop l2sim4g-oai-lte-ue1
|
||||
NetworkScript: docker exec l2sim4g-oai-lte-ue1 ip a show dev oaitun_ue1
|
||||
CmdPrefix: docker exec l2sim4g-oai-lte-ue1
|
||||
IF: oaitun_ue1
|
||||
MTU: 1500
|
||||
|
||||
l2sim4g_ext_dn:
|
||||
Host: localhost
|
||||
|
||||
@@ -266,8 +266,7 @@ class Cluster:
|
||||
baseTag = 'develop'
|
||||
forceBaseImageBuild = False
|
||||
if self.ranAllowMerge: # merging MR branch into develop -> temporary image
|
||||
branchName = self.ranBranch.replace('/','-')
|
||||
imageTag = f'{branchName}-{self.ranCommitID[0:8]}'
|
||||
imageTag = f'{self.ranBranch}-{self.ranCommitID[0:8]}'
|
||||
if self.ranTargetBranch == 'develop':
|
||||
ret = self.cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base.rhel9 | grep --colour=never -i INDEX')
|
||||
result = re.search('index', ret.stdout)
|
||||
@@ -413,6 +412,7 @@ class Cluster:
|
||||
imageSize = {}
|
||||
for image in attemptedImages:
|
||||
self.cmd.run(f'mkdir -p cmake_targets/log/{image}')
|
||||
self.cmd.run(f'python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/{image}.log')
|
||||
tag = imageTag if image != 'ran-base' else baseTag
|
||||
size = self._get_image_size(image, tag)
|
||||
if size <= 0:
|
||||
|
||||
@@ -97,9 +97,7 @@ def CreateWorkspace(sshSession, sourcePath, ranRepository, ranCommitID, ranTarge
|
||||
def ImageTagToUse(imageName, ranCommitID, ranBranch, ranAllowMerge):
|
||||
shortCommit = ranCommitID[0:8]
|
||||
if ranAllowMerge:
|
||||
# Allowing contributor to have a name/branchName format
|
||||
branchName = ranBranch.replace('/','-')
|
||||
tagToUse = f'{branchName}-{shortCommit}'
|
||||
tagToUse = f'{ranBranch}-{shortCommit}'
|
||||
else:
|
||||
tagToUse = f'develop-{shortCommit}'
|
||||
fullTag = f'{imageName}:{tagToUse}'
|
||||
@@ -155,13 +153,17 @@ def AnalyzeBuildLogs(buildRoot, images, globalStatus):
|
||||
committed = False
|
||||
tagged = False
|
||||
with open(f'{buildRoot}/{image}.log', mode='r') as inputfile:
|
||||
startOfTargetImageCreation = False # check for tagged/committed only after image created
|
||||
for line in inputfile:
|
||||
lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None
|
||||
lineHasTag2 = re.search(f'naming to docker.io/library/{image}:', str(line)) is not None
|
||||
tagged = tagged or lineHasTag or lineHasTag2
|
||||
# the OpenShift Cluster builder prepends image registry URL
|
||||
lineHasCommit = re.search(f'COMMIT [a-zA-Z0-9\.:/\-]*{image}', str(line)) is not None
|
||||
committed = committed or lineHasCommit
|
||||
result = re.search(f'FROM .* [aA][sS] {image}$', str(line))
|
||||
if result is not None:
|
||||
startOfTargetImageCreation = True
|
||||
if startOfTargetImageCreation:
|
||||
lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None
|
||||
tagged = tagged or lineHasTag
|
||||
# the OpenShift Cluster builder prepends image registry URL
|
||||
lineHasCommit = re.search(f'COMMIT [a-zA-Z0-9\.:/\-]*{image}', str(line)) is not None
|
||||
committed = committed or lineHasCommit
|
||||
errorandwarnings['errors'] = 0 if committed or tagged else 1
|
||||
errorandwarnings['warnings'] = 0
|
||||
errorandwarnings['status'] = committed or tagged
|
||||
@@ -368,23 +370,22 @@ class Containerize():
|
||||
# Creating a tupple with the imageName and the DockerFile prefix pattern on obelix
|
||||
if result is not None:
|
||||
imageNames.append(('oai-enb', 'eNB'))
|
||||
result = re.search('gNB', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-gnb', 'gNB'))
|
||||
result = re.search('all', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-enb', 'eNB'))
|
||||
imageNames.append(('oai-gnb', 'gNB'))
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup'))
|
||||
imageNames.append(('oai-lte-ue', 'lteUE'))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE'))
|
||||
if self.host == 'Red Hat':
|
||||
imageNames.append(('oai-physim', 'phySim'))
|
||||
if self.host == 'Ubuntu':
|
||||
imageNames.append(('oai-lte-ru', 'lteRU'))
|
||||
result = re.search('build_cross_arm64', self.imageKind)
|
||||
if result is not None:
|
||||
self.dockerfileprefix = '.ubuntu20.cross-arm64'
|
||||
else:
|
||||
result = re.search('gNB', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-gnb', 'gNB'))
|
||||
else:
|
||||
result = re.search('all', self.imageKind)
|
||||
if result is not None:
|
||||
imageNames.append(('oai-enb', 'eNB'))
|
||||
imageNames.append(('oai-gnb', 'gNB'))
|
||||
imageNames.append(('oai-nr-cuup', 'nr-cuup'))
|
||||
imageNames.append(('oai-lte-ue', 'lteUE'))
|
||||
imageNames.append(('oai-nr-ue', 'nrUE'))
|
||||
if self.host == 'Red Hat':
|
||||
imageNames.append(('oai-physim', 'phySim'))
|
||||
if self.host == 'Ubuntu':
|
||||
imageNames.append(('oai-lte-ru', 'lteRU'))
|
||||
|
||||
# Workaround for some servers, we need to erase completely the workspace
|
||||
if self.forcedWorkspaceCleanup:
|
||||
@@ -467,12 +468,9 @@ class Containerize():
|
||||
if image != 'ran-build':
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {image}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} . > cmake_targets/log/{image}.log 2>&1', timeout=1200)
|
||||
if image == 'ran-build':
|
||||
cmd.run(f"docker run --name test-log -d {image}:{imageTag} /bin/true")
|
||||
cmd.run(f"docker cp test-log:/oai-ran/cmake_targets/log/ cmake_targets/log/{image}/")
|
||||
cmd.run(f"docker rm -f test-log")
|
||||
else:
|
||||
cmd.run(f"mkdir -p cmake_targets/log/{image}")
|
||||
# split the log
|
||||
cmd.run(f"mkdir -p cmake_targets/log/{image}")
|
||||
cmd.run(f"python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/{image}.log")
|
||||
# check the status of the build
|
||||
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {image}:{imageTag}")
|
||||
if ret.returncode != 0:
|
||||
@@ -988,11 +986,14 @@ class Containerize():
|
||||
for svcName in services:
|
||||
# head -n -1 suppresses the final "X exited with status code Y"
|
||||
filename = f'{svcName}-{HTML.testCase_id}.log'
|
||||
#mySSH.command(f'docker-compose -f ci-docker-compose.yml logs --no-log-prefix -- {svcName} | head -n -1 &> {lSourcePath}/cmake_targets/log/{filename}', '\$', 30)
|
||||
mySSH.command(f'docker-compose -f ci-docker-compose.yml logs --no-log-prefix -- {svcName} &> {lSourcePath}/cmake_targets/log/{filename}', '\$', 120)
|
||||
|
||||
mySSH.command('docker-compose -f ci-docker-compose.yml down -v', '\$', 5)
|
||||
mySSH.close()
|
||||
mySSH.command('docker-compose -f ci-docker-compose.yml down', '\$', 5)
|
||||
# Cleaning any created tmp volume
|
||||
mySSH.command('docker volume prune --force', '\$', 20)
|
||||
|
||||
mySSH.close()
|
||||
# Analyzing log file!
|
||||
files = ','.join([f'{s}-{HTML.testCase_id}' for s in services])
|
||||
if len(services) > 1:
|
||||
@@ -1295,7 +1296,7 @@ class Containerize():
|
||||
|
||||
logging.debug('\u001B[1m Undeploying \u001B[0m')
|
||||
logging.debug(f'Working dir is back {self.yamlPath[0]}')
|
||||
cmd = 'docker-compose -f docker-compose-ci.yml down -v'
|
||||
cmd = 'docker-compose -f docker-compose-ci.yml down'
|
||||
deployStatus = myCmd.run(cmd, timeout=100)
|
||||
if deployStatus.returncode != 0:
|
||||
myCmd.close()
|
||||
@@ -1306,6 +1307,9 @@ class Containerize():
|
||||
return
|
||||
|
||||
self.deployedContainers = []
|
||||
# Cleaning any created tmp volume
|
||||
cmd = 'docker volume prune --force'
|
||||
deployStatus = myCmd.run(cmd, timeout=100, reportNonZero=False)
|
||||
myCmd.close()
|
||||
|
||||
if fullStatus:
|
||||
|
||||
@@ -519,7 +519,6 @@ class OaiCiTest():
|
||||
ping_cmd = f'{ue.getCmdPrefix()} ping {interface} {self.ping_args} 2>&1 | tee /tmp/{ping_log_file}'
|
||||
cmd = cls_cmd.getConnection(ue.getHost())
|
||||
response = cmd.run(ping_cmd, timeout=int(ping_time[0])*1.5)
|
||||
ue_header = f'UE {ue.getName()} ({ueIP})'
|
||||
if response.returncode != 0:
|
||||
message = ue_header + ': ping crashed: TIMEOUT?'
|
||||
logging.error('\u001B[1;37;41m ' + message + ' \u001B[0m')
|
||||
@@ -529,6 +528,7 @@ class OaiCiTest():
|
||||
cmd.copyin(src=f'/tmp/{ping_log_file}', tgt=local_ping_log_file)
|
||||
cmd.close()
|
||||
|
||||
ue_header = f'UE {ue.getName()} ({ueIP})'
|
||||
with open(local_ping_log_file, 'r') as f:
|
||||
ping_output = "".join(f.readlines())
|
||||
result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', ping_output)
|
||||
|
||||
@@ -98,15 +98,6 @@ class PhySim:
|
||||
for line in g:
|
||||
if 'decoding time' in line:
|
||||
runResultsT1.append(line)
|
||||
|
||||
# In case the T1 board does work properly, there is no statistics
|
||||
if len(runResultsT1) == 0:
|
||||
logging.error('no statistics')
|
||||
HTML.CreateHtmlTestRowQueue(self.runargs, 'KO', ['no statistics'])
|
||||
self.exitStatus = 1
|
||||
os.system('mv '+self.__runLogFile+' '+ self.__runLogPath+'/.')
|
||||
return HTML
|
||||
|
||||
info = runResultsT1[0][15:-13]
|
||||
result = int(''.join(filter(str.isdigit, info)))/100
|
||||
#once parsed move the local logfile to its folder for tidiness
|
||||
|
||||
@@ -106,8 +106,7 @@ class PhySim:
|
||||
if self.ranCommitID != '':
|
||||
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
|
||||
if self.ranAllowMerge:
|
||||
branchName = self.ranBranch.replace('/','-')
|
||||
imageTag = f'{branchName}-{self.ranCommitID[0:8]}'
|
||||
imageTag = f'{self.ranBranch}-{self.ranCommitID[0:8]}'
|
||||
if self.ranTargetBranch == '':
|
||||
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
||||
mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 30)
|
||||
@@ -161,7 +160,7 @@ class PhySim:
|
||||
isRunning = False
|
||||
count = 0
|
||||
# Check whether the containers are in Running state or not under 2 mins
|
||||
while(count < 5 and isRunning == False):
|
||||
while(count < 2 and isRunning == False):
|
||||
time.sleep(60)
|
||||
mySSH.command('oc get pods -o wide -l app=physim | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 30, resync=True)
|
||||
running_count = mySSH.getBefore().count('Running')
|
||||
|
||||
@@ -283,7 +283,7 @@ class StaticCodeAnalysis():
|
||||
if re.search('=== Files with incorrect define protection ===', str(line)) is not None:
|
||||
circularHeaderDependency = True
|
||||
if circularHeaderDependency:
|
||||
if re.search('DONE', str(line)) is not None:
|
||||
if re.search('Removing intermediate container', str(line)) is not None:
|
||||
circularHeaderDependency = False
|
||||
elif re.search('Running in|Files with incorrect define protection', str(line)) is not None:
|
||||
pass
|
||||
@@ -293,7 +293,7 @@ class StaticCodeAnalysis():
|
||||
if re.search('=== Files with a GNU GPL licence Banner ===', str(line)) is not None:
|
||||
gnuGplLicence = True
|
||||
if gnuGplLicence:
|
||||
if re.search('DONE', str(line)) is not None:
|
||||
if re.search('Removing intermediate container', str(line)) is not None:
|
||||
gnuGplLicence = False
|
||||
elif re.search('Running in|Files with a GNU GPL licence Banner', str(line)) is not None:
|
||||
pass
|
||||
@@ -303,7 +303,7 @@ class StaticCodeAnalysis():
|
||||
if re.search('=== Files with a suspect Banner ===', str(line)) is not None:
|
||||
suspectLicence = True
|
||||
if suspectLicence:
|
||||
if re.search('DONE', str(line)) is not None:
|
||||
if re.search('Removing intermediate container', str(line)) is not None:
|
||||
suspectLicence = False
|
||||
elif re.search('Running in|Files with a suspect Banner', str(line)) is not None:
|
||||
pass
|
||||
@@ -340,7 +340,7 @@ class StaticCodeAnalysis():
|
||||
html_cell = f'Number of files not respecting: {len(gnuGplLicenceFiles)}\n'
|
||||
for nFile in gnuGplLicenceFiles:
|
||||
html_cell += str(nFile).strip() + '\n'
|
||||
HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', [html_cell])
|
||||
HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', html_queue)
|
||||
del(html_cell)
|
||||
finalStatus = -1
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ gNBs =
|
||||
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
force_256qam_off = 1;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
@@ -29,7 +30,136 @@ gNBs =
|
||||
local_s_portd = 2153;
|
||||
remote_s_portc = 500;
|
||||
remote_s_portd = 2153;
|
||||
min_rxtxtime = 6;
|
||||
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 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 = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
|
||||
@@ -19,6 +19,7 @@ gNBs =
|
||||
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
force_256qam_off = 1;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
@@ -29,7 +30,135 @@ gNBs =
|
||||
local_s_portd = 2153;
|
||||
remote_s_portc = 500;
|
||||
remote_s_portd = 2153;
|
||||
min_rxtxtime = 6;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 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 = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
|
||||
@@ -20,6 +20,7 @@ gNBs =
|
||||
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
force_256qam_off = 1;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
@@ -30,7 +31,136 @@ gNBs =
|
||||
local_s_portd = 2152;
|
||||
remote_s_portc = 500;
|
||||
remote_s_portd = 2152;
|
||||
ssb_SubcarrierOffset = 0;
|
||||
min_rxtxtime = 6;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 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 = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
|
||||
@@ -20,6 +20,7 @@ gNBs =
|
||||
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
force_256qam_off = 1;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
@@ -30,7 +31,136 @@ gNBs =
|
||||
local_s_portd = 2153;
|
||||
remote_s_portc = 500;
|
||||
remote_s_portd = 2153;
|
||||
ssb_SubcarrierOffset = 0;
|
||||
min_rxtxtime = 6;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 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 = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@ gNBs =
|
||||
////////// Physical parameters:
|
||||
|
||||
min_rxtxtime = 6;
|
||||
force_256qam_off = 1;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@ gNBs =
|
||||
////////// Physical parameters:
|
||||
|
||||
min_rxtxtime = 6;
|
||||
force_256qam_off = 1;
|
||||
|
||||
|
||||
servingCellConfigCommon = (
|
||||
|
||||
@@ -22,7 +22,7 @@ gNBs =
|
||||
|
||||
////////// Physical parameters:
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pusch_AntennaPorts = 1;
|
||||
pusch_AntennaPorts = 2;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 0;
|
||||
|
||||
@@ -220,7 +220,7 @@ RUs = (
|
||||
tr_preference = "udp_ecpri_if5"
|
||||
nb_tx = 2
|
||||
nb_rx = 2
|
||||
att_tx = 18
|
||||
att_tx = 16
|
||||
att_rx = 0;
|
||||
num_tp_cores = 4;
|
||||
rxfh_core_id = 9;
|
||||
|
||||
@@ -30,7 +30,7 @@ gNBs =
|
||||
absoluteFrequencySSB = 620736;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3300.30 MHz
|
||||
dl_absoluteFrequencyPointA = 620052;
|
||||
dl_absoluteFrequencyPointA = 620020;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
|
||||
@@ -15,7 +15,7 @@ Ref :
|
||||
DLSCH encoding : 137.0
|
||||
L1 Rx processing : 345.0
|
||||
PUSCH inner-receiver : 210.0
|
||||
PUSCH decoding : 2200.0
|
||||
PUSCH decoding : 210.0
|
||||
Schedule Response : 48.0
|
||||
DL & UL scheduling timing : 13.0
|
||||
UL Indication : 60.0
|
||||
|
||||
@@ -15,7 +15,7 @@ Ref :
|
||||
DLSCH encoding : 177.0
|
||||
L1 Rx processing : 345.0
|
||||
PUSCH inner-receiver : 210.0
|
||||
PUSCH decoding : 2200.0
|
||||
PUSCH decoding : 210.0
|
||||
Schedule Response : 111.0
|
||||
DL & UL scheduling timing : 20.0
|
||||
UL Indication : 127.0
|
||||
|
||||
@@ -15,7 +15,7 @@ Ref :
|
||||
DLSCH encoding : 118.0
|
||||
L1 Rx processing : 305.0
|
||||
PUSCH inner-receiver : 150.0
|
||||
PUSCH decoding : 2200.0
|
||||
PUSCH decoding : 210.0
|
||||
Schedule Response : 30.0
|
||||
DL & UL scheduling timing : 10.0
|
||||
UL Indication : 40.0
|
||||
|
||||
92
ci-scripts/docker_log_split.py
Normal file
92
ci-scripts/docker_log_split.py
Normal file
@@ -0,0 +1,92 @@
|
||||
#/*
|
||||
# * 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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
# Python for CI of OAI-eNB + COTS-UE
|
||||
#
|
||||
# Required Python Version
|
||||
# Python 3.x
|
||||
#
|
||||
# Required Python Package
|
||||
# pexpect
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# Import Libs
|
||||
#-----------------------------------------------------------
|
||||
import sys # arg
|
||||
import re # reg
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
|
||||
class SplitReport():
|
||||
def __init__(self):
|
||||
self.logfilename = ''
|
||||
self.destinationFolder = ''
|
||||
|
||||
def split(self):
|
||||
self.destinationFolder = self.logfilename.replace(".log","")
|
||||
if os.path.isfile(self.logfilename):
|
||||
newImageLog = open(self.logfilename + '.new', 'w')
|
||||
copyFlag = True
|
||||
with open(self.logfilename, 'r') as imageLog:
|
||||
for line in imageLog:
|
||||
header = False
|
||||
ret = re.search('====== Start of log for ([0-9\.A-Za-z\-\_]+) ======', line)
|
||||
if ret is not None:
|
||||
copyFlag = False
|
||||
header = True
|
||||
detailedLogFile = open(self.destinationFolder + '/' + ret.group(1), 'w')
|
||||
if copyFlag:
|
||||
newImageLog.write(line)
|
||||
ret = re.search('====== End of log for ([0-9\.A-Za-z\-\_]+) ======', line)
|
||||
if ret is not None:
|
||||
copyFlag = True
|
||||
detailedLogFile.close()
|
||||
elif not copyFlag and not header:
|
||||
detailedLogFile.write(line)
|
||||
imageLog.close()
|
||||
newImageLog.close()
|
||||
os.rename(self.logfilename + '.new', self.logfilename)
|
||||
else:
|
||||
print('Cannot split unfound file')
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------
|
||||
#
|
||||
# Start of main
|
||||
#
|
||||
#--------------------------------------------------------------------------------------------------------
|
||||
|
||||
argvs = sys.argv
|
||||
argc = len(argvs)
|
||||
|
||||
SP = SplitReport()
|
||||
|
||||
while len(argvs) > 1:
|
||||
myArgv = argvs.pop(1)
|
||||
if re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE)
|
||||
SP.logfilename = matchReg.group(1)
|
||||
|
||||
SP.split()
|
||||
|
||||
sys.exit(0)
|
||||
@@ -679,7 +679,7 @@ class EPCManagement():
|
||||
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/mme.conf', self.SourceCodePath + '/scripts')
|
||||
mySSH.command('chmod 775 entrypoint.sh', '\$', 60)
|
||||
mySSH.command('wget --quiet --tries=3 --retry-connrefused https://raw.githubusercontent.com/OPENAIRINTERFACE/openair-hss/develop/src/hss_rel14/db/oai_db.cql', '\$', 30)
|
||||
mySSH.command('docker-compose down -v', '\$', 60)
|
||||
mySSH.command('docker-compose down', '\$', 60)
|
||||
mySSH.command('docker-compose up -d db_init', '\$', 60)
|
||||
# databases take time...
|
||||
time.sleep(10)
|
||||
@@ -831,7 +831,8 @@ class EPCManagement():
|
||||
listOfContainers += ' prod-trf-gen'
|
||||
nbContainers += 1
|
||||
|
||||
mySSH.command('docker-compose down -v', '\$', 60)
|
||||
mySSH.command('docker-compose down', '\$', 60)
|
||||
mySSH.command('docker volume prune --force || true', '\$', 60)
|
||||
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + listOfContainers, '\$', 10)
|
||||
noMoreContainerNb = mySSH.getBefore().count('No such object')
|
||||
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
|
||||
|
||||
@@ -750,6 +750,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
elif action == 'WaitEndBuild_eNB':
|
||||
RAN.WaitBuildeNBisFinished(HTML)
|
||||
elif action == 'Custom_Command':
|
||||
logging.info(f"Executing custom command")
|
||||
RAN.CustomCommand(HTML)
|
||||
if RAN.prematureExit:
|
||||
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)
|
||||
|
||||
@@ -260,7 +260,6 @@ class RANManagement():
|
||||
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.backgroundBuildTestId[int(self.eNB_instance)], HTML)
|
||||
|
||||
def CustomCommand(self, HTML):
|
||||
logging.info(f"Executing custom command on {self.node}")
|
||||
cmd = cls_cmd.getConnection(self.node)
|
||||
ret = cmd.run(self.command)
|
||||
cmd.close()
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<eNB_instance>1</eNB_instance>
|
||||
<eNB_serverId>1</eNB_serverId>
|
||||
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||
<proxy_commit>b64d9bce986b38ca59e8582864ade3fcdd05c0dc</proxy_commit>
|
||||
<proxy_commit>a2fa216</proxy_commit>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
000001
|
||||
000002
|
||||
000003
|
||||
000004
|
||||
000011
|
||||
200000
|
||||
020001
|
||||
020002
|
||||
@@ -82,10 +82,10 @@
|
||||
<nb_healthy>10</nb_healthy>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE</desc>
|
||||
<id>l2sim4g_ue</id>
|
||||
<testCase id="000011">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
000001
|
||||
000002
|
||||
000003
|
||||
000004
|
||||
000011
|
||||
200000
|
||||
020001
|
||||
020002
|
||||
@@ -80,10 +80,10 @@
|
||||
<nb_healthy>9</nb_healthy>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE</desc>
|
||||
<id>l2sim5g_ue</id>
|
||||
<testCase id="000011">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
100011
|
||||
004000
|
||||
000010
|
||||
000011
|
||||
020011
|
||||
@@ -46,13 +45,6 @@
|
||||
<images_to_pull>oai-gnb oai-nr-ue</images_to_pull>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Clean-Up any residual volume</desc>
|
||||
<node>localhost</node>
|
||||
<command>docker volume rm 5g_rfsimulator_fdd_phytest_rrc.config</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000010">
|
||||
<class>DeployGenObject</class>
|
||||
<desc>Deploy OAI 5G gNB RF sim SA</desc>
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
<htmlTabIcon>trash</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100012
|
||||
004000
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
@@ -37,13 +36,6 @@
|
||||
<yaml_path>yaml_files/5g_rfsimulator_fdd_phytest</yaml_path>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Clean-Up any residual volume</desc>
|
||||
<node>localhost</node>
|
||||
<command>docker volume rm 5g_rfsimulator_fdd_phytest_rrc.config</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
100001
|
||||
004000
|
||||
000000
|
||||
000001
|
||||
020001
|
||||
@@ -44,13 +43,6 @@
|
||||
<images_to_pull>oai-gnb oai-nr-ue</images_to_pull>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Clean-Up any residual volume</desc>
|
||||
<node>localhost</node>
|
||||
<command>docker volume rm 5g_rfsimulator_fr2_32prb_rrc.config</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000000">
|
||||
<class>DeployGenObject</class>
|
||||
<desc>Deploy OAI gNB</desc>
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
<htmlTabIcon>trash</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100002
|
||||
004000
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
@@ -37,13 +36,6 @@
|
||||
<yaml_path>yaml_files/5g_rfsimulator_fr2_32prb</yaml_path>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Clean-Up any residual volume</desc>
|
||||
<node>localhost</node>
|
||||
<command>docker volume rm 5g_rfsimulator_fr2_32prb_rrc.config</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
100001
|
||||
004000
|
||||
000000
|
||||
000001
|
||||
020001
|
||||
@@ -44,13 +43,6 @@
|
||||
<images_to_pull>oai-gnb oai-nr-ue</images_to_pull>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Clean-Up any residual volume</desc>
|
||||
<node>localhost</node>
|
||||
<command>docker volume rm 5g_rfsimulator_tdd_dora_rrc.config</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000000">
|
||||
<class>DeployGenObject</class>
|
||||
<desc>Deploy OAI gNB</desc>
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
<htmlTabIcon>trash</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100002
|
||||
004000
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
@@ -37,13 +36,6 @@
|
||||
<yaml_path>yaml_files/5g_rfsimulator_tdd_dora</yaml_path>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Clean-Up any residual volume</desc>
|
||||
<node>localhost</node>
|
||||
<command>docker volume rm 5g_rfsimulator_tdd_dora_rrc.config</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
<!--
|
||||
|
||||
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
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>build-tab</htmlTabRef>
|
||||
<htmlTabName>Build Container Images</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
000001
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="000001">
|
||||
<class>Build_Image</class>
|
||||
<desc>Cross-Compile for ARM64</desc>
|
||||
<kind>build_cross_arm64</kind>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -36,7 +36,7 @@
|
||||
<eNB_instance>1</eNB_instance>
|
||||
<eNB_serverId>1</eNB_serverId>
|
||||
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||
<proxy_commit>b64d9bce986b38ca59e8582864ade3fcdd05c0dc</proxy_commit>
|
||||
<proxy_commit>a2fa216</proxy_commit>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
<testCase id="000002">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -168,14 +168,14 @@
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger Reestablishment</desc>
|
||||
<node>ofqot</node>
|
||||
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command>
|
||||
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'force-remove UE RNTI [0-9a-f]{4} from RLC to trigger reestablishment'</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
<testCase id="060002">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Verify Reestablishment</desc>
|
||||
<node>ofqot</node>
|
||||
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command>
|
||||
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1 reconf_after_reestab 1'</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -39,10 +39,6 @@
|
||||
110011
|
||||
110001
|
||||
150001
|
||||
160001
|
||||
100002
|
||||
160002
|
||||
150001
|
||||
110011
|
||||
110001
|
||||
150000
|
||||
@@ -118,7 +114,7 @@
|
||||
<testCase id="100002">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="150000">
|
||||
@@ -188,21 +184,6 @@
|
||||
<iperf_profile>single-ue</iperf_profile>
|
||||
</testCase>
|
||||
|
||||
<testCase id="160001">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger Reestablishment (on DU)</desc>
|
||||
<node>ofqot</node>
|
||||
<command>echo ci force_reestab | nc -N 192.168.68.195 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
<testCase id="160002">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Verify Reestablishment (on CU)</desc>
|
||||
<node>ofqot</node>
|
||||
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
<testCase id="130201">
|
||||
<class>Undeploy_Object</class>
|
||||
<desc>Undeploy CU-DU</desc>
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
<testCase id="200002">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -162,14 +162,14 @@
|
||||
<class>Custom_Command</class>
|
||||
<desc>Trigger Reestablishment</desc>
|
||||
<node>ofqot</node>
|
||||
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command>
|
||||
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'force-remove UE RNTI [0-9a-f]{4} from RLC to trigger reestablishment'</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
<testCase id="260002">
|
||||
<class>Custom_Command</class>
|
||||
<desc>Verify Reestablishment</desc>
|
||||
<node>ofqot</node>
|
||||
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command>
|
||||
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1 reconf_after_reestab 1'</command>
|
||||
<command_fail>yes</command_fail>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<testCase id="090102">
|
||||
<class>Initialize_OAI_UE</class>
|
||||
<desc>Initialize NR UE USRP</desc>
|
||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 50 --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
|
||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 50 --rrc_config_path . --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
|
||||
<air_interface>NR</air_interface>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<testCase id="090104">
|
||||
<class>Initialize_OAI_UE</class>
|
||||
<desc>Initialize NR UE USRP</desc>
|
||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
|
||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path . --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
|
||||
<air_interface>NR</air_interface>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -410,33 +410,16 @@ in HSS config:
|
||||
NB_USERS: 10
|
||||
```
|
||||
|
||||
All UE parameter values will be taken from the mounted config file, so modify
|
||||
the corresponding UE file to reflect the above changes
|
||||
in UE config:
|
||||
|
||||
```yaml
|
||||
oai_ue0:
|
||||
[...]
|
||||
volumes:
|
||||
- ../../conf_files/lteue.usim-ci.conf:/opt/oai-lte-ue/etc/ue_usim.conf
|
||||
```
|
||||
|
||||
and in the UE file, you should have
|
||||
```
|
||||
PLMN: {
|
||||
PLMN0: {
|
||||
FULLNAME="OpenAirInterface";
|
||||
SHORTNAME="OAICN";
|
||||
MNC="96";
|
||||
MCC="208";
|
||||
};
|
||||
};
|
||||
[...]
|
||||
SIM: {
|
||||
MSIN="0100000001";
|
||||
USIM_API_K="fec86ba6eb707ed08905757b1bb44b8f";
|
||||
OPC="c42449363bbad02b66d16bc975d77cc1";
|
||||
MSISDN="001011234561010";
|
||||
};
|
||||
MCC: '208'
|
||||
MNC: '96'
|
||||
SHORT_IMSI: '0100000001'
|
||||
LTE_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
|
||||
OPC: 'c42449363bbad02b66d16bc975d77cc1'
|
||||
MSISDN: '001011234561010'
|
||||
HPLMN: 20896
|
||||
```
|
||||
|
||||
As you can see: `LTE_K` and `LTE_KEY` are the same value. And `OP_KEY` and `OPC` can be deduced from each other. Look in HSS logs.
|
||||
@@ -488,19 +471,13 @@ in SPGW-C/-U configs:
|
||||
REALM: openairinterface.org
|
||||
```
|
||||
|
||||
In eNB, all the parameter values will be taken from the mounted config file.
|
||||
in eNB config:
|
||||
|
||||
```yaml
|
||||
oai_enb0:
|
||||
[...]
|
||||
volumes:
|
||||
- ../../conf_files/enb.band7.25prb.rfsim.conf:/opt/oai-enb/etc/enb.conf
|
||||
```
|
||||
|
||||
with the eNB config reading:
|
||||
|
||||
```libconfig
|
||||
plmn_list = ( { mcc = 208; mnc = 96; mnc_length = 2; } );
|
||||
MCC: '208'
|
||||
MNC: '96'
|
||||
MNC_LENGTH: 2
|
||||
TAC: 1
|
||||
```
|
||||
|
||||
The values SHALL match, and `TAC` shall match `TAC_0` from MME.
|
||||
|
||||
@@ -321,52 +321,19 @@ In the `SMF` section, provide your own DNS IP address:
|
||||
DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
|
||||
```
|
||||
|
||||
gNB section:
|
||||
|
||||
All the parameter values will be taken from the mounted config file
|
||||
In the `gNB` section, provide your docker-host primary IP address and interface name: in our case `172.21.16.128` and `eno1`.
|
||||
|
||||
```yaml
|
||||
oai-gnb:
|
||||
[...]
|
||||
volumes:
|
||||
- ../../conf_files/gnb.sa.band78.106prb.l2sim.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
GNB_NGA_IF_NAME: eno1
|
||||
GNB_NGA_IP_ADDRESS: 172.21.16.128
|
||||
GNB_NGU_IF_NAME: eno1
|
||||
GNB_NGU_IP_ADDRESS: 172.21.16.128
|
||||
```
|
||||
|
||||
with the configuration file having something like:
|
||||
|
||||
```libconfig
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "eno1";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.128";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "eno1";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.128";
|
||||
GNB_PORT_FOR_NGU = 2152; # Spec 2152
|
||||
};
|
||||
```
|
||||
|
||||
For the UE, all the parameter values will be taken from the mounted config
|
||||
file. Example:
|
||||
Same thing in the `nr-ue` section:
|
||||
|
||||
```yaml
|
||||
oai-nr-ue0:
|
||||
[...]
|
||||
volumes:
|
||||
- ../../conf_files/nrue.band78.106prb.l2sim.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
- ../../../openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results:/opt/oai-nr-ue/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results
|
||||
```
|
||||
|
||||
where the UE configuration (mounted to `/opt/oai-nr-ue/etc/nr-ue.conf`) reads
|
||||
|
||||
```libconfig
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "nfapi";
|
||||
local_n_if_name = "eno1";
|
||||
remote_n_address = "127.0.0.1"; //Proxy IP
|
||||
local_n_address = "127.0.0.1";
|
||||
...
|
||||
NR_UE_NFAPI_IF_NAME: eno1
|
||||
```
|
||||
|
||||
This tutorial is a first draft. This nFAPI feature and the proxy are still under development.
|
||||
|
||||
@@ -234,23 +234,24 @@ oaitun_ue1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
|
||||
|
||||
## 2.4. Deploy Second OAI NR-UE in RF simulator mode and in Standalone Mode ##
|
||||
|
||||
Create a entry for new IMSI (208990100001101) in oai_db.sql file.
|
||||
For this, refer to section [Making the NR-UE connect to the core
|
||||
network](#51-making-the-nr-ue-connect-to-the-core-network)
|
||||
```bash
|
||||
Create a entry for new IMSI (208990100001101) in oai_db.sql file
|
||||
Refer Section - [Making the NR-UE connect to the core network](#51-making-the-nr-ue-connect-to-the-core-network)
|
||||
|
||||
Create the entry for the second UE in `docker-compose.yaml` file as follows:
|
||||
|
||||
```yaml
|
||||
Create entry for Second UE in docker-compose.yaml file as follows:
|
||||
oai-nr-ue2:
|
||||
image: oai-nr-ue:develop
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue2
|
||||
environment:
|
||||
FULL_IMSI: '208990100001101'
|
||||
FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
|
||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||
DNN: oai
|
||||
NSSAI_SST: 1
|
||||
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.151
|
||||
@@ -495,31 +496,13 @@ INSERT INTO `users` VALUES ('208990100001101','1','55000000000000',NULL,'PURGED'
|
||||
|
||||
As you can see, 2 other values shall match in the NR-UE section of `docker-compose.yaml`:
|
||||
|
||||
All the values such as IMSI and KEY are taken from the configuration file mounted into the container. For the first UE, provision as usual through the config file
|
||||
OAI UE - 1
|
||||
* `FULL_IMSI: '208990100001100'`
|
||||
* `FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'`
|
||||
|
||||
```yaml
|
||||
oai-nr-ue:
|
||||
[...]
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
```
|
||||
|
||||
with the config having:
|
||||
```libconfig
|
||||
uicc0 = {
|
||||
imsi = "208990100001100";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
}
|
||||
```
|
||||
|
||||
The second UE's IMSI might be changed by either having the second UEs
|
||||
docker-compose entry mount another config, or add `--uicc0.imsi
|
||||
208990100001101` in `USE_ADDITIONAL_OPTIONS` entry. Note that the latter is a
|
||||
feature of the configuration module to overwrite any configuration option in
|
||||
the config file on the command line.
|
||||
OAI UE - 2
|
||||
* `FULL_IMSI: '208990100001101'`
|
||||
* `FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'`
|
||||
|
||||
We are also using a dedicated `oai-smf.conf` for the `SMF` container: the `oai` DNN shall match the one in the NR-UE section of `docker-compose.yaml` (`DNN: oai`).
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim --noS1 --reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim --noS1 --rrc_config_path etc/rrc/ --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
- rrc.config:/opt/oai-nr-ue/etc/rrc/
|
||||
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --rrc_config_path etc/rrc/ --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
- rrc.config:/opt/oai-nr-ue/etc/rrc/
|
||||
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --rrc_config_path etc/rrc/ --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
volumes:
|
||||
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
- rrc.config:/opt/oai-nr-ue/etc/rrc/
|
||||
|
||||
@@ -43,7 +43,7 @@ services:
|
||||
container_name: sa-du-b200-gnb
|
||||
environment:
|
||||
USE_B2XX: 'yes'
|
||||
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 18 --RUs.[0].att_tx 18
|
||||
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 14 --RUs.[0].att_tx 14
|
||||
volumes:
|
||||
- ../../conf_files/gnb-du.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- /dev:/dev
|
||||
|
||||
@@ -6,7 +6,7 @@ services:
|
||||
privileged: true
|
||||
container_name: sa-cu-gnb
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --sa --telnetsrv --telnetsrv.shrmod ci --log_config.global_log_options level,nocolor,time,line_num,function
|
||||
USE_ADDITIONAL_OPTIONS: --sa --log_config.global_log_options level,nocolor,time,line_num,function
|
||||
volumes:
|
||||
- ../../conf_files/gnb-cu.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
networks:
|
||||
@@ -26,7 +26,7 @@ services:
|
||||
container_name: sa-du-b200-gnb
|
||||
environment:
|
||||
USE_B2XX: 'yes'
|
||||
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --telnetsrv --telnetsrv.shrmod ci --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 18 --RUs.[0].att_tx 18
|
||||
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 14 --RUs.[0].att_tx 14
|
||||
volumes:
|
||||
- ../../conf_files/gnb-du.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- /dev:/dev
|
||||
|
||||
@@ -110,11 +110,11 @@
|
||||
</testCase>
|
||||
|
||||
<testCase id="nr_pbchsim.106rb">
|
||||
<desc>nr_pbchsim Test cases. (Test1: PBCH-only, 106 PRB, NID 2),
|
||||
<desc>nr_pbchsim Test cases. (Test1: PBCH-only, 106 PRB),
|
||||
(Test2: PBCH and synchronization, 106PBR),
|
||||
(Test3: PBCH and synchronization, 106PBR, SSB SC OFFSET 6)</desc>
|
||||
<main_exec>nr_pbchsim</main_exec>
|
||||
<main_exec_args>-s-11 -S-8 -n10 -R106 -N2
|
||||
<main_exec_args>-s-11 -S-8 -n10 -R106
|
||||
-s-11 -S-8 -n10 -o8000 -I -R106
|
||||
-s-11 -S-8 -n10 -R106 -O6</main_exec_args>
|
||||
<tags>test1 test2 test3</tags>
|
||||
@@ -200,8 +200,8 @@
|
||||
-n100 -e16 -s11 -S13
|
||||
-n100 -q1 -e26 -s30
|
||||
-n100 -e0 -t95 -S-1.0 -i 2 1 0
|
||||
-n10 -s20 -U 3 0 0 2 -gA -x1 -y4 -z4
|
||||
-n10 -s20 -U 3 0 0 2 -gA -x2 -y4 -z4
|
||||
-n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
|
||||
-n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
|
||||
-n10 -s20 -U 3 0 0 2 -x4 -y4 -z4</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7</tags>
|
||||
<search_expr_true>PDSCH test OK</search_expr_true>
|
||||
|
||||
@@ -38,6 +38,7 @@ gen_nvram_path=$OPENAIR_DIR/cmake_targets/ran_build/build
|
||||
conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
|
||||
|
||||
HW=""
|
||||
VERBOSE_CI=0
|
||||
VERBOSE_COMPILE=0
|
||||
RUN_GROUP=0
|
||||
TEST_CASE_GROUP=""
|
||||
@@ -109,6 +110,8 @@ Options:
|
||||
Adds a debgging facility to the binary files: GUI with major internal synchronization events
|
||||
-x | --xforms
|
||||
Will compile with software oscilloscope features
|
||||
--verbose-ci
|
||||
Compile with verbose instructions in CI Docker env
|
||||
--verbose-compile
|
||||
Shows detailed compilation instructions in makefile
|
||||
--build-doxygen
|
||||
@@ -333,6 +336,10 @@ function main() {
|
||||
-x | --xforms)
|
||||
echo_info "Will generate the software oscilloscope features"
|
||||
shift;;
|
||||
--verbose-ci)
|
||||
VERBOSE_CI=1
|
||||
echo_info "Will compile with verbose instructions in CI Docker env"
|
||||
shift;;
|
||||
--verbose-compile)
|
||||
VERBOSE_COMPILE=1
|
||||
echo_info "Will compile with verbose instructions"
|
||||
@@ -522,7 +529,7 @@ function main() {
|
||||
echo_info "Doxygen generation log is located here: $doxygen_log"
|
||||
echo_info "Generating Doxygen files....please wait"
|
||||
(
|
||||
$CMAKE --build . --target doc
|
||||
cmake --build . --target doc
|
||||
) >& $doxygen_log
|
||||
fi
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
set(CMAKE_SYSTEM_NAME Linux)
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||||
|
||||
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc-9)
|
||||
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++-9)
|
||||
|
||||
set(CROSS_COMPILE 1)
|
||||
set(bnProc_gen_128_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
set(bnProc_gen_avx2_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
set(bnProc_gen_avx512_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
set(cnProc_gen_128_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
set(cnProc_gen_avx2_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
set(cnProc_gen_avx512_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
set(genids_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
set(_check_vcd_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
|
||||
|
||||
@@ -32,7 +32,7 @@ OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g")
|
||||
OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g")
|
||||
case "$OS_DISTRO" in
|
||||
fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
|
||||
rhel) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake3" ;;
|
||||
rhel) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
|
||||
rocky) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
|
||||
centos) OS_BASEDISTRO="centos"; INSTALLER="yum"; CMAKE="cmake3" ;;
|
||||
debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
|
||||
@@ -226,13 +226,18 @@ compilations() {
|
||||
local verbose=$([ "$VERBOSE_COMPILE" == "1" ] && echo "-v" || echo "")
|
||||
echo cd $OPENAIR_DIR/cmake_targets/$dir/build
|
||||
cd $OPENAIR_DIR/cmake_targets/$dir/build
|
||||
echo_info "Running \"$CMAKE --build . $verbose --target $targets -- -j$(nproc)\"" $green
|
||||
echo_info "Running \"cmake --build . $verbose --target $targets -- -j$(nproc)\"" $green
|
||||
echo "Log file for compilation is being written to: $dlog/$logfile"
|
||||
set +e
|
||||
{
|
||||
$CMAKE --build . $verbose --target $targets -- -j$(nproc)
|
||||
cmake --build . $verbose --target $targets -- -j$(nproc)
|
||||
ret=$?
|
||||
} > $dlog/$logfile 2>&1
|
||||
if [ "$VERBOSE_CI" == "1" ]; then
|
||||
echo "====== Start of log for $logfile ======"
|
||||
cat $dlog/$logfile
|
||||
echo "====== End of log for $logfile ======"
|
||||
fi
|
||||
check_warnings "$dlog/$logfile"
|
||||
if [[ $ret -eq 0 ]]; then
|
||||
echo_success "$targets compiled"
|
||||
@@ -319,7 +324,8 @@ check_install_usrp_uhd_driver(){
|
||||
$SUDO apt-get remove libuhd3.15.0 -y || true
|
||||
local distribution=$(get_distribution_release)
|
||||
if [[ "$distribution" == "ubuntu18.04" || "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then
|
||||
$SUDO apt-get remove libuhd4.?.? -y || true
|
||||
$SUDO apt-get remove libuhd4.0.0 -y || true
|
||||
$SUDO apt-get remove libuhd4.1.0 -y || true
|
||||
fi
|
||||
v=$(lsb_release -cs)
|
||||
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
|
||||
@@ -349,7 +355,7 @@ check_install_usrp_uhd_driver(){
|
||||
$SUDO apt-get -y install python-tk $boost_libs_ubuntu libusb-1.0-0-dev
|
||||
case "$(get_distribution_release)" in
|
||||
"ubuntu18.04" | "ubuntu20.04" | "ubuntu22.04")
|
||||
$SUDO apt-get -y install libuhd-dev libuhd4.5.0 uhd-host
|
||||
$SUDO apt-get -y install libuhd-dev libuhd4.4.0 uhd-host
|
||||
;;
|
||||
esac
|
||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
The configuration module objectives are
|
||||
1. Allow easy parameters management in oai, helping the development of a flexible, modularized and fully configurable softmodem.
|
||||
2. Use a common configuration API in all oai modules
|
||||
3. Allow development of alternative configuration sources without modifying the oai code. Today the only delivered configuration source is the libconfig format configuration file.
|
||||
1. Use a common configuration API in all oai modules
|
||||
1. Allow development of alternative configuration sources without modifying the oai code. Today the only delivered configuration source is the libconfig format configuration file.
|
||||
|
||||
As a developer you may need to look at these sections:
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
The configuration module maps a configuration file section to a `paramdef_t` structure array. One `config_get` call can be used to return the values of all the parameters described in the `paramdef_t` array.
|
||||
Retrieving a single occurence of a parameter set ( a group in the libconfig terminology) is just a two steps task:
|
||||
1. describe the parameters in a `paramdef_t` array
|
||||
2. call the `config_get` function
|
||||
1. call the `config_get` function
|
||||
|
||||
|
||||
[config_get example](../../config/devusage/addaparam.md)
|
||||
|
||||
@@ -1,16 +1,9 @@
|
||||
[[_TOC_]]
|
||||
|
||||
# General usage
|
||||
|
||||
`-O` is the only mandatory command line option to start the softmodems (4G/5G xNB, UEs). It is used to specify the configuration source with the associated parameters:
|
||||
-O is the only mandatory command line option to start the eNodeb softmodem (lte-softmodem executable), it is used to specify the configuration source with the associated parameters:
|
||||
```bash
|
||||
$ ./lte-softmodem -O <configsource>:<parameter1>:<parameter2>:...
|
||||
```
|
||||
The same applies for `nr-softmodem`, `lte-uesoftmodem`, `nr-uesoftmodem`.
|
||||
|
||||
The configuration module can also be used without a configuration source, ie to only parse the command line. In this case the -O switch is optional. This mode is typically used in the `lte-uesoftmodem` executable and by the physical simulator executables (`ulsim`, `dlsim`).
|
||||
|
||||
# Configuration sources
|
||||
The configuration module can also be used without a configuration source, ie to only parse the command line. In this case the -O switch is optional. This mode is used in the ue-softmodem executable and by the phy_simulators executables (ulsim, dlsim)
|
||||
|
||||
Currently the available config sources are:
|
||||
|
||||
@@ -20,8 +13,6 @@ $ ./lte-softmodem -O libconfig:<config>:dbgl<debuglevel>
|
||||
```
|
||||
- **cmdlineonly**: command line only, the default mode for lte-uesoftmodem and the phy simiulators. In this case -O may be used to specify the config module debug level.
|
||||
|
||||
# Detailed configuration information and debugging
|
||||
|
||||
The debug level is a mask:
|
||||
* bit 1: print parameters values
|
||||
* bit 2: print memory allocation/free performed by the config module
|
||||
@@ -41,8 +32,8 @@ bit 5 (dbgl32) can be useful to detect unused parameters from a config file or t
|
||||
|
||||
To get help on supported parameters you can use specific options:
|
||||
|
||||
* `--help`: print help for command line only parameters and for parameters not defined in a specific section
|
||||
* `--help_<prefix>` : print help for parameters defined under the section `<prefix>`
|
||||
* ---help: print help for command line only parameters and for parameters not defined in a specific section
|
||||
* ---help_< prefix > : print help for parameters defined under the section < prefix >
|
||||
|
||||
```
|
||||
./lte-softmodem -O libconfig:/usr/local/oai/conf/enb.nbiot.band7.tm1.50PRB.usrpb210.conf --help
|
||||
@@ -93,16 +84,15 @@ Getting ENBSParams
|
||||
--------------------------------------------------------------------
|
||||
|
||||
/usr/local/oai/issue390_configmodule_cmdlinebug/openairinterface5g/common/config/config_cmdline.c:224 config_process_cmdline() Exiting OAI softmodem: [CONFIG] Exiting after displaying help
|
||||
|
||||
```
|
||||
|
||||
For the lte-softmodem (the eNodeB), the config source parameter defaults to libconfig, preserving the initial -O option format. In this case you cannot specify the debug level.
|
||||
For the lte-softmodem (the eNodeB) The config source parameter defaults to libconfig, preserving the initial -O option format. In this case you cannot specify the debug level.
|
||||
|
||||
```bash
|
||||
$ ./lte-softmodem -O <config>
|
||||
```
|
||||
|
||||
# Configuration of the configuration module
|
||||
|
||||
Configuration file parameters, except for the configuration file path, can be specified in a **config** section in the configuration file:
|
||||
|
||||
```
|
||||
@@ -111,12 +101,7 @@ config:
|
||||
debugflags = 1;
|
||||
}
|
||||
```
|
||||
|
||||
Configuration files examples can be found in the `targets/PROJECTS/GENERIC-LTE-EPC/CONF` sub-directory of the oai source tree.
|
||||
|
||||
# Overwriting config options from the command line
|
||||
|
||||
To minimize the number of configuration file to maintain, any parameter can also be specified on the command line. For example to modify the lte bandwidth to 20 MHz where the configuration file specifies 10MHz you can enter:
|
||||
Configuration files examples can be found in the targets/PROJECTS/GENERIC-LTE-EPC/CONF sub-directory of the oai source tree. To minimize the number of configuration file to maintain, any parameter can also be specified on the command line. For example to modify the lte bandwidth to 20 MHz where the configuration file specifies 10MHz you can enter:
|
||||
|
||||
```bash
|
||||
$ ./lte-softmodem -O <config> --eNBs.[0].component_carriers.[0].N_RB_DL 100
|
||||
|
||||
@@ -52,14 +52,11 @@
|
||||
|
||||
// Fixme: a better place to be shure it is called
|
||||
void read_cpu_hardware (void) __attribute__ ((constructor));
|
||||
#if !defined(__arm__) && !defined(__aarch64__)
|
||||
void read_cpu_hardware (void) {__builtin_cpu_init(); }
|
||||
#else
|
||||
void read_cpu_hardware (void) {}
|
||||
#endif
|
||||
void read_cpu_hardware (void) {__builtin_cpu_init(); }
|
||||
|
||||
log_mem_cnt_t log_mem_d[2];
|
||||
int log_mem_flag = 0;
|
||||
int log_mem_flag=0;
|
||||
int log_mem_multi=1;
|
||||
volatile int log_mem_side=0;
|
||||
pthread_mutex_t log_mem_lock;
|
||||
pthread_cond_t log_mem_notify;
|
||||
@@ -91,9 +88,9 @@ const mapping log_options[] = {{"nocolor", FLAG_NOCOLOR},
|
||||
|
||||
mapping log_maskmap[] = LOG_MASKMAP_INIT;
|
||||
|
||||
static const char *const log_level_highlight_start[] =
|
||||
static const char *log_level_highlight_start[] =
|
||||
{LOG_RED, LOG_ORANGE, LOG_GREEN, "", LOG_BLUE, LOG_CYBL}; /*!< \brief Optional start-format strings for highlighting */
|
||||
static const char *const log_level_highlight_end[] =
|
||||
static const char *log_level_highlight_end[] =
|
||||
{LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */
|
||||
static void log_output_memory(log_component_t *c, const char *file, const char *func, int line, int comp, int level, const char* format,va_list args);
|
||||
|
||||
@@ -944,24 +941,35 @@ static void log_output_memory(log_component_t *c, const char *file, const char *
|
||||
|
||||
int logInit_log_mem (void)
|
||||
{
|
||||
if (log_mem_flag == 1) {
|
||||
log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
|
||||
log_mem_d[0].buf_index = 0;
|
||||
log_mem_d[0].enable_flag = 1;
|
||||
log_mem_d[1].buf_p = malloc(LOG_MEM_SIZE);
|
||||
log_mem_d[1].buf_index = 0;
|
||||
log_mem_d[1].enable_flag = 1;
|
||||
log_mem_side = 0;
|
||||
if ((pthread_mutex_init(&log_mem_lock, NULL) != 0) || (pthread_cond_init(&log_mem_notify, NULL) != 0)) {
|
||||
if(log_mem_flag==1){
|
||||
if(log_mem_multi==1){
|
||||
printf("log-mem multi!!!\n");
|
||||
log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
|
||||
log_mem_d[0].buf_index=0;
|
||||
log_mem_d[0].enable_flag=1;
|
||||
log_mem_d[1].buf_p = malloc(LOG_MEM_SIZE);
|
||||
log_mem_d[1].buf_index=0;
|
||||
log_mem_d[1].enable_flag=1;
|
||||
log_mem_side=0;
|
||||
if ((pthread_mutex_init (&log_mem_lock, NULL) != 0)
|
||||
|| (pthread_cond_init (&log_mem_notify, NULL) != 0)) {
|
||||
log_mem_d[1].enable_flag=0;
|
||||
return -1;
|
||||
}
|
||||
pthread_create(&log_mem_thread, NULL, (void *(*)(void *))flush_mem_to_file, (void *)NULL);
|
||||
} else {
|
||||
log_mem_d[0].buf_p = NULL;
|
||||
log_mem_d[1].buf_p = NULL;
|
||||
log_mem_d[0].enable_flag = 0;
|
||||
log_mem_d[1].enable_flag = 0;
|
||||
pthread_create(&log_mem_thread, NULL, (void *(*)(void *))flush_mem_to_file, (void*)NULL);
|
||||
}else{
|
||||
printf("log-mem single!!!\n");
|
||||
log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
|
||||
log_mem_d[0].buf_index=0;
|
||||
log_mem_d[0].enable_flag=1;
|
||||
log_mem_d[1].enable_flag=0;
|
||||
log_mem_side=0;
|
||||
}
|
||||
}else{
|
||||
log_mem_d[0].buf_p=NULL;
|
||||
log_mem_d[1].buf_p=NULL;
|
||||
log_mem_d[0].enable_flag=0;
|
||||
log_mem_d[1].enable_flag=0;
|
||||
}
|
||||
|
||||
printf("log init done\n");
|
||||
@@ -981,6 +989,7 @@ void close_log_mem(void){
|
||||
while(log_mem_write_flag==1){
|
||||
usleep(100);
|
||||
}
|
||||
if(log_mem_multi==1){
|
||||
snprintf(f_name,1024, "%s_%d.log",log_mem_filename,log_mem_file_cnt);
|
||||
fp=open(f_name, O_WRONLY | O_CREAT, 0666);
|
||||
int ret = write(fp, log_mem_d[0].buf_p, log_mem_d[0].buf_index);
|
||||
@@ -1000,6 +1009,16 @@ void close_log_mem(void){
|
||||
}
|
||||
close(fp);
|
||||
free(log_mem_d[1].buf_p);
|
||||
}else{
|
||||
fp=open(log_mem_filename, O_WRONLY | O_CREAT, 0666);
|
||||
int ret = write(fp, log_mem_d[0].buf_p, log_mem_d[0].buf_index);
|
||||
if ( ret < 0) {
|
||||
fprintf(stderr,"{LOG} %s %d Couldn't write in %s \n",__FILE__,__LINE__,log_mem_filename);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
close(fp);
|
||||
free(log_mem_d[0].buf_p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
if (CROSS_COMPILE)
|
||||
find_package(genids)
|
||||
else()
|
||||
add_executable(genids genids.c)
|
||||
set_target_properties(genids PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
|
||||
export(TARGETS genids FILE
|
||||
"${CMAKE_BINARY_DIR}/genidsConfig.cmake")
|
||||
endif()
|
||||
add_executable(genids genids.c)
|
||||
set_target_properties(genids PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
|
||||
|
||||
add_custom_command(OUTPUT T_IDs.h
|
||||
COMMAND genids ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt T_IDs.h
|
||||
COMMAND ./genids ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt T_IDs.h
|
||||
DEPENDS genids
|
||||
COMMENT "Generating T_IDs.h from T_messages.txt"
|
||||
)
|
||||
@@ -17,19 +12,14 @@ add_custom_command(OUTPUT T_messages.txt.h
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
if (CROSS_COMPILE)
|
||||
find_package(_check_vcd)
|
||||
else ()
|
||||
add_executable(_check_vcd check_vcd.c tracer/database.c tracer/utils.c T_IDs.h T_messages.txt.h)
|
||||
target_include_directories(_check_vcd PRIVATE
|
||||
.. ../itti ../../../openair2/COMMON tracer
|
||||
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
target_compile_options(_check_vcd PRIVATE -Wall)
|
||||
target_link_libraries(_check_vcd PRIVATE m pthread)
|
||||
set_target_properties(_check_vcd PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
|
||||
export(TARGETS _check_vcd FILE
|
||||
"${CMAKE_BINARY_DIR}/_check_vcdConfig.cmake")
|
||||
endif()
|
||||
add_executable(_check_vcd check_vcd.c tracer/database.c tracer/utils.c T_IDs.h T_messages.txt.h)
|
||||
target_include_directories(_check_vcd PRIVATE
|
||||
.. ../itti ../../../openair2/COMMON tracer
|
||||
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
target_compile_options(_check_vcd PRIVATE -Wall)
|
||||
target_link_libraries(_check_vcd PRIVATE m pthread)
|
||||
set_target_properties(_check_vcd PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
|
||||
|
||||
add_custom_target(check_vcd
|
||||
COMMAND _check_vcd ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt ${CMAKE_CURRENT_SOURCE_DIR}/../LOG/vcd_signal_dumper.h
|
||||
DEPENDS _check_vcd
|
||||
|
||||
@@ -274,7 +274,6 @@ void sr(void *_d, event e)
|
||||
#define NR_NO_RNTI 0
|
||||
#define NR_RA_RNTI 2
|
||||
#define NR_C_RNTI 3
|
||||
#define NR_SI_RNTI 4
|
||||
|
||||
void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
|
||||
int frame, int slot, int harq_pid, void *buf, int bufsize,
|
||||
@@ -347,17 +346,8 @@ void nr_dl(void *_d, event e)
|
||||
{
|
||||
ev_data *d = _d;
|
||||
|
||||
if (e.e[d->dl_rnti].i == 0xffff) {
|
||||
if (d->no_sib) return;
|
||||
|
||||
if (d->max_sib && d->cur_sib == d->max_sib) return;
|
||||
|
||||
d->cur_sib++;
|
||||
}
|
||||
|
||||
trace_nr(d, NR_DIRECTION_DOWNLINK,
|
||||
e.e[d->dl_rnti].i != 0xffff ? NR_C_RNTI : NR_SI_RNTI,
|
||||
e.e[d->nr_dl_rnti].i, e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
|
||||
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_rnti].i,
|
||||
e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
|
||||
e.e[d->nr_dl_harq_pid].i, e.e[d->nr_dl_data].b,
|
||||
e.e[d->nr_dl_data].bsize, NO_PREAMBLE);
|
||||
}
|
||||
|
||||
@@ -49,8 +49,8 @@
|
||||
* ```
|
||||
*/
|
||||
|
||||
#if TRACE_ASN1C_ENC_DEC
|
||||
#include "common/utils/LOG/log.h"
|
||||
#if TRACE_ASN1C_ENC_DEC
|
||||
#define ASN_DEBUG(x...) do{ LOG_I(ASN1,x);LOG_I(ASN1,"\n"); } while(false)
|
||||
#else
|
||||
#define ASN_DEBUG(x...)
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "byte_array.h"
|
||||
|
||||
#include "common/utils/assertions.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
byte_array_t copy_byte_array(byte_array_t src)
|
||||
@@ -57,19 +56,3 @@ bool eq_byte_array(const byte_array_t* m0, const byte_array_t* m1)
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
byte_array_t cp_str_to_ba(const char* str)
|
||||
{
|
||||
assert(str != NULL);
|
||||
|
||||
const size_t sz = strlen(str);
|
||||
|
||||
byte_array_t dst = {.len = sz};
|
||||
|
||||
dst.buf = calloc(sz,sizeof(uint8_t));
|
||||
assert(dst.buf != NULL && "Memory exhausted");
|
||||
|
||||
memcpy(dst.buf, str, sz);
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
@@ -19,10 +19,8 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef BYTE_ARRAY_H
|
||||
#define BYTE_ARRAY_H
|
||||
|
||||
/* WARNING: This file is also defined at XXXXX. Both files need to be completely equal. Same applies for *.c */
|
||||
#ifndef BYTE_ARRAY_H_OAI
|
||||
#define BYTE_ARRAY_H_OAI
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
@@ -41,6 +39,4 @@ byte_array_t copy_byte_array(byte_array_t src);
|
||||
void free_byte_array(byte_array_t ba);
|
||||
bool eq_byte_array(const byte_array_t* m0, const byte_array_t* m1);
|
||||
|
||||
byte_array_t cp_str_to_ba(const char* str);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -36,416 +36,215 @@
|
||||
#include "PHY/LTE_TRANSPORT/transport_common.h"
|
||||
|
||||
// This is table 5.7.1-4 from 36.211
|
||||
const PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = {
|
||||
// TDD Configuration Index 0
|
||||
{{1, {{0, 1, 0, 2}}},
|
||||
{1, {{0, 1, 0, 1}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{1, {{0, 1, 0, 2}}},
|
||||
{1, {{0, 1, 0, 1}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{1, {{0, 1, 0, 2}}}},
|
||||
// TDD Configuration Index 1
|
||||
{{1, {{0, 2, 0, 2}}},
|
||||
{1, {{0, 2, 0, 1}}},
|
||||
{1, {{0, 2, 0, 0}}},
|
||||
{1, {{0, 2, 0, 2}}},
|
||||
{1, {{0, 2, 0, 1}}},
|
||||
{1, {{0, 2, 0, 0}}},
|
||||
{1, {{0, 2, 0, 2}}}},
|
||||
// TDD Configuration Index 2
|
||||
{{1, {{0, 1, 1, 2}}},
|
||||
{1, {{0, 1, 1, 1}}},
|
||||
{1, {{0, 1, 1, 0}}},
|
||||
{1, {{0, 1, 0, 1}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 1, 1}}}},
|
||||
// TDD Configuration Index 3
|
||||
{{1, {{0, 0, 0, 2}}},
|
||||
{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 2}}},
|
||||
{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 2}}}},
|
||||
// TDD Configuration Index 4
|
||||
{{1, {{0, 0, 1, 2}}},
|
||||
{1, {{0, 0, 1, 1}}},
|
||||
{1, {{0, 0, 1, 0}}},
|
||||
{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 5
|
||||
{{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 1}}}},
|
||||
// TDD Configuration Index 6
|
||||
{{2, {{0, 0, 0, 2}, {0, 0, 1, 2}}},
|
||||
{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
|
||||
{2, {{0, 0, 0, 1}, {0, 0, 0, 2}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 0, 1}}},
|
||||
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 2}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 7
|
||||
{{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 0, 2}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 1}, {0, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 8
|
||||
{{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 0, 1}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 9
|
||||
{{3, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 2}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 1}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 1}}},
|
||||
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 10
|
||||
{{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
|
||||
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 0, 2}, {0, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 11
|
||||
{{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 12
|
||||
{{4, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 2}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}}},
|
||||
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 13
|
||||
{{4, {{0, 0, 0, 0}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 2}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 1}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 14
|
||||
{{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 15
|
||||
{{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 1}, {1, 0, 0, 2}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}, {2, 0, 0, 1}}},
|
||||
{5, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 16
|
||||
{{5, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 1, 1}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 1, 0}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}, {1, 0, 0, 2}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}, {2, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}}},
|
||||
// TDD Configuration Index 17
|
||||
{{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 2}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}, {1, 0, 0, 1}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}}},
|
||||
// TDD Configuration Index 18
|
||||
{{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}, {2, 0, 1, 0}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}, {1, 0, 0, 1}, {1, 0, 0, 2}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}, {2, 0, 0, 0}, {2, 0, 0, 1}}},
|
||||
{6, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}, {5, 0, 0, 0}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 2}}}},
|
||||
// TDD Configuration Index 19
|
||||
{{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 1, 1}}}},
|
||||
// TDD Configuration Index 20
|
||||
{{1, {{0, 1, 0, 1}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 0, 1}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 0, 1}}}},
|
||||
// TDD Configuration Index 21
|
||||
{{1, {{0, 2, 0, 1}}},
|
||||
{1, {{0, 2, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 2, 0, 1}}},
|
||||
{1, {{0, 2, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 2, 0, 1}}}},
|
||||
PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = {
|
||||
// TDD Configuration Index 0
|
||||
{ {1,{{0,1,0,2}}},{1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {1,{{0,1,0,2}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {1,{{0,1,0,2}}}},
|
||||
// TDD Configuration Index 1
|
||||
{ {1,{{0,2,0,2}}},{1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {1,{{0,2,0,2}}}, {1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {1,{{0,2,0,2}}}},
|
||||
// TDD Configuration Index 2
|
||||
{ {1,{{0,1,1,2}}},{1,{{0,1,1,1}}}, {1,{{0,1,1,0}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,1,1}}}},
|
||||
// TDD Configuration Index 3
|
||||
{ {1,{{0,0,0,2}}},{1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {1,{{0,0,0,2}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {1,{{0,0,0,2}}}},
|
||||
// TDD Configuration Index 4
|
||||
{ {1,{{0,0,1,2}}},{1,{{0,0,1,1}}}, {1,{{0,0,1,0}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,1,1}}}},
|
||||
// TDD Configuration Index 5
|
||||
{ {1,{{0,0,0,1}}},{1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}},
|
||||
// TDD Configuration Index 6
|
||||
{ {2,{{0,0,0,2},{0,0,1,2}}}, {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {2,{{0,0,0,1},{0,0,0,2}}}, {2,{{0,0,0,0},{0,0,0,1}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {2,{{0,0,0,2},{0,0,1,1}}}},
|
||||
// TDD Configuration Index 7
|
||||
{ {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{0,0,0,2}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{0,0,1,0}}}},
|
||||
// TDD Configuration Index 8
|
||||
{ {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{0,0,0,1}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{0,0,1,1}}}},
|
||||
// TDD Configuration Index 9
|
||||
{ {3,{{0,0,0,1},{0,0,0,2},{0,0,1,2}}}, {3,{{0,0,0,0},{0,0,0,1},{0,0,1,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,1},{0,0,0,2}}}, {3,{{0,0,0,0},{0,0,0,1},{1,0,0,1}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {3,{{0,0,0,1},{0,0,0,2},{0,0,1,1}}}},
|
||||
// TDD Configuration Index 10
|
||||
{ {3,{{0,0,0,0},{0,0,1,0},{0,0,1,1}}}, {3,{{0,0,0,1},{0,0,1,0},{0,0,1,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,1},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,2},{0,0,1,0}}}},
|
||||
// TDD Configuration Index 11
|
||||
{ {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,1},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{0,0,1,0},{0,0,1,1}}}},
|
||||
// TDD Configuration Index 12
|
||||
{ {4,{{0,0,0,1},{0,0,0,2},{0,0,1,1},{0,0,1,2}}}, {4,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1}}},
|
||||
{4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}},
|
||||
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,2}}},
|
||||
{4,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1}}},
|
||||
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
|
||||
{4,{{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1}}}
|
||||
},
|
||||
// TDD Configuration Index 13
|
||||
{ {4,{{0,0,0,0},{0,0,0,2},{0,0,1,0},{0,0,1,2}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,1}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,1}}}
|
||||
},
|
||||
// TDD Configuration Index 14
|
||||
{ {4,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,0},{0,0,0,2},{0,0,1,0},{0,0,1,1}}}
|
||||
},
|
||||
// TDD Configuration Index 15
|
||||
{ {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,1},{0,0,1,2}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,1}}},
|
||||
{5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,1},{1,0,0,2}}},
|
||||
{5,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1},{2,0,0,1}}}, {5,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0}}},
|
||||
{5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1}}}
|
||||
},
|
||||
// TDD Configuration Index 16
|
||||
{ {5,{{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{0,0,1,2}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,1,1}}},
|
||||
{5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,1,0}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0},{1,0,0,2}}},
|
||||
{5,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}
|
||||
},
|
||||
// TDD Configuration Index 17
|
||||
{ {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,2}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0},{1,0,0,1}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}
|
||||
},
|
||||
// TDD Configuration Index 18
|
||||
{ {6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{0,0,1,2}}},
|
||||
{6,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,1},{1,0,1,1}}},
|
||||
{6,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0},{2,0,1,0}}},
|
||||
{6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0},{1,0,0,1},{1,0,0,2}}},
|
||||
{6,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1},{2,0,0,0},{2,0,0,1}}},
|
||||
{6,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0},{5,0,0,0}}},
|
||||
{6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{1,0,0,2}}}
|
||||
},
|
||||
// TDD Configuration Index 19
|
||||
{ {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{6,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,0},{1,0,1,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{1,0,1,1}}}
|
||||
},
|
||||
// TDD Configuration Index 20
|
||||
{ {1,{{0,1,0,1}}},{1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}},
|
||||
// TDD Configuration Index 21
|
||||
{ {1,{{0,2,0,1}}},{1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}},
|
||||
|
||||
// TDD Configuration Index 22
|
||||
{{1, {{0, 1, 1, 1}}},
|
||||
{1, {{0, 1, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 1, 0}}}},
|
||||
// TDD Configuration Index 22
|
||||
{ {1,{{0,1,1,1}}},{1,{{0,1,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,1,0}}}},
|
||||
|
||||
// TDD Configuration Index 23
|
||||
{{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 1}}}},
|
||||
// TDD Configuration Index 23
|
||||
{ {1,{{0,0,0,1}}},{1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}},
|
||||
|
||||
// TDD Configuration Index 24
|
||||
{{1, {{0, 0, 1, 1}}},
|
||||
{1, {{0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 24
|
||||
{ {1,{{0,0,1,1}}},{1,{{0,0,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,1,0}}}},
|
||||
|
||||
// TDD Configuration Index 25
|
||||
{{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 1}, {1, 0, 0, 1}}},
|
||||
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 1}, {0, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 25
|
||||
{ {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{1,0,0,1}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{0,0,1,0}}}},
|
||||
|
||||
// TDD Configuration Index 26
|
||||
{{3, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}}},
|
||||
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}}}},
|
||||
// TDD Configuration Index 26
|
||||
{ {3,{{0,0,0,1},{0,0,1,1},{1,0,0,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{1,0,0,1},{2,0,0,1}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{0,0,1,0},{1,0,0,1}}}},
|
||||
|
||||
// TDD Configuration Index 27
|
||||
{{4, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}}},
|
||||
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 27
|
||||
{ {4,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1}}}, {4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1}}},
|
||||
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0}}}
|
||||
},
|
||||
|
||||
// TDD Configuration Index 28
|
||||
{{5, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{5, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}}},
|
||||
{5, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{5, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}}}},
|
||||
// TDD Configuration Index 28
|
||||
{ {5,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1}}}, {5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {5,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1}}},
|
||||
{5,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{5,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1}}}
|
||||
},
|
||||
|
||||
// TDD Configuration Index 29
|
||||
{{6, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}, {2, 0, 1, 1}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}, {2, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{6, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}, {5, 0, 0, 1}}},
|
||||
{6, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}, {5, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{6, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}, {2, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 29
|
||||
{ {6,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1},{2,0,1,1}}},
|
||||
{6,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0},{2,0,1,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{6,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1},{5,0,0,1}}},
|
||||
{6,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0},{5,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{6,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1},{2,0,1,0}}}
|
||||
},
|
||||
|
||||
// TDD Configuration Index 30
|
||||
{{1, {{0, 1, 0, 1}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 0, 1}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 0, 1}}}},
|
||||
|
||||
// TDD Configuration Index 31
|
||||
{{1, {{0, 2, 0, 1}}},
|
||||
{1, {{0, 2, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 2, 0, 1}}},
|
||||
{1, {{0, 2, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 2, 0, 1}}}},
|
||||
// TDD Configuration Index 30
|
||||
{ {1,{{0,1,0,1}}},{1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}},
|
||||
|
||||
// TDD Configuration Index 32
|
||||
{{1, {{0, 1, 1, 1}}},
|
||||
{1, {{0, 1, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 1, 0}}}},
|
||||
// TDD Configuration Index 31
|
||||
{ {1,{{0,2,0,1}}},{1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}},
|
||||
|
||||
// TDD Configuration Index 33
|
||||
{{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 1}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 1}}}},
|
||||
// TDD Configuration Index 32
|
||||
{ {1,{{0,1,1,1}}},{1,{{0,1,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,1,0}}}},
|
||||
|
||||
// TDD Configuration Index 34
|
||||
{{1, {{0, 0, 1, 1}}},
|
||||
{1, {{0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 33
|
||||
{ {1,{{0,0,0,1}}},{1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}},
|
||||
|
||||
// TDD Configuration Index 35
|
||||
{{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
|
||||
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 1}, {1, 0, 0, 1}}},
|
||||
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 1}, {0, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 34
|
||||
{ {1,{{0,0,1,1}}},{1,{{0,0,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,1,0}}}},
|
||||
|
||||
// TDD Configuration Index 36
|
||||
{{3, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}}},
|
||||
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}}},
|
||||
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}}}},
|
||||
// TDD Configuration Index 35
|
||||
{ {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{1,0,0,1}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{0,0,1,0}}}},
|
||||
|
||||
// TDD Configuration Index 37
|
||||
{{4, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}}},
|
||||
{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}}},
|
||||
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 36
|
||||
{ {3,{{0,0,0,1},{0,0,1,1},{1,0,0,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{1,0,0,1},{2,0,0,1}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{0,0,1,0},{1,0,0,1}}}},
|
||||
|
||||
// TDD Configuration Index 38
|
||||
{{5, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}}},
|
||||
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{5, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}}},
|
||||
{5, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{5, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}}}},
|
||||
// TDD Configuration Index 37
|
||||
{ {4,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1}}}, {4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1}}},
|
||||
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0}}}
|
||||
},
|
||||
|
||||
// TDD Configuration Index 39
|
||||
{{6, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}, {2, 0, 1, 1}}},
|
||||
{6, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}, {2, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{6, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}, {5, 0, 0, 1}}},
|
||||
{6, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}, {5, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{6, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}, {2, 0, 1, 0}}}},
|
||||
// TDD Configuration Index 38
|
||||
{ {5,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1}}}, {5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {5,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1}}},
|
||||
{5,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{5,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1}}}
|
||||
},
|
||||
|
||||
// TDD Configuration Index 40
|
||||
{{1, {{0, 1, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 1, 0, 0}}}},
|
||||
// TDD Configuration Index 41
|
||||
{{1, {{0, 2, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 2, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 2, 0, 0}}}},
|
||||
// TDD Configuration Index 39
|
||||
{ {6,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1},{2,0,1,1}}},
|
||||
{6,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0},{2,0,1,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{6,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1},{5,0,0,1}}},
|
||||
{6,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0},{5,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{6,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1},{2,0,1,0}}}
|
||||
},
|
||||
|
||||
// TDD Configuration Index 42
|
||||
{{1, {{0, 1, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}}},
|
||||
// TDD Configuration Index 40
|
||||
{ {1,{{0,1,0,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,0}}}},
|
||||
// TDD Configuration Index 41
|
||||
{ {1,{{0,2,0,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,0}}}},
|
||||
|
||||
// TDD Configuration Index 43
|
||||
{{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{1, {{0, 0, 0, 0}}}},
|
||||
// TDD Configuration Index 42
|
||||
{ {1,{{0,1,1,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}},
|
||||
|
||||
// TDD Configuration Index 44
|
||||
{{1, {{0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}}}},
|
||||
// TDD Configuration Index 43
|
||||
{ {1,{{0,0,0,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,0}}}},
|
||||
|
||||
// TDD Configuration Index 45
|
||||
{{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}}},
|
||||
// TDD Configuration Index 44
|
||||
{ {1,{{0,0,1,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}},
|
||||
|
||||
// TDD Configuration Index 46
|
||||
{{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}}},
|
||||
// TDD Configuration Index 45
|
||||
{ {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{1,0,0,0}}}},
|
||||
|
||||
// TDD Configuration Index 46
|
||||
{ {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}},
|
||||
|
||||
// TDD Configuration Index 47
|
||||
{ {4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
|
||||
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}}
|
||||
}
|
||||
};
|
||||
|
||||
// TDD Configuration Index 47
|
||||
{{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
|
||||
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}}}};
|
||||
|
||||
uint8_t get_prach_fmt(int prach_ConfigIndex,int frame_type) {
|
||||
if (frame_type == FDD) // FDD
|
||||
|
||||
@@ -33,56 +33,15 @@
|
||||
#include <stdint.h>
|
||||
#include "assertions.h"
|
||||
#include "nr_common.h"
|
||||
#include <complex.h>
|
||||
|
||||
const char *duplex_mode[]={"FDD","TDD"};
|
||||
|
||||
static const uint8_t bit_reverse_table_256[] = {
|
||||
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8,
|
||||
0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
|
||||
0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC,
|
||||
0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
|
||||
0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 0x06, 0x86, 0x46, 0xC6,
|
||||
0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
|
||||
0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1,
|
||||
0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
|
||||
0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD,
|
||||
0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
|
||||
0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB,
|
||||
0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
|
||||
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF};
|
||||
|
||||
// Reverse bits implementation based on http://graphics.stanford.edu/~seander/bithacks.html
|
||||
uint64_t reverse_bits(uint64_t in, int n_bits)
|
||||
{
|
||||
// Reverse n_bits in uint64_t variable, example:
|
||||
// n_bits: 10
|
||||
// in: 10 0000 1111
|
||||
// return: 11 1100 0001
|
||||
|
||||
AssertFatal(n_bits <= 64, "Maximum bits to reverse is 64, impossible to reverse %d bits!\n", n_bits);
|
||||
uint64_t rev_bits = 0;
|
||||
uint8_t *p = (uint8_t *)∈
|
||||
uint8_t *q = (uint8_t *)&rev_bits;
|
||||
int n_bytes = n_bits >> 3;
|
||||
for (int n = 0; n < n_bytes; n++) {
|
||||
q[n_bytes - 1 - n] = bit_reverse_table_256[p[n]];
|
||||
}
|
||||
|
||||
// Reverse remaining bits (not aligned with 8-bit)
|
||||
rev_bits = rev_bits << (n_bits % 8);
|
||||
for (int i = n_bytes * 8; i < n_bits; i++) {
|
||||
rev_bits |= ((in >> i) & 0x1) << (n_bits - i - 1);
|
||||
}
|
||||
return rev_bits;
|
||||
}
|
||||
|
||||
static const int tables_5_3_2[5][12] = {
|
||||
{25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1, -1}, // 15 FR1
|
||||
{11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 245, 273}, // 30 FR1
|
||||
{-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 121, 135}, // 60 FR1
|
||||
{66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 60 FR2
|
||||
{32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1} // 120FR2
|
||||
int tables_5_3_2[5][12] = {
|
||||
{25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1, -1}, // 15 FR1
|
||||
{11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 245, 273},// 30 FR1
|
||||
{-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 121, 135}, // 60 FR1
|
||||
{66, 132, 264, -1 , -1, -1, -1, -1, -1, -1, -1, -1}, // 60 FR2
|
||||
{32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1} // 120FR2
|
||||
};
|
||||
|
||||
int get_supported_band_index(int scs, int band, int n_rbs)
|
||||
@@ -779,89 +738,3 @@ uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB,
|
||||
AssertFatal(sco % scs_scaling == 0, "ssb offset %d can create frequency offset\n", sco);
|
||||
return ssb_offset_point_a;
|
||||
}
|
||||
|
||||
int get_delay_idx(int delay, int max_delay_comp)
|
||||
{
|
||||
int delay_idx = max_delay_comp + delay;
|
||||
// If the measured delay is less than -MAX_DELAY_COMP, a -MAX_DELAY_COMP delay is compensated.
|
||||
delay_idx = max(delay_idx, 0);
|
||||
// If the measured delay is greater than +MAX_DELAY_COMP, a +MAX_DELAY_COMP delay is compensated.
|
||||
delay_idx = min(delay_idx, max_delay_comp << 1);
|
||||
return delay_idx;
|
||||
}
|
||||
|
||||
void init_delay_table(uint16_t ofdm_symbol_size,
|
||||
int max_delay_comp,
|
||||
int max_ofdm_symbol_size,
|
||||
c16_t delay_table[][max_ofdm_symbol_size])
|
||||
{
|
||||
for (int delay = -max_delay_comp; delay <= max_delay_comp; delay++) {
|
||||
for (int k = 0; k < ofdm_symbol_size; k++) {
|
||||
double complex delay_cexp = cexp(I * (2.0 * M_PI * k * delay / ofdm_symbol_size));
|
||||
delay_table[max_delay_comp + delay][k].r = (int16_t)round(256 * creal(delay_cexp));
|
||||
delay_table[max_delay_comp + delay][k].i = (int16_t)round(256 * cimag(delay_cexp));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void freq2time(uint16_t ofdm_symbol_size,
|
||||
int16_t *freq_signal,
|
||||
int16_t *time_signal)
|
||||
{
|
||||
switch (ofdm_symbol_size) {
|
||||
case 128:
|
||||
idft(IDFT_128, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 256:
|
||||
idft(IDFT_256, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 512:
|
||||
idft(IDFT_512, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 1024:
|
||||
idft(IDFT_1024, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 1536:
|
||||
idft(IDFT_1536, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 2048:
|
||||
idft(IDFT_2048, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 4096:
|
||||
idft(IDFT_4096, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 6144:
|
||||
idft(IDFT_6144, freq_signal, time_signal, 1);
|
||||
break;
|
||||
case 8192:
|
||||
idft(IDFT_8192, freq_signal, time_signal, 1);
|
||||
break;
|
||||
default:
|
||||
AssertFatal (1 == 0, "Invalid ofdm_symbol_size %i\n", ofdm_symbol_size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay)
|
||||
{
|
||||
freq2time(ofdm_symbol_size, (int16_t *)ls_est, (int16_t *)ch_estimates_time);
|
||||
|
||||
int max_pos = delay->delay_max_pos;
|
||||
int max_val = delay->delay_max_val;
|
||||
const int sync_pos = 0;
|
||||
|
||||
for (int i = 0; i < ofdm_symbol_size; i++) {
|
||||
int temp = c16amp2(ch_estimates_time[i]) >> 1;
|
||||
if (temp > max_val) {
|
||||
max_pos = i;
|
||||
max_val = temp;
|
||||
}
|
||||
}
|
||||
|
||||
if (max_pos > ofdm_symbol_size / 2)
|
||||
max_pos = max_pos - ofdm_symbol_size;
|
||||
|
||||
delay->delay_max_pos = max_pos;
|
||||
delay->delay_max_val = max_val;
|
||||
delay->est_delay = max_pos - sync_pos;
|
||||
}
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
#define NR_MAX_HARQ_PROCESSES 16
|
||||
#define NR_NB_REG_PER_CCE 6
|
||||
#define NR_NB_SC_PER_RB 12
|
||||
#define NR_MAX_NUM_LCID 32
|
||||
|
||||
typedef enum {
|
||||
nr_FR1 = 0,
|
||||
@@ -73,15 +72,6 @@ typedef enum frequency_range_e {
|
||||
FR2
|
||||
} frequency_range_t;
|
||||
|
||||
typedef struct {
|
||||
/// Time shift in number of samples estimated based on DMRS-PDSCH/PUSCH
|
||||
int est_delay;
|
||||
/// Max position in OFDM symbol related to time shift estimation based on DMRS-PDSCH/PUSCH
|
||||
int delay_max_pos;
|
||||
/// Max value related to time shift estimation based on DMRS-PDSCH/PUSCH
|
||||
int delay_max_val;
|
||||
} delay_t;
|
||||
|
||||
extern const nr_bandentry_t nr_bandtable[];
|
||||
|
||||
static inline int get_num_dmrs(uint16_t dmrs_mask ) {
|
||||
@@ -90,8 +80,6 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) {
|
||||
return(num_dmrs);
|
||||
}
|
||||
|
||||
uint64_t reverse_bits(uint64_t in, int n_bits);
|
||||
|
||||
int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUplinkSymbols);
|
||||
int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs);
|
||||
int get_SLIV(uint8_t S, uint8_t L);
|
||||
@@ -126,14 +114,6 @@ uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB,
|
||||
int ssbSubcarrierSpacing,
|
||||
int frequency_range);
|
||||
int get_ssb_subcarrier_offset(uint32_t absoluteFrequencySSB, uint32_t absoluteFrequencyPointA);
|
||||
int get_delay_idx(int delay, int max_delay_comp);
|
||||
|
||||
void freq2time(uint16_t ofdm_symbol_size,
|
||||
int16_t *freq_signal,
|
||||
int16_t *time_signal);
|
||||
|
||||
void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay);
|
||||
|
||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ extern "C" {
|
||||
int nb_fd_epoll=0;
|
||||
int epoll_fd=-1;
|
||||
int sem_fd=-1;
|
||||
size_t last_log_size = 0;
|
||||
} task_list_t;
|
||||
|
||||
int timer_expired(int fd);
|
||||
@@ -132,23 +131,11 @@ extern "C" {
|
||||
int message_id = message->ittiMsgHeader.messageId;
|
||||
size_t s=t->message_queue.size();
|
||||
|
||||
// to reduce the number of logs, we give a message each increase of 25%
|
||||
if ((s > t->last_log_size * 1.25) && (s > t->admin.queue_size / 10)) {
|
||||
if (s > t->admin.queue_size) {
|
||||
LOG_E(TMR, "Queue for %s task contains %ld messages\n", itti_get_task_name(destination_task_id), s);
|
||||
} else {
|
||||
LOG_I(ITTI,
|
||||
"Queue for %s task size: %ld (last message %s)\n",
|
||||
itti_get_task_name(destination_task_id),
|
||||
s + 1,
|
||||
ITTI_MSG_NAME(message));
|
||||
}
|
||||
t->last_log_size = s;
|
||||
} else if (t->last_log_size && s < t->admin.queue_size / 10) {
|
||||
// Inform when the queue decreases
|
||||
LOG_I(ITTI, "Queue for %s task size is back under 10%% of max size\n", itti_get_task_name(destination_task_id));
|
||||
t->last_log_size = 0;
|
||||
}
|
||||
if ( s > t->admin.queue_size )
|
||||
LOG_E(TMR,"Queue for %s task contains %ld messages\n", itti_get_task_name(destination_task_id), s );
|
||||
|
||||
if ( s > 50 )
|
||||
LOG_I(ITTI,"Queue for %s task size: %ld (last message %s)\n",itti_get_task_name(destination_task_id), s+1,ITTI_MSG_NAME(message));
|
||||
|
||||
t->message_queue.insert(t->message_queue.begin(), message);
|
||||
eventfd_t sem_counter = 1;
|
||||
|
||||
@@ -59,13 +59,8 @@ add_library(telnetsrv_ci MODULE telnetsrv_ci.c)
|
||||
target_link_libraries(telnetsrv_ci PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
add_dependencies(telnetsrv telnetsrv_ci)
|
||||
|
||||
message(STATUS "Add bearer specific telnet functions in libtelnetsrv_bearer.so")
|
||||
add_library(telnetsrv_bearer MODULE telnetsrv_bearer.c)
|
||||
target_link_libraries(telnetsrv_bearer PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
add_dependencies(telnetsrv telnetsrv_bearer)
|
||||
|
||||
# all libraries should be written to root build dir
|
||||
set_target_properties(telnetsrv telnetsrv_enb telnetsrv_5Gue telnetsrv_ci telnetsrv_bearer
|
||||
set_target_properties(telnetsrv telnetsrv_enb telnetsrv_5Gue telnetsrv_ci
|
||||
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../../..
|
||||
)
|
||||
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
/*
|
||||
* 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 <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
|
||||
#define TELNETSERVERCODE
|
||||
#include "telnetsrv.h"
|
||||
|
||||
#define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0)
|
||||
|
||||
static int get_single_ue_rnti(void)
|
||||
{
|
||||
rrc_gNB_ue_context_t *ue_context_p = NULL;
|
||||
RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &(RC.nrrrc[0]->rrc_ue_head)) {
|
||||
return ue_context_p->ue_context.rnti;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (buf)
|
||||
ERROR_MSG_RET("no parameter allowed\n");
|
||||
|
||||
int rnti = get_single_ue_rnti();
|
||||
if (rnti < 1)
|
||||
ERROR_MSG_RET("different number of UEs\n");
|
||||
|
||||
prnt("single UE RNTI %04x\n", rnti);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rrc_gNB_trigger_new_bearer(int rnti);
|
||||
int add_bearer(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
int rnti = -1;
|
||||
if (!buf) {
|
||||
rnti = get_single_ue_rnti();
|
||||
if (rnti < 1)
|
||||
ERROR_MSG_RET("no UE found\n");
|
||||
} else {
|
||||
rnti = strtol(buf, NULL, 16);
|
||||
if (rnti < 1 || rnti >= 0xfffe)
|
||||
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
|
||||
}
|
||||
|
||||
// verify it exists in RRC as well
|
||||
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
|
||||
if (!rrcue)
|
||||
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
|
||||
|
||||
rrc_gNB_trigger_new_bearer(rnti);
|
||||
prnt("called rrc_gNB_trigger_new_bearer(%04x)\n", rnti);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rrc_gNB_trigger_release_bearer(int rnti);
|
||||
int release_bearer(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
int rnti = -1;
|
||||
if (!buf) {
|
||||
rnti = get_single_ue_rnti();
|
||||
if (rnti < 1)
|
||||
ERROR_MSG_RET("no UE found\n");
|
||||
} else {
|
||||
rnti = strtol(buf, NULL, 16);
|
||||
if (rnti < 1 || rnti >= 0xfffe)
|
||||
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
|
||||
}
|
||||
|
||||
// verify it exists in RRC as well
|
||||
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
|
||||
if (!rrcue)
|
||||
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
|
||||
|
||||
rrc_gNB_trigger_release_bearer(rnti);
|
||||
prnt("called rrc_gNB_trigger_release_bearer(%04x)\n", rnti);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static telnetshell_cmddef_t bearercmds[] = {
|
||||
{"get_single_rnti", "", get_single_rnti},
|
||||
{"add_bearer", "[rnti(hex,opt)]", add_bearer},
|
||||
{"release_bearer", "[rnti(hex,opt)]", release_bearer},
|
||||
{"", "", NULL},
|
||||
};
|
||||
|
||||
static telnetshell_vardef_t bearervars[] = {
|
||||
|
||||
{"", 0, 0, NULL}
|
||||
};
|
||||
|
||||
void add_bearer_cmds(void) {
|
||||
add_telnetcmd("bearer", bearervars, bearercmds);
|
||||
}
|
||||
@@ -28,17 +28,15 @@
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
|
||||
#define TELNETSERVERCODE
|
||||
#include "telnetsrv.h"
|
||||
|
||||
#define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0)
|
||||
|
||||
static int get_single_ue_rnti_mac(void)
|
||||
static int get_single_ue_rnti(void)
|
||||
{
|
||||
NR_UE_info_t *ue = NULL;
|
||||
UE_iterator(RC.nrmac[0]->UE_info.list, it) {
|
||||
@@ -50,6 +48,11 @@ static int get_single_ue_rnti_mac(void)
|
||||
if (!ue)
|
||||
return -1;
|
||||
|
||||
// verify it exists in RRC as well
|
||||
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], ue->rnti);
|
||||
if (!rrcue)
|
||||
return -1;
|
||||
|
||||
return ue->rnti;
|
||||
}
|
||||
|
||||
@@ -58,7 +61,7 @@ int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
if (buf)
|
||||
ERROR_MSG_RET("no parameter allowed\n");
|
||||
|
||||
int rnti = get_single_ue_rnti_mac();
|
||||
int rnti = get_single_ue_rnti();
|
||||
if (rnti < 1)
|
||||
ERROR_MSG_RET("different number of UEs\n");
|
||||
|
||||
@@ -68,44 +71,9 @@ int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
|
||||
int get_reestab_count(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (!RC.nrrrc)
|
||||
ERROR_MSG_RET("no RRC present, cannot list counts\n");
|
||||
rrc_gNB_ue_context_t *ue = NULL;
|
||||
int rnti = -1;
|
||||
if (!buf) {
|
||||
rrc_gNB_ue_context_t *l = NULL;
|
||||
int n = 0;
|
||||
RB_FOREACH(l, rrc_nr_ue_tree_s, &RC.nrrrc[0]->rrc_ue_head) {
|
||||
if (ue == NULL) ue = l;
|
||||
n++;
|
||||
}
|
||||
if (!ue)
|
||||
ERROR_MSG_RET("could not find any UE in RRC\n");
|
||||
if (n > 1)
|
||||
ERROR_MSG_RET("more than one UE in RRC present\n");
|
||||
} else {
|
||||
rnti = strtol(buf, NULL, 16);
|
||||
if (rnti < 1 || rnti >= 0xfffe)
|
||||
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
|
||||
ue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
|
||||
if (!ue)
|
||||
ERROR_MSG_RET("could not find UE with RNTI %04x in RRC\n");
|
||||
}
|
||||
|
||||
prnt("UE RNTI %04x reestab %d reconf_after_reestab %d\n",
|
||||
ue->ue_context.rnti,
|
||||
ue->ue_context.ue_reestablishment_counter,
|
||||
ue->ue_context.ue_reconfiguration_after_reestablishment_counter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (!RC.nrmac)
|
||||
ERROR_MSG_RET("no MAC/RLC present, cannot trigger reestablishment\n");
|
||||
int rnti = -1;
|
||||
if (!buf) {
|
||||
rnti = get_single_ue_rnti_mac();
|
||||
rnti = get_single_ue_rnti();
|
||||
if (rnti < 1)
|
||||
ERROR_MSG_RET("no UE found\n");
|
||||
} else {
|
||||
@@ -114,9 +82,37 @@ int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
|
||||
}
|
||||
|
||||
nr_rlc_test_trigger_reestablishment(rnti);
|
||||
rrc_gNB_ue_context_t *ue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
|
||||
if (!ue)
|
||||
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
|
||||
|
||||
prnt("Reset RLC counters of UE RNTI %04x to trigger reestablishment\n", rnti);
|
||||
prnt("UE RNTI %04x reestab %d reconf_after_reestab %d\n",
|
||||
rnti,
|
||||
ue->ue_context.ue_reestablishment_counter,
|
||||
ue->ue_context.ue_reconfiguration_after_reestablishment_counter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
int rnti = -1;
|
||||
if (!buf) {
|
||||
rnti = get_single_ue_rnti();
|
||||
if (rnti < 1)
|
||||
ERROR_MSG_RET("no UE found\n");
|
||||
} else {
|
||||
rnti = strtol(buf, NULL, 16);
|
||||
if (rnti < 1 || rnti >= 0xfffe)
|
||||
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
|
||||
}
|
||||
|
||||
// verify it exists in RRC as well
|
||||
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
|
||||
if (!rrcue)
|
||||
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
|
||||
|
||||
nr_rlc_remove_ue(rnti);
|
||||
prnt("force-remove UE RNTI %04x from RLC to trigger reestablishment\n", rnti);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,6 +110,8 @@
|
||||
{"ulsch_ldpc_encoding_stats", &(UE->ulsch_ldpc_encoding_stats),0,1},\
|
||||
{"ulsch_interleaving_stats", &(UE->ulsch_interleaving_stats),0,1},\
|
||||
{"ulsch_multiplexing_stats", &(UE->ulsch_multiplexing_stats),0,1},\
|
||||
{"generic_stat", &(UE->generic_stat),0,1},\
|
||||
{"generic_stat_bis", &(UE->generic_stat_bis[0]),0,LTE_SLOTS_PER_SUBFRAME},\
|
||||
{"ofdm_demod_stats", &(UE->ofdm_demod_stats),0,1},\
|
||||
{"dlsch_rx_pdcch_stats", &(UE->dlsch_rx_pdcch_stats),0,1},\
|
||||
{"rx_dft_stats", &(UE->rx_dft_stats),0,1},\
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
#define THREAD_POOL_H
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <malloc.h>
|
||||
#include <stdalign.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
@@ -66,10 +64,7 @@ typedef struct notifiedFIFO_elt_s {
|
||||
oai_cputime_t startProcessingTime;
|
||||
oai_cputime_t endProcessingTime;
|
||||
oai_cputime_t returnTime;
|
||||
// use alignas(32) to align msgData to 32b
|
||||
// user data behind it will be aligned to 32b as well
|
||||
// important! this needs to be the last member in the struct
|
||||
alignas(32) void *msgData;
|
||||
void *msgData;
|
||||
} notifiedFIFO_elt_t;
|
||||
|
||||
typedef struct notifiedFIFO_s {
|
||||
@@ -85,15 +80,14 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size,
|
||||
uint64_t key,
|
||||
notifiedFIFO_t *reponseFifo,
|
||||
void (*processingFunc)(void *)) {
|
||||
notifiedFIFO_elt_t *ret = (notifiedFIFO_elt_t *)memalign(32, sizeof(notifiedFIFO_elt_t) + size);
|
||||
AssertFatal(NULL != ret, "out of memory\n");
|
||||
notifiedFIFO_elt_t *ret;
|
||||
AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) calloc(1, sizeof(notifiedFIFO_elt_t)+size+32)), "");
|
||||
ret->next=NULL;
|
||||
ret->key=key;
|
||||
ret->reponseFifo=reponseFifo;
|
||||
ret->processingFunc=processingFunc;
|
||||
// We set user data piece aligend 32 bytes to be able to process it with SIMD
|
||||
// msgData is aligned to 32bytes, so everything after will be as well
|
||||
ret->msgData = ((uint8_t *)ret) + sizeof(notifiedFIFO_elt_t);
|
||||
ret->msgData=(void *)((uint8_t*)ret+(sizeof(notifiedFIFO_elt_t)/32+1)*32);
|
||||
ret->malloced=true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ static time_stats_t **measur_table;
|
||||
notifiedFIFO_t measur_fifo;
|
||||
double get_cpu_freq_GHz(void)
|
||||
{
|
||||
if (cpu_freq_GHz <0.01 ) {
|
||||
if (cpu_freq_GHz <1 ) {
|
||||
time_stats_t ts = {0};
|
||||
reset_meas(&ts);
|
||||
ts.trials++;
|
||||
@@ -46,7 +46,8 @@ double get_cpu_freq_GHz(void)
|
||||
sleep(1);
|
||||
ts.diff = (rdtsc_oai()-ts.in);
|
||||
cpu_freq_GHz = (double)ts.diff/1000000000;
|
||||
}
|
||||
printf("CPU Freq is %f \n", cpu_freq_GHz);
|
||||
}
|
||||
return cpu_freq_GHz;
|
||||
}
|
||||
|
||||
|
||||
@@ -106,16 +106,8 @@ static inline unsigned long long rdtsc_oai(void) {
|
||||
__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
|
||||
return (d<<32) | a;
|
||||
}
|
||||
#elif defined(__aarch64__)
|
||||
static inline uint64_t rdtsc_oai(void) __attribute__((always_inline));
|
||||
static inline uint64_t rdtsc_oai(void)
|
||||
{
|
||||
uint64_t r = 0;
|
||||
asm volatile("mrs %0, cntvct_el0" : "=r"(r));
|
||||
return r;
|
||||
}
|
||||
|
||||
#elif defined(__arm__)
|
||||
#elif defined(__arm__) || defined(__aarch64__)
|
||||
static inline uint32_t rdtsc_oai(void) __attribute__((always_inline));
|
||||
static inline uint32_t rdtsc_oai(void) {
|
||||
uint32_t r = 0;
|
||||
|
||||
@@ -118,6 +118,12 @@ char *itoa(int i) {
|
||||
return strdup(buffer);
|
||||
}
|
||||
|
||||
void *memcpy1(void *dst,const void *src,size_t n) {
|
||||
|
||||
void *ret=dst;
|
||||
asm volatile("rep movsb" : "+D" (dst) : "c"(n), "S"(src) : "cc","memory");
|
||||
return(ret);
|
||||
}
|
||||
|
||||
void set_priority(int priority)
|
||||
{
|
||||
|
||||
@@ -102,6 +102,8 @@ int hex_char_to_hex_value (char c);
|
||||
// Converts an hexadecimal ASCII coded string into its value.**
|
||||
int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size);
|
||||
|
||||
void *memcpy1(void *dst,const void *src,size_t n);
|
||||
|
||||
void set_priority(int priority);
|
||||
|
||||
char *itoa(int i);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
The oai web server is an optional monitoring and debugging tool. Purpose is to give access to oai softmodems functionalities via a web interface. In this release interface to the telnet server commands and to the softscope are delivered.
|
||||
The oai web server is an optional monitoring and debugging tool. Purpose is to give access to oai softmodems functionalities via a web interface. In this first release interface to the telnet server commands and to the softscope are delivered.
|
||||
|
||||
* [Using the web server](websrvuse.md)
|
||||
* [enhancing the webserver](websrvdev.md)
|
||||
* [web server architecture ](websrvarch.md)
|
||||
* [Using the web server](webserverusage.md)
|
||||
* [enhancing the webserver](webserverdevcmd.md)
|
||||
* [web server architecture ](webserverarch.md)
|
||||
|
||||
[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
||||
|
||||
@@ -1,24 +1,21 @@
|
||||
# web server interface principles
|
||||
|
||||
The web server interface is implemented in two parts: a back-end, included in the softmodem process and a front-end which is a browser application.
|
||||
The web server interface is implemented in two parts: a back-end, included in the softmodem process and a front-end which is a browser application.
|
||||
|
||||
The oai web server back-end is implemented in a shared library to be loaded by the [oai shared library loader](../../DOC/loader.md) when `--websrv` option is specified on the command line. `libwebsrv.so` code is common to all oai softmodem executables,
|
||||
the current release has been tested with the nr UE and the gNB.
|
||||
The oai web server back-end is implemented in a shared library to be loaded by the [oai shared library loader](loader) when `--websrv` option is specified on the command line. `libwebsrv.so ` code is common to all oai softmodem executables, the current release has been tested with the nr UE and the gNB.
|
||||
|
||||
The front-end is an [angular](https://angular.io/docs) application. After being built and installed it is delivered to browsers by the back-end at connection time.
|
||||
|
||||
Front-end and back-end communicate via http request - http response transactions, including `json` body. these `json` interfaces are defined in the [frontend/src/app/api/XXXX.api.ts](../frontend/src/app/api/) files.
|
||||
Back-end uses a callback machanism to map received http requests to dedicated functions. Typically a callback function decapsulates the http requests it receives, looking for the `json`body to determine the requested information or command. Then the back-end builds a
|
||||
http response, with a `json`body encapsulating the requested information or the requested command result.
|
||||
Front-end and back-end communicate via http request - http response transactions, including `json` body. these `json` interfaces are defined in the [frontend/src/app/api/XXXX.api.ts](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv/src/frontend/src/app/api/) files. Back-end decapsulates the http requests it receives, looking for the `json`body to determine the requested information or command. Then the back-end builds a http response, with a `json`body encapsulating the requested information or the requested command result.
|
||||
|
||||
When unsolicited communication, from back-end to front-end is necessary, a [websocket](https://www.rfc-editor.org/rfc/rfc6455) link is opened. This is the case for the softscope interface.
|
||||
|
||||
# web server interface source files
|
||||
|
||||
web server source files are located in [common/utils/websrv](..)
|
||||
web server source files are located in [common/utils/websrv](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv)
|
||||
|
||||
1. back-end files are directly located in the `websrv` repository
|
||||
1. The [frontend/src](../frontend/src) sub-directory contains the angular front-end source tree.
|
||||
1. [common/utils/websrv/helpfiles](../helpfiles) contains files delivered to the front-end to respond to help requests.
|
||||
1. The [frontend/src](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv/src/frontend) sub-directory contains the angular front-end source tree.
|
||||
1. [common/utils/websrv/helpfiles](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv/helpfiles) contains files delivered to the front-end to respond to help requests.
|
||||
|
||||
[oai web server interface home](websrv.md)
|
||||
[oai web server interface home](websrv.md)
|
||||
@@ -1,52 +0,0 @@
|
||||
# enhancing the web server
|
||||
|
||||
###### development platform
|
||||
|
||||
Backend devlopment is classical C programming, using [libulfius](https://github.com/babelouest/ulfius/blob/master/API.md) for the web server implementation
|
||||
and [libjansson](https://jansson.readthedocs.io/en/latest/) for formatting and accessing the JSON http bodies which are used by the angular frontend to exchange data with the server.
|
||||
The backend processes the http requests coming from the frontend using the ulfius callback mechanism. backend can also send unsollicited data to the frontend using a websocket
|
||||
|
||||
Frontend has been developped using the [angular framework](https://angular.io/) which implies TypeScript and HTML programming with the specificity of the node.js libraries and
|
||||
angular extensions.
|
||||
|
||||
Debugging the frontend side may be more difficult than the backend, some tools may help:
|
||||
- Some IDE such as [vscode]( https://code.visualstudio.com/) are "angular aware" and can ease debugging your modifications .
|
||||
- Setting UTIL log level to informational in the backend and websrv debug flag to 2 ( `--log_config.util_log_level info --websrv.debug 2` ) will trigger backend traces which may help, including the dump of JSON type http content
|
||||
- Browser devloper tools such as console may also help
|
||||
|
||||
There is a dedicated CMakeLists.txt, located in the websrv directory, to build both backend and frontend. Including the websrv option when configuring cmake ( `./build_oai --build-lib websrv` ) is required to be able to include the web server targets in the oai build scripts (either Makefile or ninja).
|
||||
`libwebsrv.so` shared library is the backend binary. It is possibly dynamically loaded at runtime, which then triggers the execution of the
|
||||
`websrv_autoinit` function that initializes the http server. Re-building the backend can be done using either `make websrv` or `ninja websrv` and it also re-builds the frontend .
|
||||
|
||||
The frontend run-time is made of a set of files generated from the TypeScript, HTML, CSS sources via the npm utility. It also includes some directly edited files such as the helpfiles. Frontend run-time is installed in the `websrv` sub-directory of the build path
|
||||
(usually `<oai repository>/cmake_targets/ran_build/build`) Re-building frontend can be done via the websrvfront target: `make websrvfront` or `ninja websrvfront`.
|
||||
|
||||
|
||||
###### backend source files
|
||||
|
||||
They are all located in the websrv repository
|
||||
| source file |description |
|
||||
|---|---|
|
||||
| websrv.c | main backend file, starts the http server and contains functions for telnet server interface ( softmodem commands tab) |
|
||||
| websrv.h | the only web server include file, contains utils prototypes, constants definitions, message definitions. Note that it must be kept consistent with frontend, unfortunatly we have not found a way to have common include files between C and javascript |
|
||||
| websrv_utils.c | utility functions common to all backend sources: dump http request and JSON content. format string response from a file, a C string, a buffer asynchronously loaded. format help from help file |
|
||||
| websrv_websockets.c | contains functions for the softscope interface (scope tab): initialize, close websocket, dispatch incoming messages, send a websocket message to frontend |
|
||||
| websrv_scope.c | softscope specific functions: callbacks to process softope frontend request and function to send, receive and process softscope websocket messages |
|
||||
| websrv_noforms.c websrv_noforms.h | stub functions to help using a common softscope interface for xforms softscope and the webserver softscope, could be removed when improving softscope architecture (don't use interface specific function in nr_physcope.c) |
|
||||
|
||||
|
||||
###### main frontend source files
|
||||
|
||||
Frontend directory tree comes from the angular framework. The root of this tree is `websrv/frontend/`. Main sub directories or files are:
|
||||
|
||||
- `src/app/api` contains TypeScript files with functions to send http requests to the backend. These functions are used from components sources.
|
||||
- `src/app/components/<component name>` contains the code (TypeScript, HTML and possibly CSS or XCSS) for a web page, for example the softscope, or popup page used to ask a question or return transaction status.
|
||||
- `src/app/components/controls` contains TypeScript code used for managing some form fields used in the `softmodem commands` tab.
|
||||
- `src/app/components/services` contain TypeScript code for utilities such as managing the websocket interface with the backend or downloading a file.
|
||||
- `src/app/app-routing-module.ts` defines mapping between urls as entered by user and components
|
||||
- `src/app/app.component.ts` `src/app/app.component.html` define the first page displayed to user
|
||||
- `src/environments` contains environment.<build type>.ts file wich defines the `environment` variable depending on the build type. The delivered build scripts are using the `prod` version which has been written to make frontend and backend to interact properly in a production platform. Other build type is to be used in debug environment where frontend is not downloaded from the backend.
|
||||
- `src/commondefs.ts`: constant definitions common to several TypeScript sources
|
||||
|
||||
|
||||
[oai web serverinterface home](websrv.md)
|
||||
@@ -1,299 +1,102 @@
|
||||
## building the webserver
|
||||
back-end and front-end are both built when the build of the `websrv` optional library is requested. When cmake configuration has been completed, with websrv enabled,font-end and back-end can be built separatly, using respectively `make frontend` or `make websrv` from the build repository.
|
||||
|
||||
When all dependencies are met, you can build the web server interface components using the build_oai script with the `--build-lib all` option . As the web interface is an optional component, if it's dependencies are not found it won't stop the build. Web interface components (back-end or front-end) which cannot be built are just skipped. If you specifically ask for the webserver build ( `--build-lib websrv`) the build will fail if dependencies check failed.
|
||||
|
||||
back-end (the http server) and front-end (the html and javascript code for the browsers) are both built when the build of the `websrv` optional library is requested.
|
||||
|
||||
You can include the web server interface components in your build using the build_oai script with the `--build-lib "telnetsrv websrv"` option.
|
||||
The related cmake cache entry in `ran_build/build/CMakeCache.txt` for building the web server
|
||||
is `ENABLE_WEBSRV:BOOL=ON`
|
||||
|
||||
When cmake configuration has been completed, with websrv enabled and all dependencies met,font-end and back-end
|
||||
can be built separately, using respectively `make websrvfront` or `make websrv` from the build repository (replace make by ninja if you
|
||||
build using ninja).
|
||||
|
||||
|
||||
|
||||
###### build example when back-end dependency is not installed
|
||||
###### build example when missing dependencies
|
||||
|
||||
```
|
||||
./build_oai --gNB --nrUE -w USRP --build-lib "telnetsrv websrv nrscope"
|
||||
Will compile gNB
|
||||
Will compile NR UE
|
||||
Enabling build of optional shared library telnetsrv
|
||||
Enabling build of optional shared library websrv
|
||||
Enabling build of optional shared library nrscope
|
||||
OPENAIR_DIR = /usr/local/oai/develop_unmodified/openairinterface5g
|
||||
Running "cmake -DOAI_USRP=ON -DENABLE_TELNETSRV=ON -DENABLE_WEBSRV=ON -DENABLE_NRSCOPE=ON ../../.."
|
||||
-- The C compiler identification is GNU 11.4.0
|
||||
-- The CXX compiler identification is GNU 11.4.0
|
||||
-- Detecting C compiler ABI info
|
||||
-- Detecting C compiler ABI info - done
|
||||
-- Check for working C compiler: /usr/bin/cc - skipped
|
||||
-- Detecting C compile features
|
||||
-- Detecting C compile features - done
|
||||
-- Detecting CXX compiler ABI info
|
||||
-- Detecting CXX compiler ABI info - done
|
||||
-- Check for working CXX compiler: /usr/bin/c++ - skipped
|
||||
-- Detecting CXX compile features
|
||||
-- Detecting CXX compile features - done
|
||||
-- Ccache not found. Consider installing it for faster compilation. Command: sudo apt/dnf install ccache
|
||||
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2")
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -gen-APER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-UPER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-JER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-BER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-OER
|
||||
./build_oai --build-lib all
|
||||
Enabling build of all optional shared libraries (telnetsrv enbscope uescope nrscope websrv websrvfront)
|
||||
RF HW set to None
|
||||
OPENAIR_DIR = /usr/local/oai/websrv3/openairinterface5g
|
||||
FreeDiameter prefix not found, install freeDiameter if EPC, HSS
|
||||
running cmake -DENABLE_WEBSRV=ON -DENABLE_TELNETSRV=ON ../../..
|
||||
NETTLE VERSION_INSTALLED = 3.5.1
|
||||
NETTLE_VERSION_MAJOR = 3
|
||||
NETTLE_VERSION_MINOR = 5
|
||||
cuda include /usr/include
|
||||
cuda library
|
||||
-- CMAKE_BUILD_TYPE is RelWithDebInfo
|
||||
-- CPUARCH x86_64
|
||||
-- AVX512 intrinsics are OFF
|
||||
-- AVX2 intrinsics are ON
|
||||
-- Found Git: /usr/bin/git (found version "2.34.1")
|
||||
-- Checking for module 'libconfig'
|
||||
-- Found libconfig, version 1.5
|
||||
-- Checking for module 'openssl'
|
||||
-- Found openssl, version 3.0.2
|
||||
-- Checking for module 'blas'
|
||||
-- Found blas, version 3.10.3
|
||||
-- Checking for module 'lapacke'
|
||||
-- Found lapacke, version 3.10.0
|
||||
-- Checking for module 'cblas'
|
||||
-- No package 'cblas' found
|
||||
-- No T1 Offload support detected
|
||||
gcc -Wall -I. -I.. -I../itti -I../../../openair2/COMMON -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread
|
||||
./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false)
|
||||
rm -f ./_check_vcd
|
||||
-- Add enb specific telnet functions in libtelnetsrv_enb.so
|
||||
-- No specific telnet functions for gnb
|
||||
-- No specific telnet functions for 4Gue
|
||||
-- Add 5Gue specific telnet functions in libtelnetsrv_5Gue.so
|
||||
-- Add CI specific telnet functions in libtelnetsrv_ci.so
|
||||
CMake Error at common/utils/websrv/CMakeLists.txt:31 (find_library):
|
||||
Could not find ULFIUS using the following names: libulfius.so
|
||||
-- Configuring incomplete, errors occurred!
|
||||
See also "/usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeOutput.log".
|
||||
build have failed
|
||||
```
|
||||
You can fix this first dependency problem, the backend dependency, by installing the libulfius library:
|
||||
|
||||
On ubuntu: `sudo apt-get install libulfius-dev`, for fedora: `dnf install libulfius`. Some distribution don't have
|
||||
libulfius package, instruction to install it can be found [here](https://github.com/babelouest/ulfius/blob/master/INSTALL.md)
|
||||
|
||||
###### build example when front-end dependency is not installed
|
||||
```
|
||||
./build_oai --build-lib "websrv telnetsrv nrscope"
|
||||
|
||||
|
||||
|
||||
./build_oai --gNB --nrUE -w USRP --build-lib "telnetsrv websrv nrscope"
|
||||
Will compile gNB
|
||||
Will compile NR UE
|
||||
Enabling build of optional shared library telnetsrv
|
||||
Enabling build of optional shared library websrv
|
||||
Enabling build of optional shared library nrscope
|
||||
OPENAIR_DIR = /usr/local/oai/develop_unmodified/openairinterface5g
|
||||
Running "cmake -DOAI_USRP=ON -DENABLE_TELNETSRV=ON -DENABLE_WEBSRV=ON -DENABLE_NRSCOPE=ON ../../.."
|
||||
-- Ccache not found. Consider installing it for faster compilation. Command: sudo apt/dnf install ccache
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -gen-APER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-UPER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-JER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-BER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-OER
|
||||
-- CMAKE_BUILD_TYPE is RelWithDebInfo
|
||||
-- CPUARCH x86_64
|
||||
-- AVX512 intrinsics are OFF
|
||||
-- AVX2 intrinsics are ON
|
||||
-- Checking for module 'cblas'
|
||||
-- No package 'cblas' found
|
||||
-- Add enb specific telnet functions in libtelnetsrv_enb.so
|
||||
-- No specific telnet functions for gnb
|
||||
-- No specific telnet functions for 4Gue
|
||||
-- Add 5Gue specific telnet functions in libtelnetsrv_5Gue.so
|
||||
-- Add CI specific telnet functions in libtelnetsrv_ci.so
|
||||
-- found libulfius for websrv
|
||||
-- found libjansson for websrv
|
||||
CMake Error at common/utils/websrv/CMakeLists.txt:45 (find_program):
|
||||
Could not find NPM using the following names: npm
|
||||
CMake Error at common/utils/websrv/CMakeLists.txt:3 (message):
|
||||
ulfius library (https://github.com/babelouest/ulfius) not found, install
|
||||
libulfius-dev (ubuntu) if you need to build websrv back-end
|
||||
|
||||
|
||||
-- Configuring incomplete, errors occurred!
|
||||
See also "/usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeOutput.log".
|
||||
See also "/usr/local/oai/websrv3/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeOutput.log".
|
||||
See also "/usr/local/oai/websrv3/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeError.log".
|
||||
build have failed
|
||||
```
|
||||
Currently the web server frontend can run with nodejs 18, you can check the version (if any) installed on your system entering the `node -v` command.
|
||||
|
||||
To prevent difficult situations with nodejs or npm versions it is better to specifically install the required nodejs version (after removing existing versions of npm and nodejs), as explained
|
||||
[here](https://www.stewright.me/2023/04/install-nodejs-18-on-ubuntu-22-04/) for ubuntu. Similar instructions can be found for other distributions.
|
||||
It is also possible to make several nodejs versions co-habiting on your system, this is beyond this doc.
|
||||
|
||||
|
||||
###### example: installing nodejs 18 on ubuntu
|
||||
```
|
||||
|
||||
curl -s https://deb.nodesource.com/setup_18.x | sudo bash
|
||||
|
||||
## Installing the NodeSource Node.js 18.x repo...
|
||||
|
||||
|
||||
## Populating apt-get cache...
|
||||
|
||||
+ apt-get update
|
||||
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
|
||||
Hit:2 http://us.archive.ubuntu.com/ubuntu jammy InRelease
|
||||
Get:3 http://security.ubuntu.com/ubuntu jammy-security/main i386 Packages [305 kB]
|
||||
Get:4 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [678 kB]
|
||||
Get:5 http://us.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
|
||||
Get:6 http://security.ubuntu.com/ubuntu jammy-security/main amd64 DEP-11 Metadata [42.8 kB]
|
||||
Get:7 http://security.ubuntu.com/ubuntu jammy-security/main amd64 c-n-f Metadata [11.2 kB]
|
||||
Get:8 http://security.ubuntu.com/ubuntu jammy-security/universe i386 Packages [553 kB]
|
||||
Get:9 http://us.archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
|
||||
Get:10 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [770 kB]
|
||||
Get:11 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 DEP-11 Metadata [39.8 kB]
|
||||
Get:12 http://us.archive.ubuntu.com/ubuntu jammy-updates/main i386 Packages [471 kB]
|
||||
Get:13 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [892 kB]
|
||||
Get:14 http://us.archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [214 kB]
|
||||
Get:15 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 DEP-11 Metadata [100 kB]
|
||||
Get:16 http://us.archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [714 kB]
|
||||
Get:17 http://us.archive.ubuntu.com/ubuntu jammy-updates/restricted Translation-en [114 kB]
|
||||
Get:18 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [968 kB]
|
||||
Get:19 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe i386 Packages [648 kB]
|
||||
Get:20 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [211 kB]
|
||||
Get:21 http://us.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 DEP-11 Metadata [288 kB]
|
||||
Get:22 http://us.archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 DEP-11 Metadata [940 B]
|
||||
Get:23 http://us.archive.ubuntu.com/ubuntu jammy-backports/main amd64 DEP-11 Metadata [4,924 B]
|
||||
Get:24 http://us.archive.ubuntu.com/ubuntu jammy-backports/universe amd64 DEP-11 Metadata [15.6 kB]
|
||||
Fetched 7,379 kB in 4s (2,095 kB/s)
|
||||
Reading package lists... Done
|
||||
|
||||
## Confirming "jammy" is supported...
|
||||
|
||||
+ curl -sLf -o /dev/null 'https://deb.nodesource.com/node_18.x/dists/jammy/Release'
|
||||
|
||||
## Adding the NodeSource signing key to your keyring...
|
||||
|
||||
+ curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | tee /usr/share/keyrings/nodesource.gpg >/dev/null
|
||||
|
||||
## Creating apt sources list file for the NodeSource Node.js 18.x repo...
|
||||
|
||||
+ echo 'deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x jammy main' > /etc/apt/sources.list.d/nodesource.list
|
||||
+ echo 'deb-src [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x jammy main' >> /etc/apt/sources.list.d/nodesource.list
|
||||
|
||||
## Running `apt-get update` for you...
|
||||
|
||||
+ apt-get update
|
||||
Hit:1 http://security.ubuntu.com/ubuntu jammy-security InRelease
|
||||
Get:2 https://deb.nodesource.com/node_18.x jammy InRelease [4,563 B]
|
||||
Get:3 https://deb.nodesource.com/node_18.x jammy/main amd64 Packages [776 B]
|
||||
Hit:4 http://us.archive.ubuntu.com/ubuntu jammy InRelease
|
||||
Hit:5 http://us.archive.ubuntu.com/ubuntu jammy-updates InRelease
|
||||
Hit:6 http://us.archive.ubuntu.com/ubuntu jammy-backports InRelease
|
||||
Fetched 5,339 B in 1s (7,666 B/s)
|
||||
Reading package lists... Done
|
||||
|
||||
## Run `sudo apt-get install -y nodejs` to install Node.js 18.x and npm
|
||||
## You may also need development tools to build native addons:
|
||||
sudo apt-get install gcc g++ make
|
||||
## To install the Yarn package manager, run:
|
||||
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
|
||||
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
|
||||
sudo apt-get update && sudo apt-get install yarn
|
||||
|
||||
|
||||
sudo apt install nodejs -y
|
||||
Reading package lists... Done
|
||||
Building dependency tree... Done
|
||||
Reading state information... Done
|
||||
The following packages were automatically installed and are no longer required:
|
||||
diodon libdiodon0 libxdo3 xdotool
|
||||
Use 'sudo apt autoremove' to remove them.
|
||||
The following NEW packages will be installed:
|
||||
nodejs
|
||||
0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.
|
||||
Need to get 28.9 MB of archives.
|
||||
After this operation, 188 MB of additional disk space will be used.
|
||||
Get:1 https://deb.nodesource.com/node_18.x jammy/main amd64 nodejs amd64 18.17.1-deb-1nodesource1 [28.9 MB]
|
||||
Fetched 28.9 MB in 3s (11.3 MB/s)
|
||||
Selecting previously unselected package nodejs.
|
||||
(Reading database ... 399541 files and directories currently installed.)
|
||||
Preparing to unpack .../nodejs_18.17.1-deb-1nodesource1_amd64.deb ...
|
||||
Unpacking nodejs (18.17.1-deb-1nodesource1) ...
|
||||
Setting up nodejs (18.17.1-deb-1nodesource1) ...
|
||||
Processing triggers for man-db (2.10.2-1) ...
|
||||
|
||||
|
||||
```
|
||||
|
||||
###### build example when dependencies are met
|
||||
|
||||
|
||||
``` bash
|
||||
|
||||
./build_oai --ninja -c -C --gNB --nrUE -w USRP --build-lib "telnetsrv websrv nrscope"
|
||||
Will compile gNB
|
||||
Will compile NR UE
|
||||
Enabling build of optional shared library telnetsrv
|
||||
Enabling build of optional shared library websrv
|
||||
Enabling build of optional shared library nrscope
|
||||
OPENAIR_DIR = /usr/local/oai/develop_unmodified/openairinterface5g
|
||||
Erased all previously producted files
|
||||
Running "cmake -GNinja -DOAI_USRP=ON -DENABLE_TELNETSRV=ON -DENABLE_WEBSRV=ON -DENABLE_NRSCOPE=ON ../../.."
|
||||
-- The C compiler identification is GNU 11.4.0
|
||||
-- The CXX compiler identification is GNU 11.4.0
|
||||
-- Detecting C compiler ABI info
|
||||
-- Detecting C compiler ABI info - done
|
||||
-- Check for working C compiler: /usr/bin/cc - skipped
|
||||
-- Detecting C compile features
|
||||
-- Detecting C compile features - done
|
||||
-- Detecting CXX compiler ABI info
|
||||
-- Detecting CXX compiler ABI info - done
|
||||
-- Check for working CXX compiler: /usr/bin/c++ - skipped
|
||||
-- Detecting CXX compile features
|
||||
-- Detecting CXX compile features - done
|
||||
-- Ccache not found. Consider installing it for faster compilation. Command: sudo apt/dnf install ccache
|
||||
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2")
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -gen-APER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-UPER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-JER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-BER
|
||||
-- Check if /opt/asn1c/bin/asn1c supports -no-gen-OER
|
||||
###### build example (build-lib all) when dependencies are met
|
||||
```
|
||||
./build_oai --build-lib all
|
||||
Enabling build of all optional shared libraries (telnetsrv enbscope uescope nrscope websrv websrvfront)
|
||||
RF HW set to None
|
||||
OPENAIR_DIR = /usr/local/oai/websrv3/openairinterface5g
|
||||
FreeDiameter prefix not found, install freeDiameter if EPC, HSS
|
||||
running cmake -DENABLE_WEBSRV=ON -DENABLE_TELNETSRV=ON ../../..
|
||||
NETTLE VERSION_INSTALLED = 3.5.1
|
||||
NETTLE_VERSION_MAJOR = 3
|
||||
NETTLE_VERSION_MINOR = 5
|
||||
cuda include /usr/include
|
||||
cuda library
|
||||
-- CMAKE_BUILD_TYPE is RelWithDebInfo
|
||||
-- CPUARCH x86_64
|
||||
-- AVX512 intrinsics are OFF
|
||||
-- AVX2 intrinsics are ON
|
||||
-- Found Git: /usr/bin/git (found version "2.34.1")
|
||||
-- Checking for module 'libconfig'
|
||||
-- Found libconfig, version 1.5
|
||||
-- Checking for module 'openssl'
|
||||
-- Found openssl, version 3.0.2
|
||||
-- Checking for module 'blas'
|
||||
-- Found blas, version 3.10.3
|
||||
-- Checking for module 'lapacke'
|
||||
-- Found lapacke, version 3.10.0
|
||||
-- Checking for module 'cblas'
|
||||
-- No package 'cblas' found
|
||||
-- No T1 Offload support detected
|
||||
gcc -Wall -I. -I.. -I../itti -I../../../openair2/COMMON -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread
|
||||
./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false)
|
||||
rm -f ./_check_vcd
|
||||
-- Add enb specific telnet functions in libtelnetsrv_enb.so
|
||||
-- No specific telnet functions for gnb
|
||||
-- No specific telnet functions for 4Gue
|
||||
-- Add 5Gue specific telnet functions in libtelnetsrv_5Gue.so
|
||||
-- Add CI specific telnet functions in libtelnetsrv_ci.so
|
||||
-- found libulfius for websrv
|
||||
-- found libjansson for websrv
|
||||
-- found npm for websrv
|
||||
-- Configuring webserver backend
|
||||
-- Configuring webserver frontend
|
||||
-- No Doxygen documentation requested
|
||||
-- libforms library, required for scopes, found at /usr/lib/libforms.so
|
||||
-- Found UHD: /usr/lib/x86_64-linux-gnu/libuhd.so
|
||||
-- Configuring done
|
||||
-- Generating done
|
||||
-- Build files have been written to: /usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build
|
||||
cd /usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build
|
||||
Running "cmake --build . --target nr-softmodem nr-cuup nr-uesoftmodem oai_usrpdevif telnetsrv websrv nrscope params_libconfig coding rfsimulator dfts -- -j8"
|
||||
Log file for compilation is being written to: /usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/log/all.txt
|
||||
nr-softmodem nr-cuup nr-uesoftmodem oai_usrpdevif telnetsrv websrv nrscope params_libconfig coding rfsimulator dfts compiled
|
||||
BUILD SHOULD BE SUCCESSFUL
|
||||
|
||||
-- Build files have been written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/ran_build/build
|
||||
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/telnetsrv.txt
|
||||
telnetsrv compiled
|
||||
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/enbscope.txt
|
||||
enbscope compiled
|
||||
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/uescope.txt
|
||||
uescope compiled
|
||||
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/nrscope.txt
|
||||
nrscope compiled
|
||||
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/websrv.txt
|
||||
websrv compiled
|
||||
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/websrvfront.txt
|
||||
websrvfront compiled
|
||||
BUILD SHOULD BE SUCCESSFUL
|
||||
```
|
||||
|
||||
###### building and installing the front-end after cmake has been successfully configured
|
||||
# building and installing the front-end after cmake has been configured
|
||||
|
||||
Before building the front-end you need to install the npm node.js installer, otherwise the make target won't exist:
|
||||
|
||||
```
|
||||
`apt-get install npm` for ubuntu or `dnf install npm`for fedora
|
||||
|
||||
then configure cmake to be able to build and install the frontend without using the build_oai script:
|
||||
|
||||
``` bash
|
||||
cd \<oai repository\>/openairinterface5g/cmake_targets/ran_build/build
|
||||
make websrvfront
|
||||
up to date, audited 1099 packages in 3s
|
||||
@@ -332,21 +135,29 @@ Built target websrvfront
|
||||
```
|
||||
|
||||
|
||||
###### building and installing the back-end after cmake has been successfully configured
|
||||
|
||||
# Building and installing the web server back-end after cmake has been configured
|
||||
|
||||
The back-end has two dependencies:
|
||||
|
||||
1. the [ulfius library](https://github.com/babelouest/ulfius) and the corresponding include files which are provided by the ubuntu libulfius-dev package: `sudo apt-get install -y libulfius-dev`
|
||||
2. the [jansson](https://github.com/akheron/jansson-debian) library and the corresponding include files which are provided by the ubuntu libjansson-dev package: `sudo apt-get install -y libjansson-dev`
|
||||
|
||||
Dependencies can also be installed on fedora distribution, the jansson package is `jansson-devel`, ulfius has to be installed as explained [here](https://github.com/babelouest/ulfius/blob/master/INSTALL.md#pre-compiled-packages).
|
||||
|
||||
The websrv targets won't be available till cmake has been successfully configured with the websrv option enabled
|
||||
|
||||
```bash
|
||||
cd <oai repository>/openairinterface5g
|
||||
cd \<oai repository\>/openairinterface5g
|
||||
source oaienv
|
||||
cd cmake_targets
|
||||
./build_oai --build-lib websrv
|
||||
```
|
||||
or, without the help of the `build_oai` script:
|
||||
|
||||
```bash
|
||||
cd \<oai repository\>/openairinterface5g/cmake_targets/ran_build/build
|
||||
make websrv
|
||||
```
|
||||
|
||||
This will create the `libwebsrv.so` file in the `targets/bin` and `cmake_targets/ran_build/build` sub directories of the oai repository.
|
||||
|
||||
When starting the softmodem, you must specify the **_\-\-websrv_** option to load and start the web server. The web server is loaded via the [oai shared library loader](loader).
|
||||
@@ -355,7 +166,7 @@ When starting the softmodem, you must specify the **_\-\-websrv_** option to loa
|
||||
|
||||
|
||||
## web server parameters
|
||||
The web server back-end is using the [oai configuration module](Config/Rtusage). web server parameters must be specified in the websrv section.
|
||||
The web server back-end is using the [oai configuration module](Config/Rtusage). web server parameters must be specified in the websrv section.
|
||||
|
||||
| name | type | default | description |
|
||||
|:---:|:---:|:---:|:----|
|
||||
@@ -369,7 +180,7 @@ The web server back-end is using the [oai configuration module](Config/Rtusage).
|
||||
## running the back-end
|
||||
To trigger the back-end use the `--websrv` option, possibly modifying the parameters as explained in the previous chapter. The two following commands allow starting the oai gNB and the oai 5G UE on the same computer, starting the telnet server and the web interface on both executables.
|
||||
|
||||
`./nr-softmodem -O /usr/local/oai/conf/gnb.band78.sa.fr1.106PRB.usrpb210.conf --rfsim --rfsimulator.serveraddr server --telnetsrv --telnetsrv.listenstdin --websrv --rfsimulator.options chanmod`
|
||||
`./nr-softmodem -O /usr/local/oai/conf/gnb.band78.sa.fr1.106PRB.usrpb210.conf --rfsim --rfsimulator.serveraddr server --telnetsrv --telnetsrv.listenstdin --websrv --rfsimulator.options chanmod`
|
||||
|
||||
.`/nr-uesoftmodem -O /usr/local/oai/conf/nrue_sim.conf --sa --numerology 1 -r 106 -C 3649440000 --rfsim --rfsimulator.serveraddr 127.0.0.1 --websrv --telnetsrv --websrv.listenport 8092 --telnetsrv.listenport 8091`
|
||||
|
||||
@@ -380,20 +191,18 @@ To trigger the back-end use the `--websrv` option, possibly modifying the parame
|
||||
Assuming that the previous commands run successfully and that you also run your browser on the same host, you should be able to connect to the gNB and UE web interface using respectively the following url's:
|
||||
|
||||
http://127.0.0.1:8090/websrv/index.html
|
||||
|
||||
http://127.0.0.1:8092/websrv/index.html
|
||||
|
||||
The interface should be intuitive enough, keeping in mind the following restrictions:
|
||||
|
||||
- The command tab is not available if the telnet server is not enabled
|
||||
- The softscope tab is not available if the xforms scope is started (`-d` option)
|
||||
- The softscope tab is not available if the xforms scope is started `(-d` option)
|
||||
- Only one connection is supported to a back-end, especially for the scope interface
|
||||
|
||||
Some front-end objects, which usage are less intuitive provide a tooltip to help interface usage.
|
||||
|
||||
## some webserver screenshots
|
||||
- [main page](main.png)
|
||||
- [Configuring logs](logscfg.png)
|
||||
- [scope interface](scope.png)
|
||||
|
||||

|
||||

|
||||

|
||||
[oai web serverinterface home](websrv.md)
|
||||
|
||||
17
doc/BUILD.md
17
doc/BUILD.md
@@ -165,18 +165,18 @@ After completing the build, the binaries are available in the `cmake_targets/ran
|
||||
## Building Optional Binaries
|
||||
|
||||
There are a number of optional libraries that can be built in support of the
|
||||
RAN, such as telnetsrv, scopes, offloading libraries, etc.
|
||||
RAN, such as telnet, scopes, offloading libraries, etc.
|
||||
|
||||
Using the help option of the build script you can get the list of available optional libraries.
|
||||
|
||||
```bash
|
||||
./build_oai --build-lib all # build all
|
||||
./build_oai --build-lib telnetsrv # build only telnetsrv
|
||||
./build_oai --build-lib "telnetsrv enbscope uescope nrscope nrqtscope"
|
||||
./build_oai --build-lib telnetsrv --build-lib nrqtscope
|
||||
./build_oai --build-lib telnet # build only telnet
|
||||
./build_oai --build-lib "telnet enbscope uescope nrscope nrqtscope"
|
||||
./build_oai --build-lib telnet --build-lib nrqtscope
|
||||
```
|
||||
|
||||
The following libraries are build in CI and should always work: `telnetsrv`,
|
||||
The following libraries are build in CI and should always work: `telnet`,
|
||||
`enbscope`, `uescope`, `nrscope`, `nrqtscope`.
|
||||
|
||||
Some libraries have further dependencies and might not build on every system:
|
||||
@@ -195,7 +195,7 @@ mkdir build && cd build
|
||||
cmake .. -GNinja && ninja nr-softmodem nr-uesoftmodem nr-cuup params_libconfig coding rfsimulator ldpc
|
||||
```
|
||||
|
||||
To build additional libraries, e.g., telnetsrv, do the following:
|
||||
To build additional libraries, e.g., telnet, do the following:
|
||||
```bash
|
||||
cmake .. -GNinja -DENABLE_TELNETSRV=ON && ninja telnetsrv
|
||||
```
|
||||
@@ -215,8 +215,3 @@ ccmake ../../..
|
||||
cmake-gui ../../..
|
||||
```
|
||||
You can of course use all standard cmake/ninja/make commands in this directory.
|
||||
|
||||
# Cross Compile
|
||||
|
||||
If you want to use cross-compiler on x86 platform for aarch64 version, please refer the [cross-compile.md](./cross-compile.md) for more information.
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ In this tutorial we describe how to configure and run a 5G end-to-end setup with
|
||||
|
||||
Minimum hardware requirements:
|
||||
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
|
||||
- CPU: 8 cores x86_64 @ 3.5 GHz
|
||||
- RAM: 32 GB
|
||||
- Laptop for UE
|
||||
@@ -45,7 +45,7 @@ Please install and configure OAI CN5G as described here:
|
||||
|
||||
|
||||
## 2.2 SIM Card
|
||||
Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v3.2](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v3.2.tgz).
|
||||
Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz).
|
||||
|
||||
```bash
|
||||
sudo ./program_uicc --adm 12345678 --imsi 001010000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate
|
||||
@@ -62,7 +62,7 @@ sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils p
|
||||
|
||||
git clone https://github.com/EttusResearch/uhd.git ~/uhd
|
||||
cd ~/uhd
|
||||
git checkout v4.5.0.0
|
||||
git checkout v4.4.0.0
|
||||
cd host
|
||||
mkdir build
|
||||
cd build
|
||||
@@ -90,7 +90,7 @@ cd ~/openairinterface5g/cmake_targets
|
||||
cd ~/openairinterface5g
|
||||
source oaienv
|
||||
cd cmake_targets
|
||||
./build_oai -w USRP --ninja --gNB -C
|
||||
./build_oai -w USRP --ninja --gNB -c
|
||||
```
|
||||
|
||||
# 4. Run OAI CN5G and OAI gNB
|
||||
|
||||
@@ -21,7 +21,7 @@ In this tutorial we describe how to configure and run a 5G end-to-end setup with
|
||||
|
||||
Minimum hardware requirements:
|
||||
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
|
||||
- CPU: 8 cores x86_64 @ 3.5 GHz
|
||||
- RAM: 32 GB
|
||||
|
||||
@@ -66,8 +66,8 @@ docker pull oaisoftwarealliance/oai-udr:develop
|
||||
docker pull oaisoftwarealliance/oai-udm:develop
|
||||
docker pull oaisoftwarealliance/oai-ausf:develop
|
||||
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
|
||||
docker pull oaisoftwarealliance/trf-gen-cn5g:jammy
|
||||
docker pull oaisoftwarealliance/ims:latest
|
||||
docker pull oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
docker build --target ims --tag asterisk-ims:latest --file ~/oai-cn5g/Dockerfile .
|
||||
```
|
||||
|
||||
# 3. Run OAI CN5G
|
||||
|
||||
@@ -21,11 +21,11 @@ In this tutorial we describe how to configure and run a 5G end-to-end setup with
|
||||
|
||||
Minimum hardware requirements:
|
||||
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
|
||||
- CPU: 8 cores x86_64 @ 3.5 GHz
|
||||
- RAM: 32 GB
|
||||
- Laptop for UE
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
|
||||
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
|
||||
- CPU: 8 cores x86_64 @ 3.5 GHz
|
||||
- RAM: 8 GB
|
||||
- [USRP B210](https://www.ettus.com/all-products/ub210-kit/), [USRP N300](https://www.ettus.com/all-products/USRP-N300/) or [USRP X300](https://www.ettus.com/all-products/x300-kit/)
|
||||
@@ -50,7 +50,7 @@ sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils p
|
||||
|
||||
git clone https://github.com/EttusResearch/uhd.git ~/uhd
|
||||
cd ~/uhd
|
||||
git checkout v4.5.0.0
|
||||
git checkout v4.4.0.0
|
||||
cd host
|
||||
mkdir build
|
||||
cd build
|
||||
@@ -81,7 +81,7 @@ sudo apt install -y libforms-dev libforms-bin
|
||||
cd ~/openairinterface5g
|
||||
source oaienv
|
||||
cd cmake_targets
|
||||
./build_oai -w USRP --ninja --nrUE --gNB --build-lib "nrscope" -C
|
||||
./build_oai -w USRP --ninja --nrUE --gNB --build-lib "nrscope" -c
|
||||
```
|
||||
|
||||
# 4. Run OAI CN5G and OAI gNB
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
- [FEATURE_SET.md](./FEATURE_SET.md): lists supported features
|
||||
- [GET_SOURCES.md](./GET_SOURCES.md): how to download the sources
|
||||
- [BUILD.md](./BUILD.md): how to build the sources
|
||||
- [cross-compile.md](./cross-compile.md): how to cross-compile OAI for ARM
|
||||
- [clang-format.md](./clang-format.md): how to format the code
|
||||
- [environment-variables.md](./environment-variables.md): the environment variables used by OAI
|
||||
|
||||
@@ -82,7 +81,6 @@ Legacy unmaintained files:
|
||||
- The [logging module](../common/utils/LOG/DOC/log.md)
|
||||
- The [shared object loader](../common/utils/DOC/loader.md)
|
||||
- The [threadpool](../common/utils/threadPool/thread-pool.md) used in L1
|
||||
- The [LDPC implementation](../openair1/PHY/CODING/DOC/LDPCImplementation.md) is a shared library
|
||||
|
||||
## SDRs
|
||||
|
||||
|
||||
@@ -127,30 +127,27 @@ Some other useful paramters of the UE are
|
||||
|
||||
## phy-test setup with OAI UE
|
||||
|
||||
The OAI UE can also be used in front of a OAI gNB without the support of eNB or EPC and circumventing random access. In this case both gNB and eNB need to be run with the `--phy-test` flag. At the gNB this flag does the following
|
||||
The OAI UE can also be used in front of a OAI gNB without the support of eNB or EPC. In this case both gNB and eNB need to be run with the --phy-test flag. At the gNB this flag does the following
|
||||
- it reads the RRC configuration from the configuration file
|
||||
- it encodes the RRCConfiguration and the RBconfig message and stores them in the binary files `rbconfig.raw` and `reconfig.raw` in the current directory
|
||||
- the MAC uses a pre-configured allocation of PDSCH and PUSCH with randomly generated payload instead of the standard scheduler. The options `-m`, `-l`, `-t`, `-M`, `-T`, `-D`, and `-U` can be used to configure this scheduler. See `./nr-softmodem -h` for more information.
|
||||
- it encodes the RRCConfiguration and the RBconfig message and stores them in the binary files rbconfig.raw and reconfig.raw
|
||||
- the MAC uses a pre-configured allocation of PDSCH and PUSCH with randomly generated payload
|
||||
|
||||
At the UE the --phy-test flag will
|
||||
- read the binary files rbconfig.raw and reconfig.raw from the current directory (a different directory can be specified with the flag --rrc_config_path) and process them.
|
||||
|
||||
At the UE, the `--phy-test` flag will read the binary files `rbconfig.raw` and `reconfig.raw` from the current directory and process them. If you wish to provide a different path for these files, please use the options `--reconfig-file` and `--rbconfig-file`.
|
||||
|
||||
```bash
|
||||
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test
|
||||
```
|
||||
|
||||
In phy-test mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports1.xml` (1 layer) or `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports2.xml` (2 layers).
|
||||
|
||||
```bash
|
||||
sudo ./nr-uesoftmodem --phy-test [--reconfig-file ../../../ci-scripts/rrc-files/reconfig.raw --rbconfig-file ../../../ci-scripts/rrc-files/rbconfig.raw]
|
||||
sudo ./nr-uesoftmodem --phy-test [--rrc_config_path ../../../ci-scripts/rrc-files]
|
||||
```
|
||||
|
||||
In summary:
|
||||
- If you are running on the same machine and launched the 2 executables (`nr-softmodem` and `nr-uesoftmodem`) from the same directory, nothing has to be done.
|
||||
- If you launched the 2 executables from 2 different folders, just point to the location where you launched the `nr-softmodem`:
|
||||
* `sudo ./nr-uesoftmodem --rfsim --phy-test --reconfig-file /the/path/where/you/launched/nr-softmodem/reconfig-file --rbconfig-file /the/path/where/you/launched/nr-softmodem/rbconfig-file --rfsimulator.serveraddr <TARGET_GNB_INTERFACE_ADDRESS>`
|
||||
- If you are not running on the same machine, you need to **COPY** the two raw files
|
||||
* `scp usera@machineA:/the/path/where/you/launched/nr-softmodem/r*config.raw userb@machineB:/the/path/where/you/will/launch/nr-uesoftmodem/`
|
||||
* Obviously this operation should be done before launching the `nr-uesoftmodem` executable.
|
||||
|
||||
In phy-test mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports1.xml` (1 layer) or `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports2.xml` (2 layers).
|
||||
You need to provide `--rrc_config_path` if you don't start the UE after the gNB
|
||||
in the same directory.
|
||||
|
||||
## noS1 setup with OAI UE
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfap
|
||||
```
|
||||
### UE command
|
||||
```
|
||||
sudo ./nr-uesoftmodem --rfsim --phy-test -d --rfsimulator.serveraddr 127.0.0.1
|
||||
sudo ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path . -d --rfsimulator.serveraddr 127.0.0.1
|
||||
|
||||
```
|
||||
## Procedure to run NR nFAPI using Hardware (tested with USRP x310)
|
||||
@@ -48,7 +48,7 @@ sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfap
|
||||
```
|
||||
### UE command
|
||||
```
|
||||
sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test
|
||||
sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test --rrc_config_path ../../../ci-scripts/rrc-files
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -21,8 +21,8 @@ After you have [built the softmodem executables](BUILD.md), go to the build dire
|
||||
|
||||
| **Mode** | **gNB config** | **nrUE config** |
|
||||
|----------------------------- |------------------------------------------------------------------------------------------- |--------------------------- |
|
||||
| **FR1 40MHz<br>30kHz SCS** | gnb0.prs.band78.fr1.106PRB.usrpx310.conf<br>gnb1.prs.band78.fr1.106PRB.usrpx310.conf | ue.nr.prs.fr1.106prb.conf |
|
||||
| **FR2 100MHz<br>120kHz SCS** | gnb0.prs.band261.fr2.64PRB.usrpx310.conf<br>gnb1.prs.band261.fr2.64PRB.usrpx310.conf | ue.nr.prs.fr2.64prb.conf |
|
||||
| **FR1 40MHz<br>30kHz SCS** | gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf<br>gnb1.sa.band78.fr1.106PRB.prs.usrpx310.conf | ue.nr.prs.fr1.106prb.conf |
|
||||
| **FR2 100MHz<br>120kHz SCS** | gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf<br>gnb1.sa.band261.fr2.64PRB.prs.usrpx310.conf | ue.nr.prs.fr2.64prb.conf |
|
||||
|
||||
Under gNB and nrUE config files, parameters are configured under `prs_config` section. nrUE is capable to receive downlink PRS signal from multiple gNB simultaneously and therefore nrUE config file contains multiple `prs_config` sections, corresponding to each gNB. These parameters can be changed as per the test scenario.
|
||||
|
||||
@@ -64,26 +64,26 @@ In our case the output is 0 and hence we use `numactl --cpunodebind=0 --membind=
|
||||
## FR1 test
|
||||
Open a terminal on the host machine, and execute below command to launch gNB with **X310 USRPs**
|
||||
|
||||
```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.prs.band78.fr1.106PRB.usrpx310.conf --phy-test```
|
||||
```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf --phy-test```
|
||||
|
||||
If **N310 USRPs** are used, then run above command `without -E option` i.e without 3/4 sampling rate.<br><br>
|
||||
|
||||
|
||||
To run using **rfsimulator**, execute following command:
|
||||
|
||||
```sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.prs.band78.fr1.106PRB.usrpx310.conf --parallel-config PARALLEL_SINGLE_THREAD --noS1 --rfsim --phy-test```
|
||||
```sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf --parallel-config PARALLEL_SINGLE_THREAD --noS1 --rfsim --phy-test```
|
||||
|
||||
## FR2 test
|
||||
In FR2 mode, we need RF beamforming module to transmit signal in mmWave frequency range. **X310 USRPs** can be used with BasicTx daughtercard to transmit baseband signal at **Intermediate Frequncy(IF)** and then RF beamforming module would perform beamforming and the upconversion to FR2 frequencies. IF can be specified using `if_freq` in the RU section of gNB config.
|
||||
|
||||
If RF beamforming module is NOT present, gNB can still be launched with USRP alone; to transmit at supported `if_freq`.
|
||||
|
||||
```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.prs.band261.fr2.64PRB.usrpx310.conf --phy-test```<br><br>
|
||||
```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf --phy-test```<br><br>
|
||||
|
||||
|
||||
To run using **rfsimulator**, execute following command:
|
||||
|
||||
```sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.prs.band261.fr2.64PRB.usrpx310.conf --parallel-config PARALLEL_SINGLE_THREAD --noS1 --rfsim --phy-test```
|
||||
```sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band261.fr2.64PRB.prs.usrpx310.conf --parallel-config PARALLEL_SINGLE_THREAD --noS1 --rfsim --phy-test```
|
||||
|
||||
## Multiple gNB scenario
|
||||
PRS is primarily used for positioning and localization of the UE with multiple gNBs transmitting simultaneously. OAI PRS implementation supports multiple gNB transmission provided all the gNBs are tightely synchronized using GPSDO clock. Therefore before running this scenario, make sure the USRPs has built-in GPSDO and the GPS antennas are connected with good satellite visibility. Also every time a gNB is launched, wait until `GPS LOCKED` is printed on the terminal during gNB startup. If USRP fails to lock with GPSDO, try again until its locked.
|
||||
|
||||
@@ -211,7 +211,7 @@ The scheduler also calls "run_pdcp()", as this is not a autonomous thread, it ne
|
||||
After calling run_pdcp, it updates "rlc" time data but it doesn't actually process rlc
|
||||
it sends a iiti message to activate the thread for RRC, the answer will be asynchronous in ????
|
||||
|
||||
Calls schedule_nr_mib() that fills MIB,
|
||||
Calls schedule_nr_mib() that calls mac_rrc_nr_data_req() to fill MIB,
|
||||
|
||||
Calls schedule_nr_prach() which schedules the (fixed) PRACH region one frame in
|
||||
advance.
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
[[_TOC_]]
|
||||
|
||||
|
||||
# OpenAirInterface Cross-Compiler User Guide
|
||||
|
||||
## Environment
|
||||
|
||||
- OS: ubuntu 20.04
|
||||
|
||||
### Set up the environment
|
||||
|
||||
Set up for install the package for aarch64.
|
||||
|
||||
```shell
|
||||
sudo dpkg --add-architecture arm64
|
||||
|
||||
echo -e \
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted\n"\
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted\n"\
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal universe\n"\
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe\n"\
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse\n"\
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse\n"\
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse"\
|
||||
| sudo tee /etc/apt/sources.list.d/arm-cross-compile-sources.list
|
||||
|
||||
sudo cp /etc/apt/sources.list "/etc/apt/sources.list.`date`.backup"
|
||||
sudo sed -i -E "s/(deb)\ (http:.+)/\1\ [arch=amd64]\ \2/" /etc/apt/sources.list
|
||||
|
||||
sudo apt update
|
||||
sudo apt install -y gcc-9-aarch64-linux-gnu \
|
||||
g++-9-aarch64-linux-gnu
|
||||
|
||||
sudo apt-get install -y \
|
||||
libatlas-base-dev:arm64 \
|
||||
libblas-dev:arm64 \
|
||||
libc6-dev-i386 \
|
||||
liblapack-dev:arm64 \
|
||||
liblapacke-dev:arm64 \
|
||||
libreadline-dev:arm64 \
|
||||
libgnutls28-dev:arm64 \
|
||||
libconfig-dev:arm64 \
|
||||
libsctp-dev:arm64 \
|
||||
libssl-dev:arm64 \
|
||||
libtool:arm64 \
|
||||
zlib1g-dev:arm64
|
||||
```
|
||||
|
||||
## Install and Build
|
||||
|
||||
### Install required packages
|
||||
|
||||
Use the host compiler to install some dependencies.
|
||||
|
||||
```shell
|
||||
cd cmake_targets
|
||||
./build_oai -I
|
||||
```
|
||||
|
||||
### Build the LDPC generators
|
||||
|
||||
Use the x86 compiler to build the `ldpc_generators` and generate the header
|
||||
file in the `ran_build/build` folder. They are necessary during a build for
|
||||
code generation, and therefore need to be created for the x86 architecture.
|
||||
|
||||
```shell
|
||||
rm -r ran_build
|
||||
mkdir ran_build
|
||||
mkdir ran_build/build
|
||||
mkdir ran_build/build-cross
|
||||
|
||||
cd ran_build/build
|
||||
cmake ../../..
|
||||
make -j`nproc` ldpc_generators generate_T
|
||||
```
|
||||
|
||||
### Build the Other Executables for aarch64
|
||||
|
||||
Switch to the `ran_build/build-cross` folder to build the target executables
|
||||
for ARM. The `cross-arm.cmake` file defines some ARM-specific build tools
|
||||
(e.g., compilers) that you might need to adapt. Further, it defines cmake
|
||||
variables that define in this step where the host tools (such as LDPC
|
||||
generators) are to be found. For the latter, the `NATIVE_DIR` option has to
|
||||
be defined in order to tell cmake where the host tools have been built.
|
||||
|
||||
```shell
|
||||
cd ../build-cross
|
||||
cmake ../../.. -DCMAKE_TOOLCHAIN_FILE=../../../cmake_targets/cross-arm.cmake -DNATIVE_DIR=../build
|
||||
|
||||
make -j`nproc` dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim
|
||||
make -j`nproc` lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem
|
||||
make -j`nproc` params_libconfig coding rfsimulator
|
||||
```
|
||||
15
doc/tutorial_resources/oai-cn5g/Dockerfile
Normal file
15
doc/tutorial_resources/oai-cn5g/Dockerfile
Normal file
@@ -0,0 +1,15 @@
|
||||
ARG BASE_IMAGE=ubuntu:jammy
|
||||
|
||||
FROM $BASE_IMAGE as ims
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||
psmisc \
|
||||
git \
|
||||
asterisk \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENTRYPOINT ["asterisk", "-fp"]
|
||||
@@ -1,184 +0,0 @@
|
||||
################################################################################
|
||||
# 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
|
||||
################################################################################
|
||||
|
||||
# OAI CN Configuration File
|
||||
### This file can be used by all OAI NFs
|
||||
### Some fields are specific to an NF and will be ignored by other NFs
|
||||
### The {{ env['ENV_NAME'] }} syntax lets you define these values in a docker-compose file
|
||||
### If you intend to mount this file or use a bare-metal deployment, please refer to README.md
|
||||
### The README.md also defines default values and allowed values for each configuration parameter
|
||||
|
||||
############# Common configuration
|
||||
|
||||
# Log level for all the NFs
|
||||
log_level:
|
||||
general: debug
|
||||
|
||||
# If you enable registration, the other NFs will use the NRF discovery mechanism
|
||||
register_nf:
|
||||
general: yes
|
||||
|
||||
http_version: 2
|
||||
|
||||
############## SBI Interfaces
|
||||
### Each NF takes its local SBI interfaces and remote interfaces from here, unless it gets them using NRF discovery mechanisms
|
||||
nfs:
|
||||
amf:
|
||||
host: oai-amf
|
||||
sbi:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
n2:
|
||||
interface_name: eth0
|
||||
port: 38412
|
||||
smf:
|
||||
host: oai-smf
|
||||
sbi:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
n4:
|
||||
interface_name: eth0
|
||||
port: 8805
|
||||
udm:
|
||||
host: oai-udm
|
||||
sbi:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
udr:
|
||||
host: oai-udr
|
||||
sbi:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
ausf:
|
||||
host: oai-ausf
|
||||
sbi:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
nrf:
|
||||
host: oai-nrf
|
||||
sbi:
|
||||
port: 8080
|
||||
api_version: v1
|
||||
interface_name: eth0
|
||||
|
||||
#### Common for UDR and AMF
|
||||
database:
|
||||
host: mysql
|
||||
user: test
|
||||
type: mysql
|
||||
password: test
|
||||
database_name: oai_db
|
||||
generate_random: true
|
||||
connection_timeout: 300 # seconds
|
||||
|
||||
############## NF-specific configuration
|
||||
amf:
|
||||
pid_directory: "/var/run"
|
||||
amf_name: "OAI-AMF"
|
||||
# This really depends on if we want to keep the "mini" version or not
|
||||
support_features_options:
|
||||
enable_simple_scenario: no
|
||||
enable_nssf: no
|
||||
enable_smf_selection: yes
|
||||
use_external_udm: no
|
||||
relative_capacity: 30
|
||||
statistics_timer_interval: 20 #in seconds
|
||||
emergency_support: false
|
||||
served_guami_list:
|
||||
- mcc: 001
|
||||
mnc: 01
|
||||
amf_region_id: 80
|
||||
amf_set_id: 001
|
||||
amf_pointer: 01
|
||||
plmn_support_list:
|
||||
- mcc: 001
|
||||
mnc: 01
|
||||
tac: 0x0001
|
||||
nssai:
|
||||
- sst: 1
|
||||
supported_integrity_algorithms:
|
||||
- "NIA1"
|
||||
- "NIA2"
|
||||
supported_encryption_algorithms:
|
||||
- "NEA0"
|
||||
- "NEA1"
|
||||
- "NEA2"
|
||||
|
||||
smf:
|
||||
ue_mtu: 1500
|
||||
support_features:
|
||||
use_local_subscription_info: yes # Use infos from local_subscription_info or from UDM
|
||||
use_local_pcc_rules: yes # Use infos from local_pcc_rules or from PCF
|
||||
# we resolve from NRF, this is just to configure usage_reporting
|
||||
upfs:
|
||||
- host: oai-spgwu
|
||||
config:
|
||||
enable_usage_reporting: no
|
||||
ue_dns:
|
||||
primary_ipv4: "1.1.1.1"
|
||||
primary_ipv6: "2001:4860:4860::8888"
|
||||
secondary_ipv4: "8.8.8.8"
|
||||
secondary_ipv6: "2001:4860:4860::8888"
|
||||
ims:
|
||||
pcscf_ipv4: "192.168.70.139"
|
||||
pcscf_ipv6: "fe80::7915:f408:1787:db8b"
|
||||
# the DNN you configure here should be configured in "dnns"
|
||||
local_subscription_infos:
|
||||
- single_nssai:
|
||||
sst: 1
|
||||
dnn: "oai"
|
||||
qos_profile:
|
||||
5qi: 9
|
||||
session_ambr_ul: "10Gbps"
|
||||
session_ambr_dl: "10Gbps"
|
||||
- single_nssai:
|
||||
sst: 1
|
||||
dnn: "openairinterface"
|
||||
qos_profile:
|
||||
5qi: 9
|
||||
session_ambr_ul: "10Gbps"
|
||||
session_ambr_dl: "10Gbps"
|
||||
- single_nssai:
|
||||
sst: 1
|
||||
dnn: "ims"
|
||||
qos_profile:
|
||||
5qi: 9
|
||||
session_ambr_ul: "10Gbps"
|
||||
session_ambr_dl: "10Gbps"
|
||||
|
||||
## DNN configuration
|
||||
dnns:
|
||||
- dnn: "oai"
|
||||
pdu_session_type: "IPV4"
|
||||
ipv4_subnet: "12.1.1.2/24"
|
||||
- dnn: "openairinterface"
|
||||
pdu_session_type: "IPV4V6"
|
||||
ipv4_subnet: "12.1.2.2/24"
|
||||
ipv6_prefix: "2001:1:2::/64"
|
||||
- dnn: "ims"
|
||||
pdu_session_type: "IPV4V6"
|
||||
ipv4_subnet: "12.1.9.2/24"
|
||||
ipv6_prefix: "2001:1:2::/64"
|
||||
@@ -211,13 +211,13 @@ CREATE TABLE `SessionManagementSubscriptionData` (
|
||||
--
|
||||
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000001', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.101\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000001', '00101', '{\"sst\": 1, \"sd\": \"0xFFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.99\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000002', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.102\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000002', '00101', '{\"sst\": 1, \"sd\": \"0xFFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.100\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000003', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.103\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000003', '00101', '{\"sst\": 1, \"sd\": \"0xFFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.101\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||
('001010000000004', '00101', '{\"sst\": 1, \"sd\": \"16777215\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.104\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
('001010000000004', '00101', '{\"sst\": 1, \"sd\": \"0xFFFFFF\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.102\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,205 +0,0 @@
|
||||
version: '3.8'
|
||||
services:
|
||||
mysql:
|
||||
container_name: "mysql"
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- MYSQL_DATABASE=oai_db
|
||||
- MYSQL_USER=test
|
||||
- MYSQL_PASSWORD=test
|
||||
- MYSQL_ROOT_PASSWORD=linux
|
||||
healthcheck:
|
||||
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
|
||||
interval: 5s
|
||||
timeout: 2s
|
||||
retries: 10
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.131
|
||||
|
||||
ims:
|
||||
container_name: "asterisk-ims"
|
||||
image: oaisoftwarealliance/ims:latest
|
||||
volumes:
|
||||
- ./conf/sip.conf:/etc/asterisk/sip.conf
|
||||
- ./conf/users.conf:/etc/asterisk/users.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep asterisk"
|
||||
interval: 5s
|
||||
timeout: 2s
|
||||
retries: 10
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.139
|
||||
oai-udr:
|
||||
container_name: "oai-udr"
|
||||
image: oaisoftwarealliance/oai-udr:develop
|
||||
expose:
|
||||
- 80/tcp
|
||||
- 8080/tcp
|
||||
volumes:
|
||||
- ./conf/config.yaml:/openair-udr/etc/config.yaml
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
depends_on:
|
||||
- mysql
|
||||
- oai-nrf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.136
|
||||
oai-udm:
|
||||
container_name: "oai-udm"
|
||||
image: oaisoftwarealliance/oai-udm:develop
|
||||
expose:
|
||||
- 80/tcp
|
||||
- 8080/tcp
|
||||
volumes:
|
||||
- ./conf/config.yaml:/openair-udm/etc/config.yaml
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
depends_on:
|
||||
- oai-udr
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.137
|
||||
oai-ausf:
|
||||
container_name: "oai-ausf"
|
||||
image: oaisoftwarealliance/oai-ausf:develop
|
||||
expose:
|
||||
- 80/tcp
|
||||
- 8080/tcp
|
||||
volumes:
|
||||
- ./conf/config.yaml:/openair-ausf/etc/config.yaml
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
depends_on:
|
||||
- oai-udm
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.138
|
||||
oai-nrf:
|
||||
container_name: "oai-nrf"
|
||||
image: oaisoftwarealliance/oai-nrf:develop
|
||||
expose:
|
||||
- 80/tcp
|
||||
- 8080/tcp
|
||||
volumes:
|
||||
- ./conf/config.yaml:/openair-nrf/etc/config.yaml
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.130
|
||||
oai-amf:
|
||||
container_name: "oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:develop
|
||||
expose:
|
||||
- 80/tcp
|
||||
- 8080/tcp
|
||||
- 38412/sctp
|
||||
volumes:
|
||||
- ./conf/config.yaml:/openair-amf/etc/config.yaml
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
depends_on:
|
||||
- mysql
|
||||
- oai-nrf
|
||||
- oai-ausf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.132
|
||||
oai-smf:
|
||||
container_name: "oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:develop
|
||||
expose:
|
||||
- 80/tcp
|
||||
- 8080/tcp
|
||||
- 8805/udp
|
||||
volumes:
|
||||
- ./conf/config.yaml:/openair-smf/etc/config.yaml
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
depends_on:
|
||||
- oai-nrf
|
||||
- oai-amf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.133
|
||||
oai-spgwu:
|
||||
container_name: "oai-spgwu"
|
||||
image: oaisoftwarealliance/oai-spgwu-tiny:develop
|
||||
expose:
|
||||
- 2152/udp
|
||||
- 8805/udp
|
||||
- 8080/tcp
|
||||
# TODO: oai-spgwu-tiny will not support the new common yaml config file feature
|
||||
# waiting for the new oai-upf NF
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
|
||||
- SGW_INTERFACE_NAME_FOR_SX=eth0
|
||||
- PGW_INTERFACE_NAME_FOR_SGI=eth0
|
||||
- NETWORK_UE_NAT_OPTION=yes
|
||||
- NETWORK_UE_IP=12.1.0.0/16
|
||||
- ENABLE_5G_FEATURES=yes
|
||||
- REGISTER_NRF=yes
|
||||
- USE_FQDN_NRF=yes
|
||||
- UPF_FQDN_5G=oai-spgwu
|
||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||
- NRF_FQDN=oai-nrf
|
||||
# Mandatory to set the NRF PORT to 8080 (it is set to default to 80 otherwise)
|
||||
- HTTP_VERSION=2
|
||||
- NRF_PORT=8080
|
||||
# Slice 0 (1, 0xFFFFFF)
|
||||
- NSSAI_SST_0=1
|
||||
- DNN_0=oai
|
||||
# Slice 1 (1, 0xFFFFFF)
|
||||
- NSSAI_SST_1=1
|
||||
- DNN_1=openairinterface
|
||||
# Slice 2 (1, 0xFFFFFF)
|
||||
- NSSAI_SST_2=1
|
||||
- DNN_2=ims
|
||||
depends_on:
|
||||
- oai-nrf
|
||||
- oai-smf
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
cap_drop:
|
||||
- ALL
|
||||
privileged: true
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.134
|
||||
oai-ext-dn:
|
||||
privileged: true
|
||||
init: true
|
||||
container_name: oai-ext-dn
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:jammy
|
||||
entrypoint: /bin/bash -c \
|
||||
"ip route add 12.1.0.0/16 via 192.168.70.134 dev eth0; ip route; sleep infinity"
|
||||
command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"]
|
||||
healthcheck:
|
||||
test: /bin/bash -c "ip r | grep 12.1.0"
|
||||
interval: 5s
|
||||
timeout: 2s
|
||||
retries: 10
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.135
|
||||
networks:
|
||||
# public_net:
|
||||
# external:
|
||||
# name: demo-oai-public-net
|
||||
public_net:
|
||||
driver: bridge
|
||||
name: demo-oai-public-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.70.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "demo-oai"
|
||||
264
doc/tutorial_resources/oai-cn5g/docker-compose.yml
Normal file
264
doc/tutorial_resources/oai-cn5g/docker-compose.yml
Normal file
@@ -0,0 +1,264 @@
|
||||
version: '3.8'
|
||||
services:
|
||||
mysql:
|
||||
container_name: "mysql"
|
||||
image: mysql:8.0
|
||||
volumes:
|
||||
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||
- ./healthscripts/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- MYSQL_DATABASE=oai_db
|
||||
- MYSQL_USER=test
|
||||
- MYSQL_PASSWORD=test
|
||||
- MYSQL_ROOT_PASSWORD=linux
|
||||
healthcheck:
|
||||
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.131
|
||||
ims:
|
||||
container_name: "asterisk-ims"
|
||||
image: asterisk-ims:latest
|
||||
volumes:
|
||||
- ./conf/sip.conf:/etc/asterisk/sip.conf
|
||||
- ./conf/users.conf:/etc/asterisk/users.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep asterisk"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.139
|
||||
oai-udr:
|
||||
container_name: "oai-udr"
|
||||
image: oaisoftwarealliance/oai-udr:v1.5.1
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- UDR_NAME=OAI_UDR
|
||||
- UDR_INTERFACE_NAME_FOR_NUDR=eth0
|
||||
- MYSQL_IPV4_ADDRESS=mysql
|
||||
- MYSQL_USER=test
|
||||
- MYSQL_PASS=test
|
||||
- MYSQL_DB=oai_db
|
||||
- WAIT_MYSQL=120
|
||||
- USE_FQDN_DNS=yes
|
||||
- REGISTER_NRF=yes
|
||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||
- NRF_FQDN=oai-nrf
|
||||
depends_on:
|
||||
- mysql
|
||||
- oai-nrf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.136
|
||||
oai-udm:
|
||||
container_name: "oai-udm"
|
||||
image: oaisoftwarealliance/oai-udm:v1.5.1
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- UDM_NAME=OAI_UDM
|
||||
- SBI_IF_NAME=eth0
|
||||
- REGISTER_NRF=yes
|
||||
- USE_FQDN_DNS=yes
|
||||
- UDR_IP_ADDRESS=192.168.70.136
|
||||
- UDR_FQDN=oai-udr
|
||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||
- NRF_FQDN=oai-nrf
|
||||
depends_on:
|
||||
- oai-nrf
|
||||
- oai-udr
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.137
|
||||
oai-ausf:
|
||||
container_name: "oai-ausf"
|
||||
image: oaisoftwarealliance/oai-ausf:v1.5.1
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- AUSF_NAME=OAI_AUSF
|
||||
- SBI_IF_NAME=eth0
|
||||
- USE_FQDN_DNS=yes
|
||||
- REGISTER_NRF=yes
|
||||
- UDM_IP_ADDRESS=192.168.70.137
|
||||
- UDM_FQDN=oai-udm
|
||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||
- NRF_FQDN=oai-nrf
|
||||
depends_on:
|
||||
- oai-nrf
|
||||
- oai-udm
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.138
|
||||
oai-nrf:
|
||||
container_name: "oai-nrf"
|
||||
image: oaisoftwarealliance/oai-nrf:v1.5.1
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.130
|
||||
oai-amf:
|
||||
container_name: "oai-amf"
|
||||
image: oaisoftwarealliance/oai-amf:v1.5.1
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
# PLMN informations
|
||||
- MCC=001
|
||||
- MNC=01
|
||||
- REGION_ID=128
|
||||
- AMF_SET_ID=1
|
||||
- SERVED_GUAMI_MCC_0=001
|
||||
- SERVED_GUAMI_MNC_0=01
|
||||
- SERVED_GUAMI_REGION_ID_0=128
|
||||
- SERVED_GUAMI_AMF_SET_ID_0=1
|
||||
- PLMN_SUPPORT_MCC=001
|
||||
- PLMN_SUPPORT_MNC=01
|
||||
- PLMN_SUPPORT_TAC=0x0001
|
||||
# Slice 0 (1, 0xFFFFFF)
|
||||
- SST_0=1
|
||||
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
||||
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
||||
# One single SMF instance
|
||||
- SMF_INSTANCE_ID_0=1
|
||||
- SMF_FQDN_0=oai-smf
|
||||
- SMF_IPV4_ADDR_0=192.168.70.133
|
||||
- SELECTED_0=true
|
||||
# Interaction with other NFs
|
||||
- NF_REGISTRATION=yes
|
||||
- USE_FQDN_DNS=yes
|
||||
- EXTERNAL_AUSF=yes
|
||||
# Algorithm choices
|
||||
- CIPH_ALGO_LIST=["NEA0" , "NEA1" , "NEA2"]
|
||||
- INT_ALGO_LIST=["NIA1" , "NIA2"]
|
||||
# Other NF
|
||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||
- NRF_FQDN=oai-nrf
|
||||
- AUSF_IPV4_ADDRESS=192.168.70.138
|
||||
- AUSF_FQDN=oai-ausf
|
||||
- UDM_IPV4_ADDRESS=192.168.70.137
|
||||
- UDM_FQDN=oai-udm
|
||||
depends_on:
|
||||
- oai-nrf
|
||||
- oai-ausf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.132
|
||||
oai-smf:
|
||||
container_name: "oai-smf"
|
||||
image: oaisoftwarealliance/oai-smf:v1.5.1
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- SMF_INTERFACE_NAME_FOR_N4=eth0
|
||||
- SMF_INTERFACE_NAME_FOR_SBI=eth0
|
||||
- DEFAULT_DNS_IPV4_ADDRESS=8.8.8.8
|
||||
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
||||
- AMF_IPV4_ADDRESS=192.168.70.132
|
||||
- AMF_FQDN=oai-amf
|
||||
- UDM_IPV4_ADDRESS=192.168.70.137
|
||||
- UDM_FQDN=oai-udm
|
||||
- UPF_IPV4_ADDRESS=192.168.70.134
|
||||
- UPF_FQDN_0=oai-spgwu-tiny
|
||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||
- NRF_FQDN=oai-nrf
|
||||
- USE_LOCAL_SUBSCRIPTION_INFO=yes
|
||||
- REGISTER_NRF=yes
|
||||
- DISCOVER_UPF=yes
|
||||
- USE_FQDN_DNS=yes
|
||||
- UE_MTU=1500
|
||||
# Slice 0 (1, 0xFFFFFF)
|
||||
- DNN_NI0=oai
|
||||
- TYPE0=IPv4
|
||||
- DNN_RANGE0=12.1.1.2 - 12.1.1.254
|
||||
- NSSAI_SST0=1
|
||||
- SESSION_AMBR_UL0=10Gbps
|
||||
- SESSION_AMBR_DL0=10Gbps
|
||||
# Slice 1 (1, 0xFFFFFF)
|
||||
- DNN_NI1=openairinterface
|
||||
- TYPE1=IPv4v6
|
||||
- DNN_RANGE1=12.1.2.2 - 12.1.2.254
|
||||
- NSSAI_SST1=1
|
||||
- SESSION_AMBR_UL1=10Gbps
|
||||
- SESSION_AMBR_DL1=10Gbps
|
||||
# Slice 2 for ims
|
||||
- DNN_NI2=ims
|
||||
- TYPE2=IPv4v6
|
||||
- DNN_RANGE2=12.1.9.2 - 12.1.9.254
|
||||
- NSSAI_SST2=1
|
||||
- SESSION_AMBR_UL2=10Gbps
|
||||
- SESSION_AMBR_DL2=10Gbps
|
||||
# IMS server
|
||||
- DEFAULT_CSCF_IPV4_ADDRESS=192.168.70.139
|
||||
depends_on:
|
||||
- oai-nrf
|
||||
- oai-amf
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.133
|
||||
oai-spgwu-tiny:
|
||||
container_name: "oai-spgwu-tiny"
|
||||
image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.1
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
- SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
|
||||
- SGW_INTERFACE_NAME_FOR_SX=eth0
|
||||
- PGW_INTERFACE_NAME_FOR_SGI=eth0
|
||||
- NETWORK_UE_NAT_OPTION=yes
|
||||
- NETWORK_UE_IP=12.1.0.0/16
|
||||
- ENABLE_5G_FEATURES=yes
|
||||
- REGISTER_NRF=yes
|
||||
- USE_FQDN_NRF=yes
|
||||
- UPF_FQDN_5G=oai-spgwu-tiny
|
||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||
- NRF_FQDN=oai-nrf
|
||||
# Slice 0 (1, 0xFFFFFF)
|
||||
- NSSAI_SST_0=1
|
||||
- DNN_0=oai
|
||||
# Slice 1 (1, 0xFFFFFF)
|
||||
- NSSAI_SST_1=1
|
||||
- DNN_1=openairinterface
|
||||
# Slice 2 (1, 0xFFFFFF)
|
||||
- NSSAI_SST_2=1
|
||||
- DNN_2=ims
|
||||
depends_on:
|
||||
- oai-nrf
|
||||
- oai-smf
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
cap_drop:
|
||||
- ALL
|
||||
privileged: true
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.134
|
||||
oai-ext-dn:
|
||||
image: oaisoftwarealliance/trf-gen-cn5g:latest
|
||||
privileged: true
|
||||
container_name: oai-ext-dn
|
||||
entrypoint: /bin/bash -c \
|
||||
"ip route add 12.1.0.0/16 via 192.168.70.134 dev eth0; sleep infinity"
|
||||
depends_on:
|
||||
- oai-spgwu-tiny
|
||||
healthcheck:
|
||||
test: /bin/bash -c "ip r | grep 12.1.0"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.70.135
|
||||
networks:
|
||||
public_net:
|
||||
driver: bridge
|
||||
name: demo-oai-public-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.70.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "demo-oai"
|
||||
@@ -1,83 +0,0 @@
|
||||
#/*
|
||||
# * 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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Ubuntu 20.04 to cross-compile for ARM64
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
# Very important, the focal image shall not be using mirrors. A lot of them do NOT support ARM64.
|
||||
FROM ubuntu:focal AS ran-base
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV TZ=Europe/Paris
|
||||
|
||||
#install developers pkg/repo
|
||||
RUN apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||
#enabling arm64 architecture
|
||||
dpkg --add-architecture arm64 && \
|
||||
echo "deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted\n" \
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted\n" \
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal universe\n" \
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe\n" \
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse\n" \
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse\n" \
|
||||
"deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse" \
|
||||
| tee /etc/apt/sources.list.d/arm-cross-compile-sources.list && \
|
||||
cp /etc/apt/sources.list "/etc/apt/sources.list.`date`.backup" && \
|
||||
sed -i -E "s/(deb)\ (http:.+)/\1\ [arch=amd64]\ \2/" /etc/apt/sources.list && \
|
||||
apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||
build-essential \
|
||||
psmisc \
|
||||
git \
|
||||
tzdata \
|
||||
xxd \
|
||||
# ARM64 packages
|
||||
libatlas-base-dev:arm64 \
|
||||
libblas-dev:arm64 \
|
||||
liblapack-dev:arm64 \
|
||||
liblapacke-dev:arm64 \
|
||||
libreadline-dev:arm64 \
|
||||
libgnutls28-dev:arm64 \
|
||||
libconfig-dev:arm64 \
|
||||
libsctp-dev:arm64 \
|
||||
libssl-dev:arm64 \
|
||||
libtool:arm64 \
|
||||
zlib1g-dev:arm64 \
|
||||
# cross build libs and compilers
|
||||
libc6-dev-i386 \
|
||||
gcc-9-aarch64-linux-gnu \
|
||||
g++-9-aarch64-linux-gnu && \
|
||||
apt-get clean
|
||||
|
||||
# create the WORKDIR
|
||||
WORKDIR /oai-ran
|
||||
COPY . .
|
||||
|
||||
#run build_oai -I to get the builder image
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai -I && \
|
||||
apt-get clean
|
||||
@@ -35,4 +35,4 @@ COPY . .
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope" -w USRP -t Ethernet --noavx512 -c
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope" -w USRP -t Ethernet --verbose-ci --noavx512 -c
|
||||
|
||||
@@ -35,4 +35,4 @@ COPY . .
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope" -w USRP -t Ethernet --noavx512 -c
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope" -w USRP -t Ethernet --verbose-ci --noavx512 -c
|
||||
|
||||
@@ -35,4 +35,4 @@ COPY . .
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope nrqtscope" -w USRP -t Ethernet --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope nrqtscope" -w USRP -t Ethernet --verbose-ci --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user