From 768e988e646847f70df73cc2650ae44b6fb0a26c Mon Sep 17 00:00:00 2001 From: zonyitoo Date: Sat, 12 Aug 2023 22:07:14 +0800 Subject: [PATCH] fix(shadowsocks): IP_UNICAST_IF requires index to be network endianess ref #1266 --- crates/shadowsocks/src/net/sys/windows/mod.rs | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/crates/shadowsocks/src/net/sys/windows/mod.rs b/crates/shadowsocks/src/net/sys/windows/mod.rs index cad81836aac3..56fd13d10095 100644 --- a/crates/shadowsocks/src/net/sys/windows/mod.rs +++ b/crates/shadowsocks/src/net/sys/windows/mod.rs @@ -40,6 +40,7 @@ use windows_sys::{ IP_ADAPTER_ADDRESSES_LH, }, Networking::WinSock::{ + htonl, setsockopt, WSAGetLastError, WSAIoctl, @@ -334,20 +335,27 @@ async fn set_ip_unicast_if(socket: &S, addr: &SocketAddr, iface: unsafe { // https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options let ret = match addr { - SocketAddr::V4(..) => setsockopt( - handle, - IPPROTO_IP as i32, - IP_UNICAST_IF as i32, - &if_index as *const _ as PCSTR, - mem::size_of_val(&if_index) as i32, - ), - SocketAddr::V6(..) => setsockopt( - handle, - IPPROTO_IPV6 as i32, - IPV6_UNICAST_IF as i32, - &if_index as *const _ as PCSTR, - mem::size_of_val(&if_index) as i32, - ), + SocketAddr::V4(..) => { + // Interface index is in network byte order for IPPROTO_IP. + let if_index = htonl(if_index); + setsockopt( + handle, + IPPROTO_IP as i32, + IP_UNICAST_IF as i32, + &if_index as *const _ as PCSTR, + mem::size_of_val(&if_index) as i32, + ) + } + SocketAddr::V6(..) => { + // Interface index is in host byte order for IPPROTO_IPV6. + setsockopt( + handle, + IPPROTO_IPV6 as i32, + IPV6_UNICAST_IF as i32, + &if_index as *const _ as PCSTR, + mem::size_of_val(&if_index) as i32, + ) + } }; if ret == SOCKET_ERROR {