LibreQoS lqos_sys eBPF Workflow
Use this skill for lqos_sys BPF/FFI work.
Scope
- Source of truth lives under
src/rust/lqos_sys/. - eBPF/C code lives under
src/rust/lqos_sys/src/bpf/. - Rust includes generated bindings from
OUT_DIR; do not edit generated artifacts directly.
Build Pipeline
build.rs orchestrates this pipeline:
- Compile
src/bpf/lqos_kern.cto LLVM IR withclang - Convert LLVM IR to a BPF object with
llc - Generate
lqos_kern_skel.hwithbpftool gen skeleton - Compile
src/bpf/wrapper.c - Archive the wrapper into a small static library
- Run
bindgenonwrapper.h - Include generated bindings from
OUT_DIR/bindings.rs
When changing any part of that chain, treat the whole chain as one linked surface.
High-Risk Changes
- BPF map key/value structs
- Shared constants such as sizing limits
wrapper.h/wrapper.cfunction signatures- Skeleton-exposed program or map names
- Pinned-map ABI expectations in
lqos_kernel.rs
Required Checklist
- Edit only source files under
src/rust/lqos_sys/. - If a BPF-side struct changes, update the Rust mirror type in the same change.
- Update or preserve size assertions for Rust mirror types.
- Review pinned-map ABI cleanup in
src/rust/lqos_sys/src/lqos_kernel.rs. - Run
cargo check -p lqos_sys. - Run relevant tests for touched Rust mirror types and map readers.
- If runtime attach/detach behavior changed, state clearly whether live root validation was performed.
- After any repo change, invoke
hecklervia$libreqos-review-subagents-workflowbefore returning to the user. - After each source-code implementation batch, also invoke
reapervia$libreqos-review-subagents-workflow.
Mirror Types To Check
src/rust/lqos_sys/src/throughput.rssrc/rust/lqos_sys/src/flowbee_data.rssrc/rust/lqos_sys/src/ip_mapping/ip_hash_data.rssrc/rust/lqos_sys/src/ip_mapping/ip_hash_key.rs
Safety Rules
- Do not edit
OUT_DIRfiles. - Do not assume a Rust-only change is safe if it reads a BPF map with a mirrored struct layout.
- Do not run live XDP/TC attach-detach or pinned-map cleanup without explicit user approval; this can disrupt networking on the host.
- Be careful with verifier-sensitive patterns in BPF code: bounds checks, scratch maps for large structs, and hot-path allocation avoidance are intentional.
Common Failure Modes
clang,llc, orbpftoolmissing from the host- Skeleton generation succeeding but wrapper/bindgen drifting
- Rust mirror struct sizes no longer matching BPF-side layouts
- Stale pinned maps silently reusing an incompatible ABI
Notes
build.rstreats stderr fromclangandllcas fatal.- Pinned map compatibility cleanup already exists for several maps in
lqos_kernel.rs; extend it when introducing new ABI-sensitive pinned maps.