From 21bcda9ad54b9faad50b154106490820f0905bc6 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Wed, 24 Aug 2022 12:55:58 +0100 Subject: [PATCH 1/5] Add `ReadyUpgrade` --- core/src/upgrade.rs | 2 ++ core/src/upgrade/ready.rs | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 core/src/upgrade/ready.rs diff --git a/core/src/upgrade.rs b/core/src/upgrade.rs index 34a27cdf77a..de9ef765e16 100644 --- a/core/src/upgrade.rs +++ b/core/src/upgrade.rs @@ -65,6 +65,7 @@ mod from_fn; mod map; mod optional; mod pending; +mod ready; mod select; mod transfer; @@ -79,6 +80,7 @@ pub use self::{ map::{MapInboundUpgrade, MapInboundUpgradeErr, MapOutboundUpgrade, MapOutboundUpgradeErr}, optional::OptionalUpgrade, pending::PendingUpgrade, + ready::ReadyUpgrade, select::SelectUpgrade, transfer::{read_length_prefixed, read_varint, write_length_prefixed, write_varint}, }; diff --git a/core/src/upgrade/ready.rs b/core/src/upgrade/ready.rs new file mode 100644 index 00000000000..16a9b2867f4 --- /dev/null +++ b/core/src/upgrade/ready.rs @@ -0,0 +1,75 @@ +// Copyright 2022 Protocol Labs. +// Copyright 2017-2018 Parity Technologies (UK) Ltd. +// +// 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 crate::upgrade::{InboundUpgrade, OutboundUpgrade, ProtocolName, UpgradeInfo}; +use futures::future; +use std::iter; +use void::Void; + +/// Implementation of [`UpgradeInfo`], [`InboundUpgrade`] and [`OutboundUpgrade`] that directly yields the substream. +#[derive(Debug, Copy, Clone)] +pub struct ReadyUpgrade

{ + protocol_name: P, +} + +impl

ReadyUpgrade

{ + pub fn new(protocol_name: P) -> Self { + Self { protocol_name } + } +} + +impl

UpgradeInfo for ReadyUpgrade

+where + P: ProtocolName + Clone, +{ + type Info = P; + type InfoIter = iter::Once

; + + fn protocol_info(&self) -> Self::InfoIter { + iter::once(self.protocol_name.clone()) + } +} + +impl InboundUpgrade for ReadyUpgrade

+where + P: ProtocolName + Clone, +{ + type Output = C; + type Error = Void; + type Future = future::Ready>; + + fn upgrade_inbound(self, stream: C, _: Self::Info) -> Self::Future { + future::ready(Ok(stream)) + } +} + +impl OutboundUpgrade for ReadyUpgrade

