10 const ExtensionName = "ut_holepunch"
15 AddrPort netip.AddrPort
23 Rendezvous MsgType = iota
28 func (me MsgType) String() string {
37 return fmt.Sprintf("unknown %d", me)
46 func (m *Msg) UnmarshalBinary(b []byte) error {
48 return fmt.Errorf("buffer too small to be valid")
50 m.MsgType = MsgType(b[0])
52 addrType := AddrType(b[0])
57 addr = netip.AddrFrom4(*(*[4]byte)(b[:4]))
61 return fmt.Errorf("not enough bytes")
63 addr = netip.AddrFrom16(*(*[16]byte)(b[:16]))
66 return fmt.Errorf("unhandled addr type value %v", addrType)
68 port := binary.BigEndian.Uint16(b[:])
70 m.AddrPort = netip.AddrPortFrom(addr, port)
71 m.ErrCode = ErrCode(binary.BigEndian.Uint32(b[:]))
74 return fmt.Errorf("%v trailing unused bytes", len(b))
79 func (m *Msg) MarshalBinary() (_ []byte, err error) {
82 buf.WriteByte(byte(m.MsgType))
83 addr := m.AddrPort.Addr()
86 buf.WriteByte(byte(Ipv4))
88 buf.WriteByte(byte(Ipv6))
90 err = fmt.Errorf("unhandled addr type: %v", addr)
93 buf.Write(addr.AsSlice())
94 binary.Write(&buf, binary.BigEndian, m.AddrPort.Port())
95 binary.Write(&buf, binary.BigEndian, m.ErrCode)
96 return buf.Bytes(), nil