mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 00:01:40 +01:00 
			
		
		
		
	We had the debug packet capture code + Lua dissector in the CLI + the iOS app. Now we don't, with tests to lock it in. As a bonus, tailscale.com/net/packet and tailscale.com/net/flowtrack no longer appear in the CLI's binary either. A new build tag ts_omit_capture disables the packet capture code and was added to build_dist.sh's --extra-small mode. Updates #12614 Change-Id: I79b0628c0d59911bd4d510c732284d97b0160f10 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright (c) Tailscale Inc & AUTHORS
 | |
| // SPDX-License-Identifier: BSD-3-Clause
 | |
| 
 | |
| package packet
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"net/netip"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| // Callback describes a function which is called to
 | |
| // record packets when debugging packet-capture.
 | |
| // Such callbacks must not take ownership of the
 | |
| // provided data slice: it may only copy out of it
 | |
| // within the lifetime of the function.
 | |
| type CaptureCallback func(CapturePath, time.Time, []byte, CaptureMeta)
 | |
| 
 | |
| // CaptureSink is the minimal interface from [tailscale.com/feature/capture]'s
 | |
| // Sink type that is needed by the core (magicsock/LocalBackend/wgengine/etc).
 | |
| // This lets the relativel heavy feature/capture package be optionally linked.
 | |
| type CaptureSink interface {
 | |
| 	// Close closes
 | |
| 	Close() error
 | |
| 
 | |
| 	// NumOutputs returns the number of outputs registered with the sink.
 | |
| 	NumOutputs() int
 | |
| 
 | |
| 	// CaptureCallback returns a callback which can be used to
 | |
| 	// write packets to the sink.
 | |
| 	CaptureCallback() CaptureCallback
 | |
| 
 | |
| 	// WaitCh returns a channel which blocks until
 | |
| 	// the sink is closed.
 | |
| 	WaitCh() <-chan struct{}
 | |
| 
 | |
| 	// RegisterOutput connects an output to this sink, which
 | |
| 	// will be written to with a pcap stream as packets are logged.
 | |
| 	// A function is returned which unregisters the output when
 | |
| 	// called.
 | |
| 	//
 | |
| 	// If w implements io.Closer, it will be closed upon error
 | |
| 	// or when the sink is closed. If w implements http.Flusher,
 | |
| 	// it will be flushed periodically.
 | |
| 	RegisterOutput(w io.Writer) (unregister func())
 | |
| }
 | |
| 
 | |
| // CaptureMeta contains metadata that is used when debugging.
 | |
| type CaptureMeta struct {
 | |
| 	DidSNAT     bool           // SNAT was performed & the address was updated.
 | |
| 	OriginalSrc netip.AddrPort // The source address before SNAT was performed.
 | |
| 	DidDNAT     bool           // DNAT was performed & the address was updated.
 | |
| 	OriginalDst netip.AddrPort // The destination address before DNAT was performed.
 | |
| }
 | |
| 
 | |
| // CapturePath describes where in the data path the packet was captured.
 | |
| type CapturePath uint8
 | |
| 
 | |
| // CapturePath values
 | |
| const (
 | |
| 	// FromLocal indicates the packet was logged as it traversed the FromLocal path:
 | |
| 	// i.e.: A packet from the local system into the TUN.
 | |
| 	FromLocal CapturePath = 0
 | |
| 	// FromPeer indicates the packet was logged upon reception from a remote peer.
 | |
| 	FromPeer CapturePath = 1
 | |
| 	// SynthesizedToLocal indicates the packet was generated from within tailscaled,
 | |
| 	// and is being routed to the local machine's network stack.
 | |
| 	SynthesizedToLocal CapturePath = 2
 | |
| 	// SynthesizedToPeer indicates the packet was generated from within tailscaled,
 | |
| 	// and is being routed to a remote Wireguard peer.
 | |
| 	SynthesizedToPeer CapturePath = 3
 | |
| 
 | |
| 	// PathDisco indicates the packet is information about a disco frame.
 | |
| 	PathDisco CapturePath = 254
 | |
| )
 |