{"record":{"id":"32e201440cddc5a1","repo":"slackhq/nebula","slug":"error-rx-open-w","errorCode":null,"errorMessage":"error rx.Open(): %w","messagePattern":"error rx\\.Open\\(\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"udp/udp_rio_windows.go","lineNumber":122,"sourceCode":"\t\t// This is a best-effort to prevent errors from being returned by the udp recv operation.\n\t\t// Quietly log a failure and continue.\n\t\tl.Debug(\"failed to set UDP_CONNRESET ioctl\", \"error\", err)\n\t}\n\n\tret = 0\n\tflag = 0\n\tsize = uint32(unsafe.Sizeof(flag))\n\tSIO_UDP_NETRESET := uint32(syscall.IOC_IN | syscall.IOC_VENDOR | 15)\n\terr = syscall.WSAIoctl(syscall.Handle(u.sock), SIO_UDP_NETRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)\n\tif err != nil {\n\t\t// This is a best-effort to prevent errors from being returned by the udp recv operation.\n\t\t// Quietly log a failure and continue.\n\t\tl.Debug(\"failed to set UDP_NETRESET ioctl\", \"error\", err)\n\t}\n\n\terr = u.rx.Open()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error rx.Open(): %w\", err)\n\t}\n\n\terr = u.tx.Open()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error tx.Open(): %w\", err)\n\t}\n\n\tu.rq, err = winrio.CreateRequestQueue(u.sock, packetsPerRing, 1, packetsPerRing, 1, u.rx.cq, u.tx.cq, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error CreateRequestQueue: %w\", err)\n\t}\n\n\terr = windows.Bind(u.sock, sa)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error windows.Bind(): %w\", err)\n\t}\n\n\treturn nil","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/slackhq/nebula/blob/dd8f660c0ac37903ec4080ca4d3c861ba9342ceb/udp/udp_rio_windows.go#L104-L140","documentation":"This error wraps the failure of the receive (rx) ring buffer's Open() during RIO (Registered I/O) UDP listener setup on Windows. The rx side allocates the completion queue and receive buffers used by winrio; if that kernel resource setup fails, bind() aborts with the underlying OS error attached via %w. It is thrown by RIOConn.bind, invoked from NewRIOListener.","triggerScenarios":"Calling NewRIOListener (via udp.NewListener) on Windows when u.rx.Open() fails - typically winrio.CreateCompletionQueue or buffer registration returning an OS error (e.g. out of non-paged pool, insufficient privileges, or winsock RIO not initialized for the process).","commonSituations":"Windows hosts with resource exhaustion (non-paged pool depleted by many RIO sockets), running on Windows versions with incomplete RIO support, firewall/AV software interfering with raw socket setup, or extremely large packetsPerRing settings requiring huge registered buffer allocations.","solutions":["Read the wrapped %w OS error to identify the exact winrio failure (e.g. WSAEINVAL, WSAENOBUFS).","Reduce the packetsPerRing ring size so fewer registered buffers/non-paged pool is needed.","Ensure the process runs on a supported Windows version (Windows 8/Server 2012+) where RIO is fully available.","Retry after freeing memory / closing other RIO sockets if the cause is resource exhaustion."],"exampleFix":"// before\nerr = u.rx.Open()\nif err != nil {\n\treturn fmt.Errorf(\"error rx.Open(): %w\", err)\n}\n// after\nerr = u.rx.Open()\nif err != nil {\n\treturn fmt.Errorf(\"error rx.Open(): %w\", err) // surface as ContextualError with fields {addr, port, side:\"rx\"} for diagnosability\n}","handlingStrategy":"try-catch","validationCode":"if runtime.GOOS != \"windows\" { return errors.New(\"RIO listener only exists on windows\") }\n// verify the listen address is a valid local IP before NewListener\nif net.ParseIP(addr) == nil { return fmt.Errorf(\"invalid listen addr %q\", addr) }","typeGuard":"func isRIOOpenErr(err error) bool { return err != nil && strings.Contains(err.Error(), \"rx.Open()\") }","tryCatchPattern":"conn, err := udp.NewListener(logger, settings)\nif err != nil {\n\tvar ctxErr *util.ContextualError\n\tif errors.As(err, &ctxErr) {\n\t\tlogger.Error(\"udp rx ring open failed\", \"fields\", ctxErr.Fields, \"cause\", ctxErr.Unwrap())\n\t}\n\treturn fmt.Errorf(\"listener setup failed: %w\", err)\n}","preventionTips":["Keep packetsPerRing modest to limit non-paged pool usage on Windows.","Monitor non-paged pool memory on long-running Windows hosts.","Pin to Windows versions with full RIO support (8+/Server 2012+).","Check the wrapped cause with errors.As/Unwrap before deciding to retry."],"tags":["windows","udp","rio","network"],"backgroundTag":"udp-bind-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"}