diff --git a/CMakeLists.txt b/CMakeLists.txt index 22453e5af6..569aae3975 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -158,11 +158,16 @@ endif() # 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") -set(commonOpts "-pipe -fPIC -Wall -fno-strict-aliasing") +# we need -rdynamic to incorporate all symbols in shared objects, see man page +set(commonOpts "-pipe -fPIC -Wall -fno-strict-aliasing -rdynamic") # GNU C/C++ Compiler might throw many warnings without packed-bitfield-compat, see man page -# also, we need -rdynamic to incorporate all symbols in shared objects, again, see man page if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(commonOpts "${commonOpts} -Wno-packed-bitfield-compat -rdynamic") + set(commonOpts "${commonOpts} -Wno-packed-bitfield-compat") +endif() +# clang: suppress complaints about unused command line argument (-rdynamic only +# used during linking) +if(CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(commonOpts "${commonOpts} -Wno-unused-command-line-argument") endif() set(CMAKE_C_FLAGS diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index c5e99500b1..7b2813325f 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -1021,18 +1021,18 @@ class Containerize(): for s in allServices: # outputs the hash if the container is running ret = mySSH.run(f'docker compose -f {yamlDir}/ci-docker-compose.yml ps --all --quiet -- {s}') - running = ret.stdout.splitlines() - logging.debug(f'running services: {running}') + c = ret.stdout + logging.debug(f'running service {s} with container id {c}') if ret.stdout != "" and ret.returncode == 0: # something is running for that service - services.append(s) - logging.info(f'stopping services {services}') + services.append((s, c)) + logging.info(f'stopping services {[s for s, _ in services]}') mySSH.run(f'docker compose -f {yamlDir}/ci-docker-compose.yml stop -t3') copyin_res = True - for svcName in services: + for service_name, container_id in services: # head -n -1 suppresses the final "X exited with status code Y" - filename = f'{svcName}-{HTML.testCase_id}.log' - mySSH.run(f'docker compose -f {yamlDir}/ci-docker-compose.yml logs --no-log-prefix -- {svcName} &> {lSourcePath}/cmake_targets/log/{filename}') + filename = f'{service_name}-{HTML.testCase_id}.log' + mySSH.run(f'docker logs {container_id} &> {lSourcePath}/cmake_targets/log/{filename}') copyin_res = mySSH.copyin(f'{lSourcePath}/cmake_targets/log/{filename}', f'{filename}') and copyin_res mySSH.run(f'docker compose -f {yamlDir}/ci-docker-compose.yml down -v') @@ -1043,7 +1043,7 @@ class Containerize(): HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE) self.exitStatus = 1 # use function for UE log analysis, when oai-nr-ue container is used - elif 'oai-nr-ue' in services or 'lte_ue0' in services: + elif any(service_name == 'oai-nr-ue' or service_name == 'lte_ue0' for service_name, _ in services): self.exitStatus == 0 logging.debug(f'Analyzing UE logfile {filename}') logStatus = cls_oaicitest.OaiCiTest().AnalyzeLogFile_UE(f'{filename}', HTML, RAN) @@ -1053,12 +1053,12 @@ class Containerize(): else: HTML.CreateHtmlTestRow('UE log Analysis', 'OK', CONST.ALL_PROCESSES_OK) else: - for svcName in services: - if svcName == 'nv-cubb': + for service_name, _ in services: + if service_name == 'nv-cubb': msg = 'Undeploy PNF/Nvidia CUBB' HTML.CreateHtmlTestRow(msg, 'OK', CONST.ALL_PROCESSES_OK) else: - filename = f'{svcName}-{HTML.testCase_id}.log' + filename = f'{service_name}-{HTML.testCase_id}.log' logging.debug(f'\u001B[1m Analyzing logfile {filename}\u001B[0m') logStatus = RAN.AnalyzeLogFile_eNB(filename, HTML, self.ran_checkers) if (logStatus < 0): diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index bb61d356f4..c59017b5ac 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -418,8 +418,6 @@ function main() { CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True" shift;; --sanitize-memory | -fsanitize=memory) - echo_warning "Note: memory sanitizer\n* requires clang (tested: v17)\n* is incompatible with address/undefined behavior sanitizer\n* requires cmake_targets/tools/memsan.patch" - sleep 2 CMAKE_CMD="$CMAKE_CMD -DSANITIZE_MEMORY=ON -DSANITIZE_ADDRESS=OFF -DSANITIZE_UNDEFINED=OFF" shift;; --trace-asn1c-enc-dec) diff --git a/cmake_targets/tools/memsan.patch b/cmake_targets/tools/memsan.patch deleted file mode 100644 index a8b8e9f992..0000000000 --- a/cmake_targets/tools/memsan.patch +++ /dev/null @@ -1,53 +0,0 @@ -commit bf7f0c4f0f1bfce586667b50050640b67a7a747a -Author: Robert Schmidt -Date: Wed Jun 7 18:24:50 2023 +0200 - - Fix dlopen() linker errors in dfts, ldpc, ldpc_parityCheck, and params_libconfig - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index c29105d503..3b9e7d1246 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -508,7 +508,7 @@ add_library(CONFIG_LIB - ) - target_link_libraries(CONFIG_LIB PRIVATE dl UTIL) - add_library(params_libconfig MODULE ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c) --target_link_libraries(params_libconfig config) -+target_link_libraries(params_libconfig config CONFIG_LIB minimal_lib) - # shared library loader - set (SHLIB_LOADER_SOURCES - ${OPENAIR_DIR}/common/utils/load_module_shlib.c -@@ -1018,16 +1018,19 @@ if (ENABLE_LDPC_CUDA) - endif() - endif() - --add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ) -+add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c) - target_link_libraries(ldpc PRIVATE ldpc_gen_HEADERS) -+target_link_libraries(ldpc PRIVATE UTIL) - - add_library(ldpc_parityCheck MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ) - target_compile_definitions(ldpc_parityCheck PUBLIC NR_LDPC_ENABLE_PARITY_CHECK) - target_link_libraries(ldpc_parityCheck PRIVATE ldpc_gen_HEADERS) -+target_link_libraries(ldpc_parityCheck PRIVATE UTIL minimal_lib) - - add_library(coding MODULE ${PHY_TURBOSRC} ) - - add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ) -+target_link_libraries(dfts PRIVATE minimal_lib) - - - set(PHY_SRC_COMMON -diff --git a/common/utils/minimal_stub.c b/common/utils/minimal_stub.c -index be9c1b399d..7ad0df4d56 100644 ---- a/common/utils/minimal_stub.c -+++ b/common/utils/minimal_stub.c -@@ -1,6 +1,8 @@ -+#include - #ifndef T_TRACER - int T_stdout; - #endif -+int oai_exit = 0; - - void exit_function(const char *file, const char *function, const int line, const char *s, const int assert) - { diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c index c5cdd1972f..b0c3c2c6cf 100644 --- a/common/config/libconfig/config_libconfig.c +++ b/common/config/libconfig/config_libconfig.c @@ -322,19 +322,16 @@ int config_libconfig_set(configmodule_interface_t *cfg, paramdef_t *cfgoptions, int config_libconfig_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions, int numoptions, char *prefix) { config_setting_t *setting; - char *str; - int i,u; - long long int llu; - double dbl; - int rst; - int status=0; - int notfound; - int defval; - int fatalerror=0; - int numdefvals=0; + char *str = NULL; + int u = 0; + long long int llu = 0; + double dbl = 0.0f; + int status = 0; + int fatalerror = 0; + int numdefvals = 0; char cfgpath[512]; /* 512 should be enough for the sprintf below */ - for(i=0; ipixel_length; if (this->autoscroll) { - tnext = time_add(this->latest_time, - (struct timespec){tv_sec:0,tv_nsec:1}); + tnext = time_add(this->latest_time, (struct timespec){.tv_sec = 0, .tv_nsec = 1}); tstart = time_sub(tnext, nano_to_time(pixel_length * width)); this->start_time = tstart; } else { diff --git a/common/utils/T/tracer/view/time.c b/common/utils/T/tracer/view/time.c index 287e7b1c7b..18fc02e4d7 100644 --- a/common/utils/T/tracer/view/time.c +++ b/common/utils/T/tracer/view/time.c @@ -122,8 +122,7 @@ static void *time_thread(void *_this) pixel_length = this->pixel_length; if (this->autoscroll) { - tnext = time_add(this->latest_time, - (struct timespec){tv_sec:0,tv_nsec:1}); + tnext = time_add(this->latest_time, (struct timespec){.tv_sec = 0, .tv_nsec = 1}); tstart = time_sub(tnext, nano_to_time(pixel_length * width)); this->start_time = tstart; } else { diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c index 335510953f..f411e0c6be 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c @@ -391,8 +391,8 @@ void build_polar_tables(t_nrPolar_params *polarParams) { // this code packs the one bit per byte of G_N into a packed bits G_N_tab for (int i = 0; i < polarParams->N; i++) { for (int j = 0; j < polarParams->N; j += 64) { - const simde__m256i tmp1 = simde_mm256_cmpgt_epi8(*(simde__m256i *)&polarParams->G_N[i][j], zeros); - const simde__m256i tmp2 = simde_mm256_cmpgt_epi8(*(simde__m256i *)&polarParams->G_N[i][j + 32], zeros); + const simde__m256i tmp1 = simde_mm256_cmpgt_epi8(simde_mm256_loadu_si256((simde__m256i *)&polarParams->G_N[i][j]), zeros); + const simde__m256i tmp2 = simde_mm256_cmpgt_epi8(simde_mm256_loadu_si256((simde__m256i *)&polarParams->G_N[i][j + 32]), zeros); // cast directly to uint64_t from int32_t propagates the sign bit (in gcc) const uint32_t part1 = simde_mm256_movemask_epi8(tmp1); const uint32_t part2 = simde_mm256_movemask_epi8(tmp2); diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 725e3a9919..c688b20e21 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -184,8 +184,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB) AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); for (int q=0; q NR_MAX_PDSCH_TBS) { // Add 24-bit crc (polynomial A) to payload - crc = crc24a(harq_process->a,A)>>8; - harq_process->a[A>>3] = ((uint8_t*)&crc)[2]; - harq_process->a[1+(A>>3)] = ((uint8_t*)&crc)[1]; - harq_process->a[2 + (A >> 3)] = ((uint8_t *)&crc)[0]; + crc = crc24a(harq_process->payload_AB, A) >> 8; + harq_process->payload_AB[A >> 3] = ((uint8_t *)&crc)[2]; + harq_process->payload_AB[1 + (A >> 3)] = ((uint8_t *)&crc)[1]; + harq_process->payload_AB[2 + (A >> 3)] = ((uint8_t *)&crc)[0]; B = A + 24; AssertFatal((A / 8) + 4 <= max_payload_bytes, "A %d is too big (A/8+4 = %d > %d)\n", A, (A / 8) + 4, max_payload_bytes); - memcpy(harq_process->b,harq_process->a,(A/8)+4); } else { // Add 16-bit crc (polynomial A) to payload - crc = crc16(harq_process->a,A)>>16; - harq_process->a[A>>3] = ((uint8_t*)&crc)[1]; - harq_process->a[1 + (A >> 3)] = ((uint8_t *)&crc)[0]; + crc = crc16(harq_process->payload_AB, A) >> 16; + harq_process->payload_AB[A >> 3] = ((uint8_t *)&crc)[1]; + harq_process->payload_AB[1 + (A >> 3)] = ((uint8_t *)&crc)[0]; B = A + 16; AssertFatal((A / 8) + 3 <= max_payload_bytes, "A %d is too big (A/8+3 = %d > %d)\n", A, (A / 8) + 3, max_payload_bytes); - memcpy(harq_process->b,harq_process->a,(A/8)+3); // using 3 bytes to mimic the case of 24 bit crc } ///////////////////////// b---->| block segmentation |---->c ///////////////////////// @@ -110,7 +108,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_IN); start_meas(&ue->ulsch_segmentation_stats); - impp.Kb = nr_segmentation(harq_process->b, + impp.Kb = nr_segmentation(harq_process->payload_AB, harq_process->c, B, &harq_process->C, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 0e511cd72b..2ac06bfe89 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -191,10 +191,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, mod_order, Nl); - trace_NRpdu(DIRECTION_UPLINK, - harq_process_ul_ue->a, - tb_size, - WS_C_RNTI, rnti, frame, slot, 0, 0); + trace_NRpdu(DIRECTION_UPLINK, harq_process_ul_ue->payload_AB, tb_size, WS_C_RNTI, rnti, frame, slot, 0, 0); if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, tb_size, G) == -1) return; diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 369c388ad3..8560e3de82 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -468,7 +468,7 @@ static void nr_ue_scheduled_response_ul(PHY_VARS_NR_UE *phy, fapi_nr_ul_config_r ul_config->slot, pdu->pusch_config_pdu.tx_request_body.pdu_length, current_harq_pid); - memcpy(harq_process_ul_ue->a, + memcpy(harq_process_ul_ue->payload_AB, pdu->pusch_config_pdu.tx_request_body.pdu, pdu->pusch_config_pdu.tx_request_body.pdu_length); } diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 966971ee73..b41896da5e 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -507,7 +507,7 @@ int main(int argc, char **argv) ulsch_ue->pusch_pdu.target_code_rate = code_rate; ulsch_ue->pusch_pdu.qam_mod_order = mod_order; ulsch_ue->pusch_pdu.ldpcBaseGraph = get_BG(TBS, code_rate); - unsigned char *test_input = harq_process_ul_ue->a; + unsigned char *test_input = harq_process_ul_ue->payload_AB; /////////// //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 091b1ad4ab..90f23c695c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -1141,7 +1141,7 @@ int main(int argc, char *argv[]) } for (int i = 0; i < (TBS / 8); i++) - UE->ul_harq_processes[harq_pid].a[i] = i & 0xff; + UE->ul_harq_processes[harq_pid].payload_AB[i] = i & 0xff; if (input_fd == NULL) { // set FAPI parameters for UE, put them in the scheduled response and call @@ -1457,8 +1457,8 @@ int main(int argc, char *argv[]) for (i = 0; i < TBS; i++) { uint8_t estimated_output_bit = (ulsch_gNB->harq_process->b[i / 8] & (1 << (i & 7))) >> (i & 7); - uint8_t test_input_bit = (UE->ul_harq_processes[harq_pid].b[i / 8] & (1 << (i & 7))) >> (i & 7); - + uint8_t test_input_bit = (UE->ul_harq_processes[harq_pid].payload_AB[i / 8] & (1 << (i & 7))) >> (i & 7); + if (estimated_output_bit != test_input_bit) { /*if(errors_decoding == 0) printf("\x1B[34m""[frame %d][trial %d]\t1st bit in error in decoding = %d\n" "\x1B[0m", frame, trial, i);*/ diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 82798b4b75..07c48c88d7 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -893,19 +893,7 @@ uint8_t do_RRCSetupComplete(uint8_t *buffer, NR_RRCSetupComplete_IEs_t *ies = RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete; ies->selectedPLMN_Identity = sel_plmn_id; ies->registeredAMF = NULL; - - ies->ng_5G_S_TMSI_Value = CALLOC(1, sizeof(struct NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value)); - ies->ng_5G_S_TMSI_Value->present = NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI; - NR_NG_5G_S_TMSI_t *stmsi = &ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI; - stmsi->size = 6; - stmsi->buf = calloc(stmsi->size, sizeof(*stmsi->buf)); - AssertFatal(stmsi->buf != NULL, "out of memory\n"); - stmsi->buf[0] = 0x12; - stmsi->buf[1] = 0x34; - stmsi->buf[2] = 0x56; - stmsi->buf[3] = 0x78; - stmsi->buf[4] = 0x9A; - stmsi->buf[5] = 0xBC; + ies->ng_5G_S_TMSI_Value = NULL; memset(&ies->dedicatedNAS_Message,0,sizeof(OCTET_STRING_t)); OCTET_STRING_fromBuf(&ies->dedicatedNAS_Message, dedicatedInfoNAS, dedicatedInfoNASLength); diff --git a/radio/rfsimulator/simulator.c b/radio/rfsimulator/simulator.c index 62d08da212..d190851699 100644 --- a/radio/rfsimulator/simulator.c +++ b/radio/rfsimulator/simulator.c @@ -179,7 +179,7 @@ typedef struct { static int allocCirBuf(rfsimulator_state_t *bridge, int sock) { buffer_t *ptr=&bridge->buf[sock]; - ptr->circularBuf = malloc(sampleToByte(CirSize, 1)); + ptr->circularBuf = calloc(1, sampleToByte(CirSize, 1)); if (ptr->circularBuf == NULL) { LOG_E(HW, "malloc(%lu) failed\n", sampleToByte(CirSize, 1)); return -1;