diff --git a/src/bin/fullnode-config.rs b/src/bin/fullnode-config.rs index 5427a3860f..343d1d5a5b 100644 --- a/src/bin/fullnode-config.rs +++ b/src/bin/fullnode-config.rs @@ -7,12 +7,14 @@ extern crate solana; use clap::{App, Arg}; use solana::crdt::FULLNODE_PORT_RANGE; use solana::fullnode::Config; +use solana::logger; use solana::netutil::{get_ip_addr, get_public_ip_addr, parse_port_or_addr}; use solana::signature::read_pkcs8; use std::io; use std::net::SocketAddr; fn main() { + logger::setup(); let matches = App::new("fullnode-config") .version(crate_version!()) .arg( diff --git a/src/netutil.rs b/src/netutil.rs index aba76a242b..67f10c107e 100644 --- a/src/netutil.rs +++ b/src/netutil.rs @@ -49,21 +49,42 @@ pub fn parse_port_or_addr(optstr: Option<&str>, default_port: u16) -> SocketAddr } pub fn get_ip_addr() -> Option { - for iface in datalink::interfaces() { + let mut ifaces = datalink::interfaces(); + + // put eth0 and wifi0, etc. up front of our list of candidates + ifaces.sort_by(|a, b| { + a.name + .chars() + .last() + .unwrap() + .cmp(&b.name.chars().last().unwrap()) + }); + + for iface in ifaces { for p in iface.ips { - if !p.ip().is_loopback() && !p.ip().is_multicast() { - match p.ip() { - IpAddr::V4(addr) => { - if !addr.is_link_local() { - return Some(p.ip()); - } + trace!("get_ip_addr considering iface {} {}", iface.name, p); + if p.ip().is_loopback() { + trace!(" loopback"); + continue; + } + if p.ip().is_multicast() { + trace!(" multicast"); + continue; + } + match p.ip() { + IpAddr::V4(addr) => { + if addr.is_link_local() { + trace!(" link local"); + continue; } - IpAddr::V6(_addr) => { - // Select an ipv6 address if the config is selected - #[cfg(feature = "ipv6")] - { - return Some(p.ip()); - } + trace!(" using ==> {}", p.ip()); + return Some(p.ip()); + } + IpAddr::V6(_addr) => { + // Select an ipv6 address if the config is selected + #[cfg(feature = "ipv6")] + { + return Some(p.ip()); } } }