|
|
|
@ -23,6 +23,7 @@ import ( |
|
|
|
|
"fmt" |
|
|
|
|
"net" |
|
|
|
|
"sync" |
|
|
|
|
"sync/atomic" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
@ -187,7 +188,7 @@ type peerDrop struct { |
|
|
|
|
requested bool // true if signaled by the peer
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type connFlag int |
|
|
|
|
type connFlag int32 |
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
|
dynDialedConn connFlag = 1 << iota |
|
|
|
@ -252,7 +253,18 @@ func (f connFlag) String() string { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *conn) is(f connFlag) bool { |
|
|
|
|
return c.flags&f != 0 |
|
|
|
|
flags := connFlag(atomic.LoadInt32((*int32)(&c.flags))) |
|
|
|
|
return flags&f != 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *conn) set(f connFlag, val bool) { |
|
|
|
|
flags := connFlag(atomic.LoadInt32((*int32)(&c.flags))) |
|
|
|
|
if val { |
|
|
|
|
flags |= f |
|
|
|
|
} else { |
|
|
|
|
flags &= ^f |
|
|
|
|
} |
|
|
|
|
atomic.StoreInt32((*int32)(&c.flags), int32(flags)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Peers returns all connected peers.
|
|
|
|
@ -632,7 +644,7 @@ running: |
|
|
|
|
trusted[n.ID] = true |
|
|
|
|
// Mark any already-connected peer as trusted
|
|
|
|
|
if p, ok := peers[n.ID]; ok { |
|
|
|
|
p.rw.flags |= trustedConn |
|
|
|
|
p.rw.set(trustedConn, true) |
|
|
|
|
} |
|
|
|
|
case n := <-srv.removetrusted: |
|
|
|
|
// This channel is used by RemoveTrustedPeer to remove an enode
|
|
|
|
@ -643,7 +655,7 @@ running: |
|
|
|
|
} |
|
|
|
|
// Unmark any already-connected peer as trusted
|
|
|
|
|
if p, ok := peers[n.ID]; ok { |
|
|
|
|
p.rw.flags &= ^trustedConn |
|
|
|
|
p.rw.set(trustedConn, false) |
|
|
|
|
} |
|
|
|
|
case op := <-srv.peerOp: |
|
|
|
|
// This channel is used by Peers and PeerCount.
|
|
|
|
|