slackhq/nebula · error

failed to create route.RouteMessage: %w

Error message

failed to create route.RouteMessage: %w

What it means

addRoute() builds a netroute.RouteMessage (RTM_ADD) and calls route.Marshal() to serialize it for the kernel routing socket. This error is returned when Marshal() fails, meaning the route message could not be encoded for the kernel before any bytes are written.

Source

Thrown at overlay/tun_darwin.go:452

	}

	if prefix.Addr().Is4() {
		route.Addrs = []netroute.Addr{
			unix.RTAX_DST:     &netroute.Inet4Addr{IP: prefix.Masked().Addr().As4()},
			unix.RTAX_NETMASK: &netroute.Inet4Addr{IP: prefixToMask(prefix).As4()},
			unix.RTAX_GATEWAY: gateway,
		}
	} else {
		route.Addrs = []netroute.Addr{
			unix.RTAX_DST:     &netroute.Inet6Addr{IP: prefix.Masked().Addr().As16()},
			unix.RTAX_NETMASK: &netroute.Inet6Addr{IP: prefixToMask(prefix).As16()},
			unix.RTAX_GATEWAY: gateway,
		}
	}

	data, err := route.Marshal()
	if err != nil {
		return fmt.Errorf("failed to create route.RouteMessage: %w", err)
	}

	_, err = unix.Write(sock, data[:])
	if err != nil {
		return fmt.Errorf("failed to write route.RouteMessage to socket: %w", err)
	}

	return nil
}

func delRoute(prefix netip.Prefix, gateway netroute.Addr) error {
	sock, err := unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
	if err != nil {
		return fmt.Errorf("unable to create AF_ROUTE socket: %v", err)
	}
	defer unix.Close(sock)

	route := netroute.RouteMessage{

View on GitHub (pinned to dd8f660c0a)

Solutions

  1. Verify the utun interface has a valid link address (the earlier 'unable to discover link_addr for tun interface' error would indicate a deeper device problem).
  2. Check the configured route prefix in the tun.routes section is well-formed (valid IP and mask).
  3. Update the golang.org/x/net dependency and rebuild, since Marshal behavior lives in x/net/route.
  4. Reboot or recreate the tun device if the kernel interface state is stale, then retry activation.

Example fix

// before: malformed route
routes:
  - route: 10.0.0/24
    via: 10.1.1.1
// after
routes:
  - route: 10.0.0.0/24
    via: 10.1.1.1
Defensive patterns

Strategy: validation

Validate before calling

func validateRoute(r Route) error {
    if !r.Route.IsValid() || r.Route.Addr().IsUnspecified() {
        return fmt.Errorf("route prefix invalid: %v", r.Route)
    }
    if r.Via != nil && !r.Via.IsValid() {
        return fmt.Errorf("route via invalid: %v", r.Via)
    }
    return nil
}

Try / catch

if err := iface.Activate(); err != nil {
    if strings.Contains(err.Error(), "failed to create route.RouteMessage") {
        // re-check the tun.routes entries; fix malformed prefixes/gateways
    }
    return err
}

Prevention

When it happens

Trigger: Called from activate4() or addRoutes(); route.Marshal() returns an error, typically because a required route attribute (e.g. the gateway netroute.Addr or destination addresses) is invalid or the message structure is malformed.

Common situations: A link-layer gateway address (netroute.LinkAddr) was not discovered correctly for the utun interface; unusual prefix lengths or zero-valued route fields make the message invalid; upstream x/net/route version incompatibilities.

Related errors


AI-assisted analysis of slackhq/nebula@dd8f660c0a (2026-09-03). Data as JSON: /api/errors/f88f6c779e851009. Report an issue: GitHub.