From dab8db76d7da22e094845125f69cbcdb3af03257 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 24 Sep 2025 16:18:53 +0200 Subject: [PATCH 1/6] CI: Aerial: Split out CN start/stop from main XML The next commit introduces an "UL-heavy" configuration to be tested with Aerial. To avoid waiting for the CN, start&stop it once at the beginning of the CI run. --- .../container_sa_aerial_cn_start.xml | 37 ++++++++++++++++++ .../xml_files/container_sa_aerial_cn_stop.xml | 38 +++++++++++++++++++ .../xml_files/container_sa_aerial_quectel.xml | 15 -------- 3 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 ci-scripts/xml_files/container_sa_aerial_cn_start.xml create mode 100644 ci-scripts/xml_files/container_sa_aerial_cn_stop.xml diff --git a/ci-scripts/xml_files/container_sa_aerial_cn_start.xml b/ci-scripts/xml_files/container_sa_aerial_cn_start.xml new file mode 100644 index 0000000000..db622423ae --- /dev/null +++ b/ci-scripts/xml_files/container_sa_aerial_cn_start.xml @@ -0,0 +1,37 @@ + + + TEST-AERIAL-SA-CN-START + Deploy 5GC + tasks + + 555000 + + + + DeployCoreNetwork + Initialize 5G Core + oc-cn5g-20897-aerial + + + diff --git a/ci-scripts/xml_files/container_sa_aerial_cn_stop.xml b/ci-scripts/xml_files/container_sa_aerial_cn_stop.xml new file mode 100644 index 0000000000..bf0bd9fb9c --- /dev/null +++ b/ci-scripts/xml_files/container_sa_aerial_cn_stop.xml @@ -0,0 +1,38 @@ + + + TEST-AERIAL-SA-CN-STOP + Undeploy 5GC + tasks + + 000555 + + + + UndeployCoreNetwork + true + Terminate 5G Core + oc-cn5g-20897-aerial + + + diff --git a/ci-scripts/xml_files/container_sa_aerial_quectel.xml b/ci-scripts/xml_files/container_sa_aerial_quectel.xml index 45401ac77b..05d35d0171 100644 --- a/ci-scripts/xml_files/container_sa_aerial_quectel.xml +++ b/ci-scripts/xml_files/container_sa_aerial_quectel.xml @@ -25,7 +25,6 @@ AERIAL 100 MHz TDD SA tasks - 555000 111111 000222 800813 @@ -40,15 +39,8 @@ 000222 222222 333333 - 000555 - - DeployCoreNetwork - Initialize 5G Core - oc-cn5g-20897-aerial - - Pull_Local_Registry Pull Images from Local Registry @@ -160,12 +152,5 @@ gracehopper1-oai oai-gnb-aerial - - - UndeployCoreNetwork - true - Terminate 5G Core - oc-cn5g-20897-aerial - From 2db630e18756d2ed2cdff0fa6538926beaafd299 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 24 Sep 2025 16:04:50 +0000 Subject: [PATCH 2/6] Add UL-heavy Aerial config Update cuBB image to cubb-build:25-2.1_srs-ul-heavy (release 25-2.1 with changes in the L1 config to test heavy ul) Co-authored-by: Reem Bahsoun --- ...-vnf.sa.band78.273prb.aerial.ul-heavy.conf | 227 ++++++++++++++++++ .../sa_gnb_aerial_ul/aerial_l1_entrypoint.sh | 34 +++ .../sa_gnb_aerial_ul/docker-compose.yaml | 66 +++++ 3 files changed, 327 insertions(+) create mode 100644 ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf create mode 100755 ci-scripts/yaml_files/sa_gnb_aerial_ul/aerial_l1_entrypoint.sh create mode 100644 ci-scripts/yaml_files/sa_gnb_aerial_ul/docker-compose.yaml diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf b/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf new file mode 100644 index 0000000000..d6bdc66ddd --- /dev/null +++ b/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf @@ -0,0 +1,227 @@ +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 = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1; }); }); + + nr_cellid = 12345678L; + uess_agg_levels = [0,6,0,0,0]; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pdsch_AntennaPorts_N1 = 2; + pusch_AntennaPorts = 2; + do_CSIRS = 1; + do_SRS = 0; + min_rxtxtime = 2; + + 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 = 620058; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart)) + initialDLBWPlocationAndBandwidth = 1099; + # +# 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 = 273; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 1099; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 159;# 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 = 5; + nrofDownlinkSlots = 1; + nrofDownlinkSymbols = 10; + nrofUplinkSlots = 3; + 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.202"; + GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.202"; + 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 = 220; # 150; + pucch_TargetSNRx10 = 200; #200; + dl_max_mcs = 28; + ul_max_mcs = 28; + ul_min_mcs = 16; +} +); + + +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_gnb_aerial_ul/aerial_l1_entrypoint.sh b/ci-scripts/yaml_files/sa_gnb_aerial_ul/aerial_l1_entrypoint.sh new file mode 100755 index 0000000000..e0fea22190 --- /dev/null +++ b/ci-scripts/yaml_files/sa_gnb_aerial_ul/aerial_l1_entrypoint.sh @@ -0,0 +1,34 @@ +#!/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 +# Add gdrcopy to LD_LIBRARY_PATH +export LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/mellanox/dpdk/lib/x86_64-linux-gnu:/opt/mellanox/doca/lib/x86_64-linux-gnu:/opt/nvidia/cuBB/cuPHY-CP/external/gdrcopy/build/x86_64/ + +# 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 +sudo -E 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_FXN_GH" +else + # Argument provided, use it + argument="$1" +fi + +sudo -E "$cuBB_Path"/build/cuPHY-CP/cuphycontroller/examples/cuphycontroller_scf "$argument" +sudo -E ./build/cuPHY-CP/gt_common_libs/nvIPC/tests/pcap/pcap_collect diff --git a/ci-scripts/yaml_files/sa_gnb_aerial_ul/docker-compose.yaml b/ci-scripts/yaml_files/sa_gnb_aerial_ul/docker-compose.yaml new file mode 100644 index 0000000000..077c58c67c --- /dev/null +++ b/ci-scripts/yaml_files/sa_gnb_aerial_ul/docker-compose.yaml @@ -0,0 +1,66 @@ +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 + - ./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-2.1_srs-ul-heavy + 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}/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,time + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: + - gpu + network_mode: host + shm_size: 4096m + volumes: + - ../../conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.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 3b517dd5d20409a1185b580fab9433bebe8aac36 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 24 Sep 2025 18:35:39 +0200 Subject: [PATCH 3/6] Add CI XML fail for Aerial UL heavy pipeline --- .../container_sa_aerial_quectel_ul_heavy.xml | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 ci-scripts/xml_files/container_sa_aerial_quectel_ul_heavy.xml 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 new file mode 100644 index 0000000000..ab38b72295 --- /dev/null +++ b/ci-scripts/xml_files/container_sa_aerial_quectel_ul_heavy.xml @@ -0,0 +1,144 @@ + + + TEST-AERIAL-SA-UL-Heavy + AERIAL 100 MHz DSUUU SA + tasks + + 111111 + 000222 + 800813 + 002222 + 002223 + 000111 + 000011 + 000032 + 000033 + 000022 + 000222 + 222222 + 333333 + + + + Pull_Local_Registry + Pull Images from Local Registry + gracehopper1-oai + oai-gnb-aerial + arm_ + + + + Create_Workspace + Create new Workspace for server 0 + gracehopper1-oai + + + + Deploy_Object + Deploy PNF/Nvidia CUBB in a container + gracehopper1-oai + ci-scripts/yaml_files/sa_gnb_aerial_ul + nv-cubb + + + + Deploy_Object + Deploy VNF in a container + gracehopper1-oai + ci-scripts/yaml_files/sa_gnb_aerial_ul + oai-gnb-aerial + + + + Attach_UE + Attach Quectel + up2-aerial + + + + Ping + Ping: 100pings in 20sec + up2-aerial + oc-cn5g-20897-aerial + -c 100 -i 0.2 + 5 + + + + Iperf + iperf (DL/UDP/200M)(30 sec)(single-ue profile) + -u -b 200M -t 30 -R + oc-cn5g-20897-aerial + up2-aerial + 25 + 80 + + + + Iperf + iperf (UL/UDP/200M)(30 sec)(single-ue profile) + -u -b 200M -t 30 -l 1428 + oc-cn5g-20897-aerial + up2-aerial + 10 + 90 + + + + Iperf + iperf (UL/UDP/220M)(30 sec)(single-ue profile) + true + -u -b 220M -t 30 -l 1428 + oc-cn5g-20897-aerial + up2-aerial + 10 + 90 + + + + Detach_UE + true + Detach Quectel + up2-aerial + + + + Undeploy_Object + true + Undeploy gNB + gracehopper1-oai + ci-scripts/yaml_files/sa_gnb_aerial_ul + 20,100,100,100 + 20,100,100,100 + + + + Clean_Test_Server_Images + true + Clean Test Images on Test Server + gracehopper1-oai + oai-gnb-aerial + + + From ae63a51ceb649e3559907c840de5a5638fc51c49 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 29 Sep 2025 09:07:24 +0000 Subject: [PATCH 4/6] Increase PBCH Block power: better UL --- .../conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf b/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf index d6bdc66ddd..90662226ed 100644 --- a/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf +++ b/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.ul-heavy.conf @@ -147,7 +147,7 @@ gNBs = nrofUplinkSlots = 3; nrofUplinkSymbols = 0; - ssPBCH_BlockPower = -25; + ssPBCH_BlockPower = -10; } ); From 7ff05a98c22a553455819f7ab0c43a96c7332258 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 1 Oct 2025 13:36:10 +0200 Subject: [PATCH 5/6] Print frame/slot on UL failure --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index ac4b1717a8..f923a2c9ec 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1028,7 +1028,9 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP, if (!get_softmodem_params()->phy_test && UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt >= pusch_failure_thres) { LOG_W(NR_MAC, - "UE %04x: Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n", + "%4d.%2d UE %04x: Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n", + frameP, + slotP, UE->rnti, UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt); nr_mac_trigger_ul_failure(&UE->UE_sched_ctrl, UE->current_UL_BWP.scs); From 1a472e4c0b5a1bcb355be4a419659f2fb1adc48a Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 7 Oct 2025 18:04:46 +0200 Subject: [PATCH 6/6] Msg3 retx: check that current slot is DL The code only checked that Msg3 would be scheduled during UL, but in some combinations, e.g., with DSUUU, the current slot can very well be UL as well => we would schedule DCI in UL slot. --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 715feb5b33..5e9cd47a79 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -805,7 +805,7 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP, const int sched_frame = (frame + (slot + K2) / slots_frame) % MAX_FRAME_NUMBER; const int sched_slot = (slot + K2) % slots_frame; - if (is_ul_slot(sched_slot, &nr_mac->frame_structure)) { + if (is_dl_slot(slot, &nr_mac->frame_structure) && is_ul_slot(sched_slot, &nr_mac->frame_structure)) { NR_beam_alloc_t beam_ul = beam_allocation_procedure(&nr_mac->beam_info, sched_frame, sched_slot, UE->UE_beam_index, slots_frame); if (beam_ul.idx < 0) return;