Idle path
One load, then pass
If cfg.armed == 0, XDP does not parse Ethernet, does not LPM, and does not touch host or remote maps. Only metrics.rx_*, then XDP_PASS.
XDP · multi-layer shield · idle until the NIC is on fire
A multi-layer XDP shield for a single Linux VM. Silent unless the instance is under attack. Packets stay in the kernel: XDP_PASS or XDP_DROP. IPv4 and IPv6 together.
On-page visualization of voidgate.bpf.c. Not live telemetry. Keys: I idle, A active.
Idle path
If cfg.armed == 0, XDP does not parse Ethernet, does not LPM, and does not touch host or remote maps. Only metrics.rx_*, then XDP_PASS.
Stay attached
XDP stays on the NIC in IDLE. cfg.armed = 1 turns the gate on. Detach only on process exit — not every quiet cycle.
Split brain
Thresholds live in the control plane. The BPF program only looks prefixes up. Default verdict on a shared NIC is XDP_PASS.
One program, stacked. Watch first. Keep the VM reachable. Cut attacker hosts. Widen the prefix when the cluster is dense.
IDLE. XDP stays attached. Only rx_*, then XDP_PASS — no parse, no LPM. Arm on wake_pps / wake_mbps, or with voidgatectl arm.
Never drop the VM. Allow CIDRs, TCP allow_ports on the local side, DHCP 67/68 and 546/547, IPv6 NDP 133–137, fe80::/10, ff02::/16.
Drop LPM. Policy inserts a remote over threshold as /32 or /128. voidgatectl drop is the same layer, and does not auto-expire.
When aggregate_k dropped hosts sit in one /24 or /64, install that prefix. Policy and aggregate expire with ban_time.
XDP attached. Coarse rx counters only. Userspace polls wake_pps / wake_mbps.
voidgatectl arm forces ACTIVEParse IPv4/IPv6. Whitelist. Drop LPM. Count local hosts and remote sources.
/32 or /128/24 or /64voidgatectl disarm flushes drops$ sudo voidgatectl status state=idle armed=0 rx_pps=412 rx_bps=2800000 drops=0 iface=eth0 $ sudo voidgatectl drop 203.0.113.0/24 ok $ sudo voidgatectl status state=active armed=1 rx_pps=184200 rx_bps=980000000 drops=1 iface=eth0 $ sudo voidgatectl disarm ok
One line in, text out: status, stats, drops, arm, disarm, drop <cidr>, undrop <cidr>, reload. Prometheus, if enabled, is 127.0.0.1:9105/metrics.