package node import ( "errors" "net/netip" ) var ( errMalformedPacket = errors.New("malformed packet") errUnknownPacketType = errors.New("unknown packet type") ) const ( packetTypeSyn = iota + 1 packetTypeSynAck packetTypeAck packetTypeProbe packetTypeAddrDiscovery ) // ---------------------------------------------------------------------------- type synPacket struct { TraceID uint64 // TraceID to match response w/ request. SharedKey [32]byte // Our shared key. Direct bool FromAddr netip.AddrPort // The client's sending address. } func (p synPacket) Marshal(buf []byte) []byte { return newBinWriter(buf). Byte(packetTypeSyn). Uint64(p.TraceID). SharedKey(p.SharedKey). Bool(p.Direct). AddrPort(p.FromAddr). Build() } func parseSynPacket(buf []byte) (p synPacket, err error) { err = newBinReader(buf[1:]). Uint64(&p.TraceID). SharedKey(&p.SharedKey). Bool(&p.Direct). AddrPort(&p.FromAddr). Error() return } // ---------------------------------------------------------------------------- type ackPacket struct { TraceID uint64 FromAddr netip.AddrPort } func (p ackPacket) Marshal(buf []byte) []byte { return newBinWriter(buf). Byte(packetTypeSynAck). Uint64(p.TraceID). AddrPort(p.FromAddr). Build() } func parseAckPacket(buf []byte) (p ackPacket, err error) { err = newBinReader(buf[1:]). Uint64(&p.TraceID). AddrPort(&p.FromAddr). Error() return } // ---------------------------------------------------------------------------- type addrDiscoveryPacket struct { TraceID uint64 ToAddr netip.AddrPort } func (p addrDiscoveryPacket) Marshal(buf []byte) []byte { return newBinWriter(buf). Byte(packetTypeAddrDiscovery). Uint64(p.TraceID). AddrPort(p.ToAddr). Build() } func parseAddrDiscoveryPacket(buf []byte) (p addrDiscoveryPacket, err error) { err = newBinReader(buf[1:]). Uint64(&p.TraceID). AddrPort(&p.ToAddr). Error() return } // ---------------------------------------------------------------------------- // A probeReqPacket is sent from a client to a server to determine if direct // UDP communication can be used. type probePacket struct { TraceID uint64 } func (p probePacket) Marshal(buf []byte) []byte { return newBinWriter(buf). Byte(packetTypeProbe). Uint64(p.TraceID). Build() } func parseProbePacket(buf []byte) (p probePacket, err error) { err = newBinReader(buf[1:]). Uint64(&p.TraceID). Error() return } // ---------------------------------------------------------------------------- type localDiscoveryPacket struct{}