net/packet: documentation cleanups.

Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
David Anderson 2020-11-10 21:12:46 -08:00
parent 9ef39af2f2
commit d7ee3096dd
2 changed files with 21 additions and 15 deletions

View File

@ -16,27 +16,34 @@
const maxPacketLength = math.MaxUint16 const maxPacketLength = math.MaxUint16
var ( var (
// errSmallBuffer is returned when Marshal receives a buffer
// too small to contain the header to marshal.
errSmallBuffer = errors.New("buffer too small") 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") errLargePacket = errors.New("packet too large")
) )
// Header is a packet header capable of marshaling itself into a byte buffer. // Header is a packet header capable of marshaling itself into a byte
// buffer.
type Header interface { type Header interface {
// Len returns the length of the header after marshaling. // Len returns the length of the marshaled packet.
Len() int Len() int
// Marshal serializes the header into buf in wire format. // Marshal serializes the header into buf, which must be at
// It clobbers the header region, which is the first h.Length() bytes of buf. // least Len() bytes long. Implementations of Marshal assume
// It explicitly initializes every byte of the header region, // that bytes after the first Len() are payload bytes for the
// so pre-zeroing it on reuse is not required. It does not allocate memory. // purpose of computing length and checksum fields. Marshal
// It fails if and only if len(buf) < Length(). // implementations must not allocate memory.
Marshal(buf []byte) error Marshal(buf []byte) error
// ToResponse transforms the header into one for a response packet. // ToResponse transforms the header into one for a response packet.
// For instance, this swaps the source and destination IPs. // For instance, this swaps the source and destination IPs.
ToResponse() ToResponse()
} }
// Generate generates a new packet with the given header and payload. // Generate generates a new packet with the given Header and
// Unlike Header.Marshal, this does allocate memory. // payload. This function allocates memory, see Header.Marshal for an
// allocation-free option.
func Generate(h Header, payload []byte) []byte { func Generate(h Header, payload []byte) []byte {
hlen := h.Len() hlen := h.Len()
buf := make([]byte, hlen+len(payload)) buf := make([]byte, hlen+len(payload))

View File

@ -14,17 +14,17 @@ type UDP4Header struct {
} }
const ( const (
// udpHeaderLength is the size of the UDP packet header, not
// including the outer IP header.
udpHeaderLength = 8 udpHeaderLength = 8
// udpTotalHeaderLength is the length of all headers in a UDP packet.
udpTotalHeaderLength = ip4HeaderLength + udpHeaderLength
) )
func (UDP4Header) Len() int { func (UDP4Header) Len() int {
return udpTotalHeaderLength return ip4HeaderLength + udpHeaderLength
} }
func (h UDP4Header) Marshal(buf []byte) error { func (h UDP4Header) Marshal(buf []byte) error {
if len(buf) < udpTotalHeaderLength { if len(buf) < h.Len() {
return errSmallBuffer return errSmallBuffer
} }
if len(buf) > maxPacketLength { if len(buf) > maxPacketLength {
@ -39,9 +39,8 @@ func (h UDP4Header) Marshal(buf []byte) error {
binary.BigEndian.PutUint16(buf[24:26], uint16(length)) binary.BigEndian.PutUint16(buf[24:26], uint16(length))
binary.BigEndian.PutUint16(buf[26:28], 0) // blank checksum binary.BigEndian.PutUint16(buf[26:28], 0) // blank checksum
h.IP4Header.MarshalPseudo(buf)
// UDP checksum with IP pseudo header. // UDP checksum with IP pseudo header.
h.IP4Header.MarshalPseudo(buf)
binary.BigEndian.PutUint16(buf[26:28], ipChecksum(buf[8:])) binary.BigEndian.PutUint16(buf[26:28], ipChecksum(buf[8:]))
h.IP4Header.Marshal(buf) h.IP4Header.Marshal(buf)