tsdns: don't forward transient DNS errors
When a DNS server claims to be unable or unwilling to handle a request, instead of passing that refusal along to the client, just treat it as any other error trying to connect to the DNS server. This prevents DNS requests from failing based on if a server can respond with a transient error before another server is able to give an actual response. DNS requests only failing *sometimes* is really hard to find the cause of (#1033). Signed-off-by: Smitty <me@smitop.com>
This commit is contained in:
@ -12,6 +12,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
dns "golang.org/x/net/dns/dnsmessage"
|
||||
"tailscale.com/types/dnstype"
|
||||
)
|
||||
|
||||
@ -97,3 +98,45 @@ func TestResolversWithDelays(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestGetRCode(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
packet []byte
|
||||
want dns.RCode
|
||||
}{
|
||||
{
|
||||
name: "empty",
|
||||
packet: []byte{},
|
||||
want: dns.RCode(5),
|
||||
},
|
||||
{
|
||||
name: "too-short",
|
||||
packet: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
want: dns.RCode(5),
|
||||
},
|
||||
{
|
||||
name: "noerror",
|
||||
packet: []byte{0xC4, 0xFE, 0x81, 0xA0, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01},
|
||||
want: dns.RCode(0),
|
||||
},
|
||||
{
|
||||
name: "refused",
|
||||
packet: []byte{0xee, 0xa1, 0x81, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
|
||||
want: dns.RCode(5),
|
||||
},
|
||||
{
|
||||
name: "nxdomain",
|
||||
packet: []byte{0x34, 0xf4, 0x81, 0x83, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01},
|
||||
want: dns.RCode(3),
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := getRCode(tt.packet)
|
||||
if got != tt.want {
|
||||
t.Errorf("got %d; want %d", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user