diff options
author | Thomas Haller <thaller@redhat.com> | 2014-07-29 19:10:08 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2014-07-29 23:40:39 +0200 |
commit | 06703c1670d0f96834b268920b09792e22fdb4c4 (patch) | |
tree | 60c7be6837d2dc932a6fb9af9528cb84d8545daf /src | |
parent | a7f05b84f82e76417e7732c33246243495f51262 (diff) | |
download | NetworkManager-06703c1670d0f96834b268920b09792e22fdb4c4.tar.gz |
core: fix checks for default routes by comparing the prefix length
At some places, we considered a default route to be a route with
destination network 0.0.0.0 (::). This is wrong because a default route
is a route with plen==0.
This is for example relevant for OpenVPN which adds two routes
0.0.0.0/1 and 128.0.0.0/1 to hijack the default route. We should
not treat 0.0.0.0/1 as default route, instead NM should treat
it as any other subnet route (even if it effectively routes large
parts).
Signed-off-by: Thomas Haller <thaller@redhat.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/nm-ip4-config.c | 5 | ||||
-rw-r--r-- | src/nm-ip6-config.c | 5 | ||||
-rw-r--r-- | src/platform/nm-linux-platform.c | 4 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 3 |
4 files changed, 11 insertions, 6 deletions
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index e8925ae45b..62a6b19218 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -197,7 +197,7 @@ nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf) for (i = 0; i < priv->routes->len; i++) { const NMPlatformIP4Route *route = &g_array_index (priv->routes, NMPlatformIP4Route, i); - if (route->network == 0) { + if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) { if (route->metric < lowest_metric) { priv->gateway = route->gateway; lowest_metric = route->metric; @@ -275,7 +275,8 @@ nm_ip4_config_commit (const NMIP4Config *config, int ifindex) /* Don't add the default route if the connection * is never supposed to be the default connection. */ - if (nm_ip4_config_get_never_default (config) && route.network == 0) + if ( nm_ip4_config_get_never_default (config) + && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route)) continue; g_array_append_val (routes, route); diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 7ec5be9f41..5012c57515 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -307,7 +307,7 @@ nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6Co for (i = 0; i < priv->routes->len; i++) { const NMPlatformIP6Route *route = &g_array_index (priv->routes, NMPlatformIP6Route, i); - if (IN6_IS_ADDR_UNSPECIFIED (&route->network)) { + if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) { if (route->metric < lowest_metric) { priv->gateway = route->gateway; lowest_metric = route->metric; @@ -386,7 +386,8 @@ nm_ip6_config_commit (const NMIP6Config *config, int ifindex) /* Don't add the default route if the connection * is never supposed to be the default connection. */ - if (nm_ip6_config_get_never_default (config) && IN6_IS_ADDR_UNSPECIFIED (&route.network)) + if ( nm_ip6_config_get_never_default (config) + && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route)) continue; g_array_append_val (routes, route); diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index a920980596..b9e984464e 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -3553,7 +3553,7 @@ ip4_route_get_all (NMPlatform *platform, int ifindex, gboolean include_default) for (object = nl_cache_get_first (priv->route_cache); object; object = nl_cache_get_next (object)) { if (_route_match ((struct rtnl_route *) object, AF_INET, ifindex)) { if (init_ip4_route (&route, (struct rtnl_route *) object)) { - if (route.plen != 0 || include_default) + if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route) || include_default) g_array_append_val (routes, route); } } @@ -3575,7 +3575,7 @@ ip6_route_get_all (NMPlatform *platform, int ifindex, gboolean include_default) for (object = nl_cache_get_first (priv->route_cache); object; object = nl_cache_get_next (object)) { if (_route_match ((struct rtnl_route *) object, AF_INET6, ifindex)) { if (init_ip6_route (&route, (struct rtnl_route *) object)) { - if (route.plen != 0 || include_default) + if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route) || include_default) g_array_append_val (routes, route); } } diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index 844727391f..ecf306484e 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -250,6 +250,9 @@ typedef struct { }; } NMPlatformIPRoute; +#define NM_PLATFORM_IP_ROUTE_IS_DEFAULT(route) \ + ( ((const NMPlatformIPRoute *) (route))->plen <= 0 ) + struct _NMPlatformIP4Route { __NMPlatformIPRoute_COMMON; in_addr_t network; |