|
|
|
@ -41,6 +41,13 @@ func (t *Table[T]) init() {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (t *Table[T]) tableForAddr(addr netip.Addr) *strideTable[T] {
|
|
|
|
|
if addr.Is6() {
|
|
|
|
|
return &t.v6
|
|
|
|
|
}
|
|
|
|
|
return &t.v4
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get does a route lookup for addr and returns the associated value, or nil if
|
|
|
|
|
// no route matched.
|
|
|
|
|
func (t *Table[T]) Get(addr netip.Addr) *T {
|
|
|
|
@ -50,17 +57,11 @@ func (t *Table[T]) Get(addr netip.Addr) *T {
|
|
|
|
|
// barely complex enough that it can't be inlined, and that in
|
|
|
|
|
// turn causes the slice to escape to the heap. Using As16 and
|
|
|
|
|
// manual slicing here helps the compiler keep Get alloc-free.
|
|
|
|
|
st := t.tableForAddr(addr)
|
|
|
|
|
rawAddr := addr.As16()
|
|
|
|
|
var (
|
|
|
|
|
st *strideTable[T]
|
|
|
|
|
bs []byte
|
|
|
|
|
)
|
|
|
|
|
if addr.Is6() {
|
|
|
|
|
st = &t.v6
|
|
|
|
|
bs = rawAddr[:]
|
|
|
|
|
} else {
|
|
|
|
|
st = &t.v4
|
|
|
|
|
bs = rawAddr[12:]
|
|
|
|
|
bs := rawAddr[:]
|
|
|
|
|
if addr.Is4() {
|
|
|
|
|
bs = bs[12:]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i := 0
|
|
|
|
@ -144,10 +145,7 @@ func (t *Table[T]) Insert(pfx netip.Prefix, val *T) {
|
|
|
|
|
fmt.Printf("\ninsert: start pfx=%s\n", pfx)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
st := &t.v4
|
|
|
|
|
if pfx.Addr().Is6() {
|
|
|
|
|
st = &t.v6
|
|
|
|
|
}
|
|
|
|
|
st := t.tableForAddr(pfx.Addr())
|
|
|
|
|
|
|
|
|
|
// This algorithm is full of off-by-one headaches that boil down
|
|
|
|
|
// to the fact that pfx.Bits() has (2^n)+1 values, rather than
|
|
|
|
@ -335,10 +333,7 @@ func (t *Table[T]) Delete(pfx netip.Prefix) {
|
|
|
|
|
fmt.Printf("\ndelete: start pfx=%s table:\n%s", pfx, t.debugSummary())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
st := &t.v4
|
|
|
|
|
if pfx.Addr().Is6() {
|
|
|
|
|
st = &t.v6
|
|
|
|
|
}
|
|
|
|
|
st := t.tableForAddr(pfx.Addr())
|
|
|
|
|
|
|
|
|
|
// This algorithm is full of off-by-one headaches, just like
|
|
|
|
|
// Insert. See the comment in Insert for more details. Bottom
|
|
|
|
|