device: put AllowedIPs mutex before what it guards, unexport fields

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2025-11-21 09:42:42 -08:00 committed by 世界
parent 6f5e8b1947
commit 70b09a6edd
No known key found for this signature in database
GPG key ID: CD109927C34A63C4

View file

@ -205,14 +205,14 @@ func (node *trieEntry) lookup(ip []byte) *Peer {
} }
type AllowedIPs struct { type AllowedIPs struct {
IPv4 *trieEntry mu sync.RWMutex
IPv6 *trieEntry ipv4 *trieEntry
mutex sync.RWMutex ipv6 *trieEntry
} }
func (table *AllowedIPs) EntriesForPeer(peer *Peer, cb func(prefix netip.Prefix) bool) { func (table *AllowedIPs) EntriesForPeer(peer *Peer, cb func(prefix netip.Prefix) bool) {
table.mutex.RLock() table.mu.RLock()
defer table.mutex.RUnlock() defer table.mu.RUnlock()
for elem := peer.trieEntries.Front(); elem != nil; elem = elem.Next() { for elem := peer.trieEntries.Front(); elem != nil; elem = elem.Next() {
node := elem.Value.(*trieEntry) node := elem.Value.(*trieEntry)
@ -278,8 +278,8 @@ func (table *AllowedIPs) Remove(prefix netip.Prefix, peer *Peer) {
} }
func (table *AllowedIPs) RemoveByPeer(peer *Peer) { func (table *AllowedIPs) RemoveByPeer(peer *Peer) {
table.mutex.Lock() table.mu.Lock()
defer table.mutex.Unlock() defer table.mu.Unlock()
var next *list.Element var next *list.Element
for elem := peer.trieEntries.Front(); elem != nil; elem = next { for elem := peer.trieEntries.Front(); elem != nil; elem = next {
@ -289,28 +289,28 @@ func (table *AllowedIPs) RemoveByPeer(peer *Peer) {
} }
func (table *AllowedIPs) Insert(prefix netip.Prefix, peer *Peer) { func (table *AllowedIPs) Insert(prefix netip.Prefix, peer *Peer) {
table.mutex.Lock() table.mu.Lock()
defer table.mutex.Unlock() defer table.mu.Unlock()
if prefix.Addr().Is6() { if prefix.Addr().Is6() {
ip := prefix.Addr().As16() ip := prefix.Addr().As16()
parentIndirection{&table.IPv6, 2}.insert(ip[:], uint8(prefix.Bits()), peer) parentIndirection{&table.ipv6, 2}.insert(ip[:], uint8(prefix.Bits()), peer)
} else if prefix.Addr().Is4() { } else if prefix.Addr().Is4() {
ip := prefix.Addr().As4() ip := prefix.Addr().As4()
parentIndirection{&table.IPv4, 2}.insert(ip[:], uint8(prefix.Bits()), peer) parentIndirection{&table.ipv4, 2}.insert(ip[:], uint8(prefix.Bits()), peer)
} else { } else {
panic(errors.New("inserting unknown address type")) panic(errors.New("inserting unknown address type"))
} }
} }
func (table *AllowedIPs) Lookup(ip []byte) *Peer { func (table *AllowedIPs) Lookup(ip []byte) *Peer {
table.mutex.RLock() table.mu.RLock()
defer table.mutex.RUnlock() defer table.mu.RUnlock()
switch len(ip) { switch len(ip) {
case net.IPv6len: case net.IPv6len:
return table.IPv6.lookup(ip) return table.ipv6.lookup(ip)
case net.IPv4len: case net.IPv4len:
return table.IPv4.lookup(ip) return table.ipv4.lookup(ip)
default: default:
panic(errors.New("looking up unknown address type")) panic(errors.New("looking up unknown address type"))
} }