diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-02-10 18:19:11 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-02-10 18:19:11 +0100 |
commit | 75e6d810edd3026b60fb3ca7b759236e555c2d0d (patch) | |
tree | e9f71167b2d60f7477dbba075abc0096304f1fbb /device/allowedips.go | |
parent | 747f5440bc18492a63eb91cba7db72b16c96176d (diff) |
device: use container/list instead of open coding it
This linked list implementation is awful, but maybe Go 2 will help
eventually, and at least we're not open coding the hlist any more.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'device/allowedips.go')
-rw-r--r-- | device/allowedips.go | 41 |
1 files changed, 14 insertions, 27 deletions
diff --git a/device/allowedips.go b/device/allowedips.go index cb6df0a..b6f096a 100644 --- a/device/allowedips.go +++ b/device/allowedips.go @@ -6,6 +6,7 @@ package device import ( + "container/list" "errors" "math/bits" "net" @@ -14,14 +15,13 @@ import ( ) type trieEntry struct { - child [2]*trieEntry - peer *Peer - bits net.IP - cidr uint - bit_at_byte uint - bit_at_shift uint - nextEntryForPeer *trieEntry - pprevEntryForPeer **trieEntry + child [2]*trieEntry + peer *Peer + bits net.IP + cidr uint + bit_at_byte uint + bit_at_shift uint + perPeerElem *list.Element } func isLittleEndian() bool { @@ -69,28 +69,14 @@ func commonBits(ip1 net.IP, ip2 net.IP) uint { } func (node *trieEntry) addToPeerEntries() { - p := node.peer - first := p.firstTrieEntry - node.nextEntryForPeer = first - if first != nil { - first.pprevEntryForPeer = &node.nextEntryForPeer - } - p.firstTrieEntry = node - node.pprevEntryForPeer = &p.firstTrieEntry + node.perPeerElem = node.peer.trieEntries.PushBack(node) } func (node *trieEntry) removeFromPeerEntries() { - if node.pprevEntryForPeer == nil { - return - } - next := node.nextEntryForPeer - pprev := node.pprevEntryForPeer - *pprev = next - if next != nil { - next.pprevEntryForPeer = pprev + if node.perPeerElem != nil { + node.peer.trieEntries.Remove(node.perPeerElem) + node.perPeerElem = nil } - node.nextEntryForPeer = nil - node.pprevEntryForPeer = nil } func (node *trieEntry) removeByPeer(p *Peer) *trieEntry { @@ -226,7 +212,8 @@ func (table *AllowedIPs) EntriesForPeer(peer *Peer, cb func(ip net.IP, cidr uint table.mutex.RLock() defer table.mutex.RUnlock() - for node := peer.firstTrieEntry; node != nil; node = node.nextEntryForPeer { + for elem := peer.trieEntries.Front(); elem != nil; elem = elem.Next() { + node := elem.Value.(*trieEntry) if !cb(node.bits, node.cidr) { return } |