From 5fe3e1cac44731d9c5aa43cb0ce9e41a1349a0a9 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 21 Jul 2022 17:07:45 +0300 Subject: [PATCH 1/3] Add an ignored test to dial ipv6 from ipv4 --- transports/quic/tests/smoke.rs | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/transports/quic/tests/smoke.rs b/transports/quic/tests/smoke.rs index dbd66815406..a2c3110b056 100644 --- a/transports/quic/tests/smoke.rs +++ b/transports/quic/tests/smoke.rs @@ -542,3 +542,38 @@ async fn endpoint_reuse() -> Result<()> { Ok(()) } + +#[async_std::test] +#[ignore] +async fn ipv4_dial_ipv6() -> Result<()> { + setup_global_subscriber(); + + let mut swarm_a = create_swarm(false).await?; + let mut swarm_b = create_swarm(false).await?; + + swarm_a.listen_on("/ip6/::1/udp/0/quic".parse()?)?; + let a_addr = match swarm_a.next().await { + Some(SwarmEvent::NewListenAddr { address, .. }) => address, + e => panic!("{:?}", e), + }; + + swarm_b.dial(a_addr.clone()).unwrap(); + + loop { + select! { + ev = swarm_a.select_next_some() => match ev { + SwarmEvent::ConnectionEstablished { .. } => { + return Ok(()) + } + SwarmEvent::IncomingConnection { local_addr, ..} => { + assert!(swarm_a.listeners().any(|a| a == &local_addr)); + } + e => panic!("{:?}", e), + }, + ev = swarm_b.select_next_some() => match ev { + SwarmEvent::ConnectionEstablished { .. } => {}, + e => panic!("{:?}", e), + } + } + }; +} From 574d534c4a8c4ea5ca2e6695780bdfa48f7dbb8f Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 21 Jul 2022 17:49:51 +0300 Subject: [PATCH 2/3] Get rid of recursion in poll_if_addr --- transports/quic/src/transport.rs | 82 +++++++++++++++----------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index f0a483eeba3..70595f6a326 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -236,57 +236,53 @@ impl Listener { /// Poll for a next If Event. fn poll_if_addr(&mut self, cx: &mut Context<'_>) -> Option<::Item> { - match self.in_addr.poll_next_unpin(cx) { - Poll::Ready(mut item) => { - if let Some(item) = item.take() { - // Consume all events for up/down interface changes. - match item { - Ok(IfEvent::Up(inet)) => { - let ip = inet.addr(); - if self.endpoint.socket_addr().is_ipv4() == ip.is_ipv4() { - let socket_addr = - SocketAddr::new(ip, self.endpoint.socket_addr().port()); - let ma = socketaddr_to_multiaddr(&socket_addr); - tracing::debug!("New listen address: {}", ma); - Some(TransportEvent::NewAddress { - listener_id: self.listener_id, - listen_addr: ma, - }) - } else { - self.poll_if_addr(cx) + loop { + match self.in_addr.poll_next_unpin(cx) { + Poll::Ready(mut item) => { + if let Some(item) = item.take() { + // Consume all events for up/down interface changes. + match item { + Ok(IfEvent::Up(inet)) => { + let ip = inet.addr(); + if self.endpoint.socket_addr().is_ipv4() == ip.is_ipv4() { + let socket_addr = + SocketAddr::new(ip, self.endpoint.socket_addr().port()); + let ma = socketaddr_to_multiaddr(&socket_addr); + tracing::debug!("New listen address: {}", ma); + return Some(TransportEvent::NewAddress { + listener_id: self.listener_id, + listen_addr: ma, + }) + } } - } - Ok(IfEvent::Down(inet)) => { - let ip = inet.addr(); - if self.endpoint.socket_addr().is_ipv4() == ip.is_ipv4() { - let socket_addr = - SocketAddr::new(ip, self.endpoint.socket_addr().port()); - let ma = socketaddr_to_multiaddr(&socket_addr); - tracing::debug!("Expired listen address: {}", ma); - Some(TransportEvent::AddressExpired { + Ok(IfEvent::Down(inet)) => { + let ip = inet.addr(); + if self.endpoint.socket_addr().is_ipv4() == ip.is_ipv4() { + let socket_addr = + SocketAddr::new(ip, self.endpoint.socket_addr().port()); + let ma = socketaddr_to_multiaddr(&socket_addr); + tracing::debug!("Expired listen address: {}", ma); + return Some(TransportEvent::AddressExpired { + listener_id: self.listener_id, + listen_addr: ma, + }) + } + } + Err(err) => { + tracing::debug! { + "Failure polling interfaces: {:?}.", + err + }; + return Some(TransportEvent::ListenerError { listener_id: self.listener_id, - listen_addr: ma, + error: err.into(), }) - } else { - self.poll_if_addr(cx) } } - Err(err) => { - tracing::debug! { - "Failure polling interfaces: {:?}.", - err - }; - Some(TransportEvent::ListenerError { - listener_id: self.listener_id, - error: err.into(), - }) - } } - } else { - self.poll_if_addr(cx) } + Poll::Pending => return None, } - Poll::Pending => None, } } } From 9e1cc81967f0dff6d75f81ee6b4ae84a29d98e54 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Fri, 22 Jul 2022 10:53:35 +0300 Subject: [PATCH 3/3] cargo fmt --- transports/quic/src/transport.rs | 6 +++--- transports/quic/tests/smoke.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index 70595f6a326..7a80259ccd8 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -252,7 +252,7 @@ impl Listener { return Some(TransportEvent::NewAddress { listener_id: self.listener_id, listen_addr: ma, - }) + }); } } Ok(IfEvent::Down(inet)) => { @@ -265,7 +265,7 @@ impl Listener { return Some(TransportEvent::AddressExpired { listener_id: self.listener_id, listen_addr: ma, - }) + }); } } Err(err) => { @@ -276,7 +276,7 @@ impl Listener { return Some(TransportEvent::ListenerError { listener_id: self.listener_id, error: err.into(), - }) + }); } } } diff --git a/transports/quic/tests/smoke.rs b/transports/quic/tests/smoke.rs index a2c3110b056..a5539cb3ed2 100644 --- a/transports/quic/tests/smoke.rs +++ b/transports/quic/tests/smoke.rs @@ -575,5 +575,5 @@ async fn ipv4_dial_ipv6() -> Result<()> { e => panic!("{:?}", e), } } - }; + } }