Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

protocols/: Implement Direct Connection Upgrade through Relay (DCUtR) #2438

Merged
merged 27 commits into from
Feb 8, 2022
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
7ea9809
protocols/: Implement Direct Connection Upgrade through Relay (DCUtR)
mxinden Jan 15, 2022
e6551aa
misc/metrics: Run rust fmt
mxinden Jan 15, 2022
b1cb588
protocols/dcutr: Reference merged DCUtR specification
mxinden Jan 15, 2022
c3ac0de
Merge branch 'master' of into dcutr-2
mxinden Jan 17, 2022
436d565
protocols/dcutr: Dial as_listener when DCUtR server
mxinden Jan 17, 2022
7bc75a5
protocols/dcutr: Filter relayed addresses on protocol level
mxinden Jan 19, 2022
bafef69
protocols/dcutr: Fix intra-doc link
mxinden Jan 19, 2022
cab9e38
Merge branch 'libp2p/master' into dcutr-2
mxinden Jan 19, 2022
4a5461c
protocols/dcutr/tests: Remove unused libp2p-ping
mxinden Feb 1, 2022
e7fa5e9
protocols/dcutr: Fix expect message typo
mxinden Feb 1, 2022
831deb5
protocols/dcutr: Remove empty Behaviour::inject_connected
mxinden Feb 1, 2022
c1deddb
protocols/dcutr: Rename to InitiatedDirectConnectionUpgrade
mxinden Feb 1, 2022
128d801
protocols/dcutr/examples: Use async instead of poll_fn
mxinden Feb 1, 2022
10046f2
protocols/dcutr/examples: Replace matches! with ==
mxinden Feb 1, 2022
21ae03b
protocols/dcutr/examples: Document delay hack
mxinden Feb 1, 2022
da5e48f
protocols/dcutr/examples: Remove outdated comment on relay mode
mxinden Feb 1, 2022
3b75add
protocols/dcutr/src/behaviour: Consolidate obs_addrs collection
mxinden Feb 2, 2022
9d99850
protocols/dcutr: Document reversed connection and substream roles
mxinden Feb 2, 2022
0194655
protocols/dcutr/src/handler: Don't KeepAlive::No on all errors
mxinden Feb 2, 2022
ce93ec2
protocols/dcutr: Extract MAX_NUMBER_OF_UPGRADE_ATTEMPTS constant
mxinden Feb 2, 2022
354900f
protocols/dcutr: Implement Encoder and Decoder for DCUtR prost messages
mxinden Feb 2, 2022
b50708b
protocols/dcutr: Use extend instead of double push_back
mxinden Feb 2, 2022
f18a863
protocols/dcutr: Rename Action to ActionBuilder
mxinden Feb 2, 2022
e66ad8a
Merge branch 'libp2p/master' into dcutr-2
mxinden Feb 2, 2022
d1bced7
Merge branch 'libp2p/master' into dcutr-2
mxinden Feb 3, 2022
bca9c90
Merge branch 'libp2p/master' into dcutr-2
mxinden Feb 8, 2022
7934db5
protocols/dcutr/tests: Fix flaky test
mxinden Feb 8, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ default = [
"yamux",
]
autonat = ["libp2p-autonat"]
dcutr = ["libp2p-dcutr", "libp2p-metrics/dcutr"]
deflate = ["libp2p-deflate"]
dns-async-std = ["libp2p-dns", "libp2p-dns/async-std"]
dns-tokio = ["libp2p-dns", "libp2p-dns/tokio"]
Expand Down Expand Up @@ -78,6 +79,7 @@ lazy_static = "1.2"

