From 8ac08c5166b77ca809da3604cb291b640e085eb2 Mon Sep 17 00:00:00 2001 From: zonyitoo Date: Sat, 7 May 2022 00:19:23 +0800 Subject: [PATCH] Windows API switched to windows-sys --- Cargo.lock | 136 ++++++++++-------- crates/shadowsocks-service/Cargo.toml | 2 +- .../src/local/dns/upstream.rs | 13 +- crates/shadowsocks/Cargo.toml | 2 +- crates/shadowsocks/src/net/sys/windows/mod.rs | 123 +++++++--------- 5 files changed, 134 insertions(+), 142 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b36ca607..91afd672 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -342,9 +342,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.15" +version = "3.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a35a599b11c089a7f49105658d089b8f2cf0882993c17daf6de15285c2c35d" +checksum = "f52d4f8e4a1419219935762e32913b4430f37cb0c0200ad17a89ee18c0188a9f" dependencies = [ "atty", "bitflags", @@ -902,9 +902,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" dependencies = [ "bytes", "fnv", @@ -924,9 +924,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -1105,9 +1105,9 @@ dependencies = [ [[package]] name = "kqueue" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97caf428b83f7c86809b7450722cd1f2b1fc7fb23aa7b9dee7e72ed14d048352" +checksum = "4d6112e8f37b59803ac47a42d14f1f3a59bbf72fc6857ffc5be455e28a691f8e" dependencies = [ "kqueue-sys", "libc", @@ -1131,9 +1131,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.124" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] name = "libmimalloc-sys" @@ -1162,9 +1162,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", "serde", @@ -1262,9 +1262,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -1366,9 +1366,9 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -1376,9 +1376,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] @@ -1413,18 +1413,30 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.38" +version = "0.10.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "once_cell", + "openssl-macros", "openssl-sys", ] +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" version = "0.1.5" @@ -1433,9 +1445,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.72" +version = "0.9.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" dependencies = [ "autocfg", "cc", @@ -1493,9 +1505,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if", "libc", @@ -1575,9 +1587,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -1622,9 +1634,9 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa" dependencies = [ "unicode-xid", ] @@ -1933,9 +1945,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] @@ -1952,9 +1964,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -1986,9 +1998,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" dependencies = [ "indexmap", "ryu", @@ -2063,7 +2075,7 @@ dependencies = [ "tokio-tfo", "trust-dns-resolver", "url", - "winapi", + "windows-sys", ] [[package]] @@ -2162,7 +2174,7 @@ dependencies = [ "trust-dns-resolver", "tun", "webpki-roots", - "winapi", + "windows-sys", ] [[package]] @@ -2284,9 +2296,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" dependencies = [ "proc-macro2", "quote", @@ -2393,9 +2405,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -2408,9 +2420,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "dce653fb475565de9f6fb0614b28bca8df2c430c0cf84bcd9c843f15de5414cc" dependencies = [ "bytes", "libc", @@ -2449,9 +2461,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4151fda0cf2798550ad0b34bcfc9b9dcc2a9d2471c895c68f3a8818e54f2389e" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ "rustls", "tokio", @@ -2541,9 +2553,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -2668,9 +2680,9 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-normalization" @@ -2683,9 +2695,9 @@ dependencies = [ [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "universal-hash" @@ -2892,9 +2904,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ "windows_aarch64_msvc", "windows_i686_gnu", @@ -2905,33 +2917,33 @@ dependencies = [ [[package]] name = "windows_aarch64_msvc" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "winreg" diff --git a/crates/shadowsocks-service/Cargo.toml b/crates/shadowsocks-service/Cargo.toml index 83b816e9..a0ab0b38 100644 --- a/crates/shadowsocks-service/Cargo.toml +++ b/crates/shadowsocks-service/Cargo.toml @@ -135,7 +135,7 @@ shadowsocks = { version = "1.15.0", path = "../shadowsocks", default-features = nix = "0.24" [target.'cfg(windows)'.dependencies] -winapi = { version = "0.3", features = ["mswsock", "winsock2"] } +windows-sys = { version = "0.36", features = ["Win32_Networking_WinSock"] } [dev-dependencies] byteorder = "1.3" diff --git a/crates/shadowsocks-service/src/local/dns/upstream.rs b/crates/shadowsocks-service/src/local/dns/upstream.rs index 1228defb..ce21567b 100644 --- a/crates/shadowsocks-service/src/local/dns/upstream.rs +++ b/crates/shadowsocks-service/src/local/dns/upstream.rs @@ -188,9 +188,9 @@ impl DnsClient { #[cfg(windows)] fn check_peekable(s: &mut F) -> bool { - use winapi::{ - ctypes::{c_char, c_int}, - um::winsock2::{recv, MSG_PEEK, SOCKET}, + use windows_sys::{ + core::PSTR, + Win32::Networking::WinSock::{recv, MSG_PEEK, SOCKET}, }; let sock = s.as_raw_socket() as SOCKET; @@ -198,12 +198,7 @@ impl DnsClient { unsafe { let mut peek_buf = [0u8; 1]; - let ret = recv( - sock, - peek_buf.as_mut_ptr() as *mut c_char, - peek_buf.len() as c_int, - MSG_PEEK, - ); + let ret = recv(sock, peek_buf.as_mut_ptr() as PSTR, peek_buf.len() as i32, MSG_PEEK); match ret.cmp(&0) { // EOF, connection lost diff --git a/crates/shadowsocks/Cargo.toml b/crates/shadowsocks/Cargo.toml index f2475750..f882b7c7 100644 --- a/crates/shadowsocks/Cargo.toml +++ b/crates/shadowsocks/Cargo.toml @@ -87,7 +87,7 @@ shadowsocks-crypto = { version = "0.4", git = "https://github.com/shadowsocks/sh shadowsocks-crypto = { version = "0.4", git = "https://github.com/shadowsocks/shadowsocks-crypto.git", features = [] } [target.'cfg(windows)'.dependencies] -winapi = { version = "0.3", features = ["mswsock", "winsock2", "netioapi"] } +windows-sys = { version = "0.36", features = ["Win32_Foundation", "Win32_NetworkManagement_IpHelper", "Win32_Networking_WinSock", "Win32_System_IO"] } [target.'cfg(unix)'.dependencies] sendfd = { version = "0.4", features = ["tokio"] } diff --git a/crates/shadowsocks/src/net/sys/windows/mod.rs b/crates/shadowsocks/src/net/sys/windows/mod.rs index d305b860..8d0e0777 100644 --- a/crates/shadowsocks/src/net/sys/windows/mod.rs +++ b/crates/shadowsocks/src/net/sys/windows/mod.rs @@ -1,5 +1,5 @@ use std::{ - ffi::CString, + ffi::{c_void, CString}, io::{self, ErrorKind}, mem, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, @@ -17,21 +17,34 @@ use tokio::{ net::{TcpSocket, TcpStream as TokioTcpStream, UdpSocket}, }; use tokio_tfo::TfoStream; -use winapi::{ - ctypes::{c_char, c_int}, - shared::{ - minwindef::{BOOL, DWORD, FALSE, LPDWORD, LPVOID}, - netioapi::if_nametoindex, - ntdef::PCSTR, - ws2def::{IPPROTO_IP, IPPROTO_IPV6, IPPROTO_TCP}, - ws2ipdef::IPV6_UNICAST_IF, - }, - um::{ - mswsock::SIO_UDP_CONNRESET, - winsock2::{setsockopt, WSAGetLastError, WSAIoctl, SOCKET, SOCKET_ERROR}, +use windows_sys::{ + core::PCSTR, + Win32::{ + Foundation::BOOL, + NetworkManagement::IpHelper::if_nametoindex, + Networking::WinSock::{ + setsockopt, + WSAGetLastError, + WSAIoctl, + IPPROTO_IP, + IPPROTO_IPV6, + IPPROTO_TCP, + IPV6_MTU_DISCOVER, + IPV6_UNICAST_IF, + IP_MTU_DISCOVER, + IP_PMTUDISC_DO, + IP_UNICAST_IF, + SIO_UDP_CONNRESET, + SOCKET, + SOCKET_ERROR, + TCP_FASTOPEN, + }, }, }; +// BOOL values +const FALSE: BOOL = 0; + use crate::net::{ is_dual_stack_addr, sys::{set_common_sockopt_for_connect, socket_bind_dual_stack}, @@ -39,19 +52,6 @@ use crate::net::{ ConnectOpts, }; -// ws2ipdef.h -// FIXME: Use winapi's definition if issue resolved -// https://github.com/retep998/winapi-rs/issues/856 -const TCP_FASTOPEN: DWORD = 15; - -// ws2ipdef.h -// https://github.com/retep998/winapi-rs/pull/1007 -const IP_UNICAST_IF: DWORD = 31; - -// ws2ipdef.h -const IP_MTU_DISCOVER: DWORD = 71; // Set/get path MTU discover state. -const IPV6_MTU_DISCOVER: DWORD = 71; // Set/get path MTU discover state. - /// A `TcpStream` that supports TFO (TCP Fast Open) #[pin_project(project = TcpStreamProj)] pub enum TcpStream { @@ -167,15 +167,15 @@ impl AsyncWrite for TcpStream { /// /// TCP_FASTOPEN is supported since Windows 10 pub fn set_tcp_fastopen(socket: &S) -> io::Result<()> { - let enable: DWORD = 1; + let enable: u32 = 1; unsafe { let ret = setsockopt( socket.as_raw_socket() as SOCKET, - IPPROTO_TCP as c_int, - TCP_FASTOPEN as c_int, - &enable as *const _ as *const c_char, - mem::size_of_val(&enable) as c_int, + IPPROTO_TCP as i32, + TCP_FASTOPEN as i32, + &enable as *const _ as PCSTR, + mem::size_of_val(&enable) as i32, ); if ret == SOCKET_ERROR { @@ -204,22 +204,20 @@ fn set_ip_unicast_if(socket: &S, addr: SocketAddr, iface: &str) } // https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options - let if_index = if_index as DWORD; - let ret = match addr { SocketAddr::V4(..) => setsockopt( handle, - IPPROTO_IP as c_int, - IP_UNICAST_IF as c_int, - &if_index as *const _ as *const c_char, - mem::size_of_val(&if_index) as c_int, + 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 c_int, - IPV6_UNICAST_IF as c_int, - &if_index as *const _ as *const c_char, - mem::size_of_val(&if_index) as c_int, + IPPROTO_IPV6 as i32, + IPV6_UNICAST_IF as i32, + &if_index as *const _ as PCSTR, + mem::size_of_val(&if_index) as i32, ), }; @@ -247,17 +245,17 @@ fn disable_connection_reset(socket: &UdpSocket) -> io::Result<()> { // It is not an error. Could be ignored completely. // We have to ignore it here because it will crash the server. - let mut bytes_returned: DWORD = 0; - let mut enable: BOOL = FALSE; + let mut bytes_returned: u32 = 0; + let enable: BOOL = FALSE; let ret = WSAIoctl( handle, SIO_UDP_CONNRESET, - &mut enable as *mut _ as LPVOID, - mem::size_of_val(&enable) as DWORD, + &enable as *const _ as *const c_void, + mem::size_of_val(&enable) as u32, ptr::null_mut(), 0, - &mut bytes_returned as *mut _ as LPDWORD, + &mut bytes_returned as *mut _, ptr::null_mut(), None, ); @@ -277,31 +275,18 @@ fn disable_connection_reset(socket: &UdpSocket) -> io::Result<()> { /// Disable IP fragmentation #[inline] pub fn set_disable_ip_fragmentation(af: AddrFamily, socket: &S) -> io::Result<()> { - // This is an enum PMTUD_STATE - // - // ```c - // typedef enum _PMTUD_STATE { - // IP_PMTUDISC_NOT_SET, - // IP_PMTUDISC_DO, - // IP_PMTUDISC_DONT, - // IP_PMTUDISC_PROBE, - // IP_PMTUDISC_MAX - // } PMTUD_STATE, *PPMTUD_STATE; - // ``` - const IP_PMTUDISC_DO: DWORD = 1; - let handle = socket.as_raw_socket() as SOCKET; unsafe { // For Windows, IP_MTU_DISCOVER should be enabled for both IPv4 and IPv6 sockets // https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options - let value: DWORD = IP_PMTUDISC_DO; + let value = IP_PMTUDISC_DO; let ret = setsockopt( handle, - IPPROTO_IP as c_int, - IP_MTU_DISCOVER as c_int, - &value as *const _ as *const c_char, - mem::size_of_val(&value) as c_int, + IPPROTO_IP as i32, + IP_MTU_DISCOVER as i32, + &value as *const _ as PCSTR, + mem::size_of_val(&value) as i32, ); if ret == SOCKET_ERROR { @@ -310,13 +295,13 @@ pub fn set_disable_ip_fragmentation(af: AddrFamily, socket: &S) } if af == AddrFamily::Ipv6 { - let value: DWORD = IP_PMTUDISC_DO; + let value = IP_PMTUDISC_DO; let ret = setsockopt( handle, - IPPROTO_IPV6 as c_int, - IPV6_MTU_DISCOVER as c_int, - &value as *const _ as *const c_char, - mem::size_of_val(&value) as c_int, + IPPROTO_IPV6 as i32, + IPV6_MTU_DISCOVER as i32, + &value as *const _ as PCSTR, + mem::size_of_val(&value) as i32, ); if ret == SOCKET_ERROR {