|
|
|
|
@ -491,15 +491,9 @@ func NewConn(opts Options) (*Conn, error) { |
|
|
|
|
c.connCtx, c.connCtxCancel = context.WithCancel(context.Background()) |
|
|
|
|
c.donec = c.connCtx.Done() |
|
|
|
|
c.netChecker = &netcheck.Client{ |
|
|
|
|
Logf: logger.WithPrefix(c.logf, "netcheck: "), |
|
|
|
|
NetMon: c.netMon, |
|
|
|
|
SendPacket: func(b []byte, ap netip.AddrPort) (int, error) { |
|
|
|
|
ok, err := c.sendUDP(ap, b) |
|
|
|
|
if !ok { |
|
|
|
|
return 0, err |
|
|
|
|
} |
|
|
|
|
return len(b), err |
|
|
|
|
}, |
|
|
|
|
Logf: logger.WithPrefix(c.logf, "netcheck: "), |
|
|
|
|
NetMon: c.netMon, |
|
|
|
|
SendPacket: c.sendUDPNetcheck, |
|
|
|
|
SkipExternalNetwork: inTest(), |
|
|
|
|
PortMapper: c.portMapper, |
|
|
|
|
UseDNSCache: true, |
|
|
|
|
@ -582,7 +576,7 @@ func (c *Conn) updateEndpoints(why string) { |
|
|
|
|
c.muCond.Broadcast() |
|
|
|
|
}() |
|
|
|
|
c.dlogf("[v1] magicsock: starting endpoint update (%s)", why) |
|
|
|
|
if c.noV4Send.Load() && runtime.GOOS != "js" { |
|
|
|
|
if c.noV4Send.Load() && runtime.GOOS != "js" && !c.onlyTCP443.Load() { |
|
|
|
|
c.mu.Lock() |
|
|
|
|
closed := c.closed |
|
|
|
|
c.mu.Unlock() |
|
|
|
|
@ -1175,6 +1169,24 @@ func (c *Conn) maybeRebindOnError(os string, err error) bool { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// sendUDPNetcheck sends b via UDP to addr. It is used exclusively by netcheck.
|
|
|
|
|
// It returns the number of bytes sent along with any error encountered. It
|
|
|
|
|
// returns errors.ErrUnsupported if the client is explicitly configured to only
|
|
|
|
|
// send data over TCP port 443 and/or we're running on wasm.
|
|
|
|
|
func (c *Conn) sendUDPNetcheck(b []byte, addr netip.AddrPort) (int, error) { |
|
|
|
|
if c.onlyTCP443.Load() || runtime.GOOS == "js" { |
|
|
|
|
return 0, errors.ErrUnsupported |
|
|
|
|
} |
|
|
|
|
switch { |
|
|
|
|
case addr.Addr().Is4(): |
|
|
|
|
return c.pconn4.WriteToUDPAddrPort(b, addr) |
|
|
|
|
case addr.Addr().Is6(): |
|
|
|
|
return c.pconn6.WriteToUDPAddrPort(b, addr) |
|
|
|
|
default: |
|
|
|
|
panic("bogus sendUDPNetcheck addr type") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// sendUDP sends UDP packet b to addr.
|
|
|
|
|
// See sendAddr's docs on the return value meanings.
|
|
|
|
|
func (c *Conn) sendUDPStd(addr netip.AddrPort, b []byte) (sent bool, err error) { |
|
|
|
|
|