cmd/tailscale/cli,ipn/ipnlocal,wgengine/magicsock: implement tailscale debug peer-relay-servers (#16577)
Updates tailscale/corp#30036 Signed-off-by: Jordan Whited <jordan@tailscale.com>
This commit is contained in:
@@ -356,6 +356,12 @@ func debugCmd() *ffcli.Command {
|
|||||||
ShortHelp: "Print Go's runtime/debug.BuildInfo",
|
ShortHelp: "Print Go's runtime/debug.BuildInfo",
|
||||||
Exec: runGoBuildInfo,
|
Exec: runGoBuildInfo,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "peer-relay-servers",
|
||||||
|
ShortUsage: "tailscale debug peer-relay-servers",
|
||||||
|
ShortHelp: "Print the current set of candidate peer relay servers",
|
||||||
|
Exec: runPeerRelayServers,
|
||||||
|
},
|
||||||
}...),
|
}...),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1327,3 +1333,17 @@ func runDebugResolve(ctx context.Context, args []string) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func runPeerRelayServers(ctx context.Context, args []string) error {
|
||||||
|
if len(args) > 0 {
|
||||||
|
return errors.New("unexpected arguments")
|
||||||
|
}
|
||||||
|
v, err := localClient.DebugResultJSON(ctx, "peer-relay-servers")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
e := json.NewEncoder(os.Stdout)
|
||||||
|
e.SetIndent("", " ")
|
||||||
|
e.Encode(v)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -6956,6 +6956,10 @@ func (b *LocalBackend) DebugReSTUN() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *LocalBackend) DebugPeerRelayServers() set.Set[netip.AddrPort] {
|
||||||
|
return b.MagicConn().PeerRelays()
|
||||||
|
}
|
||||||
|
|
||||||
// ControlKnobs returns the node's control knobs.
|
// ControlKnobs returns the node's control knobs.
|
||||||
func (b *LocalBackend) ControlKnobs() *controlknobs.Knobs {
|
func (b *LocalBackend) ControlKnobs() *controlknobs.Knobs {
|
||||||
return b.sys.ControlKnobs()
|
return b.sys.ControlKnobs()
|
||||||
|
|||||||
@@ -696,6 +696,12 @@ func (h *Handler) serveDebug(w http.ResponseWriter, r *http.Request) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
h.b.DebugForcePreferDERP(n)
|
h.b.DebugForcePreferDERP(n)
|
||||||
|
case "peer-relay-servers":
|
||||||
|
servers := h.b.DebugPeerRelayServers()
|
||||||
|
err = json.NewEncoder(w).Encode(servers)
|
||||||
|
if err == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
case "":
|
case "":
|
||||||
err = fmt.Errorf("missing parameter 'action'")
|
err = fmt.Errorf("missing parameter 'action'")
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -3907,3 +3907,8 @@ func (le *lazyEndpoint) FromPeer(peerPublicKey [32]byte) {
|
|||||||
le.c.peerMap.setNodeKeyForEpAddr(le.src, pubKey)
|
le.c.peerMap.setNodeKeyForEpAddr(le.src, pubKey)
|
||||||
le.c.logf("magicsock: lazyEndpoint.FromPeer(%v) setting epAddr(%v) in peerMap for node(%v)", pubKey.ShortString(), le.src, ep.nodeAddr)
|
le.c.logf("magicsock: lazyEndpoint.FromPeer(%v) setting epAddr(%v) in peerMap for node(%v)", pubKey.ShortString(), le.src, ep.nodeAddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PeerRelays returns the current set of candidate peer relays.
|
||||||
|
func (c *Conn) PeerRelays() set.Set[netip.AddrPort] {
|
||||||
|
return c.relayManager.getServers()
|
||||||
|
}
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ type relayManager struct {
|
|||||||
newServerEndpointCh chan newRelayServerEndpointEvent
|
newServerEndpointCh chan newRelayServerEndpointEvent
|
||||||
rxHandshakeDiscoMsgCh chan relayHandshakeDiscoMsgEvent
|
rxHandshakeDiscoMsgCh chan relayHandshakeDiscoMsgEvent
|
||||||
serversCh chan set.Set[netip.AddrPort]
|
serversCh chan set.Set[netip.AddrPort]
|
||||||
|
getServersCh chan chan set.Set[netip.AddrPort]
|
||||||
|
|
||||||
discoInfoMu sync.Mutex // guards the following field
|
discoInfoMu sync.Mutex // guards the following field
|
||||||
discoInfoByServerDisco map[key.DiscoPublic]*relayHandshakeDiscoInfo
|
discoInfoByServerDisco map[key.DiscoPublic]*relayHandshakeDiscoInfo
|
||||||
@@ -185,10 +186,29 @@ func (r *relayManager) runLoop() {
|
|||||||
if !r.hasActiveWorkRunLoop() {
|
if !r.hasActiveWorkRunLoop() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
case getServersCh := <-r.getServersCh:
|
||||||
|
r.handleGetServersRunLoop(getServersCh)
|
||||||
|
if !r.hasActiveWorkRunLoop() {
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *relayManager) handleGetServersRunLoop(getServersCh chan set.Set[netip.AddrPort]) {
|
||||||
|
servers := make(set.Set[netip.AddrPort], len(r.serversByAddrPort))
|
||||||
|
for server := range r.serversByAddrPort {
|
||||||
|
servers.Add(server)
|
||||||
|
}
|
||||||
|
getServersCh <- servers
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *relayManager) getServers() set.Set[netip.AddrPort] {
|
||||||
|
ch := make(chan set.Set[netip.AddrPort])
|
||||||
|
relayManagerInputEvent(r, nil, &r.getServersCh, ch)
|
||||||
|
return <-ch
|
||||||
|
}
|
||||||
|
|
||||||
func (r *relayManager) handleServersUpdateRunLoop(update set.Set[netip.AddrPort]) {
|
func (r *relayManager) handleServersUpdateRunLoop(update set.Set[netip.AddrPort]) {
|
||||||
for k, v := range r.serversByAddrPort {
|
for k, v := range r.serversByAddrPort {
|
||||||
if !update.Contains(k) {
|
if !update.Contains(k) {
|
||||||
@@ -244,6 +264,7 @@ func (r *relayManager) init() {
|
|||||||
r.newServerEndpointCh = make(chan newRelayServerEndpointEvent)
|
r.newServerEndpointCh = make(chan newRelayServerEndpointEvent)
|
||||||
r.rxHandshakeDiscoMsgCh = make(chan relayHandshakeDiscoMsgEvent)
|
r.rxHandshakeDiscoMsgCh = make(chan relayHandshakeDiscoMsgEvent)
|
||||||
r.serversCh = make(chan set.Set[netip.AddrPort])
|
r.serversCh = make(chan set.Set[netip.AddrPort])
|
||||||
|
r.getServersCh = make(chan chan set.Set[netip.AddrPort])
|
||||||
r.runLoopStoppedCh = make(chan struct{}, 1)
|
r.runLoopStoppedCh = make(chan struct{}, 1)
|
||||||
r.runLoopStoppedCh <- struct{}{}
|
r.runLoopStoppedCh <- struct{}{}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -32,4 +32,19 @@ func TestRelayManagerInitAndIdle(t *testing.T) {
|
|||||||
rm = relayManager{}
|
rm = relayManager{}
|
||||||
rm.handleRelayServersSet(make(set.Set[netip.AddrPort]))
|
rm.handleRelayServersSet(make(set.Set[netip.AddrPort]))
|
||||||
<-rm.runLoopStoppedCh
|
<-rm.runLoopStoppedCh
|
||||||
|
|
||||||
|
rm = relayManager{}
|
||||||
|
rm.getServers()
|
||||||
|
<-rm.runLoopStoppedCh
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRelayManagerGetServers(t *testing.T) {
|
||||||
|
rm := relayManager{}
|
||||||
|
servers := make(set.Set[netip.AddrPort], 1)
|
||||||
|
servers.Add(netip.MustParseAddrPort("192.0.2.1:7"))
|
||||||
|
rm.handleRelayServersSet(servers)
|
||||||
|
got := rm.getServers()
|
||||||
|
if !servers.Equal(got) {
|
||||||
|
t.Errorf("got %v != want %v", got, servers)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user