From 6c4584a893e53e72a743950ff235b751595655fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Tue, 15 Aug 2023 00:00:41 +0100 Subject: [PATCH 1/4] chore: improve Tcp Transport::create_socket and add test for listening on ipv4 and ipv6 separately. --- transports/tcp/src/lib.rs | 48 +++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/transports/tcp/src/lib.rs b/transports/tcp/src/lib.rs index b1737cf7bed..3ee77f3cd7e 100644 --- a/transports/tcp/src/lib.rs +++ b/transports/tcp/src/lib.rs @@ -346,13 +346,12 @@ where } } - 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::STREAM, Some(socket2::Protocol::TCP))?; + fn create_socket(&self, socket_addr: SocketAddr) -> io::Result { + let socket = Socket::new( + Domain::for_address(socket_addr), + Type::STREAM, + Some(socket2::Protocol::TCP), + )?; if socket_addr.is_ipv6() { socket.set_only_v6(true)?; } @@ -375,7 +374,7 @@ where id: ListenerId, socket_addr: SocketAddr, ) -> io::Result> { - let socket = self.create_socket(&socket_addr)?; + let socket = self.create_socket(socket_addr)?; socket.bind(&socket_addr.into())?; socket.listen(self.config.backlog as _)?; socket.set_nonblocking(true)?; @@ -476,7 +475,7 @@ where log::debug!("dialing {}", socket_addr); let socket = self - .create_socket(&socket_addr) + .create_socket(socket_addr) .map_err(TransportError::Other)?; if let Some(addr) = self.port_reuse.local_dial_addr(&socket_addr.ip()) { @@ -1329,4 +1328,35 @@ mod tests { assert!(rt.block_on(cycle_listeners::())); } } + + #[test] + fn test_listens_ipv4_ipv6_separately() { + fn test(port: u16) { + let mut tcp = Transport::::default().boxed(); + let listener_id = ListenerId::next(); + tcp.listen_on( + listener_id, + format!("/ip4/0.0.0.0/tcp/{port}").parse().unwrap(), + ) + .unwrap(); + tcp.listen_on( + ListenerId::next(), + format!("/ip6/::/tcp/{port}").parse().unwrap(), + ) + .unwrap(); + } + #[cfg(feature = "async-io")] + { + async_std::task::block_on(async { + test::(3001); + }) + } + let rt = ::tokio::runtime::Builder::new_current_thread() + .enable_io() + .build() + .unwrap(); + rt.block_on(async { + test::(4001); + }); + } } From f4bfa4f8eaeb70a717738f8a7a57328574c823e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Tue, 15 Aug 2023 09:38:27 +0100 Subject: [PATCH 2/4] feature gate tokio test --- transports/tcp/src/lib.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/transports/tcp/src/lib.rs b/transports/tcp/src/lib.rs index 3ee77f3cd7e..f94df8b551b 100644 --- a/transports/tcp/src/lib.rs +++ b/transports/tcp/src/lib.rs @@ -1351,12 +1351,15 @@ mod tests { test::(3001); }) } - let rt = ::tokio::runtime::Builder::new_current_thread() - .enable_io() - .build() - .unwrap(); - rt.block_on(async { - test::(4001); - }); + #[cfg(feature = "tokio")] + { + let rt = ::tokio::runtime::Builder::new_current_thread() + .enable_io() + .build() + .unwrap(); + rt.block_on(async { + test::(4001); + }); + } } } From 51a2fae6d6cb30e289bb167af48cf8060840c144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Wed, 16 Aug 2023 11:56:03 +0100 Subject: [PATCH 3/4] update test to use dynamic port allocation --- transports/tcp/src/lib.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/transports/tcp/src/lib.rs b/transports/tcp/src/lib.rs index f94df8b551b..5efdf16fff5 100644 --- a/transports/tcp/src/lib.rs +++ b/transports/tcp/src/lib.rs @@ -1331,7 +1331,11 @@ mod tests { #[test] fn test_listens_ipv4_ipv6_separately() { - fn test(port: u16) { + fn test() { + let port = { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + listener.local_addr().unwrap().port() + }; let mut tcp = Transport::::default().boxed(); let listener_id = ListenerId::next(); tcp.listen_on( @@ -1348,7 +1352,7 @@ mod tests { #[cfg(feature = "async-io")] { async_std::task::block_on(async { - test::(3001); + test::(); }) } #[cfg(feature = "tokio")] @@ -1358,7 +1362,7 @@ mod tests { .build() .unwrap(); rt.block_on(async { - test::(4001); + test::(); }); } } From af954da24b1fc8ac7a3deff0e49d07599fed2107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Wed, 16 Aug 2023 12:05:11 +0100 Subject: [PATCH 4/4] update quic test_listens_ipv4_ipv6_separately to use dynamic port allocation as well. --- transports/quic/src/transport.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index 9f025cd63fc..16ffbc5a163 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -926,17 +926,21 @@ mod tests { let keypair = libp2p_identity::Keypair::generate_ed25519(); let config = Config::new(&keypair); let mut transport = crate::tokio::Transport::new(config); + let port = { + let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); + socket.local_addr().unwrap().port() + }; transport .listen_on( ListenerId::next(), - "/ip4/0.0.0.0/udp/4001/quic-v1".parse().unwrap(), + format!("/ip4/0.0.0.0/udp/{port}/quic-v1").parse().unwrap(), ) .unwrap(); transport .listen_on( ListenerId::next(), - "/ip6/::/udp/4001/quic-v1".parse().unwrap(), + format!("/ip6/::/udp/{port}/quic-v1").parse().unwrap(), ) .unwrap(); }