Lightweight project that enables evaluation of classical and L4S-compliant congestion control algorithms (CCAs) on an emulated 5G testbed with real-world channel traces. The project supports testing various congestion control schemes:
- Classical CCAs: CUBIC, BBR, and other standard TCP algorithms
- L4S-compliant CCAs: UDP Prague and SCReAM (with ECN support)
The project includes a WebRTC-based video streaming stack that encodes video and transmits it over the emulated cellular link. The video stack supports dual bandwidth controllers:
- GCC (Google Congestion Control)
- SCReAM with ECN support for L4S marking
All components are composed as Go submodules for seamless integration and explicit congestion notification (ECN) processing.
This project requires an end-to-end 5G testbed to function properly. You'll need to set up:
tmux is required by testbed/launch.sh to manage the gNB, UE, UPF, receiver, and orchestration panes. Install it with:
sudo apt-get update
sudo apt-get install -y tmuxIf you want a nicer tmux setup, see Oh My Tmux!.
git clone --recurse-submodules https://github.com/nrg-uw/Video-Streaming.gitFetch all submodules branches:
git submodule foreach 'git fetch --all'Install the required build dependencies for the srsRAN Project gNB and the srsRAN 4G UE by following the official srsRAN documentation:
This testbed uses the ZMQ-based gNB / UE flow, so make sure your srsRAN environment includes the ZeroMQ-related dependencies as documented there. The standalone scream and udp_prague builds only require standard C++ build tools (cmake / make / g++).
The shortest path for deploying the core network is to first clone and install the testbed automator, which sets up the required dependencies for the core deployment, including Kubernetes:
Reference repository: https://github.com/niloysh/testbed-automator/tree/628abb81c0778a882c72d7b4691730ee7477e4f7
git clone https://github.com/niloysh/testbed-automator.git
cd testbed-automator
# Run the installation script
./install.shThen deploy the core and add subscribers from open5gs-k8s/:
cd open5gs-k8s
./deploy-core.sh
./add-cots-subscribers.sh
./add-sim-subscribers.shThat is enough to bring up the core network for this testbed. For the full Open5GS and Kubernetes setup details, see open5gs-k8s/README.md.
To remove the deployed core later, use open5gs-k8s/remove-core.sh.
Create a build directory in srsRAN_Project with ZMQ enabled:
cd srsRAN_Project
cmake -S . -B build \
-DENABLE_ZEROMQ=ON \
-DBUILD_TESTS=OFF \
-DCMAKE_CXX_COMPILER=/usr/bin/g++-11
cd build
make -j $(nproc)Build srsue with ZMQ enabled and unnecessary components disabled:
cd srsRAN_4G
cmake -S . -B build \
-DENABLE_SRSUE=ON \
-DENABLE_SRSENB=OFF \
-DENABLE_SRSEPC=OFF \
-DENABLE_ZEROMQ=ON \
-DENABLE_GUI=OFF
cd build
make -j $(nproc)These builds are optional and only needed if you want to test with standalone udp_prague or standalone scream outside the WebRTC video pipeline.
Build standalone SCReAM:
cd scream
mkdir bin
cd bin
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ../
make -j $(nproc)Build UDP Prague:
cd udp_prague
make -j $(nproc)Set up the n3 bridge for communication between the N3 interface and your host machine:
# Setup n3br interface
sudo ip address add 10.10.3.231/24 dev n3br
sudo ip link set n3br up
# Enable traffic routing to UEs from the host machine
sudo ip route add 10.0.41.0/16 via 10.10.3.1 dev n3br
sudo ip route add 10.0.42.0/16 via 10.10.3.2 dev n3brCreate a config.json file based on the template. For detailed information about all available configuration options, refer to testbed/parameters/README.md:
cd testbed
cp parameters/template.json config.json
# Edit config.json with your specific settingsLaunch the testbed with your configuration:
cd testbed
# the result of the experiment will be populated here
mkdir experiments
./launch.sh -c config.jsonFor running multiple experiments with different configurations, refer to testbed/README.md for instructions on using batch experiments.