tailscale/tailscale · error
installing BPF filter: %w
Error message
installing BPF filter: %w
What it means
The AF_PACKET socket was created but setsockopt(SO_ATTACH_FILTER) failed when attaching the assembled BPF program. Indicates kernel-level rejection of the filter, often due to seccomp/LSM restrictions or an unexpected socket state.
Source
Thrown at wgengine/magicsock/magicsock_linux.go:227
asm, err := bpf.Assemble(prog)
if err != nil {
return nil, fmt.Errorf("assembling filter: %w", err)
}
sock, err := socket.Socket(
unix.AF_PACKET,
unix.SOCK_DGRAM,
proto,
"afpacket",
nil, // no config
)
if err != nil {
return nil, fmt.Errorf("creating AF_PACKET socket: %w", err)
}
if err := sock.SetBPF(asm); err != nil {
sock.Close()
return nil, fmt.Errorf("installing BPF filter: %w", err)
}
// If all the above succeeds, we should be ready to receive. Just
// out of paranoia, check that we do receive a well-formed disco
// packet.
tc, err := net.ListenPacket(udpnet, net.JoinHostPort(addr, "0"))
if err != nil {
sock.Close()
return nil, fmt.Errorf("creating disco test socket: %w", err)
}
defer tc.Close()
if _, err := tc.(*net.UDPConn).WriteToUDPAddrPort(testDiscoPacket, testAddr); err != nil {
sock.Close()
return nil, fmt.Errorf("writing disco test packet: %w", err)
}
const selfTestTimeout = 100 * time.Millisecond
if err := sock.SetReadDeadline(time.Now().Add(selfTestTimeout)); err != nil {View on GitHub (pinned to 6e0912f979)
Solutions
- Check kernel logs for BPF attach failures (e.g. locked-memory limits for classic BPF)
- Relax seccomp/LSM policies that block SO_ATTACH_FILTER
- Fall back to non-raw disco listening
Defensive patterns
Strategy: fallback
When it happens
Trigger: Thrown at wgengine/magicsock/magicsock_linux.go:227 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tailscale/tailscale@6e0912f979 (2026-08-18).
Data as JSON: /api/errors/45078a652bfbf010.
Report an issue: GitHub.