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..90662226ed
--- /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 = -10;
+ }
+
+ );
+
+
+ # ------- 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/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
-
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
+
+
+
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
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;
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);