diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-08-02 19:26:37 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-08-10 13:36:13 +0200 |
| commit | b89eaa4c3568a384edfe84d2ac343bc4af0d51ca (patch) | |
| tree | 6282b59c0a26f4febfd9f29493c3eb01798a1a1a /talpid-core/src | |
| parent | 0692f84d3f20db4211e1a2c97aa9d6fbbe4874fa (diff) | |
| download | mullvadvpn-b89eaa4c3568a384edfe84d2ac343bc4af0d51ca.tar.xz mullvadvpn-b89eaa4c3568a384edfe84d2ac343bc4af0d51ca.zip | |
Keep existing routes in NM
Diffstat (limited to 'talpid-core/src')
| -rw-r--r-- | talpid-core/src/dns/linux/network_manager.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/talpid-core/src/dns/linux/network_manager.rs b/talpid-core/src/dns/linux/network_manager.rs index 60833207ef..75bd7cb874 100644 --- a/talpid-core/src/dns/linux/network_manager.rs +++ b/talpid-core/src/dns/linux/network_manager.rs @@ -57,6 +57,8 @@ const NM_DNS_MANAGER: &str = "org.freedesktop.NetworkManager.DnsManager"; const NM_DNS_MANAGER_PATH: &str = "/org/freedesktop/NetworkManager/DnsManager"; const NM_OBJECT_PATH: &str = "/org/freedesktop/NetworkManager"; const NM_DEVICE: &str = "org.freedesktop.NetworkManager.Device"; +const NM_IP4_CONFIG: &str = "org.freedesktop.NetworkManager.IP4Config"; +const NM_IP6_CONFIG: &str = "org.freedesktop.NetworkManager.IP6Config"; const RPC_TIMEOUT_MS: i32 = 3000; const GLOBAL_DNS_CONF_KEY: &str = "GlobalDnsConfiguration"; const RC_MANAGEMENT_MODE_KEY: &str = "RcManager"; @@ -181,6 +183,56 @@ impl NetworkManager { Self::update_dns_config(&mut settings, "ipv6", v6_dns); } + // Keep changed routes + + if let Some(ipv4_settings) = settings.get_mut("ipv4") { + let device_ip4_config: dbus::Path<'_> = self + .dbus_connection + .with_path(NM_BUS, &device, RPC_TIMEOUT_MS) + .get(NM_DEVICE, "Ip4Config") + .map_err(Error::Dbus)?; + + let device_routes: Vec<Vec<u32>> = self + .dbus_connection + .with_path(NM_BUS, &device_ip4_config, RPC_TIMEOUT_MS) + .get(NM_IP4_CONFIG, "Routes") + .map_err(Error::Dbus)?; + + let device_route_data: Vec<HashMap<String, Variant<Box<dyn RefArg>>>> = self + .dbus_connection + .with_path(NM_BUS, &device_ip4_config, RPC_TIMEOUT_MS) + .get(NM_IP4_CONFIG, "RouteData") + .map_err(Error::Dbus)?; + + ipv4_settings.insert("route-metric", Variant(Box::new(0u32))); + ipv4_settings.insert("routes", Variant(Box::new(device_routes))); + ipv4_settings.insert("route-data", Variant(Box::new(device_route_data))); + } + + if let Some(ipv6_settings) = settings.get_mut("ipv6") { + let device_ip6_config: dbus::Path<'_> = self + .dbus_connection + .with_path(NM_BUS, &device, RPC_TIMEOUT_MS) + .get(NM_DEVICE, "Ip6Config") + .map_err(Error::Dbus)?; + + let device_routes6: Vec<(Vec<u8>, u32, Vec<u8>, u32)> = self + .dbus_connection + .with_path(NM_BUS, &device_ip6_config, RPC_TIMEOUT_MS) + .get(NM_IP6_CONFIG, "Routes") + .map_err(Error::Dbus)?; + + let device_route6_data: Vec<HashMap<String, Variant<Box<dyn RefArg>>>> = self + .dbus_connection + .with_path(NM_BUS, &device_ip6_config, RPC_TIMEOUT_MS) + .get(NM_IP6_CONFIG, "RouteData") + .map_err(Error::Dbus)?; + + ipv6_settings.insert("route-metric", Variant(Box::new(0u32))); + ipv6_settings.insert("routes", Variant(Box::new(device_routes6))); + ipv6_settings.insert("route-data", Variant(Box::new(device_route6_data))); + } + // Re-apply changes let reapply = Message::new_method_call(NM_BUS, &device, NM_DEVICE, "Reapply") |
