]> Sergey Matveev's repositories - btrtrc.git/blob - peer_protocol/pex.go
Drop support for go 1.20
[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 // 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 )