summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-11-17 13:09:54 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-12-07 14:39:48 +0100
commitc560ccf5a9bcd97ef04cbada264d399e33cfac67 (patch)
treec8a9db113f0dd4fc3c893d4dfe8d846d0faf94be
parentc797c7bf19a341bcc70399039cab646804109a0f (diff)
downloadmullvadvpn-c560ccf5a9bcd97ef04cbada264d399e33cfac67.tar.xz
mullvadvpn-c560ccf5a9bcd97ef04cbada264d399e33cfac67.zip
Add wrapper around ConvertInterfaceLuidToAlias
-rw-r--r--talpid-core/src/windows.rs26
1 files changed, 21 insertions, 5 deletions
diff --git a/talpid-core/src/windows.rs b/talpid-core/src/windows.rs
index 7648441a91..1febc5bc21 100644
--- a/talpid-core/src/windows.rs
+++ b/talpid-core/src/windows.rs
@@ -1,9 +1,12 @@
use socket2::SockAddr;
use std::{
- ffi::OsStr,
+ ffi::{OsStr, OsString},
fmt, io, mem,
net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
- os::windows::{ffi::OsStrExt, io::RawHandle},
+ os::windows::{
+ ffi::{OsStrExt, OsStringExt},
+ io::RawHandle,
+ },
sync::Mutex,
time::{Duration, Instant},
};
@@ -12,12 +15,13 @@ use winapi::shared::{
in6addr::IN6_ADDR,
inaddr::IN_ADDR,
netioapi::{
- CancelMibChangeNotify2, ConvertInterfaceAliasToLuid, FreeMibTable, GetIpInterfaceEntry,
- GetUnicastIpAddressEntry, GetUnicastIpAddressTable, MibAddInstance,
- NotifyIpInterfaceChange, SetIpInterfaceEntry, MIB_IPINTERFACE_ROW,
+ CancelMibChangeNotify2, ConvertInterfaceAliasToLuid, ConvertInterfaceLuidToAlias,
+ FreeMibTable, GetIpInterfaceEntry, GetUnicastIpAddressEntry, GetUnicastIpAddressTable,
+ MibAddInstance, NotifyIpInterfaceChange, SetIpInterfaceEntry, MIB_IPINTERFACE_ROW,
MIB_UNICASTIPADDRESS_ROW, MIB_UNICASTIPADDRESS_TABLE,
},
nldef::{IpDadStatePreferred, IpDadStateTentative, NL_DAD_STATE},
+ ntddndis::NDIS_IF_MAX_STRING_SIZE,
ntdef::FALSE,
winerror::{ERROR_NOT_FOUND, NO_ERROR},
ws2def::{
@@ -359,6 +363,18 @@ pub fn luid_from_alias<T: AsRef<OsStr>>(alias: T) -> io::Result<NET_LUID> {
Ok(luid)
}
+/// Returns the alias of an interface given its LUID.
+pub fn alias_from_luid(luid: &NET_LUID) -> io::Result<OsString> {
+ let mut buffer = [0u16; NDIS_IF_MAX_STRING_SIZE + 1];
+ let status =
+ unsafe { ConvertInterfaceLuidToAlias(luid, &mut buffer[0] as *mut _, buffer.len()) };
+ if status != NO_ERROR {
+ return Err(io::Error::from_raw_os_error(status as i32));
+ }
+ let nul = buffer.iter().position(|&c| c == 0u16).unwrap();
+ Ok(OsString::from_wide(&buffer[0..nul]))
+}
+
fn af_family_from_family(family: Option<AddressFamily>) -> u16 {
family
.map(|family| family as u16)