// HomeDERP is the modern version of the DERP string field, with just an
// HomeDERP is the modern version of the DERP string field, with just an
// integer. The client advertises support for this as of capver 111.
// integer. The client advertises support for this as of capver 111.
//
//
// HomeDERP may be zero if not (yet) known, but ideally always be non-zero
// HomeDERP may be zero if not (yet) known, but ideally always be non-zero
// for magicsock connectivity to function normally.
// for magicsock connectivity to function normally.
HomeDERPint`json:",omitempty"`// DERP region ID of the node's home DERP
HomeDERPint`json:",omitzero"`// DERP region ID of the node's home DERP
HostinfoHostinfoView
HostinfoHostinfoView`json:",omitzero"`
Createdtime.Time
Createdtime.Time`json:",omitzero"`
CapCapabilityVersion`json:",omitempty"`// if non-zero, the node's capability version; old servers might not send
CapCapabilityVersion`json:",omitzero"`// if non-zero, the node's capability version; old servers might not send
// Tags are the list of ACL tags applied to this node.
// Tags are the list of ACL tags applied to this node.
// Tags take the form of `tag:<value>` where value starts
// Tags take the form of `tag:<value>` where value starts
@ -453,25 +453,25 @@ type Node struct {
// it do anything. It is the tailscaled client's job to double-check the
// it do anything. It is the tailscaled client's job to double-check the
// MapResponse's PacketFilter to verify that its AllowedIPs will not be
// MapResponse's PacketFilter to verify that its AllowedIPs will not be
// accepted by the packet filter.
// accepted by the packet filter.
UnsignedPeerAPIOnlybool`json:",omitempty"`
UnsignedPeerAPIOnlybool`json:",omitzero"`
// The following three computed fields hold the various names that can
// The following three computed fields hold the various names that can
// be used for this node in UIs. They are populated from controlclient
// be used for this node in UIs. They are populated from controlclient
// (not from control) by calling node.InitDisplayNames. These can be
// (not from control) by calling node.InitDisplayNames. These can be
// used directly or accessed via node.DisplayName or node.DisplayNames.
// used directly or accessed via node.DisplayName or node.DisplayNames.
ComputedNamestring`json:",omitempty"`// MagicDNS base name (for normal non-shared-in nodes), FQDN (without trailing dot, for shared-in nodes), or Hostname (if no MagicDNS)
ComputedNamestring`json:",omitzero"`// MagicDNS base name (for normal non-shared-in nodes), FQDN (without trailing dot, for shared-in nodes), or Hostname (if no MagicDNS)
computedHostIfDifferentstring// hostname, if different than ComputedName, otherwise empty
computedHostIfDifferentstring// hostname, if different than ComputedName, otherwise empty
ComputedNameWithHoststring`json:",omitempty"`// either "ComputedName" or "ComputedName (computedHostIfDifferent)", if computedHostIfDifferent is set
ComputedNameWithHoststring`json:",omitzero"`// either "ComputedName" or "ComputedName (computedHostIfDifferent)", if computedHostIfDifferent is set
// DataPlaneAuditLogID is the per-node logtail ID used for data plane audit logging.
// DataPlaneAuditLogID is the per-node logtail ID used for data plane audit logging.
DataPlaneAuditLogIDstring`json:",omitempty"`
DataPlaneAuditLogIDstring`json:",omitzero"`
// Expired is whether this node's key has expired. Control may send
// Expired is whether this node's key has expired. Control may send
// this; clients are only allowed to set this from false to true. On
// this; clients are only allowed to set this from false to true. On
// the client, this is calculated client-side based on a timestamp sent
// the client, this is calculated client-side based on a timestamp sent
// from control, to avoid clock skew issues.
// from control, to avoid clock skew issues.
Expiredbool`json:",omitempty"`
Expiredbool`json:",omitzero"`
// SelfNodeV4MasqAddrForThisPeer is the IPv4 that this peer knows the current node as.
// SelfNodeV4MasqAddrForThisPeer is the IPv4 that this peer knows the current node as.
// It may be empty if the peer knows the current node by its native
// It may be empty if the peer knows the current node by its native
@ -486,7 +486,7 @@ type Node struct {
// This only applies to traffic originating from the current node to the
// This only applies to traffic originating from the current node to the
// peer or any of its subnets. Traffic originating from subnet routes will
// peer or any of its subnets. Traffic originating from subnet routes will
// not be masqueraded (e.g. in case of --snat-subnet-routes).
// not be masqueraded (e.g. in case of --snat-subnet-routes).
Desktopopt.Bool`json:",omitempty"`// if a desktop was detected on Linux
Desktopopt.Bool`json:",omitzero"`// if a desktop was detected on Linux
Packagestring`json:",omitempty"`// Tailscale package to disambiguate ("choco", "appstore", etc; "" for unknown)
Packagestring`json:",omitzero"`// Tailscale package to disambiguate ("choco", "appstore", etc; "" for unknown)
DeviceModelstring`json:",omitempty"`// mobile phone model ("Pixel 3a", "iPhone12,3")
DeviceModelstring`json:",omitzero"`// mobile phone model ("Pixel 3a", "iPhone12,3")
PushDeviceTokenstring`json:",omitempty"`// macOS/iOS APNs device token for notifications (and Android in the future)
PushDeviceTokenstring`json:",omitzero"`// macOS/iOS APNs device token for notifications (and Android in the future)
Hostnamestring`json:",omitempty"`// name of the host the client runs on
Hostnamestring`json:",omitzero"`// name of the host the client runs on
ShieldsUpbool`json:",omitempty"`// indicates whether the host is blocking incoming connections
ShieldsUpbool`json:",omitzero"`// indicates whether the host is blocking incoming connections
ShareeNodebool`json:",omitempty"`// indicates this node exists in netmap because it's owned by a shared-to user
ShareeNodebool`json:",omitzero"`// indicates this node exists in netmap because it's owned by a shared-to user
NoLogsNoSupportbool`json:",omitempty"`// indicates that the user has opted out of sending logs and support
NoLogsNoSupportbool`json:",omitzero"`// indicates that the user has opted out of sending logs and support
// WireIngress indicates that the node would like to be wired up server-side
// WireIngress indicates that the node would like to be wired up server-side
// (DNS, etc) to be able to use Tailscale Funnel, even if it's not currently
// (DNS, etc) to be able to use Tailscale Funnel, even if it's not currently
// enabled. For example, the user might only use it for intermittent
// enabled. For example, the user might only use it for intermittent
@ -868,38 +868,38 @@ type Hostinfo struct {
// away, even if it's disabled most of the time. As an optimization, this is
// away, even if it's disabled most of the time. As an optimization, this is
// only sent if IngressEnabled is false, as IngressEnabled implies that this
// only sent if IngressEnabled is false, as IngressEnabled implies that this
// option is true.
// option is true.
WireIngressbool`json:",omitempty"`
WireIngressbool`json:",omitzero"`
IngressEnabledbool`json:",omitempty"`// if the node has any funnel endpoint enabled
IngressEnabledbool`json:",omitzero"`// if the node has any funnel endpoint enabled
AllowsUpdatebool`json:",omitempty"`// indicates that the node has opted-in to admin-console-drive remote updates
AllowsUpdatebool`json:",omitzero"`// indicates that the node has opted-in to admin-console-drive remote updates
Machinestring`json:",omitempty"`// the current host's machine type (uname -m)
Machinestring`json:",omitzero"`// the current host's machine type (uname -m)
GoArchstring`json:",omitempty"`// GOARCH value (of the built binary)
GoArchstring`json:",omitzero"`// GOARCH value (of the built binary)
GoArchVarstring`json:",omitempty"`// GOARM, GOAMD64, etc (of the built binary)
GoArchVarstring`json:",omitzero"`// GOARM, GOAMD64, etc (of the built binary)
GoVersionstring`json:",omitempty"`// Go version binary was built with
GoVersionstring`json:",omitzero"`// Go version binary was built with
RoutableIPs[]netip.Prefix`json:",omitempty"`// set of IP ranges this client can route
RoutableIPs[]netip.Prefix`json:",omitempty"`// set of IP ranges this client can route
RequestTags[]string`json:",omitempty"`// set of ACL tags this node wants to claim
RequestTags[]string`json:",omitempty"`// set of ACL tags this node wants to claim
WoLMACs[]string`json:",omitempty"`// MAC address(es) to send Wake-on-LAN packets to wake this node (lowercase hex w/ colons)
WoLMACs[]string`json:",omitempty"`// MAC address(es) to send Wake-on-LAN packets to wake this node (lowercase hex w/ colons)
Services[]Service`json:",omitempty"`// services advertised by this machine
Services[]Service`json:",omitempty"`// services advertised by this machine
NetInfo*NetInfo`json:",omitempty"`
NetInfo*NetInfo`json:",omitzero"`
SSH_HostKeys[]string`json:"sshHostKeys,omitempty"`// if advertised
SSH_HostKeys[]string`json:"sshHostKeys,omitempty"`// if advertised
Cloudstring`json:",omitempty"`
Cloudstring`json:",omitzero"`
Userspaceopt.Bool`json:",omitempty"`// if the client is running in userspace (netstack) mode
Userspaceopt.Bool`json:",omitzero"`// if the client is running in userspace (netstack) mode
UserspaceRouteropt.Bool`json:",omitempty"`// if the client's subnet router is running in userspace (netstack) mode
UserspaceRouteropt.Bool`json:",omitzero"`// if the client's subnet router is running in userspace (netstack) mode
AppConnectoropt.Bool`json:",omitempty"`// if the client is running the app-connector service
AppConnectoropt.Bool`json:",omitzero"`// if the client is running the app-connector service
ServicesHashstring`json:",omitempty"`// opaque hash of the most recent list of tailnet services, change in hash indicates config should be fetched via c2n
ServicesHashstring`json:",omitzero"`// opaque hash of the most recent list of tailnet services, change in hash indicates config should be fetched via c2n
ExitNodeIDStableNodeID`json:",omitzero"`// the client’s selected exit node, empty when unselected.
ExitNodeIDStableNodeID`json:",omitzero"`// the client’s selected exit node, empty when unselected.
// Location represents geographical location data about a
// Location represents geographical location data about a
// Tailscale host. Location is optional and only set if
// Tailscale host. Location is optional and only set if
// explicitly declared by a node.
// explicitly declared by a node.
Location*Location`json:",omitempty"`
Location*Location`json:",omitzero"`
TPM*TPMInfo`json:",omitempty"`// TPM device metadata, if available
TPM*TPMInfo`json:",omitzero"`// TPM device metadata, if available
// StateEncrypted reports whether the node state is stored encrypted on
// StateEncrypted reports whether the node state is stored encrypted on
// disk. The actual mechanism is platform-specific:
// disk. The actual mechanism is platform-specific:
// * Apple nodes use the Keychain
// * Apple nodes use the Keychain
// * Linux and Windows nodes use the TPM
// * Linux and Windows nodes use the TPM
// * Android apps use EncryptedSharedPreferences
// * Android apps use EncryptedSharedPreferences
StateEncryptedopt.Bool`json:",omitempty"`
StateEncryptedopt.Bool`json:",omitzero"`
// NOTE: any new fields containing pointers in this type
// NOTE: any new fields containing pointers in this type