Documentation ¶
Overview ¶
Package netstack wires up gVisor's netstack into Tailscale.
Index ¶
- type Impl
- func (ns *Impl) Close() error
- func (ns *Impl) DialContextTCP(ctx context.Context, ipp netip.AddrPort) (*gonet.TCPConn, error)
- func (ns *Impl) DialContextUDP(ctx context.Context, ipp netip.AddrPort) (*gonet.UDPConn, error)
- func (ns *Impl) ExpVar() expvar.Var
- func (ns *Impl) ListenPacket(network, address string) (net.PacketConn, error)
- func (ns *Impl) Start(lb *ipnlocal.LocalBackend) error
- func (ns *Impl) UpdateNetstackIPs(nm *netmap.NetworkMap)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Impl ¶
type Impl struct { // GetTCPHandlerForFlow conditionally handles an incoming TCP flow for the // provided (src/port, dst/port) 4-tuple. // // A nil value is equivalent to a func returning (nil, false). // // If func returns intercept=false, the default forwarding behavior (if // ProcessLocalIPs and/or ProcesssSubnetIPs) takes place. // // When intercept=true, the behavior depends on whether the returned handler // is non-nil: if nil, the connection is rejected. If non-nil, handler takes // over the TCP conn. GetTCPHandlerForFlow func(src, dst netip.AddrPort) (handler func(net.Conn), intercept bool) // GetUDPHandlerForFlow conditionally handles an incoming UDP flow for the // provided (src/port, dst/port) 4-tuple. // // A nil value is equivalent to a func returning (nil, false). // // If func returns intercept=false, the default forwarding behavior (if // ProcessLocalIPs and/or ProcesssSubnetIPs) takes place. // // When intercept=true, the behavior depends on whether the returned handler // is non-nil: if nil, the connection is rejected. If non-nil, handler takes // over the UDP flow. GetUDPHandlerForFlow func(src, dst netip.AddrPort) (handler func(nettype.ConnPacketConn), intercept bool) // ProcessLocalIPs is whether netstack should handle incoming // traffic directed at the Node.Addresses (local IPs). // It can only be set before calling Start. ProcessLocalIPs bool // ProcessSubnets is whether netstack should handle incoming // traffic destined to non-local IPs (i.e. whether it should // be a subnet router). // It can only be set before calling Start. ProcessSubnets bool // contains filtered or unexported fields }
Impl contains the state for the netstack implementation, and implements wgengine.FakeImpl to act as a userspace network stack when Tailscale is running in fake mode.
func Create ¶ added in v1.6.0
func Create(logf logger.Logf, tundev *tstun.Wrapper, e wgengine.Engine, mc *magicsock.Conn, dialer *tsdial.Dialer, dns *dns.Manager, pm *proxymap.Mapper) (*Impl, error)
Create creates and populates a new Impl.
func (*Impl) DialContextTCP ¶ added in v1.6.0
func (*Impl) DialContextUDP ¶ added in v1.10.0
func (*Impl) ExpVar ¶ added in v1.60.0
ExpVar returns an expvar variable suitable for registering with expvar.Publish.
func (*Impl) ListenPacket ¶ added in v1.68.0
func (ns *Impl) ListenPacket(network, address string) (net.PacketConn, error)
ListenPacket listens for incoming packets for the given network and address. Address must be of the form "ip:port" or "[ip]:port".
As of 2024-05-18, only udp4 and udp6 are supported.
func (*Impl) Start ¶ added in v1.6.0
func (ns *Impl) Start(lb *ipnlocal.LocalBackend) error
Start sets up all the handlers so netstack can start working. Implements wgengine.FakeImpl.
func (*Impl) UpdateNetstackIPs ¶ added in v1.50.0
func (ns *Impl) UpdateNetstackIPs(nm *netmap.NetworkMap)
UpdateNetstackIPs updates the set of local IPs that netstack should handle from nm.
TODO(bradfitz): don't pass the whole netmap here; just pass the two address slice views.