Documentation ¶
Index ¶
- Constants
- type CapType
- type Capability
- type CapabilityID
- type Group
- type GroupID
- type Hostinfo
- type ID
- type Login
- type LoginID
- type MachineKey
- type MachineStatus
- type MapRequest
- type MapResponse
- type NetInfo
- type Node
- type NodeID
- type NodeKey
- type RegisterRequest
- type RegisterResponse
- type Role
- type RoleID
- type Service
- type ServiceProto
- type User
- type UserID
- type UserProfile
Constants ¶
const ( CapRead = CapType("read") CapWrite = CapType("write") )
const ( MachineUnknown = MachineStatus(iota) MachineAuthorized // server has approved MachineInvalid // server has explicitly rejected this machine key )
const ( TCP = ServiceProto("tcp") UDP = ServiceProto("udp") )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Capability ¶
type Capability struct { ID CapabilityID Type CapType Val ID }
type CapabilityID ¶
type CapabilityID ID
func (CapabilityID) String ¶
func (id CapabilityID) String() string
type Hostinfo ¶
type Hostinfo struct { // TODO(crawshaw): mark all these fields ",omitempty" when all the // iOS apps are updated with the latest swift version of this struct. IPNVersion string // version of this code FrontendLogID string // logtail ID of frontend instance BackendLogID string // logtail ID of backend instance OS string // operating system the client runs on Hostname string // name of the host the client runs on RoutableIPs []wgcfg.CIDR `json:",omitempty"` // set of IP ranges this client can route Services []Service `json:",omitempty"` // services advertised by this machine NetInfo *NetInfo `json:",omitempty"` }
Hostinfo contains a summary of a Tailscale host.
Because it contains pointers (slices), this type should not be used as a value type.
type MachineKey ¶
type MachineKey [32]byte
MachineKey is the curve25519 public key for a machine.
func (MachineKey) MarshalText ¶
func (k MachineKey) MarshalText() ([]byte, error)
func (MachineKey) String ¶
func (k MachineKey) String() string
func (*MachineKey) UnmarshalText ¶
func (k *MachineKey) UnmarshalText(text []byte) error
type MachineStatus ¶
type MachineStatus int
func (MachineStatus) MarshalText ¶
func (m MachineStatus) MarshalText() ([]byte, error)
func (MachineStatus) String ¶
func (m MachineStatus) String() string
func (*MachineStatus) UnmarshalText ¶
func (m *MachineStatus) UnmarshalText(b []byte) error
type MapRequest ¶
type MapRequest struct { Version int // current version is 4 Compress string // "zstd" or "" (no compression) KeepAlive bool // server sends keep-alives NodeKey NodeKey Endpoints []string Stream bool // if true, multiple MapResponse objects are returned Hostinfo *Hostinfo }
MapRequest is sent by a client to start a long-poll network map updates. The request includes a copy of the client's current set of WireGuard endpoints and general host information.
The request is encoded to JSON, encrypted with golang.org/x/crypto/nacl/box, using the local machine key, and sent to:
https://login.tailscale.com/machine/<mkey hex>/map
type MapResponse ¶
type NetInfo ¶
type NetInfo struct { // MappingVariesByDestIP says whether the host's NAT mappings // vary based on the destination IP. MappingVariesByDestIP opt.Bool // HairPinning is their router does hairpinning. // It reports true even if there's no NAT involved. HairPinning opt.Bool // WorkingIPv6 is whether IPv6 works. WorkingIPv6 opt.Bool // WorkingUDP is whether UDP works. WorkingUDP opt.Bool // PreferredDERP is this node's preferred DERP server // for incoming traffic. The node might be be temporarily // connected to multiple DERP servers (to send to other nodes) // but PreferredDERP is the instance number that the node // subscribes to traffic at. // Zero means disconnected or unknown. PreferredDERP int // LinkType is the current link type, if known. LinkType string // "wired", "wifi", "mobile" (LTE, 4G, 3G, etc) // DERPLatency is the fastest recent time to reach various // DERP STUN servers, in seconds. The map key is the DERP // server's STUN host:port. // // This should only be updated rarely, or when there's a // material change, as any change here also gets uploaded to // the control plane. DERPLatency map[string]float64 `json:",omitempty"` }
NetInfo contains information about the host's network state.
func (*NetInfo) BasicallyEqual ¶
BasicallyEqual reports whether ni and ni2 are basically equal, ignoring changes in DERPLatency.
type Node ¶
type Node struct { ID NodeID Name string // DNS User UserID Key NodeKey KeyExpiry time.Time Machine MachineKey Addresses []wgcfg.CIDR // IP addresses of this Node directly AllowedIPs []wgcfg.CIDR // range of IP addresses to route to this node Endpoints []string `json:",omitempty"` // IP+port (public via STUN, and local LANs) DERP string `json:",omitempty"` // DERP-in-IP:port ("127.3.3.40:N") endpoint Hostinfo Hostinfo Created time.Time LastSeen *time.Time `json:",omitempty"` KeepAlive bool // open and keep open a connection to this peer MachineAuthorized bool // TODO(crawshaw): replace with MachineStatus }
type NodeKey ¶
type NodeKey [32]byte
MachineKey is the curve25519 public key for a node.
func (NodeKey) AbbrevString ¶
func (NodeKey) MarshalText ¶
func (*NodeKey) UnmarshalText ¶
type RegisterRequest ¶
type RegisterRequest struct { Version int // currently 1 NodeKey NodeKey OldNodeKey NodeKey Auth struct { Provider string LoginName string // One of LoginName or Oauth2Token is set. Oauth2Token *oauth2.Token } Expiry time.Time // requested key expiry, server policy may override Followup string // response waits until AuthURL is visited Hostinfo *Hostinfo }
RegisterRequest is sent by a client to register the key for a node. It is encoded to JSON, encrypted with golang.org/x/crypto/nacl/box, using the local machine key, and sent to:
https://login.tailscale.com/machine/<mkey hex>
func (*RegisterRequest) Clone ¶
func (req *RegisterRequest) Clone() *RegisterRequest
Clone makes a deep copy of RegisterRequest. The result aliases no memory with the original.
type RegisterResponse ¶
type RegisterResponse struct { User User Login Login NodeKeyExpired bool // if true, the NodeKey needs to be replaced MachineAuthorized bool // TODO(crawshaw): move to using MachineStatus AuthURL string // if set, authorization pending }
RegisterResponse is returned by the server in response to a RegisterRequest.
type Role ¶
type Role struct { ID RoleID Name string Capabilities []CapabilityID }
type Service ¶
type Service struct { Proto ServiceProto // TCP or UDP Port uint16 // port number service is listening on Description string // text description of service }
type ServiceProto ¶
type ServiceProto string
type User ¶
type User struct { ID UserID LoginName string `json:"-"` // not stored, filled from Login // TODO REMOVE DisplayName string // if non-empty overrides Login field ProfilePicURL string // if non-empty overrides Login field Domain string Logins []LoginID Roles []RoleID Created time.Time }
User is an IPN user.
A user can have multiple logins associated with it (e.g. gmail and github oauth). (Note: none of our UIs support this yet.)
Some properties are inhereted from the logins and can be overridden, such as display name and profile picture.
Other properties must be the same for all logins associated with a user. In particular: domain. If a user has a "tailscale.io" domain login, they cannot have a general gmail address login associated with the user.
type UserProfile ¶
type UserProfile struct { ID UserID LoginName string // for display purposes only (provider is not listed) DisplayName string ProfilePicURL string Roles []RoleID }
A UserProfile is display-friendly data for a user. It includes the LoginName for display purposes but *not* the Provider. It also includes derived data from one of the user's logins.