Skip to content

Commit

Permalink
swarm/: Patch reporting on banned peer connections (#2350)
Browse files Browse the repository at this point in the history
Don't report events of a connection to the `NetworkBehaviour`, if connection has
been established while the remote peer was banned. Among other guarantees this
upholds that `NetworkBehaviour::inject_event` is never called without a previous
`NetworkBehaviour::inject_connection_established` for said connection.

Co-authored-by: Max Inden <mail@max-inden.de>
  • Loading branch information
divagant-martian and mxinden committed Nov 26, 2021
1 parent f0000d5 commit fd41751
Show file tree
Hide file tree
Showing 49 changed files with 435 additions and 191 deletions.
24 changes: 23 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,32 @@

# `libp2p` facade crate

## Version 0.41.1 [unreleased]
## Version 0.42.0 [unreleased]

- Update individual crates.
- `libp2p-core`
- `libp2p-deflate`
- `libp2p-dns`
- `libp2p-floodsub`
- `libp2p-gossipsub`
- `libp2p-identify`
- `libp2p-kad`
- `libp2p-mdns`
- `libp2p-metrics`
- `libp2p-mplex`
- `libp2p-noise`
- `libp2p-ping`
- `libp2p-plaintext`
- `libp2p-relay`
- `libp2p-rendezvous`
- `libp2p-request-response`
- `libp2p-swarm-derive`
- `libp2p-swarm`
- `libp2p-tcp`
- `libp2p-uds`
- `libp2p-wasm-ext`
- `libp2p-websocket`
- `libp2p-yamux`
- `libp2p-mdns` (breaking compatibility with previous versions)

## Version 0.41.0 [2021-11-16]
Expand Down
38 changes: 19 additions & 19 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "libp2p"
edition = "2018"
description = "Peer-to-peer networking library"
version = "0.41.1"
version = "0.42.0"
authors = ["Parity Technologies <admin@parity.io>"]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
Expand Down Expand Up @@ -71,37 +71,37 @@ futures-timer = "3.0.2" # Explicit dependency to be used in `wasm-bindgen` featu
getrandom = "0.2.3" # Explicit dependency to be used in `wasm-bindgen` feature
instant = "0.1.11" # Explicit dependency to be used in `wasm-bindgen` feature
lazy_static = "1.2"
libp2p-core = { version = "0.30.0", path = "core", default-features = false }
libp2p-floodsub = { version = "0.32.0", path = "protocols/floodsub", optional = true }
libp2p-core = { version = "0.31.0", path = "core", default-features = false }
libp2p-floodsub = { version = "0.33.0", path = "protocols/floodsub", optional = true }
libp2p-gossipsub = { version = "0.35.0", path = "./protocols/gossipsub", optional = true }
libp2p-identify = { version = "0.32.0", path = "protocols/identify", optional = true }
libp2p-kad = { version = "0.33.0", path = "protocols/kad", optional = true }
libp2p-identify = { version = "0.33.0", path = "protocols/identify", optional = true }
libp2p-kad = { version = "0.34.0", path = "protocols/kad", optional = true }
libp2p-metrics = { version = "0.3.0", path = "misc/metrics", optional = true }
libp2p-mplex = { version = "0.30.1", path = "muxers/mplex", optional = true }
libp2p-noise = { version = "0.33.0", path = "transports/noise", optional = true }
libp2p-ping = { version = "0.32.0", path = "protocols/ping", optional = true }
libp2p-plaintext = { version = "0.30.0", path = "transports/plaintext", optional = true }
libp2p-mplex = { version = "0.31.0", path = "muxers/mplex", optional = true }
libp2p-noise = { version = "0.34.0", path = "transports/noise", optional = true }
libp2p-ping = { version = "0.33.0", path = "protocols/ping", optional = true }
libp2p-plaintext = { version = "0.31.0", path = "transports/plaintext", optional = true }
libp2p-pnet = { version = "0.22.0", path = "transports/pnet", optional = true }
libp2p-relay = { version = "0.5.0", path = "protocols/relay", optional = true }
libp2p-rendezvous = { version = "0.2.0", path = "protocols/rendezvous", optional = true }
libp2p-request-response = { version = "0.14.0", path = "protocols/request-response", optional = true }
libp2p-swarm = { version = "0.32.0", path = "swarm" }
libp2p-relay = { version = "0.6.0", path = "protocols/relay", optional = true }
libp2p-rendezvous = { version = "0.3.0", path = "protocols/rendezvous", optional = true }
libp2p-request-response = { version = "0.15.0", path = "protocols/request-response", optional = true }
libp2p-swarm = { version = "0.33.0", path = "swarm" }
libp2p-swarm-derive = { version = "0.26.1", path = "swarm-derive" }
libp2p-uds = { version = "0.30.0", path = "transports/uds", optional = true }
libp2p-wasm-ext = { version = "0.30.0", path = "transports/wasm-ext", default-features = false, optional = true }
libp2p-yamux = { version = "0.34.0", path = "muxers/yamux", optional = true }
libp2p-wasm-ext = { version = "0.31.0", path = "transports/wasm-ext", default-features = false, optional = true }
libp2p-yamux = { version = "0.35.0", path = "muxers/yamux", optional = true }
multiaddr = { version = "0.13.0" }
parking_lot = "0.11.0"
pin-project = "1.0.0"
rand = "0.7.3" # Explicit dependency to be used in `wasm-bindgen` feature
smallvec = "1.6.1"

[target.'cfg(not(any(target_os = "emscripten", target_os = "wasi", target_os = "unknown")))'.dependencies]
libp2p-deflate = { version = "0.30.0", path = "transports/deflate", optional = true }
libp2p-dns = { version = "0.30.0", path = "transports/dns", optional = true, default-features = false }
libp2p-deflate = { version = "0.31.0", path = "transports/deflate", optional = true }
libp2p-dns = { version = "0.31.0", path = "transports/dns", optional = true, default-features = false }
libp2p-mdns = { version = "0.34.0", path = "protocols/mdns", optional = true }
libp2p-tcp = { version = "0.30.0", path = "transports/tcp", default-features = false, optional = true }
libp2p-websocket = { version = "0.32.0", path = "transports/websocket", optional = true }
libp2p-tcp = { version = "0.31.0", path = "transports/tcp", default-features = false, optional = true }
libp2p-websocket = { version = "0.33.0", path = "transports/websocket", optional = true }

[dev-dependencies]
async-std = { version = "1.6.2", features = ["attributes"] }
Expand Down
7 changes: 7 additions & 0 deletions core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# 0.31.0 [unreleased]

- Report concrete connection IDs in `NetworkEvent::ConnectionEstablished` and
`NetworkEvent::ConnectionClosed` (see [PR 2350]).

[PR 2350]: https://github.com/libp2p/rust-libp2p/pull/2350/

# 0.30.1 [2021-11-16]

- Use `instant` instead of `wasm-timer` (see [PR 2245]).
Expand Down
2 changes: 1 addition & 1 deletion core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "libp2p-core"
edition = "2018"
description = "Core traits and structs of libp2p"
version = "0.30.1"
version = "0.31.0"
authors = ["Parity Technologies <admin@parity.io>"]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
Expand Down
23 changes: 13 additions & 10 deletions core/src/connection/pool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ use std::{
collections::{hash_map, HashMap},
convert::TryFrom as _,
fmt,
num::{NonZeroU32, NonZeroU8},
num::NonZeroU8,
pin::Pin,
task::Context,
task::Poll,
Expand Down Expand Up @@ -156,7 +156,10 @@ where
/// A new connection has been established.
ConnectionEstablished {
connection: EstablishedConnection<'a, THandlerInEvent<THandler>>,
num_established: NonZeroU32,
/// List of other connections to the same peer.
///
/// Note: Does not include the connection reported through this event.
other_established_connection_ids: Vec<ConnectionId>,
/// [`Some`] when the new connection is an outgoing connection.
/// Addresses are dialed in parallel. Contains the addresses and errors
/// of dial attempts that failed before the one successful dial.
Expand All @@ -183,8 +186,8 @@ where
error: Option<ConnectionError<THandlerError<THandler>>>,
/// A reference to the pool that used to manage the connection.
pool: &'a mut Pool<THandler, TTrans>,
/// The remaining number of established connections to the same peer.
num_established: u32,
/// The remaining established connections to the same peer.
remaining_established_connection_ids: Vec<ConnectionId>,
handler: THandler::Handler,
},

Expand Down Expand Up @@ -693,15 +696,16 @@ where
let EstablishedConnectionInfo { endpoint, .. } =
connections.remove(&id).expect("Connection to be present");
self.counters.dec_established(&endpoint);
let num_established = u32::try_from(connections.len()).unwrap();
if num_established == 0 {
let remaining_established_connection_ids: Vec<ConnectionId> =
connections.keys().cloned().collect();
if remaining_established_connection_ids.is_empty() {
self.established.remove(&peer_id);
}
return Poll::Ready(PoolEvent::ConnectionClosed {
id,
connected: Connected { endpoint, peer_id },
error,
num_established,
remaining_established_connection_ids,
pool: self,
handler,
});
Expand Down Expand Up @@ -849,8 +853,7 @@ where

// Add the connection to the pool.
let conns = self.established.entry(peer_id).or_default();
let num_established = NonZeroU32::new(u32::try_from(conns.len() + 1).unwrap())
.expect("n + 1 is always non-zero; qed");
let other_established_connection_ids = conns.keys().cloned().collect();
self.counters.inc_established(&endpoint);

let (command_sender, command_receiver) =
Expand Down Expand Up @@ -883,7 +886,7 @@ where
Some(PoolConnection::Established(connection)) => {
return Poll::Ready(PoolEvent::ConnectionEstablished {
connection,
num_established,
other_established_connection_ids,
concurrent_dial_errors,
})
}
Expand Down
8 changes: 4 additions & 4 deletions core/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -396,11 +396,11 @@ where
Poll::Pending => return Poll::Pending,
Poll::Ready(PoolEvent::ConnectionEstablished {
connection,
num_established,
other_established_connection_ids,
concurrent_dial_errors,
}) => NetworkEvent::ConnectionEstablished {
connection,
num_established,
other_established_connection_ids,
concurrent_dial_errors,
},
Poll::Ready(PoolEvent::PendingOutboundConnectionError {
Expand Down Expand Up @@ -435,13 +435,13 @@ where
id,
connected,
error,
num_established,
remaining_established_connection_ids,
handler,
..
}) => NetworkEvent::ConnectionClosed {
id,
connected,
num_established,
remaining_established_connection_ids,
error,
handler,
},
Expand Down
13 changes: 7 additions & 6 deletions core/src/network/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use crate::{
transport::{Transport, TransportError},
Multiaddr, PeerId,
};
use std::{fmt, num::NonZeroU32};
use std::fmt;

/// Event that can happen on the `Network`.
pub enum NetworkEvent<'a, TTrans, TInEvent, TOutEvent, THandler>
Expand Down Expand Up @@ -100,9 +100,10 @@ where
ConnectionEstablished {
/// The newly established connection.
connection: EstablishedConnection<'a, TInEvent>,
/// The total number of established connections to the same peer,
/// including the one that has just been opened.
num_established: NonZeroU32,
/// List of other connections to the same peer.
///
/// Note: Does not include the connection reported through this event.
other_established_connection_ids: Vec<ConnectionId>,
/// [`Some`] when the new connection is an outgoing connection.
/// Addresses are dialed in parallel. Contains the addresses and errors
/// of dial attempts that failed before the one successful dial.
Expand All @@ -128,8 +129,8 @@ where
connected: Connected,
/// The error that occurred.
error: Option<ConnectionError<<THandler::Handler as ConnectionHandler>::Error>>,
/// The remaining number of established connections to the same peer.
num_established: u32,
/// List of remaining established connections to the same peer.
remaining_established_connection_ids: Vec<ConnectionId>,
handler: THandler::Handler,
},

Expand Down
10 changes: 5 additions & 5 deletions misc/metrics/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ kad = ["libp2p-kad"]
ping = ["libp2p-ping"]

[dependencies]
libp2p-core = { version = "0.30.0", path = "../../core" }
libp2p-core = { version = "0.31.0", path = "../../core" }
libp2p-gossipsub = { version = "0.35.0", path = "../../protocols/gossipsub", optional = true }
libp2p-identify = { version = "0.32.0", path = "../../protocols/identify", optional = true }
libp2p-kad = { version = "0.33.0", path = "../../protocols/kad", optional = true }
libp2p-ping = { version = "0.32.0", path = "../../protocols/ping", optional = true }
libp2p-swarm = { version = "0.32.0", path = "../../swarm" }
libp2p-identify = { version = "0.33.0", path = "../../protocols/identify", optional = true }
libp2p-kad = { version = "0.34.0", path = "../../protocols/kad", optional = true }
libp2p-ping = { version = "0.33.0", path = "../../protocols/ping", optional = true }
libp2p-swarm = { version = "0.33.0", path = "../../swarm" }
open-metrics-client = "0.13.0"

[dev-dependencies]
Expand Down
2 changes: 1 addition & 1 deletion misc/peer-id-generator/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ categories = ["network-programming", "asynchronous"]
publish = false

[dependencies]
libp2p-core = { path = "../../core", default-features = false }
libp2p-core = { path = "../../core", default-features = false, version = "0.31.0"}
num_cpus = "1.8"
4 changes: 3 additions & 1 deletion muxers/mplex/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# 0.30.1 [unreleased]
# 0.31.0 [unreleased]

- Update dependencies.

- Add `fn set_protocol_name(&mut self, protocol_name: &'static [u8])` to MplexConfig

Expand Down
4 changes: 2 additions & 2 deletions muxers/mplex/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "libp2p-mplex"
edition = "2018"
description = "Mplex multiplexing protocol for libp2p"
version = "0.30.1"
version = "0.31.0"
authors = ["Parity Technologies <admin@parity.io>"]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
Expand All @@ -13,7 +13,7 @@ categories = ["network-programming", "asynchronous"]
bytes = "1"
futures = "0.3.1"
asynchronous-codec = "0.6"
libp2p-core = { version = "0.30.0", path = "../../core", default-features = false }
libp2p-core = { version = "0.31.0", path = "../../core", default-features = false }
log = "0.4"
nohash-hasher = "0.2"
parking_lot = "0.11"
Expand Down
4 changes: 4 additions & 0 deletions muxers/yamux/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 0.35.0 [unreleased]

- Update dependencies.

# 0.34.0 [2021-11-01]

- Make default features of `libp2p-core` optional.
Expand Down
4 changes: 2 additions & 2 deletions muxers/yamux/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "libp2p-yamux"
edition = "2018"
description = "Yamux multiplexing protocol for libp2p"
version = "0.34.0"
version = "0.35.0"
authors = ["Parity Technologies <admin@parity.io>"]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
Expand All @@ -11,7 +11,7 @@ categories = ["network-programming", "asynchronous"]

[dependencies]
futures = "0.3.1"
libp2p-core = { version = "0.30.0", path = "../../core", default-features = false }
libp2p-core = { version = "0.31.0", path = "../../core", default-features = false }
parking_lot = "0.11"
thiserror = "1.0"
yamux = "0.9.0"
4 changes: 4 additions & 0 deletions protocols/floodsub/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 0.33.0 [unreleased]

- Update dependencies.

# 0.32.0 [2021-11-16]

- Update dependencies.
Expand Down
6 changes: 3 additions & 3 deletions protocols/floodsub/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "libp2p-floodsub"
edition = "2018"
description = "Floodsub protocol for libp2p"
version = "0.32.0"
version = "0.33.0"
authors = ["Parity Technologies <admin@parity.io>"]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
Expand All @@ -13,8 +13,8 @@ categories = ["network-programming", "asynchronous"]
cuckoofilter = "0.5.0"
fnv = "1.0"
futures = "0.3.1"
libp2p-core = { version = "0.30.0", path = "../../core", default-features = false }
libp2p-swarm = { version = "0.32.0", path = "../../swarm" }
libp2p-core = { version = "0.31.0", path = "../../core", default-features = false }
libp2p-swarm = { version = "0.33.0", path = "../../swarm" }
log = "0.4"
prost = "0.9"
rand = "0.7"
Expand Down
4 changes: 2 additions & 2 deletions protocols/gossipsub/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ keywords = ["peer-to-peer", "libp2p", "networking"]
categories = ["network-programming", "asynchronous"]

[dependencies]
libp2p-swarm = { version = "0.32.0", path = "../../swarm" }
libp2p-core = { version = "0.30.0", path = "../../core", default-features = false }
libp2p-swarm = { version = "0.33.0", path = "../../swarm" }
libp2p-core = { version = "0.31.0", path = "../../core", default-features = false }
bytes = "1.0"
byteorder = "1.3.4"
fnv = "1.0.7"
Expand Down
4 changes: 4 additions & 0 deletions protocols/identify/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 0.33.0 [unreleased]

- Update dependencies.

# 0.32.0 [2021-11-16]

- Use `futures-timer` instead of `wasm-timer` (see [PR 2245]).
Expand Down
6 changes: 3 additions & 3 deletions protocols/identify/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "libp2p-identify"
edition = "2018"
description = "Nodes identifcation protocol for libp2p"
version = "0.32.0"
version = "0.33.0"
authors = ["Parity Technologies <admin@parity.io>"]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
Expand All @@ -12,8 +12,8 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
futures = "0.3.1"
futures-timer = "3.0.2"
libp2p-core = { version = "0.30.0", path = "../../core", default-features = false }
libp2p-swarm = { version = "0.32.0", path = "../../swarm" }
libp2p-core = { version = "0.31.0", path = "../../core", default-features = false }
libp2p-swarm = { version = "0.33.0", path = "../../swarm" }
log = "0.4.1"
lru = "0.6"
prost = "0.9"
Expand Down
Loading

0 comments on commit fd41751

Please sign in to comment.