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