From e22a9f5909a8a8e5e3a379091a2cfecdc3fe0709 Mon Sep 17 00:00:00 2001 From: Nick Khyl Date: Thu, 19 Feb 2026 08:22:57 -0600 Subject: [PATCH] net/rioconn: add PacketListener In this commit, add PacketListener, a nettype.PacketListener whose ListenPacket method returns a RIO-based UDPConn. Updates tailscale/corp#8610 Signed-off-by: Nick Khyl --- net/rioconn/packet_listener.go | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 net/rioconn/packet_listener.go diff --git a/net/rioconn/packet_listener.go b/net/rioconn/packet_listener.go new file mode 100644 index 000000000..268f08f9b --- /dev/null +++ b/net/rioconn/packet_listener.go @@ -0,0 +1,38 @@ +// Copyright (c) Tailscale Inc & contributors +// SPDX-License-Identifier: BSD-3-Clause + +//go:build windows + +package rioconn + +import ( + "context" + "net" + + "tailscale.com/types/nettype" +) + +// NewPacketListener returns a packet listener that uses Registered Input/Output (RIO) +// API Extensions, if available, to provide high-performance UDP networking on Windows. +// The specified options are applied to all connections created by the listener. +// If RIO is not available, it returns an [ErrRIOUnavailable]. +func NewPacketListener(options ...UDPOption) (nettype.PacketListener, error) { + if err := Initialize(); err != nil { + return nil, err + } + return &PacketListener{options: options}, nil +} + +// PacketListener is a [nettype.PacketListener] that uses RIO. +type PacketListener struct { + options []UDPOption +} + +// ListenPacket implements [nettype.PacketListener.ListenPacket]. +func (pl *PacketListener) ListenPacket(ctx context.Context, network, address string) (net.PacketConn, error) { + addr, err := net.ResolveUDPAddr(network, address) + if err != nil { + return nil, &net.OpError{Op: "listen", Net: network, Err: err} + } + return ListenUDP(network, addr, pl.options...) +}