{"record":{"id":"dd07af0734910f50","repo":"slackhq/nebula","slug":"multiple-udp-listeners-not-supported-on-windows","errorCode":null,"errorMessage":"multiple udp listeners not supported on windows","messagePattern":"multiple udp listeners not supported on windows","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"udp/udp_windows.go","lineNumber":18,"sourceCode":"//go:build !e2e_testing\n// +build !e2e_testing\n\npackage udp\n\nimport (\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"syscall\"\n)\n\nfunc NewListener(l *slog.Logger, s Settings) (Conn, error) {\n\tif s.Multi {\n\t\t//NOTE: Technically we can support it with RIO but it wouldn't be at the socket level\n\t\t// The udp stack would need to be reworked to hide away the implementation differences between\n\t\t// Windows and Linux\n\t\treturn nil, fmt.Errorf(\"multiple udp listeners not supported on windows\")\n\t}\n\n\tvar conn Conn\n\trc, err := NewRIOListener(l, s.Listen.Addr(), int(s.Listen.Port()))\n\tif err == nil {\n\t\tconn = rc\n\t} else {\n\t\tl.Error(\"Falling back to standard udp sockets\", \"error\", err)\n\t\tconn, err = NewGenericListener(l, s)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn wrapWithWDFBypass(l, conn), nil\n}\n\nfunc NewListenConfig(multi bool) net.ListenConfig {\n\treturn net.ListenConfig{","sourceCodeStart":1,"sourceCodeEnd":36,"githubUrl":"https://github.com/slackhq/nebula/blob/dd8f660c0ac37903ec4080ca4d3c861ba9342ceb/udp/udp_windows.go#L1-L36","documentation":"This is a hard capability limitation of the library's Windows UDP stack: requesting a multi-device/multi-listener (Settings.Multi) UDP connection on Windows returns this error because multiple UDP listeners are not supported there. The Windows implementation uses RIO sockets, which cannot provide socket-level multi-listener semantics; only the Linux implementation supports Multi.","triggerScenarios":"Calling udp.NewListener with Settings{Multi: true} on Windows - e.g. starting nebula with multiple listeners configured (listen.multiple = true) on a Windows host.","commonSituations":"Users porting a Linux config (where 'multiple: true' works) to Windows; running an instance that must coexist with another on the same port via SO_REUSEADDR-style semantics.","solutions":["Set listen.multiple to false (or omit it) in the config when running on Windows.","If multiple listeners are required, run on Linux where the feature is supported.","Restructure the deployment to use a single listener/port on Windows."],"exampleFix":"// before (nebula config, on Windows)\nlisten:\n  port: 4242\n  multiple: true\n// after\nlisten:\n  port: 4242\n  multiple: false","handlingStrategy":"validation","validationCode":"if runtime.GOOS == \"windows\" && settings.Multi {\n\treturn errors.New(\"config error: listen.multiple is not supported on windows; disable it or run on linux\")\n}\nconn, err := udp.NewListener(logger, settings)","typeGuard":"func multiUnsupportedOnWindows(s udp.Settings) bool { return runtime.GOOS == \"windows\" && s.Multi }","tryCatchPattern":"conn, err := udp.NewListener(logger, settings)\nif err != nil && errors.Is(err, errMultiUnsupported) {\n\t// fall back to single-listener mode automatically\n}","preventionTips":["Never enable listen.multiple in Windows deployments.","Validate configs per-OS before rollout (config lint step).","Document platform differences in deployment runbooks.","If port sharing is required, schedule those workloads on Linux."],"tags":["windows","udp","unsupported-feature","configuration"],"backgroundTag":"unsupported-platform-feature","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"}