10 const ExtensionName = "ut_holepunch"
15 AddrPort netip.AddrPort
23 Rendezvous MsgType = iota
33 func (m *Msg) UnmarshalBinary(b []byte) error {
35 return fmt.Errorf("buffer too small to be valid")
37 m.MsgType = MsgType(b[0])
39 addrType := AddrType(b[0])
44 addr = netip.AddrFrom4([4]byte(b[:4]))
48 return fmt.Errorf("not enough bytes")
50 addr = netip.AddrFrom16([16]byte(b[:16]))
53 return fmt.Errorf("unhandled addr type value %v", addrType)
55 port := binary.BigEndian.Uint16(b[:])
57 m.AddrPort = netip.AddrPortFrom(addr, port)
58 m.ErrCode = ErrCode(binary.BigEndian.Uint32(b[:]))
61 return fmt.Errorf("%v trailing unused bytes", len(b))
66 func (m *Msg) MarshalBinary() (_ []byte, err error) {
69 buf.WriteByte(byte(m.MsgType))
70 addr := m.AddrPort.Addr()
73 buf.WriteByte(byte(Ipv4))
75 buf.WriteByte(byte(Ipv6))
77 err = fmt.Errorf("unhandled addr type: %v", addr)
80 buf.Write(addr.AsSlice())
81 binary.Write(&buf, binary.BigEndian, m.AddrPort.Port())
82 binary.Write(&buf, binary.BigEndian, m.ErrCode)
83 return buf.Bytes(), nil