diff --git a/netstack/src/scheme/mod.rs b/netstack/src/scheme/mod.rs index 0ffa062697..fa4dae29d2 100644 --- a/netstack/src/scheme/mod.rs +++ b/netstack/src/scheme/mod.rs @@ -18,7 +18,7 @@ use smoltcp::phy::Tracer; use smoltcp::socket::AnySocket; use smoltcp::time::{Duration, Instant}; use smoltcp::wire::{ - EthernetAddress, HardwareAddress, IpAddress, IpCidr, IpListenEndpoint, Ipv4Address, + EthernetAddress, HardwareAddress, IpAddress, IpCidr, IpListenEndpoint, Ipv4Address, Ipv6Address, }; use std::cell::RefCell; use std::fs::File; @@ -377,17 +377,30 @@ fn post_fevent(socket: &Socket, id: usize, flags: usize) -> syscall::error::Resu } fn parse_endpoint(socket: &str) -> IpListenEndpoint { - let mut socket_parts = socket.split(':'); - let host = Ipv4Address::from_str(socket_parts.next().unwrap_or("")) - .ok() - .filter(|addr| !addr.is_unspecified()) - .map(IpAddress::Ipv4); + let (host_str, port_str) = if let Some(rest) = socket.strip_prefix('[') { + let end = rest.find(']').unwrap_or(rest.len()); + let host_inside = rest[..end].to_string(); + let port = rest[end + 1..].strip_prefix(':').unwrap_or("").to_string(); + (host_inside, port) + } else { + let mut socket_parts = socket.splitn(2, ':'); + let host = socket_parts.next().unwrap_or("").to_string(); + let port = socket_parts.next().unwrap_or("").to_string(); + (host, port) + }; - let port = socket_parts - .next() - .unwrap_or("") - .parse::() - .unwrap_or(0); + let host = if host_str.contains(':') { + Ipv6Address::from_str(host_str.split('%').next().unwrap_or("")) + .ok() + .map(IpAddress::Ipv6) + } else { + Ipv4Address::from_str(&host_str) + .ok() + .filter(|addr| !addr.is_unspecified()) + .map(IpAddress::Ipv4) + }; + + let port = port_str.parse::().unwrap_or(0); IpListenEndpoint { addr: host, port } }