{"record":{"id":"ab20239a1b50b6e0","repo":"slackhq/nebula","slug":"failed-to-create-route-routemessage-w-ab2023","errorCode":null,"errorMessage":"failed to create route.RouteMessage: %w","messagePattern":"failed to create route\\.RouteMessage: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"overlay/tun_freebsd.go","lineNumber":644,"sourceCode":"\t}\n\n\tif prefix.Addr().Is4() {\n\t\troute.Addrs = []netroute.Addr{\n\t\t\tunix.RTAX_DST:     &netroute.Inet4Addr{IP: prefix.Masked().Addr().As4()},\n\t\t\tunix.RTAX_NETMASK: &netroute.Inet4Addr{IP: prefixToMask(prefix).As4()},\n\t\t\tunix.RTAX_GATEWAY: gateway,\n\t\t}\n\t} else {\n\t\troute.Addrs = []netroute.Addr{\n\t\t\tunix.RTAX_DST:     &netroute.Inet6Addr{IP: prefix.Masked().Addr().As16()},\n\t\t\tunix.RTAX_NETMASK: &netroute.Inet6Addr{IP: prefixToMask(prefix).As16()},\n\t\t\tunix.RTAX_GATEWAY: gateway,\n\t\t}\n\t}\n\n\tdata, err := route.Marshal()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create route.RouteMessage: %w\", err)\n\t}\n\n\t_, err = unix.Write(sock, data[:])\n\tif err != nil {\n\t\tif errors.Is(err, unix.EEXIST) {\n\t\t\t// Try to do a change\n\t\t\troute.Type = unix.RTM_CHANGE\n\t\t\tdata, err = route.Marshal()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to create route.RouteMessage for change: %w\", err)\n\t\t\t}\n\t\t\t_, err = unix.Write(sock, data[:])\n\t\t\treturn err\n\t\t}\n\t\treturn fmt.Errorf(\"failed to write route.RouteMessage to socket: %w\", err)\n\t}\n\n\treturn nil","sourceCodeStart":626,"sourceCodeEnd":662,"githubUrl":"https://github.com/slackhq/nebula/blob/dd8f660c0ac37903ec4080ca4d3c861ba9342ceb/overlay/tun_freebsd.go#L626-L662","documentation":"After building a netroute.RouteMessage for the RTM_ADD request, addRoute calls route.Marshal() to serialize it into the wire format for the routing socket. A Marshal failure (e.g. invalid/nil addrs for the message type, or malformed gateway) is wrapped in this error. The library treats serialization failure as fatal for that route since the kernel request cannot even be formed.","triggerScenarios":"route.Marshal() returns an error in addRoute — happens when the RouteMessage has an invalid Addrs bitmap/attachment, e.g. a nil or zero-value gateway netroute.Addr for the RTAX_GATEWAY slot, or incompatible RTM flags on the FreeBSD version.","commonSituations":"Route targets without a resolvable gateway (empty netroute.Addr); adding a default route with a gateway that failed DNS/link resolution; netroute library version incompatibility with the FreeBSD kernel's route message expectations; wrong prefix/bits producing an inconsistent Addrs map.","solutions":["Verify the gateway netroute.Addr is non-empty and resolved before calling addRoute","Log the prefix and gateway with the wrapped error to identify which route message fails to serialize","Update the vendored netroute/x/sys packages if the kernel expects newer route message formats","Skip-and-continue on Marshal failure in addRoutes so one bad route doesn't abort all route setup"],"exampleFix":"// before\ndata, err := route.Marshal()\nif err != nil {\n    return fmt.Errorf(\"failed to create route.RouteMessage: %w\", err)\n}\n// after (guard the gateway before building the message)\nif gateway.IsZero() || !prefix.IsValid() {\n    return fmt.Errorf(\"skipping route %s: invalid gateway %v\", prefix, gateway)\n}\ndata, err := route.Marshal()\nif err != nil {\n    return fmt.Errorf(\"failed to create route.RouteMessage for %s via %v: %w\", prefix, gateway, err)\n}","handlingStrategy":"validation","validationCode":"if !prefix.IsValid() {\n    return fmt.Errorf(\"cannot add route: invalid prefix %v\", prefix)\n}\nif gateway.IsZero() {\n    return fmt.Errorf(\"cannot add route %v: gateway not resolved\", prefix)\n}","typeGuard":"func hasGateway(gw netroute.Addr) bool { return !gw.IsZero() }","tryCatchPattern":"if err := addRoute(prefix, gw); err != nil {\n    if strings.Contains(err.Error(), \"failed to create route.RouteMessage\") {\n        log.Warn(\"skipping unserializable route\", \"prefix\", prefix, \"gateway\", gw, \"err\", err)\n        return nil // skip-and-continue in addRoutes loop\n    }\n    return err\n}","preventionTips":["Resolve the gateway to a concrete netroute.Addr before building the RouteMessage","Validate the prefix is non-zero before route construction","Keep x/sys and netroute vendored versions current for the target FreeBSD release","Treat single-route Marshal failures as skippable so other routes still install"],"tags":["freebsd","routing","route-message","serialization","network"],"backgroundTag":"route-message-marshal-failed","analyzedSha":"dd8f660c0ac37903ec4080ca4d3c861ba9342ceb","analyzedAt":"2026-09-03T11:13:55.444Z","contentChangedAt":"2026-09-03T11:13:55.444Z","schemaVersion":2},"datasetVersion":"2026-09-10T17:17:09.494Z"}