libp2p-autonat = { version = "0.20.0", path = "protocols/autonat", optional = true }
libp2p-core = { version = "0.31.0", path = "core", default-features = false }
libp2p-dcutr = { version = "0.1.0", path = "protocols/dcutr", optional = true }
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.33.0", path = "protocols/identify", optional = true }
Expand Down Expand Up @@ -124,6 +126,7 @@ members = [
"misc/peer-id-generator",
"muxers/mplex",
"muxers/yamux",
"protocols/dcutr",
"protocols/autonat",
"protocols/floodsub",
"protocols/gossipsub",
Expand Down
2 changes: 2 additions & 0 deletions misc/metrics/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ identify = ["libp2p-identify"]
kad = ["libp2p-kad"]
ping = ["libp2p-ping"]
relay = ["libp2p-relay"]
dcutr = ["libp2p-dcutr"]

[dependencies]
libp2p-dcutr = { version = "0.1.0", path = "../../protocols/dcutr", optional = true }
libp2p-core = { version = "0.31.0", path = "../../core", default-features = false }
libp2p-gossipsub = { version = "0.35.0", path = "../../protocols/gossipsub", optional = true }
libp2p-identify = { version = "0.33.0", path = "../../protocols/identify", optional = true }
Expand Down
89 changes: 89 additions & 0 deletions misc/metrics/src/dcutr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Copyright 2021 Protocol Labs.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

use open_metrics_client::encoding::text::Encode;
use open_metrics_client::metrics::counter::Counter;
use open_metrics_client::metrics::family::Family;
use open_metrics_client::registry::Registry;

pub struct Metrics {
events: Family<EventLabels, Counter>,
}

impl Metrics {
pub fn new(registry: &mut Registry) -> Self {
let sub_registry = registry.sub_registry_with_prefix("relay");

let events = Family::default();
sub_registry.register(
"events",
"Events emitted by the relay NetworkBehaviour",
Box::new(events.clone()),
);

Self { events }
}
}

#[derive(Debug, Clone, Hash, PartialEq, Eq, Encode)]
struct EventLabels {
event: EventType,
}

#[derive(Debug, Clone, Hash, PartialEq, Eq, Encode)]
enum EventType {
InitiateDirectConnectionUpgrade,
RemoteInitiatedDirectConnectionUpgrade,
DirectConnectionUpgradeSucceeded,
DirectConnectionUpgradeFailed,
}

impl From<&libp2p_dcutr::behaviour::Event> for EventType {
fn from(event: &libp2p_dcutr::behaviour::Event) -> Self {
match event {
libp2p_dcutr::behaviour::Event::InitiateDirectConnectionUpgrade {
remote_peer_id: _,
local_relayed_addr: _,
} => EventType::InitiateDirectConnectionUpgrade,
libp2p_dcutr::behaviour::Event::RemoteInitiatedDirectConnectionUpgrade {
remote_peer_id: _,
remote_relayed_addr: _,
} => EventType::RemoteInitiatedDirectConnectionUpgrade,
libp2p_dcutr::behaviour::Event::DirectConnectionUpgradeSucceeded {
remote_peer_id: _,
} => EventType::DirectConnectionUpgradeSucceeded,
libp2p_dcutr::behaviour::Event::DirectConnectionUpgradeFailed {
remote_peer_id: _,
error: _,
} => EventType::DirectConnectionUpgradeFailed,
}
}
}

impl super::Recorder<libp2p_dcutr::behaviour::Event> for super::Metrics {
fn record(&self, event: &libp2p_dcutr::behaviour::Event) {
self.dcutr
.events
.get_or_create(&EventLabels {
event: event.into(),
})
.inc();
}
}
6 changes: 6 additions & 0 deletions misc/metrics/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
//!
//! See `examples` directory for more.

#[cfg(feature = "dcutr")]
mod dcutr;
#[cfg(feature = "gossipsub")]
mod gossipsub;
#[cfg(feature = "identify")]
Expand All @@ -41,6 +43,8 @@ use open_metrics_client::registry::Registry;

/// Set of Swarm and protocol metrics derived from emitted events.
pub struct Metrics {
#[cfg(feature = "dcutr")]
dcutr: dcutr::Metrics,
#[cfg(feature = "gossipsub")]
gossipsub: gossipsub::Metrics,
#[cfg(feature = "identify")]
Expand All @@ -66,6 +70,8 @@ impl Metrics {
pub fn new(registry: &mut Registry) -> Self {
let sub_registry = registry.sub_registry_with_prefix("libp2p");
Self {
#[cfg(feature = "dcutr")]
dcutr: dcutr::Metrics::new(sub_registry),
#[cfg(feature = "gossipsub")]
gossipsub: gossipsub::Metrics::new(sub_registry),
#[cfg(feature = "identify")]
Expand Down
40 changes: 40 additions & 0 deletions protocols/dcutr/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
[package]
name = "libp2p-dcutr"
edition = "2021"
rust-version = "1.56.1"
description = "Direct connection upgrade through relay"
version = "0.1.0"
authors = ["Max Inden <[email protected]>"]
license = "MIT"
repository = "https://github.com/libp2p/rust-libp2p"
keywords = ["peer-to-peer", "libp2p", "networking"]
categories = ["network-programming", "asynchronous"]

[dependencies]
asynchronous-codec = "0.6"
bytes = "1"
either = "1.6.0"
futures = "0.3.1"
futures-timer = "3.0"
instant = "0.1.11"
libp2p-core = { version = "0.31", path = "../../core" }
libp2p-swarm = { version = "0.33", path = "../../swarm" }
log = "0.4"
prost = "0.7"
thiserror = "1.0"
unsigned-varint = { version = "0.7", features = ["asynchronous_codec"] }
void = "1"

[build-dependencies]
prost-build = "0.7"

[dev-dependencies]
env_logger = "0.8.3"
libp2p = { path = "../..", features = ["dcutr"] }
libp2p-identify = { path = "../identify" }
libp2p-ping = { path = "../ping" }
libp2p-plaintext = { path = "../../transports/plaintext" }
libp2p-relay = { path = "../relay" }
libp2p-yamux = { path = "../../muxers/yamux" }
rand = "0.7"
structopt = "0.3.21"
23 changes: 23 additions & 0 deletions protocols/dcutr/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright 2021 Protocol Labs.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

fn main() {
prost_build::compile_protos(&["src/message.proto"], &["src"]).unwrap();
}
Loading