From f9c3d12e7714a9e93d328d24ff2cac01c9e4fc00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Thu, 3 Aug 2023 16:03:22 +0100 Subject: [PATCH 1/7] fix(quic) allow listening on listen on ipv4 and v6 simultaneously --- Cargo.lock | 2 ++ transports/quic/Cargo.toml | 1 + transports/quic/src/transport.rs | 26 ++++++++++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ed333712a62..b1540763933 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3060,6 +3060,7 @@ dependencies = [ "quinn", "rand 0.8.5", "rustls 0.21.5", + "socket2 0.5.3", "thiserror", "tokio", ] @@ -4061,6 +4062,7 @@ dependencies = [ "async-trait", "futures", "libp2p", + "libp2p-quic", ] [[package]] diff --git a/transports/quic/Cargo.toml b/transports/quic/Cargo.toml index 5d810860912..a183d559037 100644 --- a/transports/quic/Cargo.toml +++ b/transports/quic/Cargo.toml @@ -24,6 +24,7 @@ rand = "0.8.5" rustls = { version = "0.21.2", default-features = false } thiserror = "1.0.44" tokio = { version = "1.29.1", default-features = false, features = ["net", "rt", "time"], optional = true } +socket2 = { version = "0.5.3", features = ["all"] } [features] tokio = ["dep:tokio", "if-watch/tokio", "quinn/runtime-tokio"] diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index d4a1db35604..69a97e21e24 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -37,12 +37,13 @@ use libp2p_core::{ Transport, }; use libp2p_identity::PeerId; +use socket2::{Domain, Socket, Type}; use std::collections::hash_map::{DefaultHasher, Entry}; use std::collections::HashMap; -use std::fmt; use std::hash::{Hash, Hasher}; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, UdpSocket}; use std::time::Duration; +use std::{fmt, io}; use std::{ net::SocketAddr, pin::Pin, @@ -172,6 +173,19 @@ impl GenTransport

{ } } } + + fn create_socket(&self, socket_addr: &SocketAddr) -> io::Result { + let domain = if socket_addr.is_ipv4() { + Domain::IPV4 + } else { + Domain::IPV6 + }; + let socket = Socket::new(domain, Type::DGRAM, Some(socket2::Protocol::UDP))?; + if socket_addr.is_ipv6() { + socket.set_only_v6(true)?; + } + Ok(socket) + } } impl Transport for GenTransport