+where + P: ProtocolName + Clone, +{ + type Output = C; + type Error = Void; + type Future = future::Ready>; + + fn upgrade_outbound(self, stream: C, _: Self::Info) -> Self::Future { + future::ready(Ok(stream)) + } +} From 6dc88179b76303e964bc16eb140ea5ce58645233 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Tue, 30 Aug 2022 11:24:58 +0200 Subject: [PATCH 2/5] Add changelog entry --- core/CHANGELOG.md | 6 ++++++ core/Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 8e3bd24906b..76bd7d72fd9 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.35.2 [unreleased] + +- Add `ReadyUpgrade`. See [PR XXXX]. + +[PR XXXX]: https://github.com/libp2p/rust-libp2p/pull/XXXX + # 0.35.1 - Update to `p256` `v0.11.0`. See [PR 2636]. diff --git a/core/Cargo.toml b/core/Cargo.toml index d20934adf1e..865ae34a712 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-core" edition = "2021" rust-version = "1.56.1" description = "Core traits and structs of libp2p" -version = "0.35.1" +version = "0.35.2" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" From 04350bed17ec81cd1f6a5ddc1d77725391eafc59 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Tue, 30 Aug 2022 19:26:01 +1000 Subject: [PATCH 3/5] Update core/CHANGELOG.md --- core/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 76bd7d72fd9..7d8c875b701 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,8 +1,8 @@ # 0.35.2 [unreleased] -- Add `ReadyUpgrade`. See [PR XXXX]. +- Add `ReadyUpgrade`. See [PR 2855]. -[PR XXXX]: https://github.com/libp2p/rust-libp2p/pull/XXXX +[PR 2855]: https://github.com/libp2p/rust-libp2p/pull/2855 # 0.35.1 From 50ab8477f50275a5a5cf8d70eabf97a09a4cb8a0 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Fri, 2 Sep 2022 11:11:01 +0200 Subject: [PATCH 4/5] Use `ReadyUpgrade` for ping protocol --- protocols/ping/src/handler.rs | 16 ++++++++------- protocols/ping/src/protocol.rs | 36 ++-------------------------------- 2 files changed, 11 insertions(+), 41 deletions(-) diff --git a/protocols/ping/src/handler.rs b/protocols/ping/src/handler.rs index 850f4ebc05f..f0e71fb070e 100644 --- a/protocols/ping/src/handler.rs +++ b/protocols/ping/src/handler.rs @@ -18,10 +18,11 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -use crate::protocol; +use crate::{protocol, PROTOCOL_NAME}; use futures::future::BoxFuture; use futures::prelude::*; use futures_timer::Delay; +use libp2p_core::upgrade::ReadyUpgrade; use libp2p_core::{upgrade::NegotiationError, UpgradeError}; use libp2p_swarm::{ ConnectionHandler, ConnectionHandlerEvent, ConnectionHandlerUpgrErr, KeepAlive, @@ -225,13 +226,13 @@ impl ConnectionHandler for Handler { type InEvent = Void; type OutEvent = crate::Result; type Error = Failure; - type InboundProtocol = protocol::Ping; - type OutboundProtocol = protocol::Ping; + type InboundProtocol = ReadyUpgrade<&'static [u8]>; + type OutboundProtocol = ReadyUpgrade<&'static [u8]>; type OutboundOpenInfo = (); type InboundOpenInfo = (); - fn listen_protocol(&self) -> SubstreamProtocol { - SubstreamProtocol::new(protocol::Ping, ()) + fn listen_protocol(&self) -> SubstreamProtocol, ()> { + SubstreamProtocol::new(ReadyUpgrade::new(PROTOCOL_NAME), ()) } fn inject_fully_negotiated_inbound(&mut self, stream: NegotiatedSubstream, (): ()) { @@ -274,7 +275,8 @@ impl ConnectionHandler for Handler { fn poll( &mut self, cx: &mut Context<'_>, - ) -> Poll> { + ) -> Poll, (), crate::Result, Self::Error>> + { match self.state { State::Inactive { reported: true } => { return Poll::Pending; // nothing to do on this connection @@ -366,7 +368,7 @@ impl ConnectionHandler for Handler { } None => { self.outbound = Some(PingState::OpenStream); - let protocol = SubstreamProtocol::new(protocol::Ping, ()) + let protocol = SubstreamProtocol::new(ReadyUpgrade::new(PROTOCOL_NAME), ()) .with_timeout(self.config.timeout); return Poll::Ready(ConnectionHandlerEvent::OutboundSubstreamRequest { protocol, diff --git a/protocols/ping/src/protocol.rs b/protocols/ping/src/protocol.rs index 659040e2d7f..3c44adcd0b4 100644 --- a/protocols/ping/src/protocol.rs +++ b/protocols/ping/src/protocol.rs @@ -20,13 +20,10 @@ use futures::prelude::*; use instant::Instant; -use libp2p_core::{InboundUpgrade, OutboundUpgrade, UpgradeInfo}; -use libp2p_swarm::NegotiatedSubstream; use rand::{distributions, prelude::*}; -use std::{io, iter, time::Duration}; -use void::Void; +use std::{io, time::Duration}; -pub const PROTOCOL_NAME: &[u8; 16] = b"/ipfs/ping/1.0.0"; +pub const PROTOCOL_NAME: &[u8] = b"/ipfs/ping/1.0.0"; /// The `Ping` protocol upgrade. /// @@ -52,35 +49,6 @@ pub struct Ping; const PING_SIZE: usize = 32; -impl UpgradeInfo for Ping { - type Info = &'static [u8]; - type InfoIter = iter::Once; - - fn protocol_info(&self) -> Self::InfoIter { - iter::once(PROTOCOL_NAME) - } -} - -impl InboundUpgrade for Ping { - type Output = NegotiatedSubstream; - type Error = Void; - type Future = future::Ready>; - - fn upgrade_inbound(self, stream: NegotiatedSubstream, _: Self::Info) -> Self::Future { - future::ok(stream) - } -} - -impl OutboundUpgrade for Ping { - type Output = NegotiatedSubstream; - type Error = Void; - type Future = future::Ready>; - - fn upgrade_outbound(self, stream: NegotiatedSubstream, _: Self::Info) -> Self::Future { - future::ok(stream) - } -} - /// Sends a ping and waits for the pong. pub async fn send_ping(mut stream: S) -> io::Result<(S, Duration)> where From 8058018af5a43eaddd2828550962bf88a9f3e645 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Mon, 5 Sep 2022 17:18:29 +0200 Subject: [PATCH 5/5] Have `libp2p-ping` use correct `libp2p-core` version --- protocols/ping/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/ping/Cargo.toml b/protocols/ping/Cargo.toml index 568f8f83aac..ff80d085997 100644 --- a/protocols/ping/Cargo.toml +++ b/protocols/ping/Cargo.toml @@ -14,7 +14,7 @@ categories = ["network-programming", "asynchronous"] futures = "0.3.1" futures-timer = "3.0.2" instant = "0.1.11" -libp2p-core = { version = "0.35.0", path = "../../core", default-features = false } +libp2p-core = { version = "0.35.2", path = "../../core", default-features = false } libp2p-swarm = { version = "0.39.0", path = "../../swarm" } log = "0.4.1" rand = "0.7.2"