Skip to content

Commit e4d90e6

Browse files
committed
Add flag to check if internal address
1 parent a7ec37e commit e4d90e6

File tree

4 files changed

+52
-6
lines changed

4 files changed

+52
-6
lines changed

src/interface.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ pub struct NetworkInterface {
2222
pub mac_addr: Option<String>,
2323
/// Interface's index
2424
pub index: u32,
25+
/// Is the interface a loopback or similar interface that is not remotely accessible
26+
pub internal: bool,
2527
}
2628

2729
/// Network interface address
@@ -65,6 +67,7 @@ impl NetworkInterface {
6567
netmask: Netmask<Ipv4Addr>,
6668
broadcast: Option<Ipv4Addr>,
6769
index: u32,
70+
internal: bool,
6871
) -> NetworkInterface {
6972
let ifaddr_v4 = V4IfAddr {
7073
ip: addr,
@@ -77,6 +80,7 @@ impl NetworkInterface {
7780
addr: vec![Addr::V4(ifaddr_v4)],
7881
mac_addr: None,
7982
index,
83+
internal,
8084
}
8185
}
8286

@@ -86,6 +90,7 @@ impl NetworkInterface {
8690
netmask: Netmask<Ipv6Addr>,
8791
broadcast: Option<Ipv6Addr>,
8892
index: u32,
93+
internal: bool,
8994
) -> NetworkInterface {
9095
let ifaddr_v6 = V6IfAddr {
9196
ip: addr,
@@ -98,6 +103,7 @@ impl NetworkInterface {
98103
addr: vec![Addr::V6(ifaddr_v6)],
99104
mac_addr: None,
100105
index,
106+
internal,
101107
}
102108
}
103109

src/target/linux.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use std::net::{Ipv4Addr, Ipv6Addr};
33
use std::slice::from_raw_parts;
44

55
use libc::{
6-
sockaddr_in, sockaddr_in6, strlen, AF_INET, AF_INET6, if_nametoindex, sockaddr_ll, AF_PACKET,
6+
AF_INET, AF_INET6, AF_PACKET, IFF_LOOPBACK, if_nametoindex, sockaddr_in, sockaddr_in6,
7+
sockaddr_ll, strlen,
78
};
89

910
use crate::target::getifaddrs;
@@ -22,6 +23,8 @@ impl NetworkInterfaceConfig for NetworkInterface {
2223
unsafe { (*netifa_addr).sa_family as i32 }
2324
};
2425

26+
let internal = &netifa.ifa_flags & IFF_LOOPBACK as u32 != 0;
27+
2528
let mut network_interface = match netifa_family {
2629
AF_PACKET => {
2730
let name = make_netifa_name(&netifa)?;
@@ -32,6 +35,7 @@ impl NetworkInterfaceConfig for NetworkInterface {
3235
addr: Vec::new(),
3336
mac_addr: Some(mac),
3437
index,
38+
internal,
3539
}
3640
}
3741
AF_INET => {
@@ -42,7 +46,14 @@ impl NetworkInterfaceConfig for NetworkInterface {
4246
let netmask = make_ipv4_netmask(&netifa);
4347
let addr = ipv4_from_in_addr(&internet_address)?;
4448
let broadcast = make_ipv4_broadcast_addr(&netifa)?;
45-
NetworkInterface::new_afinet(name.as_str(), addr, netmask, broadcast, index)
49+
NetworkInterface::new_afinet(
50+
name.as_str(),
51+
addr,
52+
netmask,
53+
broadcast,
54+
index,
55+
internal,
56+
)
4657
}
4758
AF_INET6 => {
4859
let socket_addr = netifa_addr as *mut sockaddr_in6;
@@ -52,7 +63,14 @@ impl NetworkInterfaceConfig for NetworkInterface {
5263
let netmask = make_ipv6_netmask(&netifa);
5364
let addr = ipv6_from_in6_addr(&internet_address)?;
5465
let broadcast = make_ipv6_broadcast_addr(&netifa)?;
55-
NetworkInterface::new_afinet6(name.as_str(), addr, netmask, broadcast, index)
66+
NetworkInterface::new_afinet6(
67+
name.as_str(),
68+
addr,
69+
netmask,
70+
broadcast,
71+
index,
72+
internal,
73+
)
5674
}
5775
_ => continue,
5876
};

src/target/unix/mod.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use std::collections::HashMap;
55
use std::net::{Ipv4Addr, Ipv6Addr};
66
use std::slice::from_raw_parts;
77

8-
use libc::{AF_INET, AF_INET6, sockaddr_in, sockaddr_in6, strlen, AF_LINK, if_nametoindex};
8+
use libc::{
9+
AF_INET, AF_INET6, AF_LINK, IFF_LOOPBACK, if_nametoindex, sockaddr_in, sockaddr_in6, strlen,
10+
};
911

1012
use crate::target::ffi::lladdr;
1113
use crate::target::getifaddrs;
@@ -24,6 +26,8 @@ impl NetworkInterfaceConfig for NetworkInterface {
2426
unsafe { (*netifa_addr).sa_family as i32 }
2527
};
2628

29+
let internal = &netifa.ifa_flags & IFF_LOOPBACK as u32 != 0;
30+
2731
let mut network_interface = match netifa_family {
2832
AF_LINK => {
2933
let name = make_netifa_name(&netifa)?;
@@ -34,6 +38,7 @@ impl NetworkInterfaceConfig for NetworkInterface {
3438
mac_addr: Some(mac),
3539
addr: Vec::new(),
3640
index,
41+
internal,
3742
}
3843
}
3944
AF_INET => {
@@ -44,7 +49,14 @@ impl NetworkInterfaceConfig for NetworkInterface {
4449
let netmask = make_ipv4_netmask(&netifa);
4550
let addr = ipv4_from_in_addr(&internet_address)?;
4651
let broadcast = make_ipv4_broadcast_addr(&netifa)?;
47-
NetworkInterface::new_afinet(name.as_str(), addr, netmask, broadcast, index)
52+
NetworkInterface::new_afinet(
53+
name.as_str(),
54+
addr,
55+
netmask,
56+
broadcast,
57+
index,
58+
internal,
59+
)
4860
}
4961
AF_INET6 => {
5062
let socket_addr = netifa_addr as *mut sockaddr_in6;
@@ -54,7 +66,14 @@ impl NetworkInterfaceConfig for NetworkInterface {
5466
let netmask = make_ipv6_netmask(&netifa);
5567
let addr = ipv6_from_in6_addr(&internet_address)?;
5668
let broadcast = make_ipv6_broadcast_addr(&netifa)?;
57-
NetworkInterface::new_afinet6(name.as_str(), addr, netmask, broadcast, index)
69+
NetworkInterface::new_afinet6(
70+
name.as_str(),
71+
addr,
72+
netmask,
73+
broadcast,
74+
index,
75+
internal,
76+
)
5877
}
5978
_ => continue,
6079
};

src/target/windows.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::iter::Iterator;
88
use std::marker::PhantomData;
99

1010
use libc::{free, malloc, wchar_t, wcslen};
11+
use winapi::shared::ipifcons::IF_TYPE_SOFTWARE_LOOPBACK;
1112
use winapi::{
1213
ctypes::c_ulong,
1314
shared::{
@@ -124,11 +125,13 @@ impl NetworkInterfaceConfig for NetworkInterface {
124125
let name = make_adapter_address_name(adapter_address)?;
125126
let index = get_adapter_address_index(adapter_address)?;
126127
let mac_addr = make_mac_address(adapter_address);
128+
let internal = adapter_address.IfType == IF_TYPE_SOFTWARE_LOOPBACK;
127129
let mut network_interface = NetworkInterface {
128130
name,
129131
addr: Vec::new(),
130132
mac_addr,
131133
index,
134+
internal,
132135
};
133136

134137
for current_unicast_address in

0 commit comments

Comments
 (0)