Most writing about DPDK and VPP stays comfortably abstract. Libraries and drivers for fast packet processing. Kernel bypass. Zero-copy I/O. Poll-mode drivers. The concepts are well-documented. What's harder to find is an account of what happens when you actually build something with them — the architectural decisions, the dead ends, and what the profiler tells you when you think you're done.

This post is that account.

We needed a User Plane Function (UPF) for a 5G core built on Open5GS. The baseline implementation used a socket-based forwarding path. Under sustained load on a 10G link, it peaked at around 850 Mbps — roughly 8.5% of line rate. The hardware was not the constraint. The path the packets took through the kernel was.

The goal was to get as close to line rate as the hardware would allow, in software, on commodity x86, integrated with Open5GS's SMF via PFCP. No FPGAs. No SmartNICs. No proprietary ASICs.

We got to 8.5–9 Gbps.