|
|
|
|
@ -109,7 +109,7 @@ func TestUserspaceEngineReconfig(t *testing.T) { |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = e.Reconfig(cfg, routerCfg, &dns.Config{}) |
|
|
|
|
err = e.Reconfig(cfg, routerCfg, &dns.Config{}, nil) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
@ -130,6 +130,71 @@ func TestUserspaceEngineReconfig(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestUserspaceEnginePortReconfig(t *testing.T) { |
|
|
|
|
const defaultPort = 49983 |
|
|
|
|
// Keep making a wgengine until we find an unused port
|
|
|
|
|
var ue *userspaceEngine |
|
|
|
|
for i := 0; i < 100; i++ { |
|
|
|
|
attempt := uint16(defaultPort + i) |
|
|
|
|
e, err := NewFakeUserspaceEngine(t.Logf, attempt) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
ue = e.(*userspaceEngine) |
|
|
|
|
if ue.magicConn.LocalPort() == attempt { |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
ue.Close() |
|
|
|
|
ue = nil |
|
|
|
|
} |
|
|
|
|
if ue == nil { |
|
|
|
|
t.Fatal("could not create a wgengine with a specific port") |
|
|
|
|
} |
|
|
|
|
defer ue.Close() |
|
|
|
|
|
|
|
|
|
startingPort := ue.magicConn.LocalPort() |
|
|
|
|
discoKey := dkFromHex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") |
|
|
|
|
cfg := &wgcfg.Config{ |
|
|
|
|
Peers: []wgcfg.Peer{ |
|
|
|
|
{ |
|
|
|
|
AllowedIPs: []netaddr.IPPrefix{ |
|
|
|
|
netaddr.IPPrefixFrom(netaddr.IPv4(100, 100, 99, 1), 32), |
|
|
|
|
}, |
|
|
|
|
Endpoints: wgcfg.Endpoints{DiscoKey: discoKey}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
routerCfg := &router.Config{} |
|
|
|
|
if err := ue.Reconfig(cfg, routerCfg, &dns.Config{}, nil); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if got := ue.magicConn.LocalPort(); got != startingPort { |
|
|
|
|
t.Errorf("no debug setting changed local port to %d from %d", got, startingPort) |
|
|
|
|
} |
|
|
|
|
if err := ue.Reconfig(cfg, routerCfg, &dns.Config{}, &tailcfg.Debug{RandomizeClientPort: true}); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if got := ue.magicConn.LocalPort(); got == startingPort { |
|
|
|
|
t.Errorf("debug setting did not change local port from %d", startingPort) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lastPort := ue.magicConn.LocalPort() |
|
|
|
|
if err := ue.Reconfig(cfg, routerCfg, &dns.Config{}, nil); err != nil { |
|
|
|
|
t.Fatal(err) |
|
|
|
|
} |
|
|
|
|
if startingPort == defaultPort { |
|
|
|
|
// Only try this if we managed to bind defaultPort the first time.
|
|
|
|
|
// Otherwise, assume someone else on the computer is using defaultPort
|
|
|
|
|
// and so Reconfig would have caused magicSockt to bind some other port.
|
|
|
|
|
if got := ue.magicConn.LocalPort(); got != defaultPort { |
|
|
|
|
t.Errorf("debug setting did not change local port from %d to %d", startingPort, defaultPort) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if got := ue.magicConn.LocalPort(); got == lastPort { |
|
|
|
|
t.Errorf("Reconfig did not change local port from %d", lastPort) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func dkFromHex(hex string) tailcfg.DiscoKey { |
|
|
|
|
if len(hex) != 64 { |
|
|
|
|
panic(fmt.Sprintf("%q is len %d; want 64", hex, len(hex))) |
|
|
|
|
|