From dd31285ad480949cd489a199e4ce066caa2c6bd2 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 20 Mar 2020 13:38:21 -0700 Subject: [PATCH] wgengine/magicsock: send IPv6 using pconn6, if available In prep for IPv6 support. Nothing should make it this far yet. --- wgengine/magicsock/magicsock.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go index 346091467..77b9b8cfa 100644 --- a/wgengine/magicsock/magicsock.go +++ b/wgengine/magicsock/magicsock.go @@ -592,9 +592,7 @@ func (c *Conn) Send(b []byte, ep conn.Endpoint) error { c.logf("[unexpected] DERP BUG: attempting to send packet to DERP address %v", addr) return nil } - // TODO(bradfitz): use pconn6 if non-nil and addr.IP is v6 - _, err := c.pconn4.WriteTo(b, addr) - return err + return c.sendUDP(addr, b) case *AddrSet: as = v } @@ -631,14 +629,25 @@ var errConnClosed = errors.New("Conn closed") var errDropDerpPacket = errors.New("too many DERP packets queued; dropping") +// sendUDP sends UDP packet b to addr. +func (c *Conn) sendUDP(addr *net.UDPAddr, b []byte) error { + if addr.IP.To4() != nil { + _, err := c.pconn4.WriteTo(b, addr) + return err + } + if c.pconn6 != nil { + _, err := c.pconn6.WriteTo(b, addr) + return err + } + return nil // ignore IPv6 dest if we don't have an IPv6 address. +} + // sendAddr sends packet b to addr, which is either a real UDP address // or a fake UDP address representing a DERP server (see derpmap.go). // The provided public key identifies the recipient. func (c *Conn) sendAddr(addr *net.UDPAddr, pubKey key.Public, b []byte) error { if !addr.IP.Equal(derpMagicIP) { - // TODO(bradfitz): use pconn6 if non-nil and addr.IP is v6 - _, err := c.pconn4.WriteTo(b, addr) - return err + return c.sendUDP(addr, b) } ch := c.derpWriteChanOfAddr(addr)