10 const ExtensionName = "ut_holepunch"
15 AddrPort netip.AddrPort
24 Rendezvous MsgType = iota
35 NoSuchPeer ErrCode = iota + 1
41 func (m *Msg) UnmarshalBinary(b []byte) error {
43 return fmt.Errorf("buffer too small to be valid")
45 m.MsgType = MsgType(b[0])
47 addrType := AddrType(b[0])
52 addr = netip.AddrFrom4([4]byte(b[:4]))
56 return fmt.Errorf("not enough bytes")
58 addr = netip.AddrFrom16([16]byte(b[:16]))
61 return fmt.Errorf("unhandled addr type value %v", addrType)
63 port := binary.BigEndian.Uint16(b[:])
65 m.AddrPort = netip.AddrPortFrom(addr, port)
66 m.ErrCode = ErrCode(binary.BigEndian.Uint32(b[:]))
69 return fmt.Errorf("%v trailing unused bytes", len(b))
74 func (m *Msg) MarshalBinary() (_ []byte, err error) {
77 buf.WriteByte(byte(m.MsgType))
78 addr := m.AddrPort.Addr()
81 buf.WriteByte(byte(Ipv4))
83 buf.WriteByte(byte(Ipv6))
85 err = fmt.Errorf("unhandled addr type: %v", addr)
88 buf.Write(addr.AsSlice())
89 binary.Write(&buf, binary.BigEndian, m.AddrPort.Port())
90 binary.Write(&buf, binary.BigEndian, m.ErrCode)
91 return buf.Bytes(), nil