summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--wireguard-go-rs/Cargo.toml2
-rw-r--r--wireguard-go-rs/src/lib.rs20
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);
}
}