Remove address book peers that have changed to clients
If an address book peer stops advertising the NODE_SERVICES bit, remove it from the address book.
This commit is contained in:
parent
f541f85792
commit
c40cbee42f
|
@ -139,7 +139,15 @@ impl AddressBook {
|
|||
recent_peers = self.recently_live_peers().count(),
|
||||
);
|
||||
|
||||
// Drop any unspecified or client addresses.
|
||||
// If a node that we are directly connected to has changed to a client,
|
||||
// remove it from the address book.
|
||||
if new.is_direct_client() && self.contains_addr(&new.addr) {
|
||||
std::mem::drop(_guard);
|
||||
self.take(new.addr);
|
||||
return;
|
||||
}
|
||||
|
||||
// Never add unspecified addresses or client services.
|
||||
//
|
||||
// Communication with these addresses can be monitored via Zebra's
|
||||
// metrics. (The address book is for valid peer addresses.)
|
||||
|
|
|
@ -156,7 +156,9 @@ impl MetaAddr {
|
|||
///
|
||||
/// # Security
|
||||
///
|
||||
/// This address must be the remote address from an outbound connection.
|
||||
/// This address must be the remote address from an outbound connection,
|
||||
/// and the services must be the services from that peer's handshake.
|
||||
///
|
||||
/// Otherwise:
|
||||
/// - malicious peers could interfere with other peers' `AddressBook` state,
|
||||
/// or
|
||||
|
@ -226,6 +228,14 @@ impl MetaAddr {
|
|||
self.last_seen
|
||||
}
|
||||
|
||||
/// Is this address a directly connected client?
|
||||
pub fn is_direct_client(&self) -> bool {
|
||||
match self.last_connection_state {
|
||||
Responded => !self.services.contains(PeerServices::NODE_NETWORK),
|
||||
NeverAttemptedGossiped | NeverAttemptedAlternate | Failed | AttemptPending => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// Is this address valid for outbound connections?
|
||||
pub fn is_valid_for_outbound(&self) -> bool {
|
||||
self.services.contains(PeerServices::NODE_NETWORK)
|
||||
|
|
Loading…
Reference in New Issue