bpftool-net(8)
π bpftool-net(8) β the "what's attached to my network stuff" manual π
okay bestie, this is the page for bpftool-net, straight out of the System Manager's Manual. It's the tool for inspection of networking related bpf prog attachments. Yes. That's the whole vibe. Let's go π¦
β¨ NAME β¨
bpftool-net β tool for inspection of networking related bpf prog attachments
π SYNOPSIS π
bpftool [OPTIONS] net COMMAND
OPTIONS := { { -j | --json } [{ -p | --pretty }] | { -d | --debug } }
COMMANDS := { show | list | attach | detach | help }
πΈ NET COMMANDS πΈ
bpftool net { show | list } [ dev NAME ]
bpftool net attach ATTACH_TYPE PROG dev NAME [ overwrite | prepend ]
bpftool net detach ATTACH_TYPE dev NAME
bpftool net help
PROG := { id PROG_ID | pinned FILE | tag PROG_TAG | name PROG_NAME }
ATTACH_TYPE := { xdp | xdpgeneric | xdpdrv | xdpoffload | tcx_ingress | tcx_egress }
π DESCRIPTION π
bpftool net { show | list } [ dev NAME ]
This one lists bpf program attachments in the kernel networking subsystem. it's giving inventory check π
So like, right now (as in: in this version) the implemented things are device driver xdp attachments, tcx, netkit and old-style tc classifier/action attachments, flow_dissector as well as netfilter attachments β aka these program types:
BPF_PROG_TYPE_XDPBPF_PROG_TYPE_SCHED_CLSBPF_PROG_TYPE_SCHED_ACTBPF_PROG_TYPE_FLOW_DISSECTORBPF_PROG_TYPE_NETFILTER
Now for programs attached to a particular cgroup β you know, BPF_PROG_TYPE_CGROUP_SKB, BPF_PROG_TYPE_CGROUP_SOCK, BPF_PROG_TYPE_SOCK_OPS and BPF_PROG_TYPE_CGROUP_SOCK_ADDR β you're gonna want bpftool cgroup to dump cgroup attachments instead. And for sk_{filter, skb, msg, reuseport} and lwt/seg6 bpf programs, bestie, go consult other tools, e.g., iproute2. Not this one's job π«Ά
The current output order is a whole storyline, keep up:
- all xdp program attachments first,
- then all tcx,
- then netkit,
- then tc class/qdisc bpf program attachments,
- then flow_dissector,
- and finally netfilter programs.
Both xdp programs and tcx/netkit/tc programs are ordered based on ifindex number. And if multiple bpf programs are attached to the same networking device through tc, the order goes like this: first all bpf programs attached to tcx, then netkit, then tc classes, then all bpf programs attached to non clsact qdiscs, and finally all bpf programs attached to root and clsact qdisc. periodt π
bpftool net attach ATTACH_TYPE PROG dev NAME [ overwrite | prepend ]
Attach bpf program PROG to network interface NAME with type specified by ATTACH_TYPE. slay, you're pinning a program to a NIC π«
ATTACH_TYPE can be one of these beauties:
xdpβ try native XDP and fallback to generic XDP if NIC driver does not support itxdpgenericβ Generic XDP. runs at generic XDP hook when packet already enters receive path as skbxdpdrvβ Native XDP. runs earliest point in driver's receive pathxdpoffloadβ Offload XDP. runs directly on NIC on each packet receptiontcx_ingressβ Ingress TCX. runs on ingress net traffictcx_egressβ Egress TCX. runs on egress net traffic
For the XDP-related attach types (xdp, xdpgeneric, xdpdrv, xdpoffload), the overwrite option can be used to replace a previously attached bpf program. Out with the old π
For the tcx_ingress and tcx_egress attach types, the prepend option can be used to attach the program at the beginning of the chain instead of at the end. front of the line energy, literally π
bpftool net detach ATTACH_TYPE dev NAME
Detach bpf program attached to network interface NAME with type specified by ATTACH_TYPE. And listen: to detach a bpf program, the same ATTACH_TYPE previously used for attach must be specified. no switching up on it, fr fr π
bpftool net help
Print short help message. cute and quick π
β OPTIONS β
-h,--helpβ Print short help message (similar tobpftool help).-V,--versionβ Print bpftool's version number (similar tobpftool version), the number of the libbpf version in use, and optional features that were included when bpftool was compiled. Those optional features include linking against LLVM or libbfd to provide the disassembler for JIT-ted programs (bpftool prog dump jited) and usage of BPF skeletons (some features likebpftool prog profileor showing pids associated to BPF objects may rely on it).-j,--jsonβ Generate JSON output. For commands that cannot produce JSON, this option has no effect. (iykyk, sometimes there's just no JSON to give π)-p,--prettyβ Generate human-readable JSON output. Implies-j.-d,--debugβ Print all logs available, even debug-level information. This includes logs from libbpf as well as from the verifier, when attempting to load programs. maximum tea, all of it βπ₯
π₯ EXAMPLES π₯
The classic. Just run it:
# bpftool net
xdp:
eth0(2) driver id 198
tc:
eth0(2) htb name prefix_matcher.o:[cls_prefix_matcher_htb] id 111727 act []
eth0(2) clsact/ingress fbflow_icmp id 130246 act []
eth0(2) clsact/egress prefix_matcher.o:[cls_prefix_matcher_clsact] id 111726
eth0(2) clsact/egress cls_fg_dscp id 108619 act []
eth0(2) clsact/egress fbflow_egress id 130245
Now with JSON, pretty-printed:
# bpftool -jp net
[{
"xdp": [{
"devname": "eth0",
"ifindex": 2,
"mode": "driver",
"id": 198
}
],
"tc": [{
"devname": "eth0",
"ifindex": 2,
"kind": "htb",
"name": "prefix_matcher.o:[cls_prefix_matcher_htb]",
"id": 111727,
"act": []
},{
"devname": "eth0",
"ifindex": 2,
"kind": "clsact/ingress",
"name": "fbflow_icmp",
"id": 130246,
"act": []
},{
"devname": "eth0",
"ifindex": 2,
"kind": "clsact/egress",
"name": "prefix_matcher.o:[cls_prefix_matcher_clsact]",
"id": 111726,
},{
"devname": "eth0",
"ifindex": 2,
"kind": "clsact/egress",
"name": "cls_fg_dscp",
"id": 108619,
"act": []
},{
"devname": "eth0",
"ifindex": 2,
"kind": "clsact/egress",
"name": "fbflow_egress",
"id": 130245,
}
]
}
]
Attach a xdpdrv program, then peep the result:
# bpftool net attach xdpdrv id 16 dev enp6s0np0
# bpftool net
xdp:
enp6s0np0(4) driver id 16
Attach, then attach again with overwrite (the glow-up from id 16 to id 20):
# bpftool net attach xdpdrv id 16 dev enp6s0np0
# bpftool net attach xdpdrv id 20 dev enp6s0np0 overwrite
# bpftool net
xdp:
enp6s0np0(4) driver id 20
Attach, detach, and suddenly: nothing. empty. the xdp section is a ghost town π
# bpftool net attach xdpdrv id 16 dev enp6s0np0
# bpftool net detach xdpdrv dev enp6s0np0
# bpftool net
xdp:
TCX ingress by name on lo:
# bpftool net attach tcx_ingress name tc_prog dev lo
# bpftool net
tc:
lo(1) tcx/ingress tc_prog prog_id 29
And with prepend, the new one jumps to the front of the chain. main character energy π
# bpftool net attach tcx_ingress name tc_prog2 dev lo prepend
# bpftool net
tc:
lo(1) tcx/ingress tc_prog2 prog_id 30
lo(1) tcx/ingress tc_prog prog_id 29
And clean up after yourself, bestie:
# bpftool net attach tcx_ingress name tc_prog dev lo
# bpftool net detach tcx_ingress dev lo
# bpftool net
tc:
π¦ SEE ALSO π¦
bpf(2), bpf-helpers(7), bpftool(8), bpftool-btf(8), bpftool-cgroup(8), bpftool-feature(8), bpftool-gen(8), bpftool-iter(8), bpftool-link(8), bpftool-map(8), bpftool-perf(8), bpftool-prog(8), bpftool-struct_ops(8), bpftool-token(8)
okay that's the whole page bestie, you ate π this came from the System Manager's Manual, page bpftool-net(8) β go forth and inspect those attachments πΈβ¨
π¦ where this page comes from
- arch rolling: bpf 7.3.1-1 Β· GPL-2.0-only
- ubuntu stonking: bpftool 7.8.0+7.3.0-10.10
- ubuntu stonking: bpftool 7.8.0+7.3.0-9.9
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms