wgengine/magicsock: use math/rands/v2

Updates #11058

Co-authored-by: James Tucker <james@tailscale.com>
Signed-off-by: Maisem Ali <maisem@tailscale.com>
pull/12377/head
Maisem Ali 6 months ago committed by Maisem Ali
parent 573c8bd8c7
commit 36e8e8cd64

@ -514,7 +514,6 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
hash from compress/zlib+ hash from compress/zlib+
hash/adler32 from compress/zlib+ hash/adler32 from compress/zlib+
hash/crc32 from compress/gzip+ hash/crc32 from compress/gzip+
hash/fnv from tailscale.com/wgengine/magicsock
hash/maphash from go4.org/mem hash/maphash from go4.org/mem
html from html/template+ html from html/template+
html/template from github.com/gorilla/csrf html/template from github.com/gorilla/csrf

@ -23,6 +23,14 @@ func Shuffle[T any](seed uint64, data []T) {
} }
} }
// IntN is like rand.IntN, but it is seeded on the stack and does not allocate
// or lock any RNG state.
func IntN(seed uint64, n int) int {
var pcg randv2.PCG
pcg.Seed(seed, seed)
return int(uint64n(&pcg, uint64(n)))
}
// Perm is like rand.Perm, but it is seeded on the stack and does not allocate // Perm is like rand.Perm, but it is seeded on the stack and does not allocate
// or lock any RNG state. // or lock any RNG state.
func Perm(seed uint64, n int) []int { func Perm(seed uint64, n int) []int {

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

Loading…
Cancel
Save