Skip to main content

CapabilityVersion

Struct CapabilityVersion 

Source
pub struct CapabilityVersion(/* private fields */);
Expand description

Indicates the capability level of a Tailscale node. This must be kept in-sync with the CapabilityVersion constants in the Golang codebase (tailcfg/tailcfg.go).

It can be thought of as a node’s simple version number; a single monotonically increasing integer, rather than the complex x.y.z-cccccc semver+hash(es) versioning scheme. Whenever a node gains a capability or wants to negotiate a change in semantics with the control plane, peers, or an official frontend (such as LocalAPI in the Golang codebase), bump this number and document what’s changed.

The capability versions 0, 1, 2, and 35 are undefined; you cannot create a CapabilityVersion with these values.

Note: Prior to 2022-03-06, this value was known as the “MapRequest version”, mapVer, or “map cap”; you’ll still see that name used in comments throughout the Golang codebase.

Implementations§

Source§

impl CapabilityVersion

Source

pub const V3: Self

2020-??-??: implicit compression, keep-alives

Source

pub const V4: Self

2020-??-??: opt-in keep-alives via KeepAlive field, opt-in compression via Compress

Source

pub const V5: Self

2020-10-19: implies IncludeIPv6; delta Peers/UserProfiles, supports MagicDNS

Source

pub const V6: Self

2020-12-07: means MapResponse.PacketFilter nil means unchanged

Source

pub const V7: Self

2020-12-15: FilterRule.SrcIPs accepts CIDRs+ranges, doesn’t warn about 0.0.0.0/::

Source

pub const V8: Self

2020-12-19: client can buggily receive IPv6 addresses and routes if beta enabled server-side

Source

pub const V9: Self

2020-12-30: client doesn’t auto-add implicit search domains from peers; only DNSConfig.Domains

Source

pub const V10: Self

2021-01-17: client understands MapResponse.PeerSeenChange

Source

pub const V11: Self

2021-03-03: client understands IPv6; multiple default routes, and goroutine dumping

Source

pub const V12: Self

2021-03-04: client understands PingRequest

Source

pub const V13: Self

2021-03-19: client understands FilterRule.IPProto

Source

pub const V14: Self

2021-04-07: client understands DNSConfig.Routes and DNSConfig.Resolvers

Source

pub const V15: Self

2021-04-12: client treats nil MapResponse.DNSConfig as meaning unchanged

Source

pub const V16: Self

2021-04-15: client understands Node.Online, MapResponse.OnlineChange

Source

pub const V17: Self

2021-04-18: MapResponse.Domain empty means unchanged

Source

pub const V18: Self

2021-04-19: MapResponse.Node nil means unchanged (all fields now omitempty)

Source

pub const V19: Self

2021-04-21: MapResponse.Debug.SleepSeconds

Source

pub const V20: Self

