# srsRAN Project Getting Started: 5G NR on Commodity Hardware

srsRAN Project is the rewrite of what used to be srsLTE — a clean-slate 5G NR gNB written in C++17 by Software Radio Systems. Unlike the old srsLTE codebase, the Project release targets gNB only (no eNB, no UE), is built around a real DU/CU split, and aims for production-grade O-RAN compatibility. It is the most accessible way to put a real 5G NR signal on the air without a vendor stack.

This is what to expect when you deploy it.

Hardware

srsRAN's PHY needs an SDR with high enough sample rates to handle 5G numerologies. Realistically supported front-ends:

  • USRP B210: works for SISO, 10–20 MHz NR carriers in n78 with FDD or TDD. The B210 over USB 3.0 is the cheapest reasonable entry point. Anything narrower than 10 MHz is a waste of time on NR.
  • USRP X310 / N310: required if you want 50–100 MHz carriers, MIMO, or multiple cells.
  • AMD/Xilinx ZCU111-based platforms (Amarisoft Callbox, AW2S): better RF, but you typically run their own stack.
  • LimeSDR XTRX, BladeRF 2.0: experimental, lower priority on the support matrix. Some configs work, expect quirks.

The host matters. For a 20 MHz n78 cell, a recent i7 with at least 6 physical cores and isolated CPUs (isolcpus) on a low-latency kernel is the floor. For 100 MHz, expect to need 12+ cores and serious tuning.

Building from Source

Ubuntu 22.04 LTS is the supported host OS. Install dependencies:

sudo apt install build-essential cmake libfftw3-dev libmbedtls-dev \
    libsctp-dev libyaml-cpp-dev libgtest-dev libboost-program-options-dev \
    libconfig++-dev libuhd-dev uhd-host

Then the actual build:

git clone https://github.com/srsran/srsRAN_Project.git
cd srsRAN_Project && mkdir build && cd build
cmake ../ -DENABLE_EXPORT=ON -DENABLE_ZEROMQ=ON
make -j$(nproc)
sudo make install

ENABLE_ZEROMQ=ON is non-negotiable if you want to test without RF — ZeroMQ lets you connect a virtual UE (the old srsUE binary) over an in-process transport.

Run uhd_find_devices to confirm your USRP is alive before doing anything else.

gNB Configuration

srsRAN ships example configs under configs/. The minimum-viable config for a 20 MHz TDD n78 cell looks like:

cu_cp:
  amf:
    addr: 10.45.1.10        # AMF N2 IP
    bind_addr: 10.45.1.5    # gNB N2 IP
ruu_sdr:
  device_driver: uhd
  device_args: type=b200,clock=internal
  srate: 23.04
  tx_gain: 80
  rx_gain: 40
cell_cfg:
  dl_arfcn: 632628
  band: 78
  channel_bandwidth_MHz: 20
  common_scs: 30
  plmn: "00101"
  tac: 7
  pci: 1

The parameters you will get wrong on the first try:

  • dl_arfcn must fall on the NR-ARFCN GSCN raster for the band. Use 3GPP TS 38.104 Table 5.4.3.3-1 or any online raster calculator.
  • common_scs: 30 is correct for n78 (TDD). FR1 FDD bands use 15 kHz, FR2 uses 120 kHz.
  • srate must match the bandwidth. 20 MHz needs ~23.04 Msps minimum on the SDR side.
  • PLMN must match what your AMF is configured to serve.

Integrating with a 5GC

srsRAN connects to any compliant 5GC over N2 (NGAP/SCTP) and N3 (GTP-U). Open5GS and free5GC both work in practice. Open5GS is generally simpler to bring up — single-binary NFs, MongoDB, and a sane web UI.

For an Open5GS deployment on the same host or a neighbor:

  1. Configure amf.yaml with PLMN 00101, TAC 7, served GUAMI matching what srsRAN expects.
  2. Add a subscriber via the WebUI matching your UE's IMSI/Ki/OPc.
  3. Make sure amf.ngap.server[0].address is reachable from the gNB host.
  4. Start open5gs-amfd, open5gs-smfd, open5gs-upfd, plus dependencies.

Launch the gNB:

sudo ./apps/gnb/gnb -c gnb.yaml

A healthy bring-up logs Cell pci=1 started and NG setup procedure completed. If NG setup fails, it is almost always SCTP reachability or PLMN mismatch.

End-to-End Test

With no real UE, use the legacy srsUE binary in ZMQ mode. srsRAN Project ships a ZMQ-RF driver — point both gNB and UE configs at TCP sockets in localhost, and the UE will perform cell search, RACH, RRC setup, registration, and PDU session establishment. tcpdump on the UPF's TUN interface will show ICMP from the UE's allocated IP.

With RF, a Quectel RM500Q-GL or similar M.2 5G modem on the same band, paired with a programmable SIM (sysmoUSIM is the usual choice), gets you a real over-the-air bring-up.

What Bites You

Sample drops in the PHY logs. Almost always CPU. Pin the PHY threads, isolate cores, drop CPU governor to performance. RACH detected but no RRC setup completion. SIB1 timing or PRACH config index mismatch with what the UE expects. Cross-check prach_config_index against the 38.211 tables. Weak coverage at 1m from the antenna. n78 needs proper antennas, not the rubber duckies that ship with the B210. A SISO patch antenna for 3.5 GHz is cheap and changes everything.

srsRAN gets you from "no 5G" to "NR signal on the air" faster than anything else short of a vendor box. The compromise is that you will spend real time tuning the host, learning UHD, and reading the 38-series specs to make sense of failure modes.