--- /dev/null
+package torrent
+
+import "github.com/anacrolix/dht/krpc"
+
+type Peers []Peer
+
+func (me *Peers) FromPex(nas []krpc.NodeAddr, fs []pexPeerFlags) {
+ for i, na := range nas {
+ var p Peer
+ var f pexPeerFlags
+ if i < len(fs) {
+ f = fs[i]
+ }
+ p.FromPex(na, f)
+ *me = append(*me, p)
+ }
+}
return nil
case pexExtendedId:
if cl.config.DisablePEX {
+ // TODO: Maybe close the connection. Check that we're not
+ // advertising that we support PEX if it's disabled.
return nil
}
var pexMsg peerExchangeMessage
return fmt.Errorf("error unmarshalling PEX message: %s", err)
}
go func() {
+ ps := pexMsg.AddedPeers()
cl.mu.Lock()
- t.addPeers(func() (ret []Peer) {
- for i, cp := range pexMsg.Added {
- p := Peer{
- IP: append(make(net.IP, 0, 4), cp.IP...),
- Port: cp.Port,
- Source: peerSourcePEX,
- }
- if i < len(pexMsg.AddedFlags) && pexMsg.AddedFlags[i]&0x01 != 0 {
- p.SupportsEncryption = true
- }
- ret = append(ret, p)
- }
- return
- }())
+ t.addPeers(ps)
cl.mu.Unlock()
}()
return nil
Added krpc.CompactIPv4NodeAddrs `bencode:"added"`
AddedFlags []pexPeerFlags `bencode:"added.f"`
Added6 krpc.CompactIPv6NodeAddrs `bencode:"added6"`
- AddedFlags6 []pexPeerFlags `bencode:"added6.f"`
+ Added6Flags []pexPeerFlags `bencode:"added6.f"`
Dropped krpc.CompactIPv4NodeAddrs `bencode:"dropped"`
Dropped6 krpc.CompactIPv6NodeAddrs `bencode:"dropped6"`
}
type pexPeerFlags byte
+func (me pexPeerFlags) Get(f pexPeerFlags) bool {
+ return me&f == f
+}
+
const (
pexPrefersEncryption = 0x01
pexSeedUploadOnly = 0x02
pexHolepunchSupport = 0x08
pexOutgoingConn = 0x10
)
+
+func (me *peerExchangeMessage) AddedPeers() (ret Peers) {
+ ret.FromPex(me.Added, me.AddedFlags)
+ ret.FromPex(me.Added6, me.Added6Flags)
+ return
+}
"time"
"github.com/anacrolix/dht"
+ "github.com/anacrolix/dht/krpc"
"github.com/anacrolix/log"
"github.com/anacrolix/missinggo"
"github.com/anacrolix/missinggo/bitmap"
Source peerSource
// Peer is known to support encryption.
SupportsEncryption bool
+ pexPeerFlags
+}
+
+func (me *Peer) FromPex(na krpc.NodeAddr, fs pexPeerFlags) {
+ me.IP = append([]byte(nil), na.IP...)
+ me.Port = na.Port
+ me.Source = peerSourcePEX
+ // If they prefer encryption, they must support it.
+ if fs.Get(pexPrefersEncryption) {
+ me.SupportsEncryption = true
+ }
+ me.pexPeerFlags = fs
}
func (t *Torrent) pieceLength(piece int) pp.Integer {