pex.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package peer_protocol
  2. import (
  3. "github.com/anacrolix/dht/v2/krpc"
  4. "github.com/anacrolix/torrent/bencode"
  5. )
  6. type PexMsg struct {
  7. Added krpc.CompactIPv4NodeAddrs `bencode:"added"`
  8. AddedFlags []PexPeerFlags `bencode:"added.f"`
  9. Added6 krpc.CompactIPv6NodeAddrs `bencode:"added6"`
  10. Added6Flags []PexPeerFlags `bencode:"added6.f"`
  11. Dropped krpc.CompactIPv4NodeAddrs `bencode:"dropped"`
  12. Dropped6 krpc.CompactIPv6NodeAddrs `bencode:"dropped6"`
  13. }
  14. func (m *PexMsg) Len() int {
  15. return len(m.Added) + len(m.Added6) + len(m.Dropped) + len(m.Dropped6)
  16. }
  17. func (m *PexMsg) Message(pexExtendedId ExtensionNumber) Message {
  18. payload := bencode.MustMarshal(m)
  19. return Message{
  20. Type: Extended,
  21. ExtendedID: pexExtendedId,
  22. ExtendedPayload: payload,
  23. }
  24. }
  25. // Unmarshals and returns a PEX message.
  26. func LoadPexMsg(b []byte) (ret PexMsg, err error) {
  27. err = bencode.Unmarshal(b, &ret)
  28. return
  29. }
  30. type PexPeerFlags byte
  31. func (me PexPeerFlags) Get(f PexPeerFlags) bool {
  32. return me&f == f
  33. }
  34. const (
  35. PexPrefersEncryption PexPeerFlags = 1 << iota
  36. PexSeedUploadOnly
  37. PexSupportsUtp
  38. PexHolepunchSupport
  39. PexOutgoingConn
  40. )