mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 13:05:22 +00:00 
			
		
		
		
	 b560386c1a
			
		
	
	b560386c1a
	
	
	
		
			
			This adds a new IP Protocol type, TSMP on protocol number 99 for sending inter-tailscale messages over WireGuard, currently just for why a peer rejects TCP SYNs (ACL rejection, shields up, and in the future: nothing listening, something listening on that port but wrong interface, etc) Updates #1094 Updates tailscale/corp#1185 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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 packet
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"math"
 | |
| )
 | |
| 
 | |
| const tcpHeaderLength = 20
 | |
| 
 | |
| // maxPacketLength is the largest length that all headers support.
 | |
| // IPv4 headers using uint16 for this forces an upper bound of 64KB.
 | |
| const maxPacketLength = math.MaxUint16
 | |
| 
 | |
| var (
 | |
| 	// errSmallBuffer is returned when Marshal receives a buffer
 | |
| 	// too small to contain the header to marshal.
 | |
| 	errSmallBuffer = errors.New("buffer too small")
 | |
| 	// errLargePacket is returned when Marshal receives a payload
 | |
| 	// larger than the maximum representable size in header
 | |
| 	// fields.
 | |
| 	errLargePacket = errors.New("packet too large")
 | |
| )
 | |
| 
 | |
| // Header is a packet header capable of marshaling itself into a byte
 | |
| // buffer.
 | |
| type Header interface {
 | |
| 	// Len returns the length of the marshaled packet.
 | |
| 	Len() int
 | |
| 	// Marshal serializes the header into buf, which must be at
 | |
| 	// least Len() bytes long. Implementations of Marshal assume
 | |
| 	// that bytes after the first Len() are payload bytes for the
 | |
| 	// purpose of computing length and checksum fields. Marshal
 | |
| 	// implementations must not allocate memory.
 | |
| 	Marshal(buf []byte) error
 | |
| }
 | |
| 
 | |
| // Generate generates a new packet with the given Header and
 | |
| // payload. This function allocates memory, see Header.Marshal for an
 | |
| // allocation-free option.
 | |
| func Generate(h Header, payload []byte) []byte {
 | |
| 	hlen := h.Len()
 | |
| 	buf := make([]byte, hlen+len(payload))
 | |
| 
 | |
| 	copy(buf[hlen:], payload)
 | |
| 	h.Marshal(buf)
 | |
| 
 | |
| 	return buf
 | |
| }
 |