The transport layer sits between UHD’s packet interface and the physical link to the USRP. Choosing appropriate transport parameters—frame sizes, buffer depths, and the number of concurrent transfer slots—directly determines whether your application can sustain the required sample rate without overflows or underflows. UHD selects conservative defaults that work on a wide range of systems, but most high-throughput or low-latency applications benefit from explicit tuning.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/EttusResearch/uhd/llms.txt
Use this file to discover all available pages before exploring further.
Transport Types
- UDP (Ethernet)
- PCIe (NI-RIO)
- USB (LibUSB)
UDP over standard Berkeley sockets is the most common transport, used by all Ethernet-connected USRPs (N-Series, X-Series, E-Series when operated remotely). Parameters can be set as device arguments at initialization time, and for MPMD-based and X300/X310 devices they can also be overridden per-stream in the stream arguments.Supported devices: USRP2, N2x0, N3x0, X3x0, X4x0, E320 (remote), B200 (via network adapter for some setups)
Transport Parameters
The following parameters are shared across transport types. Pass them as key=value pairs in the device argument string or, where supported, in stream arguments.Core Parameters
| Parameter | Default (1 GbE) | Default (10 GbE) | Default (100 GbE) | Notes |
|---|---|---|---|---|
num_recv_frames | 32 | 32 | 32 | Number of RX buffers; does not affect throughput |
num_send_frames | 32 | 32 | 32 | Number of TX buffers; does not affect throughput |
recv_frame_size | 1472 bytes | 8000 bytes | 8000 bytes | Capped at link’s receive MTU |
send_frame_size | 1472 bytes | 8000 bytes | 8000 bytes | Capped at link’s send MTU |
recv_buff_size | 20 ms at link rate | 20 ms at link rate | 20 ms at link rate | Socket receive buffer |
send_buff_size | 20 ms at link rate | 20 ms at link rate | 20 ms at link rate | Large values hurt TX perf |
recv_buff_fullness | ~90% | ~90% | ~90% | UDP only: targeted fullness factor of the receive buffer |
mtu | Same as frame size | Same as frame size | Same as frame size | Overrides reported MTU in RFNoC graph |
num_recv_frames and num_send_frames control memory allocation for the transport ring, not performance. For throughput, focus on recv_frame_size, send_frame_size, recv_buff_size, and system-level socket buffer limits.Parameter Priority
Parameters can be set in two places:- Device arguments (at
multi_usrp::make()time) — applies to all streams on that device. - Stream arguments (at
get_rx_stream()/get_tx_stream()time) — overrides device arguments for that specific stream only.
Setting Transport Parameters
UDP-Specific Configuration
MTU and Frame Size
Every UDP packet carrying samples must fit within the network path MTU. The default frame sizes of 1472 bytes (1500-byte Ethernet MTU minus IP and UDP headers) are safe for any Gigabit Ethernet network. Increase them when your network supports jumbo frames (9000-byte MTU):mtu parameter overrides the MTU value reported to the RFNoC graph (useful for remote/tunneled transports) and is independent of the underlying link type:
Socket Buffer Sizes on Linux
The kernel imposes a ceiling on socket buffer sizes. Check and raise it before running high-rate applications:NIC Descriptor Tuning (Linux)
Increasing the number of TX/RX descriptors in the NIC can dramatically improve performance on some hardware:100 GbE TX Pause Frames (X410)
When using 100 GbE with the X410, enable TX pause frames on the device’s SFP interfaces to ensure proper backpressure:The pause frame setting is volatile and must be re-applied after each device boot or FPGA image reload. Use the
TxFlowControl=1 parameter in the device’s .network file (via systemd v2.4.6+) to make it persistent.Windows Notes
For optimal UDP performance on Windows, set theFastSendDatagramThreshold registry key to allow 1500-byte packets through the fast path of the socket stack:
.reg file at <install-path>/share/uhd/FastSendDatagramThreshold.reg. A system reboot is recommended after applying the change. Also set the Windows power profile to High performance to avoid bandwidth ramp-up delays.
macOS Notes
macOS capssend_buff_size and recv_buff_size at 1 MiB (1 048 576 bytes). Values above this limit are silently capped by the OS.
PCIe Transport (X3x0)
The NI-RIO PCIe transport for X300/X310 supports the same frame/buffer parameters as UDP, plusrecv_buff_size and send_buff_size which must be multiples of the system page size:
USB Transport (B-Series)
For B200/B210 USB devices, tune the number of simultaneous transfers and transfer size:Install WinUSB driver (Windows, UHD < 4.8)
Download
erllc_uhd_winusb_driver.zip, unzip it, then use Device Manager to update the driver for the unrecognized USB device. Point the wizard to the unzipped directory and select the .inf file. As of UHD 4.8, the Windows installer handles this automatically.Performance Tuning Tips
Reduce receive overflows (O)
Reduce receive overflows (O)
- Increase
recv_buff_sizeto give the kernel more space to absorb bursts. - Raise
net.core.rmem_maxon Linux to allow large socket buffers. - Increase NIC RX descriptors with
ethtool -G. - If your CPU is not processing samples fast enough, no amount of buffering will help—profile your receive loop first.
Reduce transmit underflows (U)
Reduce transmit underflows (U)
- Avoid large
send_buff_sizevalues; large TX buffers increase queuing latency and can cause underflows when the buffer drains unevenly. - Pre-fill the TX pipe before starting timed transmissions.
- Raise NIC TX descriptors with
ethtool -G.
Reduce latency
Reduce latency
- Use a smaller
recv_frame_size— smaller packets complete sooner at the device, reducing fill time. - Investigate Interrupt Coalescing settings in your OS and NIC driver. Intel NICs on Linux offer fine-grained control via
ethtool -C. - Isolate the USRP network interface from other traffic to eliminate scheduling jitter.
Flow control (USRP2 / N2x0 UDP only)
Flow control (USRP2 / N2x0 UDP only)
The USRP2 uses host-based flow control via periodic update packets. Two parameters control update frequency:
ups_per_sec— update packets per second (default 20)ups_per_fifo— update packets per FIFO-worth of bytes sent
ups_per_sec or ups_per_fifo can lower overhead for high-throughput applications, but too few updates may cause TX stalls.