@@ -1279,7 +1279,15 @@ func (k *Kad) ClosestPeer(addr swarm.Address, includeSelf bool, filter topology.
12791279 closest = k .base
12801280 }
12811281
1282- err := k .EachConnectedPeerRev (func (peer swarm.Address , po uint8 ) (bool , bool , error ) {
1282+ prox := swarm .Proximity (k .base .Bytes (), addr .Bytes ())
1283+
1284+ // iterate starting from bin 0 to the maximum bin
1285+ err := k .EachConnectedPeerRev (func (peer swarm.Address , bin uint8 ) (bool , bool , error ) {
1286+
1287+ if bin > prox && ! closest .IsZero () {
1288+ return true , false , nil
1289+ }
1290+
12831291 if swarm .ContainsAddress (skipPeers , peer ) {
12841292 return false , false , nil
12851293 }
@@ -1317,9 +1325,9 @@ func (k *Kad) ClosestPeer(addr swarm.Address, includeSelf bool, filter topology.
13171325
13181326// EachConnectedPeer implements topology.PeerIterator interface.
13191327func (k * Kad ) EachConnectedPeer (f topology.EachPeerFunc , filter topology.Select ) error {
1320- filters := excludeFromIterator (filter )
1328+ excludeFunc := k . opt . ExcludeFunc ( excludeFromIterator (filter ) ... )
13211329 return k .connectedPeers .EachBin (func (addr swarm.Address , po uint8 ) (bool , bool , error ) {
1322- if k . opt . ExcludeFunc ( filters ... ) (addr ) {
1330+ if excludeFunc (addr ) {
13231331 return false , false , nil
13241332 }
13251333 return f (addr , po )
@@ -1328,9 +1336,9 @@ func (k *Kad) EachConnectedPeer(f topology.EachPeerFunc, filter topology.Select)
13281336
13291337// EachConnectedPeerRev implements topology.PeerIterator interface.
13301338func (k * Kad ) EachConnectedPeerRev (f topology.EachPeerFunc , filter topology.Select ) error {
1331- filters := excludeFromIterator (filter )
1339+ excludeFunc := k . opt . ExcludeFunc ( excludeFromIterator (filter ) ... )
13321340 return k .connectedPeers .EachBinRev (func (addr swarm.Address , po uint8 ) (bool , bool , error ) {
1333- if k . opt . ExcludeFunc ( filters ... ) (addr ) {
1341+ if excludeFunc (addr ) {
13341342 return false , false , nil
13351343 }
13361344 return f (addr , po )
@@ -1397,7 +1405,6 @@ func (k *Kad) SubscribeTopologyChange() (c <-chan struct{}, unsubscribe func())
13971405func excludeFromIterator (filter topology.Select ) []im.ExcludeOp {
13981406
13991407 ops := make ([]im.ExcludeOp , 0 , 3 )
1400-
14011408 ops = append (ops , im .Bootnode ())
14021409
14031410 if filter .Reachable {
0 commit comments