diff --git a/client.go b/client.go index 4986424c..ad20ef2b 100644 --- a/client.go +++ b/client.go @@ -1505,6 +1505,7 @@ func (cl *Client) banPeerIP(ip net.IP) { t.iterPeers(func(p *Peer) { if p.remoteIp().Equal(ip) { t.logger.Levelf(log.Warning, "dropping peer %v with banned ip %v", p, ip) + // Should this be a close? p.drop() } }) diff --git a/peer-impl.go b/peer-impl.go index e29fb439..1b9cf978 100644 --- a/peer-impl.go +++ b/peer-impl.go @@ -20,7 +20,10 @@ type peerImpl interface { connectionFlags() string onClose() onGotInfo(*metainfo.Info) + // Drop connection. This may be a no-op if there is no connection. drop() + // Rebuke the peer + ban() String() string connStatusString() string diff --git a/peerconn.go b/peerconn.go index ed77f444..280a82ae 100644 --- a/peerconn.go +++ b/peerconn.go @@ -1595,6 +1595,10 @@ func (cn *PeerConn) drop() { cn.t.dropConnection(cn) } +func (cn *PeerConn) ban() { + cn.t.cl.banPeerIP(cn.remoteIp()) +} + func (cn *Peer) netGoodPiecesDirtied() int64 { return cn._stats.PiecesDirtiedGood.Int64() - cn._stats.PiecesDirtiedBad.Int64() } diff --git a/torrent.go b/torrent.go index d6ff2dbc..bbe57f61 100644 --- a/torrent.go +++ b/torrent.go @@ -2049,9 +2049,8 @@ func (t *Torrent) pieceHashed(piece pieceIndex, passed bool, hashIoErr error) { // single peer for a piece, and we never progress that piece to completion, we // will never smart-ban them. Discovered in // https://github.com/anacrolix/torrent/issues/715. - t.logger.Levelf(log.Warning, "banning %v for being sole dirtier of piece %v after failed piece check", c.remoteIp(), piece) - t.cl.banPeerIP(c.remoteIp()) - c.drop() + t.logger.Levelf(log.Warning, "banning %v for being sole dirtier of piece %v after failed piece check", c, piece) + c.ban() } } } @@ -2156,6 +2155,7 @@ func (t *Torrent) dropBannedPeers() { p, remoteIp, p.bannableAddr) } if _, ok := t.cl.badPeerIPs[netipAddr]; ok { + // Should this be a close? p.drop() log.Printf("dropped %v for banned remote IP %v", p, netipAddr) } diff --git a/webseed-peer.go b/webseed-peer.go index 9b1cba22..0cdf4cac 100644 --- a/webseed-peer.go +++ b/webseed-peer.go @@ -114,10 +114,13 @@ func (ws *webseedPeer) connectionFlags() string { return "WS" } -// TODO: This is called when banning peers. Perhaps we want to be able to ban webseeds too. We could -// return bool if this is even possible, and if it isn't, skip to the next drop candidate. +// Maybe this should drop all existing connections, or something like that. func (ws *webseedPeer) drop() {} +func (cn *webseedPeer) ban() { + cn.peer.close() +} + func (ws *webseedPeer) handleUpdateRequests() { // Because this is synchronous, webseed peers seem to get first dibs on newly prioritized // pieces.