From b33424b7904fa61fc7cb072c32cf1dfa01628ea9 Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Wed, 26 Nov 2025 14:46:06 +0100 Subject: [PATCH 1/6] CI: Add script for BW configuration on WNC RU --- ci-scripts/scripts/set-wnc-bandwidth.sh | 93 +++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 ci-scripts/scripts/set-wnc-bandwidth.sh diff --git a/ci-scripts/scripts/set-wnc-bandwidth.sh b/ci-scripts/scripts/set-wnc-bandwidth.sh new file mode 100644 index 0000000000..c52f30e388 --- /dev/null +++ b/ci-scripts/scripts/set-wnc-bandwidth.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +if [ -z "$1" ]; then + echo "Usage: $0 [reboot]" + exit 1 +fi + +BANDWIDTH="$1" +DO_REBOOT="$2" +RU_IP="10.10.0.115" +HOST="root@$RU_IP" +LOGFILE="/tmp/radio_config_$(date +%Y%m%d_%H%M%S).log" + +echo "=== Starting at $(date) ===" | tee "$LOGFILE" +echo "Target bandwidth: $BANDWIDTH" | tee -a "$LOGFILE" +echo "Reboot before configuration: ${DO_REBOOT:-no}" | tee -a "$LOGFILE" + +if [ "$DO_REBOOT" == "reboot" ]; then + echo "=== Rebooting RU ($RU_IP) ... ===" | tee -a "$LOGFILE" + + expect < /dev/null 2>&1 +set timeout 10 +spawn ssh -tt $HOST + +expect "#" +send "reboot\r" +expect "Continue?" +send "Y\r" +# We expect disconnect now +expect eof +EOF + + echo "→ Waiting for $RU_IP SSH to go down..." | tee -a "$LOGFILE" + sleep 10 + + echo "→ Waiting for $RU_IP SSH port 22 to be open..." | tee -a "$LOGFILE" + while ! nc -zv $RU_IP 22 >/dev/null 2>&1; do + echo "SSH port 22 not open, waiting 5 seconds..." | tee -a "$LOGFILE" + sleep 5 + done + echo "✓ SSH port 22 is open on $RU_IP" | tee -a "$LOGFILE" +fi + +echo "=== Applying bandwidth configuration ===" | tee -a "$LOGFILE" + +expect < /dev/null 2>&1 +set timeout 10 +spawn ssh -tt $HOST + +expect "#" +send "radio disable\r" + +expect "#" +send "config\r" + +expect "(config)#" +send "radio 1\r" + +expect "(conf-rf 1)#" +send "bandwidth ${BANDWIDTH}\r" + +expect "(conf-rf 1)#" +send "exit\r" + +expect "(config)#" +send "exit\r" + +expect "#" +send "radio enable\r" + +expect "#" +send "show running-config\r" + +expect "#" +send "exit\r" +EOF + +echo "=== Checking bandwidth in running-config ===" | tee -a "$LOGFILE" + +FOUND_BW=$(grep -E "bandwidth[[:space:]]+[0-9]+" "$LOGFILE" \ + | tail -n 1 \ + | awk '{print $2}' \ + | tr -d '\r[:space:]') + +if [ "$FOUND_BW" -eq "$BANDWIDTH" ]; then + echo "✓ SUCCESS: Bandwidth correctly set to $FOUND_BW" | tee -a "$LOGFILE" + rm "$LOGFILE" + exit 0 +else + echo "✖ ERROR: Expected bandwidth $BANDWIDTH but found: $FOUND_BW" | tee -a "$LOGFILE" + exit 1 +fi + From ff358dde6f70a12f2a432d7010af3623a9458b38 Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Wed, 26 Nov 2025 14:48:04 +0100 Subject: [PATCH 2/6] CI: Add configuration and yaml files for new pipeline with Jetson --- ci-scripts/ci_infra.yaml | 16 ++ .../gnb-vnf.sa.band78.78prb.aerial.conf | 226 ++++++++++++++++ .../sa_b200_jetson_nrue/docker-compose.yml | 27 ++ .../aerial_l1_entrypoint.sh | 32 +++ .../cuphycontroller_P5G_WNC_GH.yaml | 243 ++++++++++++++++++ .../sa_gnb_aerial_30MHz/docker-compose.yaml | 67 +++++ 6 files changed, 611 insertions(+) create mode 100644 ci-scripts/conf_files/gnb-vnf.sa.band78.78prb.aerial.conf create mode 100644 ci-scripts/yaml_files/sa_b200_jetson_nrue/docker-compose.yml create mode 100755 ci-scripts/yaml_files/sa_gnb_aerial_30MHz/aerial_l1_entrypoint.sh create mode 100644 ci-scripts/yaml_files/sa_gnb_aerial_30MHz/cuphycontroller_P5G_WNC_GH.yaml create mode 100644 ci-scripts/yaml_files/sa_gnb_aerial_30MHz/docker-compose.yaml diff --git a/ci-scripts/ci_infra.yaml b/ci-scripts/ci_infra.yaml index 837f1edb82..00da44ed77 100644 --- a/ci-scripts/ci_infra.yaml +++ b/ci-scripts/ci_infra.yaml @@ -101,6 +101,14 @@ oc-cn5g-20897-aerial: Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-nvidia-aerial" LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-2025-jan oaicicd-core-for-nvidia-aerial %%log_dir%%" +oc-cn5g-00104: + Host: gracehopper1-oai + NetworkScript: echo "inet 172.21.6.105" + RunIperf3Server: False + Deploy: "! scripts/oc-cn5g-deploy.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial" + Undeploy: "! scripts/oc-cn5g-undeploy.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial" + LogCollect: "! scripts/oc-cn5g-logcollect.sh /opt/oai-cn5g-fed-develop-00104 oaicicd-core-for-nvidia-aerial %%log_dir%%" + matix-cn5g: Host: matix NetworkScript: docker exec prod-trf-gen ip a show dev eth0 @@ -300,6 +308,14 @@ oai_ue_caracal: IF: oaitun_ue1 MTU: 1500 +oai_ue_jetson2: + Host: jetson2-oai + AttachScript: 'docker start oai-nr-ue' + DetachScript: 'docker stop oai-nr-ue' + NetworkScript: ip a show dev oaitun_ue1 + IF: oaitun_ue1 + MTU: 1500 + lte_oai_ue_carabe: Host: carabe NetworkScript: docker exec lte-b200-ue-fdd-10Mhz-tm1 ip a show dev oaitun_ue1 diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band78.78prb.aerial.conf b/ci-scripts/conf_files/gnb-vnf.sa.band78.78prb.aerial.conf new file mode 100644 index 0000000000..12c0aba35c --- /dev/null +++ b/ci-scripts/conf_files/gnb-vnf.sa.band78.78prb.aerial.conf @@ -0,0 +1,226 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +nfapi = "AERIAL"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({mcc = 001; mnc = 04; mnc_length = 2; snssaiList = ({sst = 1;});}); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pdsch_AntennaPorts_N1 = 2; + pusch_AntennaPorts = 2; + do_CSIRS = 0; + do_SRS = 0; + min_rxtxtime = 6; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # center frequency = 3350.01 MHz + # selected SSB frequency = 3349.92 MHz + absoluteFrequencySSB = 623328; + dl_frequencyBand = 78; + # frequency point A = 3300.87 MHz + dl_absoluteFrequencyPointA = 622398; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 78; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart)) + initialDLBWPlocationAndBandwidth = 21175; + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 78; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 21175; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 148;# testMAC 158; OAI gNB 98 +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#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; +#one (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant = -90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; + + 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; #5; + nrofDownlinkSlots = 6; #3; + nrofDownlinkSymbols = 10; #6; + nrofUplinkSlots = 3; #1; + nrofUplinkSymbols = 0; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ({ ipv4 = "172.21.6.103"; }); + + + NETWORK_INTERFACES : + { + GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.53"; + GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.53"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + remote_s_address = "127.0.0.1"; // pnf addr [!] + local_s_address = "127.0.0.2"; // vnf addr + local_s_portc = 50001; // vnf p5 port + remote_s_portc = 50000; // pnf p5 port [!] + local_s_portd = 50011; // vnf p7 port [!] + remote_s_portd = 50010; // pnf p7 port [!] + tr_s_preference = "aerial"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 180; # 150; + pucch_TargetSNRx10 = 180; #200; + ulsch_max_frame_inactivity = 10; + dl_max_mcs = 28; + ul_max_mcs = 28; +} +); + + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +} diff --git a/ci-scripts/yaml_files/sa_b200_jetson_nrue/docker-compose.yml b/ci-scripts/yaml_files/sa_b200_jetson_nrue/docker-compose.yml new file mode 100644 index 0000000000..0a35a3caaa --- /dev/null +++ b/ci-scripts/yaml_files/sa_b200_jetson_nrue/docker-compose.yml @@ -0,0 +1,27 @@ +services: + oai-nr-ue: + image: ${REGISTRY-oaisoftwarealliance/}${NRUE_IMG:-oai-nr-ue}:${TAG:-develop} + network_mode: host + container_name: oai-nr-ue + cap_drop: + - ALL + cap_add: + - NET_ADMIN # for interface bringup + - NET_RAW # for ping + - SYS_NICE # for performance + - IPC_LOCK # for memory locking + devices: + - /dev/net/tun:/dev/net/tun + - /dev/bus/usb/:/dev/bus/usb/ + environment: + TZ: Europe/Paris + USE_B2XX: 'yes' + USE_ADDITIONAL_OPTIONS: --usrp-args type=b200 -C 3350010000 -r 78 --numerology 1 --band 78 --ssb 345 --ue-fo-compensation --uicc0.imsi 001040000000001 --uicc0.pdu_sessions.[0].dnn oai.ipv4 -A 60 --thread-pool 5,6,7,8,9 --ue-txgain 15 --ue-rxgain 90 + cpuset: "3-11" + volumes: + - ../../conf_files/ue.sa.conf:/opt/oai-nr-ue/etc/nr-ue.conf + healthcheck: + test: /bin/bash -c "pgrep nr-uesoftmodem" + interval: 10s + timeout: 5s + retries: 5 diff --git a/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/aerial_l1_entrypoint.sh b/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/aerial_l1_entrypoint.sh new file mode 100755 index 0000000000..c8bac9eb3e --- /dev/null +++ b/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/aerial_l1_entrypoint.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Check if cuBB_SDK is defined, if not, use default path +cuBB_Path="${cuBB_SDK:-/opt/nvidia/cuBB}" + +cd "$cuBB_Path" || exit 1 + +# Restart MPS +# Export variables +export CUDA_DEVICE_MAX_CONNECTIONS=8 +export CUDA_MPS_PIPE_DIRECTORY=/var +export CUDA_MPS_LOG_DIRECTORY=/var + +# Stop existing MPS +echo quit | sudo -E nvidia-cuda-mps-control + +# Start MPS +sudo -E nvidia-cuda-mps-control -d +sudo -E echo start_server -uid 0 | sudo -E nvidia-cuda-mps-control + +# Start cuphycontroller_scf +# Check if an argument is provided +if [ $# -eq 0 ]; then + # No argument provided, use default value + argument="P5G_WNC_GH" +else + # Argument provided, use it + argument="$1" +fi + +sudo -E "$cuBB_Path"/build.$(uname -m)/cuPHY-CP/cuphycontroller/examples/cuphycontroller_scf "$argument" +sudo -E ./build.$(uname -m)/cuPHY-CP/gt_common_libs/nvIPC/tests/pcap/pcap_collect diff --git a/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/cuphycontroller_P5G_WNC_GH.yaml b/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/cuphycontroller_P5G_WNC_GH.yaml new file mode 100644 index 0000000000..d43e2b17ad --- /dev/null +++ b/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/cuphycontroller_P5G_WNC_GH.yaml @@ -0,0 +1,243 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# 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. + +aerial_sdk_version: 25-3-cubb +l2adapter_filename: l2_adapter_config_P5G_GH.yaml +aerial_metrics_backend_address: 127.0.0.1:8081 + +# CPU core shared by all low-priority threads +low_priority_core: 10 +enable_ptp_svc_monitoring: 0 +ptp_rms_threshold: 20 #ns +nic_tput_alert_threshold_mbps: 85000 + +cuphydriver_config: + standalone: 0 + validation: 0 + num_slots: 8 + log_level: DBG + profiler_sec: 0 + dpdk_thread: 10 + dpdk_verbose_logs: 0 + accu_tx_sched_res_ns: 500 + accu_tx_sched_disable: 0 #Flag applicable only for CX6-DX : BF3/CX7 HW and beyond support accurate send scheduling directly on timestamp, for CX6-DX this is implemented via software emulation + fh_stats_dump_cpu_core: -1 + pdump_client_thread: -1 + use_green_contexts: 0 + use_batched_memcpy: 0 # Experimental feature; requires >= CUDA 12.8 + mps_sm_pusch: 100 + mps_sm_pucch: 2 + mps_sm_prach: 2 + mps_sm_ul_order: 20 + mps_sm_pdsch: 102 + mps_sm_pdcch: 10 + mps_sm_pbch: 2 + mps_sm_gpu_comms: 16 + mps_sm_srs: 16 + pdsch_fallback: 0 + dpdk_file_prefix: cuphycontroller + nics: + - nic: '0000:01:00.0' + mtu: 9216 + cpu_mbufs: 196608 + uplane_tx_handles: 64 + txq_size: 8192 + rxq_size: 16384 + gpu: 0 + cus_port_failover: 0 + gpus: + - 0 + # Set GPUID to the GPU sharing the PCIe switch as NIC + # run nvidia-smi topo -m to find out which GPU + workers_ul: [4,5] + workers_dl: [6,7,8] + debug_worker: -1 + workers_sched_priority: 95 + prometheus_thread: -1 + start_section_id_srs: 3072 + start_section_id_prach: 2048 + enable_ul_cuphy_graphs: 1 + enable_dl_cuphy_graphs: 1 + ul_order_kernel_mode: 0 # 0: Ping-Pong, 1: dual CTA + ul_order_timeout_cpu_ns: 8000000 + ul_order_timeout_log_interval_ns: 1000000000 + ul_order_timeout_gpu_ns: 3000000 + ul_order_timeout_gpu_srs_ns: 5200000 + ul_srs_aggr3_task_launch_offset_ns: 500000 + ul_order_timeout_gpu_log_enable: 0 + ul_order_max_rx_pkts: 512 + ul_order_rx_pkts_timeout_ns: 100000 + cplane_disable: 0 + gpu_init_comms_dl: 1 + cell_group: 1 + cell_group_num: 1 + fix_beta_dl: 0 + bfw_beta_prescaler: 16384 + pusch_workCancelMode: 2 # set cuphyPuschStatPrms_t workCancelMode field to PUSCH_DEVICE_GRAPHS; this only sets the mode and does not cancel work; + # work cancellation (i.e., not launching some of the device graphs) can only occur after an explicit internal + # memory write is timely observed by a PUSCH graph. + pusch_sinr: 2 + pusch_rssi: 1 + pusch_tdi: 1 + pusch_cfo: 1 + pusch_dftsofdm: 0 + pusch_to: 1 + pusch_select_eqcoeffalgo: 3 + pusch_select_chestalgo: 1 + pusch_enable_perprgchest: 0 + pusch_tbsizecheck: 1 + pusch_deviceGraphLaunchEn: 1 + pusch_waitTimeOutPreEarlyHarqUs: 3000 + pusch_waitTimeOutPostEarlyHarqUs: 3000 + puxch_polarDcdrListSz: 8 + enable_cpu_task_tracing: 0 + enable_prepare_tracing: 0 + disable_empw: 0 #1=>Disables Multi packet WQE feature + cqe_tracer_config: + enable_dl_cqe_tracing: 0 + cqe_trace_cell_mask: 1 #[64 bit mask: Bit0->Cell0, Bit1->Cell1...] + cqe_trace_slot_mask: 196800 #[20 bit mask: Bit0->Slot0, Bit1->Slot1...] 196800=>All *6,*7 DL Slots + ul_rx_pkt_tracing_level: 0 + ul_rx_pkt_tracing_level_srs: 0 + pmu_metrics: 0 #Enable and select PMU metrics, 0=disabled, 1=General Counters (platform agnostic), 2=Topdown Metrics (Grace only), 3=Cache Metrics (Grace only) + enable_h2d_copy_thread: 1 + h2d_copy_thread_cpu_affinity : 11 + h2d_copy_thread_sched_priority : 95 #0->SCHED_OTHER, >0->Actual + split_ul_cuda_streams: 0 # 1=Put UL slot 4 and slot 5 on different streams for DDDSUUDDDD pattern + serialize_pucch_pusch: 0 # 1=Force serialization of PUSCH/PUCCH + # Note: for Early Harq (EH) order is PUSCH EH -> PUCCH -> PUSCH non EH + # for non-Early Harq order is PUCCH -> all PUSCH processing + aggr_obj_non_avail_th: 5 # Threshold for consecutive non-availability of Aggregated objects(UL/DL) or DL/UL buffers + dl_wait_th_ns: + - 500000 #H2D copy wait threshold + - 4000000 #cuPHY DL channel wait threshold + sendCPlane_timing_error_th_ns : 0 + sendCPlane_ulbfw_backoff_th_ns: 300000 # ULBFW must be completed by cplane send time - this is the backoff time + sendCPlane_dlbfw_backoff_th_ns: 300000 # DLBFW must be completed by cplane send time - this is the backoff time + pusch_forcedNumCsi2Bits: 0 + mMIMO_enable: 0 + enable_srs: 1 + ue_mode: 0 + mCh_segment_proc_enable: 0 + pusch_aggr_per_ctx: 3 + prach_aggr_per_ctx: 2 + pucch_aggr_per_ctx: 4 + srs_aggr_per_ctx: 3 + ul_input_buffer_per_cell: 10 + ul_input_buffer_per_cell_srs: 6 + max_harq_pools: 384 + max_harq_tx_count_bundled: 10 + max_harq_tx_count_non_bundled: 4 + ok_testbench_config: + enable_ok_tb: 0 + num_ok_tb_slot: 0 #Presently not used + max_ru_unhealthy_ul_slots: 100 + srs_chest_algo_type: 0 + srs_chest_tol2_normalization_algo_type: 1 + srs_chest_tol2_constant_scaler: 32768.0 + bfw_power_normalization_alg_selector: 1 + total_num_srs_chest_buffers: 6144 + send_static_bfw_wt_all_cplane: 1 + ul_pcap_capture_enable: 0 + ul_pcap_capture_thread_cpu_affinity: 10 + ul_pcap_capture_thread_sched_priority: 95 + pcap_logger_ul_cplane_enable: 0 + pcap_logger_dl_cplane_enable: 0 + pcap_logger_thread_cpu_affinity: 10 + pcap_logger_thread_sched_prio: 95 + pcap_logger_file_save_dir: ./ + dlc_bfw_enable_divide_per_cell: 0 # Enable/disable dividing DL BFW C-Plane transmission window among multiple cells in a slot + ulc_bfw_enable_divide_per_cell: 0 # Enable/disable dividing UL BFW C-Plane transmission window among multiple cells in a slot + dlc_alloc_cplane_bfw_txq: 0 # Allocates a second separate queue for BFW DL C-Plane transmission + ulc_alloc_cplane_bfw_txq: 1 # Allocates a second separate queue for BFW UL C-Plane transmission + #static beam id range + static_beam_id_start: 1 + static_beam_id_end: 16527 + #dynamic beam id range + dynamic_beam_id_start: 16528 #Dynamic beam ID start should be after static beam ID end + dynamic_beam_id_end: 32767 #15bit max value + bfw_c_plane_chaining_mode: 0 # 0: Default memcpy of BFW weights, 1: CPU mbuf chaining of BFW weights, 2: GPU mbuf chaining + enable_l1_param_sanity_check: 0 + pusch_nMaxLdpcHetConfigs: 32 + notify_ul_harq_buffer_release: 0 + + # data_config: + # datalake_core: 12 # This must be set for Data Lake and/or E3 Agent to be used + # datalake_db_write_enable: 1 # Enable/disable ClickHouse writes based on datalake_data_types + # datalake_samples: 1000000 + # datalake_address: localhost + # datalake_engine: "MergeTree() PRIMARY KEY (TsTaiNs)" + # # datalake_drop_tables: 0 # Set to 1 to drop Clickhouse tables at startup + # datalake_data_types: [fh, pusch, hest] # Data types to write to ClickHouse DB (all types always collected in memory for E3 Agent): + # fh = Fronthaul IQ samples,pusch = PUSCH/FAPI data, hest = channel estimates + # datalake_store_failed_pdu: 0 # Set to 1 to store PDU data even when CRC fails + # e3_agent_enable: 0 # Enable/disable E3 Agent and dApp capabilities + # num_rows_fh: 120 + # num_rows_pusch: 200 + # num_rows_hest: 140 + # e3_pub_port: 5555 # E3 publisher port for indication messages + # e3_rep_port: 5556 # E3 reply port for E3AP requests + # e3_sub_port: 5560 # E3 subscriber port for Manager messages + + cells: + - name: O-RU 0 + cell_id: 1 + ru_type: 1 + # set to 00:00:00:00:00:00 to use the MAC address of the NIC port to use + src_mac_addr: 00:00:00:00:00:00 + dst_mac_addr: e8:c7:cf:ad:12:0b #WNC n78 + nic: '0000:01:00.0' + vlan: 500 + pcp: 7 + txq_count_uplane: 1 + eAxC_id_ssb_pbch: [0, 1, 2, 3] + eAxC_id_pdcch: [0, 1, 2, 3] + eAxC_id_pdsch: [0, 1, 2, 3] + eAxC_id_csirs: [0, 1, 2, 3] + eAxC_id_pusch: [0, 1, 2, 3] + eAxC_id_pucch: [0, 1, 2, 3] + eAxC_id_srs: [8, 9, 10, 11] + eAxC_id_prach: [4, 5, 6, 7] + dl_iq_data_fmt: {comp_meth: 1, bit_width: 9} + ul_iq_data_fmt: {comp_meth: 1, bit_width: 9} + section_3_time_offset: 484 + fs_offset_dl: 10 + exponent_dl: 4 + ref_dl: 0 + fs_offset_ul: -5 + exponent_ul: 4 + max_amp_ul: 65504 + mu: 1 + T1a_max_up_ns: 280000 + T1a_max_cp_ul_ns: 405000 + Ta4_min_ns: 50000 + Ta4_max_ns: 331000 + Tcp_adv_dl_ns: 125000 + ul_u_plane_tx_offset_ns: 280000 + fh_len_range: 0 + pusch_prb_stride: 273 + prach_prb_stride: 12 + srs_prb_stride: 273 + pusch_ldpc_max_num_itr_algo_type: 1 + pusch_fixed_max_num_ldpc_itrs: 10 + pusch_ldpc_early_termination: 0 + pusch_ldpc_algo_index: 0 + pusch_ldpc_flags: 2 + pusch_ldpc_use_half: 1 + pusch_nMaxPrb: 273 + pusch_nMaxRx: 4 + ul_gain_calibration: 78.68 + lower_guard_bw: 845 + tv_pusch: cuPhyChEstCoeffs.h5 diff --git a/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/docker-compose.yaml b/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/docker-compose.yaml new file mode 100644 index 0000000000..7842077ab3 --- /dev/null +++ b/ci-scripts/yaml_files/sa_gnb_aerial_30MHz/docker-compose.yaml @@ -0,0 +1,67 @@ +services: + nv-cubb: + container_name: nv-cubb + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: + - gpu + network_mode: host + shm_size: 4096m + privileged: true + stdin_open: true + tty: true + volumes: + - /lib/modules:/lib/modules + - /dev/hugepages:/dev/hugepages + - /usr/src:/usr/src + - ./cuphycontroller_P5G_WNC_GH.yaml:/opt/nvidia/cuBB/cuPHY-CP/cuphycontroller/config/cuphycontroller_P5G_WNC_GH.yaml + - ./aerial_l1_entrypoint.sh:/opt/nvidia/cuBB/aerial_l1_entrypoint.sh + - /var/log/aerial:/var/log/aerial + - ../../../cmake_targets/share:/opt/cuBB/share + userns_mode: host + ipc: "shareable" + image: cubb-build:25-3 + environment: + - cuBB_SDK=/opt/nvidia/cuBB + command: bash -c "sudo rm -rf /tmp/phy.log && sudo chmod +x /opt/nvidia/cuBB/aerial_l1_entrypoint.sh && /opt/nvidia/cuBB/aerial_l1_entrypoint.sh" + healthcheck: + test: ["CMD-SHELL",'grep -q "L1 is ready!" /tmp/phy.log && echo 0 || echo 1'] + interval: 20s + timeout: 5s + retries: 5 + oai-gnb-aerial: + cpuset: "13-16" + image: ${REGISTRY-oaisoftwarealliance/}${GNB_IMG:-oai-gnb-aerial}:${TAG:-develop} + depends_on: + nv-cubb: + condition: service_healthy + cap_drop: + - ALL + cap_add: + - SYS_NICE + - IPC_LOCK + ipc: "container:nv-cubb" + environment: + USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,utc_time + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: + - gpu + network_mode: host + shm_size: 4096m + volumes: + - ../../conf_files/gnb-vnf.sa.band78.78prb.aerial.conf:/opt/oai-gnb/etc/gnb.conf + container_name: oai-gnb-aerial + healthcheck: + test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem" + interval: 10s + timeout: 5s + retries: 5 From 63575e54bf04c6da79973569a9e0ef5a6577459d Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Wed, 26 Nov 2025 14:48:46 +0100 Subject: [PATCH 3/6] CI: Add XML file for RAN-SA-AERIAL-OAIUE-CN5G --- .../container_sa_b200_nrue_jetson.xml | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 ci-scripts/xml_files/container_sa_b200_nrue_jetson.xml diff --git a/ci-scripts/xml_files/container_sa_b200_nrue_jetson.xml b/ci-scripts/xml_files/container_sa_b200_nrue_jetson.xml new file mode 100644 index 0000000000..610aa306d5 --- /dev/null +++ b/ci-scripts/xml_files/container_sa_b200_nrue_jetson.xml @@ -0,0 +1,212 @@ + + + JETSON-5G-NRUE + 30 MHz TDD SA JETSON + tasks + + DeployCoreNetwork + Initialize 5G Core + oc-cn5g-00104 + + + + Pull_Local_Registry + Pull Images from Local Registry + jetson2-oai + oai-nr-ue + armv8_ + + + + Pull_Local_Registry + Pull Images from Local Registry + gracehopper1-oai + oai-gnb-aerial + arm_ + + + + Create_Workspace + Create new Workspace + jetson2-oai + + + + Create_Workspace + Create new Workspace + gracehopper1-oai + + + + Custom_Script + Configure 30 MHz bandwidth on WNC RU + gracehopper1-oai + + 30 + + + + Deploy_Object + Deploy PNF/Nvidia CUBB in a container + gracehopper1-oai + ci-scripts/yaml_files/sa_gnb_aerial_30MHz + nv-cubb + + + + Deploy_Object + Deploy VNF in a container + gracehopper1-oai + ci-scripts/yaml_files/sa_gnb_aerial_30MHz + oai-gnb-aerial + + + + Deploy_Object + Deploy nrUE (TDD/Band78/40MHz/N310) in a container + ci-scripts/yaml_files/sa_b200_jetson_nrue + jetson2-oai + 3 + + + + Attach_UE + Attach OAIUE + oai_ue_jetson2 + + + + Custom_Command + Configure IP route + jetson2-oai + sudo ip route add 172.21.6.105 via 13.1.1.100 dev oaitun_ue1 + + + + Ping + Ping: 20pings in 20sec + oai_ue_jetson2 + oc-cn5g-00104 + -c 20 + 1 + 25 + + + + Iperf + iperf (UL/10Mbps/UDP)(30 sec) + -u -b 10M -t 30 -i 1 + oai_ue_jetson2 + oc-cn5g-00104 + 25 + 80 + + + + Iperf + iperf (DL/10Mbps/UDP)(30 sec) + -u -b 10M -t 30 -i 1 -R + oai_ue_jetson2 + oc-cn5g-00104 + 25 + 80 + + + + Iperf + iperf (UL/30Mbps/UDP)(30 sec) + true + -u -b 30M -t 30 -i 1 + oai_ue_jetson2 + oc-cn5g-00104 + 25 + 80 + + + + Iperf + iperf (DL/30Mbps/UDP)(30 sec) + true + -u -b 30M -t 30 -i 1 -R + oai_ue_jetson2 + oc-cn5g-00104 + 25 + 80 + + + + Undeploy_Object + true + Undeploy nr UE + jetson2-oai + ci-scripts/yaml_files/sa_b200_jetson_nrue + + oai-nr-ue + + + + + Undeploy_Object + true + Undeploy gNB + gracehopper1-oai + ci-scripts/yaml_files/sa_gnb_aerial_30MHz + + oai-gnb-aerial=RetxCheck=20,100,100,100 oai-gnb-aerial=EndsWithBye + + + + + Custom_Script + true + Configure 100 MHz bandwidth on WNC RU + gracehopper1-oai + + 100 + + + + Clean_Test_Server_Images + true + Clean Test Images on Test Server + gracehopper1-oai + oai-gnb-aerial + + + + Clean_Test_Server_Images + true + Clean Test Images on Test Server + jetson2-oai + oai-nr-ue + + + + UndeployCoreNetwork + true + Terminate 5G Core + oc-cn5g-00104 + + + From c9065df7f8c4cebb41ce9095bab8a41cba6b1f7b Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Tue, 2 Dec 2025 10:32:33 +0100 Subject: [PATCH 4/6] CI: Add test into Jenkinsfile-Gitlab-Container --- ci-scripts/Jenkinsfile-GitLab-Container | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index e94f386e2e..85b6f18c18 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -795,6 +795,29 @@ pipeline { } } } + stage ("SA-AERIAL-OAIUE-CN5G") { + when { expression {do5Gtest || do5GUeTest} } + steps { + script { + triggerSlaveJob ('RAN-SA-AERIAL-OAIUE-CN5G', 'SA-AERIAL-OAIUE-CN5G') + } + } + post { + always { + script { + // Using a unique variable name for each test stage to avoid overwriting on a global variable + // due to parallel-time concurrency + saAERIALOAIUEStatus = finalizeSlaveJob('RAN-SA-AERIAL-OAIUE-CN5G') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + failingStages += saAERIALOAIUEStatus + } + } + } + } stage ("SA-OAIUE-CN5G") { when { expression {do5Gtest || do5GUeTest} } steps { From f12a3f4d4569be632a141be12534bb5177ff995c Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Tue, 3 Mar 2026 11:23:01 +0100 Subject: [PATCH 5/6] CI: Set WNC BW in Aerial pipeline Since the setup script is available, use it to ensure the correct bandwidth configuration before each run. --- ci-scripts/xml_files/container_sa_aerial_quectel.xml | 9 +++++++++ .../xml_files/container_sa_aerial_quectel_ul_heavy.xml | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/ci-scripts/xml_files/container_sa_aerial_quectel.xml b/ci-scripts/xml_files/container_sa_aerial_quectel.xml index 7282513bb8..cf545b1a1d 100644 --- a/ci-scripts/xml_files/container_sa_aerial_quectel.xml +++ b/ci-scripts/xml_files/container_sa_aerial_quectel.xml @@ -33,6 +33,15 @@ arm_ + + Custom_Script + true + Configure 100 MHz bandwidth on WNC RU + gracehopper1-oai + + 100 + + Detach_UE true diff --git a/ci-scripts/xml_files/container_sa_aerial_quectel_ul_heavy.xml b/ci-scripts/xml_files/container_sa_aerial_quectel_ul_heavy.xml index 8367316e3a..65b9eaa00e 100644 --- a/ci-scripts/xml_files/container_sa_aerial_quectel_ul_heavy.xml +++ b/ci-scripts/xml_files/container_sa_aerial_quectel_ul_heavy.xml @@ -33,6 +33,15 @@ arm_ + + Custom_Script + true + Configure 100 MHz bandwidth on WNC RU + gracehopper1-oai + + 100 + + Detach_UE true From e107f81d548c697a89480eb0f706c698fae913da Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Wed, 4 Mar 2026 22:06:32 +0100 Subject: [PATCH 6/6] CI: update documentation for CI setups Add information about the new CI setup and the RAN-SA-AERIAL-OAIUE-CN5G testing pipeline. --- doc/TESTBenches.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/TESTBenches.md b/doc/TESTBenches.md index f91321012c..c48cdfe5d3 100644 --- a/doc/TESTBenches.md +++ b/doc/TESTBenches.md @@ -27,6 +27,7 @@ | groot | Groot | gNB (n77) | B210 (30AD30F) | | rocket | Rocket | gNB (n77) | B210 (31F8010) | | raspix | Raspix | COTS UE | Quectel RM520N | +| jetson1-oai | Jetson1-oai | nrUE | USRP B210 | > **Note:** The available resources, and their current usage, is indicated here: > - [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/): @@ -238,6 +239,10 @@ information on how the images are built. ~5G-NR - gracehopper1-oai - run channel simulation on CPU and GPU using test_channel_scalability +- [RAN-SA-AERIAL-OAIUE-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-AERIAL-OAIUE-CN5G/) + ~5G-NR ~nrUE + - 5G-NR SA test setup: OAI VNF + PNF/NVIDIA CUBB on gracehopper1-oai + WNC RU, OAIUE on jetson1-oai + B210, OAI CN5G + - OpenShift cluster for CN deployment and container images for gNB and UE deployment ### RAN-CI-NSA-Trigger