Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion netwatch/src/interfaces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use self::linux::default_route;
use self::windows::default_route;
#[cfg(not(wasm_browser))]
use crate::ip::is_link_local;
use crate::ip::{is_private_v6, is_up};
use crate::ip::{is_private_v6, is_up, LocalAddresses};
#[cfg(not(wasm_browser))]
use crate::netmon::is_interesting_interface;

Expand Down Expand Up @@ -161,6 +161,8 @@ impl IpNet {
pub struct State {
/// Maps from an interface name interface.
pub interfaces: HashMap<String, Interface>,
/// List of machine's local IP addresses.
pub local_addresses: LocalAddresses,

/// Whether this machine has an IPv6 Global or Unique Local Address
/// which might provide connectivity.
Expand Down Expand Up @@ -212,6 +214,8 @@ impl State {
let mut have_v4 = false;

let ifaces = netdev::interface::get_interfaces();
let local_addresses = LocalAddresses::from_raw_interfaces(&ifaces);

for iface in ifaces {
let ni = Interface { iface };
let if_up = ni.is_up();
Expand All @@ -235,6 +239,7 @@ impl State {

State {
interfaces,
local_addresses,
have_v4,
have_v6,
is_expensive: false,
Expand All @@ -250,6 +255,7 @@ impl State {
let ifname = fake.iface.name.clone();
Self {
interfaces: [(ifname.clone(), fake)].into_iter().collect(),
local_addresses: LocalAddresses::from_raw_interfaces(&[]),
have_v6: true,
have_v4: true,
is_expensive: false,
Expand Down
7 changes: 5 additions & 2 deletions netwatch/src/ip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,22 @@ impl LocalAddresses {
/// addresses because we know of environments where these are used with NAT to provide connectivity.
pub fn new() -> Self {
let ifaces = netdev::interface::get_interfaces();
Self::from_raw_interfaces(&ifaces)
}

pub(crate) fn from_raw_interfaces(ifaces: &[netdev::Interface]) -> Self {
let mut loopback = Vec::new();
let mut regular4 = Vec::new();
let mut regular6 = Vec::new();
let mut linklocal4 = Vec::new();
let mut ula6 = Vec::new();

for iface in ifaces {
if !is_up(&iface) {
if !is_up(iface) {
// Skip down interfaces
continue;
}
let ifc_is_loopback = is_loopback(&iface);
let ifc_is_loopback = is_loopback(iface);
let addrs = iface
.ipv4
.iter()
Expand Down
Loading