@ -70,7 +70,15 @@ func NewContainsIPFunc(addrs views.Slice[netip.Prefix]) func(ip netip.Addr) bool
// If any addr is a prefix with more than a single IP, then do either a
// If any addr is a prefix with more than a single IP, then do either a
// linear scan or a bart table, depending on the number of addrs.
// linear scan or a bart table, depending on the number of addrs.
if addrs . ContainsFunc ( func ( p netip . Prefix ) bool { return ! p . IsSingleIP ( ) } ) {
if addrs . ContainsFunc ( func ( p netip . Prefix ) bool { return ! p . IsSingleIP ( ) } ) {
if addrs . Len ( ) > 6 {
if addrs . Len ( ) == 1 {
pathForTest ( "one-prefix" )
return addrs . At ( 0 ) . Contains
}
if addrs . Len ( ) <= 6 {
// Small enough to do a linear search.
pathForTest ( "linear-contains" )
return prefixContainsLoop ( addrs . AsSlice ( ) )
}
pathForTest ( "bart" )
pathForTest ( "bart" )
// Built a bart table.
// Built a bart table.
t := & bart . Table [ struct { } ] { }
t := & bart . Table [ struct { } ] { }
@ -78,11 +86,6 @@ func NewContainsIPFunc(addrs views.Slice[netip.Prefix]) func(ip netip.Addr) bool
t . Insert ( addrs . At ( i ) , struct { } { } )
t . Insert ( addrs . At ( i ) , struct { } { } )
}
}
return bartLookup ( t )
return bartLookup ( t )
} else {
pathForTest ( "linear-contains" )
// Small enough to do a linear search.
return prefixContainsLoop ( addrs . AsSlice ( ) )
}
}
}
// Fast paths for 1 and 2 IPs:
// Fast paths for 1 and 2 IPs:
if addrs . Len ( ) == 1 {
if addrs . Len ( ) == 1 {