2020-02-05 22:16:58 +00:00
|
|
|
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package wgengine
|
|
|
|
|
|
|
|
import (
|
2020-04-10 15:42:34 +00:00
|
|
|
"errors"
|
2020-02-05 22:16:58 +00:00
|
|
|
|
2020-08-09 21:49:42 +00:00
|
|
|
"inet.af/netaddr"
|
2020-03-26 05:57:46 +00:00
|
|
|
"tailscale.com/ipn/ipnstate"
|
2020-02-05 22:16:58 +00:00
|
|
|
"tailscale.com/tailcfg"
|
2021-02-05 23:44:46 +00:00
|
|
|
"tailscale.com/types/netmap"
|
2020-02-05 22:16:58 +00:00
|
|
|
"tailscale.com/wgengine/filter"
|
2021-03-01 20:56:03 +00:00
|
|
|
"tailscale.com/wgengine/monitor"
|
2020-05-11 21:02:12 +00:00
|
|
|
"tailscale.com/wgengine/router"
|
2020-06-08 22:19:26 +00:00
|
|
|
"tailscale.com/wgengine/tsdns"
|
2021-01-29 20:16:36 +00:00
|
|
|
"tailscale.com/wgengine/wgcfg"
|
2020-02-05 22:16:58 +00:00
|
|
|
)
|
|
|
|
|
2020-02-11 23:21:24 +00:00
|
|
|
// Status is the Engine status.
|
2020-03-26 05:57:46 +00:00
|
|
|
//
|
|
|
|
// TODO(bradfitz): remove this, subset of ipnstate? Need to migrate users.
|
2020-02-05 22:16:58 +00:00
|
|
|
type Status struct {
|
2021-02-04 21:12:42 +00:00
|
|
|
Peers []ipnstate.PeerStatusLite
|
2021-01-14 01:10:41 +00:00
|
|
|
LocalAddrs []string // the set of possible endpoints for the magic conn
|
2020-03-19 06:55:14 +00:00
|
|
|
DERPs int // number of active DERP connections
|
2020-02-05 22:16:58 +00:00
|
|
|
}
|
|
|
|
|
2020-02-11 23:21:24 +00:00
|
|
|
// StatusCallback is the type of status callbacks used by
|
|
|
|
// Engine.SetStatusCallback.
|
|
|
|
//
|
|
|
|
// Exactly one of Status or error is non-nil.
|
|
|
|
type StatusCallback func(*Status, error)
|
2020-02-05 22:16:58 +00:00
|
|
|
|
2020-03-04 06:21:56 +00:00
|
|
|
// NetInfoCallback is the type used by Engine.SetNetInfoCallback.
|
|
|
|
type NetInfoCallback func(*tailcfg.NetInfo)
|
|
|
|
|
2021-01-15 14:16:28 +00:00
|
|
|
// NetworkMapCallback is the type used by callbacks that hook
|
|
|
|
// into network map updates.
|
2021-02-05 23:44:46 +00:00
|
|
|
type NetworkMapCallback func(*netmap.NetworkMap)
|
2021-01-15 14:16:28 +00:00
|
|
|
|
|
|
|
// someHandle is allocated so its pointer address acts as a unique
|
|
|
|
// map key handle. (It needs to have non-zero size for Go to guarantee
|
|
|
|
// the pointer is unique.)
|
|
|
|
type someHandle struct{ _ byte }
|
|
|
|
|
2020-04-10 15:42:34 +00:00
|
|
|
// ErrNoChanges is returned by Engine.Reconfig if no changes were made.
|
|
|
|
var ErrNoChanges = errors.New("no changes made to Engine config")
|
|
|
|
|
2020-02-11 23:21:24 +00:00
|
|
|
// Engine is the Tailscale WireGuard engine interface.
|
2020-02-05 22:16:58 +00:00
|
|
|
type Engine interface {
|
2020-02-11 23:21:24 +00:00
|
|
|
// Reconfig reconfigures WireGuard and makes sure it's running.
|
2020-02-05 22:16:58 +00:00
|
|
|
// This also handles setting up any kernel routes.
|
2020-02-11 23:21:24 +00:00
|
|
|
//
|
2020-06-24 21:10:42 +00:00
|
|
|
// This is called whenever tailcontrol (the control plane)
|
2020-02-11 23:21:24 +00:00
|
|
|
// sends an updated network map.
|
2020-04-10 15:42:34 +00:00
|
|
|
//
|
|
|
|
// The returned error is ErrNoChanges if no changes were made.
|
2020-05-12 07:08:52 +00:00
|
|
|
Reconfig(*wgcfg.Config, *router.Config) error
|
2020-02-11 23:21:24 +00:00
|
|
|
|
2020-03-25 15:40:36 +00:00
|
|
|
// GetFilter returns the current packet filter, if any.
|
2020-03-25 07:47:55 +00:00
|
|
|
GetFilter() *filter.Filter
|
|
|
|
|
2020-02-11 23:21:24 +00:00
|
|
|
// SetFilter updates the packet filter.
|
|
|
|
SetFilter(*filter.Filter)
|
|
|
|
|
2020-06-08 22:19:26 +00:00
|
|
|
// SetDNSMap updates the DNS map.
|
|
|
|
SetDNSMap(*tsdns.Map)
|
|
|
|
|
2020-02-11 23:21:24 +00:00
|
|
|
// SetStatusCallback sets the function to call when the
|
|
|
|
// WireGuard status changes.
|
|
|
|
SetStatusCallback(StatusCallback)
|
|
|
|
|
2021-03-01 20:56:03 +00:00
|
|
|
// GetLinkMonitor returns the link monitor.
|
|
|
|
GetLinkMonitor() *monitor.Mon
|
|
|
|
|
2020-02-11 23:21:24 +00:00
|
|
|
// RequestStatus requests a WireGuard status update right
|
|
|
|
// away, sent to the callback registered via SetStatusCallback.
|
2020-02-05 22:16:58 +00:00
|
|
|
RequestStatus()
|
2020-02-11 23:21:24 +00:00
|
|
|
|
|
|
|
// Close shuts down this wireguard instance, remove any routes
|
|
|
|
// it added, etc. To bring it up again later, you'll need a
|
|
|
|
// new Engine.
|
2020-02-05 22:16:58 +00:00
|
|
|
Close()
|
2020-02-11 23:21:24 +00:00
|
|
|
|
|
|
|
// Wait waits until the Engine's Close method is called or the
|
|
|
|
// engine aborts with an error. You don't have to call this.
|
|
|
|
// TODO: return an error?
|
2020-02-05 22:16:58 +00:00
|
|
|
Wait()
|
2020-02-11 23:21:24 +00:00
|
|
|
|
2020-05-17 16:51:38 +00:00
|
|
|
// SetDERPMap controls which (if any) DERP servers are used.
|
|
|
|
// If nil, DERP is disabled. It starts disabled until a DERP map
|
|
|
|
// is configured.
|
|
|
|
SetDERPMap(*tailcfg.DERPMap)
|
2020-03-04 20:21:40 +00:00
|
|
|
|
2020-06-25 18:04:52 +00:00
|
|
|
// SetNetworkMap informs the engine of the latest network map
|
|
|
|
// from the server. The network map's DERPMap field should be
|
|
|
|
// ignored as as it might be disabled; get it from SetDERPMap
|
|
|
|
// instead.
|
|
|
|
// The network map should only be read from.
|
2021-02-05 23:44:46 +00:00
|
|
|
SetNetworkMap(*netmap.NetworkMap)
|
2020-06-25 18:04:52 +00:00
|
|
|
|
2021-01-15 14:16:28 +00:00
|
|
|
// AddNetworkMapCallback adds a function to a list of callbacks
|
|
|
|
// that are called when the network map updates. It returns a
|
|
|
|
// function that when called would remove the function from the
|
|
|
|
// list of callbacks.
|
|
|
|
AddNetworkMapCallback(NetworkMapCallback) (removeCallback func())
|
|
|
|
|
2020-03-04 06:21:56 +00:00
|
|
|
// SetNetInfoCallback sets the function to call when a
|
|
|
|
// new NetInfo summary is available.
|
|
|
|
SetNetInfoCallback(NetInfoCallback)
|
2020-03-26 05:57:46 +00:00
|
|
|
|
2020-07-06 19:10:39 +00:00
|
|
|
// DiscoPublicKey gets the public key used for path discovery
|
2020-06-19 19:06:49 +00:00
|
|
|
// messages.
|
2020-07-06 19:10:39 +00:00
|
|
|
DiscoPublicKey() tailcfg.DiscoKey
|
2020-06-19 19:06:49 +00:00
|
|
|
|
2020-03-26 05:57:46 +00:00
|
|
|
// UpdateStatus populates the network state using the provided
|
|
|
|
// status builder.
|
|
|
|
UpdateStatus(*ipnstate.StatusBuilder)
|
2020-08-09 21:49:42 +00:00
|
|
|
|
|
|
|
// Ping is a request to start a discovery ping with the peer handling
|
|
|
|
// the given IP and then call cb with its ping latency & method.
|
|
|
|
Ping(ip netaddr.IP, cb func(*ipnstate.PingResult))
|
2020-02-05 22:16:58 +00:00
|
|
|
}
|