tailscale/tailscale · error
decode mask: %v
Error message
decode mask: %v
What it means
createDropOutgoingPacketFromCGNATRangeRuleWithTunname failed to hex-decode the parsed network mask into raw bytes for the nftables payload expression. This indicates the parsed mask string was not valid hex — an internal encoding problem, not a user-input error.
Source
Thrown at util/linuxfw/nftables_runner.go:1407
_ = c.AddRule(rule)
if err := c.Flush(); err != nil {
return fmt.Errorf("add rule: %w", err)
}
return nil
}
// createDropOutgoingPacketFromCGNATRangeRuleWithTunname creates a rule to drop
// outgoing packets from the CGNAT range.
func createDropOutgoingPacketFromCGNATRangeRuleWithTunname(table *nftables.Table, chain *nftables.Chain, tunname string) (*nftables.Rule, error) {
_, ipNet, err := net.ParseCIDR(tsaddr.CGNATRange().String())
if err != nil {
return nil, fmt.Errorf("parse cidr: %v", err)
}
mask, err := hex.DecodeString(ipNet.Mask.String())
if err != nil {
return nil, fmt.Errorf("decode mask: %v", err)
}
netip := ipNet.IP.Mask(ipNet.Mask).To4()
saddrExpr, err := newLoadSaddrExpr(nftables.TableFamilyIPv4, 1)
if err != nil {
return nil, fmt.Errorf("newLoadSaddrExpr: %v", err)
}
rule := &nftables.Rule{
Table: table,
Chain: chain,
Exprs: []expr.Any{
&expr.Meta{Key: expr.MetaKeyOIFNAME, Register: 1},
&expr.Cmp{
Op: expr.CmpOpEq,
Register: 1,
Data: []byte(tunname),
},
saddrExpr,
&expr.Bitwise{View on GitHub (pinned to 6e0912f979)
Solutions
- Inspect the mask produced by net.ParseCIDR for the given range.
- Verify the range uses a standard IPv4 mask; non-standard masks may not decode.
- Fix the range definition if it was customized.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at util/linuxfw/nftables_runner.go:1407 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/e02169e7bedd2620.
Report an issue: GitHub.