diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index f134c22f5..b484102a5 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -448,6 +448,8 @@ func (b *LocalBackend) populatePeerStatusLocked(sb *ipnstate.StatusBuilder) { ID: p.StableID, UserID: p.User, TailscaleIPs: tailscaleIPs, + Tags: p.Tags, + PrimaryRoutes: p.PrimaryRoutes, HostName: p.Hostinfo.Hostname(), DNSName: p.Name, OS: p.Hostinfo.OS(), diff --git a/ipn/ipnstate/ipnstate.go b/ipn/ipnstate/ipnstate.go index 9941d7931..1639d06d3 100644 --- a/ipn/ipnstate/ipnstate.go +++ b/ipn/ipnstate/ipnstate.go @@ -101,15 +101,23 @@ type PeerStatusLite struct { } type PeerStatus struct { - ID tailcfg.StableNodeID - PublicKey key.NodePublic - HostName string // HostInfo's Hostname (not a DNS name or necessarily unique) - DNSName string - OS string // HostInfo.OS - UserID tailcfg.UserID - + ID tailcfg.StableNodeID + PublicKey key.NodePublic + HostName string // HostInfo's Hostname (not a DNS name or necessarily unique) + DNSName string + OS string // HostInfo.OS + UserID tailcfg.UserID TailscaleIPs []netaddr.IP // Tailscale IP(s) assigned to this node + // Tags are the list of ACL tags applied to this node. + // See tailscale.com/tailcfg#Node.Tags for more information. + Tags []string `json:",omitempty"` + + // PrimaryRoutes are the routes this node is currently the primary + // subnet router for, as determined by the control plane. It does + // not include the IPs in TailscaleIPs. + PrimaryRoutes []netaddr.IPPrefix `json:",omitempty"` + // Endpoints: Addrs []string CurAddr string // one of Addrs, or unique if roaming @@ -266,6 +274,12 @@ func (sb *StatusBuilder) AddPeer(peer key.NodePublic, st *PeerStatus) { if v := st.TailscaleIPs; v != nil { e.TailscaleIPs = v } + if v := st.PrimaryRoutes; v != nil { + e.PrimaryRoutes = v + } + if v := st.Tags; v != nil { + e.Tags = v + } if v := st.OS; v != "" { e.OS = st.OS }