mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 16:22:03 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			49 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 = errors.New("buffer too small")
 | |
| 	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 header after marshaling.
 | |
| 	Len() int
 | |
| 	// Marshal serializes the header into buf in wire format.
 | |
| 	// It clobbers the header region, which is the first h.Length() bytes of buf.
 | |
| 	// It explicitly initializes every byte of the header region,
 | |
| 	// so pre-zeroing it on reuse is not required. It does not allocate memory.
 | |
| 	// It fails if and only if len(buf) < Length().
 | |
| 	Marshal(buf []byte) error
 | |
| 	// ToResponse transforms the header into one for a response packet.
 | |
| 	// For instance, this swaps the source and destination IPs.
 | |
| 	ToResponse()
 | |
| }
 | |
| 
 | |
| // Generate generates a new packet with the given header and payload.
 | |
| // Unlike Header.Marshal, this does allocate memory.
 | |
| 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
 | |
| }
 |