Skip to content

Commit

Permalink
Windows again
Browse files Browse the repository at this point in the history
  • Loading branch information
larseggert committed Aug 27, 2024
1 parent 2eb98d3 commit b8043ea
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 41 deletions.
3 changes: 1 addition & 2 deletions neqo-transport/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ static_assertions = { version = "1.1", default-features = false }

[target."cfg(windows)".dependencies]
# Sync with https://searchfox.org/mozilla-central/source/Cargo.lock 2024-02-08
windows-sys = { version = "0.52", features = [
"Win32_Foundation",
windows = { version = "0.58", features = [
"Win32_NetworkManagement_IpHelper",
"Win32_NetworkManagement_Ndis",
"Win32_Networking_WinSock",
Expand Down
53 changes: 14 additions & 39 deletions neqo-transport/src/mtu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,57 +152,32 @@ pub fn get_interface_mtu(remote: &SocketAddr) -> Result<usize, Error> {

#[cfg(target_os = "windows")]
{
use std::mem;
use std::{mem, ptr};

use windows_sys::Win32::{
Foundation::NO_ERROR,
use windows::Win32::{
NetworkManagement::IpHelper::{GetBestInterfaceEx, GetIfEntry2, MIB_IF_ROW2},
Networking::WinSock::{
ADDRESS_FAMILY, AF_INET, AF_INET6, IN6_ADDR, IN_ADDR, SOCKADDR_IN, SOCKADDR_IN6,
SOCKADDR_IN6_0,
},
Networking::WinSock::{SOCKADDR, SOCKADDR_IN, SOCKADDR_IN6},
};

let mut saddr = match remote {
let saddr = match remote {
SocketAddr::V4(addr) => {
let saddr = SOCKADDR_IN {
sin_family: AF_INET as ADDRESS_FAMILY,
sin_port: addr.port().to_be(),
sin_addr: IN_ADDR {
S_un: unsafe { mem::transmute(addr.ip().octets()) },
},
sin_zero: [0; 8],
};
unsafe { mem::transmute(saddr) }
let saddr_ptr = ptr::from_ref(&SOCKADDR_IN::from(*addr)).cast::<u8>();
unsafe { ptr::read_unaligned(saddr_ptr.cast::<SOCKADDR>()) }
}
SocketAddr::V6(addr) => {
let saddr = SOCKADDR_IN6 {
sin6_family: AF_INET6 as ADDRESS_FAMILY,
sin6_port: addr.port().to_be(),
sin6_flowinfo: addr.flowinfo(),
sin6_addr: IN6_ADDR {
u: unsafe { mem::transmute(addr.ip().octets()) },
},
Anonymous: SOCKADDR_IN6_0 {
sin6_scope_id: addr.scope_id(),
},
};

unsafe { mem::transmute(saddr) }
let saddr_ptr = ptr::from_ref(&SOCKADDR_IN6::from(*addr)).cast::<u8>();
unsafe { ptr::read_unaligned(saddr_ptr.cast::<SOCKADDR>()) }
}
};

let mut idx: u32 = 0;
if unsafe { GetBestInterfaceEx(saddr, &mut idx) } != NO_ERROR {
res = Err(Error::last_os_error());
res = if unsafe { GetBestInterfaceEx(&saddr, &mut idx) } != 0 {
Err(Error::last_os_error())
} else {
let mut row: MIB_IF_ROW2 = unsafe { mem::zeroed() };
row.InterfaceIndex = idx;
res = if unsafe { GetIfEntry2(&mut row) } == NO_ERROR {
usize::try_from(row.Mtu).or(res)
} else {
Err(Error::last_os_error())
};
}
unsafe { GetIfEntry2(&mut row)? };
usize::try_from(row.Mtu).or(res)
};
}

qtrace!("MTU towards {:?} is {:?}", remote, res);
Expand Down

0 comments on commit b8043ea

Please sign in to comment.