Architecture

Inside the forwarder.

LLMX/router is composed of a small set of long-lived subsystems, each with a sharply scoped responsibility. The data path stays in DOCA; everything else orchestrates it.

DOCA Flow pipeline

DOCA Flow pipeline diagram showing INGRESS, LPM, MAC, and EGRESS stages
stage 1
INGRESS
Inbound parse, validate, dispatch.
stage 2
LPM
IPv6 longest-prefix-match forwarding table.
stage 3
MAC
Source/destination MAC resolution.
stage 4
EGRESS
Outbound classification and rewrite.

Subsystems

Router
Central orchestrator
Owns capabilities, mempool, ports, the flow pipeline, netlink and gRPC. Sequences startup and lifetime.
FlowPipeLine
DOCA Flow builder
Constructs and installs pipes (EGRESS, MAC, LPM, INGRESS) before declaring itself running.
Netlink
Control plane
Address, neighbor and route events update tables and enqueue work onto the pipeline (IPv6 only).
gRPC
Async API surface
Health, hugepage stats, control-plane and flow state — see proto/llmx_service.proto.

Startup sequence

main Router::init_* → init_flow → start_flow → start_netlink → start_grpc → IoPool::run()

Operational notes

  • Initialize DPDK before DOCA — use DpdkInit then DocaInit.
  • Port 0 is the kernel-facing root representor and must be present.
  • Pipeline only processes IPv6 (AF_INET6). IPv4 events are ignored.
  • gRPC pipeline RPCs return FAILED_PRECONDITION until start_flow runs.
  • Use ScopeGuard for reliable cleanup during initialization.