|
|
|
|
@ -547,6 +547,98 @@ func TestNetmapForResponse(t *testing.T) { |
|
|
|
|
t.Errorf("Node mismatch in 2nd netmap; got: %s", j) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
t.Run("named_packetfilter", func(t *testing.T) { |
|
|
|
|
pfA := []tailcfg.FilterRule{ |
|
|
|
|
{ |
|
|
|
|
SrcIPs: []string{"10.0.0.1"}, |
|
|
|
|
DstPorts: []tailcfg.NetPortRange{ |
|
|
|
|
{IP: "10.2.3.4", Ports: tailcfg.PortRange{First: 22, Last: 22}}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
pfB := []tailcfg.FilterRule{ |
|
|
|
|
{ |
|
|
|
|
SrcIPs: []string{"10.0.0.2"}, |
|
|
|
|
DstPorts: []tailcfg.NetPortRange{ |
|
|
|
|
{IP: "10.2.3.4", Ports: tailcfg.PortRange{First: 22, Last: 22}}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
ms := newTestMapSession(t, nil) |
|
|
|
|
|
|
|
|
|
// Mix of old & new style (PacketFilter and PacketFilters).
|
|
|
|
|
nm1 := ms.netmapForResponse(&tailcfg.MapResponse{ |
|
|
|
|
Node: new(tailcfg.Node), |
|
|
|
|
PacketFilter: pfA, |
|
|
|
|
PacketFilters: map[string][]tailcfg.FilterRule{ |
|
|
|
|
"pf-b": pfB, |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
if got, want := len(nm1.PacketFilter), 2; got != want { |
|
|
|
|
t.Fatalf("PacketFilter length = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
if got, want := first(nm1.PacketFilter[0].Srcs).String(), "10.0.0.1/32"; got != want { |
|
|
|
|
t.Fatalf("PacketFilter[0].Srcs = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
if got, want := first(nm1.PacketFilter[1].Srcs).String(), "10.0.0.2/32"; got != want { |
|
|
|
|
t.Fatalf("PacketFilter[0].Srcs = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// No-op change. Remember the old stuff.
|
|
|
|
|
nm2 := ms.netmapForResponse(&tailcfg.MapResponse{ |
|
|
|
|
Node: new(tailcfg.Node), |
|
|
|
|
PacketFilter: nil, |
|
|
|
|
PacketFilters: nil, |
|
|
|
|
}) |
|
|
|
|
if got, want := len(nm2.PacketFilter), 2; got != want { |
|
|
|
|
t.Fatalf("PacketFilter length = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
if !reflect.DeepEqual(nm1.PacketFilter, nm2.PacketFilter) { |
|
|
|
|
t.Error("packet filters differ") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// New style only, with clear.
|
|
|
|
|
nm3 := ms.netmapForResponse(&tailcfg.MapResponse{ |
|
|
|
|
Node: new(tailcfg.Node), |
|
|
|
|
PacketFilter: nil, |
|
|
|
|
PacketFilters: map[string][]tailcfg.FilterRule{ |
|
|
|
|
"*": nil, |
|
|
|
|
"pf-b": pfB, |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
if got, want := len(nm3.PacketFilter), 1; got != want { |
|
|
|
|
t.Fatalf("PacketFilter length = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
if got, want := first(nm3.PacketFilter[0].Srcs).String(), "10.0.0.2/32"; got != want { |
|
|
|
|
t.Fatalf("PacketFilter[0].Srcs = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// New style only, adding pfA back, not as the legacy "base" layer:.
|
|
|
|
|
nm4 := ms.netmapForResponse(&tailcfg.MapResponse{ |
|
|
|
|
Node: new(tailcfg.Node), |
|
|
|
|
PacketFilter: nil, |
|
|
|
|
PacketFilters: map[string][]tailcfg.FilterRule{ |
|
|
|
|
"pf-a": pfA, |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
if got, want := len(nm4.PacketFilter), 2; got != want { |
|
|
|
|
t.Fatalf("PacketFilter length = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
if got, want := first(nm4.PacketFilter[0].Srcs).String(), "10.0.0.1/32"; got != want { |
|
|
|
|
t.Fatalf("PacketFilter[0].Srcs = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
if got, want := first(nm4.PacketFilter[1].Srcs).String(), "10.0.0.2/32"; got != want { |
|
|
|
|
t.Fatalf("PacketFilter[0].Srcs = %v; want %v", got, want) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func first[T any](s []T) T { |
|
|
|
|
if len(s) == 0 { |
|
|
|
|
var zero T |
|
|
|
|
return zero |
|
|
|
|
} |
|
|
|
|
return s[0] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestDeltaDERPMap(t *testing.T) { |
|
|
|
|
|