diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-05-18 15:34:52 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-06-14 12:37:03 +0200 |
| commit | 4c7b7b66e9412da5d040fef4828bacbf483c1334 (patch) | |
| tree | e17c2d4c24b6b4d4856a1fd650b14a5b934509bb | |
| parent | 94f95f2ba6c7b458639ba016671a468fcb611442 (diff) | |
| download | mullvadvpn-4c7b7b66e9412da5d040fef4828bacbf483c1334.tar.xz mullvadvpn-4c7b7b66e9412da5d040fef4828bacbf483c1334.zip | |
Implement WG config update for NetworkManager tunnel
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/mod.rs | 4 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/wireguard_kernel/nm_tunnel.rs | 21 |
2 files changed, 21 insertions, 4 deletions
diff --git a/talpid-core/src/tunnel/wireguard/mod.rs b/talpid-core/src/tunnel/wireguard/mod.rs index 33a6001361..232f08dede 100644 --- a/talpid-core/src/tunnel/wireguard/mod.rs +++ b/talpid-core/src/tunnel/wireguard/mod.rs @@ -644,9 +644,7 @@ pub(crate) trait Tunnel: Send { fn set_config( &self, _config: Config, - ) -> Pin<Box<dyn Future<Output = std::result::Result<(), TunnelError>> + Send + 'static>> { - unimplemented!() - } + ) -> Pin<Box<dyn Future<Output = std::result::Result<(), TunnelError>> + Send>>; } /// Errors to be returned from WireGuard implementations, namely implementers of the Tunnel trait diff --git a/talpid-core/src/tunnel/wireguard/wireguard_kernel/nm_tunnel.rs b/talpid-core/src/tunnel/wireguard/wireguard_kernel/nm_tunnel.rs index fed29b93d9..92a8f5e81c 100644 --- a/talpid-core/src/tunnel/wireguard/wireguard_kernel/nm_tunnel.rs +++ b/talpid-core/src/tunnel/wireguard/wireguard_kernel/nm_tunnel.rs @@ -2,7 +2,8 @@ use super::{ super::stats::{Stats, StatsMap}, Config, Error as WgKernelError, Handle, Tunnel, TunnelError, MULLVAD_INTERFACE_NAME, }; -use std::collections::HashMap; +use futures::Future; +use std::{collections::HashMap, pin::Pin}; use talpid_dbus::{ dbus, network_manager::{ @@ -91,6 +92,24 @@ impl Tunnel for NetworkManagerTunnel { Ok(Stats::parse_device_message(&device)) }) } + + fn set_config( + &self, + config: Config, + ) -> Pin<Box<dyn Future<Output = std::result::Result<(), TunnelError>> + Send>> { + let interface_name = self.interface_name.clone(); + let mut wg = self.netlink_connections.wg_handle.clone(); + Box::pin(async move { + let index = crate::linux::iface_index(&interface_name).map_err(|err| { + log::error!("Failed to fetch WireGuard device index: {}", err); + TunnelError::SetConfigError + })?; + wg.set_config(index, &config).await.map_err(|err| { + log::error!("Failed to apply WireGuard config: {}", err); + TunnelError::SetConfigError + }) + }) + } } fn convert_config_to_dbus(config: &Config) -> DeviceConfig { |
