]> Sergey Matveev's repositories - btrtrc.git/blob - peer_protocol/pex.go
8d09106103f20f4a2678b2beb36740b660fe10a4
[btrtrc.git] / peer_protocol / pex.go
1 package peer_protocol
2
3 import (
4         "net"
5
6         "github.com/anacrolix/dht/v2/krpc"
7         "github.com/anacrolix/torrent/bencode"
8 )
9
10 type PexMsg struct {
11         Added       krpc.CompactIPv4NodeAddrs `bencode:"added"`
12         AddedFlags  []PexPeerFlags            `bencode:"added.f"`
13         Added6      krpc.CompactIPv6NodeAddrs `bencode:"added6"`
14         Added6Flags []PexPeerFlags            `bencode:"added6.f"`
15         Dropped     krpc.CompactIPv4NodeAddrs `bencode:"dropped"`
16         Dropped6    krpc.CompactIPv6NodeAddrs `bencode:"dropped6"`
17 }
18
19 func (m *PexMsg) AppendAdded(addr krpc.NodeAddr, f PexPeerFlags) {
20         ip := addr.IP
21         if ip.To4() != nil {
22                 m.Added = append(m.Added, addr)
23                 m.AddedFlags = append(m.AddedFlags, f)
24         } else if len(ip) == net.IPv6len {
25                 m.Added6 = append(m.Added6, addr)
26                 m.Added6Flags = append(m.Added6Flags, f)
27         }
28 }
29
30 func (m *PexMsg) AppendDropped(addr krpc.NodeAddr) {
31         ip := addr.IP
32         if ip.To4() != nil {
33                 m.Dropped = append(m.Dropped, addr)
34         } else if len(ip) == net.IPv6len {
35                 m.Dropped6 = append(m.Dropped6, addr)
36         }
37 }
38
39 func (pexMsg *PexMsg) Message(pexExtendedId ExtensionNumber) Message {
40         payload := bencode.MustMarshal(pexMsg)
41         return Message{
42                 Type:            Extended,
43                 ExtendedID:      pexExtendedId,
44                 ExtendedPayload: payload,
45         }
46 }
47
48 type PexPeerFlags byte
49
50 func (me PexPeerFlags) Get(f PexPeerFlags) bool {
51         return me&f == f
52 }
53
54 const (
55         PexPrefersEncryption PexPeerFlags = 1 << iota
56         PexSeedUploadOnly
57         PexSupportsUtp
58         PexHolepunchSupport
59         PexOutgoingConn
60 )