From e92c6a219b3851772b9d720a7a822c0634f3acef Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 19 Feb 2019 16:44:07 +0100 Subject: [PATCH] Make TcpConfig::nat_traversal work with IPv6 (#956) --- transports/tcp/src/lib.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/transports/tcp/src/lib.rs b/transports/tcp/src/lib.rs index 19fd0182..c8023d84 100644 --- a/transports/tcp/src/lib.rs +++ b/transports/tcp/src/lib.rs @@ -188,8 +188,10 @@ impl Transport for TcpConfig { // Use the observed IP address. match server.iter().zip(observed.iter()).next() { - Some((Protocol::Ip4(_), x@Protocol::Ip4(_))) => address.append(x), - Some((Protocol::Ip6(_), x@Protocol::Ip6(_))) => address.append(x), + Some((Protocol::Ip4(_), x @ Protocol::Ip4(_))) => address.append(x), + Some((Protocol::Ip6(_), x @ Protocol::Ip4(_))) => address.append(x), + Some((Protocol::Ip4(_), x @ Protocol::Ip6(_))) => address.append(x), + Some((Protocol::Ip6(_), x @ Protocol::Ip6(_))) => address.append(x), _ => return None } @@ -533,4 +535,32 @@ mod tests { "/ip4/80.81.82.83/tcp/10000".parse::().unwrap() ); } + + #[test] + fn nat_traversal_ipv6_to_ipv4() { + let tcp = TcpConfig::new(); + + let server = "/ip6/::1/tcp/10000".parse::().unwrap(); + let observed = "/ip4/80.81.82.83/tcp/25000".parse::().unwrap(); + + let out = tcp.nat_traversal(&server, &observed); + assert_eq!( + out.unwrap(), + "/ip4/80.81.82.83/tcp/10000".parse::().unwrap() + ); + } + + #[test] + fn nat_traversal_ipv4_to_ipv6() { + let tcp = TcpConfig::new(); + + let server = "/ip4/127.0.0.1/tcp/10000".parse::().unwrap(); + let observed = "/ip6/2001:db8::1/tcp/25000".parse::().unwrap(); + + let out = tcp.nat_traversal(&server, &observed); + assert_eq!( + out.unwrap(), + "/ip6/2001:db8::1/tcp/10000".parse::().unwrap() + ); + } }