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  )