summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-04-27 17:41:38 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-04-28 13:56:26 +0200
commit7b7d323abbe38ff4c7f4050df6587db49b50a2a2 (patch)
treecac19941215de6217a6ef5899082105271629148
parent03e4fdf44391603e5c34a1bb1d8ab27a89ab74d7 (diff)
downloadmullvadvpn-7b7d323abbe38ff4c7f4050df6587db49b50a2a2.tar.xz
mullvadvpn-7b7d323abbe38ff4c7f4050df6587db49b50a2a2.zip
Clean up default routes in RouteManager
-rw-r--r--talpid-core/src/routing/linux.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/talpid-core/src/routing/linux.rs b/talpid-core/src/routing/linux.rs
index 2adabc556a..94c00f14da 100644
--- a/talpid-core/src/routing/linux.rs
+++ b/talpid-core/src/routing/linux.rs
@@ -351,6 +351,34 @@ impl RouteManagerImplInner {
}
async fn cleanup_routes(&mut self) {
+ for required_route in &self.required_default_routes {
+ let best_node = if required_route.destination.is_ipv4() {
+ self.best_default_node_v4.clone()
+ } else {
+ self.best_default_node_v6.clone()
+ };
+
+ let best_node = match best_node {
+ None => continue,
+ Some(node) => node,
+ };
+
+ let route =
+ Route::new(best_node, required_route.destination).table(required_route.table_id);
+ if let Err(e) = self.delete_route(&route).await {
+ if let Error::NetlinkError(err) = &e {
+ if let rtnetlink::ErrorKind::NetlinkError(msg) = err.get_ref().kind() {
+ // -3 means that the route doesn't exist anymore anyway
+ if msg.code == -3 {
+ continue;
+ }
+ }
+ }
+ log::error!("Failed to remove route - {} - {}", route, e);
+ }
+ }
+ self.required_default_routes.clear();
+
for route in self.added_routes.drain().collect::<Vec<_>>().iter() {
if let Err(e) = self.delete_route(&route).await {
if let Error::NetlinkError(err) = &e {