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