{ @@ -188,7 +202,15 @@ impl Transport for GenTransport

{ let (socket_addr, version, _peer_id) = self.remote_multiaddr_to_socketaddr(addr, false)?; let endpoint_config = self.quinn_config.endpoint_config.clone(); let server_config = self.quinn_config.server_config.clone(); - let socket = UdpSocket::bind(socket_addr).map_err(Self::Error::from)?; + let socket = self + .create_socket(&socket_addr) + .map_err(Self::Error::from)?; + + socket + .bind(&socket_addr.into()) + .map_err(Self::Error::from)?; + + let socket: UdpSocket = socket.into(); let socket_c = socket.try_clone().map_err(Self::Error::from)?; let endpoint = Self::new_endpoint(endpoint_config, Some(server_config), socket)?; let listener = Listener::new( From bc8c7215d3e820ff127df8b3bdf26873beb2a7d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Thu, 3 Aug 2023 17:20:45 +0100 Subject: [PATCH 2/7] address review --- Cargo.lock | 1 - transports/quic/Cargo.toml | 2 +- transports/quic/src/transport.rs | 12 ++++-------- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b49681cc051..79e50e0172c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4062,7 +4062,6 @@ dependencies = [ "async-trait", "futures", "libp2p", - "libp2p-quic", ] [[package]] diff --git a/transports/quic/Cargo.toml b/transports/quic/Cargo.toml index a183d559037..06beb5554b1 100644 --- a/transports/quic/Cargo.toml +++ b/transports/quic/Cargo.toml @@ -24,7 +24,7 @@ rand = "0.8.5" rustls = { version = "0.21.2", default-features = false } thiserror = "1.0.44" tokio = { version = "1.29.1", default-features = false, features = ["net", "rt", "time"], optional = true } -socket2 = { version = "0.5.3", features = ["all"] } +socket2 = { version = "0.5.3" } [features] tokio = ["dep:tokio", "if-watch/tokio", "quinn/runtime-tokio"] diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index 69a97e21e24..ad92dc78bcd 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -174,7 +174,7 @@ impl GenTransport

{ } } - fn create_socket(&self, socket_addr: &SocketAddr) -> io::Result { + fn create_socket(&self, socket_addr: SocketAddr) -> io::Result { let domain = if socket_addr.is_ipv4() { Domain::IPV4 } else { @@ -184,6 +184,8 @@ impl GenTransport

{ if socket_addr.is_ipv6() { socket.set_only_v6(true)?; } + + socket.bind(&socket_addr.into())?; Ok(socket) } } @@ -202,13 +204,7 @@ impl Transport for GenTransport

{ let (socket_addr, version, _peer_id) = self.remote_multiaddr_to_socketaddr(addr, false)?; let endpoint_config = self.quinn_config.endpoint_config.clone(); let server_config = self.quinn_config.server_config.clone(); - let socket = self - .create_socket(&socket_addr) - .map_err(Self::Error::from)?; - - socket - .bind(&socket_addr.into()) - .map_err(Self::Error::from)?; + let socket = self.create_socket(socket_addr).map_err(Self::Error::from)?; let socket: UdpSocket = socket.into(); let socket_c = socket.try_clone().map_err(Self::Error::from)?; From 118a178a0b2a242cef8fc29c182bf5f51c0d2371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Fri, 4 Aug 2023 11:00:58 +0100 Subject: [PATCH 3/7] address another round of review --- transports/quic/CHANGELOG.md | 6 ++++++ transports/quic/src/transport.rs | 27 ++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/transports/quic/CHANGELOG.md b/transports/quic/CHANGELOG.md index 11ee1e63394..92c4c52a57b 100644 --- a/transports/quic/CHANGELOG.md +++ b/transports/quic/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.9.1-alpha +- Allow listening on ipv4 and ipv6 seperately. + See [PR 4289]. + +[PR 4289]: https://github.com/libp2p/rust-libp2p/pull/4289 + ## 0.9.0-alpha - Use `quinn` instead of `quinn-proto`. diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index ad92dc78bcd..48ada40b269 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -174,7 +174,7 @@ impl GenTransport

{ } } - fn create_socket(&self, socket_addr: SocketAddr) -> io::Result { + fn create_socket(&self, socket_addr: SocketAddr) -> io::Result { let domain = if socket_addr.is_ipv4() { Domain::IPV4 } else { @@ -186,7 +186,8 @@ impl GenTransport

{ } socket.bind(&socket_addr.into())?; - Ok(socket) + + Ok(socket.into()) } } @@ -206,7 +207,6 @@ impl Transport for GenTransport

{ let server_config = self.quinn_config.server_config.clone(); let socket = self.create_socket(socket_addr).map_err(Self::Error::from)?; - let socket: UdpSocket = socket.into(); let socket_c = socket.try_clone().map_err(Self::Error::from)?; let endpoint = Self::new_endpoint(endpoint_config, Some(server_config), socket)?; let listener = Listener::new( @@ -906,4 +906,25 @@ mod test { .unwrap(); assert!(!transport.dialer.contains_key(&SocketFamily::Ipv4)); } + + #[cfg(feature = "tokio")] + #[tokio::test] + async fn test_listens_ipv4_ipv6_separately() { + let keypair = libp2p_identity::Keypair::generate_ed25519(); + let config = Config::new(&keypair); + let mut transport = crate::tokio::Transport::new(config); + + transport + .listen_on( + ListenerId::next(), + "/ip4/0.0.0.0/udp/4001/quic-v1".parse().unwrap(), + ) + .unwrap(); + transport + .listen_on( + ListenerId::next(), + "/ip6/::/udp/4001/quic-v1".parse().unwrap(), + ) + .unwrap(); + } } From e1adc7b9b7b280c378bc15ffe110b284d6b05380 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Sun, 6 Aug 2023 11:35:45 +0200 Subject: [PATCH 4/7] Update transports/quic/CHANGELOG.md --- transports/quic/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/transports/quic/CHANGELOG.md b/transports/quic/CHANGELOG.md index 92c4c52a57b..89612fb82c5 100644 --- a/transports/quic/CHANGELOG.md +++ b/transports/quic/CHANGELOG.md @@ -1,4 +1,5 @@ -## 0.9.1-alpha +## 0.9.1-alpha - unreleased + - Allow listening on ipv4 and ipv6 seperately. See [PR 4289]. From 0ff82f661736bcc481205c2c42f4176b15cf867b Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Sun, 6 Aug 2023 11:36:05 +0200 Subject: [PATCH 5/7] Update transports/quic/CHANGELOG.md --- transports/quic/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transports/quic/CHANGELOG.md b/transports/quic/CHANGELOG.md index 89612fb82c5..7e0c09a1511 100644 --- a/transports/quic/CHANGELOG.md +++ b/transports/quic/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.9.1-alpha - unreleased -- Allow listening on ipv4 and ipv6 seperately. +- Allow listening on ipv4 and ipv6 separately. See [PR 4289]. [PR 4289]: https://github.com/libp2p/rust-libp2p/pull/4289 From 5c80468e50b70afb6176e0060526da0c8a13ca5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Mon, 7 Aug 2023 20:51:29 +0100 Subject: [PATCH 6/7] address review --- Cargo.lock | 3 ++- Cargo.toml | 2 +- transports/quic/Cargo.toml | 4 ++-- transports/quic/src/transport.rs | 11 +++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79e50e0172c..721869fd3cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3039,7 +3039,7 @@ dependencies = [ [[package]] name = "libp2p-quic" -version = "0.9.0-alpha" +version = "0.9.1-alpha" dependencies = [ "async-std", "bytes", @@ -4062,6 +4062,7 @@ dependencies = [ "async-trait", "futures", "libp2p", + "libp2p-quic", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index cf73ebc0056..b688360067f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -83,7 +83,7 @@ libp2p-perf = { version = "0.2.0", path = "protocols/perf" } libp2p-ping = { version = "0.43.0", path = "protocols/ping" } libp2p-plaintext = { version = "0.40.0", path = "transports/plaintext" } libp2p-pnet = { version = "0.23.0", path = "transports/pnet" } -libp2p-quic = { version = "0.9.0-alpha", path = "transports/quic" } +libp2p-quic = { version = "0.9.1-alpha", path = "transports/quic" } libp2p-relay = { version = "0.16.1", path = "protocols/relay" } libp2p-rendezvous = { version = "0.13.0", path = "protocols/rendezvous" } libp2p-request-response = { version = "0.25.1", path = "protocols/request-response" } diff --git a/transports/quic/Cargo.toml b/transports/quic/Cargo.toml index 06beb5554b1..67f131aeb31 100644 --- a/transports/quic/Cargo.toml +++ b/transports/quic/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libp2p-quic" -version = "0.9.0-alpha" +version = "0.9.1-alpha" authors = ["Parity Technologies "] edition = "2021" rust-version = { workspace = true } @@ -24,7 +24,7 @@ rand = "0.8.5" rustls = { version = "0.21.2", default-features = false } thiserror = "1.0.44" tokio = { version = "1.29.1", default-features = false, features = ["net", "rt", "time"], optional = true } -socket2 = { version = "0.5.3" } +socket2 = "0.5.3" [features] tokio = ["dep:tokio", "if-watch/tokio", "quinn/runtime-tokio"] diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index 48ada40b269..7e0a4a812f7 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -175,12 +175,11 @@ impl GenTransport

{ } fn create_socket(&self, socket_addr: SocketAddr) -> io::Result { - let domain = if socket_addr.is_ipv4() { - Domain::IPV4 - } else { - Domain::IPV6 - }; - let socket = Socket::new(domain, Type::DGRAM, Some(socket2::Protocol::UDP))?; + let socket = Socket::new( + Domain::for_address(socket_addr), + Type::DGRAM, + Some(socket2::Protocol::UDP), + )?; if socket_addr.is_ipv6() { socket.set_only_v6(true)?; } From a655de3e14113615e8a74fd11448ec4d29d7140f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Tue, 8 Aug 2023 17:13:29 +0100 Subject: [PATCH 7/7] update Cargo.lock --- Cargo.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index c66be9e578e..85f8295cb82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4062,7 +4062,6 @@ dependencies = [ "async-trait", "futures", "libp2p", - "libp2p-quic", ] [[package]]