Skip to content

Commit 198c93c

Browse files
committed
Merge remote-tracking branch 'origin/route-monitor-openvpn'
2 parents 3b69022 + cf4b8e1 commit 198c93c

File tree

5 files changed

+243
-32
lines changed

5 files changed

+243
-32
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ Line wrap the file at 100 chars. Th
5555
#### Linux
5656
- Make route monitor ignore loopback routes.
5757
- Increase NetworkManager device readiness timeout to 15 seconds.
58+
- Set up routes for OpenVPN using the route manager instead of relying on OpenVPN.
5859

5960
### Fixed
6061
- Fix missing map animation after selecting a new location in the desktop app.

talpid-core/src/dns/linux/network_manager.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -172,21 +172,15 @@ impl NetworkManager {
172172
.get(NM_DEVICE, "Ip4Config")
173173
.map_err(Error::Dbus)?;
174174

175-
let device_routes: Vec<Vec<u32>> = self
176-
.dbus_connection
177-
.with_path(NM_BUS, &device_ip4_config, RPC_TIMEOUT_MS)
178-
.get(NM_IP4_CONFIG, "Routes")
179-
.map_err(Error::Dbus)?;
180-
181175
let device_route_data: Vec<HashMap<String, Variant<Box<dyn RefArg>>>> = self
182176
.dbus_connection
183177
.with_path(NM_BUS, &device_ip4_config, RPC_TIMEOUT_MS)
184178
.get(NM_IP4_CONFIG, "RouteData")
185179
.map_err(Error::Dbus)?;
186180

187181
ipv4_settings.insert("route-metric", Variant(Box::new(0u32)));
188-
ipv4_settings.insert("routes", Variant(Box::new(device_routes)));
189182
ipv4_settings.insert("route-data", Variant(Box::new(device_route_data)));
183+
ipv4_settings.remove("routes");
190184
}
191185

192186
if let Some(ipv6_settings) = settings.get_mut("ipv6") {
@@ -201,21 +195,14 @@ impl NetworkManager {
201195
.with_path(NM_BUS, &device_ip6_config, RPC_TIMEOUT_MS)
202196
.get(NM_IP6_CONFIG, "Addresses")
203197
.map_err(Error::Dbus)?;
204-
205-
let device_routes6: Vec<(Vec<u8>, u32, Vec<u8>, u32)> = self
206-
.dbus_connection
207-
.with_path(NM_BUS, &device_ip6_config, RPC_TIMEOUT_MS)
208-
.get(NM_IP6_CONFIG, "Routes")
209-
.map_err(Error::Dbus)?;
210-
211198
let device_route6_data: Vec<HashMap<String, Variant<Box<dyn RefArg>>>> = self
212199
.dbus_connection
213200
.with_path(NM_BUS, &device_ip6_config, RPC_TIMEOUT_MS)
214201
.get(NM_IP6_CONFIG, "RouteData")
215202
.map_err(Error::Dbus)?;
216203

217204
ipv6_settings.insert("route-metric", Variant(Box::new(0u32)));
218-
ipv6_settings.insert("routes", Variant(Box::new(device_routes6)));
205+
ipv6_settings.remove("routes");
219206
ipv6_settings.insert("route-data", Variant(Box::new(device_route6_data)));
220207
// if the link contains link local addresses, addresses shouldn't be reset
221208
if ipv6_settings

talpid-core/src/process/openvpn.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ static BASE_ARGUMENTS: &[&[&str]] = &[
4242
"vpn_gateway",
4343
"1",
4444
],
45+
// The route manager is used to add the routes.
46+
#[cfg(target_os = "linux")]
47+
&["--route-noexec"],
4548
];
4649

4750
static ALLOWED_TLS1_2_CIPHERS: &[&str] = &[

talpid-core/src/tunnel/mod.rs

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,9 @@ impl TunnelMonitor {
160160

161161
match tunnel_parameters {
162162
#[cfg(not(target_os = "android"))]
163-
TunnelParameters::OpenVpn(config) => Self::start_openvpn_tunnel(
164-
&config,
165-
log_file,
166-
resource_dir,
167-
on_event,
168-
#[cfg(target_os = "linux")]
169-
route_manager,
170-
),
163+
TunnelParameters::OpenVpn(config) => {
164+
Self::start_openvpn_tunnel(&config, log_file, resource_dir, on_event, route_manager)
165+
}
171166
#[cfg(target_os = "android")]
172167
TunnelParameters::OpenVpn(_) => Err(Error::UnsupportedPlatform),
173168

@@ -230,19 +225,13 @@ impl TunnelMonitor {
230225
log: Option<PathBuf>,
231226
resource_dir: &Path,
232227
on_event: L,
233-
#[cfg(target_os = "linux")] route_manager: &mut RouteManager,
228+
route_manager: &mut RouteManager,
234229
) -> Result<Self>
235230
where
236231
L: Fn(TunnelEvent) + Send + Sync + 'static,
237232
{
238-
let monitor = openvpn::OpenVpnMonitor::start(
239-
on_event,
240-
config,
241-
log,
242-
resource_dir,
243-
#[cfg(target_os = "linux")]
244-
route_manager,
245-
)?;
233+
let monitor =
234+
openvpn::OpenVpnMonitor::start(on_event, config, log, resource_dir, route_manager)?;
246235
Ok(TunnelMonitor {
247236
monitor: InternalTunnelMonitor::OpenVpn(monitor),
248237
})

0 commit comments

Comments
 (0)