]> Sergey Matveev's repositories - btrtrc.git/blob - peer_protocol/pex.go
784aaa59257b6fcc15c3dc6bf997251ce5f2cff2
[btrtrc.git] / peer_protocol / pex.go
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 func LoadPexMsg(b []byte) (ret PexMsg, err error) {
32         err = bencode.Unmarshal(b, &ret)
33         return
34 }
35
36 type PexPeerFlags byte
37
38 func (me PexPeerFlags) Get(f PexPeerFlags) bool {
39         return me&f == f
40 }
41
42 const (
43         PexPrefersEncryption PexPeerFlags = 1 << iota
44         PexSeedUploadOnly
45         PexSupportsUtp
46         PexHolepunchSupport
47         PexOutgoingConn
48 )