| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- // Copyright (c) Tailscale Inc & AUTHORS
- // SPDX-License-Identifier: BSD-3-Clause
- package disco
- import (
- "bytes"
- "encoding/binary"
- "net/netip"
- "tailscale.com/tailcfg"
- "tailscale.com/types/key"
- )
- // ToPCAPFrame marshals the bytes for a pcap record that describe a disco frame.
- //
- // Warning: Alloc garbage. Acceptable while capturing.
- func ToPCAPFrame(src netip.AddrPort, derpNodeSrc key.NodePublic, payload []byte) []byte {
- var (
- b bytes.Buffer
- flag uint8
- )
- b.Grow(128) // Most disco frames will probably be smaller than this.
- if src.Addr() == tailcfg.DerpMagicIPAddr {
- flag |= 0x01
- }
- b.WriteByte(flag) // 1b: flag
- derpSrc := derpNodeSrc.Raw32()
- b.Write(derpSrc[:]) // 32b: derp public key
- binary.Write(&b, binary.LittleEndian, uint16(src.Port())) // 2b: port
- addr, _ := src.Addr().MarshalBinary()
- binary.Write(&b, binary.LittleEndian, uint16(len(addr))) // 2b: len(addr)
- b.Write(addr) // Xb: addr
- binary.Write(&b, binary.LittleEndian, uint16(len(payload))) // 2b: len(payload)
- b.Write(payload) // Xb: payload
- return b.Bytes()
- }
|