2021-06-11: MapResponse.LastSeen used even less (https://github.com/tailscale/tailscale/issues/2107)

Source

pub const V21: Self

2021-06-15: added MapResponse.DNSConfig.CertDomains

Source

pub const V22: Self

2021-06-16: added MapResponse.DNSConfig.ExtraRecords

Source

pub const V23: Self

2021-08-25: DNSConfig.Routes values may be empty (for ExtraRecords support in 1.14.1+)

Source

pub const V24: Self

2021-09-18: MapResponse.Health from control to node; node shows in “tailscale status”

Source

pub const V25: Self

2021-11-01: MapResponse.Debug.Exit

Source

pub const V26: Self

2022-01-12: (nothing, just bumping for 1.20.0)

Source

pub const V27: Self

2022-02-18: start of SSHPolicy being respected

Source

pub const V28: Self

2022-03-09: client can communicate over Noise.

Source

pub const V29: Self

2022-03-21: MapResponse.PopBrowserURL

Source

pub const V30: Self

2022-03-22: client can request id tokens.

Source

pub const V31: Self

2022-04-15: PingRequest & PingResponse TSMP & disco support

Source

pub const V32: Self

2022-04-17: client knows FilterRule.CapMatch

Source

pub const V33: Self

2022-07-20: added MapResponse.PeersChangedPatch (DERPRegion + Endpoints)

Source

pub const V34: Self

2022-08-02: client understands CapabilityFileSharingTarget

Source

pub const V36: Self

2022-08-02: added PeersChangedPatch.{Key,DiscoKey,Online,LastSeen,KeyExpiry,Capabilities}

Source

pub const V37: Self

2022-08-09: added Debug.{SetForceBackgroundSTUN,SetRandomizeClientPort}; Debug are sticky

Source

pub const V38: Self

2022-08-11: added PingRequest.URLIsNoise

Source

pub const V39: Self

2022-08-15: clients can talk Noise over arbitrary HTTPS port

Source

pub const V40: Self

2022-08-22: added Node.KeySignature, PeersChangedPatch.KeySignature

Source

pub const V41: Self

2022-08-30: uses 100.100.100.100 for route-less ExtraRecords if global nameservers is set

Source

pub const V42: Self

2022-09-06: NextDNS DoH support; see https://github.com/tailscale/tailscale/pull/5556

Source

pub const V43: Self

2022-09-21: clients can return usernames for SSH

Source

pub const V44: Self

2022-09-22: MapResponse.ControlDialPlan

Source

pub const V45: Self

2022-09-26: c2n /debug/{goroutines,prefs,metrics}

Source

pub const V46: Self

2022-10-04: c2n /debug/component-logging

Source

pub const V47: Self

2022-10-11: Register{Request,Response}.NodeKeySignature

Source

pub const V48: Self

2022-11-02: Node.UnsignedPeerAPIOnly

Source

pub const V49: Self

2022-11-03: Client understands EarlyNoise

Source

pub const V50: Self

2022-11-14: Client understands CapabilityIngress

Source

pub const V51: Self

2022-11-30: Client understands CapabilityTailnetLockAlpha

Source

pub const V52: Self

2023-01-05: client can handle c2n POST /logtail/flush

Source

pub const V53: Self

2023-01-18: client respects explicit Node.Expired + auto-sets based on Node.KeyExpiry

Source

pub const V54: Self

2023-01-19: Node.Cap added, PeersChangedPatch.Cap, uses Node.Cap for ExitDNS before Hostinfo.Services fallback

Source

pub const V55: Self

2023-01-23: start of c2n GET+POST /update handler

Source

pub const V56: Self

2023-01-24: Client understands CapabilityDebugTSDNSResolution

Source

pub const V57: Self

2023-01-25: Client understands CapabilityBindToInterfaceByRoute

Source

pub const V58: Self

2023-03-10: Client retries lite map updates before restarting map poll.

Source

pub const V59: Self

2023-03-16: Client understands Peers[].SelfNodeV4MasqAddrForThisPeer

Source

pub const V60: Self

2023-04-06: Client understands IsWireGuardOnly

Source

pub const V61: Self

2023-04-18: Client understand SSHAction.SSHRecorderFailureAction

Source

pub const V62: Self

2023-05-05: Client can notify control over noise for SSHEventNotificationRequest recording failure events

Source

pub const V63: Self

2023-06-08: Client understands SSHAction.AllowRemotePortForwarding.

Source

pub const V64: Self

2023-07-11: Client understands s/CapabilityTailnetLockAlpha/CapabilityTailnetLock

Source

pub const V65: Self

2023-07-12: Client understands DERPMap.HomeParams + incremental DERPMap updates with params

Source

pub const V66: Self

2023-07-23: UserProfile.Groups added (available via WhoIs) (removed in 87)

Source

pub const V67: Self

2023-07-25: Client understands PeerCapMap

Source

pub const V68: Self

2023-08-09: Client has dedicated updateRoutine; MapRequest.Stream true means ignore Hostinfo+Endpoints

Source

pub const V69: Self

2023-08-16: removed Debug.LogHeap* + GoroutineDumpURL; added c2n /debug/logheap

Source

pub const V70: Self

2023-08-16: removed most Debug fields; added NodeAttrDisable*, NodeAttrDebug* instead

Source

pub const V71: Self

2023-08-17: added NodeAttrOneCGNATEnable, NodeAttrOneCGNATDisable

Source

pub const V72: Self

2023-08-23: TS-2023-006 UPnP issue fixed; UPnP can now be used again

Source

pub const V73: Self

2023-09-01: Non-Windows clients expect to receive ClientVersion

Source

pub const V74: Self

2023-09-18: Client understands NodeCapMap

Source

pub const V75: Self

2023-09-12: Client understands NodeAttrDNSForwarderDisableTCPRetries

Source

pub const V76: Self

2023-09-20: Client understands ExitNodeDNSResolvers for IsWireGuardOnly nodes

Source

pub const V77: Self

2023-10-03: Client understands Peers[].SelfNodeV6MasqAddrForThisPeer

Source

pub const V78: Self

2023-10-05: can handle c2n Wake-on-LAN sending

Source

pub const V79: Self

2023-10-05: Client understands UrgentSecurityUpdate in ClientVersion

Source

pub const V80: Self

2023-11-16: can handle c2n GET /tls-cert-status

Source

pub const V81: Self

2023-11-17: MapResponse.PacketFilters (incremental packet filter updates)

Source

pub const V82: Self

2023-12-01: Client understands NodeAttrLinuxMustUseIPTables, NodeAttrLinuxMustUseNfTables, c2n /netfilter-kind

Source

pub const V83: Self

2023-12-18: Client understands DefaultAutoUpdate

Source

pub const V84: Self

2024-01-04: Client understands SeamlessKeyRenewal

Source

pub const V85: Self

2024-01-05: Client understands MaxKeyDuration

Source

pub const V86: Self

2024-01-23: Client understands NodeAttrProbeUDPLifetime

Source

pub const V87: Self

2024-02-11: UserProfile.Groups removed (added in 66)

Source

pub const V88: Self

2024-03-05: Client understands NodeAttrSuggestExitNode

Source

pub const V89: Self

2024-03-23: Client no longer respects deleted PeerChange.Capabilities (use CapMap)

Source

pub const V90: Self

2024-04-03: Client understands PeerCapabilityTaildrive.

Source

pub const V91: Self

2024-04-24: Client understands PeerCapabilityTaildriveSharer.

Source

pub const V92: Self

2024-05-06: Client understands NodeAttrUserDialUseRoutes.

Source

pub const V93: Self

2024-05-06: added support for stateful firewalling.

Source

pub const V94: Self

2024-05-06: Client understands Node.IsJailed.

Source

pub const V95: Self

2024-05-06: Client uses NodeAttrUserDialUseRoutes to change DNS dialing behavior.

Source

pub const V96: Self

2024-05-29: Client understands NodeAttrSSHBehaviorV1

Source

pub const V97: Self

2024-06-06: Client understands NodeAttrDisableSplitDNSWhenNoCustomResolvers

Source

pub const V98: Self

2024-06-13: iOS/tvOS clients may provide serial number as part of posture information

Source

pub const V99: Self

2024-06-14: Client understands NodeAttrDisableLocalDNSOverrideViaNRPT

Source

pub const V100: Self

2024-06-18: Initial support for filtertype.Match.SrcCaps - actually usable in capver 109 (issue #12542)

Source

pub const V101: Self

2024-07-01: Client supports SSH agent forwarding when handling connections with /bin/su

Source

pub const V102: Self

2024-07-12: NodeAttrDisableMagicSockCryptoRouting support

Source

pub const V103: Self

2024-07-24: Client supports NodeAttrDisableCaptivePortalDetection

Source

pub const V104: Self

2024-08-03: SelfNodeV6MasqAddrForThisPeer now works

Source

pub const V105: Self

2024-08-05: Fixed SSH behavior on systems that use busybox (issue #12849)

Source

pub const V106: Self

2024-09-03: fix panic regression from cryptokey routing change (65fe0ba7b5)

Source

pub const V107: Self

2024-10-30: add App Connector to conffile (PR #13942)

Source

pub const V108: Self

2024-11-08: Client sends ServicesHash in Hostinfo, understands c2n GET /vip-services.

Source

pub const V109: Self

2024-11-18: Client supports filtertype.Match.SrcCaps (issue #12542)

Source

pub const V110: Self

2024-12-12: removed never-before-used Tailscale SSH public key support (#14373)

Source

pub const V111: Self

2025-01-14: Client supports a peer having Node.HomeDERP (issue #14636)

Source

pub const V112: Self

2025-01-14: Client interprets AllowedIPs of nil as meaning same as Addresses

Source

pub const V113: Self

2025-01-20: Client communicates to control whether funnel is enabled by sending Hostinfo.IngressEnabled (#14688)

Source

pub const V114: Self

2025-01-30: NodeAttrMaxKeyDuration CapMap defined, clients might use it (no tailscaled code change) (#14829)

Source

pub const V115: Self

2025-03-07: Client understands DERPRegion.NoMeasureNoHome.

Source

pub const V116: Self

2025-05-05: Client serves MagicDNS “AAAA” if NodeAttrMagicDNSPeerAAAA set on self node

Source

pub const V117: Self

2025-05-28: Client understands DisplayMessages (structured health messages), but not necessarily PrimaryAction.

Source

pub const V118: Self

2025-07-01: Client sends Hostinfo.StateEncrypted to report whether the state file is encrypted at rest (#15830)

Source

pub const V119: Self

2025-07-10: Client uses Hostinfo.Location.Priority to prioritize one route over another.

Source

pub const V120: Self

2025-07-15: Client understands peer relay disco messages, and implements peer client and relay server functions

Source

pub const V121: Self

2025-07-19: Client understands peer relay endpoint alloc with disco.AllocateUDPRelayEndpointRequest & disco.AllocateUDPRelayEndpointResponse

Source

pub const V122: Self

2025-07-21: Client sends Hostinfo.ExitNodeID to report which exit node it has selected, if any.

Source

pub const V123: Self

2025-07-28: fix deadlock regression from cryptokey routing change (issue #16651)

Source

pub const V124: Self

2025-08-08: removed NodeAttrDisableMagicSockCryptoRouting support, crypto routing is now mandatory

Source

pub const V125: Self

2025-08-11: dnstype.Resolver adds UseWithExitNode field.

Source

pub const V126: Self

2025-09-17: Client uses seamless key renewal unless disabled by control (tailscale/corp#31479)

Source

pub const V127: Self

2025-09-19: can handle C2N /debug/netmap.

Source

pub const V128: Self

2025-10-02: can handle C2N /debug/health.

Source

pub const V129: Self

2025-10-04: Fixed sleep/wake deadlock in magicsock when using peer relay (PR #17449)

Source

pub const V130: Self

2025-10-06: client can send key.HardwareAttestationPublic and key.HardwareAttestationKeySignature in MapRequest

Source

pub const V131: Self

2025-11-25: client respects NodeAttrDefaultAutoUpdate

Source

pub const V132: Self

2026-02-13: client respects NodeAttrDisableHostsFileUpdates

Source

pub const V133: Self

2026-02-17: client understands NodeAttrForceRegisterMagicDNSIPv4Only; MagicDNS IPv6 registered w/ OS by default

Source

pub const CURRENT: Self = Self::V130

The current capability version of this Tailscale node.

Source

pub const fn new(value: u16) -> Option<Self>

Create a new CapabilityVersion instance from a u16. Note that the versions 0, 1, 2, and 35 are undefined and will result in an error.

Trait Implementations§

Source§

impl Clone for CapabilityVersion

Source§

fn clone(&self) -> CapabilityVersion

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for CapabilityVersion

Source§

impl Debug for CapabilityVersion

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CapabilityVersion

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Display for CapabilityVersion

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for CapabilityVersion

Source§

impl From<CapabilityVersion> for u16

Convert CapabilityVersion into a native-endian u16; little-endian on x86_64.

Source§

fn from(value: CapabilityVersion) -> Self

Converts to this type from the input type.
Source§

impl Hash for CapabilityVersion

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for CapabilityVersion

Source§

fn cmp(&self, other: &CapabilityVersion) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for CapabilityVersion

Source§

fn eq(&self, other: &CapabilityVersion) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for CapabilityVersion

Source§

fn partial_cmp(&self, other: &CapabilityVersion) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for CapabilityVersion

Source§

impl TryFrom<u16> for CapabilityVersion

Source§

type Error = ()

The type returned in the event of a conversion error.
Source§

fn try_from(value: u16) -> Result<Self, Self::Error>

Performs the conversion.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.