{"record":{"id":"2019d9668b95e2d9","repo":"tailscale/tailscale","slug":"feature-not-included-in-this-build-2019d9","errorCode":null,"errorMessage":"feature not included in this build","messagePattern":"feature not included in this build","errorType":"http","errorClass":null,"httpStatus":501,"severity":"warning","filePath":"ipn/localapi/localapi.go","lineNumber":825,"sourceCode":"\tif !h.PermitRead {\n\t\thttp.Error(w, \"UDP GRO forwarding check access denied\", http.StatusForbidden)\n\t\treturn\n\t}\n\tvar warning string\n\tif err := h.b.CheckUDPGROForwarding(); err != nil {\n\t\twarning = err.Error()\n\t}\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tjson.NewEncoder(w).Encode(struct {\n\t\tWarning string\n\t}{\n\t\tWarning: warning,\n\t})\n}\n\nfunc (h *Handler) serveSetUDPGROForwarding(w http.ResponseWriter, r *http.Request) {\n\tif !buildfeatures.HasGRO {\n\t\thttp.Error(w, feature.ErrUnavailable.Error(), http.StatusNotImplemented)\n\t\treturn\n\t}\n\tif !h.PermitWrite {\n\t\thttp.Error(w, \"UDP GRO forwarding set access denied\", http.StatusForbidden)\n\t\treturn\n\t}\n\tvar warning string\n\tif err := h.b.SetUDPGROForwarding(); err != nil {\n\t\twarning = err.Error()\n\t}\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tjson.NewEncoder(w).Encode(struct {\n\t\tWarning string\n\t}{\n\t\tWarning: warning,\n\t})\n}\n","sourceCodeStart":807,"sourceCodeEnd":843,"githubUrl":"https://github.com/tailscale/tailscale/blob/6e0912f97994f927632b34ae9e63b53d6516a6ac/ipn/localapi/localapi.go#L807-L843","documentation":"Returned by the Tailscale localapi 'set-udp-gro-forwarding' endpoint when the binary was built without the GRO feature (buildfeatures.HasGRO == false), with HTTP 501 Not Implemented and feature.ErrUnavailable's message 'feature not included in this build'. The HasGRO build tag is only set for linux/amd64 and linux/arm64 builds; on all other platforms the endpoint is a stub.","triggerScenarios":"POST /localapi/v0/set-udp-gro-forwarding against a tailscaled built for a GOOS/GOARCH without the GRO tag (e.g. darwin, windows, linux/386, linux/arm), or a custom build that dropped the tag.","commonSituations":"Cross-compiled tailscaled running on an unusual architecture; older or minimal custom builds; clients that unconditionally call set-udp-gro-forwarding because the corresponding check endpoint existed and returned a warning; version drift where the client is newer than the daemon.","solutions":["Treat HTTP 501 as a capability signal: probe and skip the call on platforms that lack GRO support","Use a linux/amd64 or linux/arm64 build of tailscaled if you actually need to enable UDP GRO forwarding","Gate the call on the platform: only invoke it on linux/amd64 and linux/arm64","Update tailscaled to an official build for your platform so feature availability matches the client's expectations"],"exampleFix":"// before\nif err := setUDPGROForwarding(ctx); err != nil { log.Fatal(err) }\n\n// after\nif runtime.GOOS == \"linux\" && (runtime.GOARCH == \"amd64\" || runtime.GOARCH == \"arm64\") {\n    if err := setUDPGROForwarding(ctx); err != nil { log.Fatal(err) }\n}","handlingStrategy":"type-guard","validationCode":"// Probe capability before calling\nif !(runtime.GOOS == \"linux\" && (runtime.GOARCH == \"amd64\" || runtime.GOARCH == \"arm64\")) {\n    return nil // endpoint unsupported here\n}","typeGuard":"func supportsGRO() bool {\n    return runtime.GOOS == \"linux\" && (runtime.GOARCH == \"amd64\" || runtime.GOARCH == \"arm64\")\n}","tryCatchPattern":"if resp.StatusCode == http.StatusNotImplemented {\n    // feature absent in this build; skip silently\n    return nil\n}","preventionTips":["Treat 501 from localapi as a capability probe result, not an error to log loudly","Gate platform-specific sysctl mutations on GOOS/GOARCH","Keep client feature expectations in sync with the tailscaled build in use"],"tags":["tailscale","localapi","http-501","not-implemented","build-tags","udp-gro","feature-flag"],"backgroundTag":"feature-not-in-build","analyzedSha":"6e0912f97994f927632b34ae9e63b53d6516a6ac","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}