From 5b8c3d290187b888b2afc8288c8e0b5843ef4964 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 6 Jan 2023 10:32:18 +0100 Subject: [PATCH] fix(quic): Identify `/quic` as QUIC address (#3288) Identify multiaddress with `/quic` (draft 29) as QUIC address in case `support_draft_29` is `true`. Without this patch the Rust punchr client would discard any QUIC addresses with `/quic` in its `Transport::address_translation`. Thus `/quic` based observed addresses from `libp2p-identify` would not be added to the local set of external addresses and thus QUIC would not be available as a transport for hole punching. --- transports/quic/src/transport.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/transports/quic/src/transport.rs b/transports/quic/src/transport.rs index 8d122424b1b..9f66fe49724 100644 --- a/transports/quic/src/transport.rs +++ b/transports/quic/src/transport.rs @@ -128,7 +128,9 @@ impl Transport for GenTransport

{ } fn address_translation(&self, listen: &Multiaddr, observed: &Multiaddr) -> Option { - if !is_quic_addr(listen) || !is_quic_addr(observed) { + if !is_quic_addr(listen, self.support_draft_29) + || !is_quic_addr(observed, self.support_draft_29) + { return None; } Some(observed.clone()) @@ -597,7 +599,7 @@ fn multiaddr_to_socketaddr( } /// Whether an [`Multiaddr`] is a valid for the QUIC transport. -fn is_quic_addr(addr: &Multiaddr) -> bool { +fn is_quic_addr(addr: &Multiaddr, support_draft_29: bool) -> bool { use Protocol::*; let mut iter = addr.iter(); let first = match iter.next() { @@ -617,7 +619,11 @@ fn is_quic_addr(addr: &Multiaddr) -> bool { matches!(first, Ip4(_) | Ip6(_) | Dns(_) | Dns4(_) | Dns6(_)) && matches!(second, Udp(_)) - && matches!(third, QuicV1) + && if support_draft_29 { + matches!(third, QuicV1 | Quic) + } else { + matches!(third, QuicV1) + } && matches!(fourth, Some(P2p(_)) | None) && matches!(fifth, None) }