mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-26 11:35:35 +00:00
8b11937eaf
This raises the maximum DNS response message size from 512 to 4095. This should be large enough for almost all situations that do not need TCP. We still do not recognize EDNS, so we will still forward requests that claim support for a larger response size than 4095 (that will be solved later). For now, when a response comes back that is too large to fit in our receive buffer, we now set the truncation flag in the DNS header, which is an improvement from before but will prompt attempts to use TCP which isn't supported yet. On Windows, WSARecvFrom into a buffer that's too small returns an error in addition to the data. On other OSes, the extra data is silently discarded. In this case, we prefer the latter so need to catch the error on Windows. Partially addresses #1123 Signed-off-by: Adrian Dewhurst <adrian@tailscale.com>
44 lines
1.4 KiB
Go
44 lines
1.4 KiB
Go
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package resolver
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"os"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
func networkIsDown(err error) bool {
|
|
if oe, ok := err.(*net.OpError); ok && oe.Op == "write" {
|
|
if se, ok := oe.Err.(*os.SyscallError); ok {
|
|
if se.Syscall == "wsasendto" && se.Err == windows.WSAENETUNREACH {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func networkIsUnreachable(err error) bool {
|
|
// TODO(bradfitz,josharian): something here? what is the
|
|
// difference between down and unreachable? Add comments.
|
|
return false
|
|
}
|
|
|
|
// packetWasTruncated returns true if err indicates truncation but the RecvFrom
|
|
// that generated err was otherwise successful. On Windows, Go's UDP RecvFrom
|
|
// calls WSARecvFrom which returns the WSAEMSGSIZE error code when the received
|
|
// datagram is larger than the provided buffer. When that happens, both a valid
|
|
// size and an error are returned (as per the partial fix for golang/go#14074).
|
|
// If the WSAEMSGSIZE error is returned, then we ignore the error to get
|
|
// semantics similar to the POSIX operating systems. One caveat is that it
|
|
// appears that the source address is not returned when WSAEMSGSIZE occurs, but
|
|
// we do not currently look at the source address.
|
|
func packetWasTruncated(err error) bool {
|
|
return errors.Is(err, windows.WSAEMSGSIZE)
|
|
}
|