mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-30 05:25:35 +00: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
|
||
|
}
|