| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build go1.21 && (quicbasicnet || !(darwin || linux)) |
| |
| package quic |
| |
| import ( |
| "net" |
| "net/netip" |
| ) |
| |
| // Lowest common denominator network interface: Basic net.UDPConn, no cmsgs. |
| // We will not be able to send or receive ECN bits, |
| // and we will not know what our local address is. |
| // |
| // The quicbasicnet build tag allows selecting this interface on any platform. |
| |
| // See udp.go. |
| const ( |
| udpECNSupport = false |
| udpInvalidLocalAddrIsError = false |
| ) |
| |
| type netUDPConn struct { |
| c *net.UDPConn |
| } |
| |
| func newNetUDPConn(uc *net.UDPConn) (*netUDPConn, error) { |
| return &netUDPConn{ |
| c: uc, |
| }, nil |
| } |
| |
| func (c *netUDPConn) Close() error { return c.c.Close() } |
| |
| func (c *netUDPConn) LocalAddr() netip.AddrPort { |
| a, _ := c.c.LocalAddr().(*net.UDPAddr) |
| return a.AddrPort() |
| } |
| |
| func (c *netUDPConn) Read(f func(*datagram)) { |
| for { |
| dgram := newDatagram() |
| n, _, _, peerAddr, err := c.c.ReadMsgUDPAddrPort(dgram.b, nil) |
| if err != nil { |
| return |
| } |
| if n == 0 { |
| continue |
| } |
| dgram.peerAddr = unmapAddrPort(peerAddr) |
| dgram.b = dgram.b[:n] |
| f(dgram) |
| } |
| } |
| |
| func (c *netUDPConn) Write(dgram datagram) error { |
| _, err := c.c.WriteToUDPAddrPort(dgram.b, dgram.peerAddr) |
| return err |
| } |