|
|
|
@ -7,8 +7,6 @@ import (
|
|
|
|
|
"bufio"
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
"hash/fnv"
|
|
|
|
|
"math/rand"
|
|
|
|
|
"net"
|
|
|
|
|
"net/netip"
|
|
|
|
|
"reflect"
|
|
|
|
@ -16,6 +14,7 @@ import (
|
|
|
|
|
"sort"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
"unsafe"
|
|
|
|
|
|
|
|
|
|
"github.com/tailscale/wireguard-go/conn"
|
|
|
|
|
"tailscale.com/derp"
|
|
|
|
@ -31,6 +30,7 @@ import (
|
|
|
|
|
"tailscale.com/types/key"
|
|
|
|
|
"tailscale.com/types/logger"
|
|
|
|
|
"tailscale.com/util/mak"
|
|
|
|
|
"tailscale.com/util/rands"
|
|
|
|
|
"tailscale.com/util/sysresources"
|
|
|
|
|
"tailscale.com/util/testenv"
|
|
|
|
|
)
|
|
|
|
@ -94,7 +94,6 @@ type activeDerp struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
processStartUnixNano = time.Now().UnixNano()
|
|
|
|
|
pickDERPFallbackForTests func() int
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@ -136,10 +135,7 @@ func (c *Conn) pickDERPFallback() int {
|
|
|
|
|
return pickDERPFallbackForTests()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: use math/rand/v2 here.
|
|
|
|
|
h := fnv.New64()
|
|
|
|
|
fmt.Fprintf(h, "%p/%d", c, processStartUnixNano) // arbitrary
|
|
|
|
|
return ids[rand.New(rand.NewSource(int64(h.Sum64()))).Intn(len(ids))]
|
|
|
|
|
return ids[rands.IntN(uint64(uintptr(unsafe.Pointer(c))), len(ids))]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This allows existing tests to pass, but allows us to still test the
|
|
|
|
|