@ -20,6 +20,7 @@ import (
"time"
"time"
"go4.org/mem"
"go4.org/mem"
"go4.org/netipx"
"tailscale.com/tailcfg"
"tailscale.com/tailcfg"
"tailscale.com/types/dnstype"
"tailscale.com/types/dnstype"
"tailscale.com/types/ipproto"
"tailscale.com/types/ipproto"
@ -116,6 +117,44 @@ func TestHash(t *testing.T) {
} ( ) ,
} ( ) ,
wantEq : false ,
wantEq : false ,
} ,
} ,
{ in : tuple { netip . Addr { } , netip . Addr { } } , wantEq : true } ,
{ in : tuple { netip . Addr { } , netip . AddrFrom4 ( [ 4 ] byte { } ) } , wantEq : false } ,
{ in : tuple { netip . AddrFrom4 ( [ 4 ] byte { } ) , netip . AddrFrom4 ( [ 4 ] byte { } ) } , wantEq : true } ,
{ in : tuple { netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) } , wantEq : true } ,
{ in : tuple { netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 2 } ) } , wantEq : false } ,
{ in : tuple { netip . AddrFrom4 ( [ 4 ] byte { } ) , netip . AddrFrom16 ( [ 16 ] byte { } ) } , wantEq : false } ,
{ in : tuple { netip . AddrFrom16 ( [ 16 ] byte { } ) , netip . AddrFrom16 ( [ 16 ] byte { } ) } , wantEq : true } ,
{ in : tuple { netip . AddrPort { } , netip . AddrPort { } } , wantEq : true } ,
{ in : tuple { netip . AddrPort { } , netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , 0 ) } , wantEq : false } ,
{ in : tuple { netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , 0 ) , netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , 0 ) } , wantEq : true } ,
{ in : tuple { netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1234 ) , netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1234 ) } , wantEq : true } ,
{ in : tuple { netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1234 ) , netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1235 ) } , wantEq : false } ,
{ in : tuple { netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1234 ) , netip . AddrPortFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 2 } ) , 1234 ) } , wantEq : false } ,
{ in : tuple { netip . Prefix { } , netip . Prefix { } } , wantEq : true } ,
{ in : tuple { netip . Prefix { } , netip . PrefixFrom ( netip . Addr { } , 1 ) } , wantEq : false } ,
{ in : tuple { netip . Prefix { } , netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , 0 ) } , wantEq : false } ,
{ in : tuple { netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , 1 ) , netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , 1 ) } , wantEq : true } ,
{ in : tuple { netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1 ) , netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1 ) } , wantEq : true } ,
{ in : tuple { netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1 ) , netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 0 ) } , wantEq : false } ,
{ in : tuple { netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , 1 ) , netip . PrefixFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 2 } ) , 1 ) } , wantEq : false } ,
{ in : tuple { netipx . IPRange { } , netipx . IPRange { } } , wantEq : true } ,
{ in : tuple { netipx . IPRange { } , netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , netip . AddrFrom16 ( [ 16 ] byte { } ) ) } , wantEq : false } ,
{ in : tuple { netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , netip . AddrFrom16 ( [ 16 ] byte { } ) ) , netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { } ) , netip . AddrFrom16 ( [ 16 ] byte { } ) ) } , wantEq : true } ,
{ in : tuple { netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 100 } ) ) , netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 100 } ) ) } , wantEq : true } ,
{ in : tuple { netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 100 } ) ) , netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 101 } ) ) } , wantEq : false } ,
{ in : tuple { netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 1 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 100 } ) ) , netipx . IPRangeFrom ( netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 2 } ) , netip . AddrFrom4 ( [ 4 ] byte { 192 , 168 , 0 , 100 } ) ) } , wantEq : false } ,
{ in : tuple { key . DiscoPublic { } , key . DiscoPublic { } } , wantEq : true } ,
{ in : tuple { key . DiscoPublic { } , key . DiscoPublicFromRaw32 ( mem . B ( func ( ) [ ] byte {
b := make ( [ ] byte , 32 )
b [ 0 ] = 1
return b
} ( ) ) ) } , wantEq : false } ,
{ in : tuple { key . NodePublic { } , key . NodePublic { } } , wantEq : true } ,
{ in : tuple { key . NodePublic { } , key . NodePublicFromRaw32 ( mem . B ( func ( ) [ ] byte {
b := make ( [ ] byte , 32 )
b [ 0 ] = 1
return b
} ( ) ) ) } , wantEq : false } ,
}
}
for _ , tt := range tests {
for _ , tt := range tests {
@ -405,18 +444,18 @@ func TestGetTypeHasher(t *testing.T) {
{
{
name : "packet_filter" ,
name : "packet_filter" ,
val : filterRules ,
val : filterRules ,
out : "\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00*\v\x00\x00\x00\x00\x00\x00\x0010.1.3.4/32\v\x00\x00\x00\x00\x00\x00\x0010.0.0.0/24\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x001.2.3.4/32\x01 \x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\ n\x00\x00\x00\x00\x00\x00\x001.2.3.4/32 \x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00foo\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
out : "\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00*\v\x00\x00\x00\x00\x00\x00\x0010.1.3.4/32\v\x00\x00\x00\x00\x00\x00\x0010.0.0.0/24\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x001.2.3.4/32\x01 \x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\ x04\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04 \x00 \x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00foo\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
out32 : "\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00*\v\x00\x00\x00\x00\x00\x00\x0010.1.3.4/32\v\x00\x00\x00\x00\x00\x00\x0010.0.0.0/24\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x001.2.3.4/32\x01 \x00\x00\x00\x01\x00\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\ n\x00\x00\x00\x00\x00\x00\x001.2.3.4/32 \x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00foo\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
out32 : "\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00*\v\x00\x00\x00\x00\x00\x00\x0010.1.3.4/32\v\x00\x00\x00\x00\x00\x00\x0010.0.0.0/24\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x001.2.3.4/32\x01 \x00\x00\x00\x01\x00\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\ x04\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04 \x00 \x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00foo\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\v\x00\x00\x00\x00\x00\x00\x00foooooooooo\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00baaaaaarrrrr\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
} ,
} ,
{
{
name : "netip.Addr" ,
name : "netip.Addr" ,
val : netip . MustParseAddr ( "fe80::123%foo" ) ,
val : netip . MustParseAddr ( "fe80::123%foo" ) ,
out : "\r\x00\x00\x00\x00\x00\x00\x00fe80::123% foo",
out : u64 ( 16 + 3 ) + u64 ( 0x80fe ) + u64 ( 0x2301 << 48 ) + " foo",
} ,
} ,
{
{
name : "ptr-netip.Addr" ,
name : "ptr-netip.Addr" ,
val : & someIP ,
val : & someIP ,
out : "\x01\a\x00\x00\x00\x00\x00\x00\x001.2.3.4" ,
out : u8 ( 1 ) + u64 ( 4 ) + u32 ( 0x04030201 ) ,
} ,
} ,
{
{
name : "ptr-nil-netip.Addr" ,
name : "ptr-nil-netip.Addr" ,
@ -834,3 +873,38 @@ func FuzzTime(f *testing.F) {
}
}
} )
} )
}
}
func FuzzAddr ( f * testing . F ) {
f . Fuzz ( func ( t * testing . T ,
u1a , u1b uint64 , zone1 string ,
u2a , u2b uint64 , zone2 string ,
) {
var b1 , b2 [ 16 ] byte
binary . LittleEndian . PutUint64 ( b1 [ : 8 ] , u1a )
binary . LittleEndian . PutUint64 ( b1 [ 8 : ] , u1b )
binary . LittleEndian . PutUint64 ( b2 [ : 8 ] , u2a )
binary . LittleEndian . PutUint64 ( b2 [ 8 : ] , u2b )
var ips [ 4 ] netip . Addr
ips [ 0 ] = netip . AddrFrom4 ( * ( * [ 4 ] byte ) ( b1 [ : ] ) )
ips [ 1 ] = netip . AddrFrom4 ( * ( * [ 4 ] byte ) ( b2 [ : ] ) )
ips [ 2 ] = netip . AddrFrom16 ( b1 )
if zone1 != "" {
ips [ 2 ] = ips [ 2 ] . WithZone ( zone1 )
}
ips [ 3 ] = netip . AddrFrom16 ( b2 )
if zone2 != "" {
ips [ 3 ] = ips [ 2 ] . WithZone ( zone2 )
}
for _ , ip1 := range ips [ : ] {
for _ , ip2 := range ips [ : ] {
got := Hash ( & ip1 ) == Hash ( & ip2 )
want := ip1 == ip2
if got != want {
t . Errorf ( "netip.Addr(%s) == netip.Addr(%s) mismatches hash equivalent" , ip1 . String ( ) , ip2 . String ( ) )
}
}
}
} )
}