summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-05-18 15:34:52 +0200
committerDavid Lönnhager <david.l@mullvad.net>2022-06-14 12:37:03 +0200
commit4c7b7b66e9412da5d040fef4828bacbf483c1334 (patch)
treee17c2d4c24b6b4d4856a1fd650b14a5b934509bb
parent94f95f2ba6c7b458639ba016671a468fcb611442 (diff)
downloadmullvadvpn-4c7b7b66e9412da5d040fef4828bacbf483c1334.tar.xz
mullvadvpn-4c7b7b66e9412da5d040fef4828bacbf483c1334.zip
Implement WG config update for NetworkManager tunnel
-rw-r--r--talpid-core/src/tunnel/wireguard/mod.rs4
-rw-r--r--talpid-core/src/tunnel/wireguard/wireguard_kernel/nm_tunnel.rs21
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 {