diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index 185f6ffb1..3e2ec8c3a 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -584,11 +584,12 @@ func (b *LocalBackend) updateStatus(sb *ipnstate.StatusBuilder, extraLocked func sb.MutateSelfStatus(func(ss *ipnstate.PeerStatus) { ss.Online = health.GetInPollNetMap() if b.netMap != nil { + ss.InNetworkMap = true ss.HostName = b.netMap.Hostinfo.Hostname ss.DNSName = b.netMap.Name ss.UserID = b.netMap.User if sn := b.netMap.SelfNode; sn != nil { - ss.ID = sn.StableID + peerStatusFromNode(ss, sn) if c := sn.Capabilities; len(c) > 0 { ss.Capabilities = append([]string(nil), c...) } @@ -626,38 +627,38 @@ func (b *LocalBackend) populatePeerStatusLocked(sb *ipnstate.StatusBuilder) { tailscaleIPs = append(tailscaleIPs, addr.Addr()) } } - exitNodeOption := tsaddr.PrefixesContainsFunc(p.AllowedIPs, func(r netip.Prefix) bool { - return r.Bits() == 0 - }) - var tags *views.Slice[string] - var primaryRoutes *views.IPPrefixSlice - if p.Tags != nil { - v := views.SliceOf(p.Tags) - tags = &v - } - if p.PrimaryRoutes != nil { - v := views.IPPrefixSliceOf(p.PrimaryRoutes) - primaryRoutes = &v - } - sb.AddPeer(p.Key, &ipnstate.PeerStatus{ - InNetworkMap: true, - ID: p.StableID, - UserID: p.User, - TailscaleIPs: tailscaleIPs, - Tags: tags, - PrimaryRoutes: primaryRoutes, - HostName: p.Hostinfo.Hostname(), - DNSName: p.Name, - OS: p.Hostinfo.OS(), - KeepAlive: p.KeepAlive, - Created: p.Created, - LastSeen: lastSeen, - Online: p.Online != nil && *p.Online, - ShareeNode: p.Hostinfo.ShareeNode(), - ExitNode: p.StableID != "" && p.StableID == b.prefs.ExitNodeID(), - ExitNodeOption: exitNodeOption, - SSH_HostKeys: p.Hostinfo.SSH_HostKeys().AsSlice(), - }) + ps := &ipnstate.PeerStatus{ + InNetworkMap: true, + UserID: p.User, + TailscaleIPs: tailscaleIPs, + HostName: p.Hostinfo.Hostname(), + DNSName: p.Name, + OS: p.Hostinfo.OS(), + KeepAlive: p.KeepAlive, + LastSeen: lastSeen, + Online: p.Online != nil && *p.Online, + ShareeNode: p.Hostinfo.ShareeNode(), + ExitNode: p.StableID != "" && p.StableID == b.prefs.ExitNodeID(), + SSH_HostKeys: p.Hostinfo.SSH_HostKeys().AsSlice(), + } + peerStatusFromNode(ps, p) + sb.AddPeer(p.Key, ps) + } +} + +// peerStatusFromNode copies fields that exist in the Node struct for +// current node and peers into the provided PeerStatus. +func peerStatusFromNode(ps *ipnstate.PeerStatus, n *tailcfg.Node) { + ps.ID = n.StableID + ps.Created = n.Created + ps.ExitNodeOption = tsaddr.ContainsExitRoutes(n.AllowedIPs) + if n.Tags != nil { + v := views.SliceOf(n.Tags) + ps.Tags = &v + } + if n.PrimaryRoutes != nil { + v := views.IPPrefixSliceOf(n.PrimaryRoutes) + ps.PrimaryRoutes = &v } }