diff options
| -rw-r--r-- | wireguard-go-rs/Cargo.toml | 2 | ||||
| -rw-r--r-- | wireguard-go-rs/src/lib.rs | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/wireguard-go-rs/Cargo.toml b/wireguard-go-rs/Cargo.toml index 976b2bd6b1..375e248f1c 100644 --- a/wireguard-go-rs/Cargo.toml +++ b/wireguard-go-rs/Cargo.toml @@ -20,4 +20,4 @@ zeroize = "1.8.1" maybenot-ffi = "2.0.1" [target.'cfg(target_os = "windows")'.dependencies] -windows-sys = { version = "0.52.0", features = ["Win32_NetworkManagement_Ndis"] } +windows-sys = { version = "0.52.0", features = ["Win32_Networking", "Win32_NetworkManagement", "Win32_NetworkManagement_Ndis", "Win32_Networking_WinSock"] } diff --git a/wireguard-go-rs/src/lib.rs b/wireguard-go-rs/src/lib.rs index 037d17709d..d2f398536a 100644 --- a/wireguard-go-rs/src/lib.rs +++ b/wireguard-go-rs/src/lib.rs @@ -304,6 +304,22 @@ impl Drop for Tunnel { } } +/// Rebind WireGuard IPv4 endpoint sockets to use the given interface +#[cfg(target_os = "windows")] +pub fn rebind_tunnel_socket_v4(interface_index: u32) { + use windows_sys::Win32::Networking::WinSock::AF_INET; + // SAFETY: Passing an invalid interface is safe + unsafe { ffi::wgRebindTunnelSocket(AF_INET, interface_index) } +} + +/// Rebind WireGuard IPv6 endpoint sockets to use the given interface +#[cfg(target_os = "windows")] +pub fn rebind_tunnel_socket_v6(interface_index: u32) { + use windows_sys::Win32::Networking::WinSock::AF_INET6; + // SAFETY: Passing an invalid interface is safe + unsafe { ffi::wgRebindTunnelSocket(AF_INET6, interface_index) } +} + fn result_from_code(code: i32) -> Result<(), Error> { // NOTE: must be kept in sync with enum definition Err(match code { @@ -434,5 +450,9 @@ mod ffi { /// Get the file descriptor of the tunnel IPv6 socket. #[cfg(target_os = "android")] pub fn wgGetSocketV6(handle: i32) -> Fd; + + /// Rebind tunnel socket endpoint sockets + #[cfg(target_os = "windows")] + pub fn wgRebindTunnelSocket(family: u16, index: u32); } } |
