From 6975177d056d0deca9ebed18fbb0eb55359c6dc9 Mon Sep 17 00:00:00 2001 From: garwah <14845405+garwahl@users.noreply.github.com> Date: Sat, 21 Sep 2024 20:17:42 +1000 Subject: [PATCH] Add new NetIf variant to NatResolver for IP resolution via network interface (#10922) Co-authored-by: garwah Co-authored-by: Emilia Hane Co-authored-by: Matthias Seitz --- Cargo.lock | 1 + crates/net/nat/Cargo.toml | 1 + crates/net/nat/src/lib.rs | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 6fbb2607fbea..0057a70c2ad5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7547,6 +7547,7 @@ dependencies = [ "serde_with", "thiserror", "tokio", + "tracing", ] [[package]] diff --git a/crates/net/nat/Cargo.toml b/crates/net/nat/Cargo.toml index 99f209616779..6a072e491a63 100644 --- a/crates/net/nat/Cargo.toml +++ b/crates/net/nat/Cargo.toml @@ -18,6 +18,7 @@ serde_with = { workspace = true, optional = true } thiserror.workspace = true tokio = { workspace = true, features = ["time"] } if-addrs.workspace = true +tracing.workspace = true [dev-dependencies] reth-tracing.workspace = true diff --git a/crates/net/nat/src/lib.rs b/crates/net/nat/src/lib.rs index e58edae05c81..9925e84fe25c 100644 --- a/crates/net/nat/src/lib.rs +++ b/crates/net/nat/src/lib.rs @@ -25,7 +25,9 @@ use std::{ task::{Context, Poll}, time::Duration, }; +use tracing::error; +use crate::net_if::resolve_net_if_ip; #[cfg(feature = "serde")] use serde_with::{DeserializeFromStr, SerializeDisplay}; @@ -48,6 +50,8 @@ pub enum NatResolver { PublicIp, /// Use the given [`IpAddr`] ExternalIp(IpAddr), + /// Resolve external IP via the network interface. + NetIf, /// Resolve nothing None, } @@ -66,6 +70,7 @@ impl fmt::Display for NatResolver { Self::Upnp => f.write_str("upnp"), Self::PublicIp => f.write_str("publicip"), Self::ExternalIp(ip) => write!(f, "extip:{ip}"), + Self::NetIf => f.write_str("netif"), Self::None => f.write_str("none"), } } @@ -91,6 +96,7 @@ impl FromStr for NatResolver { "upnp" => Self::Upnp, "none" => Self::None, "publicip" | "public-ip" => Self::PublicIp, + "netif" => Self::NetIf, s => { let Some(ip) = s.strip_prefix("extip:") else { return Err(ParseNatResolverError::UnknownVariant(format!( @@ -185,6 +191,13 @@ pub async fn external_addr_with(resolver: NatResolver) -> Option { match resolver { NatResolver::Any | NatResolver::Upnp | NatResolver::PublicIp => resolve_external_ip().await, NatResolver::ExternalIp(ip) => Some(ip), + NatResolver::NetIf => match resolve_net_if_ip(DEFAULT_NET_IF_NAME) { + Ok(ip) => Some(ip), + Err(err) => { + error!("Failed to resolve network interface IP: {}", err); + None + } + }, NatResolver::None => None, } }