cmd/tailscale, magicsock: add debug command to flip DERP homes
For testing netmap patchification server-side. Updates #1909 Change-Id: Ib1d784bd97b8d4a31e48374b4567404aae5280cc Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
13767e5108
commit
6f36f8842c
|
@ -139,6 +139,11 @@ var debugCmd = &ffcli.Command{
|
|||
Exec: localAPIAction("break-derp-conns"),
|
||||
ShortHelp: "break any open DERP connections from the daemon",
|
||||
},
|
||||
{
|
||||
Name: "pick-new-derp",
|
||||
Exec: localAPIAction("pick-new-derp"),
|
||||
ShortHelp: "switch to some other random DERP home region for a short time",
|
||||
},
|
||||
{
|
||||
Name: "force-netmap-update",
|
||||
Exec: localAPIAction("force-netmap-update"),
|
||||
|
|
|
@ -2156,6 +2156,12 @@ func (b *LocalBackend) DebugForceNetmapUpdate() {
|
|||
b.setNetMapLocked(nm)
|
||||
}
|
||||
|
||||
// DebugPickNewDERP forwards to magicsock.Conn.DebugPickNewDERP.
|
||||
// See its docs.
|
||||
func (b *LocalBackend) DebugPickNewDERP() error {
|
||||
return b.sys.MagicSock.Get().DebugPickNewDERP()
|
||||
}
|
||||
|
||||
// send delivers n to the connected frontend and any API watchers from
|
||||
// LocalBackend.WatchNotifications (via the LocalAPI).
|
||||
//
|
||||
|
|
|
@ -566,6 +566,8 @@ func (h *Handler) serveDebug(w http.ResponseWriter, r *http.Request) {
|
|||
if err == nil {
|
||||
return
|
||||
}
|
||||
case "pick-new-derp":
|
||||
err = h.b.DebugPickNewDERP()
|
||||
case "":
|
||||
err = fmt.Errorf("missing parameter 'action'")
|
||||
default:
|
||||
|
|
|
@ -2715,6 +2715,33 @@ func (c *Conn) getPinger() *ping.Pinger {
|
|||
})
|
||||
}
|
||||
|
||||
// DebugPickNewDERP picks a new DERP random home temporarily (even if just for
|
||||
// seconds) and reports it to control. It exists to test DERP home changes and
|
||||
// netmap deltas, etc. It serves no useful user purpose.
|
||||
func (c *Conn) DebugPickNewDERP() error {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
dm := c.derpMap
|
||||
if dm == nil {
|
||||
return errors.New("no derpmap")
|
||||
}
|
||||
if c.netInfoLast == nil {
|
||||
return errors.New("no netinfo")
|
||||
}
|
||||
for _, r := range dm.Regions {
|
||||
if r.RegionID == c.myDerp {
|
||||
continue
|
||||
}
|
||||
c.logf("magicsock: [debug] switching derp home to random %v (%v)", r.RegionID, r.RegionCode)
|
||||
go c.setNearestDERP(r.RegionID)
|
||||
ni2 := c.netInfoLast.Clone()
|
||||
ni2.PreferredDERP = r.RegionID
|
||||
c.callNetInfoCallbackLocked(ni2)
|
||||
return nil
|
||||
}
|
||||
return errors.New("too few regions")
|
||||
}
|
||||
|
||||
// portableTrySetSocketBuffer sets SO_SNDBUF and SO_RECVBUF on pconn to socketBufferSize,
|
||||
// logging an error if it occurs.
|
||||
func portableTrySetSocketBuffer(pconn nettype.PacketConn, logf logger.Logf) {
|
||||
|
|
Loading…
Reference in New Issue