netring
High-performance zero-copy packet I/O for Linux.
netring provides packet capture and injection via AF_PACKET (TPACKET_V3
block-based mmap ring buffers) and AF_XDP (kernel-bypass via XDP sockets).
It offers both a high-level ergonomic API and a low-level batch API for
maximum throughput.
Quick Start
// High-level: flat packet iterator
let mut cap = new.unwrap;
for pkt in cap.packets.take
// Low-level: batch processing with sequence gap detection
use ;
use Duration;
let mut rx = default
.interface
.block_size
.build
.unwrap;
while let Some = rx.next_batch_blocking.unwrap
#
Features
| Feature | Default | Description |
|---|---|---|
af-xdp |
off | AF_XDP kernel-bypass packet I/O (pure Rust, no native deps) |
tokio |
off | Async capture via AsyncFd (wait_readable + next_batch) |
channel |
off | Thread + bounded channel adapter (runtime-agnostic) |
parse |
off | Packet header parsing via etherparse |
API Levels
| Level | Types | When to Use |
|---|---|---|
| High | Capture, Injector |
Simple capture/inject with iterators and builders |
| Low | AfPacketRx, AfPacketTx |
Batch processing, sequence tracking, custom poll logic |
| AF_XDP | XdpSocket, XdpSocketBuilder |
Kernel-bypass via AF_XDP (feature: af-xdp) |
| Async | AsyncCapture, ChannelCapture |
Integration with tokio or any async runtime |
Default Configuration
| Parameter | Default | Description |
|---|---|---|
block_size |
4 MiB | Ring buffer block size |
block_count |
64 | Number of blocks (256 MiB total) |
frame_size |
2048 | Minimum frame size |
block_timeout_ms |
60 | Block retirement timeout |
fill_rxhash |
true | Kernel fills RX flow hash |
Performance Tuning
| Profile | block_size | block_count | timeout_ms | Notes |
|---|---|---|---|---|
| High throughput | 4 MiB | 128–256 | 60 | + FanoutMode::Cpu + thread pinning |
| Low latency | 256 KiB | 64 | 1–10 | + busy_poll_us(50) |
| Memory-constrained | 1 MiB | 16 | 100 | 16 MiB total ring |
| Jumbo frames | 4 MiB | 64 | 60 | frame_size(65536) |
See docs/TUNING_GUIDE.md for detailed tuning advice.
Fanout Modes
Distribute packets across multiple sockets for multi-threaded capture:
| Mode | Strategy |
|---|---|
Hash |
Flow hash (same flow → same socket) |
Cpu |
Route to CPU that received the NIC interrupt |
LoadBalance |
Round-robin |
Rollover |
Fill one socket, overflow to next |
Random |
Random distribution |
QueueMapping |
NIC hardware queue mapping |
use ;
let cap = builder
.interface
.fanout
.fanout_flags
.build
.unwrap;
Statistics
# let cap = new.unwrap;
let stats = cap.stats.unwrap;
println!;
Reading stats resets the kernel counters — call periodically for rate calculation.
System Requirements
- Linux kernel 3.2+ (for TPACKET_V3), 5.4+ (for AF_XDP)
- Rust 1.85+ (edition 2024)
Capabilities
| Capability | Required For |
|---|---|
CAP_NET_RAW |
Creating AF_PACKET / AF_XDP sockets |
CAP_IPC_LOCK |
MAP_LOCKED (or sufficient RLIMIT_MEMLOCK) |
CAP_NET_ADMIN |
Promiscuous mode |
# Recommended: use justfile (sudo only once for setcap)
# Manual alternative
Examples
Documentation
- Architecture — system design, lifetime model, ring layout
- API Overview — all types, methods, and configuration
- Tuning Guide — performance profiles, system tuning, monitoring
- Troubleshooting — common errors and fixes
License
Licensed under either of Apache License, Version 2.0 or MIT License at your option.