From d2ad78b600089ae115ba2fecf4ac184b0ee2f041 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 17 Aug 2021 01:08:00 +0100 Subject: [PATCH] support v6 private addresses Signed-off-by: Ian Jackson --- src/types.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/types.rs b/src/types.rs index ca40df0..bb4fffb 100644 --- a/src/types.rs +++ b/src/types.rs @@ -11,7 +11,7 @@ pub enum LinkEnd { Server, Client } pub struct ServerName(pub String); #[derive(Debug,Clone,Copy,Hash,Eq,PartialEq,Ord,PartialOrd)] -pub struct ClientName(pub Ipv4Addr); +pub struct ClientName(pub IpAddr); #[derive(Debug,Clone,Hash,Eq,PartialEq,Ord,PartialOrd)] pub struct LinkName { @@ -23,12 +23,21 @@ impl FromStr for ClientName { type Err = AE; #[throws(AE)] fn from_str(s: &str) -> Self { - let v4addr: Ipv4Addr = s.parse() - .context("invalid client name (IPv4 address)")?; - if s != v4addr.to_string() { - throw!(anyhow!("invalid client name (unusual IPv4 address syntax)")); - } - ClientName(v4addr) + ClientName( + if let Ok(v4addr) = s.parse::() { + if s != v4addr.to_string() { + throw!(anyhow!("invalid client name (unusual IPv4 address syntax)")); + } + v4addr.into() + } else if let Ok(v6addr) = s.parse::() { + if s != v6addr.to_string() { + throw!(anyhow!("invalid client name (non-canonical IPv6 address)")); + } + v6addr.into() + } else { + throw!(anyhow!("invalid client name (IPv4 or IPv6 address)")) + } + ) } } -- 2.30.2