|
|
@@ -140,6 +140,7 @@ func (k *Kademlia) Register(peers ...*BzzAddr) error {
|
|
|
defer k.lock.Unlock()
|
|
|
var known, size int
|
|
|
for _, p := range peers {
|
|
|
+ log.Trace("kademlia trying to register", "addr", p)
|
|
|
// error if self received, peer should know better
|
|
|
// and should be punished for this
|
|
|
if bytes.Equal(p.Address(), k.base) {
|
|
|
@@ -149,10 +150,22 @@ func (k *Kademlia) Register(peers ...*BzzAddr) error {
|
|
|
k.addrs, _, found, _ = pot.Swap(k.addrs, p, Pof, func(v pot.Val) pot.Val {
|
|
|
// if not found
|
|
|
if v == nil {
|
|
|
+ log.Trace("registering new peer", "addr", p)
|
|
|
// insert new offline peer into conns
|
|
|
return newEntry(p)
|
|
|
}
|
|
|
- // found among known peers, do nothing
|
|
|
+
|
|
|
+ e := v.(*entry)
|
|
|
+
|
|
|
+ // if underlay address is different, still add
|
|
|
+ if !bytes.Equal(e.BzzAddr.UAddr, p.UAddr) {
|
|
|
+ log.Trace("underlay addr is different, so add again", "new", p, "old", e.BzzAddr)
|
|
|
+ // insert new offline peer into conns
|
|
|
+ return newEntry(p)
|
|
|
+ }
|
|
|
+
|
|
|
+ log.Trace("found among known peers, underlay addr is same, do nothing", "new", p, "old", e.BzzAddr)
|
|
|
+
|
|
|
return v
|
|
|
})
|
|
|
if found {
|
|
|
@@ -417,6 +430,18 @@ func (k *Kademlia) Off(p *Peer) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func (k *Kademlia) ListKnown() []*BzzAddr {
|
|
|
+ res := []*BzzAddr{}
|
|
|
+
|
|
|
+ k.addrs.Each(func(val pot.Val) bool {
|
|
|
+ e := val.(*entry)
|
|
|
+ res = append(res, e.BzzAddr)
|
|
|
+ return true
|
|
|
+ })
|
|
|
+
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
// EachConn is an iterator with args (base, po, f) applies f to each live peer
|
|
|
// that has proximity order po or less as measured from the base
|
|
|
// if base is nil, kademlia base address is used
|