|
|
|
|
@ -41,6 +41,7 @@ import ( |
|
|
|
|
"tailscale.com/util/must" |
|
|
|
|
"tailscale.com/util/usermetric" |
|
|
|
|
"tailscale.com/wgengine/filter" |
|
|
|
|
"tailscale.com/wgengine/netstack/gro" |
|
|
|
|
"tailscale.com/wgengine/wgcfg" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
@ -991,3 +992,67 @@ func TestTSMPDisco(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestInterceptOrdering(t *testing.T) { |
|
|
|
|
bus := eventbustest.NewBus(t) |
|
|
|
|
chtun, tun := newChannelTUN(t.Logf, bus, true) |
|
|
|
|
defer tun.Close() |
|
|
|
|
|
|
|
|
|
var seq uint8 |
|
|
|
|
orderedFilterFn := func(expected uint8) FilterFunc { |
|
|
|
|
return func(_ *packet.Parsed, _ *Wrapper) filter.Response { |
|
|
|
|
seq++ |
|
|
|
|
if expected != seq { |
|
|
|
|
t.Errorf("got sequence %d; want %d", seq, expected) |
|
|
|
|
} |
|
|
|
|
return filter.Accept |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ordereredGROFilterFn := func(expected uint8) GROFilterFunc { |
|
|
|
|
return func(_ *packet.Parsed, _ *Wrapper, _ *gro.GRO) (filter.Response, *gro.GRO) { |
|
|
|
|
seq++ |
|
|
|
|
if expected != seq { |
|
|
|
|
t.Errorf("got sequence %d; want %d", seq, expected) |
|
|
|
|
} |
|
|
|
|
return filter.Accept, nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// As the number of inbound intercepts change,
|
|
|
|
|
// this value should change.
|
|
|
|
|
numInboundIntercepts := uint8(3) |
|
|
|
|
|
|
|
|
|
tun.PreFilterPacketInboundFromWireGuard = orderedFilterFn(1) |
|
|
|
|
tun.PostFilterPacketInboundFromWireGuardAppConnector = orderedFilterFn(2) |
|
|
|
|
tun.PostFilterPacketInboundFromWireGuard = ordereredGROFilterFn(3) |
|
|
|
|
|
|
|
|
|
// Write the packet.
|
|
|
|
|
go func() { <-chtun.Inbound }() // Simulate tun device receiving.
|
|
|
|
|
packet := [][]byte{udp4("5.6.7.8", "1.2.3.4", 89, 89)} |
|
|
|
|
tun.Write(packet, 0) |
|
|
|
|
|
|
|
|
|
if seq != numInboundIntercepts { |
|
|
|
|
t.Errorf("got number of intercepts run in Write(): %d; want: %d", seq, numInboundIntercepts) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// As the number of inbound intercepts change,
|
|
|
|
|
// this value should change.
|
|
|
|
|
numOutboundIntercepts := uint8(4) |
|
|
|
|
|
|
|
|
|
seq = 0 |
|
|
|
|
tun.PreFilterPacketOutboundToWireGuardNetstackIntercept = ordereredGROFilterFn(1) |
|
|
|
|
tun.PreFilterPacketOutboundToWireGuardEngineIntercept = orderedFilterFn(2) |
|
|
|
|
tun.PreFilterPacketOutboundToWireGuardAppConnectorIntercept = orderedFilterFn(3) |
|
|
|
|
tun.PostFilterPacketOutboundToWireGuard = orderedFilterFn(4) |
|
|
|
|
|
|
|
|
|
// Read the packet.
|
|
|
|
|
var buf [MaxPacketSize]byte |
|
|
|
|
sizes := make([]int, 1) |
|
|
|
|
chtun.Outbound <- udp4("1.2.3.4", "5.6.7.8", 98, 98) // Simulate tun device sending.
|
|
|
|
|
tun.Read([][]byte{buf[:]}, sizes, 0) |
|
|
|
|
|
|
|
|
|
if seq != numOutboundIntercepts { |
|
|
|
|
t.Errorf("got number of intercepts run in Read(): %d; want: %d", seq, numOutboundIntercepts) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|