mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-07-01 02:31:33 +00:00
core/: Concurrent dial attempts (#2248)
Concurrently dial address candidates within a single dial attempt. Main motivation for this feature is to increase success rate on hole punching (see https://github.com/libp2p/rust-libp2p/issues/1896#issuecomment-885894496 for details). Though, as a nice side effect, as one would expect, it does improve connection establishment time. Cleanups and fixes done along the way: - Merge `pool.rs` and `manager.rs`. - Instead of manually implementing state machines in `task.rs` use `async/await`. - Fix bug where `NetworkBehaviour::inject_connection_closed` is called without a previous `NetworkBehaviour::inject_connection_established` (see https://github.com/libp2p/rust-libp2p/issues/2242). - Return handler to behaviour on incoming connection limit error. Missed in https://github.com/libp2p/rust-libp2p/issues/2242.
This commit is contained in:
@ -23,13 +23,14 @@ pub(crate) mod handler;
|
||||
mod listeners;
|
||||
mod substream;
|
||||
|
||||
pub(crate) mod manager;
|
||||
pub(crate) mod pool;
|
||||
|
||||
pub use error::{ConnectionError, PendingConnectionError};
|
||||
pub use error::{
|
||||
ConnectionError, PendingConnectionError, PendingInboundConnectionError,
|
||||
PendingOutboundConnectionError,
|
||||
};
|
||||
pub use handler::{ConnectionHandler, ConnectionHandlerEvent, IntoConnectionHandler};
|
||||
pub use listeners::{ListenerId, ListenersEvent, ListenersStream};
|
||||
pub use manager::ConnectionId;
|
||||
pub use pool::{ConnectionCounters, ConnectionLimits};
|
||||
pub use pool::{EstablishedConnection, EstablishedConnectionIter, PendingConnection};
|
||||
pub use substream::{Close, Substream, SubstreamEndpoint};
|
||||
@ -40,6 +41,21 @@ use std::hash::Hash;
|
||||
use std::{error::Error, fmt, pin::Pin, task::Context, task::Poll};
|
||||
use substream::{Muxing, SubstreamEvent};
|
||||
|
||||
/// Connection identifier.
|
||||
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub struct ConnectionId(usize);
|
||||
|
||||
impl ConnectionId {
|
||||
/// Creates a `ConnectionId` from a non-negative integer.
|
||||
///
|
||||
/// This is primarily useful for creating connection IDs
|
||||
/// in test environments. There is in general no guarantee
|
||||
/// that all connection IDs are based on non-negative integers.
|
||||
pub fn new(id: usize) -> Self {
|
||||
ConnectionId(id)
|
||||
}
|
||||
}
|
||||
|
||||
/// The endpoint roles associated with a peer-to-peer communication channel.
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
||||
pub enum Endpoint {
|
||||
@ -72,7 +88,40 @@ impl Endpoint {
|
||||
}
|
||||
}
|
||||
|
||||
/// The endpoint roles associated with a peer-to-peer connection.
|
||||
/// The endpoint roles associated with a pending peer-to-peer connection.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
pub enum PendingPoint {
|
||||
/// The socket comes from a dialer.
|
||||
///
|
||||
/// There is no single address associated with the Dialer of a pending
|
||||
/// connection. Addresses are dialed in parallel. Only once the first dial
|
||||
/// is successful is the address of the connection known.
|
||||
Dialer,
|
||||
/// The socket comes from a listener.
|
||||
Listener {
|
||||
/// Local connection address.
|
||||
local_addr: Multiaddr,
|
||||
/// Address used to send back data to the remote.
|
||||
send_back_addr: Multiaddr,
|
||||
},
|
||||
}
|
||||
|
||||
impl From<ConnectedPoint> for PendingPoint {
|
||||
fn from(endpoint: ConnectedPoint) -> Self {
|
||||
match endpoint {
|
||||
ConnectedPoint::Dialer { .. } => PendingPoint::Dialer,
|
||||
ConnectedPoint::Listener {
|
||||
local_addr,
|
||||
send_back_addr,
|
||||
} => PendingPoint::Listener {
|
||||
local_addr,
|
||||
send_back_addr,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The endpoint roles associated with an established peer-to-peer connection.
|
||||
#[derive(PartialEq, Eq, Debug, Clone, Hash)]
|
||||
pub enum ConnectedPoint {
|
||||
/// We dialed the node.
|
||||
@ -84,7 +133,7 @@ pub enum ConnectedPoint {
|
||||
Listener {
|
||||
/// Local connection address.
|
||||
local_addr: Multiaddr,
|
||||
/// Stack of protocols used to send back data to the remote.
|
||||
/// Address used to send back data to the remote.
|
||||
send_back_addr: Multiaddr,
|
||||
},
|
||||
}
|
||||
@ -289,32 +338,23 @@ where
|
||||
pub struct IncomingInfo<'a> {
|
||||
/// Local connection address.
|
||||
pub local_addr: &'a Multiaddr,
|
||||
/// Stack of protocols used to send back data to the remote.
|
||||
/// Address used to send back data to the remote.
|
||||
pub send_back_addr: &'a Multiaddr,
|
||||
}
|
||||
|
||||
impl<'a> IncomingInfo<'a> {
|
||||
/// Builds the `ConnectedPoint` corresponding to the incoming connection.
|
||||
pub fn to_connected_point(&self) -> ConnectedPoint {
|
||||
ConnectedPoint::Listener {
|
||||
/// Builds the [`PendingPoint`] corresponding to the incoming connection.
|
||||
pub fn to_pending_point(&self) -> PendingPoint {
|
||||
PendingPoint::Listener {
|
||||
local_addr: self.local_addr.clone(),
|
||||
send_back_addr: self.send_back_addr.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Borrowed information about an outgoing connection currently being negotiated.
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct OutgoingInfo<'a> {
|
||||
pub address: &'a Multiaddr,
|
||||
pub peer_id: Option<&'a PeerId>,
|
||||
}
|
||||
|
||||
impl<'a> OutgoingInfo<'a> {
|
||||
/// Builds a `ConnectedPoint` corresponding to the outgoing connection.
|
||||
/// Builds the [`ConnectedPoint`] corresponding to the incoming connection.
|
||||
pub fn to_connected_point(&self) -> ConnectedPoint {
|
||||
ConnectedPoint::Dialer {
|
||||
address: self.address.clone(),
|
||||
ConnectedPoint::Listener {
|
||||
local_addr: self.local_addr.clone(),
|
||||
send_back_addr: self.send_back_addr.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user